2020-11-03 03:45:48 +00:00
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "query/Parser.h"
|
2020-11-05 06:30:52 +00:00
|
|
|
#include "query/Expr.h"
|
|
|
|
#include "query/PlanNode.h"
|
|
|
|
#include "query/generated/ExprVisitor.h"
|
|
|
|
#include "query/generated/PlanNodeVisitor.h"
|
2020-11-06 07:34:39 +00:00
|
|
|
#include "test_utils/DataGen.h"
|
|
|
|
#include "query/generated/ShowPlanNodeVisitor.h"
|
2020-11-16 02:55:49 +00:00
|
|
|
#include "query/generated/ExecPlanNodeVisitor.h"
|
|
|
|
#include "query/PlanImpl.h"
|
2020-11-03 03:45:48 +00:00
|
|
|
|
|
|
|
TEST(Query, Naive) {
|
|
|
|
SUCCEED();
|
|
|
|
using namespace milvus::wtf;
|
|
|
|
std::string dsl_string = R"(
|
|
|
|
{
|
|
|
|
"bool": {
|
|
|
|
"must": [
|
|
|
|
{
|
|
|
|
"term": {
|
|
|
|
"A": [
|
|
|
|
1,
|
|
|
|
2,
|
|
|
|
5
|
|
|
|
]
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"range": {
|
|
|
|
"B": {
|
|
|
|
"GT": 1,
|
|
|
|
"LT": 100
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"vector": {
|
|
|
|
"Vec": {
|
|
|
|
"metric_type": "L2",
|
|
|
|
"params": {
|
|
|
|
"nprobe": 10
|
|
|
|
},
|
|
|
|
"query": "$0",
|
|
|
|
"topk": 10
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
})";
|
2020-11-06 07:34:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Query, ShowExecutor) {
|
|
|
|
using namespace milvus::query;
|
|
|
|
using namespace milvus::segcore;
|
|
|
|
auto node = std::make_unique<FloatVectorANNS>();
|
|
|
|
auto schema = std::make_shared<Schema>();
|
|
|
|
int64_t num_queries = 100L;
|
|
|
|
schema->AddField("fakevec", DataType::VECTOR_FLOAT, 16);
|
|
|
|
auto raw_data = DataGen(schema, num_queries);
|
2020-11-10 05:17:31 +00:00
|
|
|
auto& info = node->query_info_;
|
|
|
|
info.metric_type_ = "L2";
|
|
|
|
info.topK_ = 20;
|
|
|
|
info.field_id_ = "fakevec";
|
2020-11-06 07:34:39 +00:00
|
|
|
node->predicate_ = std::nullopt;
|
|
|
|
ShowPlanNodeVisitor show_visitor;
|
|
|
|
PlanNodePtr base(node.release());
|
|
|
|
auto res = show_visitor.call_child(*base);
|
2020-11-10 05:17:31 +00:00
|
|
|
auto dup = res;
|
|
|
|
std::cout << dup.dump(4);
|
2020-11-16 02:55:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Query, DSL) {
|
|
|
|
using namespace milvus::query;
|
|
|
|
using namespace milvus::segcore;
|
|
|
|
ShowPlanNodeVisitor shower;
|
|
|
|
|
|
|
|
std::string dsl_string = R"(
|
|
|
|
{
|
|
|
|
"bool": {
|
|
|
|
"must": [
|
|
|
|
{
|
|
|
|
"vector": {
|
|
|
|
"Vec": {
|
|
|
|
"metric_type": "L2",
|
|
|
|
"params": {
|
|
|
|
"nprobe": 10
|
|
|
|
},
|
|
|
|
"query": "$0",
|
|
|
|
"topk": 10
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
})";
|
|
|
|
auto plan = CreatePlan(dsl_string);
|
|
|
|
auto res = shower.call_child(*plan->plan_node_);
|
|
|
|
std::cout << res.dump(4) << std::endl;
|
|
|
|
|
|
|
|
std::string dsl_string2 = R"(
|
|
|
|
{
|
|
|
|
"bool": {
|
|
|
|
"vector": {
|
|
|
|
"Vec": {
|
|
|
|
"metric_type": "L2",
|
|
|
|
"params": {
|
|
|
|
"nprobe": 10
|
|
|
|
},
|
|
|
|
"query": "$0",
|
|
|
|
"topk": 10
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})";
|
|
|
|
auto plan2 = CreatePlan(dsl_string2);
|
|
|
|
auto res2 = shower.call_child(*plan2->plan_node_);
|
|
|
|
std::cout << res2.dump(4) << std::endl;
|
|
|
|
ASSERT_EQ(res, res2);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Query, ParsePlaceholderGroup) {
|
|
|
|
using namespace milvus::query;
|
|
|
|
using namespace milvus::segcore;
|
|
|
|
namespace ser = milvus::proto::service;
|
|
|
|
int num_queries = 10;
|
|
|
|
int dim = 16;
|
|
|
|
std::default_random_engine e;
|
|
|
|
std::normal_distribution<double> dis(0, 1);
|
|
|
|
ser::PlaceholderGroup raw_group;
|
|
|
|
auto value = raw_group.add_placeholders();
|
|
|
|
value->set_tag("$0");
|
|
|
|
value->set_type(ser::PlaceholderType::VECTOR_FLOAT);
|
|
|
|
for(int i = 0; i < num_queries; ++i) {
|
|
|
|
std::vector<float> vec;
|
|
|
|
for(int d = 0; d < dim; ++d) {
|
|
|
|
vec.push_back(dis(e));
|
|
|
|
}
|
|
|
|
// std::string line((char*)vec.data(), (char*)vec.data() + vec.size() * sizeof(float));
|
|
|
|
value->add_values(vec.data(), vec.size() * sizeof(float));
|
|
|
|
}
|
|
|
|
auto blob = raw_group.SerializeAsString();
|
|
|
|
//ser::PlaceholderGroup new_group;
|
|
|
|
//new_group.ParseFromString()
|
|
|
|
auto fuck = ParsePlaceholderGroup(blob);
|
|
|
|
int x = 1+1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(Query, Exec) {
|
|
|
|
using namespace milvus::query;
|
|
|
|
using namespace milvus::segcore;
|
|
|
|
}
|