diff options
author | Vitaly Stoyan <vitstn@gmail.com> | 2022-06-10 01:44:50 +0300 |
---|---|---|
committer | Vitaly Stoyan <vitstn@gmail.com> | 2022-06-10 01:44:50 +0300 |
commit | ed9731223c38e5afeef7f54ce80c636792d9f461 (patch) | |
tree | 38a2562a79a2b365345784e8bb98bfcb21573432 | |
parent | 1f0ba76cc76d92a01b47e922c28c008078844efd (diff) | |
download | ydb-ed9731223c38e5afeef7f54ce80c636792d9f461.tar.gz |
YQL-13966 native logical ops & some optimizers
ref:d905e63083c2740588238858f99f3c7da07c5586
-rw-r--r-- | ydb/library/yql/core/common_opt/yql_co_simple1.cpp | 86 | ||||
-rw-r--r-- | ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp | 45 |
2 files changed, 86 insertions, 45 deletions
diff --git a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp index dd8467c6693..d1a867cb3c4 100644 --- a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp +++ b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp @@ -27,6 +27,48 @@ namespace { using namespace NNodes; +TExprNode::TPtr ExpandPgOr(const TExprNode::TPtr& input, TExprContext& ctx) { + return ctx.Builder(input->Pos()) + .Callable("ToPg") + .Callable(0, "Or") + .Callable(0, "FromPg") + .Add(0, input->ChildPtr(0)) + .Seal() + .Callable(1, "FromPg") + .Add(0, input->ChildPtr(1)) + .Seal() + .Seal() + .Seal() + .Build(); +} + +TExprNode::TPtr ExpandPgAnd(const TExprNode::TPtr& input, TExprContext& ctx) { + return ctx.Builder(input->Pos()) + .Callable("ToPg") + .Callable(0, "And") + .Callable(0, "FromPg") + .Add(0, input->ChildPtr(0)) + .Seal() + .Callable(1, "FromPg") + .Add(0, input->ChildPtr(1)) + .Seal() + .Seal() + .Seal() + .Build(); +} + +TExprNode::TPtr ExpandPgNot(const TExprNode::TPtr& input, TExprContext& ctx) { + return ctx.Builder(input->Pos()) + .Callable("ToPg") + .Callable(0, "Not") + .Callable(0, "FromPg") + .Add(0, input->ChildPtr(0)) + .Seal() + .Seal() + .Seal() + .Build(); +} + template<typename TInt> class TMinAggregate { public: @@ -6410,6 +6452,50 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { return node; }; + map["ToPg"] = [](const TExprNode::TPtr& node, TExprContext& ctx, TOptimizeContext& /*optCtx*/) { + Y_UNUSED(ctx); + if (node->Head().IsCallable("FromPg")) { + YQL_CLOG(DEBUG, Core) << "Eliminate ToPg over FromPg"; + return node->Head().HeadPtr(); + } + + return node; + }; + + map["FromPg"] = [](const TExprNode::TPtr& node, TExprContext& ctx, TOptimizeContext& /*optCtx*/) { + if (node->Head().IsCallable("ToPg")) { + YQL_CLOG(DEBUG, Core) << "Eliminate FromPg over ToPg"; + auto value = node->Head().HeadPtr(); + if (value->GetTypeAnn()->IsOptionalOrNull()) { + return value; + } + + return ctx.NewCallable(node->Pos(), "Just", { value }); + } + + if (node->Head().IsCallable("PgConst")) { + auto name = node->Head().GetTypeAnn()->Cast<TPgExprType>()->GetName(); + if (name = "bool") { + auto value = node->Head().Head().Content(); + if (value.StartsWith('t') || value.StartsWith('f')) { + return ctx.Builder(node->Pos()) + .Callable("Just") + .Callable(0, "Bool") + .Atom(0, (value[0] == 't') ? "1" : "0") + .Seal() + .Seal() + .Build(); + } + } + } + + return node; + }; + + map["PgAnd"] = std::bind(&ExpandPgAnd, _1, _2); + map["PgOr"] = std::bind(&ExpandPgOr, _1, _2); + map["PgNot"] = std::bind(&ExpandPgNot, _1, _2); + // will be applied to any callable after all above map[""] = [](const TExprNode::TPtr& node, TExprContext& ctx, TOptimizeContext& optCtx) { YQL_ENSURE(node->IsCallable()); 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 98554df9863..3b577aa0655 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 @@ -1638,48 +1638,6 @@ TExprNode::TPtr BuildDictOverTuple(TExprNode::TPtr&& collection, const TTypeAnno return ctx.NewCallable(pos, "DictFromKeys", {ExpandType(pos, *dictKeyType, ctx), std::move(collection)}); } -TExprNode::TPtr ExpandPgOr(const TExprNode::TPtr& input, TExprContext& ctx) { - return ctx.Builder(input->Pos()) - .Callable("ToPg") - .Callable(0, "Or") - .Callable(0, "FromPg") - .Add(0, input->ChildPtr(0)) - .Seal() - .Callable(1, "FromPg") - .Add(0, input->ChildPtr(1)) - .Seal() - .Seal() - .Seal() - .Build(); -} - -TExprNode::TPtr ExpandPgAnd(const TExprNode::TPtr& input, TExprContext& ctx) { - return ctx.Builder(input->Pos()) - .Callable("ToPg") - .Callable(0, "And") - .Callable(0, "FromPg") - .Add(0, input->ChildPtr(0)) - .Seal() - .Callable(1, "FromPg") - .Add(0, input->ChildPtr(1)) - .Seal() - .Seal() - .Seal() - .Build(); -} - -TExprNode::TPtr ExpandPgNot(const TExprNode::TPtr& input, TExprContext& ctx) { - return ctx.Builder(input->Pos()) - .Callable("ToPg") - .Callable(0, "Not") - .Callable(0, "FromPg") - .Add(0, input->ChildPtr(0)) - .Seal() - .Seal() - .Seal() - .Build(); -} - TExprNode::TPtr ExpandSqlIn(const TExprNode::TPtr& input, TExprContext& ctx) { auto collection = input->HeadPtr(); auto lookup = input->ChildPtr(1); @@ -5890,9 +5848,6 @@ struct TPeepHoleRules { {"AsRange", &ExpandAsRange}, {"RangeFor", &ExpandRangeFor}, {"ToFlow", &DropToFlowDeps}, - {"PgOr", &ExpandPgOr}, - {"PgAnd", &ExpandPgAnd}, - {"PgNot", &ExpandPgNot}, }; static constexpr std::initializer_list<TPeepHoleOptimizerMap::value_type> SimplifyStageRulesInit = { |