bool tc_fusable()

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;
}