Skip to content

Commit fa54cda

Browse files
authored
fix: Fix inserting geometry data bug by restful (#44479)
issue: #43427 --------- Signed-off-by: Cai Zhang <cai.zhang@zilliz.com>
1 parent 5b8288a commit fa54cda

File tree

2 files changed

+18
-39
lines changed

2 files changed

+18
-39
lines changed

internal/distributed/proxy/httpserver/utils.go

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package httpserver
1919
import (
2020
"bytes"
2121
"context"
22-
"encoding/base64"
2322
"fmt"
2423
"math"
2524
"reflect"
@@ -31,8 +30,6 @@ import (
3130
"github.com/gin-gonic/gin"
3231
"github.com/spf13/cast"
3332
"github.com/tidwall/gjson"
34-
"github.com/twpayne/go-geom/encoding/wkb"
35-
"github.com/twpayne/go-geom/encoding/wkt"
3633
"go.uber.org/zap"
3734
"google.golang.org/protobuf/proto"
3835

@@ -549,24 +546,7 @@ func checkAndSetData(body []byte, collSchema *schemapb.CollectionSchema) (error,
549546
case schemapb.DataType_JSON:
550547
reallyData[fieldName] = []byte(dataString)
551548
case schemapb.DataType_Geometry:
552-
// treat as string(wkt) data,the string data must be valid
553-
WktString, err := base64.StdEncoding.DecodeString(dataString)
554-
if err != nil {
555-
log.Warn("proxy can not decode datastring with base64", zap.String("WktString:", dataString))
556-
return merr.WrapErrParameterInvalid(schemapb.DataType_name[int32(fieldType)], dataString, err.Error()), reallyDataArray, validDataMap
557-
}
558-
geomT, err := wkt.Unmarshal(string(WktString))
559-
if err != nil {
560-
log.Warn("proxy change wkt to geomtyr failed!!", zap.String("WktString:", dataString))
561-
return merr.WrapErrParameterInvalid(schemapb.DataType_name[int32(fieldType)], dataString, err.Error()), reallyDataArray, validDataMap
562-
}
563-
// translate the wkt bytes to wkb bytes ,store the bytes in LittleEndian which cpp core used as well
564-
dataWkbBytes, err := wkb.Marshal(geomT, wkb.NDR)
565-
if err != nil {
566-
log.Warn("proxy change geomtry to wkb failed!!", zap.String("WktString:", dataString))
567-
return merr.WrapErrParameterInvalid(schemapb.DataType_name[int32(fieldType)], dataString, err.Error()), reallyDataArray, validDataMap
568-
}
569-
reallyData[fieldName] = dataWkbBytes
549+
reallyData[fieldName] = dataString
570550
case schemapb.DataType_Float:
571551
result, err := cast.ToFloat32E(dataString)
572552
if err != nil {
@@ -775,7 +755,7 @@ func anyToColumns(rows []map[string]interface{}, validDataMap map[string][]bool,
775755
case schemapb.DataType_JSON:
776756
data = make([][]byte, 0, rowsLen)
777757
case schemapb.DataType_Geometry:
778-
data = make([][]byte, 0, rowsLen)
758+
data = make([]string, 0, rowsLen)
779759
case schemapb.DataType_FloatVector:
780760
data = make([][]float32, 0, rowsLen)
781761
dim, _ := getDim(field)
@@ -866,7 +846,7 @@ func anyToColumns(rows []map[string]interface{}, validDataMap map[string][]bool,
866846
case schemapb.DataType_JSON:
867847
nameColumns[field.Name] = append(nameColumns[field.Name].([][]byte), candi.v.Interface().([]byte))
868848
case schemapb.DataType_Geometry:
869-
nameColumns[field.Name] = append(nameColumns[field.Name].([][]byte), candi.v.Interface().([]byte))
849+
nameColumns[field.Name] = append(nameColumns[field.Name].([]string), candi.v.Interface().(string))
870850
case schemapb.DataType_FloatVector:
871851
nameColumns[field.Name] = append(nameColumns[field.Name].([][]float32), candi.v.Interface().([]float32))
872852
case schemapb.DataType_BinaryVector:
@@ -1034,9 +1014,9 @@ func anyToColumns(rows []map[string]interface{}, validDataMap map[string][]bool,
10341014
case schemapb.DataType_Geometry:
10351015
colData.Field = &schemapb.FieldData_Scalars{
10361016
Scalars: &schemapb.ScalarField{
1037-
Data: &schemapb.ScalarField_GeometryData{
1038-
GeometryData: &schemapb.GeometryArray{
1039-
Data: column.([][]byte),
1017+
Data: &schemapb.ScalarField_GeometryWktData{
1018+
GeometryWktData: &schemapb.GeometryWktArray{
1019+
Data: column.([]string),
10401020
},
10411021
},
10421022
},
@@ -1310,7 +1290,7 @@ func buildQueryResp(rowsNum int64, needFields []string, fieldDataList []*schemap
13101290
case schemapb.DataType_JSON:
13111291
rowsNum = int64(len(fieldDataList[0].GetScalars().GetJsonData().Data))
13121292
case schemapb.DataType_Geometry:
1313-
rowsNum = int64(len(fieldDataList[0].GetScalars().GetGeometryData().Data))
1293+
rowsNum = int64(len(fieldDataList[0].GetScalars().GetGeometryWktData().Data))
13141294
case schemapb.DataType_BinaryVector:
13151295
rowsNum = int64(len(fieldDataList[0].GetVectors().GetBinaryVector())*8) / fieldDataList[0].GetVectors().GetDim()
13161296
case schemapb.DataType_FloatVector:
@@ -1466,7 +1446,7 @@ func buildQueryResp(rowsNum int64, needFields []string, fieldDataList []*schemap
14661446
row[fieldDataList[j].FieldName] = nil
14671447
continue
14681448
}
1469-
row[fieldDataList[j].FieldName] = fieldDataList[j].GetScalars().GetGeometryData().Data[i]
1449+
row[fieldDataList[j].FieldName] = fieldDataList[j].GetScalars().GetGeometryWktData().Data[i]
14701450
default:
14711451
row[fieldDataList[j].FieldName] = ""
14721452
}

internal/distributed/proxy/httpserver/utils_test.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,9 +1230,9 @@ func compareRow(m1 map[string]interface{}, m2 map[string]interface{}) bool {
12301230
return false
12311231
}
12321232
} else if key == "field-geometry" {
1233-
arr1 := value.([]uint8)
1234-
arr2 := string(m2[key].([]byte))
1235-
if arr2 != (string)(arr1) {
1233+
arr1 := value.(string)
1234+
arr2 := m2[key].(string)
1235+
if arr2 != arr1 {
12361236
return false
12371237
}
12381238
} else if strings.HasPrefix(key, "array-") {
@@ -1600,13 +1600,12 @@ func newFieldData(fieldDatas []*schemapb.FieldData, firstFieldType schemapb.Data
16001600
FieldName: "field-geometry",
16011601
Field: &schemapb.FieldData_Scalars{
16021602
Scalars: &schemapb.ScalarField{
1603-
Data: &schemapb.ScalarField_GeometryData{
1604-
GeometryData: &schemapb.GeometryArray{
1605-
// WKT: POINT (30.123 -10.456)
1606-
Data: [][]byte{
1607-
[]byte(`POINT (30.123 -10.456)`),
1608-
[]byte(`POINT (30.123 -10.456)`),
1609-
[]byte(`POINT (30.123 -10.456)`),
1603+
Data: &schemapb.ScalarField_GeometryWktData{
1604+
GeometryWktData: &schemapb.GeometryWktArray{
1605+
Data: []string{
1606+
`POINT (30.123 -10.456)`,
1607+
`POINT (30.123 -10.456)`,
1608+
`POINT (30.123 -10.456)`,
16101609
// wkb:{0x01, 0x01, 0x00, 0x00, 0x00, 0xD2, 0x4A, 0x4D, 0x6A, 0x8B, 0x3C, 0x5C, 0x0A, 0x0D, 0x1B, 0x4F, 0x4F, 0x9A, 0x3D, 0x4},
16111610
},
16121611
},
@@ -1919,7 +1918,7 @@ func newSearchResult(results []map[string]interface{}) []map[string]interface{}
19191918
result["field-varchar"] = strconv.Itoa(i)
19201919
result["field-string"] = strconv.Itoa(i)
19211920
result["field-json"] = []byte(`{"XXX": 0}`)
1922-
result["field-geometry"] = []byte(`POINT (30.123 -10.456)`)
1921+
result["field-geometry"] = `POINT (30.123 -10.456)`
19231922
result["field-array"] = []bool{true}
19241923
result["array-bool"] = []bool{true}
19251924
result["array-int8"] = []int32{0}

0 commit comments

Comments
 (0)