Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit 71a114a

Browse files
committed
sql/index/pilosa: store index names in lookups as maps
Signed-off-by: Miguel Molina <[email protected]>
1 parent 357c23a commit 71a114a

File tree

3 files changed

+94
-31
lines changed

3 files changed

+94
-31
lines changed

sql/index/pilosa/index.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ func (idx *pilosaIndex) Get(keys ...interface{}) (sql.IndexLookup, error) {
108108
mapping: idx.mapping,
109109
keys: keys,
110110
expressions: idx.expressions,
111+
indexes: map[string]struct{}{
112+
idx.ID(): struct{}{},
113+
},
111114
}, nil
112115
}
113116

@@ -165,6 +168,9 @@ func (idx *pilosaIndex) AscendGreaterOrEqual(keys ...interface{}) (sql.IndexLook
165168
mapping: idx.mapping,
166169
keys: keys,
167170
expressions: idx.expressions,
171+
indexes: map[string]struct{}{
172+
idx.ID(): struct{}{},
173+
},
168174
}, keys, nil), nil
169175
}
170176

@@ -179,6 +185,9 @@ func (idx *pilosaIndex) AscendLessThan(keys ...interface{}) (sql.IndexLookup, er
179185
mapping: idx.mapping,
180186
keys: keys,
181187
expressions: idx.expressions,
188+
indexes: map[string]struct{}{
189+
idx.ID(): struct{}{},
190+
},
182191
}, nil, keys), nil
183192
}
184193

@@ -196,6 +205,9 @@ func (idx *pilosaIndex) AscendRange(greaterOrEqual, lessThan []interface{}) (sql
196205
index: idx.index,
197206
mapping: idx.mapping,
198207
expressions: idx.expressions,
208+
indexes: map[string]struct{}{
209+
idx.ID(): struct{}{},
210+
},
199211
}, greaterOrEqual, lessThan), nil
200212
}
201213

@@ -211,6 +223,9 @@ func (idx *pilosaIndex) DescendGreater(keys ...interface{}) (sql.IndexLookup, er
211223
keys: keys,
212224
expressions: idx.expressions,
213225
reverse: true,
226+
indexes: map[string]struct{}{
227+
idx.ID(): struct{}{},
228+
},
214229
}, keys, nil), nil
215230
}
216231

@@ -226,6 +241,9 @@ func (idx *pilosaIndex) DescendLessOrEqual(keys ...interface{}) (sql.IndexLookup
226241
keys: keys,
227242
expressions: idx.expressions,
228243
reverse: true,
244+
indexes: map[string]struct{}{
245+
idx.ID(): struct{}{},
246+
},
229247
}, nil, keys), nil
230248
}
231249

@@ -244,6 +262,9 @@ func (idx *pilosaIndex) DescendRange(lessOrEqual, greaterThan []interface{}) (sq
244262
mapping: idx.mapping,
245263
expressions: idx.expressions,
246264
reverse: true,
265+
indexes: map[string]struct{}{
266+
idx.ID(): struct{}{},
267+
},
247268
}, greaterThan, lessOrEqual), nil
248269
}
249270

@@ -258,6 +279,9 @@ func (idx *pilosaIndex) Not(keys ...interface{}) (sql.IndexLookup, error) {
258279
mapping: idx.mapping,
259280
keys: keys,
260281
expressions: idx.expressions,
282+
indexes: map[string]struct{}{
283+
idx.ID(): struct{}{},
284+
},
261285
}, nil
262286
}
263287

sql/index/pilosa/lookup.go

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ type (
6464
keys []interface{}
6565
expressions []string
6666
operations []*lookupOperation
67-
indexes []string
67+
indexes map[string]struct{}
6868
}
6969

7070
lookupOperation struct {
@@ -167,7 +167,7 @@ func (l *indexLookup) Values(p sql.Partition) (sql.IndexValueIter, error) {
167167
}
168168

169169
func (l *indexLookup) Indexes() []string {
170-
return uniqueIndexes(append(l.indexes[:], l.id))
170+
return sortedIndexes(l.indexes)
171171
}
172172

173173
// IsMergeable implements sql.Mergeable interface.
@@ -183,7 +183,9 @@ func (l *indexLookup) IsMergeable(lookup sql.IndexLookup) bool {
183183
func (l *indexLookup) Intersection(lookups ...sql.IndexLookup) sql.IndexLookup {
184184
lookup := *l
185185
for _, li := range lookups {
186-
lookup.indexes = append(lookup.indexes, li.Indexes()...)
186+
for _, idx := range li.Indexes() {
187+
lookup.indexes[idx] = struct{}{}
188+
}
187189
lookup.operations = append(lookup.operations, &lookupOperation{li, intersect})
188190
}
189191

@@ -194,7 +196,9 @@ func (l *indexLookup) Intersection(lookups ...sql.IndexLookup) sql.IndexLookup {
194196
func (l *indexLookup) Union(lookups ...sql.IndexLookup) sql.IndexLookup {
195197
lookup := *l
196198
for _, li := range lookups {
197-
lookup.indexes = append(lookup.indexes, li.Indexes()...)
199+
for _, idx := range li.Indexes() {
200+
lookup.indexes[idx] = struct{}{}
201+
}
198202
lookup.operations = append(lookup.operations, &lookupOperation{li, union})
199203
}
200204

@@ -205,7 +209,9 @@ func (l *indexLookup) Union(lookups ...sql.IndexLookup) sql.IndexLookup {
205209
func (l *indexLookup) Difference(lookups ...sql.IndexLookup) sql.IndexLookup {
206210
lookup := *l
207211
for _, li := range lookups {
208-
lookup.indexes = append(lookup.indexes, li.Indexes()...)
212+
for _, idx := range li.Indexes() {
213+
lookup.indexes[idx] = struct{}{}
214+
}
209215
lookup.operations = append(lookup.operations, &lookupOperation{li, difference})
210216
}
211217

@@ -219,7 +225,7 @@ type filteredLookup struct {
219225
keys []interface{}
220226
expressions []string
221227
operations []*lookupOperation
222-
indexes []string
228+
indexes map[string]struct{}
223229

224230
reverse bool
225231
filter func(int, []byte) (bool, error)
@@ -326,7 +332,7 @@ func (l *filteredLookup) Values(p sql.Partition) (sql.IndexValueIter, error) {
326332
}
327333

328334
func (l *filteredLookup) Indexes() []string {
329-
return uniqueIndexes(append(l.indexes[:], l.id))
335+
return sortedIndexes(l.indexes)
330336
}
331337

332338
// IsMergeable implements sql.Mergeable interface.
@@ -341,7 +347,9 @@ func (l *filteredLookup) IsMergeable(lookup sql.IndexLookup) bool {
341347
func (l *filteredLookup) Intersection(lookups ...sql.IndexLookup) sql.IndexLookup {
342348
lookup := *l
343349
for _, li := range lookups {
344-
lookup.indexes = append(lookup.indexes, li.Indexes()...)
350+
for _, idx := range li.Indexes() {
351+
lookup.indexes[idx] = struct{}{}
352+
}
345353
lookup.operations = append(lookup.operations, &lookupOperation{li, intersect})
346354
}
347355

@@ -352,7 +360,9 @@ func (l *filteredLookup) Intersection(lookups ...sql.IndexLookup) sql.IndexLooku
352360
func (l *filteredLookup) Union(lookups ...sql.IndexLookup) sql.IndexLookup {
353361
lookup := *l
354362
for _, li := range lookups {
355-
lookup.indexes = append(lookup.indexes, li.Indexes()...)
363+
for _, idx := range li.Indexes() {
364+
lookup.indexes[idx] = struct{}{}
365+
}
356366
lookup.operations = append(lookup.operations, &lookupOperation{li, union})
357367
}
358368

@@ -363,7 +373,9 @@ func (l *filteredLookup) Union(lookups ...sql.IndexLookup) sql.IndexLookup {
363373
func (l *filteredLookup) Difference(lookups ...sql.IndexLookup) sql.IndexLookup {
364374
lookup := *l
365375
for _, li := range lookups {
366-
lookup.indexes = append(lookup.indexes, li.Indexes()...)
376+
for _, idx := range li.Indexes() {
377+
lookup.indexes[idx] = struct{}{}
378+
}
367379
lookup.operations = append(lookup.operations, &lookupOperation{li, difference})
368380
}
369381

@@ -388,7 +400,7 @@ type negateLookup struct {
388400
mapping *mapping
389401
keys []interface{}
390402
expressions []string
391-
indexes []string
403+
indexes map[string]struct{}
392404
operations []*lookupOperation
393405
}
394406

@@ -501,7 +513,7 @@ func (l *negateLookup) Values(p sql.Partition) (sql.IndexValueIter, error) {
501513
}
502514

503515
func (l *negateLookup) Indexes() []string {
504-
return uniqueIndexes(append(l.indexes[:], l.id))
516+
return sortedIndexes(l.indexes)
505517
}
506518

507519
// IsMergeable implements sql.Mergeable interface.
@@ -517,7 +529,9 @@ func (l *negateLookup) IsMergeable(lookup sql.IndexLookup) bool {
517529
func (l *negateLookup) Intersection(lookups ...sql.IndexLookup) sql.IndexLookup {
518530
lookup := *l
519531
for _, li := range lookups {
520-
lookup.indexes = append(lookup.indexes, li.Indexes()...)
532+
for _, idx := range li.Indexes() {
533+
lookup.indexes[idx] = struct{}{}
534+
}
521535
lookup.operations = append(lookup.operations, &lookupOperation{li, intersect})
522536
}
523537

@@ -528,7 +542,9 @@ func (l *negateLookup) Intersection(lookups ...sql.IndexLookup) sql.IndexLookup
528542
func (l *negateLookup) Union(lookups ...sql.IndexLookup) sql.IndexLookup {
529543
lookup := *l
530544
for _, li := range lookups {
531-
lookup.indexes = append(lookup.indexes, li.Indexes()...)
545+
for _, idx := range li.Indexes() {
546+
lookup.indexes[idx] = struct{}{}
547+
}
532548
lookup.operations = append(lookup.operations, &lookupOperation{li, union})
533549
}
534550

@@ -539,7 +555,9 @@ func (l *negateLookup) Union(lookups ...sql.IndexLookup) sql.IndexLookup {
539555
func (l *negateLookup) Difference(lookups ...sql.IndexLookup) sql.IndexLookup {
540556
lookup := *l
541557
for _, li := range lookups {
542-
lookup.indexes = append(lookup.indexes, li.Indexes()...)
558+
for _, idx := range li.Indexes() {
559+
lookup.indexes[idx] = struct{}{}
560+
}
543561
lookup.operations = append(lookup.operations, &lookupOperation{li, difference})
544562
}
545563

@@ -748,13 +766,9 @@ func compare(a, b interface{}) (int, error) {
748766
}
749767
}
750768

751-
func uniqueIndexes(indexes []string) []string {
752-
var m = make(map[string]struct{})
753-
for _, idx := range indexes {
754-
m[idx] = struct{}{}
755-
}
756-
var result = make([]string, 0, len(m))
757-
for idx := range m {
769+
func sortedIndexes(indexes map[string]struct{}) []string {
770+
var result = make([]string, 0, len(indexes))
771+
for idx := range indexes {
758772
result = append(result, idx)
759773
}
760774

sql/index/pilosa/lookup_test.go

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,20 @@ func TestMergeable(t *testing.T) {
204204

205205
func TestIndexes(t *testing.T) {
206206
testCases := []sql.IndexLookup{
207-
&indexLookup{id: "foo"},
208-
&negateLookup{id: "foo"},
209-
&ascendLookup{filteredLookup: &filteredLookup{id: "foo"}},
210-
&descendLookup{filteredLookup: &filteredLookup{id: "foo"}},
207+
&indexLookup{id: "foo", indexes: map[string]struct{}{"foo": struct{}{}}},
208+
&negateLookup{id: "foo", indexes: map[string]struct{}{"foo": struct{}{}}},
209+
&ascendLookup{
210+
filteredLookup: &filteredLookup{
211+
id: "foo",
212+
indexes: map[string]struct{}{"foo": struct{}{}},
213+
},
214+
},
215+
&descendLookup{
216+
filteredLookup: &filteredLookup{
217+
id: "foo",
218+
indexes: map[string]struct{}{"foo": struct{}{}},
219+
},
220+
},
211221
}
212222

213223
for _, tt := range testCases {
@@ -221,11 +231,26 @@ func TestLookupIndexes(t *testing.T) {
221231
require := require.New(t)
222232

223233
lookups := []sql.IndexLookup{
224-
&indexLookup{id: "1"},
225-
&negateLookup{id: "2"},
226-
&ascendLookup{filteredLookup: &filteredLookup{id: "3"}},
227-
&descendLookup{filteredLookup: &filteredLookup{id: "4"}},
228-
&filteredLookup{id: "5"},
234+
&indexLookup{
235+
id: "1",
236+
indexes: map[string]struct{}{"1": struct{}{}},
237+
},
238+
&negateLookup{
239+
id: "2",
240+
indexes: map[string]struct{}{"2": struct{}{}},
241+
},
242+
&ascendLookup{filteredLookup: &filteredLookup{
243+
id: "3",
244+
indexes: map[string]struct{}{"3": struct{}{}},
245+
}},
246+
&descendLookup{filteredLookup: &filteredLookup{
247+
id: "4",
248+
indexes: map[string]struct{}{"4": struct{}{}},
249+
}},
250+
&filteredLookup{
251+
id: "5",
252+
indexes: map[string]struct{}{"5": struct{}{}},
253+
},
229254
}
230255

231256
expected := []string{"1", "2", "3", "4", "5"}

0 commit comments

Comments
 (0)