@@ -79,7 +79,7 @@ class Storage(StorageBase, MigratorMixin):
7979
8080 # MigratorMixin attributes.
8181 name = "storage"
82- schema_version = 23
82+ schema_version = 24
8383 schema_file = os .path .join (HERE , "schema.sql" )
8484 migrations_directory = os .path .join (HERE , "migrations" )
8585
@@ -753,6 +753,45 @@ def count_all(
753753 )
754754 return rows [0 ].total_count
755755
756+ def trim_objects (
757+ self ,
758+ resource_name : str ,
759+ parent_id : str ,
760+ filters : list ,
761+ max_objects : int ,
762+ id_field : str = DEFAULT_ID_FIELD ,
763+ modified_field : str = DEFAULT_MODIFIED_FIELD ,
764+ ) -> int :
765+ query = """
766+ WITH to_delete AS (
767+ SELECT {id_field}
768+ FROM objects
769+ WHERE parent_id = :parent_id
770+ AND resource_name = :resource_name
771+ {conditions_filter}
772+ ORDER BY {modified_field} DESC
773+ OFFSET :max_objects
774+ )
775+ DELETE FROM objects o
776+ USING to_delete d
777+ WHERE o.id = d.id
778+ RETURNING 1;
779+ """
780+
781+ placeholders = dict (
782+ parent_id = parent_id , resource_name = resource_name , max_objects = max_objects
783+ )
784+ safe_sql , holders = self ._format_conditions (filters , id_field , modified_field )
785+ placeholders .update (** holders )
786+
787+ safeholders = dict (id_field = id_field , modified_field = modified_field )
788+ safeholders ["conditions_filter" ] = f"AND { safe_sql } "
789+
790+ with self .client .connect () as conn :
791+ result = conn .execute (sa .text (query .format_map (safeholders )), placeholders )
792+ # Using RETURNING so rowcount reflects the number deleted
793+ return result .rowcount
794+
756795 def _get_rows (
757796 self ,
758797 query ,
@@ -1040,7 +1079,7 @@ def _format_sorting(self, sorting, id_field, modified_field):
10401079 if sort .field == id_field :
10411080 sql_field = "id"
10421081 elif sort .field == modified_field :
1043- sql_field = "last_modified"
1082+ sql_field = "objects. last_modified"
10441083 else :
10451084 # Subfields: ``person.name`` becomes ``data->person->name``
10461085 subfields = sort .field .split ("." )
0 commit comments