Home | History | Annotate | Download | only in datastore
      1 // Copyright 2016 Google Inc. All rights reserved.
      2 // Use of this source code is governed by the Apache 2.0
      3 // license that can be found in the LICENSE file.
      4 
      5 package datastore
      6 
      7 import "golang.org/x/net/context"
      8 
      9 // Datastore kinds for the metadata entities.
     10 const (
     11 	namespaceKind = "__namespace__"
     12 	kindKind      = "__kind__"
     13 	propertyKind  = "__property__"
     14 )
     15 
     16 // Namespaces returns all the datastore namespaces.
     17 func Namespaces(ctx context.Context) ([]string, error) {
     18 	// TODO(djd): Support range queries.
     19 	q := NewQuery(namespaceKind).KeysOnly()
     20 	keys, err := q.GetAll(ctx, nil)
     21 	if err != nil {
     22 		return nil, err
     23 	}
     24 	// The empty namespace key uses a numeric ID (==1), but luckily
     25 	// the string ID defaults to "" for numeric IDs anyway.
     26 	return keyNames(keys), nil
     27 }
     28 
     29 // Kinds returns the names of all the kinds in the current namespace.
     30 func Kinds(ctx context.Context) ([]string, error) {
     31 	// TODO(djd): Support range queries.
     32 	q := NewQuery(kindKind).KeysOnly()
     33 	keys, err := q.GetAll(ctx, nil)
     34 	if err != nil {
     35 		return nil, err
     36 	}
     37 	return keyNames(keys), nil
     38 }
     39 
     40 // keyNames returns a slice of the provided keys' names (string IDs).
     41 func keyNames(keys []*Key) []string {
     42 	n := make([]string, 0, len(keys))
     43 	for _, k := range keys {
     44 		n = append(n, k.StringID())
     45 	}
     46 	return n
     47 }
     48 
     49 // KindProperties returns all the indexed properties for the given kind.
     50 // The properties are returned as a map of property names to a slice of the
     51 // representation types. The representation types for the supported Go property
     52 // types are:
     53 //   "INT64":     signed integers and time.Time
     54 //   "DOUBLE":    float32 and float64
     55 //   "BOOLEAN":   bool
     56 //   "STRING":    string, []byte and ByteString
     57 //   "POINT":     appengine.GeoPoint
     58 //   "REFERENCE": *Key
     59 //   "USER":      (not used in the Go runtime)
     60 func KindProperties(ctx context.Context, kind string) (map[string][]string, error) {
     61 	// TODO(djd): Support range queries.
     62 	kindKey := NewKey(ctx, kindKind, kind, 0, nil)
     63 	q := NewQuery(propertyKind).Ancestor(kindKey)
     64 
     65 	propMap := map[string][]string{}
     66 	props := []struct {
     67 		Repr []string `datastore:"property_representation"`
     68 	}{}
     69 
     70 	keys, err := q.GetAll(ctx, &props)
     71 	if err != nil {
     72 		return nil, err
     73 	}
     74 	for i, p := range props {
     75 		propMap[keys[i].StringID()] = p.Repr
     76 	}
     77 	return propMap, nil
     78 }
     79