added method to list fields in the index
also added a corresponding http handler
This commit is contained in:
parent
7a174d7d05
commit
4ae9eb895c
|
@ -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)
|
||||
}
|
2
index.go
2
index.go
|
@ -35,6 +35,8 @@ type Index interface {
|
|||
|
||||
Search(req *SearchRequest) (*SearchResult, error)
|
||||
|
||||
Fields() ([]string, error)
|
||||
|
||||
Dump()
|
||||
DumpDoc(id string) ([]interface{}, error)
|
||||
DumpFields()
|
||||
|
|
|
@ -26,6 +26,8 @@ type Index interface {
|
|||
|
||||
Document(id string) (*document.Document, error)
|
||||
|
||||
Fields() ([]string, error)
|
||||
|
||||
Dump()
|
||||
DumpDoc(id string) ([]interface{}, error)
|
||||
DumpFields()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue