mirror of https://github.com/apache/druid.git
Merge pull request #1535 from metamx/alphanum-docs-tests
Update alphanumeric sort docs + more tests / examples
This commit is contained in:
commit
19af3bc9bc
|
@ -47,7 +47,7 @@ The grammar for dimension values sorted lexicographically is as follows:
|
||||||
## AlphaNumeric TopNMetricSpec
|
## AlphaNumeric TopNMetricSpec
|
||||||
|
|
||||||
Sort dimension values in alpha-numeric order, i.e treating numbers differently from other characters in sorting the values.
|
Sort dimension values in alpha-numeric order, i.e treating numbers differently from other characters in sorting the values.
|
||||||
See [http://www.davekoelle.com/alphanum.html](http://www.davekoelle.com/alphanum.html) for details on how the algorithm works.
|
The algorithm is based on [https://github.com/amjjd/java-alphanum](https://github.com/amjjd/java-alphanum).
|
||||||
|
|
||||||
```json
|
```json
|
||||||
"metric": {
|
"metric": {
|
||||||
|
|
|
@ -18,14 +18,16 @@
|
||||||
package io.druid.query.topn;
|
package io.druid.query.topn;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import io.druid.jackson.DefaultObjectMapper;
|
import io.druid.jackson.DefaultObjectMapper;
|
||||||
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
public class AlphaNumericTopNMetricSpecTest
|
public class AlphaNumericTopNMetricSpecTest
|
||||||
{
|
{
|
||||||
|
@ -36,33 +38,55 @@ public class AlphaNumericTopNMetricSpecTest
|
||||||
final Comparator<String> comparator = AlphaNumericTopNMetricSpec.comparator;
|
final Comparator<String> comparator = AlphaNumericTopNMetricSpec.comparator;
|
||||||
|
|
||||||
// equality
|
// equality
|
||||||
assertEquals(0, comparator.compare("", ""));
|
Assert.assertEquals(0, comparator.compare("", ""));
|
||||||
assertEquals(0, comparator.compare("abc", "abc"));
|
Assert.assertEquals(0, comparator.compare("abc", "abc"));
|
||||||
assertEquals(0, comparator.compare("123", "123"));
|
Assert.assertEquals(0, comparator.compare("123", "123"));
|
||||||
assertEquals(0, comparator.compare("abc123", "abc123"));
|
Assert.assertEquals(0, comparator.compare("abc123", "abc123"));
|
||||||
|
|
||||||
// empty strings < non-empty
|
// empty strings < non-empty
|
||||||
assertTrue(comparator.compare("", "abc") < 0);
|
Assert.assertTrue(comparator.compare("", "abc") < 0);
|
||||||
assertTrue(comparator.compare("abc", "") > 0);
|
Assert.assertTrue(comparator.compare("abc", "") > 0);
|
||||||
|
|
||||||
// numbers < non numeric
|
// numbers < non numeric
|
||||||
assertTrue(comparator.compare("123", "abc") < 0);
|
Assert.assertTrue(comparator.compare("123", "abc") < 0);
|
||||||
assertTrue(comparator.compare("abc", "123") > 0);
|
Assert.assertTrue(comparator.compare("abc", "123") > 0);
|
||||||
|
|
||||||
// numbers ordered numerically
|
// numbers ordered numerically
|
||||||
assertTrue(comparator.compare("2", "11") < 0);
|
Assert.assertTrue(comparator.compare("2", "11") < 0);
|
||||||
assertTrue(comparator.compare("a2", "a11") < 0);
|
Assert.assertTrue(comparator.compare("a2", "a11") < 0);
|
||||||
|
|
||||||
// leading zeroes
|
// leading zeroes
|
||||||
assertTrue(comparator.compare("02", "11") < 0);
|
Assert.assertTrue(comparator.compare("02", "11") < 0);
|
||||||
assertTrue(comparator.compare("02", "002") < 0);
|
Assert.assertTrue(comparator.compare("02", "002") < 0);
|
||||||
|
|
||||||
// decimal points ...
|
// decimal points ...
|
||||||
assertTrue(comparator.compare("1.3", "1.5") < 0);
|
Assert.assertTrue(comparator.compare("1.3", "1.5") < 0);
|
||||||
|
|
||||||
// ... don't work too well
|
// ... don't work too well
|
||||||
assertTrue(comparator.compare("1.3", "1.15") < 0);
|
Assert.assertTrue(comparator.compare("1.3", "1.15") < 0);
|
||||||
|
|
||||||
|
// but you can sort ranges
|
||||||
|
List<String> sorted = Lists.newArrayList("1-5", "11-15", "16-20", "21-25", "26-30", "6-10", "Other");
|
||||||
|
Collections.sort(sorted, comparator);
|
||||||
|
|
||||||
|
Assert.assertEquals(
|
||||||
|
ImmutableList.of("1-5", "6-10", "11-15", "16-20", "21-25", "26-30", "Other"),
|
||||||
|
sorted
|
||||||
|
);
|
||||||
|
|
||||||
|
List<String> sortedFixedDecimal = Lists.newArrayList(
|
||||||
|
"Other", "[0.00-0.05)", "[0.05-0.10)", "[0.10-0.50)", "[0.50-1.00)",
|
||||||
|
"[1.00-5.00)", "[5.00-10.00)", "[10.00-20.00)"
|
||||||
|
);
|
||||||
|
Collections.sort(sortedFixedDecimal, comparator);
|
||||||
|
|
||||||
|
Assert.assertEquals(
|
||||||
|
ImmutableList.of(
|
||||||
|
"[0.00-0.05)", "[0.05-0.10)", "[0.10-0.50)", "[0.50-1.00)",
|
||||||
|
"[1.00-5.00)", "[5.00-10.00)", "[10.00-20.00)", "Other"
|
||||||
|
),
|
||||||
|
sortedFixedDecimal
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -79,7 +103,7 @@ public class AlphaNumericTopNMetricSpecTest
|
||||||
ObjectMapper jsonMapper = new DefaultObjectMapper();
|
ObjectMapper jsonMapper = new DefaultObjectMapper();
|
||||||
TopNMetricSpec actualMetricSpec = jsonMapper.readValue(jsonMapper.writeValueAsString(jsonMapper.readValue(jsonSpec, TopNMetricSpec.class)), AlphaNumericTopNMetricSpec.class);
|
TopNMetricSpec actualMetricSpec = jsonMapper.readValue(jsonMapper.writeValueAsString(jsonMapper.readValue(jsonSpec, TopNMetricSpec.class)), AlphaNumericTopNMetricSpec.class);
|
||||||
TopNMetricSpec actualMetricSpec1 = jsonMapper.readValue(jsonMapper.writeValueAsString(jsonMapper.readValue(jsonSpec1, TopNMetricSpec.class)), AlphaNumericTopNMetricSpec.class);
|
TopNMetricSpec actualMetricSpec1 = jsonMapper.readValue(jsonMapper.writeValueAsString(jsonMapper.readValue(jsonSpec1, TopNMetricSpec.class)), AlphaNumericTopNMetricSpec.class);
|
||||||
assertEquals(expectedMetricSpec, actualMetricSpec);
|
Assert.assertEquals(expectedMetricSpec, actualMetricSpec);
|
||||||
assertEquals(expectedMetricSpec1, actualMetricSpec1);
|
Assert.assertEquals(expectedMetricSpec1, actualMetricSpec1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue