@@ -61,6 +61,12 @@ type Indexer struct {
6161 entries map [protoreflect.FullName ]entryCache
6262}
6363
64+ type FindOpts struct {
65+ Offset uint64
66+ Limit uint64
67+ Reverse bool
68+ }
69+
6470type entryCache struct {
6571 sig string
6672 entries []string
@@ -270,9 +276,43 @@ func (idx *Indexer) FindKeys(ctx context.Context, tx Tx, name protoreflect.FullN
270276 ctx , span := idxTracer .Start (ctx , "Indexer.FindKeys" )
271277 defer span .End ()
272278 span .SetAttributes (attribute .String ("index.type" , string (name )))
273- ix := pfindex .New (newTxStore (tx .Txn (), idx .reg ), idx .Selector )
274- keys , collisions , err := ix .Find (ctx , name , f )
275- return keys , collisions , err
279+ uids , err := idx .FindUIDs (ctx , tx , name , f , FindOpts {})
280+ if err != nil {
281+ return nil , nil , err
282+ }
283+ keys := make ([]string , 0 )
284+ for _ , uid := range uids {
285+ item , err := tx .Txn ().Get (ctx , protodb .UIDKey (uid ))
286+ if err != nil {
287+ if errors .Is (err , badger .ErrKeyNotFound ) {
288+ continue
289+ }
290+ return nil , nil , err
291+ }
292+ var key string
293+ if err := item .Value (func (val []byte ) error {
294+ key = string (val )
295+ return nil
296+ }); err != nil {
297+ return nil , nil , err
298+ }
299+ if key != "" {
300+ keys = append (keys , key )
301+ }
302+ }
303+ return keys , nil , nil
304+ }
305+
306+ func (idx * Indexer ) FindUIDs (ctx context.Context , tx Tx , name protoreflect.FullName , f protodb.Filter , opts FindOpts ) ([]uint64 , error ) {
307+ ix := pfindex .NewUID (newUIDTxStore (tx .Txn (), idx .reg ), idx .Selector )
308+ out := make ([]uint64 , 0 )
309+ for uid , err := range ix .Find (ctx , name , f , pfindex.FindOptions {Offset : opts .Offset , Limit : opts .Limit , Reverse : opts .Reverse }) {
310+ if err != nil {
311+ return nil , err
312+ }
313+ out = append (out , uid )
314+ }
315+ return out , nil
276316}
277317
278318func (idx * Indexer ) Insert (ctx context.Context , tx Tx , key []byte , m proto.Message ) error {
@@ -281,8 +321,15 @@ func (idx *Indexer) Insert(ctx context.Context, tx Tx, key []byte, m proto.Messa
281321 if m != nil {
282322 span .SetAttributes (attribute .String ("index.type" , string (m .ProtoReflect ().Descriptor ().FullName ())))
283323 }
284- ix := pfindex .New (newTxStore (tx .Txn (), idx .reg ), idx .Selector )
285- return ix .Insert (ctx , string (key ), m )
324+ uid , ok , err := tx .UID (ctx , key , false )
325+ if err != nil {
326+ return err
327+ }
328+ if ! ok {
329+ return badger .ErrKeyNotFound
330+ }
331+ ix := pfindex .NewUID (newUIDTxStore (tx .Txn (), idx .reg ), idx .Selector )
332+ return ix .Insert (ctx , uid , m )
286333}
287334
288335func (idx * Indexer ) Update (ctx context.Context , tx Tx , key []byte , oldMsg , newMsg proto.Message ) error {
@@ -295,25 +342,31 @@ func (idx *Indexer) Update(ctx context.Context, tx Tx, key []byte, oldMsg, newMs
295342 attribute .Bool ("index.has_old" , oldMsg != nil ),
296343 attribute .Bool ("index.has_new" , newMsg != nil ),
297344 )
298- ix := pfindex .New (newTxStore (tx .Txn (), idx .reg ), idx .Selector )
345+ uid , ok , err := tx .UID (ctx , key , false )
346+ if err != nil {
347+ return err
348+ }
349+ if ! ok {
350+ return badger .ErrKeyNotFound
351+ }
352+ ix := pfindex .NewUID (newUIDTxStore (tx .Txn (), idx .reg ), idx .Selector )
299353 if oldMsg != nil {
300- txv , err := newTxStore (tx .Txn (), idx .reg ).Tx (ctx )
354+ txv , err := newUIDTxStore (tx .Txn (), idx .reg ).Tx (ctx )
301355 if err != nil {
302356 return err
303357 }
304- if err := idx .removeValues (ctx , txv , key , oldMsg .ProtoReflect ()); err != nil {
358+ if err := idx .removeValues (ctx , txv , uid , oldMsg .ProtoReflect ()); err != nil {
305359 return err
306360 }
307361 }
308362 if newMsg == nil {
309363 return nil
310364 }
311- return ix .Insert (ctx , string ( key ) , newMsg )
365+ return ix .Insert (ctx , uid , newMsg )
312366}
313367
314- func (idx * Indexer ) removeValues (ctx context.Context , tx pfindex.Tx , key [] byte , msg protoreflect.Message , fds ... protoreflect.FieldDescriptor ) error {
368+ func (idx * Indexer ) removeValues (ctx context.Context , tx pfindex.UIDTx , uid uint64 , msg protoreflect.Message , fds ... protoreflect.FieldDescriptor ) error {
315369 fields := msg .Descriptor ().Fields ()
316- keyStr := string (key )
317370 for i := 0 ; i < fields .Len (); i ++ {
318371 fd := fields .Get (i )
319372 path := append (fds , fd )
@@ -326,7 +379,7 @@ func (idx *Indexer) removeValues(ctx context.Context, tx pfindex.Tx, key []byte,
326379 list := rval .List ()
327380 for j := 0 ; j < list .Len (); j ++ {
328381 child := list .Get (j ).Message ()
329- if err := idx .removeValues (ctx , tx , key , child , path ... ); err != nil {
382+ if err := idx .removeValues (ctx , tx , uid , child , path ... ); err != nil {
330383 return err
331384 }
332385 }
@@ -341,7 +394,7 @@ func (idx *Indexer) removeValues(ctx context.Context, tx pfindex.Tx, key []byte,
341394 }
342395 list := rval .List ()
343396 for j := 0 ; j < list .Len (); j ++ {
344- if err := tx .Remove (ctx , keyStr , fd , list .Get (j )); err != nil {
397+ if err := tx .RemoveUID (ctx , uid , fd , list .Get (j )); err != nil {
345398 return err
346399 }
347400 }
@@ -351,7 +404,7 @@ func (idx *Indexer) removeValues(ctx context.Context, tx pfindex.Tx, key []byte,
351404 if ! rval .Message ().IsValid () {
352405 continue
353406 }
354- if err := idx .removeValues (ctx , tx , key , rval .Message (), path ... ); err != nil {
407+ if err := idx .removeValues (ctx , tx , uid , rval .Message (), path ... ); err != nil {
355408 return err
356409 }
357410 continue
@@ -366,7 +419,7 @@ func (idx *Indexer) removeValues(ctx context.Context, tx pfindex.Tx, key []byte,
366419 if ! ok {
367420 continue
368421 }
369- if err := tx .Remove (ctx , keyStr , fd , rval ); err != nil {
422+ if err := tx .RemoveUID (ctx , uid , fd , rval ); err != nil {
370423 return err
371424 }
372425 }
@@ -520,7 +573,7 @@ func (idx *Indexer) addIndexEntries(ctx context.Context, tx Tx, md protoreflect.
520573 _ , ok := allowed [path ]
521574 return ok , nil
522575 }
523- partial := pfindex .New ( newTxStore (tx .Txn (), idx .reg ), selector )
576+ partial := pfindex .NewUID ( newUIDTxStore (tx .Txn (), idx .reg ), selector )
524577 dataPrefix := fmt .Appendf (nil , "%s/%s/" , protodb .Data , md .FullName ())
525578 dataIt := tx .Txn ().Iterator (badger.IteratorOptions {Prefix : dataPrefix , PrefetchValues : false })
526579 defer dataIt .Close ()
@@ -550,7 +603,7 @@ func (idx *Indexer) addIndexEntries(ctx context.Context, tx Tx, md protoreflect.
550603 return err
551604 }
552605 }
553- if err := partial .Insert (ctx , string ( key ) , msg ); err != nil {
606+ if err := partial .Insert (ctx , uid , msg ); err != nil {
554607 return err
555608 }
556609 }
0 commit comments