mirror of https://github.com/apache/druid.git
Segment filtering should be done by looking at the inner most query o… (#5496)
* Segment filtering should be done by looking at the inner most query of a nested query * Fixing checkstyle errors * Addressing code review comments
This commit is contained in:
parent
30e6bdedf3
commit
afa25202a3
|
@ -20,6 +20,7 @@
|
||||||
package io.druid.query;
|
package io.druid.query;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
@ -109,7 +110,21 @@ public abstract class BaseQuery<T extends Comparable<T>> implements Query<T>
|
||||||
@Override
|
@Override
|
||||||
public QueryRunner<T> getRunner(QuerySegmentWalker walker)
|
public QueryRunner<T> getRunner(QuerySegmentWalker walker)
|
||||||
{
|
{
|
||||||
return querySegmentSpec.lookup(this, walker);
|
return getQuerySegmentSpecForLookUp(this).lookup(this, walker);
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public static QuerySegmentSpec getQuerySegmentSpecForLookUp(BaseQuery query)
|
||||||
|
{
|
||||||
|
if (query.getDataSource() instanceof QueryDataSource) {
|
||||||
|
QueryDataSource ds = (QueryDataSource) query.getDataSource();
|
||||||
|
Query subquery = ds.getQuery();
|
||||||
|
if (subquery instanceof BaseQuery) {
|
||||||
|
return getQuerySegmentSpecForLookUp((BaseQuery) subquery);
|
||||||
|
}
|
||||||
|
throw new IllegalStateException("Invalid subquery type " + subquery.getClass());
|
||||||
|
}
|
||||||
|
return query.getQuerySegmentSpec();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -26,7 +26,9 @@ import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Ordering;
|
import com.google.common.collect.Ordering;
|
||||||
import io.druid.data.input.MapBasedRow;
|
import io.druid.data.input.MapBasedRow;
|
||||||
import io.druid.data.input.Row;
|
import io.druid.data.input.Row;
|
||||||
|
import io.druid.java.util.common.Intervals;
|
||||||
import io.druid.java.util.common.granularity.Granularities;
|
import io.druid.java.util.common.granularity.Granularities;
|
||||||
|
import io.druid.query.BaseQuery;
|
||||||
import io.druid.query.Query;
|
import io.druid.query.Query;
|
||||||
import io.druid.query.QueryRunnerTestHelper;
|
import io.druid.query.QueryRunnerTestHelper;
|
||||||
import io.druid.query.aggregation.AggregatorFactory;
|
import io.druid.query.aggregation.AggregatorFactory;
|
||||||
|
@ -38,6 +40,8 @@ import io.druid.query.dimension.DimensionSpec;
|
||||||
import io.druid.query.groupby.orderby.DefaultLimitSpec;
|
import io.druid.query.groupby.orderby.DefaultLimitSpec;
|
||||||
import io.druid.query.groupby.orderby.OrderByColumnSpec;
|
import io.druid.query.groupby.orderby.OrderByColumnSpec;
|
||||||
import io.druid.query.ordering.StringComparators;
|
import io.druid.query.ordering.StringComparators;
|
||||||
|
import io.druid.query.spec.MultipleIntervalSegmentSpec;
|
||||||
|
import io.druid.query.spec.QuerySegmentSpec;
|
||||||
import io.druid.segment.TestHelper;
|
import io.druid.segment.TestHelper;
|
||||||
import io.druid.segment.column.ValueType;
|
import io.druid.segment.column.ValueType;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
@ -45,6 +49,7 @@ import org.junit.Test;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class GroupByQueryTest
|
public class GroupByQueryTest
|
||||||
{
|
{
|
||||||
|
@ -103,4 +108,28 @@ public class GroupByQueryTest
|
||||||
);
|
);
|
||||||
Assert.assertEquals(-1, compare);
|
Assert.assertEquals(-1, compare);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSegmentLookUpForNestedQueries()
|
||||||
|
{
|
||||||
|
QuerySegmentSpec innerQuerySegmentSpec = new MultipleIntervalSegmentSpec(Lists.newArrayList(Intervals.of(
|
||||||
|
"2011-11-07/2011-11-08")));
|
||||||
|
QuerySegmentSpec outerQuerySegmentSpec = new MultipleIntervalSegmentSpec(Lists.newArrayList((Intervals.of(
|
||||||
|
"2011-11-04/2011-11-08"))));
|
||||||
|
List<AggregatorFactory> aggs = Lists.newArrayList(QueryRunnerTestHelper.rowsCount);
|
||||||
|
final GroupByQuery innerQuery = GroupByQuery.builder()
|
||||||
|
.setDataSource("blah")
|
||||||
|
.setInterval(innerQuerySegmentSpec)
|
||||||
|
.setGranularity(Granularities.DAY)
|
||||||
|
.setAggregatorSpecs(aggs)
|
||||||
|
.build();
|
||||||
|
final GroupByQuery query = GroupByQuery
|
||||||
|
.builder()
|
||||||
|
.setDataSource(innerQuery)
|
||||||
|
.setInterval(outerQuerySegmentSpec)
|
||||||
|
.setAggregatorSpecs(aggs)
|
||||||
|
.setGranularity(Granularities.DAY)
|
||||||
|
.build();
|
||||||
|
Assert.assertEquals(innerQuerySegmentSpec, BaseQuery.getQuerySegmentSpecForLookUp(query));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue