Skip to content

Commit 192e3bc

Browse files
authored
[CBO] Transitive closure adding conditions to existed edges (#10528)
1 parent 0a9d2cf commit 192e3bc

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

ydb/library/yql/dq/opt/dq_opt_hypergraph_ut.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,22 @@ Y_UNIT_TEST_SUITE(HypergraphBuild) {
423423
}
424424
}
425425

426+
Y_UNIT_TEST(ManyCondsBetweenJoinForTransitiveClosure) {
427+
auto join = Join(Join("A", "B", "A.PUDGE=B.PUDGE,A.DOTA=B.DOTA"), "C", "A.PUDGE=C.PUDGE,A.DOTA=C.DOTA");
428+
429+
auto graph = MakeJoinHypergraph<TNodeSet64>(join);
430+
Cout << graph.String() << Endl;
431+
432+
auto B = graph.GetNodesByRelNames({"B"});
433+
auto C = graph.GetNodesByRelNames({"C"});
434+
UNIT_ASSERT(graph.FindEdgeBetween(B, C));
435+
436+
{
437+
auto optimizedJoin = Enumerate(join, TOptimizerHints::Parse("Rows(B C # 0)"));
438+
UNIT_ASSERT(HaveSameConditionCount(optimizedJoin, join));
439+
}
440+
}
441+
426442
auto MakeClique(size_t size) {
427443
std::shared_ptr<IBaseOptimizerNode> root = Join("R0", "R1", "R0.id=R1.id");
428444

ydb/library/yql/dq/opt/dq_opt_join_hypergraph.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -481,8 +481,21 @@ class TTransitiveClosureConstructor {
481481
auto iNode = Graph_.GetNodesByRelNames({joinCondById[i].RelName});
482482
auto jNode = Graph_.GetNodesByRelNames({joinCondById[j].RelName});
483483

484-
if (Graph_.FindEdgeBetween(iNode, jNode)) {
485-
continue;
484+
if (auto* maybeEdge = Graph_.FindEdgeBetween(iNode, jNode)) {
485+
auto addUniqueKey = [](auto& vector, const auto& key) {
486+
if (std::find(vector.begin(), vector.end(), key) == vector.end()) {
487+
vector.push_back(key);
488+
}
489+
};
490+
491+
auto& revEdge = Graph_.GetEdge(maybeEdge->ReversedEdgeId);
492+
addUniqueKey(revEdge.LeftJoinKeys, joinCondById[j]);
493+
addUniqueKey(revEdge.RightJoinKeys, joinCondById[i]);
494+
495+
auto& edge = Graph_.GetEdge(revEdge.ReversedEdgeId);
496+
addUniqueKey(edge.LeftJoinKeys, joinCondById[i]);
497+
addUniqueKey(edge.RightJoinKeys, joinCondById[j]);
498+
continue;
486499
}
487500

488501
Graph_.AddEdge(THyperedge(iNode, jNode, InnerJoin, false, false, true, {joinCondById[i]}, {joinCondById[j]}));

0 commit comments

Comments
 (0)