You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hugegraph.apache.org by ji...@apache.org on 2026/10/12 02:07:10 UTC
(hugegraph-toolchain) branch master updated: fix(client-go): allow propertyless edge labels (#807)
This is an automated email from the ASF dual-hosted git repository.
imbajin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hugegraph-toolchain.git
The following commit(s) were added to refs/heads/master by this push:
new f49b7991b fix(client-go): allow propertyless edge labels (#807)
f49b7991b is described below
commit f49b7991bff63082809def9d1d49e30a1b59ef78
Author: imbajin <ji...@apache.org>
AuthorDate: Mon Oct 12 10:07:05 2026 +0800
fix(client-go): allow propertyless edge labels (#807)
- accept nil and empty edge label properties
- cover request encoding and required fields
- explain typed API HTTP status checks
---
hugegraph-client-go/README.en.md | 7 ++
hugegraph-client-go/README.md | 7 ++
hugegraph-client-go/api/v1/edgelabel/edgelabel.go | 3 -
.../api/v1/edgelabel/edgelabel_test.go | 78 ++++++++++++++++++++++
4 files changed, 92 insertions(+), 3 deletions(-)
diff --git a/hugegraph-client-go/README.en.md b/hugegraph-client-go/README.en.md
index 4481f382e..19878f307 100644
--- a/hugegraph-client-go/README.en.md
+++ b/hugegraph-client-go/README.en.md
@@ -94,3 +94,10 @@ type VersionResponse struct {
} ` json: 'versions'`
}
```
+
+##### 3. Check request results
+
+Edge label `Properties` may be `nil` or an empty slice to create a propertyless edge type.
+Typed APIs return `err` for request validation, transport, response reading, or JSON decoding errors.
+HTTP 4xx/5xx can still return `err == nil`; for example, creating a vertex with a missing label returns HTTP 400.
+Check `err` first, then `response.StatusCode`; `err == nil` alone does not mean the operation succeeded.
diff --git a/hugegraph-client-go/README.md b/hugegraph-client-go/README.md
index 4fb07a3a0..d1cf54bd6 100644
--- a/hugegraph-client-go/README.md
+++ b/hugegraph-client-go/README.md
@@ -92,3 +92,10 @@ type VersionResponse struct {
} ` json: 'versions'`
}
```
+
+##### 3.检查请求结果
+
+Edge label 的 `Properties` 可以是 `nil` 或空切片,用于创建无属性的边类型。
+类型化 API 返回的 `err` 表示请求校验、传输、读取或 JSON 解码错误。
+HTTP 4xx/5xx 仍可能返回 `err == nil`,例如创建顶点时指定不存在的 label 会返回 HTTP 400。
+请先检查 `err`,再检查 `response.StatusCode`,不能只用 `err == nil` 判断操作成功。
diff --git a/hugegraph-client-go/api/v1/edgelabel/edgelabel.go b/hugegraph-client-go/api/v1/edgelabel/edgelabel.go
index 591cdcbfb..9601a77bf 100644
--- a/hugegraph-client-go/api/v1/edgelabel/edgelabel.go
+++ b/hugegraph-client-go/api/v1/edgelabel/edgelabel.go
@@ -183,9 +183,6 @@ func (r CreateRequest) Do(ctx context.Context, transport api.Transport) (*Create
if len(r.reqData.TargetLabel) <= 0 {
return nil, errors.New("create edgeLabel must set target_label")
}
- if len(r.reqData.Properties) <= 0 {
- return nil, errors.New("create edgeLabel must set properties")
- }
byteBody, err := json.Marshal(&r.reqData)
if err != nil {
diff --git a/hugegraph-client-go/api/v1/edgelabel/edgelabel_test.go b/hugegraph-client-go/api/v1/edgelabel/edgelabel_test.go
index 160d46543..3429e39c2 100644
--- a/hugegraph-client-go/api/v1/edgelabel/edgelabel_test.go
+++ b/hugegraph-client-go/api/v1/edgelabel/edgelabel_test.go
@@ -18,13 +18,18 @@
package edgelabel_test
import (
+ "encoding/json"
"fmt"
"github.com/apache/hugegraph-toolchain/hugegraph-client-go"
"github.com/apache/hugegraph-toolchain/hugegraph-client-go/api/v1/edgelabel"
"github.com/apache/hugegraph-toolchain/hugegraph-client-go/api/v1/propertykey"
"github.com/apache/hugegraph-toolchain/hugegraph-client-go/api/v1/vertexlabel"
"github.com/apache/hugegraph-toolchain/hugegraph-client-go/internal/model"
+ "github.com/apache/hugegraph-toolchain/hugegraph-client-go/hgtransport"
"math/rand"
+ "net/http"
+ "net/http/httptest"
+ "net/url"
"testing"
"time"
)
@@ -185,3 +190,76 @@ func deletePk(client *hugegraph.CommonClient, name string, t *testing.T) {
t.Errorf("delete propertyKey failed")
}
}
+
+func TestCreatePropertylessEdgeLabel(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ properties []string
+ status int
+ }{
+ {"nil", nil, http.StatusCreated},
+ {"empty", []string{}, http.StatusCreated},
+ {"http_error", []string{}, http.StatusBadRequest},
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if r.Method != http.MethodPost || r.URL.Path != "/graphs/hugegraph/schema/edgelabels" {
+ t.Errorf("unexpected request: %s %s", r.Method, r.URL.Path)
+ }
+ var data edgelabel.CreateRequestData
+ if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
+ t.Errorf("decode request: %v", err)
+ }
+ if data.Name != "link" || data.SourceLabel != "node" || data.TargetLabel != "node" ||
+ len(data.Properties) != 0 || (data.Properties == nil) != (tc.properties == nil) {
+ t.Errorf("unexpected request data: %+v", data)
+ }
+ w.WriteHeader(tc.status)
+ if tc.status == http.StatusBadRequest {
+ fmt.Fprint(w, `{"exception":"IllegalArgumentException","message":"invalid label"}`)
+ return
+ }
+ json.NewEncoder(w).Encode(data)
+ }))
+ defer server.Close()
+ address, err := url.Parse(server.URL)
+ if err != nil {
+ t.Fatal(err)
+ }
+ labels := edgelabel.New(hgtransport.New(hgtransport.Config{URL: address, Graph: "hugegraph"}))
+ response, err := labels.Create(labels.Create.WithReqData(edgelabel.CreateRequestData{
+ Name: "link", SourceLabel: "node", TargetLabel: "node", Properties: tc.properties,
+ Frequency: model.FrequencySingle,
+ }))
+ if err != nil || response == nil {
+ t.Fatalf("create response = %v, error = %v", response, err)
+ }
+ defer response.Body.Close()
+ if response.StatusCode != tc.status || len(response.Data.Properties) != 0 ||
+ (tc.status == http.StatusCreated && response.Data.Name != "link") {
+ t.Fatalf("unexpected response: %+v", response)
+ }
+ })
+ }
+}
+
+func TestCreateEdgeLabelRequiredFields(t *testing.T) {
+ labels := edgelabel.New(nil)
+ for _, field := range []string{"name", "source_label", "target_label"} {
+ t.Run(field, func(t *testing.T) {
+ data := edgelabel.CreateRequestData{Name: "link", SourceLabel: "node", TargetLabel: "node"}
+ switch field {
+ case "name":
+ data.Name = ""
+ case "source_label":
+ data.SourceLabel = ""
+ case "target_label":
+ data.TargetLabel = ""
+ }
+ response, err := labels.Create(labels.Create.WithReqData(data))
+ if response != nil || err == nil || err.Error() != "create edgeLabel must set "+field {
+ t.Fatalf("create response = %v, error = %v", response, err)
+ }
+ })
+ }
+}