Skip to content

Commit

Permalink
Merge pull request apache#2673
Browse files Browse the repository at this point in the history
improvement: optimization of readmap function
  • Loading branch information
kenhuuu committed Jul 5, 2024
2 parents 0ea5b14 + dad8c0f commit 5afbd1a
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 3 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ This release also includes changes from <<release-3-6-8, 3.6.8>>.
* Fixed so that TrimGlobalStep and TrimLocalStep have the same character control handling as Ltrim and Rtrim
* Fix a bug in MaxLocalStep, MinLocalStep, MeanLocalStep and SumLocalStep that it throws NoSuchElementException when encounters an empty iterator as input.
==== Improvements
* TINKERPOP-3093 optimization of readmap function
[[release-3-7-2]]
=== TinkerPop 3.7.2 (April 8, 2024)
Expand Down
6 changes: 3 additions & 3 deletions gremlin-go/driver/graphBinary.go
Original file line number Diff line number Diff line change
Expand Up @@ -989,14 +989,14 @@ func readMap(data *[]byte, i *int) (interface{}, error) {
}
if k == nil {
mapData[nil] = v
} else if reflect.TypeOf(k).Comparable() {
mapData[k] = v
} else {
switch reflect.TypeOf(k).Kind() {
case reflect.Map:
mapData[&k] = v
case reflect.Slice:
mapData[fmt.Sprint(k)] = v
default:
mapData[k] = v
mapData[fmt.Sprint(k)] = v
}
}
}
Expand Down
70 changes: 70 additions & 0 deletions gremlin-go/driver/graphBinary_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,76 @@ func TestGraphBinaryV1(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, fmt.Sprintf("%v", source), fmt.Sprintf("%v", res))
})
t.Run("read incomparable map: a map value as the key", func(t *testing.T) {
// prepare test data
var buf = &bytes.Buffer{}
typeSerializer := &graphBinaryTypeSerializer{}
// write the size of map
err := binary.Write(buf, binary.BigEndian, uint32(1))
if err != nil {
t.Fatalf("Failed to write data: %v", err)
}
// write a map value as the key
k1 := map[string]string{"key": "value"}
_, err = typeSerializer.write(reflect.ValueOf(k1).Interface(), buf)
if err != nil {
t.Fatalf("Failed to encode data: %v", err)
}
v1 := "value1"
_, err = typeSerializer.write(reflect.ValueOf(v1).Interface(), buf)
if err != nil {
t.Fatalf("Failed to encode data: %v", err)
}

data := buf.Bytes()
i := 0
result, err := readMap(&data, &i)
if err != nil {
t.Fatalf("readMap failed: %v", err)
}
mResult, ok := result.(map[interface{}]interface{})
if !ok {
t.Fatalf("readMap result not map[interface{}]interface{}")
}
for k, v := range mResult {
assert.Equal(t, reflect.Ptr, reflect.TypeOf(k).Kind())
assert.Equal(t, "value1", v)
}
})
t.Run("read incomparable map: a slice value as the key", func(t *testing.T) {
// prepare test data
var buf = &bytes.Buffer{}
typeSerializer := &graphBinaryTypeSerializer{}
// write the size of map
err := binary.Write(buf, binary.BigEndian, uint32(1))
if err != nil {
t.Fatalf("Failed to write data: %v", err)
}
// write a slice value as the key
k2 := []int{1, 2, 3}
_, err = typeSerializer.write(reflect.ValueOf(k2).Interface(), buf)
if err != nil {
t.Fatalf("Failed to encode data: %v", err)
}
v2 := "value2"
_, err = typeSerializer.write(reflect.ValueOf(v2).Interface(), buf)
if err != nil {
t.Fatalf("Failed to encode data: %v", err)
}

data := buf.Bytes()
i := 0
result, err := readMap(&data, &i)
if err != nil {
t.Fatalf("readMap failed: %v", err)
}
expected := map[interface{}]interface{}{
"[1 2 3]": "value2",
}
if !reflect.DeepEqual(result, expected) {
t.Errorf("Expected %v, but got %v", expected, result)
}
})
t.Run("read-write time", func(t *testing.T) {
pos := 0
var buffer bytes.Buffer
Expand Down

0 comments on commit 5afbd1a

Please sign in to comment.