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)
+            }
+        })
+    }
+}