diff options
author | aneporada <aneporada@ydb.tech> | 2023-08-30 19:10:44 +0300 |
---|---|---|
committer | aneporada <aneporada@ydb.tech> | 2023-08-30 19:34:21 +0300 |
commit | 5205b9dff65d60847cdbfd4479b9b8462c33d148 (patch) | |
tree | cfd17f641f036ee470d924d77b019fa7beb0a097 | |
parent | b71f43754a0f3586be618e1913e4d3632c413e17 (diff) | |
download | ydb-5205b9dff65d60847cdbfd4479b9b8462c33d148.tar.gz |
Fix WideToBlocks optimizers and improve type annotation
initial
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; |