Browse Source

YQL-16308 move IsBoolLike to a common place

zverevgeny 1 year ago
parent
commit
b67c30034a

+ 1 - 19
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"));

+ 12 - 0
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)>;

+ 3 - 0
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);