diff --git a/api.go b/api.go index 7a1a6576a..8fe028675 100644 --- a/api.go +++ b/api.go @@ -482,9 +482,9 @@ func (api *API) ClusterMessage(ctx context.Context, reqBody io.Reader) error { } // Schema returns information about each index in Pilosa including which fields -// and views they contain. -func (api *API) Schema(ctx context.Context) []*Index { - return api.holder.Indexes() +// they contain. +func (api *API) Schema(ctx context.Context) []*IndexInfo { + return api.holder.limitedSchema() } // Views returns the views in the given field. diff --git a/field.go b/field.go index e1eed501d..4cf1861df 100644 --- a/field.go +++ b/field.go @@ -1094,9 +1094,9 @@ func (f *Field) ImportValue(columnIDs []uint64, values []int64) error { func (f *Field) MarshalJSON() ([]byte, error) { thing := struct { - Name string - Options FieldOptions - Views []*ViewInfo + Name string `json:"name"` + Options FieldOptions `json:"options"` + Views []*ViewInfo `json:"views"` }{ Name: f.Name(), Options: f.Options(), @@ -1134,7 +1134,7 @@ type FieldOptions struct { Min int64 `json:"min,omitempty"` Max int64 `json:"max,omitempty"` TimeQuantum TimeQuantum `json:"timeQuantum,omitempty"` - Keys bool `json:"keys,omitempty"` + Keys bool `json:"keys"` } // applyDefaultOptions returns a new FieldOptions object @@ -1177,28 +1177,34 @@ func (o *FieldOptions) MarshalJSON() ([]byte, error) { Type string `json:"type"` CacheType string `json:"cacheType"` CacheSize uint32 `json:"cacheSize"` + Keys bool `json:"keys"` }{ o.Type, o.CacheType, o.CacheSize, + o.Keys, }) case FieldTypeInt: return json.Marshal(struct { Type string `json:"type"` Min int64 `json:"min"` Max int64 `json:"max"` + Keys bool `json:"keys"` }{ o.Type, o.Min, o.Max, + o.Keys, }) case FieldTypeTime: return json.Marshal(struct { Type string `json:"type"` TimeQuantum TimeQuantum `json:"timeQuantum"` + Keys bool `json:"keys"` }{ o.Type, o.TimeQuantum, + o.Keys, }) } return nil, errors.New("invalid field type") diff --git a/holder.go b/holder.go index 2481f4768..192c83a46 100644 --- a/holder.go +++ b/holder.go @@ -228,6 +228,22 @@ func (h *Holder) Schema() []*IndexInfo { return a } +// limitedSchema returns schema information for all indexes and fields. +func (h *Holder) limitedSchema() []*IndexInfo { + var a []*IndexInfo + for _, index := range h.Indexes() { + di := &IndexInfo{Name: index.Name()} + for _, field := range index.Fields() { + fi := &FieldInfo{Name: field.Name(), Options: field.Options()} + di.Fields = append(di.Fields, fi) + } + sort.Sort(fieldInfoSlice(di.Fields)) + a = append(a, di) + } + sort.Sort(indexInfoSlice(a)) + return a +} + // applySchema applies an internal Schema to Holder. func (h *Holder) applySchema(schema *Schema) error { // Create indexes that don't exist. diff --git a/http/handler.go b/http/handler.go index 7786eb2f3..6dce53bc2 100644 --- a/http/handler.go +++ b/http/handler.go @@ -463,7 +463,7 @@ func (h *Handler) handleGetIndex(w http.ResponseWriter, r *http.Request) { } indexName := mux.Vars(r)["index"] for _, idx := range h.API.Schema(r.Context()) { - if idx.Name() == indexName { + if idx.Name == indexName { if err := json.NewEncoder(w).Encode(idx); err != nil { h.Logger.Printf("write response error: %s", err) } diff --git a/index.go b/index.go index 9d27f4174..0f6d222be 100644 --- a/index.go +++ b/index.go @@ -83,11 +83,13 @@ func (i *Index) MarshalJSON() ([]byte, error) { fields = append(fields, f) } thing := struct { - Name string - Fields []*Field + Name string `json:"name"` + Options IndexOptions `json:"options"` + Fields []*Field `json:"fields"` }{ - Name: i.name, - Fields: fields, + Name: i.name, + Options: i.Options(), + Fields: fields, } return json.Marshal(thing) } @@ -422,8 +424,9 @@ func (p indexSlice) Less(i, j int) bool { return p[i].Name() < p[j].Name() } // IndexInfo represents schema information for an index. type IndexInfo struct { - Name string `json:"name"` - Fields []*FieldInfo `json:"fields"` + Name string `json:"name"` + Options IndexOptions `json:"options"` + Fields []*FieldInfo `json:"fields"` } type indexInfoSlice []*IndexInfo