Skip to content

Commit 06338ff

Browse files
committed
Intermediate commit to save work
1 parent 840d997 commit 06338ff

File tree

5 files changed

+82
-3
lines changed

5 files changed

+82
-3
lines changed

ydb/core/kqp/opt/logical/kqp_opt_log_join.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,16 @@ TMaybeNode<TExprBase> KqpJoinToIndexLookupImpl(const TDqJoin& join, TExprContext
859859

860860
} // anonymous namespace
861861

862+
bool KqpLookupJoinIsApplicable(const NYql::NNodes::TExprBase& node, TVector<TString> joinColumns, NYql::TExprContext& ctx,
863+
const TKqpOptimizeContext& kqpCtx) {
864+
if (kqpCtx.IsScanQuery() && !kqpCtx.Config->EnableKqpScanQueryStreamIdxLookupJoin) {
865+
return false;
866+
}
867+
868+
869+
870+
}
871+
862872
TExprBase KqpJoinToIndexLookup(const TExprBase& node, TExprContext& ctx, const TKqpOptimizeContext& kqpCtx)
863873
{
864874
if ((kqpCtx.IsScanQuery() && !kqpCtx.Config->EnableKqpScanQueryStreamIdxLookupJoin) || !node.Maybe<TDqJoin>()) {

ydb/core/kqp/opt/logical/kqp_opt_log_rules.h

+3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ NYql::NNodes::TExprBase KqpRewriteIndexRead(const NYql::NNodes::TExprBase& node,
3838
NYql::NNodes::TExprBase KqpRewriteLookupIndex(const NYql::NNodes::TExprBase& node, NYql::TExprContext& ctx,
3939
const TKqpOptimizeContext& kqpCtx);
4040

41+
bool KqpLookupJoinIsApplicable(const NYql::NNodes::TExprBase& node, TVector<TString> joinColumns, NYql::TExprContext& ctx,
42+
const TKqpOptimizeContext& kqpCtx);
43+
4144
NYql::NNodes::TExprBase KqpRewriteStreamLookupIndex(const NYql::NNodes::TExprBase& node, NYql::TExprContext& ctx,
4245
const TKqpOptimizeContext& kqpCtx);
4346

ydb/library/yql/core/cbo/cbo_optimizer_new.h

+5
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,13 @@ struct IBaseOptimizerNode {
4949
struct TRelOptimizerNode : public IBaseOptimizerNode {
5050
TString Label;
5151

52+
// Temporary solution to check if a LookupJoin is possible in KQP
53+
TExprNode::TPtr Expr;
54+
5255
TRelOptimizerNode(TString label, std::shared_ptr<TOptimizerStatistics> stats) :
5356
IBaseOptimizerNode(RelNodeType, stats), Label(label) { }
57+
TRelOptimizerNode(TString label, std::shared_ptr<TOptimizerStatistics> stats, const TExprNode::TPtr expr) :
58+
IBaseOptimizerNode(RelNodeType, stats), Label(label), Expr(expr) { }
5459
virtual ~TRelOptimizerNode() {}
5560

5661
virtual TVector<TString> Labels();

ydb/library/yql/core/yql_cost_function.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,12 @@ bool operator < (const TJoinColumn& c1, const TJoinColumn& c2);
4444
}
4545

4646
enum EJoinImplType {
47-
DictJoin,
48-
MapJoin,
49-
GraceJoin
47+
HashJoin,
48+
LookupJoin
5049
};
5150

51+
static const EJoinImplType AllJoinTypes[] = { HashJoin, LookupJoin };
52+
5253
TOptimizerStatistics ComputeJoinStats(const TOptimizerStatistics& leftStats, const TOptimizerStatistics& rightStats,
5354
const std::set<std::pair<NDq::TJoinColumn, NDq::TJoinColumn>>& joinConditions, EJoinImplType joinType);
5455

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

+60
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,66 @@ void ComputeJoinConditions(const TCoEquiJoinTuple& joinTuple,
9292
}
9393
}
9494

95+
bool IsLookupJoinApplicable(std::shared_ptr<IBaseOptimizerNode> left,
96+
std::shared_ptr<IBaseOptimizerNode> right,
97+
const std::set<std::pair<TJoinColumn, TJoinColumn>>& joinCondition) {
98+
99+
100+
}
101+
102+
bool IsJoinApplicable(std::shared_ptr<IBaseOptimizerNode> left,
103+
std::shared_ptr<IBaseOptimizerNode> right,
104+
const std::set<std::pair<TJoinColumn, TJoinColumn>>& joinConditions,
105+
EJoinImplType joinImpl) {
106+
107+
swtich(joinImpl) {
108+
case EJoinImplType::LookupJoin:
109+
return IsLookupJoinApplicable(left,right,joinConditions);
110+
default:
111+
return true;
112+
}
113+
}
114+
115+
std::shared_ptr<TJoinOptimizerNode> PickBestJoin(std::shared_ptr<IBaseOptimizerNode> left,
116+
std::shared_ptr<IBaseOptimizerNode> right,
117+
const std::set<std::pair<TJoinColumn, TJoinColumn>>& leftJoinConditions,
118+
const std::set<std::pair<TJoinColumn, TJoinColumn>>& rightJoinConditions,
119+
const std::shared_ptr<TOptimizerStatistics> leftStats,
120+
const std::shared_ptr<TOptimizerStatistics> rightStats) {
121+
122+
auto res = std::shared_ptr<TJoinOptimizerNode>();
123+
124+
for ( auto joinType : AllJoinTypes ) {
125+
auto p1 = IsJoinApplicable(left, right, leftJoinConditions, joinType) ?
126+
MakeJoin(left, right, leftJoinConditions, joinType ) :
127+
std::shared_ptr<TJoinOptimizerNode>();
128+
auto p2 = IsJoinApplicable(right, left, rightJoinConditions, joinType) ?
129+
MakeJoin(right, left, rightJoinConditions, joinType ) :
130+
std::shared_ptr<TJoinOptimizerNode>();
131+
132+
if (p1) {
133+
if (res) {
134+
if (p1->Cost < res->Cost) {
135+
res = p1;
136+
}
137+
} else {
138+
res = p1;
139+
}
140+
}
141+
if (p2) {
142+
if (res) {
143+
if (p2->Cost < res->Cost) {
144+
res = p2;
145+
}
146+
} else {
147+
res = p2;
148+
}
149+
}
150+
}
151+
152+
return res;
153+
}
154+
95155
/**
96156
* Create a new join and compute its statistics and cost
97157
*/

0 commit comments

Comments
 (0)