2
2
3
3
#include < ydb/library/yql/core/yql_expr_optimize.h>
4
4
#include < ydb/library/yql/minikql/mkql_node_serialization.h>
5
+ #include < ydb/library/yql/minikql/mkql_runtime_version.h>
5
6
#include < ydb/library/yql/providers/common/mkql/yql_type_mkql.h>
6
7
7
8
namespace NYql ::NDq {
8
9
9
10
using namespace NKikimr ::NMiniKQL;
10
11
using namespace NYql ::NNodes;
11
12
13
+
14
+ class TSpillingTransformProvider {
15
+ public:
16
+
17
+ TSpillingTransformProvider (const TSpillingSettings& spillingSettings): SpillingSettings(spillingSettings){};
18
+
19
+ TCallableVisitFunc operator ()(TInternName name) {
20
+ if (RuntimeVersion >= 50U && SpillingSettings.IsGraceJoinSpillingEnabled () && (name == " GraceJoin" || name == " GraceSelfJoin" )) {
21
+ return [name](NKikimr::NMiniKQL::TCallable& callable, const TTypeEnvironment& env) {
22
+ TCallableBuilder callableBuilder (env,
23
+ TStringBuilder () << callable.GetType ()->GetName () << " WithSpilling" ,
24
+ callable.GetType ()->GetReturnType (), false );
25
+ for (ui32 i = 0 ; i < callable.GetInputsCount (); ++i) {
26
+ callableBuilder.Add (callable.GetInput (i));
27
+ }
28
+ return TRuntimeNode (callableBuilder.Build (), false );
29
+ };
30
+ }
31
+
32
+ return TCallableVisitFunc ();
33
+ }
34
+
35
+ private:
36
+
37
+ TSpillingSettings SpillingSettings;
38
+ };
39
+
12
40
const TStructExprType* CollectParameters (NNodes::TCoLambda program, TExprContext& ctx) {
13
41
TVector<const TItemExprType*> memberTypes;
14
42
@@ -27,7 +55,7 @@ const TStructExprType* CollectParameters(NNodes::TCoLambda program, TExprContext
27
55
28
56
TString BuildProgram (NNodes::TCoLambda program, const TStructExprType& paramsType,
29
57
const NCommon::IMkqlCallableCompiler& compiler, const TTypeEnvironment& typeEnv,
30
- const IFunctionRegistry& funcRegistry, TExprContext& exprCtx, const TVector<TExprBase>& reads)
58
+ const IFunctionRegistry& funcRegistry, TExprContext& exprCtx, const TVector<TExprBase>& reads, const TSpillingSettings& spillingSettings )
31
59
{
32
60
TProgramBuilder pgmBuilder (typeEnv, funcRegistry);
33
61
@@ -49,6 +77,13 @@ TString BuildProgram(NNodes::TCoLambda program, const TStructExprType& paramsTyp
49
77
50
78
TRuntimeNode rootNode = MkqlBuildExpr (program.Body ().Ref (), ctx);
51
79
80
+ TExploringNodeVisitor explorer;
81
+ if (spillingSettings) {
82
+ explorer.Walk (rootNode.GetNode (), typeEnv);
83
+ bool wereChanges = false ;
84
+ rootNode = SinglePassVisitCallables (rootNode, explorer, TSpillingTransformProvider (spillingSettings), typeEnv, true , wereChanges);
85
+ }
86
+
52
87
TStructLiteralBuilder structBuilder (typeEnv);
53
88
structBuilder.Add (" Program" , rootNode);
54
89
structBuilder.Add (" Inputs" , pgmBuilder.NewTuple (inputNodes));
@@ -64,7 +99,6 @@ TString BuildProgram(NNodes::TCoLambda program, const TStructExprType& paramsTyp
64
99
65
100
auto programNode = structBuilder.Build ();
66
101
67
- TExploringNodeVisitor explorer;
68
102
explorer.Walk (programNode, typeEnv);
69
103
ui32 uniqueId = 0 ;
70
104
for (auto & node : explorer.GetNodes ()) {
0 commit comments