| Index: impl/memory/datastore.go
|
| diff --git a/impl/memory/datastore.go b/impl/memory/datastore.go
|
| index 973d59b8d3753beb31511366b91046e04a8cb76e..33a245e62a455a9450ae4b873183af4d64ef945c 100644
|
| --- a/impl/memory/datastore.go
|
| +++ b/impl/memory/datastore.go
|
| @@ -65,12 +65,22 @@ func (d *dsImpl) DecodeCursor(s string) (ds.Cursor, error) {
|
|
|
| func (d *dsImpl) Run(fq *ds.FinalizedQuery, cb ds.RawRunCB) error {
|
| idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent())
|
| - return executeQuery(fq, d.ns, false, idx, head, cb)
|
| + err := executeQuery(fq, d.ns, false, idx, head, cb)
|
| + if d.data.maybeAutoIndex(err) {
|
| + idx, head = d.data.getQuerySnaps(!fq.EventuallyConsistent())
|
| + err = executeQuery(fq, d.ns, false, idx, head, cb)
|
| + }
|
| + return err
|
| }
|
|
|
| func (d *dsImpl) Count(fq *ds.FinalizedQuery) (ret int64, err error) {
|
| idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent())
|
| - return countQuery(fq, d.ns, false, idx, head)
|
| + ret, err = countQuery(fq, d.ns, false, idx, head)
|
| + if d.data.maybeAutoIndex(err) {
|
| + idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent())
|
| + ret, err = countQuery(fq, d.ns, false, idx, head)
|
| + }
|
| + return
|
| }
|
|
|
| func (d *dsImpl) AddIndexes(idxs ...*ds.IndexDefinition) {
|
| @@ -84,9 +94,7 @@ func (d *dsImpl) AddIndexes(idxs ...*ds.IndexDefinition) {
|
| }
|
| }
|
|
|
| - d.data.Lock()
|
| - defer d.data.Unlock()
|
| - addIndex(d.data.head, d.ns, idxs)
|
| + d.data.addIndexes(d.ns, idxs)
|
| }
|
|
|
| func (d *dsImpl) TakeIndexSnapshot() ds.TestingSnapshot {
|
| @@ -109,6 +117,10 @@ func (d *dsImpl) Consistent(always bool) {
|
| d.data.setConsistent(always)
|
| }
|
|
|
| +func (d *dsImpl) AutoIndex(enable bool) {
|
| + d.data.setAutoIndex(enable)
|
| +}
|
| +
|
| func (d *dsImpl) Testable() ds.Testable {
|
| return d
|
| }
|
| @@ -151,6 +163,15 @@ func (d *txnDsImpl) DecodeCursor(s string) (ds.Cursor, error) {
|
| }
|
|
|
| func (d *txnDsImpl) Run(q *ds.FinalizedQuery, cb ds.RawRunCB) error {
|
| + // note that autoIndex has no effect inside transactions. This is because
|
| + // the transaction guarantees a consistent view of head at the time that the
|
| + // transaction opens. At best, we could add the index on head, but then return
|
| + // the error anyway, but adding the index then re-snapping at head would
|
| + // potentially reveal other entities not in the original transaction snapshot.
|
| + //
|
| + // It's possible that if you have full-consistency and also auto index enabled
|
| + // that this would make sense... but at that point you should probably just
|
| + // add the index up front.
|
| return executeQuery(q, d.ns, true, d.data.snap, d.data.snap, cb)
|
| }
|
|
|
|
|