2023-03-27 00:42:00 +08:00
|
|
|
// Licensed to the LF AI & Data foundation 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 querynodev2
|
|
|
|
|
|
|
|
import (
|
|
|
|
"math"
|
|
|
|
"math/rand"
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
"github.com/golang/protobuf/proto"
|
2023-04-06 19:14:32 +08:00
|
|
|
|
2023-06-09 01:28:37 +08:00
|
|
|
"github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
|
|
|
|
"github.com/milvus-io/milvus-proto/go-api/v2/schemapb"
|
2023-03-27 00:42:00 +08:00
|
|
|
"github.com/milvus-io/milvus/internal/proto/planpb"
|
2023-04-06 19:14:32 +08:00
|
|
|
"github.com/milvus-io/milvus/pkg/common"
|
|
|
|
"github.com/milvus-io/milvus/pkg/util/typeutil"
|
2023-03-27 00:42:00 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
// ---------- unittest util functions ----------
|
|
|
|
// common definitions
|
|
|
|
const (
|
|
|
|
metricTypeKey = common.MetricTypeKey
|
|
|
|
defaultTopK = int64(10)
|
|
|
|
defaultRoundDecimal = int64(6)
|
|
|
|
defaultDim = 128
|
|
|
|
defaultNProb = 10
|
|
|
|
defaultEf = 10
|
|
|
|
defaultMetricType = "L2"
|
|
|
|
defaultNQ = 10
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
// index type
|
|
|
|
IndexFaissIDMap = "FLAT"
|
|
|
|
IndexFaissIVFFlat = "IVF_FLAT"
|
|
|
|
IndexFaissIVFPQ = "IVF_PQ"
|
2023-08-11 14:21:29 +08:00
|
|
|
IndexScaNN = "SCANN"
|
2023-03-27 00:42:00 +08:00
|
|
|
IndexFaissIVFSQ8 = "IVF_SQ8"
|
|
|
|
IndexFaissBinIDMap = "BIN_FLAT"
|
|
|
|
IndexFaissBinIVFFlat = "BIN_IVF_FLAT"
|
|
|
|
|
2023-04-05 08:14:28 +08:00
|
|
|
IndexHNSW = "HNSW"
|
2023-03-27 00:42:00 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
// ---------- unittest util functions ----------
|
|
|
|
// functions of messages and requests
|
2024-01-08 15:34:48 +08:00
|
|
|
func genSearchPlan(dataType schemapb.DataType, fieldID int64, metricType string) *planpb.PlanNode {
|
|
|
|
var vectorType planpb.VectorType
|
|
|
|
switch dataType {
|
|
|
|
case schemapb.DataType_FloatVector:
|
|
|
|
vectorType = planpb.VectorType_FloatVector
|
|
|
|
case schemapb.DataType_Float16Vector:
|
|
|
|
vectorType = planpb.VectorType_Float16Vector
|
|
|
|
case schemapb.DataType_BinaryVector:
|
|
|
|
vectorType = planpb.VectorType_BinaryVector
|
2023-03-27 00:42:00 +08:00
|
|
|
}
|
|
|
|
|
2024-01-08 15:34:48 +08:00
|
|
|
return &planpb.PlanNode{
|
|
|
|
Node: &planpb.PlanNode_VectorAnns{
|
|
|
|
VectorAnns: &planpb.VectorANNS{
|
|
|
|
VectorType: vectorType,
|
|
|
|
FieldId: fieldID,
|
|
|
|
QueryInfo: &planpb.QueryInfo{
|
|
|
|
Topk: defaultTopK,
|
|
|
|
MetricType: metricType,
|
|
|
|
SearchParams: "{\"nprobe\":" + strconv.Itoa(defaultNProb) + "}",
|
|
|
|
RoundDecimal: defaultRoundDecimal,
|
|
|
|
},
|
|
|
|
PlaceholderTag: "$0",
|
|
|
|
},
|
|
|
|
},
|
2023-03-27 00:42:00 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func genPlaceHolderGroup(nq int64) ([]byte, error) {
|
|
|
|
placeholderValue := &commonpb.PlaceholderValue{
|
|
|
|
Tag: "$0",
|
|
|
|
Type: commonpb.PlaceholderType_FloatVector,
|
|
|
|
Values: make([][]byte, 0),
|
|
|
|
}
|
|
|
|
for i := int64(0); i < nq; i++ {
|
2023-09-21 09:45:27 +08:00
|
|
|
vec := make([]float32, defaultDim)
|
2023-03-27 00:42:00 +08:00
|
|
|
for j := 0; j < defaultDim; j++ {
|
|
|
|
vec[j] = rand.Float32()
|
|
|
|
}
|
|
|
|
var rawData []byte
|
|
|
|
for k, ele := range vec {
|
|
|
|
buf := make([]byte, 4)
|
|
|
|
common.Endian.PutUint32(buf, math.Float32bits(ele+float32(k*2)))
|
|
|
|
rawData = append(rawData, buf...)
|
|
|
|
}
|
|
|
|
placeholderValue.Values = append(placeholderValue.Values, rawData)
|
|
|
|
}
|
|
|
|
|
|
|
|
// generate placeholder
|
|
|
|
placeholderGroup := commonpb.PlaceholderGroup{
|
|
|
|
Placeholders: []*commonpb.PlaceholderValue{placeholderValue},
|
|
|
|
}
|
|
|
|
placeGroupByte, err := proto.Marshal(&placeholderGroup)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return placeGroupByte, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func genSimpleRetrievePlanExpr(schema *schemapb.CollectionSchema) ([]byte, error) {
|
|
|
|
pkField, err := typeutil.GetPrimaryFieldSchema(schema)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
planNode := &planpb.PlanNode{
|
|
|
|
Node: &planpb.PlanNode_Predicates{
|
|
|
|
Predicates: &planpb.Expr{
|
|
|
|
Expr: &planpb.Expr_TermExpr{
|
|
|
|
TermExpr: &planpb.TermExpr{
|
|
|
|
ColumnInfo: &planpb.ColumnInfo{
|
|
|
|
FieldId: pkField.FieldID,
|
|
|
|
DataType: pkField.DataType,
|
|
|
|
},
|
|
|
|
Values: []*planpb.GenericValue{
|
|
|
|
{
|
|
|
|
Val: &planpb.GenericValue_Int64Val{
|
|
|
|
Int64Val: 1,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Val: &planpb.GenericValue_Int64Val{
|
|
|
|
Int64Val: 2,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Val: &planpb.GenericValue_Int64Val{
|
|
|
|
Int64Val: 3,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
OutputFieldIds: []int64{pkField.FieldID, 100},
|
|
|
|
}
|
|
|
|
planExpr, err := proto.Marshal(planNode)
|
|
|
|
return planExpr, err
|
|
|
|
}
|