inline std::optional()

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