summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzverevgeny <[email protected]>2023-08-21 08:40:04 +0300
committerzverevgeny <[email protected]>2023-08-21 09:14:20 +0300
commitb67c30034ac6d384129f1fb20172555b9ac936e4 (patch)
tree2eb28e7bba4ca75a94f847ee4c5b0b8d354d674a
parent4ffd2d398873ff2e3f1c28fbb1d647d26a9600d1 (diff)
YQL-16308 move IsBoolLike to a common place
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_match_recognize.cpp20
-rw-r--r--ydb/library/yql/core/yql_expr_type_annotation.cpp12
-rw-r--r--ydb/library/yql/core/yql_expr_type_annotation.h3
3 files changed, 16 insertions, 19 deletions
diff --git a/ydb/library/yql/core/type_ann/type_ann_match_recognize.cpp b/ydb/library/yql/core/type_ann/type_ann_match_recognize.cpp
index 2e84b91f50f..6de8f301406 100644
--- a/ydb/library/yql/core/type_ann/type_ann_match_recognize.cpp
+++ b/ydb/library/yql/core/type_ann/type_ann_match_recognize.cpp
@@ -147,24 +147,6 @@ MatchRecognizePatternWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& outp
return IGraphTransformer::TStatus::Ok;
}
-namespace {
-
-bool IsBoolLikeType(const TTypeAnnotationNode* node) {
- switch (node->GetKind()) {
- case ETypeAnnotationKind::Null:
- return true;
- case ETypeAnnotationKind::Data:
- return node->Cast<TDataExprType>()->GetSlot() == EDataSlot::Bool;
- case ETypeAnnotationKind::Optional: {
- const auto nested = node->Cast<TOptionalExprType>()->GetItemType();
- return (nested->GetKind() == ETypeAnnotationKind::Data) and (nested->Cast<TDataExprType>()->GetSlot() == EDataSlot::Bool);
- }
- default:
- return false;
- }
-}
-} //namespace
-
IGraphTransformer::TStatus
MatchRecognizeDefinesWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output,
TContext &ctx) {
@@ -204,7 +186,7 @@ MatchRecognizeDefinesWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& outp
return IGraphTransformer::TStatus::Error;
}
if (auto type = lambda->GetTypeAnn()) {
- if (IsBoolLikeType(type)) {
+ if (IsBoolLike(*type)) {
items.push_back(ctx.Expr.MakeType<TItemExprType>(names->ChildRef(i)->Content(), type));
} else {
ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(lambda->Pos()), "DEFINE expression must be a predicate"));
diff --git a/ydb/library/yql/core/yql_expr_type_annotation.cpp b/ydb/library/yql/core/yql_expr_type_annotation.cpp
index 99a82dce2ac..0d9c27c0979 100644
--- a/ydb/library/yql/core/yql_expr_type_annotation.cpp
+++ b/ydb/library/yql/core/yql_expr_type_annotation.cpp
@@ -4971,6 +4971,18 @@ bool IsFlowOrStream(const TExprNode& node) {
return IsFlowOrStream(*node.GetTypeAnn());
}
+bool IsBoolLike(const TTypeAnnotationNode& type) {
+ if (IsNull(type)) {
+ return true;
+ }
+ const auto itemType = RemoveOptionalType(&type);
+ return (itemType->GetKind() == ETypeAnnotationKind::Data) and (itemType->Cast<TDataExprType>()->GetSlot() == EDataSlot::Bool);
+}
+
+bool IsBoolLike(const TExprNode& node) {
+ return node.GetTypeAnn() && IsBoolLike(*node.GetTypeAnn());
+}
+
namespace {
using TIndentPrinter = std::function<void(TStringBuilder& res, size_t)>;
diff --git a/ydb/library/yql/core/yql_expr_type_annotation.h b/ydb/library/yql/core/yql_expr_type_annotation.h
index 453cb694af8..df2666bc95f 100644
--- a/ydb/library/yql/core/yql_expr_type_annotation.h
+++ b/ydb/library/yql/core/yql_expr_type_annotation.h
@@ -293,6 +293,9 @@ bool IsInstantEqual(const TTypeAnnotationNode& type);
bool IsFlowOrStream(const TTypeAnnotationNode& type);
bool IsFlowOrStream(const TExprNode& node);
+bool IsBoolLike(const TTypeAnnotationNode& type);
+bool IsBoolLike(const TExprNode& node);
+
TString GetTypeDiff(const TTypeAnnotationNode& left, const TTypeAnnotationNode& right);
TString GetTypePrettyDiff(const TTypeAnnotationNode& left, const TTypeAnnotationNode& right);
TExprNode::TPtr ExpandType(TPositionHandle position, const TTypeAnnotationNode& type, TExprContext& ctx);