Chromium Code Reviews| Index: impl/memory/datastore_query.go |
| diff --git a/impl/memory/datastore_query.go b/impl/memory/datastore_query.go |
| index 856f4c19bf0c110f29999217dfff28464245c12c..e56e485a0071bb301637b49032af09a59ca45a26 100644 |
| --- a/impl/memory/datastore_query.go |
| +++ b/impl/memory/datastore_query.go |
| @@ -9,6 +9,7 @@ import ( |
| "encoding/base64" |
| "errors" |
| "fmt" |
| + "time" |
| ds "github.com/luci/gae/service/datastore" |
| "github.com/luci/gae/service/datastore/serialize" |
| @@ -102,12 +103,26 @@ func numComponents(fq *ds.FinalizedQuery) int { |
| return numComponents |
| } |
| +// convertQueryProperty converts a ds.Property into a suitable property for |
| +// query serialization. |
| +// |
| +// PTTime fields are serialized into indexes as PTInt, so we need to represent |
| +// them as PTInt in the serialized query. |
|
iannucci
2015/12/29 19:53:46
could you add another case for all the various byt
dnj
2015/12/29 21:40:47
Sure. AFAICT this only additionally affected blobs
|
| +func convertQueryProperty(p ds.Property) ds.Property { |
| + switch p.Type() { |
| + case ds.PTTime: |
| + return ds.MkProperty(serialize.TimeToInt(p.Value().(time.Time))) |
| + default: |
| + return p |
| + } |
| +} |
| + |
| // GetBinaryBounds gets the binary encoding of the upper and lower bounds of |
|
iannucci
2015/12/29 19:53:46
this bug probably also affects equality comparison
dnj
2015/12/29 21:40:47
yarp, nice catch. Added test case and fix.
|
| // the inequality filter on fq, if any is defined. If a bound does not exist, |
| // it is nil. |
| // |
| // NOTE: if fq specifies a descending sort order for the inequality, the bounds |
| -// will be inverted, incremented, and fliped. |
| +// will be inverted, incremented, and flipped. |
| func GetBinaryBounds(fq *ds.FinalizedQuery) (lower, upper []byte) { |
| // Pick up the start/end range from the inequalities, if any. |
| // |
| @@ -117,7 +132,7 @@ func GetBinaryBounds(fq *ds.FinalizedQuery) (lower, upper []byte) { |
| if ineqProp := fq.IneqFilterProp(); ineqProp != "" { |
| _, startOp, startV := fq.IneqFilterLow() |
| if startOp != "" { |
| - lower = serialize.ToBytes(startV) |
| + lower = serialize.ToBytes(convertQueryProperty(startV)) |
| if startOp == ">" { |
| lower = increment(lower) |
| } |
| @@ -125,7 +140,7 @@ func GetBinaryBounds(fq *ds.FinalizedQuery) (lower, upper []byte) { |
| _, endOp, endV := fq.IneqFilterHigh() |
| if endOp != "" { |
| - upper = serialize.ToBytes(endV) |
| + upper = serialize.ToBytes(convertQueryProperty(endV)) |
| if endOp == "<=" { |
| upper = increment(upper) |
| } |