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

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

Issue 1302813003: impl/memory: Implement Queries (Closed) Base URL: https://github.com/luci/gae.git@add_multi_iterator
Patch Set: stringSet everywhere 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 | « impl/memory/taskqueue_data.go ('k') | service/datastore/datastore.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 "strings"
10 "time" 11 "time"
11 12
12 ds "github.com/luci/gae/service/datastore" 13 ds "github.com/luci/gae/service/datastore"
13 "github.com/luci/gae/service/datastore/dskey" 14 "github.com/luci/gae/service/datastore/dskey"
14 "github.com/luci/gae/service/datastore/serialize" 15 "github.com/luci/gae/service/datastore/serialize"
15 "github.com/luci/luci-go/common/cmpbin" 16 "github.com/luci/luci-go/common/cmpbin"
16 ) 17 )
17 18
18 type kv struct{ k, v []byte } 19 func init() {
20 » serializationDeterministic = true
21 » serialize.WritePropertyMapDeterministic = true
22 }
23
24 var NEXT_STR = "NEXT MARKER"
25 var NEXT = &NEXT_STR
26
27 // Use like:
28 // pmap(
29 // "prop", "val", 0, 100, NEXT,
30 // "other", "val", 0, 100, NEXT,
31 // )
32 //
33 func pmap(stuff ...interface{}) ds.PropertyMap {
34 » ret := ds.PropertyMap{}
35
36 » nom := func() interface{} {
37 » » if len(stuff) > 0 {
38 » » » ret := stuff[0]
39 » » » stuff = stuff[1:]
40 » » » return ret
41 » » }
42 » » return nil
43 » }
44
45 » for len(stuff) > 0 {
46 » » pname := nom().(string)
47 » » if pname[0] == '$' || (strings.HasPrefix(pname, "__") && strings .HasSuffix(pname, "__")) {
48 » » » for len(stuff) > 0 && stuff[0] != NEXT {
49 » » » » ret[pname] = append(ret[pname], propNI(nom()))
50 » » » }
51 » » } else {
52 » » » for len(stuff) > 0 && stuff[0] != NEXT {
53 » » » » ret[pname] = append(ret[pname], prop(nom()))
54 » » » }
55 » » }
56 » » nom()
57 » }
58
59 » return ret
60 }
61
62 func nq(kind_ns ...string) ds.Query {
63 » if len(kind_ns) == 2 {
64 » » return &queryImpl{kind: kind_ns[0], ns: kind_ns[1]}
65 » } else if len(kind_ns) == 1 {
66 » » return &queryImpl{kind: kind_ns[0], ns: "ns"}
67 » }
68 » return &queryImpl{kind: "Foo", ns: "ns"}
69 }
19 70
20 func indx(kind string, orders ...string) *ds.IndexDefinition { 71 func indx(kind string, orders ...string) *ds.IndexDefinition {
21 ancestor := false 72 ancestor := false
22 if kind[len(kind)-1] == '!' { 73 if kind[len(kind)-1] == '!' {
23 ancestor = true 74 ancestor = true
24 kind = kind[:len(kind)-1] 75 kind = kind[:len(kind)-1]
25 } 76 }
26 ret := &ds.IndexDefinition{Kind: kind, Ancestor: ancestor} 77 ret := &ds.IndexDefinition{Kind: kind, Ancestor: ancestor}
27 for _, o := range orders { 78 for _, o := range orders {
28 dir := ds.ASCENDING 79 dir := ds.ASCENDING
(...skipping 15 matching lines...) Expand all
44 p := ds.Key(nil) 95 p := ds.Key(nil)
45 if len(parent) > 0 { 96 if len(parent) > 0 {
46 p = parent[0] 97 p = parent[0]
47 } 98 }
48 switch x := id.(type) { 99 switch x := id.(type) {
49 case string: 100 case string:
50 return dskey.New(globalAppID, "ns", kind, x, 0, p) 101 return dskey.New(globalAppID, "ns", kind, x, 0, p)
51 case int: 102 case int:
52 return dskey.New(globalAppID, "ns", kind, "", int64(x), p) 103 return dskey.New(globalAppID, "ns", kind, "", int64(x), p)
53 default: 104 default:
54 » » panic(fmt.Errorf("what the %T: %v", id, id)) 105 » » return dskey.New(globalAppID, "ns", kind, "invalid", 100, p)
55 } 106 }
56 } 107 }
57 108
58 // cat is a convenience method for concatenating anything with an underlying 109 // cat is a convenience method for concatenating anything with an underlying
59 // byte representation into a single []byte. 110 // byte representation into a single []byte.
60 func cat(bytethings ...interface{}) []byte { 111 func cat(bytethings ...interface{}) []byte {
61 buf := &bytes.Buffer{} 112 buf := &bytes.Buffer{}
62 for _, thing := range bytethings { 113 for _, thing := range bytethings {
63 switch x := thing.(type) { 114 switch x := thing.(type) {
64 case int64: 115 case int64:
(...skipping 13 matching lines...) Expand all
78 case string: 129 case string:
79 cmpbin.WriteString(buf, x) 130 cmpbin.WriteString(buf, x)
80 case []byte: 131 case []byte:
81 buf.Write(x) 132 buf.Write(x)
82 case time.Time: 133 case time.Time:
83 serialize.WriteTime(buf, x) 134 serialize.WriteTime(buf, x)
84 case ds.Key: 135 case ds.Key:
85 serialize.WriteKey(buf, serialize.WithoutContext, x) 136 serialize.WriteKey(buf, serialize.WithoutContext, x)
86 case *ds.IndexDefinition: 137 case *ds.IndexDefinition:
87 serialize.WriteIndexDefinition(buf, *x) 138 serialize.WriteIndexDefinition(buf, *x)
139 case ds.Property:
140 serialize.WriteProperty(buf, serialize.WithoutContext, x )
88 default: 141 default:
89 panic(fmt.Errorf("I don't know how to deal with %T: %#v" , thing, thing)) 142 panic(fmt.Errorf("I don't know how to deal with %T: %#v" , thing, thing))
90 } 143 }
91 } 144 }
92 ret := buf.Bytes() 145 ret := buf.Bytes()
93 if ret == nil { 146 if ret == nil {
94 ret = []byte{} 147 ret = []byte{}
95 } 148 }
96 return ret 149 return ret
97 } 150 }
98 151
99 func icat(bytethings ...interface{}) []byte { 152 func icat(bytethings ...interface{}) []byte {
100 ret := cat(bytethings...) 153 ret := cat(bytethings...)
101 for i := range ret { 154 for i := range ret {
102 ret[i] ^= 0xFF 155 ret[i] ^= 0xFF
103 } 156 }
104 return ret 157 return ret
105 } 158 }
106 159
107 func sat(bytethings ...interface{}) string { 160 func sat(bytethings ...interface{}) string {
108 return string(cat(bytethings...)) 161 return string(cat(bytethings...))
109 } 162 }
OLDNEW
« no previous file with comments | « impl/memory/taskqueue_data.go ('k') | service/datastore/datastore.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698