mirror of https://github.com/apache/druid.git
introducing lists of existing columns in the fields of select queries' output (#2491)
* introducing lists of existing columns in the fields of select queries' output * rebase master * address the comment. add test code for select query caching * change the cache code in SelectQueryQueryToolChest to 0x16
This commit is contained in:
parent
d624037698
commit
2e0f253c32
|
@ -19,10 +19,14 @@
|
||||||
|
|
||||||
package io.druid.query.select;
|
package io.druid.query.select;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.metamx.common.guava.nary.BinaryFn;
|
import com.metamx.common.guava.nary.BinaryFn;
|
||||||
import io.druid.granularity.AllGranularity;
|
import io.druid.granularity.AllGranularity;
|
||||||
import io.druid.granularity.QueryGranularity;
|
import io.druid.granularity.QueryGranularity;
|
||||||
import io.druid.query.Result;
|
import io.druid.query.Result;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -77,6 +81,9 @@ public class SelectBinaryFn
|
||||||
|
|
||||||
SelectResultValueBuilder builder = new SelectResultValueBuilder.MergeBuilder(timestamp, pagingSpec, descending);
|
SelectResultValueBuilder builder = new SelectResultValueBuilder.MergeBuilder(timestamp, pagingSpec, descending);
|
||||||
|
|
||||||
|
builder.addDimensions(mergeColumns(arg1.getValue().getDimensions(), arg2.getValue().getDimensions()));
|
||||||
|
builder.addMetrics(mergeColumns(arg1.getValue().getMetrics(), arg2.getValue().getMetrics()));
|
||||||
|
|
||||||
for (EventHolder event : arg1Val) {
|
for (EventHolder event : arg1Val) {
|
||||||
builder.addEntry(event);
|
builder.addEntry(event);
|
||||||
}
|
}
|
||||||
|
@ -87,4 +94,21 @@ public class SelectBinaryFn
|
||||||
|
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Set<String> mergeColumns(final Set<String> arg1, final Set<String> arg2)
|
||||||
|
{
|
||||||
|
if (arg1.isEmpty()) {
|
||||||
|
return arg2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arg2.isEmpty()) {
|
||||||
|
return arg1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arg1.equals(arg2)) {
|
||||||
|
return arg1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Sets.union(arg1, arg2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,12 +108,14 @@ public class SelectQueryEngine
|
||||||
for (DimensionSpec dim : dims) {
|
for (DimensionSpec dim : dims) {
|
||||||
final DimensionSelector dimSelector = cursor.makeDimensionSelector(dim);
|
final DimensionSelector dimSelector = cursor.makeDimensionSelector(dim);
|
||||||
dimSelectors.put(dim.getOutputName(), dimSelector);
|
dimSelectors.put(dim.getOutputName(), dimSelector);
|
||||||
|
builder.addDimension(dim.getOutputName());
|
||||||
}
|
}
|
||||||
|
|
||||||
final Map<String, ObjectColumnSelector> metSelectors = Maps.newHashMap();
|
final Map<String, ObjectColumnSelector> metSelectors = Maps.newHashMap();
|
||||||
for (String metric : metrics) {
|
for (String metric : metrics) {
|
||||||
final ObjectColumnSelector metricSelector = cursor.makeObjectColumnSelector(metric);
|
final ObjectColumnSelector metricSelector = cursor.makeObjectColumnSelector(metric);
|
||||||
metSelectors.put(metric, metricSelector);
|
metSelectors.put(metric, metricSelector);
|
||||||
|
builder.addMetric(metric);
|
||||||
}
|
}
|
||||||
|
|
||||||
final PagingOffset offset = query.getPagingOffset(segmentId);
|
final PagingOffset offset = query.getPagingOffset(segmentId);
|
||||||
|
|
|
@ -66,7 +66,7 @@ import java.util.TreeMap;
|
||||||
*/
|
*/
|
||||||
public class SelectQueryQueryToolChest extends QueryToolChest<Result<SelectResultValue>, SelectQuery>
|
public class SelectQueryQueryToolChest extends QueryToolChest<Result<SelectResultValue>, SelectQuery>
|
||||||
{
|
{
|
||||||
private static final byte SELECT_QUERY = 0x13;
|
private static final byte SELECT_QUERY = 0x16;
|
||||||
private static final TypeReference<Object> OBJECT_TYPE_REFERENCE =
|
private static final TypeReference<Object> OBJECT_TYPE_REFERENCE =
|
||||||
new TypeReference<Object>()
|
new TypeReference<Object>()
|
||||||
{
|
{
|
||||||
|
@ -220,6 +220,8 @@ public class SelectQueryQueryToolChest extends QueryToolChest<Result<SelectResul
|
||||||
return Arrays.asList(
|
return Arrays.asList(
|
||||||
input.getTimestamp().getMillis(),
|
input.getTimestamp().getMillis(),
|
||||||
input.getValue().getPagingIdentifiers(),
|
input.getValue().getPagingIdentifiers(),
|
||||||
|
input.getValue().getDimensions(),
|
||||||
|
input.getValue().getMetrics(),
|
||||||
input.getValue().getEvents()
|
input.getValue().getEvents()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -249,6 +251,16 @@ public class SelectQueryQueryToolChest extends QueryToolChest<Result<SelectResul
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
(Set<String>) jsonMapper.convertValue(
|
||||||
|
resultIter.next(), new TypeReference<Set<String>>()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(Set<String>) jsonMapper.convertValue(
|
||||||
|
resultIter.next(), new TypeReference<Set<String>>()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
),
|
||||||
(List<EventHolder>) jsonMapper.convertValue(
|
(List<EventHolder>) jsonMapper.convertValue(
|
||||||
resultIter.next(), new TypeReference<List<EventHolder>>()
|
resultIter.next(), new TypeReference<List<EventHolder>>()
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,21 +25,28 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
public class SelectResultValue implements Iterable<EventHolder>
|
public class SelectResultValue implements Iterable<EventHolder>
|
||||||
{
|
{
|
||||||
private final Map<String, Integer> pagingIdentifiers;
|
private final Map<String, Integer> pagingIdentifiers;
|
||||||
|
private final Set<String> dimensions;
|
||||||
|
private final Set<String> metrics;
|
||||||
private final List<EventHolder> events;
|
private final List<EventHolder> events;
|
||||||
|
|
||||||
@JsonCreator
|
@JsonCreator
|
||||||
public SelectResultValue(
|
public SelectResultValue(
|
||||||
@JsonProperty("pagingIdentifiers") Map<String, Integer> pagingIdentifiers,
|
@JsonProperty("pagingIdentifiers") Map<String, Integer> pagingIdentifiers,
|
||||||
|
@JsonProperty("dimensions") Set<String> dimensions,
|
||||||
|
@JsonProperty("metrics") Set<String> metrics,
|
||||||
@JsonProperty("events") List<EventHolder> events
|
@JsonProperty("events") List<EventHolder> events
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
this.pagingIdentifiers = pagingIdentifiers;
|
this.pagingIdentifiers = pagingIdentifiers;
|
||||||
|
this.dimensions = dimensions;
|
||||||
|
this.metrics = metrics;
|
||||||
this.events = events;
|
this.events = events;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +56,18 @@ public class SelectResultValue implements Iterable<EventHolder>
|
||||||
return pagingIdentifiers;
|
return pagingIdentifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
public Set<String> getDimensions()
|
||||||
|
{
|
||||||
|
return dimensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
public Set<String> getMetrics()
|
||||||
|
{
|
||||||
|
return metrics;
|
||||||
|
}
|
||||||
|
|
||||||
@JsonProperty
|
@JsonProperty
|
||||||
public List<EventHolder> getEvents()
|
public List<EventHolder> getEvents()
|
||||||
{
|
{
|
||||||
|
@ -76,6 +95,15 @@ public class SelectResultValue implements Iterable<EventHolder>
|
||||||
if (events != null ? !events.equals(that.events) : that.events != null) {
|
if (events != null ? !events.equals(that.events) : that.events != null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dimensions != null ? !dimensions.equals(that.dimensions) : that.dimensions != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (metrics != null ? !metrics.equals(that.metrics) : that.metrics != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (pagingIdentifiers != null
|
if (pagingIdentifiers != null
|
||||||
? !pagingIdentifiers.equals(that.pagingIdentifiers)
|
? !pagingIdentifiers.equals(that.pagingIdentifiers)
|
||||||
: that.pagingIdentifiers != null) {
|
: that.pagingIdentifiers != null) {
|
||||||
|
@ -89,6 +117,8 @@ public class SelectResultValue implements Iterable<EventHolder>
|
||||||
public int hashCode()
|
public int hashCode()
|
||||||
{
|
{
|
||||||
int result = pagingIdentifiers != null ? pagingIdentifiers.hashCode() : 0;
|
int result = pagingIdentifiers != null ? pagingIdentifiers.hashCode() : 0;
|
||||||
|
result = 31 * result + (dimensions != null ? dimensions.hashCode() : 0);
|
||||||
|
result = 31 * result + (metrics != null ? metrics.hashCode() : 0);
|
||||||
result = 31 * result + (events != null ? events.hashCode() : 0);
|
result = 31 * result + (events != null ? events.hashCode() : 0);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -98,6 +128,8 @@ public class SelectResultValue implements Iterable<EventHolder>
|
||||||
{
|
{
|
||||||
return "SelectResultValue{" +
|
return "SelectResultValue{" +
|
||||||
"pagingIdentifiers=" + pagingIdentifiers +
|
"pagingIdentifiers=" + pagingIdentifiers +
|
||||||
|
", dimensions=" + dimensions +
|
||||||
|
", metrics=" + metrics +
|
||||||
", events=" + events +
|
", events=" + events +
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.MinMaxPriorityQueue;
|
import com.google.common.collect.MinMaxPriorityQueue;
|
||||||
import com.google.common.collect.Queues;
|
import com.google.common.collect.Queues;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.google.common.primitives.Longs;
|
import com.google.common.primitives.Longs;
|
||||||
import com.metamx.common.guava.Comparators;
|
import com.metamx.common.guava.Comparators;
|
||||||
import io.druid.query.Result;
|
import io.druid.query.Result;
|
||||||
|
@ -32,6 +33,7 @@ import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
@ -59,6 +61,8 @@ public class SelectResultValueBuilder
|
||||||
protected final DateTime timestamp;
|
protected final DateTime timestamp;
|
||||||
protected final PagingSpec pagingSpec;
|
protected final PagingSpec pagingSpec;
|
||||||
protected final boolean descending;
|
protected final boolean descending;
|
||||||
|
protected Set<String> dimensions;
|
||||||
|
protected Set<String> metrics;
|
||||||
|
|
||||||
protected final Queue<EventHolder> pQueue;
|
protected final Queue<EventHolder> pQueue;
|
||||||
protected final Map<String, Integer> pagingIdentifiers;
|
protected final Map<String, Integer> pagingIdentifiers;
|
||||||
|
@ -68,6 +72,8 @@ public class SelectResultValueBuilder
|
||||||
this.timestamp = timestamp;
|
this.timestamp = timestamp;
|
||||||
this.pagingSpec = pagingSpec;
|
this.pagingSpec = pagingSpec;
|
||||||
this.descending = descending;
|
this.descending = descending;
|
||||||
|
this.dimensions = Sets.newHashSet();
|
||||||
|
this.metrics = Sets.newHashSet();
|
||||||
this.pagingIdentifiers = Maps.newLinkedHashMap();
|
this.pagingIdentifiers = Maps.newLinkedHashMap();
|
||||||
this.pQueue = instantiatePQueue();
|
this.pQueue = instantiatePQueue();
|
||||||
}
|
}
|
||||||
|
@ -82,11 +88,31 @@ public class SelectResultValueBuilder
|
||||||
pagingIdentifiers.put(segmentId, lastOffset);
|
pagingIdentifiers.put(segmentId, lastOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addDimension(String dimension)
|
||||||
|
{
|
||||||
|
dimensions.add(dimension);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addDimensions(Set<String> dimensions)
|
||||||
|
{
|
||||||
|
this.dimensions.addAll(dimensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addMetric(String metric)
|
||||||
|
{
|
||||||
|
metrics.add(metric);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addMetrics(Set<String> metrics)
|
||||||
|
{
|
||||||
|
this.metrics.addAll(metrics);
|
||||||
|
}
|
||||||
|
|
||||||
public Result<SelectResultValue> build()
|
public Result<SelectResultValue> build()
|
||||||
{
|
{
|
||||||
return new Result<SelectResultValue>(
|
return new Result<SelectResultValue>(
|
||||||
timestamp,
|
timestamp,
|
||||||
new SelectResultValue(pagingIdentifiers, getEventHolders())
|
new SelectResultValue(pagingIdentifiers, dimensions, metrics, getEventHolders())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,9 @@
|
||||||
package io.druid.query.select;
|
package io.druid.query.select;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.metamx.common.ISE;
|
import com.metamx.common.ISE;
|
||||||
import io.druid.granularity.QueryGranularities;
|
import io.druid.granularity.QueryGranularities;
|
||||||
import io.druid.query.Result;
|
import io.druid.query.Result;
|
||||||
|
@ -32,6 +34,7 @@ import java.util.Arrays;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
@ -50,6 +53,8 @@ public class SelectBinaryFnTest
|
||||||
new DateTime("2013-01-01"),
|
new DateTime("2013-01-01"),
|
||||||
new SelectResultValue(
|
new SelectResultValue(
|
||||||
ImmutableMap.<String, Integer>of(),
|
ImmutableMap.<String, Integer>of(),
|
||||||
|
Sets.newHashSet("first", "fourth"),
|
||||||
|
Sets.newHashSet("sixth"),
|
||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
new EventHolder(
|
new EventHolder(
|
||||||
segmentId1,
|
segmentId1,
|
||||||
|
@ -90,6 +95,8 @@ public class SelectBinaryFnTest
|
||||||
new DateTime("2013-01-01"),
|
new DateTime("2013-01-01"),
|
||||||
new SelectResultValue(
|
new SelectResultValue(
|
||||||
ImmutableMap.<String, Integer>of(),
|
ImmutableMap.<String, Integer>of(),
|
||||||
|
Sets.newHashSet("second", "third"),
|
||||||
|
Sets.newHashSet("fifth"),
|
||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
new EventHolder(
|
new EventHolder(
|
||||||
segmentId2,
|
segmentId2,
|
||||||
|
@ -203,6 +210,61 @@ public class SelectBinaryFnTest
|
||||||
verifyEvents(exEvents, acEvents);
|
verifyEvents(exEvents, acEvents);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testColumnMerge() throws Exception
|
||||||
|
{
|
||||||
|
SelectBinaryFn binaryFn = new SelectBinaryFn(QueryGranularities.ALL, new PagingSpec(null, 5), false);
|
||||||
|
|
||||||
|
Result<SelectResultValue> res1 = new Result<>(
|
||||||
|
new DateTime("2013-01-01"),
|
||||||
|
new SelectResultValue(
|
||||||
|
ImmutableMap.<String, Integer>of(),
|
||||||
|
Sets.newHashSet("first", "second", "fourth"),
|
||||||
|
Sets.newHashSet("eight", "nineth"),
|
||||||
|
Lists.<EventHolder>newArrayList(
|
||||||
|
new EventHolder(
|
||||||
|
segmentId1,
|
||||||
|
0,
|
||||||
|
ImmutableMap.<String, Object>of(
|
||||||
|
EventHolder.timestampKey,
|
||||||
|
new DateTime("2013-01-01T00"), "dim", "first"
|
||||||
|
)
|
||||||
|
))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
Result<SelectResultValue> res2 = new Result<>(
|
||||||
|
new DateTime("2013-01-01"),
|
||||||
|
new SelectResultValue(
|
||||||
|
ImmutableMap.<String, Integer>of(),
|
||||||
|
Sets.newHashSet("third", "second", "fifth"),
|
||||||
|
Sets.newHashSet("seventh"),
|
||||||
|
Lists.<EventHolder>newArrayList(
|
||||||
|
new EventHolder(
|
||||||
|
segmentId2,
|
||||||
|
0,
|
||||||
|
ImmutableMap.<String, Object>of(
|
||||||
|
EventHolder.timestampKey,
|
||||||
|
new DateTime("2013-01-01T00"),
|
||||||
|
"dim",
|
||||||
|
"second"
|
||||||
|
)
|
||||||
|
))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
Result<SelectResultValue> merged = binaryFn.apply(res1, res2);
|
||||||
|
|
||||||
|
Set<String> exDimensions = Sets.newHashSet("first", "second", "fourth", "third", "fifth");
|
||||||
|
Set<String> exMetrics = Sets.newHashSet("eight", "nineth", "seventh");
|
||||||
|
|
||||||
|
Set<String> acDimensions = merged.getValue().getDimensions();
|
||||||
|
Set<String> acMetrics = merged.getValue().getMetrics();
|
||||||
|
|
||||||
|
Assert.assertEquals(exDimensions, acDimensions);
|
||||||
|
Assert.assertEquals(exMetrics, acMetrics);
|
||||||
|
}
|
||||||
|
|
||||||
private void verifyIters(Iterator iter1, Iterator iter2)
|
private void verifyIters(Iterator iter1, Iterator iter2)
|
||||||
{
|
{
|
||||||
while (iter1.hasNext()) {
|
while (iter1.hasNext()) {
|
||||||
|
|
|
@ -25,6 +25,7 @@ import com.google.common.collect.Iterables;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.ObjectArrays;
|
import com.google.common.collect.ObjectArrays;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.metamx.common.ISE;
|
import com.metamx.common.ISE;
|
||||||
import com.metamx.common.guava.Sequences;
|
import com.metamx.common.guava.Sequences;
|
||||||
import io.druid.jackson.DefaultObjectMapper;
|
import io.druid.jackson.DefaultObjectMapper;
|
||||||
|
@ -56,6 +57,7 @@ import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
@ -155,10 +157,12 @@ public class SelectQueryRunnerTest
|
||||||
PagingOffset offset = query.getPagingOffset(QueryRunnerTestHelper.segmentId);
|
PagingOffset offset = query.getPagingOffset(QueryRunnerTestHelper.segmentId);
|
||||||
List<Result<SelectResultValue>> expectedResults = toExpected(
|
List<Result<SelectResultValue>> expectedResults = toExpected(
|
||||||
toEvents(new String[]{EventHolder.timestampKey + ":TIME"}, V_0112_0114),
|
toEvents(new String[]{EventHolder.timestampKey + ":TIME"}, V_0112_0114),
|
||||||
|
Lists.newArrayList("market", "quality", "placement", "placementish", "partial_null_column", "null_column"),
|
||||||
|
Lists.<String>newArrayList("index", "quality_uniques"),
|
||||||
offset.startOffset(),
|
offset.startOffset(),
|
||||||
offset.threshold()
|
offset.threshold()
|
||||||
);
|
);
|
||||||
verify(expectedResults, results);
|
verify(expectedResults, populateNullColumnAtLastForQueryableIndexCase(results, "null_column"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -242,6 +246,8 @@ public class SelectQueryRunnerTest
|
||||||
new DateTime("2011-01-12T00:00:00.000Z"),
|
new DateTime("2011-01-12T00:00:00.000Z"),
|
||||||
new SelectResultValue(
|
new SelectResultValue(
|
||||||
ImmutableMap.of(QueryRunnerTestHelper.segmentId, 2),
|
ImmutableMap.of(QueryRunnerTestHelper.segmentId, 2),
|
||||||
|
Sets.newHashSet("mar", "qual", "place"),
|
||||||
|
Sets.newHashSet("index", "quality_uniques"),
|
||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
new EventHolder(
|
new EventHolder(
|
||||||
QueryRunnerTestHelper.segmentId,
|
QueryRunnerTestHelper.segmentId,
|
||||||
|
@ -286,6 +292,8 @@ public class SelectQueryRunnerTest
|
||||||
new DateTime("2011-01-12T00:00:00.000Z"),
|
new DateTime("2011-01-12T00:00:00.000Z"),
|
||||||
new SelectResultValue(
|
new SelectResultValue(
|
||||||
ImmutableMap.of(QueryRunnerTestHelper.segmentId, -3),
|
ImmutableMap.of(QueryRunnerTestHelper.segmentId, -3),
|
||||||
|
Sets.newHashSet("mar", "qual", "place"),
|
||||||
|
Sets.newHashSet("index", "quality_uniques"),
|
||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
new EventHolder(
|
new EventHolder(
|
||||||
QueryRunnerTestHelper.segmentId,
|
QueryRunnerTestHelper.segmentId,
|
||||||
|
@ -356,6 +364,8 @@ public class SelectQueryRunnerTest
|
||||||
},
|
},
|
||||||
V_0112_0114
|
V_0112_0114
|
||||||
),
|
),
|
||||||
|
Lists.newArrayList("market"),
|
||||||
|
Lists.<String>newArrayList("index"),
|
||||||
offset.startOffset(),
|
offset.startOffset(),
|
||||||
offset.threshold()
|
offset.threshold()
|
||||||
);
|
);
|
||||||
|
@ -387,6 +397,8 @@ public class SelectQueryRunnerTest
|
||||||
},
|
},
|
||||||
V_0112_0114
|
V_0112_0114
|
||||||
),
|
),
|
||||||
|
Lists.newArrayList("quality"),
|
||||||
|
Lists.<String>newArrayList("index"),
|
||||||
offset.startOffset(),
|
offset.startOffset(),
|
||||||
offset.threshold()
|
offset.threshold()
|
||||||
);
|
);
|
||||||
|
@ -450,6 +462,8 @@ public class SelectQueryRunnerTest
|
||||||
PagingOffset offset = query.getPagingOffset(QueryRunnerTestHelper.segmentId);
|
PagingOffset offset = query.getPagingOffset(QueryRunnerTestHelper.segmentId);
|
||||||
List<Result<SelectResultValue>> expectedResults = toExpected(
|
List<Result<SelectResultValue>> expectedResults = toExpected(
|
||||||
events,
|
events,
|
||||||
|
Lists.newArrayList("quality"),
|
||||||
|
Lists.<String>newArrayList("index"),
|
||||||
offset.startOffset(),
|
offset.startOffset(),
|
||||||
offset.threshold()
|
offset.threshold()
|
||||||
);
|
);
|
||||||
|
@ -504,6 +518,8 @@ public class SelectQueryRunnerTest
|
||||||
PagingOffset offset = query.getPagingOffset(QueryRunnerTestHelper.segmentId);
|
PagingOffset offset = query.getPagingOffset(QueryRunnerTestHelper.segmentId);
|
||||||
List<Result<SelectResultValue>> expectedResults = toExpected(
|
List<Result<SelectResultValue>> expectedResults = toExpected(
|
||||||
events,
|
events,
|
||||||
|
Lists.newArrayList(QueryRunnerTestHelper.qualityDimension),
|
||||||
|
Lists.<String>newArrayList(QueryRunnerTestHelper.indexMetric),
|
||||||
offset.startOffset(),
|
offset.startOffset(),
|
||||||
offset.threshold()
|
offset.threshold()
|
||||||
);
|
);
|
||||||
|
@ -537,12 +553,14 @@ public class SelectQueryRunnerTest
|
||||||
new DateTime("2011-01-12T00:00:00.000Z"),
|
new DateTime("2011-01-12T00:00:00.000Z"),
|
||||||
new SelectResultValue(
|
new SelectResultValue(
|
||||||
ImmutableMap.<String, Integer>of(),
|
ImmutableMap.<String, Integer>of(),
|
||||||
|
Sets.newHashSet("market", "quality", "placement", "placementish", "partial_null_column", "null_column"),
|
||||||
|
Sets.newHashSet("index", "quality_uniques"),
|
||||||
Lists.<EventHolder>newArrayList()
|
Lists.<EventHolder>newArrayList()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
verify(expectedResults, results);
|
verify(expectedResults, populateNullColumnAtLastForQueryableIndexCase(results, "null_column"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -571,6 +589,8 @@ public class SelectQueryRunnerTest
|
||||||
PagingOffset offset = query.getPagingOffset(QueryRunnerTestHelper.segmentId);
|
PagingOffset offset = query.getPagingOffset(QueryRunnerTestHelper.segmentId);
|
||||||
List<Result<SelectResultValue>> expectedResults = toExpected(
|
List<Result<SelectResultValue>> expectedResults = toExpected(
|
||||||
events,
|
events,
|
||||||
|
Lists.newArrayList("foo"),
|
||||||
|
Lists.<String>newArrayList("foo2"),
|
||||||
offset.startOffset(),
|
offset.startOffset(),
|
||||||
offset.threshold()
|
offset.threshold()
|
||||||
);
|
);
|
||||||
|
@ -626,6 +646,8 @@ public class SelectQueryRunnerTest
|
||||||
|
|
||||||
private List<Result<SelectResultValue>> toExpected(
|
private List<Result<SelectResultValue>> toExpected(
|
||||||
List<List<Map<String, Object>>> targets,
|
List<List<Map<String, Object>>> targets,
|
||||||
|
List<String> dimensions,
|
||||||
|
List<String> metrics,
|
||||||
final int offset,
|
final int offset,
|
||||||
final int threshold
|
final int threshold
|
||||||
)
|
)
|
||||||
|
@ -653,7 +675,11 @@ public class SelectQueryRunnerTest
|
||||||
expected.add(
|
expected.add(
|
||||||
new Result(
|
new Result(
|
||||||
new DateTime(group.get(0).get(EventHolder.timestampKey)),
|
new DateTime(group.get(0).get(EventHolder.timestampKey)),
|
||||||
new SelectResultValue(ImmutableMap.of(QueryRunnerTestHelper.segmentId, lastOffset), holders)
|
new SelectResultValue(
|
||||||
|
ImmutableMap.of(QueryRunnerTestHelper.segmentId, lastOffset),
|
||||||
|
Sets.<String>newHashSet(dimensions),
|
||||||
|
Sets.<String>newHashSet(metrics),
|
||||||
|
holders)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -678,6 +704,9 @@ public class SelectQueryRunnerTest
|
||||||
Assert.assertEquals(entry.getValue(), actual.getValue().getPagingIdentifiers().get(entry.getKey()));
|
Assert.assertEquals(entry.getValue(), actual.getValue().getPagingIdentifiers().get(entry.getKey()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Assert.assertEquals(expected.getValue().getDimensions(), actual.getValue().getDimensions());
|
||||||
|
Assert.assertEquals(expected.getValue().getMetrics(), actual.getValue().getMetrics());
|
||||||
|
|
||||||
Iterator<EventHolder> expectedEvts = expected.getValue().getEvents().iterator();
|
Iterator<EventHolder> expectedEvts = expected.getValue().getEvents().iterator();
|
||||||
Iterator<EventHolder> actualEvts = actual.getValue().getEvents().iterator();
|
Iterator<EventHolder> actualEvts = actual.getValue().getEvents().iterator();
|
||||||
|
|
||||||
|
@ -708,4 +737,19 @@ public class SelectQueryRunnerTest
|
||||||
throw new ISE("This iterator should be exhausted!");
|
throw new ISE("This iterator should be exhausted!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Iterable<Result<SelectResultValue>> populateNullColumnAtLastForQueryableIndexCase(Iterable<Result<SelectResultValue>> results, String columnName)
|
||||||
|
{
|
||||||
|
// A Queryable index does not have the null column when it has loaded a index.
|
||||||
|
for (Result<SelectResultValue> value : results) {
|
||||||
|
Set<String> dimensions = value.getValue().getDimensions();
|
||||||
|
if (dimensions.contains(columnName)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dimensions.add(columnName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ import com.google.common.collect.Iterables;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Ordering;
|
import com.google.common.collect.Ordering;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.google.common.hash.HashFunction;
|
import com.google.common.hash.HashFunction;
|
||||||
import com.google.common.hash.Hashing;
|
import com.google.common.hash.Hashing;
|
||||||
import com.google.common.util.concurrent.ForwardingListeningExecutorService;
|
import com.google.common.util.concurrent.ForwardingListeningExecutorService;
|
||||||
|
@ -154,6 +155,7 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ConcurrentLinkedDeque;
|
import java.util.concurrent.ConcurrentLinkedDeque;
|
||||||
|
@ -1155,6 +1157,9 @@ public class CachingClusteredClientTest
|
||||||
@Test
|
@Test
|
||||||
public void testSelectCaching() throws Exception
|
public void testSelectCaching() throws Exception
|
||||||
{
|
{
|
||||||
|
final Set<String> dimensions = Sets.<String>newHashSet("a");
|
||||||
|
final Set<String> metrics = Sets.<String>newHashSet("rows");
|
||||||
|
|
||||||
Druids.SelectQueryBuilder builder = Druids.newSelectQueryBuilder()
|
Druids.SelectQueryBuilder builder = Druids.newSelectQueryBuilder()
|
||||||
.dataSource(DATA_SOURCE)
|
.dataSource(DATA_SOURCE)
|
||||||
.intervals(SEG_SPEC)
|
.intervals(SEG_SPEC)
|
||||||
|
@ -1169,14 +1174,13 @@ public class CachingClusteredClientTest
|
||||||
client,
|
client,
|
||||||
builder.build(),
|
builder.build(),
|
||||||
new Interval("2011-01-01/2011-01-02"),
|
new Interval("2011-01-01/2011-01-02"),
|
||||||
makeSelectResults(new DateTime("2011-01-01"), ImmutableMap.of("a", "b", "rows", 1)),
|
makeSelectResults(dimensions, metrics, new DateTime("2011-01-01"), ImmutableMap.of("a", "b", "rows", 1)),
|
||||||
|
|
||||||
new Interval("2011-01-02/2011-01-03"),
|
new Interval("2011-01-02/2011-01-03"),
|
||||||
makeSelectResults(new DateTime("2011-01-02"), ImmutableMap.of("a", "c", "rows", 5)),
|
makeSelectResults(dimensions, metrics, new DateTime("2011-01-02"), ImmutableMap.of("a", "c", "rows", 5)),
|
||||||
|
|
||||||
new Interval("2011-01-05/2011-01-10"),
|
new Interval("2011-01-05/2011-01-10"),
|
||||||
makeSelectResults(
|
makeSelectResults(dimensions, metrics, new DateTime("2011-01-05"), ImmutableMap.of("a", "d", "rows", 5),
|
||||||
new DateTime("2011-01-05"), ImmutableMap.of("a", "d", "rows", 5),
|
|
||||||
new DateTime("2011-01-06"), ImmutableMap.of("a", "e", "rows", 6),
|
new DateTime("2011-01-06"), ImmutableMap.of("a", "e", "rows", 6),
|
||||||
new DateTime("2011-01-07"), ImmutableMap.of("a", "f", "rows", 7),
|
new DateTime("2011-01-07"), ImmutableMap.of("a", "f", "rows", 7),
|
||||||
new DateTime("2011-01-08"), ImmutableMap.of("a", "g", "rows", 8),
|
new DateTime("2011-01-08"), ImmutableMap.of("a", "g", "rows", 8),
|
||||||
|
@ -1184,8 +1188,7 @@ public class CachingClusteredClientTest
|
||||||
),
|
),
|
||||||
|
|
||||||
new Interval("2011-01-05/2011-01-10"),
|
new Interval("2011-01-05/2011-01-10"),
|
||||||
makeSelectResults(
|
makeSelectResults(dimensions, metrics, new DateTime("2011-01-05T01"), ImmutableMap.of("a", "d", "rows", 5),
|
||||||
new DateTime("2011-01-05T01"), ImmutableMap.of("a", "d", "rows", 5),
|
|
||||||
new DateTime("2011-01-06T01"), ImmutableMap.of("a", "e", "rows", 6),
|
new DateTime("2011-01-06T01"), ImmutableMap.of("a", "e", "rows", 6),
|
||||||
new DateTime("2011-01-07T01"), ImmutableMap.of("a", "f", "rows", 7),
|
new DateTime("2011-01-07T01"), ImmutableMap.of("a", "f", "rows", 7),
|
||||||
new DateTime("2011-01-08T01"), ImmutableMap.of("a", "g", "rows", 8),
|
new DateTime("2011-01-08T01"), ImmutableMap.of("a", "g", "rows", 8),
|
||||||
|
@ -1202,8 +1205,7 @@ public class CachingClusteredClientTest
|
||||||
);
|
);
|
||||||
HashMap<String, Object> context = new HashMap<String, Object>();
|
HashMap<String, Object> context = new HashMap<String, Object>();
|
||||||
TestHelper.assertExpectedResults(
|
TestHelper.assertExpectedResults(
|
||||||
makeSelectResults(
|
makeSelectResults(dimensions, metrics, new DateTime("2011-01-01"), ImmutableMap.of("a", "b", "rows", 1),
|
||||||
new DateTime("2011-01-01"), ImmutableMap.of("a", "b", "rows", 1),
|
|
||||||
new DateTime("2011-01-02"), ImmutableMap.of("a", "c", "rows", 5),
|
new DateTime("2011-01-02"), ImmutableMap.of("a", "c", "rows", 5),
|
||||||
new DateTime("2011-01-05"), ImmutableMap.of("a", "d", "rows", 5),
|
new DateTime("2011-01-05"), ImmutableMap.of("a", "d", "rows", 5),
|
||||||
new DateTime("2011-01-05T01"), ImmutableMap.of("a", "d", "rows", 5),
|
new DateTime("2011-01-05T01"), ImmutableMap.of("a", "d", "rows", 5),
|
||||||
|
@ -2426,7 +2428,7 @@ public class CachingClusteredClientTest
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Iterable<Result<SelectResultValue>> makeSelectResults(Object... objects)
|
private Iterable<Result<SelectResultValue>> makeSelectResults(Set<String> dimensions, Set<String> metrics, Object... objects)
|
||||||
{
|
{
|
||||||
List<Result<SelectResultValue>> retVal = Lists.newArrayList();
|
List<Result<SelectResultValue>> retVal = Lists.newArrayList();
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
@ -2434,11 +2436,15 @@ public class CachingClusteredClientTest
|
||||||
DateTime timestamp = (DateTime) objects[index++];
|
DateTime timestamp = (DateTime) objects[index++];
|
||||||
|
|
||||||
List<EventHolder> values = Lists.newArrayList();
|
List<EventHolder> values = Lists.newArrayList();
|
||||||
|
|
||||||
while (index < objects.length && !(objects[index] instanceof DateTime)) {
|
while (index < objects.length && !(objects[index] instanceof DateTime)) {
|
||||||
values.add(new EventHolder(null, 0, (Map) objects[index++]));
|
values.add(new EventHolder(null, 0, (Map) objects[index++]));
|
||||||
}
|
}
|
||||||
|
|
||||||
retVal.add(new Result<>(timestamp, new SelectResultValue(null, values)));
|
retVal.add(new Result<>(
|
||||||
|
timestamp,
|
||||||
|
new SelectResultValue(null, dimensions, metrics, values)
|
||||||
|
));
|
||||||
}
|
}
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue