func (d *dsImpl) Count(fq *ds.FinalizedQuery) (ret int64, err error) { idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent()) ret, err = countQuery(fq, d.data.aid, d.ns, false, idx, head) if d.data.maybeAutoIndex(err) { idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent()) ret, err = countQuery(fq, d.data.aid, d.ns, false, idx, head) } return }
func (d *dsImpl) Run(fq *ds.FinalizedQuery, cb ds.RawRunCB) error { idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent()) err := executeQuery(fq, d.data.aid, d.ns, false, idx, head, cb) if d.data.maybeAutoIndex(err) { idx, head = d.data.getQuerySnaps(!fq.EventuallyConsistent()) err = executeQuery(fq, d.data.aid, d.ns, false, idx, head, cb) } return err }
func (d rdsImpl) fixQuery(fq *ds.FinalizedQuery) (*datastore.Query, error) { ret := datastore.NewQuery(fq.Kind()) start, end := fq.Bounds() if start != nil { ret = ret.Start(start.(datastore.Cursor)) } if end != nil { ret = ret.End(end.(datastore.Cursor)) } for prop, vals := range fq.EqFilters() { if prop == "__ancestor__" { p, err := dsF2RProp(d.aeCtx, vals[0]) if err != nil { return nil, err } ret = ret.Ancestor(p.Value.(*datastore.Key)) } else { filt := prop + "=" for _, v := range vals { p, err := dsF2RProp(d.aeCtx, v) if err != nil { return nil, err } ret = ret.Filter(filt, p.Value) } } } if lnam, lop, lprop := fq.IneqFilterLow(); lnam != "" { p, err := dsF2RProp(d.aeCtx, lprop) if err != nil { return nil, err } ret = ret.Filter(lnam+" "+lop, p.Value) } if hnam, hop, hprop := fq.IneqFilterHigh(); hnam != "" { p, err := dsF2RProp(d.aeCtx, hprop) if err != nil { return nil, err } ret = ret.Filter(hnam+" "+hop, p.Value) } if fq.EventuallyConsistent() { ret = ret.EventualConsistency() } if fq.KeysOnly() { ret = ret.KeysOnly() } if lim, ok := fq.Limit(); ok { ret = ret.Limit(int(lim)) } if off, ok := fq.Offset(); ok { ret = ret.Offset(int(off)) } for _, o := range fq.Orders() { ret = ret.Order(o.String()) } ret = ret.Project(fq.Project()...) if fq.Distinct() { ret = ret.Distinct() } return ret, nil }