aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <Anton.Romanov@ydb.tech>2023-04-28 15:53:48 +0300
committera-romanov <Anton.Romanov@ydb.tech>2023-04-28 15:53:48 +0300
commit3ceaa4dbb53b14736831edeb57fb670a2f0180da (patch)
treedbf97e7da4b28eed4d2c5446bf60c37323da0cf5
parent048fc0e82e4491618c5b96b4b8a30fe8e5d16525 (diff)
downloadydb-3ceaa4dbb53b14736831edeb57fb670a2f0180da.tar.gz
YQL-8971 YQL-15555 Add AssumeChopped and use it.
-rw-r--r--ydb/library/yql/core/common_opt/yql_co_simple1.cpp2
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_core.cpp5
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_list.cpp2
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_list.h2
-rw-r--r--ydb/library/yql/core/yql_expr_constraint.cpp29
-rw-r--r--ydb/library/yql/core/yql_opt_utils.cpp15
-rw-r--r--ydb/library/yql/core/yql_opt_utils.h2
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);