in flex/engines/graph_db/runtime/utils/special_predicates.h [557:800]
inline std::optional<std::function<std::unique_ptr<SPVertexPredicate>(
const GraphReadInterface&, const std::map<std::string, std::string>&)>>
parse_special_vertex_predicate(const common::Expression& expr) {
if (expr.operators_size() == 3) {
const common::ExprOpr& op0 = expr.operators(0);
if (!op0.has_var()) {
return std::nullopt;
}
if (!op0.var().has_property()) {
return std::nullopt;
}
if (!op0.var().property().has_key()) {
return std::nullopt;
}
if (!(op0.var().property().key().item_case() ==
common::NameOrId::ItemCase::kName)) {
return std::nullopt;
}
std::string property_name = op0.var().property().key().name();
const common::ExprOpr& op1 = expr.operators(1);
if (!(op1.item_case() == common::ExprOpr::kLogical)) {
return std::nullopt;
}
SPPredicateType ptype;
if (op1.logical() == common::Logical::LT) {
ptype = SPPredicateType::kPropertyLT;
} else if (op1.logical() == common::Logical::GT) {
ptype = SPPredicateType::kPropertyGT;
} else if (op1.logical() == common::Logical::EQ) {
ptype = SPPredicateType::kPropertyEQ;
} else if (op1.logical() == common::Logical::LE) {
ptype = SPPredicateType::kPropertyLE;
} else if (op1.logical() == common::Logical::GE) {
ptype = SPPredicateType::kPropertyGE;
} else if (op1.logical() == common::Logical::NE) {
ptype = SPPredicateType::kPropertyNE;
} else {
return std::nullopt;
}
const common::ExprOpr& op2 = expr.operators(2);
if (!op2.has_param()) {
return std::nullopt;
}
if (!op2.param().has_data_type()) {
return std::nullopt;
}
if (!(op2.param().data_type().type_case() ==
common::IrDataType::TypeCase::kDataType)) {
return std::nullopt;
}
auto name = op2.param().name();
auto type = parse_from_ir_data_type(op2.param().data_type());
if (type == RTAnyType::kI64Value) {
return [ptype, property_name, name](
const GraphReadInterface& graph,
const std::map<std::string, std::string>& params)
-> std::unique_ptr<SPVertexPredicate> {
return _make_vertex_predicate<int64_t>(ptype, graph, property_name,
params.at(name));
};
} else if (type == RTAnyType::kStringValue) {
return [ptype, property_name, name](
const GraphReadInterface& graph,
const std::map<std::string, std::string>& params)
-> std::unique_ptr<SPVertexPredicate> {
return _make_vertex_predicate<std::string_view>(
ptype, graph, property_name, params.at(name));
};
} else if (type == RTAnyType::kTimestamp) {
return [ptype, property_name, name](
const GraphReadInterface& graph,
const std::map<std::string, std::string>& params)
-> std::unique_ptr<SPVertexPredicate> {
return _make_vertex_predicate<Date>(ptype, graph, property_name,
params.at(name));
};
} else if (type == RTAnyType::kI32Value) {
return [ptype, property_name, name](
const GraphReadInterface& graph,
const std::map<std::string, std::string>& params)
-> std::unique_ptr<SPVertexPredicate> {
return _make_vertex_predicate<int32_t>(ptype, graph, property_name,
params.at(name));
};
} else if (type == RTAnyType::kF64Value) {
return [ptype, property_name, name](
const GraphReadInterface& graph,
const std::map<std::string, std::string>& params)
-> std::unique_ptr<SPVertexPredicate> {
return _make_vertex_predicate<double>(ptype, graph, property_name,
params.at(name));
};
}
} else if (expr.operators_size() == 7) {
// between
const common::ExprOpr& op0 = expr.operators(0);
if (!op0.has_var()) {
return std::nullopt;
}
if (!op0.var().has_property()) {
return std::nullopt;
}
if (!op0.var().property().has_key()) {
return std::nullopt;
}
if (!(op0.var().property().key().item_case() ==
common::NameOrId::ItemCase::kName)) {
return std::nullopt;
}
std::string property_name = op0.var().property().key().name();
const common::ExprOpr& op1 = expr.operators(1);
if (!(op1.item_case() == common::ExprOpr::kLogical)) {
return std::nullopt;
}
if (op1.logical() != common::Logical::GE) {
return std::nullopt;
}
const common::ExprOpr& op2 = expr.operators(2);
if (!op2.has_param()) {
return std::nullopt;
}
if (!op2.param().has_data_type()) {
return std::nullopt;
}
if (!(op2.param().data_type().type_case() ==
common::IrDataType::TypeCase::kDataType)) {
return std::nullopt;
}
std::string from_str = op2.param().name();
const common::ExprOpr& op3 = expr.operators(3);
if (!(op3.item_case() == common::ExprOpr::kLogical)) {
return std::nullopt;
}
if (op3.logical() != common::Logical::AND) {
return std::nullopt;
}
const common::ExprOpr& op4 = expr.operators(4);
if (!op4.has_var()) {
return std::nullopt;
}
if (!op4.var().has_property()) {
return std::nullopt;
}
if (!op4.var().property().has_key()) {
return std::nullopt;
}
if (!(op4.var().property().key().item_case() ==
common::NameOrId::ItemCase::kName)) {
return std::nullopt;
}
if (property_name != op4.var().property().key().name()) {
return std::nullopt;
}
const common::ExprOpr& op5 = expr.operators(5);
if (!(op5.item_case() == common::ExprOpr::kLogical)) {
return std::nullopt;
}
if (op5.logical() != common::Logical::LT) {
return std::nullopt;
}
const common::ExprOpr& op6 = expr.operators(6);
if (!op6.has_param()) {
return std::nullopt;
}
if (!op6.param().has_data_type()) {
return std::nullopt;
}
if (!(op6.param().data_type().type_case() ==
common::IrDataType::TypeCase::kDataType)) {
return std::nullopt;
}
std::string to_str = op6.param().name();
auto type = parse_from_ir_data_type(op2.param().data_type());
auto type1 = parse_from_ir_data_type(op6.param().data_type());
if (type != type1) {
return std::nullopt;
}
if (type == RTAnyType::kI64Value) {
return [property_name, from_str, to_str](
const GraphReadInterface& graph,
const std::map<std::string, std::string>& params)
-> std::unique_ptr<SPVertexPredicate> {
return std::make_unique<VertexPropertyBetweenPredicateBeta<int64_t>>(
graph, property_name, params.at(from_str), params.at(to_str));
};
} else if (type == RTAnyType::kTimestamp) {
return [property_name, from_str, to_str](
const GraphReadInterface& graph,
const std::map<std::string, std::string>& params)
-> std::unique_ptr<SPVertexPredicate> {
return std::make_unique<VertexPropertyBetweenPredicateBeta<Date>>(
graph, property_name, params.at(from_str), params.at(to_str));
};
} else if (type == RTAnyType::kI32Value) {
return [property_name, from_str, to_str](
const GraphReadInterface& graph,
const std::map<std::string, std::string>& params)
-> std::unique_ptr<SPVertexPredicate> {
return std::make_unique<VertexPropertyBetweenPredicateBeta<int32_t>>(
graph, property_name, params.at(from_str), params.at(to_str));
};
} else if (type == RTAnyType::kF64Value) {
return [property_name, from_str, to_str](
const GraphReadInterface& graph,
const std::map<std::string, std::string>& params)
-> std::unique_ptr<SPVertexPredicate> {
return std::make_unique<VertexPropertyBetweenPredicateBeta<double>>(
graph, property_name, params.at(from_str), params.at(to_str));
};
} else if (type == RTAnyType::kStringValue) {
return [property_name, from_str, to_str](
const GraphReadInterface& graph,
const std::map<std::string, std::string>& params)
-> std::unique_ptr<SPVertexPredicate> {
return std::make_unique<
VertexPropertyBetweenPredicateBeta<std::string_view>>(
graph, property_name, params.at(from_str), params.at(to_str));
};
} else {
return std::nullopt;
}
}
return std::nullopt;
}