aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraneporada <aneporada@ydb.tech>2023-08-30 19:10:44 +0300
committeraneporada <aneporada@ydb.tech>2023-08-30 19:34:21 +0300
commit5205b9dff65d60847cdbfd4479b9b8462c33d148 (patch)
treecfd17f641f036ee470d924d77b019fa7beb0a097
parentb71f43754a0f3586be618e1913e4d3632c413e17 (diff)
downloadydb-5205b9dff65d60847cdbfd4479b9b8462c33d148.tar.gz
Fix WideToBlocks optimizers and improve type annotation
initial
-rw-r--r--ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp18
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_blocks.cpp12
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_blocks.h2
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_core.cpp2
4 files changed, 28 insertions, 6 deletions
diff --git a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp
index 9485386b8f3..fb7b921312d 100644
--- a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp
+++ b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp
@@ -93,7 +93,19 @@ bool IsArgumentsOnlyLambda(const TExprNode& lambda, TVector<ui32>& argIndices) {
return true;
}
-TExprNode::TPtr RebuildArgumentsOnlyLambdaForBlocks(const TExprNode& lambda, TExprContext& ctx) {
+TExprNode::TPtr RebuildArgumentsOnlyLambdaForBlocks(const TExprNode& lambda, TExprContext& ctx, TTypeAnnotationContext& types) {
+ TVector<const TTypeAnnotationNode*> argTypes;
+ for (auto arg : lambda.Head().ChildrenList()) {
+ argTypes.emplace_back(arg->GetTypeAnn());
+ }
+
+ YQL_ENSURE(types.ArrowResolver);
+ auto resolveStatus = types.ArrowResolver->AreTypesSupported(ctx.GetPosition(lambda.Pos()), argTypes, ctx);
+ YQL_ENSURE(resolveStatus != IArrowResolver::ERROR);
+ if (resolveStatus != IArrowResolver::OK) {
+ return {};
+ }
+
TVector<ui32> argIndicies;
if (!IsArgumentsOnlyLambda(lambda, argIndicies)) {
return {};
@@ -123,7 +135,7 @@ TExprNode::TPtr OptimizeWideToBlocks(const TExprNode::TPtr& node, TExprContext&
if (node->Head().IsCallable("WideMap")) {
// swap if all outputs are arguments
const auto& lambda = node->Head().Tail();
- if (auto newLambda = RebuildArgumentsOnlyLambdaForBlocks(lambda, ctx)) {
+ if (auto newLambda = RebuildArgumentsOnlyLambdaForBlocks(lambda, ctx, types)) {
YQL_CLOG(DEBUG, Core) << "Swap " << node->Head().Content() << " with " << node->Content();
return ctx.Builder(node->Pos())
.Callable("WideMap")
@@ -5212,7 +5224,7 @@ bool CollectBlockRewrites(const TMultiExprType* multiInputType, bool keepInputCo
TExprNode::TPtr OptimizeWideMapBlocks(const TExprNode::TPtr& node, TExprContext& ctx, TTypeAnnotationContext& types) {
const auto lambda = node->TailPtr();
if (node->Head().IsCallable("WideFromBlocks")) {
- if (auto newLambda = RebuildArgumentsOnlyLambdaForBlocks(*lambda, ctx)) {
+ if (auto newLambda = RebuildArgumentsOnlyLambdaForBlocks(*lambda, ctx, types)) {
YQL_CLOG(DEBUG, Core) << "Swap " << node->Head().Content() << " with " << node->Content();
return ctx.Builder(node->Pos())
.Callable("WideFromBlocks")
diff --git a/ydb/library/yql/core/type_ann/type_ann_blocks.cpp b/ydb/library/yql/core/type_ann/type_ann_blocks.cpp
index 09c24b96247..7d5d04bcd5b 100644
--- a/ydb/library/yql/core/type_ann/type_ann_blocks.cpp
+++ b/ydb/library/yql/core/type_ann/type_ann_blocks.cpp
@@ -713,7 +713,7 @@ IGraphTransformer::TStatus BlockMergeFinalizeHashedWrapper(const TExprNode::TPtr
return IGraphTransformer::TStatus::Ok;
}
-IGraphTransformer::TStatus WideToBlocksWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx) {
+IGraphTransformer::TStatus WideToBlocksWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExtContext& ctx) {
Y_UNUSED(output);
if (!EnsureArgsCount(*input, 1U, ctx.Expr)) {
return IGraphTransformer::TStatus::Error;
@@ -723,6 +723,11 @@ IGraphTransformer::TStatus WideToBlocksWrapper(const TExprNode::TPtr& input, TEx
return IGraphTransformer::TStatus::Error;
}
+ if (!ctx.Types.ArrowResolver) {
+ ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), "Arrow resolver isn't available"));
+ return IGraphTransformer::TStatus::Error;
+ }
+
const auto multiType = input->Head().GetTypeAnn()->Cast<TFlowExprType>()->GetItemType()->Cast<TMultiExprType>();
TTypeAnnotationNode::TListType retMultiType;
for (const auto& type : multiType->GetItems()) {
@@ -735,6 +740,11 @@ IGraphTransformer::TStatus WideToBlocksWrapper(const TExprNode::TPtr& input, TEx
return IGraphTransformer::TStatus::Error;
}
+ if (ctx.Types.ArrowResolver->AreTypesSupported(ctx.Expr.GetPosition(input->Pos()), { type }, ctx.Expr) != IArrowResolver::OK) {
+ ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), TStringBuilder() << "Type " << *type << " is not supported in Block mode"));
+ return IGraphTransformer::TStatus::Error;
+ }
+
retMultiType.push_back(ctx.Expr.MakeType<TBlockExprType>(type));
}
diff --git a/ydb/library/yql/core/type_ann/type_ann_blocks.h b/ydb/library/yql/core/type_ann/type_ann_blocks.h
index 2421242c3ce..cc2251aff5d 100644
--- a/ydb/library/yql/core/type_ann/type_ann_blocks.h
+++ b/ydb/library/yql/core/type_ann/type_ann_blocks.h
@@ -24,7 +24,7 @@ namespace NTypeAnnImpl {
IGraphTransformer::TStatus BlockCombineAllWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExtContext& ctx);
IGraphTransformer::TStatus BlockCombineHashedWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExtContext& ctx);
IGraphTransformer::TStatus BlockMergeFinalizeHashedWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExtContext& ctx);
- IGraphTransformer::TStatus WideToBlocksWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
+ IGraphTransformer::TStatus WideToBlocksWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExtContext& ctx);
IGraphTransformer::TStatus WideFromBlocksWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
IGraphTransformer::TStatus WideSkipTakeBlocksWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
IGraphTransformer::TStatus WideTopBlocksWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
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 faa9cffbed7..293a86702a7 100644
--- a/ydb/library/yql/core/type_ann/type_ann_core.cpp
+++ b/ydb/library/yql/core/type_ann/type_ann_core.cpp
@@ -12052,7 +12052,6 @@ template <NKikimr::NUdf::EDataSlot DataSlot>
Functions["NarrowFlatMap"] = &NarrowFlatMapWrapper;
Functions["NarrowMultiMap"] = &NarrowMultiMapWrapper;
- Functions["WideToBlocks"] = &WideToBlocksWrapper;
Functions["WideFromBlocks"] = &WideFromBlocksWrapper;
Functions["WideSkipBlocks"] = &WideSkipTakeBlocksWrapper;
Functions["WideTakeBlocks"] = &WideSkipTakeBlocksWrapper;
@@ -12080,6 +12079,7 @@ template <NKikimr::NUdf::EDataSlot DataSlot>
ExtFunctions["BlockFunc"] = &BlockFuncWrapper;
ExtFunctions["BlockBitCast"] = &BlockBitCastWrapper;
+ ExtFunctions["WideToBlocks"] = &WideToBlocksWrapper;
ExtFunctions["BlockCombineAll"] = &BlockCombineAllWrapper;
ExtFunctions["BlockCombineHashed"] = &BlockCombineHashedWrapper;
ExtFunctions["BlockMergeFinalizeHashed"] = &BlockMergeFinalizeHashedWrapper;