aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraozeritsky <aozeritsky@ydb.tech>2023-09-22 01:22:45 +0300
committeraozeritsky <aozeritsky@ydb.tech>2023-09-22 01:43:18 +0300
commit275bbb28224e7dae22959f79299b7ee348098f89 (patch)
treead5261a00aff75e9d064e41032ff07c73cf1b701
parent27b3e09e8f6bd8438535489c0acf145310d07e53 (diff)
downloadydb-275bbb28224e7dae22959f79299b7ee348098f89.tar.gz
Don't build transitive closure twice
-rw-r--r--ydb/library/yql/dq/opt/dq_opt_join_cost_based.cpp33
1 files changed, 19 insertions, 14 deletions
diff --git a/ydb/library/yql/dq/opt/dq_opt_join_cost_based.cpp b/ydb/library/yql/dq/opt/dq_opt_join_cost_based.cpp
index dfed9e8271c..4eb27f97f59 100644
--- a/ydb/library/yql/dq/opt/dq_opt_join_cost_based.cpp
+++ b/ydb/library/yql/dq/opt/dq_opt_join_cost_based.cpp
@@ -1082,24 +1082,29 @@ private:
JoinGraph.AddNode(i, Rels[i]->Label);
}
- std::set<std::pair<TJoinColumn, TJoinColumn>> joinConditions;
for (const auto& clazz : Input.EqClasses) {
- auto [relId, varId] = clazz.Vars[0];
- auto c1 = TJoinColumn(ToString(relId), ToString(varId));
- for (int i = 1; i < (int)clazz.Vars.size(); i++) {
- auto [crelId, cvarId] = clazz.Vars[i];
- auto c2 = TJoinColumn(ToString(crelId), ToString(cvarId));
- joinConditions.emplace(std::make_pair(c1, c2));
+ for (size_t i = 0; i < clazz.Vars.size(); i++) {
+ auto [lrelId, lvarId] = clazz.Vars[i];
+ int leftNodeId = lrelId - 1;
+ auto left = TJoinColumn{ToString(lrelId), ToString(lvarId)};
+ for (size_t j = 0; j < i; j++) {
+ auto [rrelId, rvarId] = clazz.Vars[j];
+ int rightNodeId = rrelId - 1;
+ auto right = TJoinColumn{ToString(rrelId), ToString(rvarId)};
+
+ auto maybeEdge1 = JoinGraph.Edges.find({leftNodeId, rightNodeId});
+ auto maybeEdge2 = JoinGraph.Edges.find({rightNodeId, leftNodeId});
+ if (maybeEdge1 == JoinGraph.Edges.end() && maybeEdge2 == JoinGraph.Edges.end()) {
+ JoinGraph.AddEdge(TEdge(leftNodeId, rightNodeId, std::make_pair(left, right)));
+ } else {
+ Y_VERIFY(maybeEdge1 != JoinGraph.Edges.end() && maybeEdge2 != JoinGraph.Edges.end());
+ maybeEdge1->JoinConditions.emplace(left, right);
+ maybeEdge2->JoinConditions.emplace(right, left);
+ }
+ }
}
}
- for (auto cond : joinConditions) {
- int fromNode = JoinGraph.FindNode(cond.first.RelName);
- int toNode = JoinGraph.FindNode(cond.second.RelName);
- JoinGraph.AddEdge(TEdge(fromNode, toNode, cond));
- }
- JoinGraph.ComputeTransitiveClosure(joinConditions);
-
if (Log) {
std::stringstream str;
str << "Join graph after transitive closure:\n";