aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <Anton.Romanov@ydb.tech>2022-10-25 18:44:07 +0300
committera-romanov <Anton.Romanov@ydb.tech>2022-10-25 18:44:07 +0300
commit1205d2e635a23b2e88fe68059e73ccd2c009ed47 (patch)
tree68ce8c9c2ea806c128cb923f5f2d5e12c1a63ffd
parentc65f97c0e29659449217343bf981afdda430b75b (diff)
downloadydb-1205d2e635a23b2e88fe68059e73ccd2c009ed47.tar.gz
Close some TODOs.
-rw-r--r--ydb/library/yql/core/yql_expr_constraint.cpp114
1 files changed, 21 insertions, 93 deletions
diff --git a/ydb/library/yql/core/yql_expr_constraint.cpp b/ydb/library/yql/core/yql_expr_constraint.cpp
index f2ad31cea4..7d3a6b23a2 100644
--- a/ydb/library/yql/core/yql_expr_constraint.cpp
+++ b/ydb/library/yql/core/yql_expr_constraint.cpp
@@ -701,11 +701,11 @@ private:
}
}
switch (const auto variantItemType = tupleType->GetItems()[i]; variantItemType->GetKind()) {
-/*TODO: case ETypeAnnotationKind::Tuple:
+ case ETypeAnnotationKind::Tuple:
if (const auto argType = variantItemType->Cast<TTupleExprType>(); argType->GetSize() > 0U) {
multiItems.back().second.AddConstraint(*explicitPasstrought.emplace(ctx.MakeConstraint<TPassthroughConstraintNode>(*argType)).first);
}
- break;*/
+ break;
case ETypeAnnotationKind::Struct:
if (const auto argType = variantItemType->Cast<TStructExprType>(); argType->GetSize() > 0U) {
multiItems.back().second.AddConstraint(*explicitPasstrought.emplace(ctx.MakeConstraint<TPassthroughConstraintNode>(*argType)).first);
@@ -723,11 +723,11 @@ private:
if (const auto inputPassthrough = node.Head().GetConstraint<TPassthroughConstraintNode>()) {
constraints.emplace_back(inputPassthrough);
} else switch (inItemType->GetKind()) {
-/*TODO: case ETypeAnnotationKind::Tuple:
+ case ETypeAnnotationKind::Tuple:
if (const auto argType = inItemType->Cast<TTupleExprType>(); argType->GetSize() > 0U) {
constraints.emplace_back(*explicitPasstrought.emplace(ctx.MakeConstraint<TPassthroughConstraintNode>(*argType)).first);
}
- break;*/
+ break;
case ETypeAnnotationKind::Struct:
if (const auto argType = inItemType->Cast<TStructExprType>(); argType->GetSize() > 0U) {
constraints.emplace_back(*explicitPasstrought.emplace(ctx.MakeConstraint<TPassthroughConstraintNode>(*argType)).first);
@@ -752,104 +752,31 @@ private:
template <bool UseSorted, bool Flat, bool WideInput = false, bool WideOutput = false>
TStatus MapWrap(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) const {
- const auto inItemType = GetItemType(*input->Child(0)->GetTypeAnn());
- bool multiInput = false;
+ const auto inItemType = GetItemType(*input->Head().GetTypeAnn());
TSmallVec<TConstraintNode::TListType> argConstraints(input->Tail().Head().ChildrenSize());
std::unordered_set<const TPassthroughConstraintNode*> explicitPasstrought;
- if (inItemType) {
- //TODO: Use GetConstraintsForInputArgument
- if (inItemType->GetKind() == ETypeAnnotationKind::Variant) {
- if (inItemType->Cast<TVariantExprType>()->GetUnderlyingType()->GetKind() == ETypeAnnotationKind::Tuple) {
- const auto inputMulti = input->Head().GetConstraint<TMultiConstraintNode>();
- const auto tupleType = inItemType->Cast<TVariantExprType>()->GetUnderlyingType()->Cast<TTupleExprType>();
- argConstraints.front().push_back(ctx.MakeConstraint<TVarIndexConstraintNode>(*inItemType->Cast<TVariantExprType>()));
- TMultiConstraintNode::TMapType multiItems;
- multiItems.reserve(tupleType->GetSize());
-
- for (size_t i = 0; i < tupleType->GetSize(); ++i) {
- multiItems.emplace_back(i, TConstraintSet{});
- const auto inputConstr = inputMulti ? inputMulti->GetItem(i) : nullptr;
- if (inputConstr) {
- if (const auto empty = inputConstr->GetConstraint<TEmptyConstraintNode>()) {
- // TODO: multiItems.pop_back() instead
- multiItems.back().second.AddConstraint(empty);
- }
-
- if (const auto pass = inputConstr->GetConstraint<TPassthroughConstraintNode>()) {
- multiItems.back().second.AddConstraint(pass);
- continue;
- }
- }
- switch (const auto variantItemType = tupleType->GetItems()[i]; variantItemType->GetKind()) {
-/*TODO: case ETypeAnnotationKind::Tuple:
- if (const auto argType = variantItemType->Cast<TTupleExprType>(); argType->GetSize() > 0U) {
- multiItems.back().second.AddConstraint(*explicitPasstrought.emplace(ctx.MakeConstraint<TPassthroughConstraintNode>(*argType)).first);
- }
- break;*/
- case ETypeAnnotationKind::Struct:
- if (const auto argType = variantItemType->Cast<TStructExprType>(); argType->GetSize() > 0U) {
- multiItems.back().second.AddConstraint(*explicitPasstrought.emplace(ctx.MakeConstraint<TPassthroughConstraintNode>(*argType)).first);
- if (inputConstr) {
- if (auto uniq = inputConstr->GetConstraint<TUniqueConstraintNode>()) {
- multiItems.back().second.AddConstraint(uniq);
- }
- }
- }
- break;
- default:
- break;
- }
- }
- if (!multiItems.empty()) {
- argConstraints.front().push_back(ctx.MakeConstraint<TMultiConstraintNode>(std::move(multiItems)));
- }
- multiInput = true;
+ if constexpr (WideInput) {
+ const auto structUnique = input->Head().GetConstraint<TUniqueConstraintNode>();
+ for (ui32 i = 0U; i < argConstraints.size(); ++i) {
+ const auto memberName = ctx.AppendString(ToString(i));
+ if (structUnique && structUnique->GetColumns().has(memberName)) {
+ argConstraints[i].emplace_back(ctx.MakeConstraint<TUniqueConstraintNode>(TVector<TStringBuf>{memberName}));
}
- } else {
+ }
+
+ if (inItemType) {
+ const auto multiType = inItemType->Cast<TMultiExprType>();
const auto inputPassthrough = input->Head().GetConstraint<TPassthroughConstraintNode>();
- if constexpr (WideInput) {
- const auto structUnique = input->Head().GetConstraint<TUniqueConstraintNode>();
+ if (const auto passtrought = inputPassthrough ? inputPassthrough : multiType ->GetSize() > 0U ? *explicitPasstrought.emplace(ctx.MakeConstraint<TPassthroughConstraintNode>(*multiType)).first : nullptr) {
for (ui32 i = 0U; i < argConstraints.size(); ++i) {
- const auto memberName = ctx.AppendString(ToString(i));
- if (structUnique && structUnique->GetColumns().has(memberName)) {
- argConstraints[i].emplace_back(ctx.MakeConstraint<TUniqueConstraintNode>(TVector<TStringBuf>{memberName}));
+ if (const auto fieldPasstrought = passtrought->ExtractField(ctx, ToString(i))) {
+ argConstraints[i].emplace_back(fieldPasstrought);
}
}
-
- const auto multiType = inItemType->Cast<TMultiExprType>();
- if (const auto passtrought = inputPassthrough ? inputPassthrough : multiType ->GetSize() > 0U ? *explicitPasstrought.emplace(ctx.MakeConstraint<TPassthroughConstraintNode>(*multiType)).first : nullptr) {
- for (ui32 i = 0U; i < argConstraints.size(); ++i) {
- if (const auto fieldPasstrought = passtrought->ExtractField(ctx, ToString(i))) {
- argConstraints[i].emplace_back(fieldPasstrought);
- }
- }
- }
- } else {
- if (inputPassthrough)
- argConstraints.front().emplace_back(inputPassthrough);
- else switch (inItemType->GetKind()) {
-/*TODO: case ETypeAnnotationKind::Tuple:
- if (const auto argType = inItemType->Cast<TTupleExprType>(); argType->GetSize() > 0U) {
- argConstraints.front().push_back(*explicitPasstrought.emplace(ctx.MakeConstraint<TPassthroughConstraintNode>(*argType)).first);
- }
- break;*/
- case ETypeAnnotationKind::Struct:
- if (const auto argType = inItemType->Cast<TStructExprType>(); argType->GetSize() > 0U) {
- argConstraints.front().push_back(*explicitPasstrought.emplace(ctx.MakeConstraint<TPassthroughConstraintNode>(*argType)).first);
- }
- break;
- default:
- break;
- }
-
- if (const auto unique = input->Head().GetConstraint<TUniqueConstraintNode>()) {
- argConstraints.front().push_back(unique);
- }
- }
- if (const auto groupBy = input->Head().GetConstraint<TGroupByConstraintNode>()) {
- argConstraints.front().push_back(groupBy);
}
}
+ } else {
+ argConstraints.front() = GetConstraintsForInputArgument(*input, explicitPasstrought, ctx);
}
if (const auto status = UpdateLambdaConstraints(input->TailRef(), ctx, argConstraints); status != TStatus::Ok) {
@@ -890,6 +817,7 @@ private:
const auto lambdaVarIndex = GetConstraintFromLambda<TVarIndexConstraintNode, WideOutput>(input->Tail(), ctx);
const auto lambdaMulti = GetConstraintFromLambda<TMultiConstraintNode, WideOutput>(input->Tail(), ctx);
+ const bool multiInput = ETypeAnnotationKind::Variant == inItemType->GetKind();
if (const auto varIndex = input->Head().GetConstraint<TVarIndexConstraintNode>()) {
if (multiInput) {
if (lambdaVarIndex) {