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

Side by Side Diff: service/datastore/finalized_query.go

Issue 1745703002: Auto-project on distinct inequality fields. (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/gae@master
Patch Set: Created 4 years, 9 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 datastore 5 package datastore
6 6
7 import ( 7 import (
8 "bytes" 8 "bytes"
9 "fmt" 9 "fmt"
10 "sort" 10 "sort"
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 // EventuallyConsistent returns true iff this query will be eventually 58 // EventuallyConsistent returns true iff this query will be eventually
59 // consistent. This is true when the query is a non-ancestor query, or when it's 59 // consistent. This is true when the query is a non-ancestor query, or when it's
60 // an ancestory query with the 'EventualConsistency(true)' option set. 60 // an ancestory query with the 'EventualConsistency(true)' option set.
61 func (q *FinalizedQuery) EventuallyConsistent() bool { 61 func (q *FinalizedQuery) EventuallyConsistent() bool {
62 return q.eventuallyConsistent 62 return q.eventuallyConsistent
63 } 63 }
64 64
65 // Project is the list of fields that this query projects on, or empty if this 65 // Project is the list of fields that this query projects on, or empty if this
66 // is not a projection query. 66 // is not a projection query.
67 func (q *FinalizedQuery) Project() []string { 67 func (q *FinalizedQuery) Project() []string {
68 » if len(q.project) == 0 { 68 » // For distinct queries with an inequality filter, one must first projec t the
69 » // inequality field.
70 » size := len(q.project)
71 » ineqDistinctProject := ""
72 » if q.distinct && q.ineqFiltProp != "" {
73 » » ineqDistinctProject = q.ineqFiltProp
74 » » size++
75 » }
76
77 » if size == 0 {
69 return nil 78 return nil
70 } 79 }
71 » ret := make([]string, len(q.project)) 80 » ret := make([]string, 0, size)
72 » copy(ret, q.project) 81 » if ineqDistinctProject != "" {
82 » » ret = append(ret, ineqDistinctProject)
83 » }
84 » ret = append(ret, q.project...)
iannucci 2016/02/27 00:58:51 ditch this whole thing
73 return ret 85 return ret
74 } 86 }
75 87
76 // Distinct returnst true iff this is a distinct projection query. It will never 88 // Distinct returnst true iff this is a distinct projection query. It will never
77 // be true for non-projection queries. 89 // be true for non-projection queries.
78 func (q *FinalizedQuery) Distinct() bool { 90 func (q *FinalizedQuery) Distinct() bool {
79 return q.distinct 91 return q.distinct
80 } 92 }
81 93
82 // KeysOnly returns true iff this query will only return keys (as opposed to a 94 // KeysOnly returns true iff this query will only return keys (as opposed to a
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 if q.ineqFiltProp == "__key__" { 342 if q.ineqFiltProp == "__key__" {
331 if q.ineqFiltLowSet && !q.ineqFiltLow.Value().(*Key).Valid(false , aid, ns) { 343 if q.ineqFiltLowSet && !q.ineqFiltLow.Value().(*Key).Valid(false , aid, ns) {
332 return ErrInvalidKey 344 return ErrInvalidKey
333 } 345 }
334 if q.ineqFiltHighSet && !q.ineqFiltHigh.Value().(*Key).Valid(fal se, aid, ns) { 346 if q.ineqFiltHighSet && !q.ineqFiltHigh.Value().(*Key).Valid(fal se, aid, ns) {
335 return ErrInvalidKey 347 return ErrInvalidKey
336 } 348 }
337 } 349 }
338 return nil 350 return nil
339 } 351 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698