Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove update planner #1854

Merged
merged 1 commit into from
Jul 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 43 additions & 10 deletions src/include/planner/query_planner.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,29 @@
#include "join_order_enumerator.h"
#include "planner/join_order/cardinality_estimator.h"
#include "projection_planner.h"
#include "update_planner.h"

namespace kuzu {
namespace binder {
class BoundCreateNode;
class BoundCreateRel;
class BoundSetNodeProperty;
class BoundSetRelProperty;
class BoundDeleteNode;
} // namespace binder

namespace planner {

class QueryPlanner {
friend class JoinOrderEnumerator;
friend class ProjectionPlanner;
friend class UpdatePlanner;

public:
explicit QueryPlanner(const catalog::Catalog& catalog,
const storage::NodesStatisticsAndDeletedIDs& nodesStatistics,
const storage::RelsStatistics& relsStatistics)
: catalog{catalog}, cardinalityEstimator{std::make_unique<CardinalityEstimator>(
nodesStatistics, relsStatistics)},
joinOrderEnumerator{catalog, this}, projectionPlanner{this}, updatePlanner{this} {}
joinOrderEnumerator{catalog, this}, projectionPlanner{this} {}

std::vector<std::unique_ptr<LogicalPlan>> getAllPlans(const BoundStatement& boundStatement);

Expand All @@ -33,21 +39,31 @@ class QueryPlanner {
private:
std::unique_ptr<LogicalPlan> getBestPlan(std::vector<std::unique_ptr<LogicalPlan>> plans);

// Plan query
std::vector<std::unique_ptr<LogicalPlan>> planSingleQuery(
const NormalizedSingleQuery& singleQuery);
std::vector<std::unique_ptr<LogicalPlan>> planQueryPart(
const NormalizedQueryPart& queryPart, std::vector<std::unique_ptr<LogicalPlan>> prevPlans);

// Reading clause planning
void planReadingClause(BoundReadingClause* boundReadingClause,
std::vector<std::unique_ptr<LogicalPlan>>& prevPlans);
// Plan reading
void planReadingClause(
BoundReadingClause* readingClause, std::vector<std::unique_ptr<LogicalPlan>>& prevPlans);
void planMatchClause(
BoundReadingClause* boundReadingClause, std::vector<std::unique_ptr<LogicalPlan>>& plans);
BoundReadingClause* readingClause, std::vector<std::unique_ptr<LogicalPlan>>& plans);
void planUnwindClause(
BoundReadingClause* boundReadingClause, std::vector<std::unique_ptr<LogicalPlan>>& plans);
BoundReadingClause* readingClause, std::vector<std::unique_ptr<LogicalPlan>>& plans);
void planInQueryCall(
BoundReadingClause* boundReadingClause, std::vector<std::unique_ptr<LogicalPlan>>& plans);
BoundReadingClause* readingClause, std::vector<std::unique_ptr<LogicalPlan>>& plans);

// Plan updating
void planUpdatingClause(binder::BoundUpdatingClause& updatingClause,
std::vector<std::unique_ptr<LogicalPlan>>& plans);
void planUpdatingClause(binder::BoundUpdatingClause& updatingClause, LogicalPlan& plan);
void planCreateClause(binder::BoundUpdatingClause& updatingClause, LogicalPlan& plan);
void planSetClause(binder::BoundUpdatingClause& updatingClause, LogicalPlan& plan);
void planDeleteClause(binder::BoundUpdatingClause& updatingClause, LogicalPlan& plan);

// Plan subquery
void planOptionalMatch(const QueryGraphCollection& queryGraphCollection,
const expression_vector& predicates, LogicalPlan& leftPlan);
void planRegularMatch(const QueryGraphCollection& queryGraphCollection,
Expand Down Expand Up @@ -80,6 +96,24 @@ class QueryPlanner {
void appendScanNodePropIfNecessary(const expression_vector& propertyExpressions,
std::shared_ptr<NodeExpression> node, LogicalPlan& plan);

// Append updating operators
void appendCreateNode(const std::vector<std::unique_ptr<binder::BoundCreateNode>>& createNodes,
LogicalPlan& plan);
void appendCreateRel(
const std::vector<std::unique_ptr<binder::BoundCreateRel>>& createRels, LogicalPlan& plan);

void appendSetNodeProperty(
const std::vector<std::unique_ptr<binder::BoundSetNodeProperty>>& setNodeProperties,
LogicalPlan& plan);
void appendSetRelProperty(
const std::vector<std::unique_ptr<binder::BoundSetRelProperty>>& setRelProperties,
LogicalPlan& plan);

void appendDeleteNode(const std::vector<std::unique_ptr<binder::BoundDeleteNode>>& deleteNodes,
LogicalPlan& plan);
void appendDeleteRel(
const std::vector<std::shared_ptr<binder::RelExpression>>& deleteRels, LogicalPlan& plan);

std::unique_ptr<LogicalPlan> createUnionPlan(
std::vector<std::unique_ptr<LogicalPlan>>& childrenPlans, bool isUnionAll);

Expand All @@ -97,7 +131,6 @@ class QueryPlanner {
expression_vector propertiesToScan;
JoinOrderEnumerator joinOrderEnumerator;
ProjectionPlanner projectionPlanner;
UpdatePlanner updatePlanner;
};

} // namespace planner
Expand Down
54 changes: 0 additions & 54 deletions src/include/planner/update_planner.h

This file was deleted.

5 changes: 2 additions & 3 deletions src/planner/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
add_subdirectory(join_order)
add_subdirectory(operator)
add_subdirectory(plan_operator)
add_subdirectory(plan)

add_library(kuzu_planner
OBJECT
Expand All @@ -9,8 +9,7 @@ add_library(kuzu_planner
planner.cpp
projection_planner.cpp
query_planner.cpp
subplans_table.cpp
update_planner.cpp)
subplans_table.cpp)

set(ALL_OBJECT_FILES
${ALL_OBJECT_FILES} $<TARGET_OBJECTS:kuzu_planner>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
add_library(kuzu_planner_plan_operator
OBJECT
append_accumulate.cpp)
append_accumulate.cpp
append_create.cpp
append_delete.cpp
append_set.cpp
plan_update.cpp)

set(ALL_OBJECT_FILES
${ALL_OBJECT_FILES} $<TARGET_OBJECTS:kuzu_planner_plan_operator>
Expand Down
50 changes: 50 additions & 0 deletions src/planner/plan/append_create.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#include "binder/query/updating_clause/bound_create_clause.h"
#include "binder/query/updating_clause/bound_set_clause.h"
#include "planner/logical_plan/logical_operator/logical_create.h"
#include "planner/query_planner.h"

using namespace kuzu::binder;

namespace kuzu {
namespace planner {

void QueryPlanner::appendCreateNode(
const std::vector<std::unique_ptr<binder::BoundCreateNode>>& createNodes, LogicalPlan& plan) {
std::vector<std::shared_ptr<NodeExpression>> nodes;
expression_vector primaryKeys;
std::vector<std::unique_ptr<BoundSetNodeProperty>> setNodeProperties;
for (auto& createNode : createNodes) {
auto node = createNode->getNode();
nodes.push_back(node);
primaryKeys.push_back(createNode->getPrimaryKeyExpression());
for (auto& setItem : createNode->getSetItems()) {
setNodeProperties.push_back(std::make_unique<BoundSetNodeProperty>(node, setItem));
}
}
auto createNode = std::make_shared<LogicalCreateNode>(
std::move(nodes), std::move(primaryKeys), plan.getLastOperator());
appendFlattens(createNode->getGroupsPosToFlatten(), plan);
createNode->setChild(0, plan.getLastOperator());
createNode->computeFactorizedSchema();
plan.setLastOperator(createNode);
appendSetNodeProperty(setNodeProperties, plan);
}

void QueryPlanner::appendCreateRel(
const std::vector<std::unique_ptr<binder::BoundCreateRel>>& createRels, LogicalPlan& plan) {
std::vector<std::shared_ptr<RelExpression>> rels;
std::vector<std::vector<expression_pair>> setItemsPerRel;
for (auto& createRel : createRels) {
rels.push_back(createRel->getRel());
setItemsPerRel.push_back(createRel->getSetItems());
}
auto createRel = std::make_shared<LogicalCreateRel>(
std::move(rels), std::move(setItemsPerRel), plan.getLastOperator());
appendFlattens(createRel->getGroupsPosToFlatten(), plan);
createRel->setChild(0, plan.getLastOperator());
createRel->computeFactorizedSchema();
plan.setLastOperator(createRel);
}

} // namespace planner
} // namespace kuzu
34 changes: 34 additions & 0 deletions src/planner/plan/append_delete.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include "binder/query/updating_clause/bound_delete_clause.h"
#include "planner/logical_plan/logical_operator/logical_delete.h"
#include "planner/query_planner.h"

namespace kuzu {
namespace planner {

void QueryPlanner::appendDeleteNode(
const std::vector<std::unique_ptr<binder::BoundDeleteNode>>& deleteNodes, LogicalPlan& plan) {
std::vector<std::shared_ptr<NodeExpression>> nodes;
expression_vector primaryKeys;
for (auto& deleteNode : deleteNodes) {
nodes.push_back(deleteNode->getNode());
primaryKeys.push_back(deleteNode->getPrimaryKeyExpression());
}
auto deleteNode = std::make_shared<LogicalDeleteNode>(
std::move(nodes), std::move(primaryKeys), plan.getLastOperator());
deleteNode->computeFactorizedSchema();
plan.setLastOperator(std::move(deleteNode));
}

void QueryPlanner::appendDeleteRel(
const std::vector<std::shared_ptr<binder::RelExpression>>& deleteRels, LogicalPlan& plan) {
auto deleteRel = std::make_shared<LogicalDeleteRel>(deleteRels, plan.getLastOperator());
for (auto i = 0u; i < deleteRel->getNumRels(); ++i) {
appendFlattens(deleteRel->getGroupsPosToFlatten(i), plan);
deleteRel->setChild(0, plan.getLastOperator());
}
deleteRel->computeFactorizedSchema();
plan.setLastOperator(std::move(deleteRel));
}

} // namespace planner
} // namespace kuzu
59 changes: 59 additions & 0 deletions src/planner/plan/append_set.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#include "binder/query/updating_clause/bound_set_clause.h"
#include "planner/logical_plan/logical_operator/logical_set.h"
#include "planner/query_planner.h"

namespace kuzu {
namespace planner {

void QueryPlanner::appendSetNodeProperty(
const std::vector<std::unique_ptr<binder::BoundSetNodeProperty>>& setNodeProperties,
LogicalPlan& plan) {
std::vector<std::shared_ptr<NodeExpression>> nodes;
std::vector<expression_pair> setItems;
for (auto& setNodeProperty : setNodeProperties) {
nodes.push_back(setNodeProperty->getNode());
setItems.push_back(setNodeProperty->getSetItem());
}
for (auto i = 0u; i < setItems.size(); ++i) {
auto lhsNodeID = nodes[i]->getInternalIDProperty();
auto rhs = setItems[i].second;
// flatten rhs
auto rhsDependentGroupsPos = plan.getSchema()->getDependentGroupsPos(rhs);
auto rhsGroupsPosToFlatten = factorization::FlattenAllButOne::getGroupsPosToFlatten(
rhsDependentGroupsPos, plan.getSchema());
appendFlattens(rhsGroupsPosToFlatten, plan);
// flatten lhs if needed
auto lhsGroupPos = plan.getSchema()->getGroupPos(*lhsNodeID);
auto rhsLeadingGroupPos =
SchemaUtils::getLeadingGroupPos(rhsDependentGroupsPos, *plan.getSchema());
if (lhsGroupPos != rhsLeadingGroupPos) {
appendFlattenIfNecessary(lhsGroupPos, plan);
}
}
auto setNodeProperty = std::make_shared<LogicalSetNodeProperty>(
std::move(nodes), std::move(setItems), plan.getLastOperator());
setNodeProperty->computeFactorizedSchema();
plan.setLastOperator(setNodeProperty);
}

void QueryPlanner::appendSetRelProperty(
const std::vector<std::unique_ptr<binder::BoundSetRelProperty>>& setRelProperties,
LogicalPlan& plan) {
std::vector<std::shared_ptr<RelExpression>> rels;
std::vector<expression_pair> setItems;
for (auto& setRelProperty : setRelProperties) {
rels.push_back(setRelProperty->getRel());
setItems.push_back(setRelProperty->getSetItem());
}
auto setRelProperty = std::make_shared<LogicalSetRelProperty>(
std::move(rels), std::move(setItems), plan.getLastOperator());
for (auto i = 0u; i < setRelProperty->getNumRels(); ++i) {
appendFlattens(setRelProperty->getGroupsPosToFlatten(i), plan);
setRelProperty->setChild(0, plan.getLastOperator());
}
setRelProperty->computeFactorizedSchema();
plan.setLastOperator(setRelProperty);
}

} // namespace planner
} // namespace kuzu
Loading
Loading