@@ -99,6 +99,66 @@ func TestLoadAll(t *testing.T) {
9999 require .NoError (err )
100100}
101101
102+ func TestLoadAllWithMultipleDrivers (t * testing.T ) {
103+ require := require .New (t )
104+ setup (t )
105+ defer cleanup (t )
106+
107+ d1 := NewDriver (tmpDir )
108+ idx1 , err := d1 .Create ("db" , "table" , "id1" , makeExpressions ("table" , "hash1" ), nil )
109+ require .NoError (err )
110+ it1 := & partitionKeyValueIter {
111+ partitions : 2 ,
112+ offset : 0 ,
113+ total : 64 ,
114+ expressions : idx1 .Expressions (),
115+ location : randLocation ,
116+ }
117+ require .NoError (d1 .Save (sql .NewEmptyContext (), idx1 , it1 ))
118+
119+ d2 := NewDriver (tmpDir )
120+ idx2 , err := d2 .Create ("db" , "table" , "id2" , makeExpressions ("table" , "hash1" ), nil )
121+ require .NoError (err )
122+ it2 := & partitionKeyValueIter {
123+ partitions : 2 ,
124+ offset : 0 ,
125+ total : 64 ,
126+ expressions : idx2 .Expressions (),
127+ location : randLocation ,
128+ }
129+ require .NoError (d2 .Save (sql .NewEmptyContext (), idx2 , it2 ))
130+
131+ d := NewDriver (tmpDir )
132+ indexes , err := d .LoadAll ("db" , "table" )
133+ require .NoError (err )
134+
135+ require .Equal (2 , len (indexes ))
136+ i1 , ok := idx1 .(* pilosaIndex )
137+ require .True (ok )
138+ i2 , ok := idx2 .(* pilosaIndex )
139+ require .True (ok )
140+
141+ require .Equal (i1 .index .Name (), i2 .index .Name ())
142+
143+ // Load index from another table. Previously this panicked as the same
144+ // pilosa.Holder was used for all indexes.
145+
146+ d3 := NewDriver (tmpDir )
147+ idx3 , err := d3 .Create ("db" , "table2" , "id1" , makeExpressions ("table2" , "hash1" ), nil )
148+ require .NoError (err )
149+ it3 := & partitionKeyValueIter {
150+ partitions : 2 ,
151+ offset : 0 ,
152+ total : 64 ,
153+ expressions : idx3 .Expressions (),
154+ location : randLocation ,
155+ }
156+ require .NoError (d3 .Save (sql .NewEmptyContext (), idx3 , it3 ))
157+
158+ indexes , err = d .LoadAll ("db" , "table2" )
159+ require .NoError (err )
160+ }
161+
102162type logLoc struct {
103163 loc []byte
104164 err error
@@ -214,6 +274,39 @@ func TestSaveAndGetAll(t *testing.T) {
214274 require .True (errInvalidKeys .Is (err ))
215275}
216276
277+ func TestSaveAndGetAllWithMultipleDrivers (t * testing.T ) {
278+ require := require .New (t )
279+ setup (t )
280+ defer cleanup (t )
281+
282+ db , table , id := "db_name" , "table_name" , "index_id"
283+ expressions := makeExpressions (table , "lang" , "hash" )
284+
285+ d1 := NewDriver (tmpDir )
286+ sqlIdx , err := d1 .Create (db , table , id , expressions , nil )
287+ require .NoError (err )
288+
289+ it := & partitionKeyValueIter {
290+ partitions : 2 ,
291+ offset : 0 ,
292+ total : 64 ,
293+ expressions : sqlIdx .Expressions (),
294+ location : randLocation ,
295+ }
296+
297+ err = d1 .Save (sql .NewEmptyContext (), sqlIdx , it )
298+ require .NoError (err )
299+
300+ d2 := NewDriver (tmpDir )
301+ indexes , err := d2 .LoadAll (db , table )
302+ require .NoError (err )
303+ require .Equal (1 , len (indexes ))
304+
305+ _ , err = sqlIdx .Get ()
306+ require .Error (err )
307+ require .True (errInvalidKeys .Is (err ))
308+ }
309+
217310func TestLoadCorruptedIndex (t * testing.T ) {
218311 require := require .New (t )
219312 setup (t )
@@ -254,6 +347,58 @@ func TestDelete(t *testing.T) {
254347 require .NoError (err )
255348}
256349
350+ func TestDeleteWithMultipleDrivers (t * testing.T ) {
351+ require := require .New (t )
352+ setup (t )
353+ defer cleanup (t )
354+
355+ db , table , id := "db_name" , "table_name" , "index_id"
356+
357+ expressions := []sql.Expression {
358+ expression .NewGetFieldWithTable (0 , sql .Int64 , table , "lang" , true ),
359+ expression .NewGetFieldWithTable (1 , sql .Int64 , table , "field" , true ),
360+ }
361+
362+ d := NewDriver (tmpDir )
363+ sqlIdx , err := d .Create (db , table , id , expressions , nil )
364+ require .NoError (err )
365+
366+ d = NewDriver (tmpDir )
367+ err = d .Delete (sqlIdx , new (partitionIter ))
368+ require .NoError (err )
369+ }
370+
371+ func TestDeleteAndLoadAll (t * testing.T ) {
372+ require := require .New (t )
373+ setup (t )
374+ defer cleanup (t )
375+
376+ db , table , id := "db_name" , "table_name" , "index_id"
377+ expressions := makeExpressions (table , "lang" , "hash" )
378+
379+ d := NewDriver (tmpDir )
380+ sqlIdx , err := d .Create (db , table , id , expressions , nil )
381+ require .NoError (err )
382+
383+ it := & partitionKeyValueIter {
384+ partitions : 2 ,
385+ offset : 0 ,
386+ total : 64 ,
387+ expressions : sqlIdx .Expressions (),
388+ location : randLocation ,
389+ }
390+
391+ err = d .Save (sql .NewEmptyContext (), sqlIdx , it )
392+ require .NoError (err )
393+
394+ err = d .Delete (sqlIdx , new (partitionIter ))
395+ require .NoError (err )
396+
397+ indexes , err := d .LoadAll (db , table )
398+ require .NoError (err )
399+ require .Equal (0 , len (indexes ))
400+ }
401+
257402func TestDeleteInProgress (t * testing.T ) {
258403 require := require .New (t )
259404 setup (t )
@@ -449,6 +594,82 @@ func TestIntersection(t *testing.T) {
449594 require .NoError (interIt .Close ())
450595}
451596
597+ func TestIntersectionWithMultipleDrivers (t * testing.T ) {
598+ ctx := sql .NewContext (context .Background ())
599+ require := require .New (t )
600+ setup (t )
601+ defer cleanup (t )
602+
603+ db , table := "db_name" , "table_name"
604+ idxLang , expLang := "idx_lang" , makeExpressions (table , "lang" )
605+ idxPath , expPath := "idx_path" , makeExpressions (table , "path" )
606+
607+ d1 := NewDriver (tmpDir )
608+ sqlIdxLang , err := d1 .Create (db , table , idxLang , expLang , nil )
609+ require .NoError (err )
610+
611+ d2 := NewDriver (tmpDir )
612+ sqlIdxPath , err := d2 .Create (db , table , idxPath , expPath , nil )
613+ require .NoError (err )
614+
615+ itLang := & partitionKeyValueIter {
616+ partitions : 2 ,
617+ offset : 0 ,
618+ total : 10 ,
619+ expressions : sqlIdxLang .Expressions (),
620+ location : offsetLocation ,
621+ }
622+
623+ itPath := & partitionKeyValueIter {
624+ partitions : 2 ,
625+ offset : 0 ,
626+ total : 10 ,
627+ expressions : sqlIdxPath .Expressions (),
628+ location : offsetLocation ,
629+ }
630+
631+ err = d1 .Save (ctx , sqlIdxLang , itLang )
632+ require .NoError (err )
633+
634+ err = d2 .Save (ctx , sqlIdxPath , itPath )
635+ require .NoError (err )
636+
637+ lookupLang , err := sqlIdxLang .Get (itLang .records [0 ][0 ].values ... )
638+ require .NoError (err )
639+ lookupPath , err := sqlIdxPath .Get (itPath .records [0 ][itPath .total - 1 ].values ... )
640+ require .NoError (err )
641+
642+ m , ok := lookupLang .(sql.Mergeable )
643+ require .True (ok )
644+ require .True (m .IsMergeable (lookupPath ))
645+
646+ interLookup , ok := lookupLang .(sql.SetOperations )
647+ require .True (ok )
648+ interIt , err := interLookup .Intersection (lookupPath ).Values (testPartition (0 ))
649+ require .NoError (err )
650+ loc , err := interIt .Next ()
651+
652+ require .True (err == io .EOF )
653+ require .NoError (interIt .Close ())
654+
655+ lookupLang , err = sqlIdxLang .Get (itLang .records [0 ][0 ].values ... )
656+ require .NoError (err )
657+ lookupPath , err = sqlIdxPath .Get (itPath .records [0 ][0 ].values ... )
658+ require .NoError (err )
659+
660+ interLookup , ok = lookupPath .(sql.SetOperations )
661+ require .True (ok )
662+ interIt , err = interLookup .Intersection (lookupLang ).Values (testPartition (0 ))
663+ require .NoError (err )
664+ loc , err = interIt .Next ()
665+ require .NoError (err )
666+ require .Equal (loc , itPath .records [0 ][0 ].location )
667+ _ , err = interIt .Next ()
668+ require .True (err == io .EOF )
669+
670+ require .NoError (interIt .Close ())
671+ }
672+
452673func TestUnion (t * testing.T ) {
453674 require := require .New (t )
454675 setup (t )
0 commit comments