mirror of https://github.com/milvus-io/milvus.git
139 lines
3.6 KiB
Go
139 lines
3.6 KiB
Go
|
package reader
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/binary"
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
"github.com/zilliztech/milvus-distributed/internal/conf"
|
||
|
"github.com/zilliztech/milvus-distributed/internal/msgclient"
|
||
|
msgPb "github.com/zilliztech/milvus-distributed/internal/proto/message"
|
||
|
"math"
|
||
|
"strconv"
|
||
|
"sync"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
// NOTE: start pulsar before test
|
||
|
func TestSearch_Search(t *testing.T) {
|
||
|
conf.LoadConfig("config.yaml")
|
||
|
|
||
|
ctx, _ := context.WithCancel(context.Background())
|
||
|
|
||
|
mc := msgclient.ReaderMessageClient{}
|
||
|
|
||
|
pulsarAddr := "pulsar://"
|
||
|
pulsarAddr += conf.Config.Pulsar.Address
|
||
|
pulsarAddr += ":"
|
||
|
pulsarAddr += strconv.FormatInt(int64(conf.Config.Pulsar.Port), 10)
|
||
|
|
||
|
mc.InitClient(ctx, pulsarAddr)
|
||
|
mc.ReceiveMessage()
|
||
|
|
||
|
node := CreateQueryNode(ctx, 0, 0, &mc)
|
||
|
|
||
|
var collection = node.NewCollection(0, "collection0", "")
|
||
|
_ = collection.NewPartition("partition0")
|
||
|
|
||
|
const msgLength = 10
|
||
|
const DIM = 16
|
||
|
const N = 3
|
||
|
|
||
|
var vec = [DIM]float32{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
|
||
|
var rawData []byte
|
||
|
for _, ele := range vec {
|
||
|
buf := make([]byte, 4)
|
||
|
binary.LittleEndian.PutUint32(buf, math.Float32bits(ele))
|
||
|
rawData = append(rawData, buf...)
|
||
|
}
|
||
|
bs := make([]byte, 4)
|
||
|
binary.LittleEndian.PutUint32(bs, 1)
|
||
|
rawData = append(rawData, bs...)
|
||
|
var records [][]byte
|
||
|
for i := 0; i < N; i++ {
|
||
|
records = append(records, rawData)
|
||
|
}
|
||
|
|
||
|
insertDeleteMessages := make([]*msgPb.InsertOrDeleteMsg, 0)
|
||
|
|
||
|
for i := 0; i < msgLength; i++ {
|
||
|
msg := msgPb.InsertOrDeleteMsg{
|
||
|
CollectionName: "collection0",
|
||
|
RowsData: &msgPb.RowData{
|
||
|
Blob: rawData,
|
||
|
},
|
||
|
Uid: int64(i),
|
||
|
PartitionTag: "partition0",
|
||
|
Timestamp: uint64(i + 1000),
|
||
|
SegmentId: int64(i),
|
||
|
ChannelId: 0,
|
||
|
Op: msgPb.OpType_INSERT,
|
||
|
ClientId: 0,
|
||
|
ExtraParams: nil,
|
||
|
}
|
||
|
insertDeleteMessages = append(insertDeleteMessages, &msg)
|
||
|
}
|
||
|
|
||
|
timeRange := TimeRange{
|
||
|
timestampMin: 0,
|
||
|
timestampMax: math.MaxUint64,
|
||
|
}
|
||
|
|
||
|
node.QueryNodeDataInit()
|
||
|
|
||
|
assert.NotNil(t, node.deletePreprocessData)
|
||
|
assert.NotNil(t, node.insertData)
|
||
|
assert.NotNil(t, node.deleteData)
|
||
|
|
||
|
node.MessagesPreprocess(insertDeleteMessages, timeRange)
|
||
|
|
||
|
assert.Equal(t, len(node.insertData.insertIDs), msgLength)
|
||
|
assert.Equal(t, len(node.insertData.insertTimestamps), msgLength)
|
||
|
assert.Equal(t, len(node.insertData.insertRecords), msgLength)
|
||
|
assert.Equal(t, len(node.insertData.insertOffset), 0)
|
||
|
|
||
|
assert.Equal(t, len(node.buffer.InsertDeleteBuffer), 0)
|
||
|
assert.Equal(t, len(node.buffer.validInsertDeleteBuffer), 0)
|
||
|
|
||
|
assert.Equal(t, len(node.SegmentsMap), 10)
|
||
|
assert.Equal(t, len(node.Collections[0].Partitions[0].Segments), 10)
|
||
|
|
||
|
node.PreInsertAndDelete()
|
||
|
|
||
|
assert.Equal(t, len(node.insertData.insertOffset), msgLength)
|
||
|
|
||
|
wg := sync.WaitGroup{}
|
||
|
for segmentID := range node.insertData.insertRecords {
|
||
|
wg.Add(1)
|
||
|
go node.DoInsert(segmentID, &wg)
|
||
|
}
|
||
|
wg.Wait()
|
||
|
|
||
|
var queryRawData = make([]float32, 0)
|
||
|
for i := 0; i < DIM; i++ {
|
||
|
queryRawData = append(queryRawData, float32(i))
|
||
|
}
|
||
|
|
||
|
var queryJson = "{\"field_name\":\"fakevec\",\"num_queries\":1,\"topK\":10}"
|
||
|
searchMsg1 := msgPb.SearchMsg{
|
||
|
CollectionName: "collection0",
|
||
|
Records: &msgPb.VectorRowRecord{
|
||
|
FloatData: queryRawData,
|
||
|
},
|
||
|
PartitionTag: []string{"partition0"},
|
||
|
Uid: int64(0),
|
||
|
Timestamp: uint64(0),
|
||
|
ClientId: int64(0),
|
||
|
ExtraParams: nil,
|
||
|
Json: []string{queryJson},
|
||
|
}
|
||
|
searchMessages := []*msgPb.SearchMsg{&searchMsg1}
|
||
|
|
||
|
node.queryNodeTimeSync.UpdateSearchTimeSync(timeRange)
|
||
|
assert.Equal(t, node.queryNodeTimeSync.ServiceTimeSync, timeRange.timestampMax)
|
||
|
|
||
|
status := node.Search(searchMessages)
|
||
|
assert.Equal(t, status.ErrorCode, msgPb.ErrorCode_SUCCESS)
|
||
|
|
||
|
node.Close()
|
||
|
}
|