@@ -77,12 +77,6 @@ class ExprToSubfieldFilterTest : public testing::Test {
7777 return std::make_pair (common::Subfield (), nullptr );
7878 }
7979
80- std::pair<common::Subfield, std::unique_ptr<common::Filter>> toSubfieldFilter (
81- const core::TypedExprPtr& expr) {
82- return ExprToSubfieldFilterParser::getInstance ()->toSubfieldFilter (
83- expr, evaluator ());
84- }
85-
8680 private:
8781 std::shared_ptr<memory::MemoryPool> pool_ =
8882 memory::memoryManager ()->addLeafPool ();
@@ -217,55 +211,6 @@ TEST_F(ExprToSubfieldFilterTest, isNull) {
217211 ASSERT_TRUE (filter->testNull ());
218212}
219213
220- TEST_F (ExprToSubfieldFilterTest, isNotNull) {
221- auto call = parseCallExpr (" a is not null" , ROW ({{" a" , BIGINT ()}}));
222- auto [subfield, filter] = toSubfieldFilter (call);
223-
224- ASSERT_TRUE (filter);
225- validateSubfield (subfield, {" a" });
226- ASSERT_TRUE (filter->testInt64 (0 ));
227- ASSERT_TRUE (filter->testInt64 (42 ));
228- ASSERT_FALSE (filter->testNull ());
229- }
230-
231- TEST_F (ExprToSubfieldFilterTest, or ) {
232- auto call = parseExpr (" a = 42 OR a = 43" , ROW ({{" a" , BIGINT ()}}));
233- auto [subfield, filter] = toSubfieldFilter (call);
234-
235- ASSERT_TRUE (filter);
236- validateSubfield (subfield, {" a" });
237- ASSERT_TRUE (filter->testInt64 (42 ));
238- ASSERT_TRUE (filter->testInt64 (43 ));
239- ASSERT_FALSE (filter->testInt64 (41 ));
240- ASSERT_FALSE (filter->testNull ());
241- }
242-
243- TEST_F (ExprToSubfieldFilterTest, unsupported) {
244- const auto type = ROW ({" a" , " b" , " c" }, BIGINT ());
245-
246- VELOX_ASSERT_THROW (
247- toSubfieldFilter (parseExpr (" 123" , type)),
248- " Unsupported expression for range filter" );
249-
250- VELOX_ASSERT_THROW (
251- toSubfieldFilter (parseCallExpr (" a + b" , type)),
252- " Unsupported expression for range filter" );
253-
254- VELOX_ASSERT_THROW (
255- toSubfieldFilter (parseCallExpr (" (a + b > 0) OR (c = 1)" , type)),
256- " Unsupported expression for range filter" );
257-
258- // TODO Improve error message for this specific use case. Then use
259- // VELOX_ASSERT_THROW.
260- EXPECT_THROW (
261- toSubfieldFilter (parseCallExpr (" a = 1 OR c = 2" , type)),
262- VeloxRuntimeError);
263-
264- VELOX_ASSERT_THROW (
265- toSubfieldFilter (parseCallExpr (" a = 1 AND b = 2" , type)),
266- " Unsupported expression for range filter" );
267- }
268-
269214TEST_F (ExprToSubfieldFilterTest, like) {
270215 auto call = parseCallExpr (" a like 'foo%'" , ROW ({{" a" , VARCHAR ()}}));
271216 auto [subfield, filter] = leafCallToSubfieldFilter (call);
@@ -306,115 +251,5 @@ TEST_F(ExprToSubfieldFilterTest, dereferenceWithEmptyField) {
306251 ASSERT_FALSE (filter);
307252}
308253
309- class CustomExprToSubfieldFilterParser : public ExprToSubfieldFilterParser {
310- public:
311- std::pair<common::Subfield, std::unique_ptr<common::Filter>> toSubfieldFilter (
312- const core::TypedExprPtr& expr,
313- core::ExpressionEvaluator* evaluator) override {
314- if (expr->isCallKind ();
315- auto * call = expr->asUnchecked <core::CallTypedExpr>()) {
316- if (call->name () == " or" ) {
317- auto left = toSubfieldFilter (call->inputs ()[0 ], evaluator);
318- auto right = toSubfieldFilter (call->inputs ()[1 ], evaluator);
319- VELOX_CHECK (left.first == right.first );
320- return {
321- std::move (left.first ),
322- makeOrFilter (std::move (left.second ), std::move (right.second ))};
323- }
324- if (call->name () == " not" ) {
325- if (auto * inner =
326- call->inputs ()[0 ]->asUnchecked <core::CallTypedExpr>()) {
327- if (auto result = leafCallToSubfieldFilter (*inner, evaluator, true )) {
328- return std::move (result.value ());
329- }
330- }
331- } else {
332- if (auto result = leafCallToSubfieldFilter (*call, evaluator, false )) {
333- return std::move (result.value ());
334- }
335- }
336- }
337- VELOX_UNSUPPORTED (
338- " Unsupported expression for range filter: {}" , expr->toString ());
339- }
340-
341- std::optional<std::pair<common::Subfield, std::unique_ptr<common::Filter>>>
342- leafCallToSubfieldFilter (
343- const core::CallTypedExpr& call,
344- core::ExpressionEvaluator* evaluator,
345- bool negated) override {
346- if (call.inputs ().empty ()) {
347- return std::nullopt ;
348- }
349-
350- const auto * leftSide = call.inputs ()[0 ].get ();
351-
352- common::Subfield subfield;
353- if (call.name () == " custom_eq" ) {
354- if (toSubfield (leftSide, subfield)) {
355- auto filter = negated ? makeNotEqualFilter (call.inputs ()[1 ], evaluator)
356- : makeEqualFilter (call.inputs ()[1 ], evaluator);
357- if (filter != nullptr ) {
358- return std::make_pair (std::move (subfield), std::move (filter));
359- }
360- return std::nullopt ;
361- }
362- } else if (call.name () == " is_null" ) {
363- if (toSubfield (call.inputs ()[0 ].get (), subfield)) {
364- if (negated) {
365- return std::make_pair (std::move (subfield), isNotNull ());
366- }
367- return std::make_pair (std::move (subfield), isNull ());
368- }
369- }
370- return std::nullopt ;
371- }
372- };
373-
374- class CustomExprToSubfieldFilterTest : public ExprToSubfieldFilterTest {
375- public:
376- static void SetUpTestSuite () {
377- functions::prestosql::registerAllScalarFunctions (" custom_" );
378- functions::registerIsNullFunction (" is_null" );
379- parse::registerTypeResolver ();
380- memory::MemoryManager::testingSetInstance (memory::MemoryManager::Options{});
381- ExprToSubfieldFilterParser::registerParser (
382- std::make_unique<CustomExprToSubfieldFilterParser>());
383- }
384-
385- static void TearDownTestSuite () {
386- ExprToSubfieldFilterParser::registerParser (
387- std::make_unique<PrestoExprToSubfieldFilterParser>());
388- }
389- };
390-
391- TEST_F (CustomExprToSubfieldFilterTest, isNull) {
392- auto call = parseCallExpr (" a is null" , ROW ({{" a" , BIGINT ()}}));
393- auto [subfield, filter] = toSubfieldFilter (call);
394- ASSERT_TRUE (filter);
395- validateSubfield (subfield, {" a" });
396- ASSERT_FALSE (filter->testInt64 (0 ));
397- ASSERT_FALSE (filter->testInt64 (42 ));
398- ASSERT_TRUE (filter->testNull ());
399- }
400-
401- TEST_F (CustomExprToSubfieldFilterTest, eq) {
402- auto call = parseCallExpr (" custom_eq(a, 42)" , ROW ({{" a" , BIGINT ()}}));
403- auto [subfield, filter] = toSubfieldFilter (call);
404- ASSERT_TRUE (filter);
405- validateSubfield (subfield, {" a" });
406- auto bigintRange = dynamic_cast <common::BigintRange*>(filter.get ());
407- ASSERT_TRUE (bigintRange);
408- ASSERT_EQ (bigintRange->lower (), 42 );
409- ASSERT_EQ (bigintRange->upper (), 42 );
410- ASSERT_FALSE (bigintRange->testNull ());
411- }
412-
413- TEST_F (CustomExprToSubfieldFilterTest, unsupported) {
414- auto call = parseCallExpr (" custom_neq(a, 42)" , ROW ({{" a" , BIGINT ()}}));
415- VELOX_ASSERT_USER_THROW (
416- toSubfieldFilter (call), " Unsupported expression for range filter" );
417- }
418-
419254} // namespace
420255} // namespace facebook::velox::exec
0 commit comments