diff options
author | a-romanov <Anton.Romanov@ydb.tech> | 2023-04-28 15:53:48 +0300 |
---|---|---|
committer | a-romanov <Anton.Romanov@ydb.tech> | 2023-04-28 15:53:48 +0300 |
commit | 3ceaa4dbb53b14736831edeb57fb670a2f0180da (patch) | |
tree | dbf97e7da4b28eed4d2c5446bf60c37323da0cf5 | |
parent | 048fc0e82e4491618c5b96b4b8a30fe8e5d16525 (diff) | |
download | ydb-3ceaa4dbb53b14736831edeb57fb670a2f0180da.tar.gz |
YQL-8971 YQL-15555 Add AssumeChopped and use it.
-rw-r--r-- | ydb/library/yql/core/common_opt/yql_co_simple1.cpp | 2 | ||||
-rw-r--r-- | ydb/library/yql/core/type_ann/type_ann_core.cpp | 5 | ||||
-rw-r--r-- | ydb/library/yql/core/type_ann/type_ann_list.cpp | 2 | ||||
-rw-r--r-- | ydb/library/yql/core/type_ann/type_ann_list.h | 2 | ||||
-rw-r--r-- | ydb/library/yql/core/yql_expr_constraint.cpp | 29 | ||||
-rw-r--r-- | ydb/library/yql/core/yql_opt_utils.cpp | 15 | ||||
-rw-r--r-- | ydb/library/yql/core/yql_opt_utils.h | 2 |
7 files changed, 41 insertions, 16 deletions
diff --git a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp index 063ee68047..34a764b64d 100644 --- a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp +++ b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp @@ -6703,7 +6703,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { map["ShuffleByKeys"] = map["PartitionsByKeys"] = [](const TExprNode::TPtr& node, TExprContext& ctx, TOptimizeContext& optCtx) { if (IsEmpty(node->Head(), *optCtx.Types)) { YQL_CLOG(DEBUG, Core) << node->Content() << " over empty input."; - return ctx.Builder(node->Pos()).Apply(node->Tail()).With(0, node->HeadPtr()).Seal().Build(); + return ctx.Builder(node->Pos()).Apply(node->Tail()).With(0, KeepConstraints(node->HeadPtr(), node->Tail().Head().Head(), ctx)).Seal().Build(); } return node; }; diff --git a/ydb/library/yql/core/type_ann/type_ann_core.cpp b/ydb/library/yql/core/type_ann/type_ann_core.cpp index 89388ddbc1..fc95f85015 100644 --- a/ydb/library/yql/core/type_ann/type_ann_core.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_core.cpp @@ -11550,8 +11550,9 @@ template <NKikimr::NUdf::EDataSlot DataSlot> Functions["ListZipAll"] = &ListZipAllWrapper; Functions["Sort"] = &SortWrapper; Functions["AssumeSorted"] = &SortWrapper; - Functions["AssumeUnique"] = &AssumeUniqueWrapper; - Functions["AssumeDistinct"] = &AssumeUniqueWrapper; + Functions["AssumeUnique"] = &AssumeConstraintWrapper; + Functions["AssumeDistinct"] = &AssumeConstraintWrapper; + Functions["AssumeChopped"] = &AssumeConstraintWrapper; Functions["AssumeAllMembersNullableAtOnce"] = &AssumeAllMembersNullableAtOnceWrapper; Functions["AssumeStrict"] = &AssumeStrictWrapper; Functions["Top"] = &TopWrapper; diff --git a/ydb/library/yql/core/type_ann/type_ann_list.cpp b/ydb/library/yql/core/type_ann/type_ann_list.cpp index 4512beda5f..d0855abdba 100644 --- a/ydb/library/yql/core/type_ann/type_ann_list.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_list.cpp @@ -4350,7 +4350,7 @@ namespace { return IGraphTransformer::TStatus::Ok; } - IGraphTransformer::TStatus AssumeUniqueWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx) { + IGraphTransformer::TStatus AssumeConstraintWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx) { if (!EnsureMinArgsCount(*input, 1, ctx.Expr)) { return IGraphTransformer::TStatus::Error; } diff --git a/ydb/library/yql/core/type_ann/type_ann_list.h b/ydb/library/yql/core/type_ann/type_ann_list.h index 80d68dac41..02298dd382 100644 --- a/ydb/library/yql/core/type_ann/type_ann_list.h +++ b/ydb/library/yql/core/type_ann/type_ann_list.h @@ -90,7 +90,7 @@ namespace NTypeAnnImpl { IGraphTransformer::TStatus CombineByKeyWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); IGraphTransformer::TStatus ExtractWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); IGraphTransformer::TStatus ExtractMembersWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); - IGraphTransformer::TStatus AssumeUniqueWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); + IGraphTransformer::TStatus AssumeConstraintWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); IGraphTransformer::TStatus AssumeColumnOrderWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExtContext& ctx); IGraphTransformer::TStatus AggregationTraitsWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); IGraphTransformer::TStatus MultiAggregateWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); diff --git a/ydb/library/yql/core/yql_expr_constraint.cpp b/ydb/library/yql/core/yql_expr_constraint.cpp index a014c404ad..976e49f902 100644 --- a/ydb/library/yql/core/yql_expr_constraint.cpp +++ b/ydb/library/yql/core/yql_expr_constraint.cpp @@ -83,6 +83,7 @@ public: Functions["AssumeSorted"] = &TCallableConstraintTransformer::SortWrap; Functions["AssumeUnique"] = &TCallableConstraintTransformer::AssumeUniqueWrap<false>; Functions["AssumeDistinct"] = &TCallableConstraintTransformer::AssumeUniqueWrap<true>; + Functions["AssumeChopped"] = &TCallableConstraintTransformer::AssumeChoppedWrap; Functions["AssumeColumnOrder"] = &TCallableConstraintTransformer::CopyAllFrom<0>; Functions["AssumeAllMembersNullableAtOnce"] = &TCallableConstraintTransformer::CopyAllFrom<0>; Functions["Top"] = &TCallableConstraintTransformer::TopWrap<false>; @@ -380,7 +381,7 @@ private: TStatus AssumeUniqueWrap(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) const { typename TUniqueConstraintNodeBase<Distinct>::TFullSetType sets; for (auto i = 1U; i < input->ChildrenSize(); ++i) { - typename TUniqueConstraintNodeBase<Distinct>::TSetType columns; + TConstraintNode::TSetType columns; columns.reserve(input->Child(i)->ChildrenSize()); for (const auto& column: input->Child(i)->Children()) columns.insert_unique(TConstraintNode::TPathType(1U, column->Content())); @@ -388,7 +389,7 @@ private: } if (sets.empty()) - sets.insert_unique(typename TUniqueConstraintNodeBase<Distinct>::TSetType{TConstraintNode::TPathType()}); + sets.insert_unique(TConstraintNode::TSetType{TConstraintNode::TPathType()}); auto constraint = ctx.MakeConstraint<TUniqueConstraintNodeBase<Distinct>>(std::move(sets)); if (const auto old = input->Head().GetConstraint<TUniqueConstraintNodeBase<Distinct>>()) { @@ -403,6 +404,28 @@ private: return FromFirst<TPassthroughConstraintNode, TSortedConstraintNode, TChoppedConstraintNode, TUniqueConstraintNodeBase<!Distinct>, TEmptyConstraintNode, TVarIndexConstraintNode>(input, output, ctx); } + TStatus AssumeChoppedWrap(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) const { + TChoppedConstraintNode::TFullSetType sets; + for (auto i = 1U; i < input->ChildrenSize(); ++i) { + TConstraintNode::TSetType columns; + columns.reserve(input->Child(i)->ChildrenSize()); + for (const auto& column: input->Child(i)->Children()) + columns.insert_unique(TConstraintNode::TPathType(1U, column->Content())); + sets.insert_unique(std::move(columns)); + } + + const auto constraint = ctx.MakeConstraint<TChoppedConstraintNode>(std::move(sets)); + if (const auto old = input->Head().GetConstraint<TChoppedConstraintNode>()) { + if (old->Equals(*constraint)) { + output = input->HeadPtr(); + return TStatus::Repeat; + } + } + + input->AddConstraint(constraint); + return FromFirst<TPassthroughConstraintNode, TSortedConstraintNode, TDistinctConstraintNode, TUniqueConstraintNode, TEmptyConstraintNode, TVarIndexConstraintNode>(input, output, ctx); + } + template <bool UseSort> TStatus TopWrap(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) const { if (const auto status = UpdateLambdaConstraints(input->Tail()); status != TStatus::Ok) { @@ -2556,7 +2579,7 @@ private: if (useLeft && !useRight) unique = lUnique->RenameFields(ctx, leftRename); else if (useRight && !useLeft) - unique = lUnique->RenameFields(ctx, leftRename); + unique = rUnique->RenameFields(ctx, rightRename); else if (useLeft && useRight) unique = TUniqueConstraintNode::Merge(lUnique->RenameFields(ctx, leftRename), rUnique->RenameFields(ctx, rightRename), ctx); } diff --git a/ydb/library/yql/core/yql_opt_utils.cpp b/ydb/library/yql/core/yql_opt_utils.cpp index 9c65d371f3..8f0241665d 100644 --- a/ydb/library/yql/core/yql_opt_utils.cpp +++ b/ydb/library/yql/core/yql_opt_utils.cpp @@ -19,12 +19,12 @@ using namespace NNodes; namespace { -template<bool Distinct> -TExprNode::TPtr KeepUniqueConstraint(TExprNode::TPtr node, const TExprNode& src, TExprContext& ctx) { - if (const auto uniq = src.GetConstraint<TUniqueConstraintNodeBase<Distinct>>()) { +template<class TConstraint> +TExprNode::TPtr KeepConstraint(TExprNode::TPtr node, const TExprNode& src, TExprContext& ctx) { + if (const auto constraint = src.GetConstraint<TConstraint>()) { const auto pos = node->Pos(); TExprNode::TListType children(1U, std::move(node)); - for (const auto& set : uniq->GetAllSets()) { + for (const auto& set : constraint->GetAllSets()) { TExprNode::TListType columns; columns.reserve(set.size()); for (const auto& path : set) @@ -33,7 +33,7 @@ TExprNode::TPtr KeepUniqueConstraint(TExprNode::TPtr node, const TExprNode& src, if (!columns.empty()) children.emplace_back(ctx.NewList(pos, std::move(columns))); } - return ctx.NewCallable(pos, std::conditional_t<Distinct, TCoAssumeDistinct, TCoAssumeUnique>::CallableName(), std::move(children)); + return ctx.NewCallable(pos, TString("Assume") += TConstraint::Name(), std::move(children)); } return node; } @@ -1764,8 +1764,9 @@ TExprNode::TPtr KeepSortedConstraint(TExprNode::TPtr node, const TSortedConstrai TExprNode::TPtr KeepConstraints(TExprNode::TPtr node, const TExprNode& src, TExprContext& ctx) { auto res = KeepSortedConstraint(node, src.GetConstraint<TSortedConstraintNode>(), ctx); - res = KeepUniqueConstraint<true>(std::move(res), src, ctx); - res = KeepUniqueConstraint<false>(std::move(res), src, ctx); + res = KeepConstraint<TChoppedConstraintNode>(std::move(res), src, ctx); + res = KeepConstraint<TDistinctConstraintNode>(std::move(res), src, ctx); + res = KeepConstraint<TUniqueConstraintNode>(std::move(res), src, ctx); return res; } diff --git a/ydb/library/yql/core/yql_opt_utils.h b/ydb/library/yql/core/yql_opt_utils.h index 8f95e989a7..91651a5f7b 100644 --- a/ydb/library/yql/core/yql_opt_utils.h +++ b/ydb/library/yql/core/yql_opt_utils.h @@ -91,7 +91,7 @@ template <bool Bool> TExprNode::TPtr MakeBool(TPositionHandle position, TExprContext& ctx); TExprNode::TPtr MakeIdentityLambda(TPositionHandle position, TExprContext& ctx); -constexpr std::initializer_list<std::string_view> SkippableCallables = {"Unordered", "AssumeSorted", "AssumeUnique", "AssumeDistinct", "AssumeColumnOrder", "AssumeAllMembersNullableAtOnce"}; +constexpr std::initializer_list<std::string_view> SkippableCallables = {"Unordered", "AssumeSorted", "AssumeUnique", "AssumeDistinct", "AssumeChopped", "AssumeColumnOrder", "AssumeAllMembersNullableAtOnce"}; const TExprNode& SkipCallables(const TExprNode& node, const std::initializer_list<std::string_view>& skipCallables); |