This is an automated email from the ASF dual-hosted git repository.
diwu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-spark-connector.git
The following commit(s) were added to refs/heads/master by this push:
new 3901055 [feature] support not equals and like and not like filter
push down (#219)
3901055 is described below
commit 390105505a09c9bdc2073094239b629c5d7ce61c
Author: gnehil <[email protected]>
AuthorDate: Mon Jul 29 16:24:17 2024 +0800
[feature] support not equals and like and not like filter push down (#219)
---
.../scala/org/apache/doris/spark/sql/Utils.scala | 7 +++++++
.../org/apache/doris/spark/sql/TestUtils.scala | 21 ++++++++++++++++++---
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git
a/spark-doris-connector/src/main/scala/org/apache/doris/spark/sql/Utils.scala
b/spark-doris-connector/src/main/scala/org/apache/doris/spark/sql/Utils.scala
index 7cffbe5..0400b04 100644
---
a/spark-doris-connector/src/main/scala/org/apache/doris/spark/sql/Utils.scala
+++
b/spark-doris-connector/src/main/scala/org/apache/doris/spark/sql/Utils.scala
@@ -51,6 +51,7 @@ private[spark] object Utils {
def compileFilter(filter: Filter, dialect: JdbcDialect, inValueLengthLimit:
Int): Option[String] = {
Option(filter match {
case EqualTo(attribute, value) => s"${quote(attribute)} =
${compileValue(value)}"
+ case Not(EqualTo(attribute, value)) => s"${quote(attribute)} !=
${compileValue(value)}"
case GreaterThan(attribute, value) => s"${quote(attribute)} >
${compileValue(value)}"
case GreaterThanOrEqual(attribute, value) => s"${quote(attribute)} >=
${compileValue(value)}"
case LessThan(attribute, value) => s"${quote(attribute)} <
${compileValue(value)}"
@@ -83,6 +84,12 @@ private[spark] object Utils {
} else {
null
}
+ case StringContains(attribute, value) => s"${quote(attribute)} like
'%$value%'"
+ case Not(StringContains(attribute, value)) => s"${quote(attribute)} not
like '%$value%'"
+ case StringEndsWith(attribute, value) => s"${quote(attribute)} like
'%$value'"
+ case Not(StringEndsWith(attribute, value)) => s"${quote(attribute)} not
like '%$value'"
+ case StringStartsWith(attribute, value) => s"${quote(attribute)} like
'$value%'"
+ case Not(StringStartsWith(attribute, value)) => s"${quote(attribute)}
not like '$value%'"
case _ => null
})
}
diff --git
a/spark-doris-connector/src/test/scala/org/apache/doris/spark/sql/TestUtils.scala
b/spark-doris-connector/src/test/scala/org/apache/doris/spark/sql/TestUtils.scala
index b1affbf..7e7919a 100644
---
a/spark-doris-connector/src/test/scala/org/apache/doris/spark/sql/TestUtils.scala
+++
b/spark-doris-connector/src/test/scala/org/apache/doris/spark/sql/TestUtils.scala
@@ -34,6 +34,7 @@ class TestUtils extends ExpectedExceptionTest {
val inValueLengthLimit = 5
val equalFilter = EqualTo("left", 5)
+ val notEqualFilter = Not(EqualTo("left", 5))
val greaterThanFilter = GreaterThan("left", 5)
val greaterThanOrEqualFilter = GreaterThanOrEqual("left", 5)
val lessThanFilter = LessThan("left", 5)
@@ -41,15 +42,22 @@ class TestUtils extends ExpectedExceptionTest {
val validInFilter = In("left", Array(1, 2, 3, 4))
val emptyInFilter = In("left", Array.empty)
val invalidInFilter = In("left", Array(1, 2, 3, 4, 5))
+ val notInFilter = Not(In("left", Array(1, 2, 3)))
val isNullFilter = IsNull("left")
val isNotNullFilter = IsNotNull("left")
- val notSupportFilter = StringContains("left", "right")
val validAndFilter = And(equalFilter, greaterThanFilter)
- val invalidAndFilter = And(equalFilter, notSupportFilter)
+ val invalidAndFilter = And(equalFilter, invalidInFilter)
val validOrFilter = Or(equalFilter, greaterThanFilter)
- val invalidOrFilter = Or(equalFilter, notSupportFilter)
+ val invalidOrFilter = Or(equalFilter, invalidInFilter)
+ val stringContainsFilter = StringContains("left", "right")
+ val notStringContainsFilter = Not(StringContains("left", "right"))
+ val stringEndsWithFilter = StringEndsWith("left", "right")
+ val notStringEndsWithFilter = Not(StringEndsWith("left", "right"))
+ val stringStartsWithFilter = StringStartsWith("left", "right")
+ val notStringStartsWithFilter = Not(StringStartsWith("left", "right"))
Assert.assertEquals("`left` = 5", Utils.compileFilter(equalFilter,
dialect, inValueLengthLimit).get)
+ Assert.assertEquals("`left` != 5", Utils.compileFilter(notEqualFilter,
dialect, inValueLengthLimit).get)
Assert.assertEquals("`left` > 5", Utils.compileFilter(greaterThanFilter,
dialect, inValueLengthLimit).get)
Assert.assertEquals("`left` >= 5",
Utils.compileFilter(greaterThanOrEqualFilter, dialect, inValueLengthLimit).get)
Assert.assertEquals("`left` < 5", Utils.compileFilter(lessThanFilter,
dialect, inValueLengthLimit).get)
@@ -57,6 +65,7 @@ class TestUtils extends ExpectedExceptionTest {
Assert.assertEquals("`left` in (1, 2, 3, 4)",
Utils.compileFilter(validInFilter, dialect, inValueLengthLimit).get)
Assert.assertTrue(Utils.compileFilter(emptyInFilter, dialect,
inValueLengthLimit).isEmpty)
Assert.assertTrue(Utils.compileFilter(invalidInFilter, dialect,
inValueLengthLimit).isEmpty)
+ Assert.assertEquals("`left` not in (1, 2, 3)",
Utils.compileFilter(notInFilter, dialect, inValueLengthLimit).get)
Assert.assertEquals("`left` is null", Utils.compileFilter(isNullFilter,
dialect, inValueLengthLimit).get)
Assert.assertEquals("`left` is not null",
Utils.compileFilter(isNotNullFilter, dialect, inValueLengthLimit).get)
Assert.assertEquals("(`left` = 5) and (`left` > 5)",
@@ -65,6 +74,12 @@ class TestUtils extends ExpectedExceptionTest {
Assert.assertEquals("(`left` = 5) or (`left` > 5)",
Utils.compileFilter(validOrFilter, dialect, inValueLengthLimit).get)
Assert.assertTrue(Utils.compileFilter(invalidOrFilter, dialect,
inValueLengthLimit).isEmpty)
+ Assert.assertEquals("`left` like '%right%'",
Utils.compileFilter(stringContainsFilter, dialect, inValueLengthLimit).get)
+ Assert.assertEquals("`left` not like '%right%'",
Utils.compileFilter(notStringContainsFilter, dialect, inValueLengthLimit).get)
+ Assert.assertEquals("`left` like '%right'",
Utils.compileFilter(stringEndsWithFilter, dialect, inValueLengthLimit).get)
+ Assert.assertEquals("`left` not like '%right'",
Utils.compileFilter(notStringEndsWithFilter, dialect, inValueLengthLimit).get)
+ Assert.assertEquals("`left` like 'right%'",
Utils.compileFilter(stringStartsWithFilter, dialect, inValueLengthLimit).get)
+ Assert.assertEquals("`left` not like 'right%'",
Utils.compileFilter(notStringStartsWithFilter, dialect, inValueLengthLimit).get)
}
@Test
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]