diff --git a/common/src/main/java/io/druid/timeline/TimelineLookup.java b/common/src/main/java/io/druid/timeline/TimelineLookup.java index 2ba832e9bf7..89810376fa2 100644 --- a/common/src/main/java/io/druid/timeline/TimelineLookup.java +++ b/common/src/main/java/io/druid/timeline/TimelineLookup.java @@ -31,7 +31,7 @@ public interface TimelineLookup * @param interval interval to find objects for * * @return Holders representing the interval that the objects exist for, PartitionHolders - * are guaranteed to be complete + * are guaranteed to be complete. Holders returned sorted by the interval. */ public Iterable> lookup(Interval interval); diff --git a/common/src/main/java/io/druid/timeline/UnionTimeLineLookup.java b/common/src/main/java/io/druid/timeline/UnionTimeLineLookup.java index 3233b639b5a..18302fe08bc 100644 --- a/common/src/main/java/io/druid/timeline/UnionTimeLineLookup.java +++ b/common/src/main/java/io/druid/timeline/UnionTimeLineLookup.java @@ -20,9 +20,12 @@ package io.druid.timeline; import com.google.common.base.Function; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; +import com.metamx.common.guava.Comparators; import io.druid.timeline.partition.PartitionHolder; import org.joda.time.Interval; +import java.util.Comparator; + public class UnionTimeLineLookup implements TimelineLookup { @@ -37,7 +40,7 @@ public class UnionTimeLineLookup implements TimelineLoo @Override public Iterable> lookup(final Interval interval) { - return Iterables.concat( + return Iterables.mergeSorted( Iterables.transform( delegates, new Function, Iterable>>() @@ -48,7 +51,17 @@ public class UnionTimeLineLookup implements TimelineLoo return input.lookup(interval); } } - ) + ), + new Comparator>() + { + @Override + public int compare( + TimelineObjectHolder o1, TimelineObjectHolder o2 + ) + { + return Comparators.intervalsByStartThenEnd().compare(o1.getInterval(), o2.getInterval()); + } + } ); } diff --git a/common/src/test/java/io/druid/timeline/VersionedIntervalTimelineTest.java b/common/src/test/java/io/druid/timeline/VersionedIntervalTimelineTest.java index 164d4d306a0..c6651199351 100644 --- a/common/src/test/java/io/druid/timeline/VersionedIntervalTimelineTest.java +++ b/common/src/test/java/io/druid/timeline/VersionedIntervalTimelineTest.java @@ -1608,10 +1608,10 @@ public class VersionedIntervalTimelineTest assertValues( Arrays.asList( createExpected("2011-04-01/2011-04-02", "3", 5), - createExpected("2011-04-02/2011-04-06", "2", 1), - createExpected("2011-04-06/2011-04-09", "3", 4), createExpected("2011-04-01/2011-04-02", "3", 5), createExpected("2011-04-02/2011-04-06", "2", 1), + createExpected("2011-04-02/2011-04-06", "2", 1), + createExpected("2011-04-06/2011-04-09", "3", 4), createExpected("2011-04-06/2011-04-09", "3", 4) ), (List)Lists.newArrayList(lookup.lookup(new Interval("2011-04-01/2011-04-09"))) @@ -1632,12 +1632,43 @@ public class VersionedIntervalTimelineTest assertValues( Arrays.asList( createExpected("2011-04-01/2011-04-02", "3", 5), - createExpected("2011-04-02/2011-04-06", "2", 1), - createExpected("2011-04-06/2011-04-09", "3", 4), createExpected("2011-04-01/2011-04-02", "3", 5), createExpected("2011-04-02/2011-04-06", "2", 1), + createExpected("2011-04-02/2011-04-06", "2", 1), + createExpected("2011-04-06/2011-04-09", "3", 4), createExpected("2011-04-06/2011-04-09", "3", 4) ), (List)Lists.newArrayList(lookup.lookup(new Interval("2011-04-01/2011-04-09"))) ); } + + @Test + public void testUnionTimeLineLookupReturnsSortedValues() + { + timeline = makeStringIntegerTimeline(); + add("2011-04-02/2011-04-06", "1", 1); + add("2011-04-03/2011-04-09", "9", 2); + VersionedIntervalTimeline t1 = timeline; + timeline = makeStringIntegerTimeline(); + add("2011-04-01/2011-04-03", "2", 1); + add("2011-04-03/2011-04-10", "8", 2); + VersionedIntervalTimeline t2 = timeline; + TimelineLookup lookup = new UnionTimeLineLookup( + Arrays.>asList( + t1, t2 + ) + ); + assertValues( + Arrays.asList( + createExpected("2011-04-01/2011-04-03", "2", 1), + createExpected("2011-04-02/2011-04-03", "1", 1), + createExpected("2011-04-03/2011-04-09", "9", 2), + createExpected("2011-04-03/2011-04-10", "8", 2) + + ), + (List) Lists.newArrayList(lookup.lookup(new Interval("2011-04-01/2011-04-11"))) + ); + } + + + } diff --git a/processing/src/main/java/io/druid/query/QueryToolChest.java b/processing/src/main/java/io/druid/query/QueryToolChest.java index 2ee3de4b90a..4b0e576482a 100644 --- a/processing/src/main/java/io/druid/query/QueryToolChest.java +++ b/processing/src/main/java/io/druid/query/QueryToolChest.java @@ -76,6 +76,11 @@ public abstract class QueryToolChest List filterSegments(QueryType query, List segments) { return segments;