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

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

Issue 1309803004: Add transaction buffer filter. (Closed) Base URL: https://github.com/luci/gae.git@add_query_support
Patch Set: make data flow clearer, implement Count Created 5 years, 2 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 "errors" 8 "errors"
9 "fmt" 9 "fmt"
10 10
(...skipping 11 matching lines...) Expand all
22 dsd := cur(ic).Get(memContextDSIdx) 22 dsd := cur(ic).Get(memContextDSIdx)
23 23
24 ns := curGID(ic).namespace 24 ns := curGID(ic).namespace
25 if x, ok := dsd.(*dataStoreData); ok { 25 if x, ok := dsd.(*dataStoreData); ok {
26 return &dsImpl{x, ns, ic} 26 return &dsImpl{x, ns, ic}
27 } 27 }
28 return &txnDsImpl{dsd.(*txnDataStoreData), ns} 28 return &txnDsImpl{dsd.(*txnDataStoreData), ns}
29 }) 29 })
30 } 30 }
31 31
32 // NewDatastore creates a new standalone memory implementation of the datastore.
33 func NewDatastore(aid, ns string) ds.RawInterface {
34 return &dsImpl{newDataStoreData(aid), ns, context.Background()}
35 }
36
32 //////////////////////////////////// dsImpl //////////////////////////////////// 37 //////////////////////////////////// dsImpl ////////////////////////////////////
33 38
34 // dsImpl exists solely to bind the current c to the datastore data. 39 // dsImpl exists solely to bind the current c to the datastore data.
35 type dsImpl struct { 40 type dsImpl struct {
36 data *dataStoreData 41 data *dataStoreData
37 ns string 42 ns string
38 c context.Context 43 c context.Context
39 } 44 }
40 45
41 var _ ds.RawInterface = (*dsImpl)(nil) 46 var _ ds.RawInterface = (*dsImpl)(nil)
(...skipping 15 matching lines...) Expand all
57 d.data.delMulti(keys, cb) 62 d.data.delMulti(keys, cb)
58 return nil 63 return nil
59 } 64 }
60 65
61 func (d *dsImpl) DecodeCursor(s string) (ds.Cursor, error) { 66 func (d *dsImpl) DecodeCursor(s string) (ds.Cursor, error) {
62 return newCursor(s) 67 return newCursor(s)
63 } 68 }
64 69
65 func (d *dsImpl) Run(fq *ds.FinalizedQuery, cb ds.RawRunCB) error { 70 func (d *dsImpl) Run(fq *ds.FinalizedQuery, cb ds.RawRunCB) error {
66 idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent()) 71 idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent())
67 » err := executeQuery(fq, d.ns, false, idx, head, cb) 72 » err := executeQuery(fq, d.data.aid, d.ns, false, idx, head, cb)
68 if d.data.maybeAutoIndex(err) { 73 if d.data.maybeAutoIndex(err) {
69 idx, head = d.data.getQuerySnaps(!fq.EventuallyConsistent()) 74 idx, head = d.data.getQuerySnaps(!fq.EventuallyConsistent())
70 » » err = executeQuery(fq, d.ns, false, idx, head, cb) 75 » » err = executeQuery(fq, d.data.aid, d.ns, false, idx, head, cb)
71 } 76 }
72 return err 77 return err
73 } 78 }
74 79
75 func (d *dsImpl) Count(fq *ds.FinalizedQuery) (ret int64, err error) { 80 func (d *dsImpl) Count(fq *ds.FinalizedQuery) (ret int64, err error) {
76 idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent()) 81 idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent())
77 » ret, err = countQuery(fq, d.ns, false, idx, head) 82 » ret, err = countQuery(fq, d.data.aid, d.ns, false, idx, head)
78 if d.data.maybeAutoIndex(err) { 83 if d.data.maybeAutoIndex(err) {
79 idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent()) 84 idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent())
80 » » ret, err = countQuery(fq, d.ns, false, idx, head) 85 » » ret, err = countQuery(fq, d.data.aid, d.ns, false, idx, head)
81 } 86 }
82 return 87 return
83 } 88 }
84 89
85 func (d *dsImpl) AddIndexes(idxs ...*ds.IndexDefinition) { 90 func (d *dsImpl) AddIndexes(idxs ...*ds.IndexDefinition) {
86 if len(idxs) == 0 { 91 if len(idxs) == 0 {
87 return 92 return
88 } 93 }
89 94
90 for _, i := range idxs { 95 for _, i := range idxs {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 func (d *txnDsImpl) Run(q *ds.FinalizedQuery, cb ds.RawRunCB) error { 172 func (d *txnDsImpl) Run(q *ds.FinalizedQuery, cb ds.RawRunCB) error {
168 // note that autoIndex has no effect inside transactions. This is becaus e 173 // note that autoIndex has no effect inside transactions. This is becaus e
169 // the transaction guarantees a consistent view of head at the time that the 174 // the transaction guarantees a consistent view of head at the time that the
170 // transaction opens. At best, we could add the index on head, but then return 175 // transaction opens. At best, we could add the index on head, but then return
171 // the error anyway, but adding the index then re-snapping at head would 176 // the error anyway, but adding the index then re-snapping at head would
172 // potentially reveal other entities not in the original transaction sna pshot. 177 // potentially reveal other entities not in the original transaction sna pshot.
173 // 178 //
174 // It's possible that if you have full-consistency and also auto index e nabled 179 // It's possible that if you have full-consistency and also auto index e nabled
175 // that this would make sense... but at that point you should probably j ust 180 // that this would make sense... but at that point you should probably j ust
176 // add the index up front. 181 // add the index up front.
177 » return executeQuery(q, d.ns, true, d.data.snap, d.data.snap, cb) 182 » return executeQuery(q, d.data.parent.aid, d.ns, true, d.data.snap, d.dat a.snap, cb)
178 } 183 }
179 184
180 func (d *txnDsImpl) Count(fq *ds.FinalizedQuery) (ret int64, err error) { 185 func (d *txnDsImpl) Count(fq *ds.FinalizedQuery) (ret int64, err error) {
181 » return countQuery(fq, d.ns, true, d.data.snap, d.data.snap) 186 » return countQuery(fq, d.data.parent.aid, d.ns, true, d.data.snap, d.data .snap)
182 } 187 }
183 188
184 func (*txnDsImpl) RunInTransaction(func(c context.Context) error, *ds.Transactio nOptions) error { 189 func (*txnDsImpl) RunInTransaction(func(c context.Context) error, *ds.Transactio nOptions) error {
185 return errors.New("datastore: nested transactions are not supported") 190 return errors.New("datastore: nested transactions are not supported")
186 } 191 }
187 192
188 func (*txnDsImpl) Testable() ds.Testable { 193 func (*txnDsImpl) Testable() ds.Testable {
189 return nil 194 return nil
190 } 195 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698