in flex/engines/graph_db/runtime/execute/ops/retrieve/tc_fuse.cc [96:211]
bool tc_fusable(const physical::EdgeExpand& ee_opr0,
const physical::GroupBy& group_by_opr,
const physical::EdgeExpand& ee_opr1,
const physical::GetV& v_opr1,
const physical::EdgeExpand& ee_opr2,
const algebra::Select& select_opr) {
// ee_opr0
if (ee_opr0.is_optional() || (!ee_opr0.has_v_tag()) ||
(!ee_opr0.has_alias())) {
return false;
}
// predicate
if (!ee_opr0.params().has_predicate()) {
return false;
}
auto sp_pred = parse_sp_pred(ee_opr0.params().predicate());
if (sp_pred != SPPredicateType::kPropertyGT &&
sp_pred != SPPredicateType::kPropertyLT) {
return false;
}
auto op2 = ee_opr0.params().predicate().operators(2);
if (op2.item_case() != common::ExprOpr::ItemCase::kParam) {
return false;
}
int start_tag = ee_opr0.v_tag().value();
auto dir0 = ee_opr0.direction();
if (dir0 == physical::EdgeExpand_Direction::EdgeExpand_Direction_BOTH) {
return false;
}
int alias0 = ee_opr0.alias().value();
// group_by_opr
if (group_by_opr.mappings_size() != 1 || group_by_opr.functions_size() != 1) {
return false;
}
auto mapping = group_by_opr.mappings(0);
if ((!mapping.has_key()) || mapping.key().tag().id() != start_tag) {
return false;
}
int alias1 = mapping.alias().value();
auto func = group_by_opr.functions(0);
if (func.aggregate() != physical::GroupBy_AggFunc::TO_SET) {
return false;
}
if (func.vars_size() != 1 || (!func.vars(0).has_tag()) ||
func.vars(0).tag().id() != alias0 || func.vars(0).has_property()) {
return false;
}
int alias2 = func.alias().value();
// ee_opr1 and v_opr1
if (ee_opr1.is_optional() || (!ee_opr1.has_v_tag()) ||
ee_opr1.v_tag().value() != alias1 || ee_opr1.has_alias()) {
return false;
}
if (ee_opr1.direction() ==
physical::EdgeExpand_Direction::EdgeExpand_Direction_BOTH) {
return false;
}
if (ee_opr1.params().has_predicate()) {
return false;
}
// tag -1
if (v_opr1.has_tag() || (!v_opr1.has_alias()) ||
v_opr1.opt() != physical::GetV_VOpt::GetV_VOpt_ITSELF) {
return false;
}
// int alias3 = v_opr1.alias().value();
// ee_opr2, tag -1
if (ee_opr2.is_optional() || (ee_opr2.has_v_tag()) ||
(!ee_opr2.has_alias())) {
return false;
}
if (ee_opr2.direction() ==
physical::EdgeExpand_Direction::EdgeExpand_Direction_BOTH) {
return false;
}
if (ee_opr2.params().has_predicate()) {
return false;
}
int alias4 = ee_opr2.alias().value();
// select_opr
if (select_opr.predicate().operators_size() != 3) {
return false;
}
auto& var = select_opr.predicate().operators(0);
auto& within = select_opr.predicate().operators(1);
auto& v_set = select_opr.predicate().operators(2);
if ((!var.has_var()) || (!var.var().has_tag()) || var.var().has_property()) {
return false;
}
if (var.var().tag().id() != alias4) {
return false;
}
if (within.item_case() != common::ExprOpr::ItemCase::kLogical ||
within.logical() != common::Logical::WITHIN) {
return false;
}
if ((!v_set.has_var()) || (!v_set.var().has_tag()) ||
v_set.var().has_property()) {
return false;
}
int v_set_tag = v_set.var().tag().id();
if (v_set_tag != alias2) {
return false;
}
return true;
}