diff options
author | aozeritsky <aozeritsky@ydb.tech> | 2023-09-22 01:22:45 +0300 |
---|---|---|
committer | aozeritsky <aozeritsky@ydb.tech> | 2023-09-22 01:43:18 +0300 |
commit | 275bbb28224e7dae22959f79299b7ee348098f89 (patch) | |
tree | ad5261a00aff75e9d064e41032ff07c73cf1b701 | |
parent | 27b3e09e8f6bd8438535489c0acf145310d07e53 (diff) | |
download | ydb-275bbb28224e7dae22959f79299b7ee348098f89.tar.gz |
Don't build transitive closure twice
-rw-r--r-- | ydb/library/yql/dq/opt/dq_opt_join_cost_based.cpp | 33 |
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"; |