11#include " kqp_operator.h"
2+ #include < yql/essentials/core/yql_expr_optimize.h>
23
34namespace {
45using namespace NKikimr ;
@@ -124,6 +125,14 @@ TExprNode::TPtr RenameMembers(TExprNode::TPtr input, const THashMap<TInfoUnit, T
124125 }
125126}
126127
128+ } // namespace
129+
130+ namespace NKikimr {
131+ namespace NKqp {
132+
133+ using namespace NYql ;
134+ using namespace NNodes ;
135+
127136TString PrintRBOExpression (TExprNode::TPtr expr, TExprContext & ctx) {
128137 try {
129138 TConvertToAstSettings settings;
@@ -142,14 +151,6 @@ TString PrintRBOExpression(TExprNode::TPtr expr, TExprContext & ctx) {
142151 }
143152}
144153
145- } // namespace
146-
147- namespace NKikimr {
148- namespace NKqp {
149-
150- using namespace NYql ;
151- using namespace NNodes ;
152-
153154/* *
154155 * Scan expression and retrieve all members
155156 */
@@ -388,6 +389,10 @@ std::pair<TExprNode::TPtr, TVector<TExprNode::TPtr>> BuildSortKeySelector(TVecto
388389}
389390
390391
392+ /* *
393+ * Base class Operator methods
394+ */
395+
391396void IOperator::RenameIUs (const THashMap<TInfoUnit, TInfoUnit, TInfoUnit::THashFunction> &renameMap, TExprContext &ctx) {
392397 Y_UNUSED (renameMap);
393398 Y_UNUSED (ctx);
@@ -398,11 +403,19 @@ const TTypeAnnotationNode* IOperator::GetIUType(TInfoUnit iu) {
398403 return structType->FindItemType (iu.GetFullName ());
399404}
400405
406+ /* *
407+ * EmptySource operator methods
408+ */
409+
401410TString TOpEmptySource::ToString (TExprContext& ctx) {
402411 Y_UNUSED (ctx);
403412 return " EmptySource" ;
404413}
405414
415+ /* *
416+ * OpRead operator methods
417+ */
418+
406419TOpRead::TOpRead (TExprNode::TPtr node) : IOperator(EOperator::Source, node->Pos ()) {
407420 auto opSource = TKqpOpRead (node);
408421
@@ -440,6 +453,10 @@ TString TOpRead::ToString(TExprContext& ctx) {
440453 return res;
441454}
442455
456+ /* *
457+ * OpMap operator methods
458+ */
459+
443460TOpMap::TOpMap (std::shared_ptr<IOperator> input, TPositionHandle pos, TVector<std::pair<TInfoUnit, std::variant<TInfoUnit, TExprNode::TPtr>>> mapElements,
444461 bool project)
445462 : IUnaryOperator(EOperator::Map, pos, input), MapElements(mapElements), Project(project) {}
@@ -456,6 +473,16 @@ TVector<TInfoUnit> TOpMap::GetOutputIUs() {
456473 return res;
457474}
458475
476+ TVector<TExprNode::TPtr> TOpMap::GetLambdas () {
477+ TVector<TExprNode::TPtr> result;
478+ for (auto &[_,body] : MapElements) {
479+ if (std::holds_alternative<TExprNode::TPtr>(body)) {
480+ result.push_back (std::get<TExprNode::TPtr>(body));
481+ }
482+ }
483+ return result;
484+ }
485+
459486TVector<TInfoUnit> TOpMap::GetScalarSubplanIUs (TPlanProps& props) {
460487 TVector<TInfoUnit> allVars;
461488 TVector<TInfoUnit> res;
@@ -524,6 +551,19 @@ void TOpMap::RenameIUs(const THashMap<TInfoUnit, TInfoUnit, TInfoUnit::THashFunc
524551 MapElements = newMapElements;
525552}
526553
554+ void TOpMap::ApplyReplaceMap (TNodeOnNodeOwnedMap map, TRBOContext & ctx) {
555+ TOptimizeExprSettings settings (&ctx.TypeCtx );
556+ for (size_t i=0 ; i<MapElements.size (); i++) {
557+ auto & body = MapElements[i].second ;
558+ if (std::holds_alternative<TExprNode::TPtr>(body)) {
559+ auto bodyLambda = std::get<TExprNode::TPtr>(body);
560+ RemapExpr (bodyLambda, bodyLambda, map, ctx.ExprCtx , settings);
561+ MapElements[i].second = std::variant<TInfoUnit,TExprNode::TPtr>(bodyLambda);
562+ }
563+ }
564+ }
565+
566+
527567TString TOpMap::ToString (TExprContext& ctx) {
528568 auto res = TStringBuilder ();
529569 res << " Map [" ;
@@ -547,6 +587,10 @@ TString TOpMap::ToString(TExprContext& ctx) {
547587 return res;
548588}
549589
590+ /* *
591+ * OpProject methods
592+ */
593+
550594TOpProject::TOpProject (std::shared_ptr<IOperator> input, TPositionHandle pos, TVector<TInfoUnit> projectList)
551595 : IUnaryOperator(EOperator::Project, pos, input), ProjectList(projectList) {}
552596
@@ -584,6 +628,10 @@ TString TOpProject::ToString(TExprContext& ctx) {
584628 return res;
585629}
586630
631+ /* *
632+ * OpFilter operator methods
633+ */
634+
587635TOpFilter::TOpFilter (std::shared_ptr<IOperator> input, TPositionHandle pos, TExprNode::TPtr filterLambda)
588636 : IUnaryOperator(EOperator::Filter, pos, input), FilterLambda(filterLambda) {}
589637
@@ -593,6 +641,15 @@ void TOpFilter::RenameIUs(const THashMap<TInfoUnit, TInfoUnit, TInfoUnit::THashF
593641 FilterLambda = RenameMembers (FilterLambda, renameMap, ctx);
594642}
595643
644+ TVector<TExprNode::TPtr> TOpFilter::GetLambdas () {
645+ return {FilterLambda};
646+ }
647+
648+ void TOpFilter::ApplyReplaceMap (TNodeOnNodeOwnedMap map, TRBOContext & ctx) {
649+ TOptimizeExprSettings settings (&ctx.TypeCtx );
650+ RemapExpr (FilterLambda, FilterLambda, map, ctx.ExprCtx , settings);
651+ }
652+
596653TVector<TInfoUnit> TOpFilter::GetFilterIUs (TPlanProps& props) const {
597654 TVector<TInfoUnit> res;
598655
@@ -666,6 +723,10 @@ TString TOpFilter::ToString(TExprContext& ctx) {
666723 return TStringBuilder () << " Filter :" << PrintRBOExpression (FilterLambda, ctx);
667724}
668725
726+ /* *
727+ * OpJoin operator methods
728+ */
729+
669730TOpJoin::TOpJoin (std::shared_ptr<IOperator> leftInput, std::shared_ptr<IOperator> rightInput, TPositionHandle pos, TString joinKind,
670731 TVector<std::pair<TInfoUnit, TInfoUnit>> joinKeys)
671732 : IBinaryOperator(EOperator::Join, pos, leftInput, rightInput), JoinKind(joinKind), JoinKeys(joinKeys) {}
@@ -706,6 +767,10 @@ TString TOpJoin::ToString(TExprContext& ctx) {
706767 return res;
707768}
708769
770+ /* *
771+ * OpUnionAll operator methods
772+ */
773+
709774TOpUnionAll::TOpUnionAll (std::shared_ptr<IOperator> leftInput, std::shared_ptr<IOperator> rightInput, TPositionHandle pos, bool ordered)
710775 : IBinaryOperator(EOperator::UnionAll, pos, leftInput, rightInput), Ordered(ordered) {}
711776
@@ -718,6 +783,10 @@ TString TOpUnionAll::ToString(TExprContext& ctx) {
718783 return " UnionAll" ;
719784}
720785
786+ /* *
787+ * OpLimit operator methods
788+ */
789+
721790TOpLimit::TOpLimit (std::shared_ptr<IOperator> input, TPositionHandle pos, TExprNode::TPtr limitCond)
722791 : IUnaryOperator(EOperator::Limit, pos, input), LimitCond(limitCond) {}
723792
@@ -731,6 +800,10 @@ TString TOpLimit::ToString(TExprContext& ctx) {
731800 return TStringBuilder () << " Limit: " << PrintRBOExpression (LimitCond, ctx);
732801}
733802
803+ /* *
804+ * OpAggregate operator methods
805+ */
806+
734807TOpAggregate::TOpAggregate (std::shared_ptr<IOperator> input, TVector<TOpAggregationTraits>& aggTraitsList, TVector<TInfoUnit>& keyColumns,
735808 EAggregationPhase aggPhase, bool distinctAll, TPositionHandle pos)
736809 : IUnaryOperator(EOperator::Aggregate, pos, input), AggregationTraitsList(aggTraitsList), KeyColumns(keyColumns),
@@ -774,6 +847,10 @@ TString TOpAggregate::ToString(TExprContext& ctx) {
774847 return strBuilder;
775848}
776849
850+ /* *
851+ * OpRoot operator methods
852+ */
853+
777854TOpRoot::TOpRoot (std::shared_ptr<IOperator> input, TPositionHandle pos, TVector<TString> columnOrder) :
778855 IUnaryOperator(EOperator::Root, pos, input),
779856 ColumnOrder(columnOrder) {}
0 commit comments