Chromium Code Reviews| Index: service/datastore/key.go |
| diff --git a/service/datastore/key.go b/service/datastore/key.go |
| index 2071bfb7b2ad01ceed9c42592d5d6ba01fb6b053..7cabd3e3db8c337e01a6a6a8dceb811042bed3b1 100644 |
| --- a/service/datastore/key.go |
| +++ b/service/datastore/key.go |
| @@ -414,20 +414,51 @@ func (k *Key) GQL() string { |
| } |
| // Equal returns true iff the two keys represent identical key values. |
| -func (k *Key) Equal(other *Key) (ret bool) { |
| +func (k *Key) Equal(other *Key) bool { |
| + return k.SameKind(other) && (k.LastTok() == other.LastTok()) |
| +} |
| + |
| +// SameKind asserts that other refers to the same entity as k. This checks the |
| +// full lineage of the key. |
| +func (k *Key) SameKind(other *Key) (ret bool) { |
|
iannucci
2016/06/14 01:46:04
This terminology is misleading. Kind means somethi
dnj (Google)
2016/06/14 04:24:18
Done.
|
| ret = (k.appID == other.appID && |
| k.namespace == other.namespace && |
| len(k.toks) == len(other.toks)) |
| if ret { |
| for i, t := range k.toks { |
| - if ret = t == other.toks[i]; !ret { |
| - return |
| + if i == len(k.toks)-1 { |
| + // Last token: check only Kind. |
| + if ret = (t.Kind == other.toks[i].Kind); !ret { |
| + return |
| + } |
| + } else { |
| + if ret = t == other.toks[i]; !ret { |
| + return |
| + } |
| } |
| } |
| } |
| return |
| } |
| +// Partial returns a partial version of the key. The ID fields of the last token |
| +// will be set to zero/empty. |
| +func (k *Key) Partial() *Key { |
|
iannucci
2016/06/14 01:46:04
RemoveID? WithoutID?
dnj (Google)
2016/06/14 04:24:18
I changed "Incomplete" to "IsIncomplete" (asking q
|
| + if k.Incomplete() { |
| + return k |
| + } |
| + return NewKey(k.appID, k.namespace, k.Kind(), "", 0, k.Parent()) |
| +} |
| + |
| +// WithID returns a key with the same kind as k, but with the specified string |
|
iannucci
2016/06/14 01:46:04
kind here is also confusing for the same reason.
dnj (Google)
2016/06/14 04:24:18
Done.
|
| +// and integer ID values. |
| +func (k *Key) WithID(stringID string, intID int64) *Key { |
| + if k.StringID() == stringID && k.IntID() == intID { |
| + return k |
| + } |
| + return NewKey(k.appID, k.namespace, k.Kind(), stringID, intID, k.Parent()) |
| +} |
| + |
| // Split componentizes the key into pieces (AppID, Namespace and tokens) |
| // |
| // Each token represents one piece of they key's 'path'. |