This is an automated email from the ASF dual-hosted git repository.
cwylie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-druid.git
The following commit(s) were added to refs/heads/master by this push:
new def8231 add version comparator for StringComparator (#6745)
def8231 is described below
commit def823124c642586a7471a7b12dacd99b905628b
Author: dongyifeng <[email protected]>
AuthorDate: Wed Jan 9 09:17:03 2019 +0800
add version comparator for StringComparator (#6745)
* add version comparator for StringComparator
* add more test case and docs
---
docs/content/querying/filters.md | 2 +-
docs/content/querying/sorting-orders.md | 5 +++
pom.xml | 5 +++
processing/pom.xml | 5 +++
.../druid/jackson/StringComparatorModule.java | 3 +-
.../druid/query/ordering/StringComparator.java | 2 +
.../druid/query/ordering/StringComparators.java | 51 ++++++++++++++++++++++
.../query/ordering/StringComparatorsTest.java | 14 ++++++
8 files changed, 85 insertions(+), 2 deletions(-)
diff --git a/docs/content/querying/filters.md b/docs/content/querying/filters.md
index 23d733e..e126981 100644
--- a/docs/content/querying/filters.md
+++ b/docs/content/querying/filters.md
@@ -276,7 +276,7 @@ greater than, less than, greater than or equal to, less
than or equal to, and "b
|upper|String|The upper bound for the filter|no|
|lowerStrict|Boolean|Perform strict comparison on the lower bound (">" instead
of ">=")|no, default: false|
|upperStrict|Boolean|Perform strict comparison on the upper bound ("<" instead
of "<=")|no, default: false|
-|ordering|String|Specifies the sorting order to use when comparing values
against the bound. Can be one of the following values: "lexicographic",
"alphanumeric", "numeric", "strlen". See [Sorting
Orders](./sorting-orders.html) for more details.|no, default: "lexicographic"|
+|ordering|String|Specifies the sorting order to use when comparing values
against the bound. Can be one of the following values: "lexicographic",
"alphanumeric", "numeric", "strlen", "version". See [Sorting
Orders](./sorting-orders.html) for more details.|no, default: "lexicographic"|
|extractionFn|[Extraction function](#filtering-with-extraction-functions)|
Extraction function to apply to the dimension|no|
Bound filters support the use of extraction functions, see [Filtering with
Extraction Functions](#filtering-with-extraction-functions) for details.
diff --git a/docs/content/querying/sorting-orders.md
b/docs/content/querying/sorting-orders.md
index 2604b52..5c83ac4 100644
--- a/docs/content/querying/sorting-orders.md
+++ b/docs/content/querying/sorting-orders.md
@@ -47,3 +47,8 @@ When comparing two unparseable values (e.g., "hello" and
"world"), this ordering
## Strlen
Sorts values by the their string lengths. When there is a tie, this comparator
falls back to using the String compareTo method.
+
+## Version
+Sorts values as versions, e.g.: "10.0 sorts after 9.0", "1.0.0-SNAPSHOT sorts
after 1.0.0".
+
+See
https://maven.apache.org/ref/3.6.0/maven-artifact/apidocs/org/apache/maven/artifact/versioning/ComparableVersion.html
for more details on how this ordering sorts values.
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index d9c1387..03bf814 100644
--- a/pom.xml
+++ b/pom.xml
@@ -749,6 +749,11 @@
<artifactId>caffeine</artifactId>
<version>${caffeine.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-artifact</artifactId>
+ <version>3.6.0</version>
+ </dependency>
<dependency>
<groupId>org.apache.calcite</groupId>
diff --git a/processing/pom.xml b/processing/pom.xml
index 542c3f2..714a1f2 100644
--- a/processing/pom.xml
+++ b/processing/pom.xml
@@ -116,6 +116,11 @@
<artifactId>checker</artifactId>
<version>${checkerframework.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-artifact</artifactId>
+ </dependency>
+
<!-- Tests -->
<dependency>
diff --git
a/processing/src/main/java/org/apache/druid/jackson/StringComparatorModule.java
b/processing/src/main/java/org/apache/druid/jackson/StringComparatorModule.java
index a072ba1..4b7ea29 100644
---
a/processing/src/main/java/org/apache/druid/jackson/StringComparatorModule.java
+++
b/processing/src/main/java/org/apache/druid/jackson/StringComparatorModule.java
@@ -36,7 +36,8 @@ public class StringComparatorModule extends SimpleModule
new NamedType(StringComparators.LexicographicComparator.class,
StringComparators.LEXICOGRAPHIC_NAME),
new NamedType(StringComparators.AlphanumericComparator.class,
StringComparators.ALPHANUMERIC_NAME),
new NamedType(StringComparators.StrlenComparator.class,
StringComparators.STRLEN_NAME),
- new NamedType(StringComparators.NumericComparator.class,
StringComparators.NUMERIC_NAME)
+ new NamedType(StringComparators.NumericComparator.class,
StringComparators.NUMERIC_NAME),
+ new NamedType(StringComparators.VersionComparator.class,
StringComparators.VERSION_NAME)
);
}
diff --git
a/processing/src/main/java/org/apache/druid/query/ordering/StringComparator.java
b/processing/src/main/java/org/apache/druid/query/ordering/StringComparator.java
index 33016c4..8e66baf 100644
---
a/processing/src/main/java/org/apache/druid/query/ordering/StringComparator.java
+++
b/processing/src/main/java/org/apache/druid/query/ordering/StringComparator.java
@@ -39,6 +39,8 @@ public abstract class StringComparator implements
Comparator<String>
return StringComparators.STRLEN;
case StringComparators.NUMERIC_NAME:
return StringComparators.NUMERIC;
+ case StringComparators.VERSION_NAME:
+ return StringComparators.VERSION;
default:
throw new IAE("Unknown string comparator[%s]", type);
}
diff --git
a/processing/src/main/java/org/apache/druid/query/ordering/StringComparators.java
b/processing/src/main/java/org/apache/druid/query/ordering/StringComparators.java
index dae5cda..879e5a4 100644
---
a/processing/src/main/java/org/apache/druid/query/ordering/StringComparators.java
+++
b/processing/src/main/java/org/apache/druid/query/ordering/StringComparators.java
@@ -24,6 +24,7 @@ import com.google.common.primitives.Ints;
import com.google.common.primitives.UnsignedBytes;
import org.apache.druid.common.guava.GuavaUtils;
import org.apache.druid.java.util.common.StringUtils;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import java.math.BigDecimal;
import java.util.Comparator;
@@ -34,16 +35,19 @@ public class StringComparators
public static final String ALPHANUMERIC_NAME = "alphanumeric";
public static final String NUMERIC_NAME = "numeric";
public static final String STRLEN_NAME = "strlen";
+ public static final String VERSION_NAME = "version";
public static final StringComparator LEXICOGRAPHIC = new
LexicographicComparator();
public static final StringComparator ALPHANUMERIC = new
AlphanumericComparator();
public static final StringComparator NUMERIC = new NumericComparator();
public static final StringComparator STRLEN = new StrlenComparator();
+ public static final StringComparator VERSION = new VersionComparator();
public static final int LEXICOGRAPHIC_CACHE_ID = 0x01;
public static final int ALPHANUMERIC_CACHE_ID = 0x02;
public static final int NUMERIC_CACHE_ID = 0x03;
public static final int STRLEN_CACHE_ID = 0x04;
+ public static final int VERSION_CACHE_ID = 0x05;
public static class LexicographicComparator extends StringComparator
{
@@ -416,4 +420,51 @@ public class StringComparators
return new byte[]{(byte) NUMERIC_CACHE_ID};
}
}
+
+ public static class VersionComparator extends StringComparator
+ {
+ @Override
+ public int compare(String o1, String o2)
+ {
+ //noinspection StringEquality
+ if (o1 == o2) {
+ return 0;
+ }
+ if (o1 == null) {
+ return -1;
+ }
+ if (o2 == null) {
+ return 1;
+ }
+
+ DefaultArtifactVersion version1 = new DefaultArtifactVersion(o1);
+ DefaultArtifactVersion version2 = new DefaultArtifactVersion(o2);
+ return version1.compareTo(version2);
+ }
+
+ @Override
+ public String toString()
+ {
+ return StringComparators.VERSION_NAME;
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public byte[] getCacheKey()
+ {
+ return new byte[]{(byte) VERSION_CACHE_ID};
+ }
+ }
}
diff --git
a/processing/src/test/java/org/apache/druid/query/ordering/StringComparatorsTest.java
b/processing/src/test/java/org/apache/druid/query/ordering/StringComparatorsTest.java
index 3b48420..7fa0a3b 100644
---
a/processing/src/test/java/org/apache/druid/query/ordering/StringComparatorsTest.java
+++
b/processing/src/test/java/org/apache/druid/query/ordering/StringComparatorsTest.java
@@ -143,6 +143,20 @@ public class StringComparatorsTest
}
@Test
+ public void testVersionComparator()
+ {
+ commonTest(StringComparators.VERSION);
+
+ Assert.assertTrue(StringComparators.VERSION.compare("02", "002") == 0);
+ Assert.assertTrue(StringComparators.VERSION.compare("1.0", "2.0") < 0);
+ Assert.assertTrue(StringComparators.VERSION.compare("9.1", "10.0") < 0);
+ Assert.assertTrue(StringComparators.VERSION.compare("1.1.1", "2.0") < 0);
+ Assert.assertTrue(StringComparators.VERSION.compare("1.0-SNAPSHOT", "1.0")
< 0);
+ Assert.assertTrue(StringComparators.VERSION.compare("2.0.1-xyz-1",
"2.0.1-1-xyz") < 0);
+ Assert.assertTrue(StringComparators.VERSION.compare("1.0-SNAPSHOT",
"1.0-Final") < 0);
+ }
+
+ @Test
public void testLexicographicComparatorSerdeTest() throws IOException
{
ObjectMapper jsonMapper = new DefaultObjectMapper();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]