Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(303)

Side by Side Diff: impl/memory/datastore_index.go

Issue 1312433013: Switch to external stringset implementation. (Closed) Base URL: https://github.com/luci/gae.git@master
Patch Set: fix nitish Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | impl/memory/datastore_index_selection.go » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package memory 5 package memory
6 6
7 import ( 7 import (
8 "bytes" 8 "bytes"
9 "fmt" 9 "fmt"
10 "sort" 10 "sort"
11 11
12 ds "github.com/luci/gae/service/datastore" 12 ds "github.com/luci/gae/service/datastore"
13 "github.com/luci/gae/service/datastore/serialize" 13 "github.com/luci/gae/service/datastore/serialize"
14 "github.com/luci/gkvlite" 14 "github.com/luci/gkvlite"
15 "github.com/luci/luci-go/common/stringset"
15 ) 16 )
16 17
17 type qIndexSlice []*ds.IndexDefinition 18 type qIndexSlice []*ds.IndexDefinition
18 19
19 func (s qIndexSlice) Len() int { return len(s) } 20 func (s qIndexSlice) Len() int { return len(s) }
20 func (s qIndexSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } 21 func (s qIndexSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
21 func (s qIndexSlice) Less(i, j int) bool { return s[i].Less(s[j]) } 22 func (s qIndexSlice) Less(i, j int) bool { return s[i].Less(s[j]) }
22 23
23 func defaultIndexes(kind string, pmap ds.PropertyMap) []*ds.IndexDefinition { 24 func defaultIndexes(kind string, pmap ds.PropertyMap) []*ds.IndexDefinition {
24 ret := make(qIndexSlice, 0, 2*len(pmap)+1) 25 ret := make(qIndexSlice, 0, 2*len(pmap)+1)
(...skipping 29 matching lines...) Expand all
54 func (s serializedPvals) Len() int { return len(s) } 55 func (s serializedPvals) Len() int { return len(s) }
55 func (s serializedPvals) Swap(i, j int) { s[i], s[j] = s[j], s[i] } 56 func (s serializedPvals) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
56 func (s serializedPvals) Less(i, j int) bool { return bytes.Compare(s[i], s[j]) < 0 } 57 func (s serializedPvals) Less(i, j int) bool { return bytes.Compare(s[i], s[j]) < 0 }
57 58
58 // prop name -> [<serialized DSProperty>, ...] 59 // prop name -> [<serialized DSProperty>, ...]
59 // includes special values '__key__' and '__ancestor__' which contains all of 60 // includes special values '__key__' and '__ancestor__' which contains all of
60 // the ancestor entries for this key. 61 // the ancestor entries for this key.
61 type serializedIndexablePmap map[string]serializedPvals 62 type serializedIndexablePmap map[string]serializedPvals
62 63
63 func serializeRow(vals []ds.Property) serializedPvals { 64 func serializeRow(vals []ds.Property) serializedPvals {
64 » dups := map[string]struct{}{} 65 » dups := stringset.New(0)
65 ret := make(serializedPvals, 0, len(vals)) 66 ret := make(serializedPvals, 0, len(vals))
66 for _, v := range vals { 67 for _, v := range vals {
67 if v.IndexSetting() == ds.NoIndex { 68 if v.IndexSetting() == ds.NoIndex {
68 continue 69 continue
69 } 70 }
70 data := serialize.ToBytes(v.ForIndex()) 71 data := serialize.ToBytes(v.ForIndex())
71 dataS := string(data) 72 dataS := string(data)
72 » » if _, ok := dups[dataS]; ok { 73 » » if !dups.Add(dataS) {
73 continue 74 continue
74 } 75 }
75 dups[dataS] = struct{}{}
76 ret = append(ret, data) 76 ret = append(ret, data)
77 } 77 }
78 return ret 78 return ret
79 } 79 }
80 80
81 func partiallySerialize(k ds.Key, pm ds.PropertyMap) (ret serializedIndexablePma p) { 81 func partiallySerialize(k ds.Key, pm ds.PropertyMap) (ret serializedIndexablePma p) {
82 ret = make(serializedIndexablePmap, len(pm)+2) 82 ret = make(serializedIndexablePmap, len(pm)+2)
83 if k == nil { 83 if k == nil {
84 impossible(fmt.Errorf("key to partiallySerialize is nil")) 84 impossible(fmt.Errorf("key to partiallySerialize is nil"))
85 } 85 }
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 compIdx := []*ds.IndexDefinition{} 306 compIdx := []*ds.IndexDefinition{}
307 walkCompIdxs(store, nil, func(i *ds.IndexDefinition) bool { 307 walkCompIdxs(store, nil, func(i *ds.IndexDefinition) bool {
308 compIdx = append(compIdx, i) 308 compIdx = append(compIdx, i)
309 return true 309 return true
310 }) 310 })
311 311
312 mergeIndexes(key.Namespace(), store, 312 mergeIndexes(key.Namespace(), store,
313 indexEntriesWithBuiltins(key, oldEnt, compIdx), 313 indexEntriesWithBuiltins(key, oldEnt, compIdx),
314 indexEntriesWithBuiltins(key, newEnt, compIdx)) 314 indexEntriesWithBuiltins(key, newEnt, compIdx))
315 } 315 }
OLDNEW
« no previous file with comments | « no previous file | impl/memory/datastore_index_selection.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698