0
0
Fork 0

added method to list fields in the index

also added a corresponding http handler
This commit is contained in:
Marty Schoch 2014-07-31 11:47:36 -04:00
parent 7a174d7d05
commit 4ae9eb895c
5 changed files with 89 additions and 0 deletions

55
http/fields.go Normal file
View File

@ -0,0 +1,55 @@
// Copyright (c) 2014 Couchbase, Inc.
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software distributed under the
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
// either express or implied. See the License for the specific language governing permissions
// and limitations under the License.
package http
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
type ListFieldsHandler struct {
defaultIndexName string
}
func NewListFieldsHandler(defaultIndexName string) *ListFieldsHandler {
return &ListFieldsHandler{
defaultIndexName: defaultIndexName,
}
}
func (h *ListFieldsHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
// find the index to operate on
indexName := mux.Vars(req)["indexName"]
if indexName == "" {
indexName = h.defaultIndexName
}
index := IndexByName(indexName)
if index == nil {
showError(w, req, fmt.Sprintf("no such index '%s'", indexName), 404)
return
}
fields, err := index.Fields()
if err != nil {
showError(w, req, fmt.Sprintf("error: %v", err), 500)
return
}
fieldsResponse := struct {
Fields []string `json:"fields"`
}{
Fields: fields,
}
// encode the response
mustEncode(w, fieldsResponse)
}

View File

@ -35,6 +35,8 @@ type Index interface {
Search(req *SearchRequest) (*SearchResult, error)
Fields() ([]string, error)
Dump()
DumpDoc(id string) ([]interface{}, error)
DumpFields()

View File

@ -26,6 +26,8 @@ type Index interface {
Document(id string) (*document.Document, error)
Fields() ([]string, error)
Dump()
DumpDoc(id string) ([]interface{}, error)
DumpFields()

View File

@ -486,6 +486,32 @@ func (udc *UpsideDownCouch) Dump() {
}
}
func (udc *UpsideDownCouch) Fields() ([]string, error) {
rv := make([]string, 0)
it := udc.store.Iterator([]byte{'f'})
defer it.Close()
key, val, valid := it.Current()
for valid {
if !bytes.HasPrefix(key, []byte{'f'}) {
break
}
row, err := ParseFromKeyValue(key, val)
if err != nil {
return nil, err
}
if row != nil {
fieldRow, ok := row.(*FieldRow)
if ok {
rv = append(rv, fieldRow.name)
}
}
it.Next()
key, val, valid = it.Current()
}
return rv, nil
}
func (udc *UpsideDownCouch) DumpFields() {
it := udc.store.Iterator([]byte{'f'})
defer it.Close()

View File

@ -164,6 +164,10 @@ func (i *indexImpl) Dump() {
i.i.Dump()
}
func (i *indexImpl) Fields() ([]string, error) {
return i.i.Fields()
}
func (i *indexImpl) DumpFields() {
i.i.DumpFields()
}