@@ -75,7 +75,7 @@ TExprNode::TPtr OptimizePgCastOverPgConst(const TExprNode::TPtr& input, TExprCon
75
75
return input;
76
76
}
77
77
auto val = input->Child (0 );
78
- if (!val->IsCallable (" PgConst" )) {
78
+ if (!val->IsCallable (" PgConst" )) {
79
79
return input;
80
80
}
81
81
@@ -85,7 +85,7 @@ TExprNode::TPtr OptimizePgCastOverPgConst(const TExprNode::TPtr& input, TExprCon
85
85
YQL_CLOG (DEBUG, Core) << " Remove PgCast unknown->text over PgConst" ;
86
86
return ctx.ChangeChild (*val, 1 , castToType);
87
87
}
88
-
88
+
89
89
return input;
90
90
}
91
91
@@ -6285,7 +6285,48 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) {
6285
6285
map[" ShuffleByKeys" ] = map[" PartitionsByKeys" ] = [](const TExprNode::TPtr& node, TExprContext& ctx, TOptimizeContext& optCtx) {
6286
6286
if (IsEmpty (node->Head (), *optCtx.Types )) {
6287
6287
YQL_CLOG (DEBUG, Core) << node->Content () << " over empty input." ;
6288
- auto lambdaResult = ctx.Builder (node->Pos ()).Apply (node->Tail ()).With (0 , KeepConstraints (node->HeadPtr (), node->Tail ().Head ().Head (), ctx)).Seal ().Build ();
6288
+
6289
+ // lambda argument type:
6290
+ auto & lambdaArg = node->Tail ().Head ().Head ();
6291
+ auto * lambdaArgType = lambdaArg.GetTypeAnn ();
6292
+ YQL_ENSURE (lambdaArgType, " No argument type for lambda in " << node->Content ());
6293
+
6294
+ // sequence type:
6295
+ auto * sequenceType = node->Head ().GetTypeAnn ();
6296
+ YQL_ENSURE (sequenceType, " No argument type for sequence in " << node->Content ());
6297
+
6298
+ TStringBuf typeConversionFunc;
6299
+ if (sequenceType->GetKind () != lambdaArgType->GetKind ()) {
6300
+ switch (lambdaArgType->GetKind ()) {
6301
+ case ETypeAnnotationKind::List:
6302
+ if (sequenceType->GetKind () == ETypeAnnotationKind::Optional) {
6303
+ typeConversionFunc = " ToList" ;
6304
+ } else if (IsIn ({ ETypeAnnotationKind::Stream, ETypeAnnotationKind::Flow }, sequenceType->GetKind ())) {
6305
+ typeConversionFunc = " ForwardList" ;
6306
+ }
6307
+ break ;
6308
+ case ETypeAnnotationKind::Flow:
6309
+ typeConversionFunc = " ToFlow" ;
6310
+ break ;
6311
+ case ETypeAnnotationKind::Stream:
6312
+ typeConversionFunc = " ToStream" ;
6313
+ break ;
6314
+ case ETypeAnnotationKind::Optional:
6315
+ if (sequenceType->GetKind () == ETypeAnnotationKind::List) {
6316
+ typeConversionFunc = " ToOptional" ;
6317
+ }
6318
+ // TODO: convert from Stream/Flow to Optional
6319
+ break ;
6320
+ default :
6321
+ break ;
6322
+ }
6323
+ }
6324
+
6325
+ TExprNode::TPtr sequence = KeepConstraints (node->HeadPtr (), lambdaArg, ctx);
6326
+ if (typeConversionFunc) {
6327
+ sequence = KeepConstraints (ctx.NewCallable (sequence->Pos (), typeConversionFunc, { sequence }), lambdaArg, ctx);
6328
+ }
6329
+ auto lambdaResult = ctx.Builder (node->Pos ()).Apply (node->Tail ()).With (0 , sequence).Seal ().Build ();
6289
6330
if (node->IsCallable (" ShuffleByKeys" )) {
6290
6331
auto lambdaType = node->Tail ().GetTypeAnn ();
6291
6332
if (lambdaType->GetKind () == ETypeAnnotationKind::Optional) {
0 commit comments