@@ -28,12 +28,47 @@ type DedupeResult struct {
2828 ChunksRemoved int64
2929}
3030
31+ type MessageDedupeMode string
32+
33+ const (
34+ MessageDedupeExact MessageDedupeMode = "exact"
35+ MessageDedupeKey MessageDedupeMode = "message-key"
36+ )
37+
38+ func (m * MessageDedupeMode ) Set (v string ) error {
39+ mode := MessageDedupeMode (strings .ToLower (v ))
40+ switch mode {
41+ case MessageDedupeExact , MessageDedupeKey :
42+ * m = mode
43+ return nil
44+ default :
45+ return fmt .Errorf ("unknown message dedupe mode: %s" , v )
46+ }
47+ }
48+
49+ func (m MessageDedupeMode ) String () string {
50+ if m == "" {
51+ return string (MessageDedupeExact )
52+ }
53+ return string (m )
54+ }
55+
3156type DedupeRepository interface {
3257 Preview (ctx context.Context , db * sqlx.DB ) (DedupeCounts , error )
3358 Deduplicate (ctx context.Context , db * sqlx.DB ) (DedupeResult , error )
3459}
3560
36- type dedupeRepository struct {}
61+ type DedupeOption func (* dedupeRepository )
62+
63+ func WithMessageDedupeMode (mode MessageDedupeMode ) DedupeOption {
64+ return func (r * dedupeRepository ) {
65+ r .messageMode = mode
66+ }
67+ }
68+
69+ type dedupeRepository struct {
70+ messageMode MessageDedupeMode
71+ }
3772
3873type dedupeMode int
3974
@@ -54,7 +89,7 @@ var dedupeEntities = []dedupeEntity{
5489 {
5590 name : "messages" ,
5691 table : "MESSAGE" ,
57- keyColumns : []string {"ID" },
92+ keyColumns : []string {"CHANNEL_ID" , " ID" },
5893 chunkTypes : []chunk.ChunkType {chunk .CMessages , chunk .CThreadMessages },
5994 mode : dedupeByData ,
6095 },
@@ -88,13 +123,28 @@ var dedupeEntities = []dedupeEntity{
88123 },
89124}
90125
91- func NewDedupeRepository () DedupeRepository {
92- return dedupeRepository {}
126+ func NewDedupeRepository (opts ... DedupeOption ) DedupeRepository {
127+ r := dedupeRepository {messageMode : MessageDedupeExact }
128+ for _ , opt := range opts {
129+ opt (& r )
130+ }
131+ return r
132+ }
133+
134+ func (r dedupeRepository ) entities () []dedupeEntity {
135+ entities := make ([]dedupeEntity , len (dedupeEntities ))
136+ copy (entities , dedupeEntities )
137+ for i := range entities {
138+ if entities [i ].name == "messages" && r .messageMode == MessageDedupeKey {
139+ entities [i ].mode = dedupeByKey
140+ }
141+ }
142+ return entities
93143}
94144
95145func (r dedupeRepository ) Preview (ctx context.Context , db * sqlx.DB ) (DedupeCounts , error ) {
96146 var counts DedupeCounts
97- for _ , entity := range dedupeEntities {
147+ for _ , entity := range r . entities () {
98148 n , err := r .countDuplicates (ctx , db , entity )
99149 if err != nil {
100150 return DedupeCounts {}, fmt .Errorf ("count duplicate %s: %w" , entity .name , err )
@@ -118,7 +168,7 @@ func (r dedupeRepository) Deduplicate(ctx context.Context, db *sqlx.DB) (DedupeR
118168 defer tx .Rollback ()
119169
120170 var result DedupeResult
121- for _ , entity := range dedupeEntities {
171+ for _ , entity := range r . entities () {
122172 chunkIDs , err := r .prunableChunkIDs (ctx , tx , entity )
123173 if err != nil {
124174 return DedupeResult {}, fmt .Errorf ("query prunable %s chunks: %w" , entity .name , err )
0 commit comments