hugegraph-client-go/api/v1/vertex/vertex.go (259 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this * work for additional information regarding copyright ownership. The ASF * licenses this file to You 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 vertex import ( "context" "encoding/json" "fmt" "github.com/apache/incubator-hugegraph-toolchain/hugegraph-client-go/api" "github.com/apache/incubator-hugegraph-toolchain/hugegraph-client-go/internal/model" "io" "io/ioutil" "net/http" url2 "net/url" "strings" ) type Vertex struct { Create BatchCreate UpdateProperties BatchUpdateProperties DeleteProperties GetByCond GetByID DeleteByID } func New(t api.Transport) *Vertex { return &Vertex{ // Create https://hugegraph.apache.org/docs/clients/restful-api/vertex/#211-create-a-vertex Create: newCreateFunc(t), // BatchCreate https://hugegraph.apache.org/docs/clients/restful-api/vertex/#212-create-multiple-vertices BatchCreate: newBatchCreateFunc(t), // UpdateProperties https://hugegraph.apache.org/docs/clients/restful-api/vertex/#213-update-vertex-properties UpdateProperties: newUpdatePropertiesFunc(t), } } type CreateReq struct { ctx context.Context data model.Vertex[any] } type CreateResp struct { StatusCode int `json:"-"` Header http.Header `json:"-"` Body io.ReadCloser `json:"-"` Data model.Vertex[any] } type BatchCreateReq struct { ctx context.Context vertices []model.Vertex[any] } type BatchCreateResp struct { StatusCode int `json:"-"` Header http.Header `json:"-"` Body io.ReadCloser `json:"-"` IDs []string } type UpdatePropertiesReq struct { ctx context.Context id string action model.Action vertex model.Vertex[any] } type UpdatePropertiesResp struct { StatusCode int `json:"-"` Header http.Header `json:"-"` Body io.ReadCloser `json:"-"` Data model.Vertex[any] } type Create func(o ...func(*CreateReq)) (*CreateResp, error) type BatchCreate func(o ...func(*BatchCreateReq)) (*BatchCreateResp, error) type UpdateProperties func(o ...func(*UpdatePropertiesReq)) (*UpdatePropertiesResp, error) type BatchUpdateProperties func(o ...func(*CreateReq)) (*CreateResp, error) type DeleteProperties func(o ...func(*CreateReq)) (*CreateResp, error) type GetByCond func(o ...func(*CreateReq)) (*CreateResp, error) type GetByID func(o ...func(*CreateReq)) (*CreateResp, error) type DeleteByID func(o ...func(*CreateReq)) (*CreateResp, error) func newCreateFunc(t api.Transport) Create { return func(o ...func(*CreateReq)) (*CreateResp, error) { var r = CreateReq{} for _, f := range o { f(&r) } return r.Do(r.ctx, t) } } func newBatchCreateFunc(t api.Transport) BatchCreate { return func(o ...func(*BatchCreateReq)) (*BatchCreateResp, error) { var r = BatchCreateReq{} for _, f := range o { f(&r) } return r.Do(r.ctx, t) } } func newUpdatePropertiesFunc(t api.Transport) UpdateProperties { return func(o ...func(*UpdatePropertiesReq)) (*UpdatePropertiesResp, error) { var r = UpdatePropertiesReq{} for _, f := range o { f(&r) } return r.Do(r.ctx, t) } } func (c Create) WithContext(ctx context.Context) func(*CreateReq) { return func(req *CreateReq) { req.ctx = ctx } } func (c BatchCreate) WithContext(ctx context.Context) func(req *BatchCreateReq) { return func(req *BatchCreateReq) { req.ctx = ctx } } func (c UpdateProperties) WithContext(ctx context.Context) func(req *UpdatePropertiesReq) { return func(req *UpdatePropertiesReq) { req.ctx = ctx } } func (c Create) WithVertex(vertex model.Vertex[any]) func(*CreateReq) { return func(req *CreateReq) { req.data = vertex } } func (c BatchCreate) WithVertices(vertices []model.Vertex[any]) func(*BatchCreateReq) { return func(req *BatchCreateReq) { req.vertices = vertices } } func (c UpdateProperties) WithVertex(vertex model.Vertex[any]) func(*UpdatePropertiesReq) { return func(req *UpdatePropertiesReq) { req.vertex = vertex } } func (c UpdateProperties) WithID(ID string) func(*UpdatePropertiesReq) { return func(req *UpdatePropertiesReq) { req.id = ID } } func (c UpdateProperties) WithAction(action model.Action) func(*UpdatePropertiesReq) { return func(req *UpdatePropertiesReq) { req.action = action } } func (c CreateReq) Do(ctx context.Context, transport api.Transport) (*CreateResp, error) { config := transport.GetConfig() url := "" if len(config.GraphSpace) > 0 { url = fmt.Sprintf("/graphspaces/%s/graphs/%s/graph/vertices", config.GraphSpace, config.Graph) } else { url = fmt.Sprintf("/graphs/%s/graph/vertices", config.Graph) } jsonData, err := json.Marshal(c.data) if err != nil { return nil, err } reader := strings.NewReader(string(jsonData)) req, err := api.NewRequest("POST", url, nil, reader) if err != nil { return nil, err } if ctx != nil { req = req.WithContext(ctx) } res, err := transport.Perform(req) if err != nil { return nil, err } vertexCreateRespData := model.Vertex[any]{} bytes, err := ioutil.ReadAll(res.Body) if err != nil { return nil, err } err = json.Unmarshal(bytes, &vertexCreateRespData) if err != nil { return nil, err } resp := &CreateResp{} resp.StatusCode = res.StatusCode resp.Header = res.Header resp.Body = res.Body resp.Data = vertexCreateRespData return resp, nil } func (c BatchCreateReq) Do(ctx context.Context, transport api.Transport) (*BatchCreateResp, error) { config := transport.GetConfig() url := "" if len(config.GraphSpace) > 0 { url = fmt.Sprintf("/graphspaces/%s/graphs/%s/graph/vertices/batch", config.GraphSpace, config.Graph) } else { url = fmt.Sprintf("/graphs/%s/graph/vertices/batch", config.Graph) } jsonData, err := json.Marshal(c.vertices) if err != nil { return nil, err } reader := strings.NewReader(string(jsonData)) req, err := api.NewRequest("POST", url, nil, reader) if err != nil { return nil, err } if ctx != nil { req = req.WithContext(ctx) } res, err := transport.Perform(req) if err != nil { return nil, err } vertexCreateRespData := make([]string, 0) bytes, err := ioutil.ReadAll(res.Body) if err != nil { return nil, err } err = json.Unmarshal(bytes, &vertexCreateRespData) if err != nil { return nil, err } resp := &BatchCreateResp{} resp.StatusCode = res.StatusCode resp.Header = res.Header resp.Body = res.Body resp.IDs = vertexCreateRespData return resp, nil } func (c UpdatePropertiesReq) Do(ctx context.Context, transport api.Transport) (*UpdatePropertiesResp, error) { config := transport.GetConfig() url := "" if len(config.GraphSpace) > 0 { url = fmt.Sprintf("/graphspaces/%s/graphs/%s/graph/vertices/\"%s\"", config.GraphSpace, config.Graph, c.id) } else { url = fmt.Sprintf("/graphs/%s/graph/vertices/\"%s\"", config.Graph, c.id) } params := &url2.Values{} params.Add("action", string(c.action)) jsonData, err := json.Marshal(c.vertex) if err != nil { return nil, err } reader := strings.NewReader(string(jsonData)) req, err := api.NewRequest("PUT", url, params, reader) if err != nil { return nil, err } if ctx != nil { req = req.WithContext(ctx) } res, err := transport.Perform(req) if err != nil { return nil, err } respData := model.Vertex[any]{} bytes, err := ioutil.ReadAll(res.Body) if err != nil { return nil, err } err = json.Unmarshal(bytes, &respData) if err != nil { return nil, err } resp := &UpdatePropertiesResp{} resp.StatusCode = res.StatusCode resp.Header = res.Header resp.Body = res.Body resp.Data = respData return resp, nil }