@@ -2,6 +2,7 @@ package dao
22
33import (
44 "errors"
5+ "time"
56
67 "github.com/chroma-core/chroma/go/pkg/common"
78 "github.com/chroma-core/chroma/go/pkg/sysdb/metastore/db/dbmodel"
@@ -28,21 +29,12 @@ func (s *databaseDb) DeleteByTenantIdAndName(tenantId string, databaseName strin
2829 return len (databases ), err
2930}
3031
31- func (s * databaseDb ) GetAllDatabases () ([]* dbmodel.Database , error ) {
32- var databases []* dbmodel.Database
33- query := s .db .Table ("databases" )
34-
35- if err := query .Find (& databases ).Error ; err != nil {
36- return nil , err
37- }
38- return databases , nil
39- }
40-
4132func (s * databaseDb ) ListDatabases (limit * int32 , offset * int32 , tenantID string ) ([]* dbmodel.Database , error ) {
4233 var databases []* dbmodel.Database
4334 query := s .db .Table ("databases" ).
4435 Select ("databases.id, databases.name, databases.tenant_id" ).
4536 Where ("databases.tenant_id = ?" , tenantID ).
37+ Where ("databases.is_deleted = ?" , false ).
4638 Order ("databases.created_at ASC" )
4739
4840 if limit != nil {
@@ -65,7 +57,8 @@ func (s *databaseDb) GetDatabases(tenantID string, databaseName string) ([]*dbmo
6557 query := s .db .Table ("databases" ).
6658 Select ("databases.id, databases.name, databases.tenant_id" ).
6759 Where ("databases.name = ?" , databaseName ).
68- Where ("databases.tenant_id = ?" , tenantID )
60+ Where ("databases.tenant_id = ?" , tenantID ).
61+ Where ("databases.is_deleted = ?" , false )
6962
7063 if err := query .Find (& databases ).Error ; err != nil {
7164 log .Error ("GetDatabases" , zap .Error (err ))
@@ -95,13 +88,13 @@ func (s *databaseDb) Insert(database *dbmodel.Database) error {
9588 return err
9689}
9790
98- func (s * databaseDb ) Delete (databaseID string ) error {
91+ func (s * databaseDb ) SoftDelete (databaseID string ) error {
9992 return s .db .Transaction (func (tx * gorm.DB ) error {
100- if err := tx .Where ( "id = ?" , databaseID ). Delete ( & dbmodel. Database {}). Error ; err != nil {
101- return err
102- }
103-
104- if err := tx . Where ( "database_id = ?" , databaseID ). Delete ( & dbmodel. Collection {}). Error ; err != nil {
93+ if err := tx .Table ( "databases" ).
94+ Where ( "id = ?" , databaseID ).
95+ Update ( "is_deleted" , true ).
96+ Update ( "updated_at" , time . Now ()).
97+ Error ; err != nil {
10598 return err
10699 }
107100
@@ -113,11 +106,44 @@ func (s *databaseDb) GetDatabasesByTenantID(tenantID string) ([]*dbmodel.Databas
113106 var databases []* dbmodel.Database
114107 query := s .db .Table ("databases" ).
115108 Select ("databases.id, databases.name, databases.tenant_id" ).
116- Where ("databases.tenant_id = ?" , tenantID )
109+ Where ("databases.tenant_id = ?" , tenantID ).
110+ Where ("databases.is_deleted = ?" , false )
117111
118112 if err := query .Find (& databases ).Error ; err != nil {
119113 log .Error ("GetDatabasesByTenantID" , zap .Error (err ))
120114 return nil , err
121115 }
122116 return databases , nil
123117}
118+
119+ func (s * databaseDb ) FinishDatabaseDeletion (cutoffTime time.Time ) (uint64 , error ) {
120+ numDeleted := uint64 (0 )
121+
122+ for {
123+ // Only hard delete databases that were soft deleted prior to the cutoff time and have no collections
124+ databasesSubQuery := s .db .
125+ Table ("databases d" ).
126+ Select ("d.id" ).
127+ Joins ("LEFT JOIN collections c ON c.database_id = d.id" ).
128+ Where ("d.is_deleted = ?" , true ).
129+ Where ("d.updated_at < ?" , cutoffTime ).
130+ Group ("d.id" ).
131+ Having ("COUNT(c.id) = 0" ).
132+ Limit (1000 )
133+
134+ res := s .db .Table ("databases" ).
135+ Where ("id IN (?)" , databasesSubQuery ).
136+ Delete (& dbmodel.Database {})
137+ if res .Error != nil {
138+ return numDeleted , res .Error
139+ }
140+
141+ numDeleted += uint64 (res .RowsAffected )
142+
143+ if res .RowsAffected == 0 {
144+ break
145+ }
146+ }
147+
148+ return numDeleted , nil
149+ }
0 commit comments