diff --git a/src/query/plan/rule_based_planner.cpp b/src/query/plan/rule_based_planner.cpp index d1eb05a90..04e15b678 100644 --- a/src/query/plan/rule_based_planner.cpp +++ b/src/query/plan/rule_based_planner.cpp @@ -914,6 +914,11 @@ std::unique_ptr RuleBasedPlanner::Plan( input_op = new plan::Unwind(std::shared_ptr(input_op), unwind->named_expression_->expression_, symbol); + } else if (auto *create_index = + dynamic_cast(clause)) { + debug_assert(!input_op, "Unexpected operator before CreateIndex"); + input_op = new plan::CreateIndex(create_index->label_, + create_index->property_); } else { throw utils::NotYetImplemented( "Encountered a clause which cannot be converted to operator(s)"); diff --git a/tests/unit/query_common.hpp b/tests/unit/query_common.hpp index c63672340..cd59a0ed8 100644 --- a/tests/unit/query_common.hpp +++ b/tests/unit/query_common.hpp @@ -455,6 +455,8 @@ auto GetMerge(AstTreeStorage &storage, Pattern *pattern, OnMatch on_match, query::test_common::OnCreate { \ std::vector { __VA_ARGS__ } \ } +#define CREATE_INDEX_ON(label, property) \ + storage.Create((label), (property)) #define QUERY(...) query::test_common::GetQuery(storage, __VA_ARGS__) // Various operators #define ADD(expr1, expr2) \ diff --git a/tests/unit/query_planner.cpp b/tests/unit/query_planner.cpp index ade86b657..19192d07e 100644 --- a/tests/unit/query_planner.cpp +++ b/tests/unit/query_planner.cpp @@ -208,6 +208,21 @@ class ExpectOptional : public OpChecker { const std::list &optional_; }; +class ExpectCreateIndex : public OpChecker { + public: + ExpectCreateIndex(GraphDbTypes::Label label, GraphDbTypes::Property property) + : label_(label), property_(property) {} + + void ExpectOp(CreateIndex &create_index, const SymbolTable &) override { + EXPECT_EQ(create_index.label(), label_); + EXPECT_EQ(create_index.property(), property_); + } + + private: + GraphDbTypes::Label label_; + GraphDbTypes::Property property_; +}; + auto MakeSymbolTable(query::Query &query) { SymbolTable symbol_table; SymbolGenerator symbol_generator(symbol_table); @@ -910,4 +925,15 @@ TEST(TestLogicalPlanner, ListSliceAggregationReturn) { CheckPlan(storage, aggr, ExpectProduce()); } +TEST(TestLogicalPlanner, CreateIndex) { + // Test CREATE INDEX ON :label(property) + Dbms dbms; + auto dba = dbms.active(); + auto label = dba->label("label"); + auto property = dba->property("property"); + AstTreeStorage storage; + QUERY(CREATE_INDEX_ON(label, property)); + CheckPlan(storage, ExpectCreateIndex(label, property)); +} + } // namespace