diff options
| author | a-romanov <[email protected]> | 2023-08-21 11:06:57 +0300 | 
|---|---|---|
| committer | a-romanov <[email protected]> | 2023-08-21 12:50:37 +0300 | 
| commit | 690f7c373e2476ad0b37f3980f7df49c3c3b4ee1 (patch) | |
| tree | ab86cc2c550eb72c73e700b8c4be47c398b35b4f | |
| parent | 619eea5881bf9fe8461a09ad5ca20233075ba358 (diff) | |
Suppress ordered input of DqJoin.
| -rw-r--r-- | ydb/library/yql/dq/opt/dq_opt_join.cpp | 42 | ||||
| -rw-r--r-- | ydb/library/yql/dq/opt/dq_opt_join.h | 2 | ||||
| -rw-r--r-- | ydb/library/yql/providers/dq/opt/physical_optimize.cpp | 5 | 
3 files changed, 49 insertions, 0 deletions
| diff --git a/ydb/library/yql/dq/opt/dq_opt_join.cpp b/ydb/library/yql/dq/opt/dq_opt_join.cpp index 56a9092845a..993829b6dcf 100644 --- a/ydb/library/yql/dq/opt/dq_opt_join.cpp +++ b/ydb/library/yql/dq/opt/dq_opt_join.cpp @@ -425,6 +425,48 @@ TExprBase DqRewriteEquiJoin(const TExprBase& node, EHashJoinMode mode, TExprCont      return projection;  } +TDqJoin DqSuppressSortOnJoinInput(const TDqJoin& join, TExprContext& ctx) { +    const bool lOrdered = join.LeftInput().Ref().GetConstraint<TSortedConstraintNode>() || join.LeftInput().Ref().GetConstraint<TChoppedConstraintNode>(); +    const bool rOrdered = join.RightInput().Ref().GetConstraint<TSortedConstraintNode>() || join.RightInput().Ref().GetConstraint<TChoppedConstraintNode>(); + +    if (lOrdered && rOrdered) +        return Build<TDqJoin>(ctx, join.Pos()) +            .LeftInput<TCoUnordered>() +                .Input(join.LeftInput()) +                .Build() +            .RightInput<TCoUnordered>() +                .Input(join.RightInput()) +                .Build() +            .LeftLabel(join.RightLabel()) +            .RightLabel(join.LeftLabel()) +            .JoinType(join.JoinType()) +            .JoinKeys(join.JoinKeys()) +            .Done(); +    else if (lOrdered) +        return Build<TDqJoin>(ctx, join.Pos()) +            .LeftInput<TCoUnordered>() +                .Input(join.LeftInput()) +                .Build() +            .RightInput(join.RightInput()) +            .LeftLabel(join.RightLabel()) +            .RightLabel(join.LeftLabel()) +            .JoinType(join.JoinType()) +            .JoinKeys(join.JoinKeys()) +            .Done(); +    else if (rOrdered) +        return Build<TDqJoin>(ctx, join.Pos()) +            .LeftInput(join.LeftInput()) +            .RightInput<TCoUnordered>() +                .Input(join.RightInput()) +                .Build() +            .LeftLabel(join.RightLabel()) +            .RightLabel(join.LeftLabel()) +            .JoinType(join.JoinType()) +            .JoinKeys(join.JoinKeys()) +            .Done(); +    return join; +} +  TExprBase DqRewriteRightJoinToLeft(const TExprBase node, TExprContext& ctx) {      if (!node.Maybe<TDqJoin>()) {          return node; diff --git a/ydb/library/yql/dq/opt/dq_opt_join.h b/ydb/library/yql/dq/opt/dq_opt_join.h index 85268016708..b5b8213bcc9 100644 --- a/ydb/library/yql/dq/opt/dq_opt_join.h +++ b/ydb/library/yql/dq/opt/dq_opt_join.h @@ -18,4 +18,6 @@ NNodes::TExprBase DqBuildHashJoin(const NNodes::TDqJoin& join, EHashJoinMode mod  NNodes::TExprBase DqBuildJoinDict(const NNodes::TDqJoin& join, TExprContext& ctx); +NNodes::TDqJoin DqSuppressSortOnJoinInput(const NNodes::TDqJoin& node, TExprContext& ctx); +  } diff --git a/ydb/library/yql/providers/dq/opt/physical_optimize.cpp b/ydb/library/yql/providers/dq/opt/physical_optimize.cpp index 18a5478a9d8..d3cbaddc15e 100644 --- a/ydb/library/yql/providers/dq/opt/physical_optimize.cpp +++ b/ydb/library/yql/providers/dq/opt/physical_optimize.cpp @@ -42,6 +42,7 @@ public:          AddHandler(0, &TCoTakeBase::Match, HNDL(BuildTakeOrTakeSkipStage<false>));          AddHandler(0, &TCoLength::Match, HNDL(RewriteLengthOfStageOutput<false>));          AddHandler(0, &TCoExtendBase::Match, HNDL(BuildExtendStage)); +        AddHandler(0, &TDqJoin::Match, HNDL(SuppressSortOnJoinInput));          AddHandler(0, &TDqJoin::Match, HNDL(RewriteRightJoinToLeft));          AddHandler(0, &TDqJoin::Match, HNDL(RewriteLeftPureJoin<false>));          AddHandler(0, &TDqJoin::Match, HNDL(BuildJoin<false>)); @@ -236,6 +237,10 @@ protected:          return DqRewriteRightJoinToLeft(node, ctx);      } +    TMaybeNode<TExprBase> SuppressSortOnJoinInput(TExprBase node, TExprContext& ctx) { +        return DqSuppressSortOnJoinInput(node.Cast<TDqJoin>(),ctx); +    } +      template <bool IsGlobal>      TMaybeNode<TExprBase> RewriteLeftPureJoin(TExprBase node, TExprContext& ctx, const TGetParents& getParents) {          return DqRewriteLeftPureJoin(node, ctx, *getParents(), IsGlobal); | 
