From 505363d8ed6854872fc54a8dde511b16309e0254 Mon Sep 17 00:00:00 2001 From: Linh Vo Date: Tue, 26 Sep 2017 10:57:22 -0500 Subject: [PATCH] get fields --- frame.go | 22 ++++++++++++++++++++-- handler.go | 23 +++++++++++++++++++++++ handler_test.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ index.go | 3 +++ 4 files changed, 94 insertions(+), 2 deletions(-) diff --git a/frame.go b/frame.go index f9580cc6b..88a0686b2 100644 --- a/frame.go +++ b/frame.go @@ -425,7 +425,7 @@ func (f *Frame) CreateField(field *Field) error { defer f.mu.Unlock() // Ensure frame supports fields. - if f.rangeEnabled { + if !f.rangeEnabled { return ErrFrameFieldsNotAllowed } @@ -435,10 +435,28 @@ func (f *Frame) CreateField(field *Field) error { return err } f.schema = schema - + f.saveSchema() return nil } +// GetFields list all the fields. +func (f *Frame) GetFields() (*FrameSchema, error) { + //f.mu.Lock() + //defer f.mu.Unlock() + + // Ensure frame supports fields. + if !f.RangeEnabled() { + return nil, nil + } + err := f.loadSchema() + if err != nil { + return nil, err + } + fmt.Println("HERE") + fmt.Printf("%+v\n", f.schema) + return f.schema, nil +} + // DeleteField deletes an existing field on the schema. func (f *Frame) DeleteField(name string) error { f.mu.Lock() diff --git a/handler.go b/handler.go index fef22dfff..4ddc6d62a 100644 --- a/handler.go +++ b/handler.go @@ -118,6 +118,7 @@ func NewRouter(handler *Handler) *mux.Router { router.HandleFunc("/index/{index}/frame/{frame}/restore", handler.handlePostFrameRestore).Methods("POST") router.HandleFunc("/index/{index}/frame/{frame}/time-quantum", handler.handlePatchFrameTimeQuantum).Methods("PATCH") router.HandleFunc("/index/{index}/frame/{frame}/field/{field}", handler.handlePostFrameField).Methods("POST") + router.HandleFunc("/index/{index}/frame/{frame}/fields", handler.handleGetFrameField).Methods("GET") router.HandleFunc("/index/{index}/frame/{frame}/field/{field}", handler.handleDeleteFrameField).Methods("DELETE") router.HandleFunc("/index/{index}/frame/{frame}/views", handler.handleGetFrameViews).Methods("GET") router.HandleFunc("/index/{index}/frame/{frame}/view/{view}", handler.handleDeleteView).Methods("DELETE") @@ -841,6 +842,28 @@ func (h *Handler) handleDeleteFrameField(w http.ResponseWriter, r *http.Request) } } +func (h *Handler) handleGetFrameField(w http.ResponseWriter, r *http.Request) { + indexName := mux.Vars(r)["index"] + frameName := mux.Vars(r)["frame"] + + index := h.Holder.index(indexName) + frame := index.frame(frameName) + schema, err := frame.GetFields() + fmt.Printf("%+v\n", schema) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + // Encode response. + if err := json.NewEncoder(w).Encode(getFrameFieldsResponse{Fields: schema.Fields}); err != nil { + h.logger().Printf("response encoding error: %s", err) + } +} + +type getFrameFieldsResponse struct { + Fields []*Field `json:"fields,omitempty"` +} + type deleteFrameFieldRequest struct{} type deleteFrameFieldResponse struct{} diff --git a/handler_test.go b/handler_test.go index 8159cf586..8071a43b0 100644 --- a/handler_test.go +++ b/handler_test.go @@ -32,6 +32,7 @@ import ( "github.com/pilosa/pilosa/internal" "github.com/pilosa/pilosa/pql" "github.com/pilosa/pilosa/test" + "fmt" ) func TestHandlerPanics(t *testing.T) { @@ -976,6 +977,7 @@ func TestHandler_Frame_DeleteField(t *testing.T) { t.Run("OK", func(t *testing.T) { idx := hldr.MustCreateIndexIfNotExists("i", pilosa.IndexOptions{}) f, err := idx.CreateFrameIfNotExists("f", pilosa.FrameOptions{RangeEnabled: true}) + fmt.Println(f.RangeEnabled()) if err != nil { t.Fatal(err) } else if err := f.CreateField(&pilosa.Field{Name: "x", Type: pilosa.FieldTypeInt, Min: 0, Max: 100}); err != nil { @@ -1030,6 +1032,52 @@ func TestHandler_Frame_DeleteField(t *testing.T) { }) } +func TestHandler_Frame_GetFields(t *testing.T) { + hldr := test.MustOpenHolder() + defer hldr.Close() + + s := test.NewServer() + s.Handler.Holder = hldr.Holder + defer s.Close() + + + t.Run("OK", func(t *testing.T) { + idx := hldr.MustCreateIndexIfNotExists("i", pilosa.IndexOptions{}) + f, err := idx.CreateFrameIfNotExists("f", pilosa.FrameOptions{RangeEnabled: true}) + fmt.Println(f.RangeEnabled()) + if err != nil { + t.Fatal(err) + } else if err := f.CreateField(&pilosa.Field{Name: "x", Type: pilosa.FieldTypeInt, Min: 1, Max: 100}); err != nil { + t.Fatal(err) + } + fmt.Println(f.RangeEnabled()) + resp, err := http.Get(s.URL+"/index/i/frame/f/fields") + if err != nil { + t.Fatal(err) + } + body, err := ioutil.ReadAll(resp.Body) + fmt.Println(string(body)) + if err != nil { + t.Fatal(err) + } else if resp.StatusCode != http.StatusOK { + t.Fatalf("unexpected status code: %d", resp.StatusCode) + } + + //var fields []pilosa.Field + //if err = json.NewDecoder(resp.Body).Decode(&fields); err != nil { + // t.Fatal(err) + //} + //if fields[0].Name != "x" { + // t.Fatalf("expected field's name: x, actuall name: %v", fields[0].Name) + //} + // + // + //if field := f.Field("x"); field != nil { + // t.Fatalf("expected nil field, got: %#v", field) + //} + + }) +} // Ensure the handler can backup a fragment and then restore it. func TestHandler_Fragment_BackupRestore(t *testing.T) { hldr := test.MustOpenHolder() diff --git a/index.go b/index.go index 345215690..a4f3876e0 100644 --- a/index.go +++ b/index.go @@ -476,6 +476,9 @@ func (i *Index) createFrame(name string, opt FrameOptions) (*Frame, error) { return nil, err } + f.rangeEnabled = opt.RangeEnabled + fmt.Println("CREATE FRAME", opt.RangeEnabled) + // Set schema & save. f.schema = &FrameSchema{ Fields: opt.Fields,