Skip to content

Commit

Permalink
fix multi
Browse files Browse the repository at this point in the history
  • Loading branch information
acoshift committed Apr 7, 2017
1 parent 1598031 commit 2373487
Showing 1 changed file with 44 additions and 40 deletions.
84 changes: 44 additions & 40 deletions get.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,46 @@ func (client *Client) GetByKey(ctx context.Context, key *datastore.Key, dst inte
return nil
}

func (client *Client) getByKeys(ctx context.Context, keys []*datastore.Key, dst interface{}) error {
var err error
l := len(keys)
p := 1000
if l > p {
rfDst := valueOf(dst)
for i := 0; i < l/p+1; i++ {
m := (i + 1) * p
if m > l {
m = l
}
if i*p == m {
break
}
e := client.GetMulti(ctx, keys[i*p:m], rfDst.Slice(i*p, m).Interface())
if e != nil {
if err == nil {
err = e
} else {
if errs, ok := err.(datastore.MultiError); ok {
err = append(errs, e)
} else {
err = datastore.MultiError{err, e}
}
}
}
}
} else {
err = client.GetMulti(ctx, keys, dst)
}
SetKeys(keys, dst)
if client.Cache != nil {
client.Cache.SetMulti(keys, dst)
}
if err != nil {
return err
}
return nil
}

// GetByKeys retrieves models from datastore by keys
func (client *Client) GetByKeys(ctx context.Context, keys []*datastore.Key, dst interface{}) error {
// prepare slice if dst is pointer to 0 len slice
Expand All @@ -49,7 +89,7 @@ func (client *Client) GetByKeys(ctx context.Context, keys []*datastore.Key, dst
}
l := len(nfKeys)
nfDstRf := reflect.MakeSlice(rf.Type(), l, l)
err := client.GetMulti(ctx, keys, nfDstRf.Interface())
err := client.getByKeys(ctx, keys, nfDstRf.Interface())
for i, k := range nfMap {
rf.Index(k).Set(nfDstRf.Index(i))
}
Expand All @@ -61,43 +101,7 @@ func (client *Client) GetByKeys(ctx context.Context, keys []*datastore.Key, dst
}
}

var err error
l := len(keys)
p := 1000
if l > p {
rfDst := valueOf(dst)
for i := 0; i < l/p+1; i++ {
m := (i + 1) * p
if l-m+1 < p {
m = l
}
if i*p == m {
break
}
e := client.GetMulti(ctx, keys[i*p:m], rfDst.Slice(i*p, m).Interface())
if e != nil {
if err == nil {
err = e
} else {
if errs, ok := err.(datastore.MultiError); ok {
err = append(errs, e)
} else {
err = datastore.MultiError{err, e}
}
}
}
}
} else {
err = client.GetMulti(ctx, keys, dst)
}
SetKeys(keys, dst)
if client.Cache != nil {
client.Cache.SetMulti(keys, dst)
}
if err != nil {
return err
}
return nil
return client.getByKeys(ctx, keys, dst)
}

// GetByModel retrieves model from datastore by key from model
Expand Down Expand Up @@ -151,9 +155,9 @@ func (client *Client) GetByNames(ctx context.Context, kind string, names []strin

// GetByQuery retrieves model from datastore by datastore query
func (client *Client) GetByQuery(ctx context.Context, q *datastore.Query, dst interface{}) error {
_, err := client.GetAll(ctx, q, dst)
keys, err := client.GetAll(ctx, q.KeysOnly(), nil)
if err != nil {
return err
}
return nil
return client.GetByKeys(ctx, keys, dst)
}

0 comments on commit 2373487

Please sign in to comment.