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

Unified Diff: service/datastore/index.go

Issue 1574353004: GitHub #8: Seed indexes from index.yml (Closed) Base URL: https://github.com/luci/gae@master
Patch Set: Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: service/datastore/index.go
diff --git a/service/datastore/index.go b/service/datastore/index.go
index fe0ca4fd4fd67d7007ecd705a0546bb1a8b88ead..a100b57171a5b3c669833760b330a4c83f400b90 100644
--- a/service/datastore/index.go
+++ b/service/datastore/index.go
@@ -8,6 +8,8 @@ import (
"bytes"
"fmt"
"strings"
+
+ "gopkg.in/yaml.v2"
)
// IndexColumn represents a sort order for a single entity field.
@@ -49,6 +51,38 @@ func (i IndexColumn) cmp(o IndexColumn) int {
return cmpString(i.Property, o.Property)()
}
+// UnmarshalYAML deserializes a index.yml `property` into an IndexColumn.
+func (i *IndexColumn) UnmarshalYAML(unmarshal func(interface{}) error) error {
iannucci 2016/01/13 19:12:20 I would consider making the Property and Descendin
nishanths (utexas) 2016/01/14 21:12:56 Good idea. Will create a separate issue for these
+ var m map[string]string
+
+ if err := unmarshal(&m); err != nil {
+ return err
+ }
+
+ i.Property = m["name"]
iannucci 2016/01/13 19:12:20 should return an error if there's somehow no name
nishanths (utexas) 2016/01/14 21:12:56 Done.
+ i.Descending = false // default direction is "asc"
+
+ if v, ok := m["direction"]; ok && v == "desc" {
+ i.Descending = true
+ }
+
+ return nil
+}
+
+// MarshalYAML serializes an IndexColumn into a index.yml `property`.
+func (i *IndexColumn) MarshalYAML() (interface{}, error) {
+ direction := "asc"
+
+ if i.Descending {
+ direction = "desc"
+ }
+
+ return yaml.Marshal(map[string]string{
+ "name": i.Property,
+ "direction": direction,
+ })
+}
+
// String returns a human-readable version of this IndexColumn which is
// compatible with ParseIndexColumn.
func (i IndexColumn) String() string {
@@ -73,9 +107,22 @@ func (i IndexColumn) GQL() string {
// IndexDefinition holds the parsed definition of a datastore index definition.
type IndexDefinition struct {
- Kind string
- Ancestor bool
- SortBy []IndexColumn
+ Kind string `yaml:"kind"`
+ Ancestor bool `yaml:"ancestor"`
+ SortBy []IndexColumn `yaml:"properties"`
+}
+
+// MarshalYAML serializes an IndexDefinition into a index.yml `index`.
+func (id *IndexDefinition) MarshalYAML() (interface{}, error) {
+ if id.Builtin() || !id.Compound() {
+ return nil, fmt.Errorf("cannot generate YAML for %s", id)
+ }
+
+ return yaml.Marshal(map[string]interface{}{
+ "kind": id.Kind,
+ "ancestor": id.Ancestor,
+ "properties": id.SortBy,
+ })
}
// Equal returns true if the two IndexDefinitions are equivalent.

Powered by Google App Engine
This is Rietveld 408576698