Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import io.druid.query.aggregation.AggregatorFactory;
import io.druid.query.aggregation.PostAggregator;
import io.druid.query.dimension.DimensionSpec;
import io.druid.query.ordering.StringComparators.StringComparator;

import javax.annotation.Nullable;
import java.nio.ByteBuffer;
Expand Down Expand Up @@ -139,7 +140,7 @@ public int compare(Row left, Row right)
} else if (aggregatorsMap.containsKey(columnName)) {
nextOrdering = metricOrdering(columnName, aggregatorsMap.get(columnName).getComparator());
} else if (dimensionsMap.containsKey(columnName)) {
nextOrdering = dimensionOrdering(columnName);
nextOrdering = dimensionOrdering(columnName, columnSpec.getDimensionComparator());
}

if (nextOrdering == null) {
Expand Down Expand Up @@ -170,9 +171,9 @@ public int compare(Row left, Row right)
};
}

private Ordering<Row> dimensionOrdering(final String dimension)
private Ordering<Row> dimensionOrdering(final String dimension, final StringComparator comparator)
{
return Ordering.natural()
return Ordering.from(comparator)
.nullsFirst()
.onResultOf(
new Function<Row, String>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@
import com.metamx.common.ISE;
import com.metamx.common.StringUtils;

import io.druid.query.ordering.StringComparators;
import io.druid.query.ordering.StringComparators.StringComparator;

import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.util.Arrays;
Expand All @@ -45,6 +48,8 @@ public static enum Direction
DESCENDING
}

public static final StringComparator DEFAULT_DIMENSION_ORDER = StringComparators.LEXICOGRAPHIC;

/**
* Maintain a map of the enum values so that we can just do a lookup and get a null if it doesn't exist instead
* of an exception thrown.
Expand All @@ -61,29 +66,31 @@ public static enum Direction

private final String dimension;
private final Direction direction;
private final StringComparator dimensionComparator;

@JsonCreator
public static OrderByColumnSpec create(Object obj)
{
Preconditions.checkNotNull(obj, "Cannot build an OrderByColumnSpec from a null object.");

if (obj instanceof String) {
return new OrderByColumnSpec(obj.toString(), null);
return new OrderByColumnSpec(obj.toString(), null, null);
} else if (obj instanceof Map) {
final Map map = (Map) obj;

final String dimension = map.get("dimension").toString();
final Direction direction = determineDirection(map.get("direction"));
final StringComparator dimensionComparator = determinDimensionComparator(map.get("dimensionOrder"));

return new OrderByColumnSpec(dimension, direction);
return new OrderByColumnSpec(dimension, direction, dimensionComparator);
} else {
throw new ISE("Cannot build an OrderByColumnSpec from a %s", obj.getClass());
}
}

public static OrderByColumnSpec asc(String dimension)
{
return new OrderByColumnSpec(dimension, Direction.ASCENDING);
return new OrderByColumnSpec(dimension, Direction.ASCENDING, null);
}

public static List<OrderByColumnSpec> ascending(String... dimension)
Expand All @@ -103,7 +110,7 @@ public OrderByColumnSpec apply(@Nullable String input)

public static OrderByColumnSpec desc(String dimension)
{
return new OrderByColumnSpec(dimension, Direction.DESCENDING);
return new OrderByColumnSpec(dimension, Direction.DESCENDING, null);
}

public static List<OrderByColumnSpec> descending(String... dimension)
Expand All @@ -125,9 +132,19 @@ public OrderByColumnSpec(
String dimension,
Direction direction
)
{
this(dimension, direction, null);
}

public OrderByColumnSpec(
String dimension,
Direction direction,
StringComparator dimensionComparator
)
{
this.dimension = dimension;
this.direction = direction == null ? Direction.ASCENDING : direction;
this.dimensionComparator = dimensionComparator == null ? DEFAULT_DIMENSION_ORDER : dimensionComparator;
}

@JsonProperty
Expand All @@ -142,6 +159,12 @@ public Direction getDirection()
return direction;
}

@JsonProperty
public StringComparator getDimensionComparator()
{
return dimensionComparator;
}

public static Direction determineDirection(Object directionObj)
{
if (directionObj == null) {
Expand Down Expand Up @@ -172,6 +195,16 @@ public static Direction determineDirection(Object directionObj)
return direction;
}

private static StringComparator determinDimensionComparator(Object dimensionOrderObj)
{
if (dimensionOrderObj == null) {
return DEFAULT_DIMENSION_ORDER;
}

String dimensionOrderString = dimensionOrderObj.toString().toLowerCase();
return StringComparators.makeComparator(dimensionOrderString);
}

@Override
public boolean equals(Object o)
{
Expand All @@ -187,6 +220,9 @@ public boolean equals(Object o)
if (!dimension.equals(that.dimension)) {
return false;
}
if (!dimensionComparator.equals(that.dimensionComparator)) {
return false;
}
return direction == that.direction;

}
Expand All @@ -196,6 +232,7 @@ public int hashCode()
{
int result = dimension.hashCode();
result = 31 * result + direction.hashCode();
result = 31 * result + dimensionComparator.hashCode();
return result;
}

Expand All @@ -204,7 +241,8 @@ public String toString()
{
return "OrderByColumnSpec{" +
"dimension='" + dimension + '\'' +
", direction=" + direction +
", direction=" + direction + '\'' +
", dimensionComparator='" + dimensionComparator + '\'' +
'}';
}

Expand Down
Loading