#pragma once #include #include namespace NYql { struct TPredicateExtractorSettings { TMaybe MaxRanges = 10000; // should be less than Max() due to integer overflow bool MergeAdjacentPointRanges = true; bool HaveNextValueCallable = false; bool BuildLiteralRange = false; std::function IsValidForRange; }; class IPredicateRangeExtractor { public: using TPtr = THolder; virtual bool Prepare(const TExprNode::TPtr& filterLambda, const TTypeAnnotationNode& rowType, THashSet& possibleIndexKeys, TExprContext& ctx, TTypeAnnotationContext& typesCtx) = 0; struct TBuildResult { TExprNode::TPtr ComputeNode; TExprNode::TPtr PrunedLambda; size_t UsedPrefixLen = 0; size_t PointPrefixLen = 0; TMaybe ExpectedMaxRanges; struct TLiteralRange { struct TLiteralRangeBound { bool Inclusive = false; TVector Columns; }; TLiteralRangeBound Left; TLiteralRangeBound Right; }; TMaybe LiteralRange; }; virtual TBuildResult BuildComputeNode(const TVector& indexKeys, TExprContext& ctx, TTypeAnnotationContext& typesCtx) const = 0; virtual ~IPredicateRangeExtractor() = default; }; IPredicateRangeExtractor::TPtr MakePredicateRangeExtractor(const TPredicateExtractorSettings& settings = {}); TExprNode::TPtr BuildPointsList(const IPredicateRangeExtractor::TBuildResult&, TConstArrayRef keyColumns, NYql::TExprContext& expCtx); }