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

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

Issue 1302813003: impl/memory: Implement Queries (Closed) Base URL: https://github.com/luci/gae.git@add_multi_iterator
Patch Set: Created 5 years, 4 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
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 "sync" 9 "sync"
10 10
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 } 59 }
60 60
61 func multiIterate(defs []*iterDefinition, cb func(suffix []byte) bool) { 61 func multiIterate(defs []*iterDefinition, cb func(suffix []byte) bool) {
62 ts := make([]*iterator, len(defs)) 62 ts := make([]*iterator, len(defs))
63 prefixLens := make([]int, len(defs)) 63 prefixLens := make([]int, len(defs))
64 for i, def := range defs { 64 for i, def := range defs {
65 if def.prefix == nil { 65 if def.prefix == nil {
66 panic("got nil prefix") 66 panic("got nil prefix")
67 } 67 }
68 68
69 » » end := []byte(nil) 69 » » // start at the prefix, plus any defined start suffix
70 » » if def.end != nil {
71 » » » end = bjoin(def.prefix, def.end)
72 » » } else {
73 » » » end = []byte(increment(string(def.prefix), true))
74 » » }
75
76 start := def.prefix 70 start := def.prefix
77 if def.start != nil { 71 if def.start != nil {
78 start = bjoin(def.prefix, def.start) 72 start = bjoin(def.prefix, def.start)
79 } 73 }
80 74
75 // end at the prefix+1 (if there was a defined prefix), plus any defined
76 // start suffix.
77 end := []byte(nil)
78 if def.end != nil {
79 end = bjoin(def.prefix, def.end)
80 } else if def.prefix != nil {
81 end = increment(def.prefix)
82 }
83
81 ts[i] = newIterator(def.c, start, end) 84 ts[i] = newIterator(def.c, start, end)
82 prefixLens[i] = len(def.prefix) 85 prefixLens[i] = len(def.prefix)
83 defer ts[i].stop() 86 defer ts[i].stop()
84 } 87 }
85 88
86 suffix := []byte(nil) 89 suffix := []byte(nil)
87 skip := -1 90 skip := -1
88 91
89 for { 92 for {
90 stop := false 93 stop := false
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 t.ch <- &cmd{targ, func(i *gkvlite.Item) { 223 t.ch <- &cmd{targ, func(i *gkvlite.Item) {
221 defer close(waiter) 224 defer close(waiter)
222 225
223 cb(i) 226 cb(i)
224 if i == nil { 227 if i == nil {
225 t.stop() 228 t.stop()
226 } 229 }
227 }} 230 }}
228 <-waiter 231 <-waiter
229 } 232 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698