in flex/engines/graph_db/runtime/execute/ops/retrieve/project.cc [500:605]
bool is_check_property_in_range(const common::Expression& expr, int& tag,
std::string& name, std::string& lower,
std::string& upper, common::Value& then_value,
common::Value& else_value) {
if (expr.operators_size() == 1 &&
expr.operators(0).item_case() == common::ExprOpr::kCase) {
auto opr = expr.operators(0).case_();
if (opr.when_then_expressions_size() != 1) {
return false;
}
auto when = opr.when_then_expressions(0).when_expression();
if (when.operators_size() != 7) {
return false;
}
{
if (!when.operators(0).has_var()) {
return false;
}
auto var = when.operators(0).var();
if (!var.has_tag()) {
return false;
}
tag = var.tag().id();
if (!var.has_property()) {
return false;
}
if (!var.property().has_key()) {
return false;
}
name = var.property().key().name();
if (name == "label") {
return false;
}
}
{
auto op = when.operators(1);
if (op.item_case() != common::ExprOpr::kLogical ||
op.logical() != common::GE) {
return false;
}
}
auto lower_param = when.operators(2);
if (lower_param.item_case() != common::ExprOpr::kParam) {
return false;
}
lower = lower_param.param().name();
{
auto op = when.operators(3);
if (op.item_case() != common::ExprOpr::kLogical ||
op.logical() != common::AND) {
return false;
}
}
{
if (!when.operators(4).has_var()) {
return false;
}
auto var = when.operators(4).var();
if (!var.has_tag()) {
return false;
}
if (var.tag().id() != tag) {
return false;
}
if (!var.has_property()) {
return false;
}
if (!var.property().has_key() && name != var.property().key().name()) {
return false;
}
}
auto op = when.operators(5);
if (op.item_case() != common::ExprOpr::kLogical ||
op.logical() != common::LT) {
return false;
}
auto upper_param = when.operators(6);
if (upper_param.item_case() != common::ExprOpr::kParam) {
return false;
}
upper = upper_param.param().name();
auto then = opr.when_then_expressions(0).then_result_expression();
if (then.operators_size() != 1) {
return false;
}
if (!then.operators(0).has_const_()) {
return false;
}
then_value = then.operators(0).const_();
auto else_expr = opr.else_result_expression();
if (else_expr.operators_size() != 1) {
return false;
}
if (!else_expr.operators(0).has_const_()) {
return false;
}
else_value = else_expr.operators(0).const_();
if (then_value.item_case() != else_value.item_case()) {
return false;
}
return true;
}
return false;
}