@@ -814,7 +814,7 @@ def list_metrics(self, details=False, status='active',
814814 if policy_filter or resource_policy_filter :
815815 q = q .filter (sqlalchemy .or_ (policy_f , resource_policy_f ))
816816
817- sort_keys , sort_dirs = self ._build_sort_keys (sorts , ['id' ])
817+ sort_keys , sort_dirs = self ._build_sort_keys (sorts , ['id' , 'name' , 'resource_id' ])
818818
819819 if marker :
820820 metric_marker = self .list_metrics (
@@ -1234,15 +1234,23 @@ def _get_history_result_mapper(self, session, resource_type,
12341234 union_stmt = sqlalchemy .union (s1 , s2 )
12351235 stmt = union_stmt .alias ("result" )
12361236
1237+ stmt .info = {'oslodb_unique_keys' : [set (['id' , 'revision' ])]}
1238+
12371239 class Result (base .ResourceJsonifier , base .GnocchiBase ):
12381240 def __iter__ (self ):
12391241 return iter ((key , getattr (self , key )) for key in stmt .c .keys ())
12401242
1243+ # We are always registering a new mapper for the same Class.
1244+ # Therefore, a lot of warnings are generated in SQLalchemy.
1245+ # To avoid such issues, and also a memory leak, we can clean
1246+ # the previously registered ones.
1247+ mapper_reg .dispose ()
12411248 mapper_reg .map_imperatively (
12421249 Result , stmt , primary_key = [stmt .c .id , stmt .c .revision ],
12431250 properties = {
12441251 'metrics' : sqlalchemy .orm .relationship (
12451252 Metric ,
1253+ overlaps = "metrics,resource" ,
12461254 primaryjoin = sqlalchemy .and_ (
12471255 Metric .resource_id == stmt .c .id ,
12481256 Metric .status == 'active' ),
0 commit comments