@@ -99,6 +99,66 @@ func TestLoadAll(t *testing.T) {
99
99
require .NoError (err )
100
100
}
101
101
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
+
102
162
type logLoc struct {
103
163
loc []byte
104
164
err error
@@ -214,6 +274,39 @@ func TestSaveAndGetAll(t *testing.T) {
214
274
require .True (errInvalidKeys .Is (err ))
215
275
}
216
276
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
+
217
310
func TestLoadCorruptedIndex (t * testing.T ) {
218
311
require := require .New (t )
219
312
setup (t )
@@ -254,6 +347,58 @@ func TestDelete(t *testing.T) {
254
347
require .NoError (err )
255
348
}
256
349
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
+
257
402
func TestDeleteInProgress (t * testing.T ) {
258
403
require := require .New (t )
259
404
setup (t )
@@ -449,6 +594,82 @@ func TestIntersection(t *testing.T) {
449
594
require .NoError (interIt .Close ())
450
595
}
451
596
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
+
452
673
func TestUnion (t * testing.T ) {
453
674
require := require .New (t )
454
675
setup (t )
0 commit comments