aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Stoyan <vitstn@gmail.com>2022-06-10 01:44:50 +0300
committerVitaly Stoyan <vitstn@gmail.com>2022-06-10 01:44:50 +0300
commited9731223c38e5afeef7f54ce80c636792d9f461 (patch)
tree38a2562a79a2b365345784e8bb98bfcb21573432
parent1f0ba76cc76d92a01b47e922c28c008078844efd (diff)
downloadydb-ed9731223c38e5afeef7f54ce80c636792d9f461.tar.gz
YQL-13966 native logical ops & some optimizers
ref:d905e63083c2740588238858f99f3c7da07c5586
-rw-r--r--ydb/library/yql/core/common_opt/yql_co_simple1.cpp86
-rw-r--r--ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp45
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 = {