OLD | NEW |
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 "fmt" | 8 "fmt" |
9 "testing" | 9 "testing" |
| 10 "time" |
10 | 11 |
11 ds "github.com/luci/gae/service/datastore" | 12 ds "github.com/luci/gae/service/datastore" |
12 "github.com/luci/gae/service/info" | 13 "github.com/luci/gae/service/info" |
13 . "github.com/luci/luci-go/common/testing/assertions" | 14 . "github.com/luci/luci-go/common/testing/assertions" |
14 . "github.com/smartystreets/goconvey/convey" | 15 . "github.com/smartystreets/goconvey/convey" |
15 "golang.org/x/net/context" | 16 "golang.org/x/net/context" |
16 ) | 17 ) |
17 | 18 |
18 type qExpect struct { | 19 type qExpect struct { |
19 q ds.Query | 20 q ds.Query |
(...skipping 18 matching lines...) Expand all Loading... |
38 test []qExStage | 39 test []qExStage |
39 } | 40 } |
40 | 41 |
41 var stage1Data = []ds.PropertyMap{ | 42 var stage1Data = []ds.PropertyMap{ |
42 pmap("$key", key("Kind", 1), NEXT, | 43 pmap("$key", key("Kind", 1), NEXT, |
43 "Val", 1, 2, 3, NEXT, | 44 "Val", 1, 2, 3, NEXT, |
44 "Extra", "hello", | 45 "Extra", "hello", |
45 ), | 46 ), |
46 pmap("$key", key("Kind", 2), NEXT, | 47 pmap("$key", key("Kind", 2), NEXT, |
47 "Val", 6, 8, 7, NEXT, | 48 "Val", 6, 8, 7, NEXT, |
| 49 "When", 27, NEXT, |
48 "Extra", "zebra", | 50 "Extra", "zebra", |
49 ), | 51 ), |
50 pmap("$key", key("Kind", 3), NEXT, | 52 pmap("$key", key("Kind", 3), NEXT, |
51 "Val", 1, 2, 2, 100, NEXT, | 53 "Val", 1, 2, 2, 100, NEXT, |
| 54 "When", 996688461000000, NEXT, |
52 "Extra", "waffle", | 55 "Extra", "waffle", |
53 ), | 56 ), |
54 pmap("$key", key("Kind", 6), NEXT, | 57 pmap("$key", key("Kind", 6), NEXT, |
55 "Val", 5, NEXT, | 58 "Val", 5, NEXT, |
| 59 "When", time.Date(2000, time.January, 1, 1, 1, 1, 1, time.UTC),
NEXT, |
56 "Extra", "waffle", | 60 "Extra", "waffle", |
57 ), | 61 ), |
58 pmap("$key", key("Child", "seven", key("Kind", 3)), NEXT, | 62 pmap("$key", key("Child", "seven", key("Kind", 3)), NEXT, |
59 "Interesting", 28, NEXT, | 63 "Interesting", 28, NEXT, |
60 "Extra", "hello", | 64 "Extra", "hello", |
61 ), | 65 ), |
62 pmap("$key", key("Unique", 1), NEXT, | 66 pmap("$key", key("Unique", 1), NEXT, |
63 "Derp", 39, | 67 "Derp", 39, |
64 ), | 68 ), |
65 } | 69 } |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 get: []ds.PropertyMap{ | 221 get: []ds.PropertyMap{ |
218 pmap("$key", key("Kind", 3), NEX
T, | 222 pmap("$key", key("Kind", 3), NEX
T, |
219 "Val", 100), | 223 "Val", 100), |
220 pmap("$key", key("Kind", 1, key(
"Kind", 3)), NEXT, | 224 pmap("$key", key("Kind", 1, key(
"Kind", 3)), NEXT, |
221 "Val", 28), | 225 "Val", 28), |
222 pmap("$key", key("Kind", 1, key(
"Kind", 3)), NEXT, | 226 pmap("$key", key("Kind", 1, key(
"Kind", 3)), NEXT, |
223 "Val", 4), | 227 "Val", 4), |
224 pmap("$key", key("Kind", 2, key(
"Kind", 3)), NEXT, | 228 pmap("$key", key("Kind", 2, key(
"Kind", 3)), NEXT, |
225 "Val", 3), | 229 "Val", 3), |
226 }}, | 230 }}, |
| 231 |
| 232 // Projecting a complex type (time), gets the in
dex type (int64) |
| 233 // instead. Additionally, mixed-types within the
same index type are |
| 234 // smooshed together in the result. |
| 235 {q: nq("Kind").Project("When"), get: []ds.Proper
tyMap{ |
| 236 pmap("$key", key("Kind", 2), NEXT, |
| 237 "When", 27), |
| 238 pmap("$key", key("Kind", 6), NEXT, |
| 239 "When", 946688461000000), |
| 240 pmap("$key", key("Kind", 3), NEXT, |
| 241 "When", 996688461000000), |
| 242 }}, |
| 243 |
| 244 // Original (complex) types are retained when ge
tting the full value. |
| 245 {q: nq("Kind").Order("When"), get: []ds.Property
Map{ |
| 246 stage1Data[1], |
| 247 stage1Data[3], |
| 248 stage1Data[2], |
| 249 }}, |
227 }, | 250 }, |
228 | 251 |
229 extraFns: []func(context.Context){ | 252 extraFns: []func(context.Context){ |
230 func(c context.Context) { | 253 func(c context.Context) { |
231 data := ds.Get(c) | 254 data := ds.Get(c) |
232 curs := ds.Cursor(nil) | 255 curs := ds.Cursor(nil) |
233 | 256 |
234 q := nq("").Filter("__key__ >", key("Kin
d", 2)) | 257 q := nq("").Filter("__key__ >", key("Kin
d", 2)) |
235 | 258 |
236 err := data.Run(q, func(pm ds.PropertyMa
p, gc ds.CursorCB) bool { | 259 err := data.Run(q, func(pm ds.PropertyMa
p, gc ds.CursorCB) bool { |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 Convey(fmt.Sprintf("extr
aFn %d", j), func() { | 373 Convey(fmt.Sprintf("extr
aFn %d", j), func() { |
351 fn(c) | 374 fn(c) |
352 }) | 375 }) |
353 } | 376 } |
354 }) | 377 }) |
355 } | 378 } |
356 }) | 379 }) |
357 } | 380 } |
358 }) | 381 }) |
359 } | 382 } |
OLD | NEW |