From fc1b919d252e12eff731b676afb665503ae880fb Mon Sep 17 00:00:00 2001 From: leventov Date: Sun, 1 Oct 2017 17:32:38 -0500 Subject: [PATCH 01/13] Refactor ColumnSelectorFactory; Rely on ColumnValueSelector's polymorphism --- .../java/io/druid/data/input/MapBasedRow.java | 63 +--- .../main/java/io/druid/data/input/Row.java | 34 +-- .../io/druid/data/input/MapBasedRowTest.java | 14 +- .../input/impl/InputRowParserSerdeTest.java | 6 +- .../druid/benchmark/ExpressionBenchmark.java | 15 +- .../benchmark/FilterPartitionBenchmark.java | 4 +- .../EverythingIsNonnullByDefault.java | 40 +++ .../java/io/druid/common/utils/UUIDUtils.java | 4 +- .../aggregation/TimestampAggregator.java | 6 +- .../TimestampAggregatorFactory.java | 6 +- .../TimestampBufferAggregator.java | 6 +- .../TimestampAggregationSelectTest.java | 2 +- .../TimestampGroupByAggregationTest.java | 2 +- .../TimestampMinMaxAggregatorTest.java | 2 +- .../io/druid/segment/MapVirtualColumn.java | 119 +------- .../input/AvroStreamInputRowParserTest.java | 6 +- .../theta/EmptySketchBufferAggregator.java | 84 ------ .../datasketches/theta/SketchAggregator.java | 24 +- .../theta/SketchAggregatorFactory.java | 33 +- .../theta/SketchBufferAggregator.java | 18 +- .../ApproximateHistogramAggregator.java | 6 +- ...ApproximateHistogramAggregatorFactory.java | 11 +- .../ApproximateHistogramBufferAggregator.java | 11 +- ...ApproximateHistogramFoldingAggregator.java | 6 +- ...mateHistogramFoldingAggregatorFactory.java | 47 +-- ...imateHistogramFoldingBufferAggregator.java | 11 +- .../ApproximateHistogramAggregationTest.java | 12 +- .../protobuf/ProtobufInputRowParserTest.java | 6 +- .../variance/VarianceAggregator.java | 18 +- .../variance/VarianceAggregatorCollector.java | 7 +- .../variance/VarianceAggregatorFactory.java | 32 +- .../variance/VarianceBufferAggregator.java | 21 +- .../VarianceAggregatorCollectorTest.java | 4 +- .../variance/VarianceAggregatorTest.java | 4 +- .../io/druid/indexer/IndexGeneratorJob.java | 16 +- .../druid/indexer/hadoop/SegmentInputRow.java | 16 +- .../indexer/BatchDeltaIngestionTest.java | 2 +- .../indexer/IndexGeneratorCombinerTest.java | 6 +- .../io/druid/indexer/InputRowSerdeTest.java | 8 +- .../hadoop/DatasourceRecordReaderTest.java | 2 +- .../IngestSegmentFirehoseFactoryTest.java | 4 +- ...estSegmentFirehoseFactoryTimelineTest.java | 2 +- .../druid/java/util/common/StringUtils.java | 23 ++ .../java/util/common/StringUtilsTest.java | 11 +- .../query/aggregation/AggregateCombiner.java | 8 +- .../druid/query/aggregation/Aggregator.java | 2 + .../query/aggregation/AggregatorUtil.java | 89 ++++-- .../aggregation/DoubleMaxAggregator.java | 6 +- .../DoubleMaxBufferAggregator.java | 4 +- .../aggregation/DoubleMinAggregator.java | 6 +- .../DoubleMinBufferAggregator.java | 4 +- .../aggregation/DoubleSumAggregator.java | 6 +- .../DoubleSumBufferAggregator.java | 4 +- .../query/aggregation/FloatMaxAggregator.java | 6 +- .../FloatMaxAggregatorFactory.java | 4 +- .../aggregation/FloatMaxBufferAggregator.java | 4 +- .../query/aggregation/FloatMinAggregator.java | 6 +- .../FloatMinAggregatorFactory.java | 4 +- .../aggregation/FloatMinBufferAggregator.java | 4 +- .../query/aggregation/FloatSumAggregator.java | 6 +- .../FloatSumAggregatorFactory.java | 4 +- .../aggregation/FloatSumBufferAggregator.java | 4 +- .../aggregation/HistogramAggregator.java | 6 +- .../HistogramAggregatorFactory.java | 14 +- .../HistogramBufferAggregator.java | 6 +- .../aggregation/JavaScriptAggregator.java | 11 +- .../JavaScriptAggregatorFactory.java | 32 +- .../JavaScriptBufferAggregator.java | 9 +- .../aggregation/LongBufferAggregator.java | 6 +- .../query/aggregation/LongMaxAggregator.java | 6 +- .../aggregation/LongMaxAggregatorFactory.java | 12 +- .../aggregation/LongMaxBufferAggregator.java | 4 +- .../query/aggregation/LongMinAggregator.java | 6 +- .../aggregation/LongMinAggregatorFactory.java | 12 +- .../aggregation/LongMinBufferAggregator.java | 4 +- .../query/aggregation/LongSumAggregator.java | 6 +- .../aggregation/LongSumAggregatorFactory.java | 12 +- .../aggregation/LongSumBufferAggregator.java | 4 +- .../aggregation/ObjectAggregateCombiner.java | 7 + .../SimpleDoubleAggregatorFactory.java | 12 +- .../SimpleDoubleBufferAggregator.java | 8 +- .../SimpleFloatAggregatorFactory.java | 15 +- .../SimpleFloatBufferAggregator.java | 8 +- ...HyperLogLogCollectorAggregateCombiner.java | 4 +- ...alityAggregatorColumnSelectorStrategy.java | 4 +- ...alityAggregatorColumnSelectorStrategy.java | 9 +- ...alityAggregatorColumnSelectorStrategy.java | 12 +- ...alityAggregatorColumnSelectorStrategy.java | 8 +- .../first/DoubleFirstAggregator.java | 12 +- .../first/DoubleFirstAggregatorFactory.java | 16 +- .../first/DoubleFirstBufferAggregator.java | 13 +- .../first/FloatFirstAggregator.java | 12 +- .../first/FloatFirstAggregatorFactory.java | 16 +- .../first/FloatFirstBufferAggregator.java | 13 +- .../first/LongFirstAggregator.java | 10 +- .../first/LongFirstAggregatorFactory.java | 16 +- .../first/LongFirstBufferAggregator.java | 8 +- .../hyperloglog/HyperUniquesAggregator.java | 27 +- .../HyperUniquesAggregatorFactory.java | 23 +- .../HyperUniquesBufferAggregator.java | 8 +- .../last/DoubleLastAggregator.java | 12 +- .../last/DoubleLastAggregatorFactory.java | 14 +- .../last/DoubleLastBufferAggregator.java | 13 +- .../aggregation/last/FloatLastAggregator.java | 12 +- .../last/FloatLastAggregatorFactory.java | 16 +- .../last/FloatLastBufferAggregator.java | 10 +- .../aggregation/last/LongLastAggregator.java | 10 +- .../last/LongLastAggregatorFactory.java | 16 +- .../last/LongLastBufferAggregator.java | 8 +- .../ForwardingFilteredDimensionSelector.java | 13 + .../PredicateFilteredDimensionSelector.java | 13 + ...bleValueMatcherColumnSelectorStrategy.java | 12 +- ...oatValueMatcherColumnSelectorStrategy.java | 12 +- ...ongValueMatcherColumnSelectorStrategy.java | 12 +- .../ValueMatcherColumnSelectorStrategy.java | 3 +- .../RowBasedColumnSelectorFactory.java | 144 ++++----- .../epinephelinae/RowBasedGrouperHelper.java | 13 +- .../having/HavingSpecMetricComparator.java | 24 +- .../io/druid/query/scan/ScanQueryEngine.java | 12 +- .../druid/query/search/SearchQueryRunner.java | 24 +- .../druid/query/select/SelectQueryEngine.java | 59 ++-- .../TimeBoundaryQueryRunnerFactory.java | 6 +- .../topn/Historical1AggPooledTopNScanner.java | 3 +- .../NumericTopNColumnSelectorStrategy.java | 30 +- .../types/TopNColumnSelectorStrategy.java | 4 +- .../BaseDoubleColumnValueSelector.java | 36 +++ .../segment/BaseFloatColumnValueSelector.java | 36 +++ .../segment/BaseLongColumnValueSelector.java | 36 +++ ...ava => BaseObjectColumnValueSelector.java} | 36 +-- .../druid/segment/ColumnSelectorFactory.java | 7 +- .../io/druid/segment/ColumnValueSelector.java | 15 +- .../segment/ConstantDimensionSelector.java | 13 + .../druid/segment/DimensionHandlerUtils.java | 4 +- .../io/druid/segment/DimensionIndexer.java | 25 +- .../io/druid/segment/DimensionSelector.java | 33 +- .../druid/segment/DoubleColumnSelector.java | 16 +- .../druid/segment/DoubleDimensionIndexer.java | 67 +---- .../DoubleWrappingDimensionSelector.java | 4 +- .../io/druid/segment/FloatColumnSelector.java | 16 +- .../druid/segment/FloatDimensionIndexer.java | 78 +---- .../FloatWrappingDimensionSelector.java | 19 +- .../main/java/io/druid/segment/IdLookup.java | 4 +- .../io/druid/segment/LongColumnSelector.java | 13 +- .../druid/segment/LongDimensionIndexer.java | 77 +---- .../LongWrappingDimensionSelector.java | 19 +- ...ector.java => NilColumnValueSelector.java} | 35 ++- .../druid/segment/NullDimensionSelector.java | 13 + .../druid/segment/ObjectColumnSelector.java | 9 +- .../QueryableIndexColumnSelectorFactory.java | 281 ++---------------- .../segment/SingleScanTimeDimSelector.java | 17 +- .../druid/segment/StringDimensionIndexer.java | 50 +++- .../java/io/druid/segment/VirtualColumn.java | 41 +-- .../java/io/druid/segment/VirtualColumns.java | 78 +---- .../io/druid/segment/column/BaseColumn.java | 52 +--- .../druid/segment/column/ComplexColumn.java | 35 ++- .../column/DictionaryEncodedColumn.java | 13 +- .../druid/segment/column/GenericColumn.java | 12 +- .../column/IndexedDoublesGenericColumn.java | 30 +- .../column/IndexedFloatsGenericColumn.java | 30 +- .../column/IndexedLongsGenericColumn.java | 30 +- .../column/SimpleDictionaryEncodedColumn.java | 37 ++- .../io/druid/segment/column/ValueType.java | 52 +++- .../io/druid/segment/data/IndexedDoubles.java | 57 +--- .../io/druid/segment/data/IndexedFloats.java | 57 +--- .../io/druid/segment/data/IndexedLongs.java | 57 +--- .../segment/filter/ExpressionFilter.java | 4 +- .../java/io/druid/segment/filter/Filters.java | 6 +- .../segment/incremental/IncrementalIndex.java | 177 ++++++++--- ...IncrementalIndexColumnSelectorFactory.java | 215 +------------- .../incremental/OnheapIncrementalIndex.java | 56 +--- .../SpatialDimensionRowTransformer.java | 16 +- ...tColumnSelector.java => package-info.java} | 27 +- .../BaseSingleValueDimensionSelector.java | 13 + .../virtual/ExpressionObjectSelector.java | 21 +- .../segment/virtual/ExpressionSelectors.java | 74 ++--- .../virtual/ExpressionVirtualColumn.java | 55 +--- .../VirtualizedColumnSelectorFactory.java | 42 +-- .../aggregation/DoubleMaxAggregationTest.java | 2 +- .../aggregation/DoubleMinAggregationTest.java | 2 +- .../aggregation/FilteredAggregatorTest.java | 54 +--- .../JavaScriptAggregatorBenchmark.java | 5 +- .../aggregation/JavaScriptAggregatorTest.java | 36 +-- .../aggregation/LongMaxAggregationTest.java | 2 +- .../aggregation/LongMinAggregationTest.java | 2 +- .../aggregation/MetricSelectorUtils.java | 63 ---- .../aggregation/TestObjectColumnSelector.java | 12 +- .../CardinalityAggregatorTest.java | 13 + .../first/DoubleFirstAggregationTest.java | 6 +- .../first/FloatFirstAggregationTest.java | 6 +- .../first/LongFirstAggregationTest.java | 6 +- .../HyperUniquesAggregationTest.java | 8 +- .../last/DoubleLastAggregationTest.java | 6 +- .../last/FloatLastAggregationTest.java | 6 +- .../last/LongLastAggregationTest.java | 6 +- ...nalizingFieldAccessPostAggregatorTest.java | 6 +- .../dimension/TestDimensionSelector.java | 13 + .../query/groupby/GroupByQueryRunnerTest.java | 13 +- .../epinephelinae/ConcurrentGrouperTest.java | 25 +- .../TestColumnSelectorFactory.java | 65 ++-- .../segment/TestObjectColumnSelector.java} | 22 +- .../segment/data/IncrementalIndexTest.java | 22 +- .../virtual/ExpressionObjectSelectorTest.java | 7 +- .../virtual/ExpressionVirtualColumnTest.java | 19 +- .../segment/virtual/VirtualColumnsTest.java | 89 ++---- .../firehose/IngestSegmentFirehose.java | 31 +- .../firehose/WikipediaIrcDecoder.java | 15 +- .../CombiningFirehoseFactoryTest.java | 17 +- .../segment/realtime/RealtimeManagerTest.java | 14 +- .../plumber/RealtimePlumberSchoolTest.java | 28 +- .../segment/realtime/plumber/SinkTest.java | 28 +- .../HashBasedNumberedShardSpecTest.java | 14 +- .../main/java/io/druid/cli/DumpSegment.java | 131 ++++---- 212 files changed, 1844 insertions(+), 3047 deletions(-) create mode 100644 common/src/main/java/io/druid/annotations/EverythingIsNonnullByDefault.java delete mode 100644 extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/EmptySketchBufferAggregator.java create mode 100644 processing/src/main/java/io/druid/segment/BaseDoubleColumnValueSelector.java create mode 100644 processing/src/main/java/io/druid/segment/BaseFloatColumnValueSelector.java create mode 100644 processing/src/main/java/io/druid/segment/BaseLongColumnValueSelector.java rename processing/src/main/java/io/druid/segment/{ZeroDoubleColumnSelector.java => BaseObjectColumnValueSelector.java} (59%) rename processing/src/main/java/io/druid/segment/{ZeroFloatColumnSelector.java => NilColumnValueSelector.java} (69%) rename extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/EmptySketchAggregator.java => processing/src/main/java/io/druid/segment/column/BaseColumn.java (52%) rename processing/src/main/java/io/druid/segment/{NullStringObjectColumnSelector.java => package-info.java} (63%) delete mode 100644 processing/src/test/java/io/druid/query/aggregation/MetricSelectorUtils.java rename processing/src/{main/java/io/druid/segment/ZeroLongColumnSelector.java => test/java/io/druid/segment/TestObjectColumnSelector.java} (71%) diff --git a/api/src/main/java/io/druid/data/input/MapBasedRow.java b/api/src/main/java/io/druid/data/input/MapBasedRow.java index 7a8ba07a44a1..afc2c0930536 100644 --- a/api/src/main/java/io/druid/data/input/MapBasedRow.java +++ b/api/src/main/java/io/druid/data/input/MapBasedRow.java @@ -24,6 +24,7 @@ import com.google.common.collect.Lists; import io.druid.guice.annotations.PublicApi; import io.druid.java.util.common.DateTimes; +import io.druid.java.util.common.StringUtils; import io.druid.java.util.common.parsers.ParseException; import org.joda.time.DateTime; @@ -38,6 +39,7 @@ public class MapBasedRow implements Row { private static final Pattern LONG_PAT = Pattern.compile("[-|+]?\\d+"); + private static final Long LONG_ZERO = 0L; private final DateTime timestamp; private final Map event; @@ -101,66 +103,25 @@ public Object getRaw(String dimension) } @Override - public float getFloatMetric(String metric) + public Number getMetric(String metric) { Object metricValue = event.get(metric); if (metricValue == null) { - return 0.0f; + return LONG_ZERO; } if (metricValue instanceof Number) { - return ((Number) metricValue).floatValue(); + return (Number) metricValue; } else if (metricValue instanceof String) { try { - return Float.valueOf(((String) metricValue).replace(",", "")); - } - catch (Exception e) { - throw new ParseException(e, "Unable to parse metrics[%s], value[%s]", metric, metricValue); - } - } else { - throw new ParseException("Unknown type[%s]", metricValue.getClass()); - } - } - - @Override - public long getLongMetric(String metric) - { - Object metricValue = event.get(metric); - - if (metricValue == null) { - return 0L; - } - - if (metricValue instanceof Number) { - return ((Number) metricValue).longValue(); - } else if (metricValue instanceof String) { - try { - String s = ((String) metricValue).replace(",", ""); - return LONG_PAT.matcher(s).matches() ? Long.valueOf(s) : Double.valueOf(s).longValue(); - } - catch (Exception e) { - throw new ParseException(e, "Unable to parse metrics[%s], value[%s]", metric, metricValue); - } - } else { - throw new ParseException("Unknown type[%s]", metricValue.getClass()); - } - } - - @Override - public double getDoubleMetric(String metric) - { - Object metricValue = event.get(metric); - - if (metricValue == null) { - return 0.0d; - } - - if (metricValue instanceof Number) { - return ((Number) metricValue).doubleValue(); - } else if (metricValue instanceof String) { - try { - return Double.valueOf(((String) metricValue).replace(",", "")); + String metricValueString = StringUtils.removeChar((String) metricValue, ','); + // Do NOT use ternary operator here, because it makes Java to convert Long to Double + if (LONG_PAT.matcher(metricValueString).matches()) { + return Long.valueOf(metricValueString); + } else { + return Double.valueOf(metricValueString); + } } catch (Exception e) { throw new ParseException(e, "Unable to parse metrics[%s], value[%s]", metric, metricValue); diff --git a/api/src/main/java/io/druid/data/input/Row.java b/api/src/main/java/io/druid/data/input/Row.java index f5462ff5bda7..970d6995fd12 100644 --- a/api/src/main/java/io/druid/data/input/Row.java +++ b/api/src/main/java/io/druid/data/input/Row.java @@ -64,7 +64,7 @@ public interface Row extends Comparable public List getDimension(String dimension); /** - * Returns the raw dimension value for the given column name. This is different from #getDimension which + * Returns the raw dimension value for the given column name. This is different from {@link #getDimension} which * all values to strings before returning them. * * @param dimension the column name of the dimension requested @@ -74,32 +74,10 @@ public interface Row extends Comparable public Object getRaw(String dimension); /** - * Returns the float value of the given metric column. - *

- * - * @param metric the column name of the metric requested - * - * @return the float value for the provided column name. - */ - public float getFloatMetric(String metric); - - /** - * Returns the long value of the given metric column. - *

- * - * @param metric the column name of the metric requested - * - * @return the long value for the provided column name. - */ - public long getLongMetric(String metric); - - /** - * Returns the double value of the given metric column. - *

- * - * @param metric the column name of the metric requested - * - * @return the double value for the provided column name. + * Returns the metric column value for the given column name. This method is different from {@link #getRaw} in two + * aspects: + * 1. If the column is absent in the row, numeric zero is returned, rather than null. + * 2. If the column has string value, an attempt is made to parse this value as a number. */ - public double getDoubleMetric(String metric); + Number getMetric(String metric); } diff --git a/api/src/test/java/io/druid/data/input/MapBasedRowTest.java b/api/src/test/java/io/druid/data/input/MapBasedRowTest.java index 05241f50e054..b6b4d5a9840f 100644 --- a/api/src/test/java/io/druid/data/input/MapBasedRowTest.java +++ b/api/src/test/java/io/druid/data/input/MapBasedRowTest.java @@ -42,12 +42,12 @@ public void testGetLongMetricFromString() .build() ); - Assert.assertEquals(-1, row.getLongMetric("k0")); - Assert.assertEquals(1, row.getLongMetric("k1")); - Assert.assertEquals(1, row.getLongMetric("k2")); - Assert.assertEquals(100000, row.getLongMetric("k3")); - Assert.assertEquals(9223372036854775806L, row.getLongMetric("k4")); - Assert.assertEquals(-9223372036854775807L, row.getLongMetric("k5")); - Assert.assertEquals(9223372036854775802L, row.getLongMetric("k6")); + Assert.assertEquals(-1.2, row.getMetric("k0")); + Assert.assertEquals(1.23, row.getMetric("k1")); + Assert.assertEquals(1.8, row.getMetric("k2")); + Assert.assertEquals(100000.0, row.getMetric("k3")); + Assert.assertEquals(9223372036854775806L, row.getMetric("k4")); + Assert.assertEquals(-9223372036854775807L, row.getMetric("k5")); + Assert.assertEquals(9223372036854775802L, row.getMetric("k6")); } } diff --git a/api/src/test/java/io/druid/data/input/impl/InputRowParserSerdeTest.java b/api/src/test/java/io/druid/data/input/impl/InputRowParserSerdeTest.java index 144c14418d75..f52d61a59853 100644 --- a/api/src/test/java/io/druid/data/input/impl/InputRowParserSerdeTest.java +++ b/api/src/test/java/io/druid/data/input/impl/InputRowParserSerdeTest.java @@ -142,11 +142,11 @@ public void testMapInputRowParserNumbersSerde() throws Exception ImmutableList.of("1412705931123", "123.456", "1.23E47", "hello"), parsed.getDimension("values") ); - Assert.assertEquals(Float.POSITIVE_INFINITY, parsed.getFloatMetric("toobig"), 0.0); + Assert.assertEquals(Float.POSITIVE_INFINITY, parsed.getMetric("toobig").floatValue(), 0.0); Assert.assertEquals(123E64, parsed.getRaw("toobig")); - Assert.assertEquals(123.456f, parsed.getFloatMetric("value"), 0.0f); + Assert.assertEquals(123.456f, parsed.getMetric("value").floatValue(), 0.0f); Assert.assertEquals(123456789000L, parsed.getRaw("long")); - Assert.assertEquals(1.23456791E11f, parsed.getFloatMetric("long"), 0.0f); + Assert.assertEquals(1.23456791E11f, parsed.getMetric("long").floatValue(), 0.0f); Assert.assertEquals(1412705931123L, parsed.getTimestampFromEpoch()); } diff --git a/benchmarks/src/main/java/io/druid/benchmark/ExpressionBenchmark.java b/benchmarks/src/main/java/io/druid/benchmark/ExpressionBenchmark.java index 7954ac782b1d..91bfb54c92df 100644 --- a/benchmarks/src/main/java/io/druid/benchmark/ExpressionBenchmark.java +++ b/benchmarks/src/main/java/io/druid/benchmark/ExpressionBenchmark.java @@ -33,9 +33,9 @@ import io.druid.query.aggregation.DoubleSumAggregatorFactory; import io.druid.query.aggregation.JavaScriptAggregatorFactory; import io.druid.query.expression.TestExprMacroTable; +import io.druid.segment.BaseFloatColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.Cursor; -import io.druid.segment.FloatColumnSelector; import io.druid.segment.QueryableIndex; import io.druid.segment.QueryableIndexStorageAdapter; import io.druid.segment.VirtualColumns; @@ -152,8 +152,8 @@ public void queryUsingNative(Blackhole blackhole) throws Exception final Double result = compute( columnSelectorFactory -> new NativeBufferAggregator( - columnSelectorFactory.makeFloatColumnSelector("x"), - columnSelectorFactory.makeFloatColumnSelector("y") + columnSelectorFactory.makeColumnValueSelector("x"), + columnSelectorFactory.makeColumnValueSelector("y") ) ); blackhole.consume(result); @@ -197,10 +197,13 @@ private double compute(final Function a private static class NativeBufferAggregator implements BufferAggregator { - private final FloatColumnSelector xSelector; - private final FloatColumnSelector ySelector; + private final BaseFloatColumnValueSelector xSelector; + private final BaseFloatColumnValueSelector ySelector; - public NativeBufferAggregator(final FloatColumnSelector xSelector, final FloatColumnSelector ySelector) + public NativeBufferAggregator( + final BaseFloatColumnValueSelector xSelector, + final BaseFloatColumnValueSelector ySelector + ) { this.xSelector = xSelector; this.ySelector = ySelector; diff --git a/benchmarks/src/main/java/io/druid/benchmark/FilterPartitionBenchmark.java b/benchmarks/src/main/java/io/druid/benchmark/FilterPartitionBenchmark.java index 0ec205463d39..ca011055bb94 100644 --- a/benchmarks/src/main/java/io/druid/benchmark/FilterPartitionBenchmark.java +++ b/benchmarks/src/main/java/io/druid/benchmark/FilterPartitionBenchmark.java @@ -52,12 +52,12 @@ import io.druid.query.filter.OrDimFilter; import io.druid.query.filter.SelectorDimFilter; import io.druid.query.ordering.StringComparators; +import io.druid.segment.BaseLongColumnValueSelector; import io.druid.segment.Cursor; import io.druid.segment.DimensionSelector; import io.druid.segment.IndexIO; import io.druid.segment.IndexMergerV9; import io.druid.segment.IndexSpec; -import io.druid.segment.LongColumnSelector; import io.druid.segment.QueryableIndex; import io.druid.segment.QueryableIndexStorageAdapter; import io.druid.segment.StorageAdapter; @@ -542,7 +542,7 @@ private Sequence> readCursorsLong(Sequence cursors, final Bla public List apply(Cursor input) { List longvals = new ArrayList(); - LongColumnSelector selector = input.getColumnSelectorFactory().makeLongColumnSelector("sumLongSequential"); + BaseLongColumnValueSelector selector = input.getColumnSelectorFactory().makeColumnValueSelector("sumLongSequential"); while (!input.isDone()) { long rowval = selector.getLong(); blackhole.consume(rowval); diff --git a/common/src/main/java/io/druid/annotations/EverythingIsNonnullByDefault.java b/common/src/main/java/io/druid/annotations/EverythingIsNonnullByDefault.java new file mode 100644 index 000000000000..2ace2165325b --- /dev/null +++ b/common/src/main/java/io/druid/annotations/EverythingIsNonnullByDefault.java @@ -0,0 +1,40 @@ +/* + * Licensed to Metamarkets Group Inc. (Metamarkets) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Metamarkets licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.druid.annotations; + +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * This annotation can be applied to a package, class or method to indicate that all + * class fields and method parameters and return values in that element are nonnull + * by default unless overridden. + */ +@Documented +@Nonnull +@TypeQualifierDefault({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface EverythingIsNonnullByDefault +{ +} diff --git a/common/src/main/java/io/druid/common/utils/UUIDUtils.java b/common/src/main/java/io/druid/common/utils/UUIDUtils.java index 903fb802bbb9..4197d1ed1a5c 100644 --- a/common/src/main/java/io/druid/common/utils/UUIDUtils.java +++ b/common/src/main/java/io/druid/common/utils/UUIDUtils.java @@ -21,6 +21,7 @@ import com.google.common.base.Joiner; import com.google.common.base.Strings; +import io.druid.java.util.common.StringUtils; import java.util.ArrayList; import java.util.UUID; @@ -53,7 +54,8 @@ public static String generateUuid(String... extraData) extra = Joiner.on(UUID_DELIM).join(extraStrings); } } - final String uuid = UUID.randomUUID().toString().replace("-", ""); // We don't use "-" in general, so remove them here. + // We don't use "-" in general, so remove them here. + final String uuid = StringUtils.removeChar(UUID.randomUUID().toString(), '-'); return extra == null ? uuid : (extra + UUID_DELIM + uuid); } } diff --git a/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampAggregator.java b/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampAggregator.java index 40abcb7205c8..517a54e355f7 100644 --- a/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampAggregator.java +++ b/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampAggregator.java @@ -20,7 +20,7 @@ package io.druid.query.aggregation; import io.druid.data.input.impl.TimestampSpec; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import java.util.Comparator; @@ -37,7 +37,7 @@ static Object combineValues(Comparator comparator, Object lhs, Object rhs) } } - private final ObjectColumnSelector selector; + private final BaseObjectColumnValueSelector selector; private final String name; private final TimestampSpec timestampSpec; private final Comparator comparator; @@ -47,7 +47,7 @@ static Object combineValues(Comparator comparator, Object lhs, Object rhs) public TimestampAggregator( String name, - ObjectColumnSelector selector, + BaseObjectColumnValueSelector selector, TimestampSpec timestampSpec, Comparator comparator, Long initValue diff --git a/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampAggregatorFactory.java b/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampAggregatorFactory.java index abb98917695d..f33d1d4a7f02 100644 --- a/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampAggregatorFactory.java +++ b/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampAggregatorFactory.java @@ -67,13 +67,13 @@ public class TimestampAggregatorFactory extends AggregatorFactory @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - return new TimestampAggregator(name, metricFactory.makeObjectColumnSelector(fieldName), timestampSpec, comparator, initValue); + return new TimestampAggregator(name, metricFactory.makeColumnValueSelector(fieldName), timestampSpec, comparator, initValue); } @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - return new TimestampBufferAggregator(metricFactory.makeObjectColumnSelector(fieldName), timestampSpec, comparator, initValue); + return new TimestampBufferAggregator(metricFactory.makeColumnValueSelector(fieldName), timestampSpec, comparator, initValue); } @Override @@ -106,7 +106,7 @@ public void reset(ColumnValueSelector selector) private long getTimestamp(ColumnValueSelector selector) { if (selector instanceof ObjectColumnSelector) { - Object input = ((ObjectColumnSelector) selector).getObject(); + Object input = selector.getObject(); return convertLong(timestampSpec, input); } else { return selector.getLong(); diff --git a/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampBufferAggregator.java b/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampBufferAggregator.java index 133e7e93c649..7c49f4e04452 100644 --- a/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampBufferAggregator.java +++ b/extensions-contrib/time-min-max/src/main/java/io/druid/query/aggregation/TimestampBufferAggregator.java @@ -21,20 +21,20 @@ import io.druid.data.input.impl.TimestampSpec; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import java.nio.ByteBuffer; import java.util.Comparator; public class TimestampBufferAggregator implements BufferAggregator { - private final ObjectColumnSelector selector; + private final BaseObjectColumnValueSelector selector; private final TimestampSpec timestampSpec; private final Comparator comparator; private final Long initValue; public TimestampBufferAggregator( - ObjectColumnSelector selector, + BaseObjectColumnValueSelector selector, TimestampSpec timestampSpec, Comparator comparator, Long initValue) diff --git a/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampAggregationSelectTest.java b/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampAggregationSelectTest.java index 914835377610..be2bf57958da 100644 --- a/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampAggregationSelectTest.java +++ b/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampAggregationSelectTest.java @@ -103,7 +103,7 @@ public void setup() throws Exception selector = new TestObjectColumnSelector<>(values); selectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(selectorFactory.makeObjectColumnSelector("test")).andReturn(selector); + EasyMock.expect(selectorFactory.makeColumnValueSelector("test")).andReturn(selector); EasyMock.replay(selectorFactory); } diff --git a/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampGroupByAggregationTest.java b/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampGroupByAggregationTest.java index c192c1032026..3a7c4ae5cecf 100644 --- a/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampGroupByAggregationTest.java +++ b/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampGroupByAggregationTest.java @@ -113,7 +113,7 @@ public void setup() throws Exception selector = new TestObjectColumnSelector<>(values); selectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(selectorFactory.makeObjectColumnSelector("test")).andReturn(selector); + EasyMock.expect(selectorFactory.makeColumnValueSelector("test")).andReturn(selector); EasyMock.replay(selectorFactory); } diff --git a/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampMinMaxAggregatorTest.java b/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampMinMaxAggregatorTest.java index b6d33cddbba5..595b9f5a7142 100644 --- a/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampMinMaxAggregatorTest.java +++ b/extensions-contrib/time-min-max/src/test/java/io/druid/query/aggregation/TimestampMinMaxAggregatorTest.java @@ -125,7 +125,7 @@ public void configure(Binder binder) aggregatorFactory = mapper.readValue(json, aggClass); selector = new TestObjectColumnSelector<>(values); selectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(selectorFactory.makeObjectColumnSelector("test")).andReturn(selector); + EasyMock.expect(selectorFactory.makeColumnValueSelector("test")).andReturn(selector); EasyMock.replay(selectorFactory); } diff --git a/extensions-contrib/virtual-columns/src/main/java/io/druid/segment/MapVirtualColumn.java b/extensions-contrib/virtual-columns/src/main/java/io/druid/segment/MapVirtualColumn.java index 932c8c2837a9..e5485a0cc506 100644 --- a/extensions-contrib/virtual-columns/src/main/java/io/druid/segment/MapVirtualColumn.java +++ b/extensions-contrib/virtual-columns/src/main/java/io/druid/segment/MapVirtualColumn.java @@ -23,21 +23,16 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Maps; import com.metamx.common.StringUtils; -import io.druid.query.dimension.DefaultDimensionSpec; import io.druid.query.dimension.DimensionSpec; import io.druid.query.filter.DimFilterUtils; import io.druid.segment.column.ColumnCapabilities; import io.druid.segment.column.ColumnCapabilitiesImpl; import io.druid.segment.column.ValueType; -import io.druid.segment.data.IndexedInts; import io.druid.segment.virtual.VirtualColumnCacheHelper; import java.nio.ByteBuffer; import java.util.List; -import java.util.Map; -import java.util.Objects; /** */ @@ -63,104 +58,6 @@ public MapVirtualColumn( this.outputName = outputName; } - @Override - public ObjectColumnSelector makeObjectColumnSelector(String dimension, ColumnSelectorFactory factory) - { - final DimensionSelector keySelector = factory.makeDimensionSelector(DefaultDimensionSpec.of(keyDimension)); - final DimensionSelector valueSelector = factory.makeDimensionSelector(DefaultDimensionSpec.of(valueDimension)); - - final String subColumnName = VirtualColumns.splitColumnName(dimension).rhs; - - if (subColumnName == null) { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Map.class; - } - - @Override - public Map getObject() - { - final IndexedInts keyIndices = keySelector.getRow(); - final IndexedInts valueIndices = valueSelector.getRow(); - if (keyIndices == null || valueIndices == null) { - return null; - } - final int limit = Math.min(keyIndices.size(), valueIndices.size()); - final Map map = Maps.newHashMapWithExpectedSize(limit); - for (int i = 0; i < limit; i++) { - map.put( - keySelector.lookupName(keyIndices.get(i)), - valueSelector.lookupName(valueIndices.get(i)) - ); - } - return map; - } - }; - } - - IdLookup keyIdLookup = keySelector.idLookup(); - if (keyIdLookup != null) { - final int keyId = keyIdLookup.lookupId(subColumnName); - if (keyId < 0) { - return NullStringObjectColumnSelector.instance(); - } - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return String.class; - } - - @Override - public String getObject() - { - final IndexedInts keyIndices = keySelector.getRow(); - final IndexedInts valueIndices = valueSelector.getRow(); - if (keyIndices == null || valueIndices == null) { - return null; - } - final int limit = Math.min(keyIndices.size(), valueIndices.size()); - for (int i = 0; i < limit; i++) { - if (keyIndices.get(i) == keyId) { - return valueSelector.lookupName(valueIndices.get(i)); - } - } - return null; - } - }; - } else { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return String.class; - } - - @Override - public String getObject() - { - final IndexedInts keyIndices = keySelector.getRow(); - final IndexedInts valueIndices = valueSelector.getRow(); - if (keyIndices == null || valueIndices == null) { - return null; - } - final int limit = Math.min(keyIndices.size(), valueIndices.size()); - for (int i = 0; i < limit; i++) { - if (Objects.equals(keySelector.lookupName(keyIndices.get(i)), subColumnName)) { - return valueSelector.lookupName(valueIndices.get(i)); - } - } - return null; - } - }; - } - } - @Override public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec, ColumnSelectorFactory factory) { @@ -169,21 +66,9 @@ public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec, Colu } @Override - public FloatColumnSelector makeFloatColumnSelector(String columnName, ColumnSelectorFactory factory) - { - return ZeroFloatColumnSelector.instance(); - } - - @Override - public LongColumnSelector makeLongColumnSelector(String columnName, ColumnSelectorFactory factory) - { - return ZeroLongColumnSelector.instance(); - } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName, ColumnSelectorFactory factory) + public ColumnValueSelector makeColumnValueSelector(String columnName, ColumnSelectorFactory factory) { - return ZeroDoubleColumnSelector.instance(); + return NilColumnValueSelector.instance(); } @Override diff --git a/extensions-core/avro-extensions/src/test/java/io/druid/data/input/AvroStreamInputRowParserTest.java b/extensions-core/avro-extensions/src/test/java/io/druid/data/input/AvroStreamInputRowParserTest.java index f062a3acd951..d12f5ca432f9 100644 --- a/extensions-core/avro-extensions/src/test/java/io/druid/data/input/AvroStreamInputRowParserTest.java +++ b/extensions-core/avro-extensions/src/test/java/io/druid/data/input/AvroStreamInputRowParserTest.java @@ -242,9 +242,9 @@ public Integer apply(@Nullable String input) assertEquals(Collections.singletonList(String.valueOf(SOME_RECORD_VALUE)), inputRow.getDimension("someRecord")); // test metrics - assertEquals(SOME_FLOAT_VALUE, inputRow.getFloatMetric("someFloat"), 0); - assertEquals(SOME_LONG_VALUE, inputRow.getLongMetric("someLong")); - assertEquals(SOME_INT_VALUE, inputRow.getLongMetric("someInt")); + assertEquals(SOME_FLOAT_VALUE, inputRow.getMetric("someFloat").floatValue(), 0); + assertEquals(SOME_LONG_VALUE, inputRow.getMetric("someLong")); + assertEquals(SOME_INT_VALUE, inputRow.getMetric("someInt")); } public static GenericRecord buildSomeAvroDatum() throws IOException diff --git a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/EmptySketchBufferAggregator.java b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/EmptySketchBufferAggregator.java deleted file mode 100644 index 510ed4c292ef..000000000000 --- a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/EmptySketchBufferAggregator.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to Metamarkets Group Inc. (Metamarkets) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. Metamarkets licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package io.druid.query.aggregation.datasketches.theta; - -import io.druid.query.aggregation.BufferAggregator; -import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; - -import java.nio.ByteBuffer; - -public final class EmptySketchBufferAggregator implements BufferAggregator -{ - private static final EmptySketchBufferAggregator INSTANCE = new EmptySketchBufferAggregator(); - - public static EmptySketchBufferAggregator instance() - { - return INSTANCE; - } - - private EmptySketchBufferAggregator() - { - } - - @Override - public void init(ByteBuffer buf, int position) - { - } - - @Override - public void aggregate(ByteBuffer buf, int position) - { - } - - @Override - public Object get(ByteBuffer buf, int position) - { - return SketchHolder.EMPTY; - } - - @Override - public float getFloat(ByteBuffer buf, int position) - { - throw new UnsupportedOperationException("Not implemented"); - } - - @Override - public long getLong(ByteBuffer buf, int position) - { - throw new UnsupportedOperationException("Not implemented"); - } - - @Override - public double getDouble(ByteBuffer buf, int position) - { - throw new UnsupportedOperationException("Not implemented"); - } - - @Override - public void close() - { - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - // nothing to inspect - } -} diff --git a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregator.java b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregator.java index 8d2df6fb9a63..120e85479907 100644 --- a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregator.java +++ b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregator.java @@ -24,19 +24,24 @@ import com.yahoo.sketches.theta.Union; import io.druid.java.util.common.ISE; import io.druid.query.aggregation.Aggregator; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.ColumnValueSelector; import java.util.List; public class SketchAggregator implements Aggregator { - private final ObjectColumnSelector selector; - + private final ColumnValueSelector selector; + private final int size; private Union union; - public SketchAggregator(ObjectColumnSelector selector, int size) + public SketchAggregator(ColumnValueSelector selector, int size) { this.selector = selector; + this.size = size; + } + + private void initUnion() + { union = new SynchronizedUnion((Union) SetOperation.builder().build(size, Family.UNION)); } @@ -47,19 +52,26 @@ public void aggregate() if (update == null) { return; } - + if (union == null) { + initUnion(); + } updateUnion(union, update); } @Override public void reset() { - union.reset(); + if (union != null) { + union.reset(); + } } @Override public Object get() { + if (union == null) { + return SketchHolder.EMPTY; + } //in the code below, I am returning SetOp.getResult(true, null) //"true" returns an ordered sketch but slower to compute than unordered sketch. //however, advantage of ordered sketch is that they are faster to "union" later diff --git a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java index 8ec4afd55d95..9e23932b2848 100644 --- a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java +++ b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java @@ -34,7 +34,6 @@ import io.druid.query.aggregation.ObjectAggregateCombiner; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.ColumnValueSelector; -import io.druid.segment.ObjectColumnSelector; import javax.annotation.Nullable; import java.nio.ByteBuffer; @@ -66,24 +65,16 @@ public SketchAggregatorFactory(String name, String fieldName, Integer size, byte @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(fieldName); - if (selector == null) { - return new EmptySketchAggregator(); - } else { - return new SketchAggregator(selector, size); - } + ColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); + return new SketchAggregator(selector, size); } @SuppressWarnings("unchecked") @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(fieldName); - if (selector == null) { - return EmptySketchBufferAggregator.instance(); - } else { - return new SketchBufferAggregator(selector, size, getMaxIntermediateSize()); - } + ColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); + return new SketchBufferAggregator(selector, size, getMaxIntermediateSize()); } @Override @@ -99,8 +90,11 @@ public Comparator getComparator() } @Override - public Object combine(Object lhs, Object rhs) + public Object combine(Object lhs, @Nullable Object rhs) { + if (rhs == null) { + return lhs; + } return SketchHolder.combine(lhs, rhs, size); } @@ -122,12 +116,11 @@ public void reset(ColumnValueSelector selector) @Override public void fold(ColumnValueSelector selector) { - @SuppressWarnings("unchecked") - SketchHolder other = ((ObjectColumnSelector) selector).getObject(); - // SketchAggregatorFactory.combine() delegates to SketchHolder.combine() and it doesn't check for nulls, so we - // neither. - other.updateUnion(union); - combined.invalidateCache(); + SketchHolder other = (SketchHolder) selector.getObject(); + if (other != null) { + other.updateUnion(union); + combined.invalidateCache(); + } } @Override diff --git a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchBufferAggregator.java b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchBufferAggregator.java index 266bdf176986..760bafd2eb88 100644 --- a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchBufferAggregator.java +++ b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchBufferAggregator.java @@ -27,7 +27,7 @@ import com.yahoo.sketches.theta.Union; import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.ColumnValueSelector; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -36,13 +36,13 @@ public class SketchBufferAggregator implements BufferAggregator { - private final ObjectColumnSelector selector; + private final ColumnValueSelector selector; private final int size; private final int maxIntermediateSize; private final IdentityHashMap> unions = new IdentityHashMap<>(); private final IdentityHashMap nmCache = new IdentityHashMap<>(); - public SketchBufferAggregator(ObjectColumnSelector selector, int size, int maxIntermediateSize) + public SketchBufferAggregator(ColumnValueSelector selector, int size, int maxIntermediateSize) { this.selector = selector; this.size = size; @@ -63,23 +63,27 @@ public void aggregate(ByteBuffer buf, int position) return; } - Union union = getUnion(buf, position); + Union union = getOrCreateUnion(buf, position); SketchAggregator.updateUnion(union, update); } @Override public Object get(ByteBuffer buf, int position) { + Int2ObjectMap unionMap = unions.get(buf); + Union union = unionMap != null ? unionMap.get(position) : null; + if (union == null) { + return SketchHolder.EMPTY; + } //in the code below, I am returning SetOp.getResult(true, null) //"true" returns an ordered sketch but slower to compute than unordered sketch. //however, advantage of ordered sketch is that they are faster to "union" later //given that results from the aggregator will be combined further, it is better //to return the ordered sketch here - return SketchHolder.of(getUnion(buf, position).getResult(true, null)); + return SketchHolder.of(union.getResult(true, null)); } - //Note that this is not threadsafe and I don't think it needs to be - private Union getUnion(ByteBuffer buf, int position) + private Union getOrCreateUnion(ByteBuffer buf, int position) { Int2ObjectMap unionMap = unions.get(buf); Union union = unionMap != null ? unionMap.get(position) : null; diff --git a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregator.java b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregator.java index fcc4951d19ee..35b6a8942ef9 100644 --- a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregator.java +++ b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregator.java @@ -21,7 +21,7 @@ import com.google.common.primitives.Longs; import io.druid.query.aggregation.Aggregator; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; import java.util.Comparator; @@ -41,7 +41,7 @@ static ApproximateHistogram combineHistograms(Object lhs, Object rhs) return ((ApproximateHistogram) lhs).foldFast((ApproximateHistogram) rhs); } - private final FloatColumnSelector selector; + private final BaseFloatColumnValueSelector selector; private final int resolution; private final float lowerLimit; private final float upperLimit; @@ -49,7 +49,7 @@ static ApproximateHistogram combineHistograms(Object lhs, Object rhs) private ApproximateHistogram histogram; public ApproximateHistogramAggregator( - FloatColumnSelector selector, + BaseFloatColumnValueSelector selector, int resolution, float lowerLimit, float upperLimit diff --git a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregatorFactory.java b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregatorFactory.java index 1cfb11de856f..189f2e640fca 100644 --- a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregatorFactory.java +++ b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregatorFactory.java @@ -36,7 +36,6 @@ import io.druid.query.aggregation.ObjectAggregateCombiner; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.ColumnValueSelector; -import io.druid.segment.ObjectColumnSelector; import org.apache.commons.codec.binary.Base64; import javax.annotation.Nullable; @@ -85,7 +84,7 @@ public ApproximateHistogramAggregatorFactory( public Aggregator factorize(ColumnSelectorFactory metricFactory) { return new ApproximateHistogramAggregator( - metricFactory.makeFloatColumnSelector(fieldName), + metricFactory.makeColumnValueSelector(fieldName), resolution, lowerLimit, upperLimit @@ -96,7 +95,7 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { return new ApproximateHistogramBufferAggregator( - metricFactory.makeFloatColumnSelector(fieldName), + metricFactory.makeColumnValueSelector(fieldName), resolution, lowerLimit, upperLimit @@ -127,16 +126,14 @@ public AggregateCombiner makeAggregateCombiner() @Override public void reset(ColumnValueSelector selector) { - @SuppressWarnings("unchecked") - ApproximateHistogram first = ((ObjectColumnSelector) selector).getObject(); + ApproximateHistogram first = (ApproximateHistogram) selector.getObject(); combined.copy(first); } @Override public void fold(ColumnValueSelector selector) { - @SuppressWarnings("unchecked") - ApproximateHistogram other = ((ObjectColumnSelector) selector).getObject(); + ApproximateHistogram other = (ApproximateHistogram) selector.getObject(); combined.foldFast(other); } diff --git a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramBufferAggregator.java b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramBufferAggregator.java index d36394153416..8d9d97d18c5d 100644 --- a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramBufferAggregator.java +++ b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramBufferAggregator.java @@ -21,18 +21,23 @@ import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; import java.nio.ByteBuffer; public class ApproximateHistogramBufferAggregator implements BufferAggregator { - private final FloatColumnSelector selector; + private final BaseFloatColumnValueSelector selector; private final int resolution; private final float lowerLimit; private final float upperLimit; - public ApproximateHistogramBufferAggregator(FloatColumnSelector selector, int resolution, float lowerLimit, float upperLimit) + public ApproximateHistogramBufferAggregator( + BaseFloatColumnValueSelector selector, + int resolution, + float lowerLimit, + float upperLimit + ) { this.selector = selector; this.resolution = resolution; diff --git a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingAggregator.java b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingAggregator.java index a21f3ab3e81f..e3d4634ac2b3 100644 --- a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingAggregator.java +++ b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingAggregator.java @@ -21,11 +21,11 @@ import io.druid.query.aggregation.Aggregator; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.BaseObjectColumnValueSelector; public class ApproximateHistogramFoldingAggregator implements Aggregator { - private final ObjectColumnSelector selector; + private final BaseObjectColumnValueSelector selector; private final int resolution; private final float lowerLimit; private final float upperLimit; @@ -35,7 +35,7 @@ public class ApproximateHistogramFoldingAggregator implements Aggregator private long[] tmpBufferB; public ApproximateHistogramFoldingAggregator( - ObjectColumnSelector selector, + BaseObjectColumnValueSelector selector, int resolution, float lowerLimit, float upperLimit diff --git a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingAggregatorFactory.java b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingAggregatorFactory.java index f465cf6e3e0d..b35aac8909b0 100644 --- a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingAggregatorFactory.java +++ b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingAggregatorFactory.java @@ -24,7 +24,6 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.google.common.primitives.Floats; import com.google.common.primitives.Ints; - import io.druid.java.util.common.IAE; import io.druid.java.util.common.StringUtils; import io.druid.query.aggregation.Aggregator; @@ -32,7 +31,7 @@ import io.druid.query.aggregation.AggregatorUtil; import io.druid.query.aggregation.BufferAggregator; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.ColumnValueSelector; import java.nio.ByteBuffer; @@ -56,26 +55,8 @@ public ApproximateHistogramFoldingAggregatorFactory( @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(fieldName); - - if (selector == null) { - // gracefully handle undefined metrics - - selector = new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return ApproximateHistogram.class; - } - - @Override - public ApproximateHistogram getObject() - { - return new ApproximateHistogram(0); - } - }; - } + @SuppressWarnings("unchecked") + ColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); final Class cls = selector.classOfObject(); if (cls.equals(Object.class) || ApproximateHistogram.class.isAssignableFrom(cls)) { @@ -97,26 +78,8 @@ public ApproximateHistogram getObject() @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(fieldName); - - if (selector == null) { - // gracefully handle undefined metrics - - selector = new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return ApproximateHistogram.class; - } - - @Override - public ApproximateHistogram getObject() - { - return new ApproximateHistogram(0); - } - }; - } + @SuppressWarnings("unchecked") + ColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); final Class cls = selector.classOfObject(); if (cls.equals(Object.class) || ApproximateHistogram.class.isAssignableFrom(cls)) { diff --git a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingBufferAggregator.java b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingBufferAggregator.java index 2491688bc5f4..8f2f2593a672 100644 --- a/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingBufferAggregator.java +++ b/extensions-core/histogram/src/main/java/io/druid/query/aggregation/histogram/ApproximateHistogramFoldingBufferAggregator.java @@ -21,13 +21,13 @@ import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import java.nio.ByteBuffer; public class ApproximateHistogramFoldingBufferAggregator implements BufferAggregator { - private final ObjectColumnSelector selector; + private final BaseObjectColumnValueSelector selector; private final int resolution; private final float upperLimit; private final float lowerLimit; @@ -36,7 +36,7 @@ public class ApproximateHistogramFoldingBufferAggregator implements BufferAggreg private long[] tmpBufferB; public ApproximateHistogramFoldingBufferAggregator( - ObjectColumnSelector selector, + BaseObjectColumnValueSelector selector, int resolution, float lowerLimit, float upperLimit @@ -65,13 +65,16 @@ public void init(ByteBuffer buf, int position) @Override public void aggregate(ByteBuffer buf, int position) { + ApproximateHistogram hNext = selector.getObject(); + if (hNext == null) { + return; + } ByteBuffer mutationBuffer = buf.duplicate(); mutationBuffer.position(position); ApproximateHistogram h0 = ApproximateHistogram.fromBytesDense(mutationBuffer); h0.setLowerLimit(lowerLimit); h0.setUpperLimit(upperLimit); - ApproximateHistogram hNext = selector.getObject(); h0.foldFast(hNext, tmpBufferP, tmpBufferB); mutationBuffer.position(position); diff --git a/extensions-core/histogram/src/test/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregationTest.java b/extensions-core/histogram/src/test/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregationTest.java index 40ae210f0e98..6387ab353654 100644 --- a/extensions-core/histogram/src/test/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregationTest.java +++ b/extensions-core/histogram/src/test/java/io/druid/query/aggregation/histogram/ApproximateHistogramAggregationTest.java @@ -73,18 +73,18 @@ public static Collection constructorFeeder() throws IOException public void testIngestWithNullsIgnoredAndQuery() throws Exception { MapBasedRow row = ingestAndQuery(true); - Assert.assertEquals(92.782760, row.getFloatMetric("index_min"), 0.0001); - Assert.assertEquals(135.109191, row.getFloatMetric("index_max"), 0.0001); - Assert.assertEquals(133.69340, row.getFloatMetric("index_quantile"), 0.0001); + Assert.assertEquals(92.782760, row.getMetric("index_min").floatValue(), 0.0001); + Assert.assertEquals(135.109191, row.getMetric("index_max").floatValue(), 0.0001); + Assert.assertEquals(133.69340, row.getMetric("index_quantile").floatValue(), 0.0001); } @Test public void testIngestWithNullsToZeroAndQuery() throws Exception { MapBasedRow row = ingestAndQuery(false); - Assert.assertEquals(0.0, row.getFloatMetric("index_min"), 0.0001); - Assert.assertEquals(135.109191, row.getFloatMetric("index_max"), 0.0001); - Assert.assertEquals(131.428176, row.getFloatMetric("index_quantile"), 0.0001); + Assert.assertEquals(0.0, row.getMetric("index_min").floatValue(), 0.0001); + Assert.assertEquals(135.109191, row.getMetric("index_max").floatValue(), 0.0001); + Assert.assertEquals(131.428176, row.getMetric("index_quantile").floatValue(), 0.0001); } private MapBasedRow ingestAndQuery(boolean ignoreNulls) throws Exception diff --git a/extensions-core/protobuf-extensions/src/test/java/io/druid/data/input/protobuf/ProtobufInputRowParserTest.java b/extensions-core/protobuf-extensions/src/test/java/io/druid/data/input/protobuf/ProtobufInputRowParserTest.java index 863c0619bc90..20f623a14b8f 100644 --- a/extensions-core/protobuf-extensions/src/test/java/io/druid/data/input/protobuf/ProtobufInputRowParserTest.java +++ b/extensions-core/protobuf-extensions/src/test/java/io/druid/data/input/protobuf/ProtobufInputRowParserTest.java @@ -157,9 +157,9 @@ public void testParse() throws Exception assertDimensionEquals(row, "bar0", "bar0"); - assertEquals(47.11F, row.getFloatMetric("someFloatColumn"), 0.0); - assertEquals(815.0F, row.getFloatMetric("someIntColumn"), 0.0); - assertEquals(816.0F, row.getFloatMetric("someLongColumn"), 0.0); + assertEquals(47.11F, row.getMetric("someFloatColumn").floatValue(), 0.0); + assertEquals(815.0F, row.getMetric("someIntColumn").floatValue(), 0.0); + assertEquals(816.0F, row.getMetric("someLongColumn").floatValue(), 0.0); } private void assertDimensionEquals(InputRow row, String dimension, Object expected) diff --git a/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregator.java b/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregator.java index f4c6763e5e9c..0bb32de6f020 100644 --- a/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregator.java +++ b/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregator.java @@ -20,9 +20,9 @@ package io.druid.query.aggregation.variance; import io.druid.query.aggregation.Aggregator; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; +import io.druid.segment.BaseObjectColumnValueSelector; /** */ @@ -71,9 +71,9 @@ public double getDouble() public static final class FloatVarianceAggregator extends VarianceAggregator { - private final FloatColumnSelector selector; + private final BaseFloatColumnValueSelector selector; - public FloatVarianceAggregator(FloatColumnSelector selector) + public FloatVarianceAggregator(BaseFloatColumnValueSelector selector) { super(); this.selector = selector; @@ -88,9 +88,9 @@ public void aggregate() public static final class LongVarianceAggregator extends VarianceAggregator { - private final LongColumnSelector selector; + private final BaseLongColumnValueSelector selector; - public LongVarianceAggregator(LongColumnSelector selector) + public LongVarianceAggregator(BaseLongColumnValueSelector selector) { super(); this.selector = selector; @@ -105,9 +105,9 @@ public void aggregate() public static final class ObjectVarianceAggregator extends VarianceAggregator { - private final ObjectColumnSelector selector; + private final BaseObjectColumnValueSelector selector; - public ObjectVarianceAggregator(ObjectColumnSelector selector) + public ObjectVarianceAggregator(BaseObjectColumnValueSelector selector) { super(); this.selector = selector; diff --git a/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregatorCollector.java b/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregatorCollector.java index 3d048cf835a6..a6c8aad4ee39 100644 --- a/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregatorCollector.java +++ b/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregatorCollector.java @@ -24,6 +24,7 @@ import com.google.common.primitives.Doubles; import com.google.common.primitives.Longs; +import javax.annotation.Nullable; import java.nio.ByteBuffer; import java.util.Comparator; @@ -74,9 +75,9 @@ public int compare(VarianceAggregatorCollector o1, VarianceAggregatorCollector o } }; - void fold(VarianceAggregatorCollector other) + void fold(@Nullable VarianceAggregatorCollector other) { - if (other.count == 0) { + if (other == null || other.count == 0) { return; } if (this.count == 0) { @@ -93,7 +94,7 @@ void fold(VarianceAggregatorCollector other) this.sum += other.sum; } - static Object combineValues(Object lhs, Object rhs) + static Object combineValues(Object lhs, @Nullable Object rhs) { ((VarianceAggregatorCollector) lhs).fold((VarianceAggregatorCollector) rhs); return lhs; diff --git a/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregatorFactory.java b/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregatorFactory.java index 9561151e6d9b..3874a981b0eb 100644 --- a/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregatorFactory.java +++ b/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregatorFactory.java @@ -25,18 +25,18 @@ import com.google.common.base.Preconditions; import io.druid.java.util.common.IAE; import io.druid.java.util.common.StringUtils; +import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.aggregation.Aggregator; import io.druid.query.aggregation.AggregatorFactory; import io.druid.query.aggregation.AggregatorFactoryNotMergeableException; import io.druid.query.aggregation.AggregatorUtil; import io.druid.query.aggregation.BufferAggregator; -import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.aggregation.NoopAggregator; import io.druid.query.aggregation.NoopBufferAggregator; import io.druid.query.aggregation.ObjectAggregateCombiner; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.ColumnValueSelector; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.NilColumnValueSelector; import org.apache.commons.codec.binary.Base64; import java.nio.ByteBuffer; @@ -96,15 +96,15 @@ public int getMaxIntermediateSize() @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(fieldName); - if (selector == null) { + ColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); + if (selector instanceof NilColumnValueSelector) { return NoopAggregator.instance(); } if ("float".equalsIgnoreCase(inputType)) { - return new VarianceAggregator.FloatVarianceAggregator(metricFactory.makeFloatColumnSelector(fieldName)); + return new VarianceAggregator.FloatVarianceAggregator(selector); } else if ("long".equalsIgnoreCase(inputType)) { - return new VarianceAggregator.LongVarianceAggregator(metricFactory.makeLongColumnSelector(fieldName)); + return new VarianceAggregator.LongVarianceAggregator(selector); } else if ("variance".equalsIgnoreCase(inputType)) { return new VarianceAggregator.ObjectVarianceAggregator(selector); } @@ -116,20 +116,14 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(fieldName); - if (selector == null) { + ColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); + if (selector instanceof NilColumnValueSelector) { return NoopBufferAggregator.instance(); } if ("float".equalsIgnoreCase(inputType)) { - return new VarianceBufferAggregator.FloatVarianceAggregator( - name, - metricFactory.makeFloatColumnSelector(fieldName) - ); + return new VarianceBufferAggregator.FloatVarianceAggregator(name, selector); } else if ("long".equalsIgnoreCase(inputType)) { - return new VarianceBufferAggregator.LongVarianceAggregator( - name, - metricFactory.makeLongColumnSelector(fieldName) - ); + return new VarianceBufferAggregator.LongVarianceAggregator(name, selector); } else if ("variance".equalsIgnoreCase(inputType)) { return new VarianceBufferAggregator.ObjectVarianceAggregator(name, selector); } @@ -156,16 +150,14 @@ public AggregateCombiner makeAggregateCombiner() @Override public void reset(ColumnValueSelector selector) { - @SuppressWarnings("unchecked") - VarianceAggregatorCollector first = ((ObjectColumnSelector) selector).getObject(); + VarianceAggregatorCollector first = (VarianceAggregatorCollector) selector.getObject(); combined.copyFrom(first); } @Override public void fold(ColumnValueSelector selector) { - @SuppressWarnings("unchecked") - VarianceAggregatorCollector other = ((ObjectColumnSelector) selector).getObject(); + VarianceAggregatorCollector other = (VarianceAggregatorCollector) selector.getObject(); combined.fold(other); } diff --git a/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceBufferAggregator.java b/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceBufferAggregator.java index af851e8c548f..c5db0552292f 100644 --- a/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceBufferAggregator.java +++ b/extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceBufferAggregator.java @@ -19,13 +19,14 @@ package io.druid.query.aggregation.variance; +import com.google.common.base.Preconditions; import com.google.common.primitives.Doubles; import com.google.common.primitives.Longs; import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import java.nio.ByteBuffer; @@ -87,9 +88,9 @@ public void close() public static final class FloatVarianceAggregator extends VarianceBufferAggregator { - private final FloatColumnSelector selector; + private final BaseFloatColumnValueSelector selector; - public FloatVarianceAggregator(String name, FloatColumnSelector selector) + public FloatVarianceAggregator(String name, BaseFloatColumnValueSelector selector) { super(name); this.selector = selector; @@ -119,9 +120,9 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) public static final class LongVarianceAggregator extends VarianceBufferAggregator { - private final LongColumnSelector selector; + private final BaseLongColumnValueSelector selector; - public LongVarianceAggregator(String name, LongColumnSelector selector) + public LongVarianceAggregator(String name, BaseLongColumnValueSelector selector) { super(name); this.selector = selector; @@ -151,9 +152,9 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) public static final class ObjectVarianceAggregator extends VarianceBufferAggregator { - private final ObjectColumnSelector selector; + private final BaseObjectColumnValueSelector selector; - public ObjectVarianceAggregator(String name, ObjectColumnSelector selector) + public ObjectVarianceAggregator(String name, BaseObjectColumnValueSelector selector) { super(name); this.selector = selector; @@ -163,7 +164,7 @@ public ObjectVarianceAggregator(String name, ObjectColumnSelector selector) public void aggregate(ByteBuffer buf, int position) { VarianceAggregatorCollector holder2 = (VarianceAggregatorCollector) selector.getObject(); - + Preconditions.checkState(holder2 != null); long count = buf.getLong(position + COUNT_OFFSET); if (count == 0) { buf.putLong(position, holder2.count); diff --git a/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorCollectorTest.java b/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorCollectorTest.java index 9817edc2daaf..95f9f2e347d0 100644 --- a/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorCollectorTest.java +++ b/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorCollectorTest.java @@ -21,8 +21,8 @@ import com.google.common.collect.Lists; import io.druid.java.util.common.Pair; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.TestFloatColumnSelector; +import io.druid.segment.TestObjectColumnSelector; import org.junit.Assert; import org.junit.Test; @@ -152,7 +152,7 @@ public float getFloat() } } - private static class ObjectHandOver implements ObjectColumnSelector + private static class ObjectHandOver extends TestObjectColumnSelector { Object v; diff --git a/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorTest.java b/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorTest.java index b671f1a78d6d..202ac7980de8 100644 --- a/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorTest.java +++ b/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorTest.java @@ -66,9 +66,9 @@ public void setup() { selector = new TestFloatColumnSelector(values); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeObjectColumnSelector("nilly")) + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")) .andReturn(new TestObjectColumnSelector<>(new Object[] {0.0f})); - EasyMock.expect(colSelectorFactory.makeFloatColumnSelector("nilly")).andReturn(selector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(selector); EasyMock.replay(colSelectorFactory); } diff --git a/indexing-hadoop/src/main/java/io/druid/indexer/IndexGeneratorJob.java b/indexing-hadoop/src/main/java/io/druid/indexer/IndexGeneratorJob.java index f7194e892eb5..03754668a980 100644 --- a/indexing-hadoop/src/main/java/io/druid/indexer/IndexGeneratorJob.java +++ b/indexing-hadoop/src/main/java/io/druid/indexer/IndexGeneratorJob.java @@ -426,21 +426,9 @@ public Object getRaw(String dimension) } @Override - public float getFloatMetric(String metric) + public Number getMetric(String metric) { - return row.getFloatMetric(metric); - } - - @Override - public long getLongMetric(String metric) - { - return row.getLongMetric(metric); - } - - @Override - public double getDoubleMetric(String metric) - { - return row.getDoubleMetric(metric); + return row.getMetric(metric); } @Override diff --git a/indexing-hadoop/src/main/java/io/druid/indexer/hadoop/SegmentInputRow.java b/indexing-hadoop/src/main/java/io/druid/indexer/hadoop/SegmentInputRow.java index 93f6d59e784b..7371ade58b41 100644 --- a/indexing-hadoop/src/main/java/io/druid/indexer/hadoop/SegmentInputRow.java +++ b/indexing-hadoop/src/main/java/io/druid/indexer/hadoop/SegmentInputRow.java @@ -71,21 +71,9 @@ public Object getRaw(String dimension) } @Override - public float getFloatMetric(String metric) + public Number getMetric(String metric) { - return delegate.getFloatMetric(metric); - } - - @Override - public long getLongMetric(String metric) - { - return delegate.getLongMetric(metric); - } - - @Override - public double getDoubleMetric(String metric) - { - return delegate.getDoubleMetric(metric); + return delegate.getMetric(metric); } @Override diff --git a/indexing-hadoop/src/test/java/io/druid/indexer/BatchDeltaIngestionTest.java b/indexing-hadoop/src/test/java/io/druid/indexer/BatchDeltaIngestionTest.java index 86cfc9ca59e6..66597e841d53 100644 --- a/indexing-hadoop/src/test/java/io/druid/indexer/BatchDeltaIngestionTest.java +++ b/indexing-hadoop/src/test/java/io/druid/indexer/BatchDeltaIngestionTest.java @@ -422,7 +422,7 @@ private void verifyRows(List> expectedRows, List actualRows) Assert.assertEquals(expected.get("time"), actual.getTimestamp()); Assert.assertEquals(expected.get("host"), actual.getDimension("host")); - Assert.assertEquals(expected.get("visited_sum"), actual.getLongMetric("visited_sum")); + Assert.assertEquals(expected.get("visited_sum"), actual.getMetric("visited_sum")); Assert.assertEquals( (Double) expected.get("unique_hosts"), (Double) HyperUniquesAggregatorFactory.estimateCardinality(actual.getRaw("unique_hosts"), false), diff --git a/indexing-service/src/test/java/io/druid/indexing/firehose/IngestSegmentFirehoseFactoryTest.java b/indexing-service/src/test/java/io/druid/indexing/firehose/IngestSegmentFirehoseFactoryTest.java index 40ab84887b3e..f935e94be147 100644 --- a/indexing-service/src/test/java/io/druid/indexing/firehose/IngestSegmentFirehoseFactoryTest.java +++ b/indexing-service/src/test/java/io/druid/indexing/firehose/IngestSegmentFirehoseFactoryTest.java @@ -525,8 +525,8 @@ public void simpleFirehoseReadingTest() throws IOException InputRow row = firehose.nextRow(); Assert.assertArrayEquals(new String[]{DIM_NAME}, row.getDimensions().toArray()); Assert.assertArrayEquals(new String[]{DIM_VALUE}, row.getDimension(DIM_NAME).toArray()); - Assert.assertEquals(METRIC_LONG_VALUE.longValue(), row.getLongMetric(METRIC_LONG_NAME)); - Assert.assertEquals(METRIC_FLOAT_VALUE, row.getFloatMetric(METRIC_FLOAT_NAME), METRIC_FLOAT_VALUE * 0.0001); + Assert.assertEquals(METRIC_LONG_VALUE.longValue(), row.getMetric(METRIC_LONG_NAME)); + Assert.assertEquals(METRIC_FLOAT_VALUE, row.getMetric(METRIC_FLOAT_NAME).floatValue(), METRIC_FLOAT_VALUE * 0.0001); ++rowcount; } } diff --git a/indexing-service/src/test/java/io/druid/indexing/firehose/IngestSegmentFirehoseFactoryTimelineTest.java b/indexing-service/src/test/java/io/druid/indexing/firehose/IngestSegmentFirehoseFactoryTimelineTest.java index 19a854dfbb93..822301459e33 100644 --- a/indexing-service/src/test/java/io/druid/indexing/firehose/IngestSegmentFirehoseFactoryTimelineTest.java +++ b/indexing-service/src/test/java/io/druid/indexing/firehose/IngestSegmentFirehoseFactoryTimelineTest.java @@ -144,7 +144,7 @@ public void testSimple() throws Exception while (firehose.hasMore()) { final InputRow row = firehose.nextRow(); count++; - sum += row.getLongMetric(METRICS[0]); + sum += row.getMetric(METRICS[0]).longValue(); } } diff --git a/java-util/src/main/java/io/druid/java/util/common/StringUtils.java b/java-util/src/main/java/io/druid/java/util/common/StringUtils.java index 78088963ad33..dbf84aad7315 100644 --- a/java-util/src/main/java/io/druid/java/util/common/StringUtils.java +++ b/java-util/src/main/java/io/druid/java/util/common/StringUtils.java @@ -139,4 +139,27 @@ public static String toUpperCase(String s) { return s.toUpperCase(Locale.ENGLISH); } + + public static String removeChar(String s, char c) + { + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == c) { + return removeChar(s, c, i); + } + } + return s; + } + + private static String removeChar(String s, char c, int firstOccurranceIndex) + { + StringBuilder sb = new StringBuilder(s.length() - 1); + sb.append(s, 0, firstOccurranceIndex); + for (int i = firstOccurranceIndex + 1; i < s.length(); i++) { + char charOfString = s.charAt(i); + if (charOfString != c) { + sb.append(charOfString); + } + } + return sb.toString(); + } } diff --git a/java-util/src/test/java/io/druid/java/util/common/StringUtilsTest.java b/java-util/src/test/java/io/druid/java/util/common/StringUtilsTest.java index 30cea273b722..a24501766c6c 100644 --- a/java-util/src/test/java/io/druid/java/util/common/StringUtilsTest.java +++ b/java-util/src/test/java/io/druid/java/util/common/StringUtilsTest.java @@ -19,7 +19,7 @@ package io.druid.java.util.common; -import junit.framework.Assert; +import org.junit.Assert; import org.junit.Test; import java.io.UnsupportedEncodingException; @@ -116,4 +116,13 @@ public void testNonStrictFormat() Assert.assertEquals("test%d; format", StringUtils.nonStrictFormat("test%d", "format")); Assert.assertEquals("test%s%s; format", StringUtils.nonStrictFormat("test%s%s", "format")); } + + @Test + public void testRemoveCharacter() + { + Assert.assertEquals("123", StringUtils.removeChar("123", ',')); + Assert.assertEquals("123", StringUtils.removeChar("123,", ',')); + Assert.assertEquals("123", StringUtils.removeChar(",1,,2,3,", ',')); + Assert.assertEquals("", StringUtils.removeChar(",,", ',')); + } } diff --git a/processing/src/main/java/io/druid/query/aggregation/AggregateCombiner.java b/processing/src/main/java/io/druid/query/aggregation/AggregateCombiner.java index bf691bd8e85c..1a4bdbd66d07 100644 --- a/processing/src/main/java/io/druid/query/aggregation/AggregateCombiner.java +++ b/processing/src/main/java/io/druid/query/aggregation/AggregateCombiner.java @@ -45,8 +45,8 @@ public interface AggregateCombiner extends ColumnValueSelector * combiner.get*() should return the same value as selector.get*(). * * If the selector is an {@link io.druid.segment.ObjectColumnSelector}, the object returned from {@link - * io.druid.segment.ObjectColumnSelector#getObject()} must not be modified, and must not become a subject for modification - * during subsequent {@link #fold} calls. + * io.druid.segment.ObjectColumnSelector#getObject()} must not be modified, and must not become a subject for + * modification during subsequent {@link #fold} calls. */ void reset(ColumnValueSelector selector); @@ -57,8 +57,8 @@ public interface AggregateCombiner extends ColumnValueSelector * aggregatorFactory.combine(combiner.get*(), selector.get*())} call. * * Unlike {@link AggregatorFactory#combine}, if the selector is an {@link io.druid.segment.ObjectColumnSelector}, the - * object returned from {@link io.druid.segment.ObjectColumnSelector#getObject()} must not be modified, and must not become - * a subject for modification during subsequent fold() calls. + * object returned from {@link io.druid.segment.ObjectColumnSelector#getObject()} must not be modified, and must not + * become a subject for modification during subsequent fold() calls. * * Since the state of AggregateCombiner is undefined before {@link #reset} is ever called on it, the effects of * calling fold() are also undefined in this case. diff --git a/processing/src/main/java/io/druid/query/aggregation/Aggregator.java b/processing/src/main/java/io/druid/query/aggregation/Aggregator.java index d7fba1e3c5cd..80ba45b18d00 100644 --- a/processing/src/main/java/io/druid/query/aggregation/Aggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/Aggregator.java @@ -21,6 +21,7 @@ import io.druid.guice.annotations.ExtensionPoint; +import javax.annotation.Nullable; import java.io.Closeable; /** @@ -37,6 +38,7 @@ public interface Aggregator extends Closeable { void aggregate(); void reset(); + @Nullable Object get(); float getFloat(); long getLong(); diff --git a/processing/src/main/java/io/druid/query/aggregation/AggregatorUtil.java b/processing/src/main/java/io/druid/query/aggregation/AggregatorUtil.java index d8adbe3182a5..895f1056f966 100644 --- a/processing/src/main/java/io/druid/query/aggregation/AggregatorUtil.java +++ b/processing/src/main/java/io/druid/query/aggregation/AggregatorUtil.java @@ -22,13 +22,19 @@ import com.google.common.collect.Lists; import io.druid.guice.annotations.PublicApi; import io.druid.java.util.common.Pair; +import io.druid.math.expr.Expr; +import io.druid.math.expr.ExprEval; import io.druid.math.expr.ExprMacroTable; import io.druid.math.expr.Parser; +import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseDoubleColumnValueSelector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.DoubleColumnSelector; import io.druid.segment.FloatColumnSelector; import io.druid.segment.LongColumnSelector; -import io.druid.segment.virtual.ExpressionSelectors; +import io.druid.segment.virtual.ExpressionObjectSelector; import java.util.HashSet; import java.util.LinkedList; @@ -121,7 +127,7 @@ public static Pair, List> condensedAggre return new Pair(condensedAggs, condensedPostAggs); } - public static FloatColumnSelector getFloatColumnSelector( + public static BaseFloatColumnValueSelector makeColumnValueSelectorWithFloatDefault( final ColumnSelectorFactory metricFactory, final ExprMacroTable macroTable, final String fieldName, @@ -130,19 +136,32 @@ public static FloatColumnSelector getFloatColumnSelector( ) { if (fieldName != null && fieldExpression == null) { - return metricFactory.makeFloatColumnSelector(fieldName); + return metricFactory.makeColumnValueSelector(fieldName); } if (fieldName == null && fieldExpression != null) { - return ExpressionSelectors.makeFloatColumnSelector( - metricFactory, - Parser.parse(fieldExpression, macroTable), - nullValue - ); + final Expr expr = Parser.parse(fieldExpression, macroTable); + final ExpressionObjectSelector baseSelector = ExpressionObjectSelector.from(metricFactory, expr); + class ExpressionFloatColumnSelector implements FloatColumnSelector + { + @Override + public float getFloat() + { + final ExprEval exprEval = baseSelector.getObject(); + return exprEval.isNull() ? nullValue : (float) exprEval.asDouble(); + } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("baseSelector", baseSelector); + } + } + return new ExpressionFloatColumnSelector(); } throw new IllegalArgumentException("Must have a valid, non-null fieldName or expression"); } - public static LongColumnSelector getLongColumnSelector( + public static BaseLongColumnValueSelector makeColumnValueSelectorWithLongDefault( final ColumnSelectorFactory metricFactory, final ExprMacroTable macroTable, final String fieldName, @@ -151,19 +170,32 @@ public static LongColumnSelector getLongColumnSelector( ) { if (fieldName != null && fieldExpression == null) { - return metricFactory.makeLongColumnSelector(fieldName); + return metricFactory.makeColumnValueSelector(fieldName); } if (fieldName == null && fieldExpression != null) { - return ExpressionSelectors.makeLongColumnSelector( - metricFactory, - Parser.parse(fieldExpression, macroTable), - nullValue - ); + final Expr expr = Parser.parse(fieldExpression, macroTable); + final ExpressionObjectSelector baseSelector = ExpressionObjectSelector.from(metricFactory, expr); + class ExpressionLongColumnSelector implements LongColumnSelector + { + @Override + public long getLong() + { + final ExprEval exprEval = baseSelector.getObject(); + return exprEval.isNull() ? nullValue : exprEval.asLong(); + } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("baseSelector", baseSelector); + } + } + return new ExpressionLongColumnSelector(); } throw new IllegalArgumentException("Must have a valid, non-null fieldName or expression"); } - public static DoubleColumnSelector getDoubleColumnSelector( + public static BaseDoubleColumnValueSelector makeColumnValueSelectorWithDoubleDefault( final ColumnSelectorFactory metricFactory, final ExprMacroTable macroTable, final String fieldName, @@ -172,14 +204,27 @@ public static DoubleColumnSelector getDoubleColumnSelector( ) { if (fieldName != null && fieldExpression == null) { - return metricFactory.makeDoubleColumnSelector(fieldName); + return metricFactory.makeColumnValueSelector(fieldName); } if (fieldName == null && fieldExpression != null) { - return ExpressionSelectors.makeDoubleColumnSelector( - metricFactory, - Parser.parse(fieldExpression, macroTable), - nullValue - ); + final Expr expr = Parser.parse(fieldExpression, macroTable); + final ExpressionObjectSelector baseSelector = ExpressionObjectSelector.from(metricFactory, expr); + class ExpressionDoubleColumnSelector implements DoubleColumnSelector + { + @Override + public double getDouble() + { + final ExprEval exprEval = baseSelector.getObject(); + return exprEval.isNull() ? nullValue : exprEval.asDouble(); + } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("baseSelector", baseSelector); + } + } + return new ExpressionDoubleColumnSelector(); } throw new IllegalArgumentException("Must have a valid, non-null fieldName or expression"); } diff --git a/processing/src/main/java/io/druid/query/aggregation/DoubleMaxAggregator.java b/processing/src/main/java/io/druid/query/aggregation/DoubleMaxAggregator.java index dcf4eadc61de..fdd318b35a36 100644 --- a/processing/src/main/java/io/druid/query/aggregation/DoubleMaxAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/DoubleMaxAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.DoubleColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; /** */ @@ -30,11 +30,11 @@ static double combineValues(Object lhs, Object rhs) return Math.max(((Number) lhs).doubleValue(), ((Number) rhs).doubleValue()); } - private final DoubleColumnSelector selector; + private final BaseDoubleColumnValueSelector selector; private double max; - public DoubleMaxAggregator(DoubleColumnSelector selector) + public DoubleMaxAggregator(BaseDoubleColumnValueSelector selector) { this.selector = selector; diff --git a/processing/src/main/java/io/druid/query/aggregation/DoubleMaxBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/DoubleMaxBufferAggregator.java index d0a605d04376..d7c120acd45a 100644 --- a/processing/src/main/java/io/druid/query/aggregation/DoubleMaxBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/DoubleMaxBufferAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.DoubleColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; import java.nio.ByteBuffer; @@ -28,7 +28,7 @@ public class DoubleMaxBufferAggregator extends SimpleDoubleBufferAggregator { - DoubleMaxBufferAggregator(DoubleColumnSelector selector) + DoubleMaxBufferAggregator(BaseDoubleColumnValueSelector selector) { super(selector); } diff --git a/processing/src/main/java/io/druid/query/aggregation/DoubleMinAggregator.java b/processing/src/main/java/io/druid/query/aggregation/DoubleMinAggregator.java index f7592f14bbc3..8319a67b8a92 100644 --- a/processing/src/main/java/io/druid/query/aggregation/DoubleMinAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/DoubleMinAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.DoubleColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; /** */ @@ -30,11 +30,11 @@ static double combineValues(Object lhs, Object rhs) return Math.min(((Number) lhs).doubleValue(), ((Number) rhs).doubleValue()); } - private final DoubleColumnSelector selector; + private final BaseDoubleColumnValueSelector selector; private double min; - public DoubleMinAggregator(DoubleColumnSelector selector) + public DoubleMinAggregator(BaseDoubleColumnValueSelector selector) { this.selector = selector; diff --git a/processing/src/main/java/io/druid/query/aggregation/DoubleMinBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/DoubleMinBufferAggregator.java index 2df69a4d579b..a868254ea7af 100644 --- a/processing/src/main/java/io/druid/query/aggregation/DoubleMinBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/DoubleMinBufferAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.DoubleColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; import java.nio.ByteBuffer; @@ -28,7 +28,7 @@ public class DoubleMinBufferAggregator extends SimpleDoubleBufferAggregator { - DoubleMinBufferAggregator(DoubleColumnSelector selector) + DoubleMinBufferAggregator(BaseDoubleColumnValueSelector selector) { super(selector); } diff --git a/processing/src/main/java/io/druid/query/aggregation/DoubleSumAggregator.java b/processing/src/main/java/io/druid/query/aggregation/DoubleSumAggregator.java index 315becade115..3d131ba5707d 100644 --- a/processing/src/main/java/io/druid/query/aggregation/DoubleSumAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/DoubleSumAggregator.java @@ -21,7 +21,7 @@ import com.google.common.collect.Ordering; import com.google.common.primitives.Doubles; -import io.druid.segment.DoubleColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; import java.util.Comparator; @@ -43,11 +43,11 @@ static double combineValues(Object lhs, Object rhs) return ((Number) lhs).doubleValue() + ((Number) rhs).doubleValue(); } - private final DoubleColumnSelector selector; + private final BaseDoubleColumnValueSelector selector; private double sum; - public DoubleSumAggregator(DoubleColumnSelector selector) + public DoubleSumAggregator(BaseDoubleColumnValueSelector selector) { this.selector = selector; diff --git a/processing/src/main/java/io/druid/query/aggregation/DoubleSumBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/DoubleSumBufferAggregator.java index 7ea9c28370d0..c05eb0657adb 100644 --- a/processing/src/main/java/io/druid/query/aggregation/DoubleSumBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/DoubleSumBufferAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.DoubleColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; import java.nio.ByteBuffer; @@ -28,7 +28,7 @@ public class DoubleSumBufferAggregator extends SimpleDoubleBufferAggregator { - DoubleSumBufferAggregator(DoubleColumnSelector selector) + DoubleSumBufferAggregator(BaseDoubleColumnValueSelector selector) { super(selector); } diff --git a/processing/src/main/java/io/druid/query/aggregation/FloatMaxAggregator.java b/processing/src/main/java/io/druid/query/aggregation/FloatMaxAggregator.java index d344729d055b..2707528a81da 100644 --- a/processing/src/main/java/io/druid/query/aggregation/FloatMaxAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/FloatMaxAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; /** */ @@ -30,11 +30,11 @@ static double combineValues(Object lhs, Object rhs) return Math.max(((Number) lhs).floatValue(), ((Number) rhs).floatValue()); } - private final FloatColumnSelector selector; + private final BaseFloatColumnValueSelector selector; private float max; - public FloatMaxAggregator(FloatColumnSelector selector) + public FloatMaxAggregator(BaseFloatColumnValueSelector selector) { this.selector = selector; diff --git a/processing/src/main/java/io/druid/query/aggregation/FloatMaxAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/FloatMaxAggregatorFactory.java index 63a83da06d2d..ddd164cf4093 100644 --- a/processing/src/main/java/io/druid/query/aggregation/FloatMaxAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/FloatMaxAggregatorFactory.java @@ -53,13 +53,13 @@ public FloatMaxAggregatorFactory(String name, String fieldName) @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - return new FloatMaxAggregator(getFloatColumnSelector(metricFactory, Float.NEGATIVE_INFINITY)); + return new FloatMaxAggregator(makeColumnValueSelectorWithFloatDefault(metricFactory, Float.NEGATIVE_INFINITY)); } @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - return new FloatMaxBufferAggregator(getFloatColumnSelector(metricFactory, Float.NEGATIVE_INFINITY)); + return new FloatMaxBufferAggregator(makeColumnValueSelectorWithFloatDefault(metricFactory, Float.NEGATIVE_INFINITY)); } @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/FloatMaxBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/FloatMaxBufferAggregator.java index eb45e2d2e626..43172104f34d 100644 --- a/processing/src/main/java/io/druid/query/aggregation/FloatMaxBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/FloatMaxBufferAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; import java.nio.ByteBuffer; @@ -28,7 +28,7 @@ public class FloatMaxBufferAggregator extends SimpleFloatBufferAggregator { - FloatMaxBufferAggregator(FloatColumnSelector selector) + FloatMaxBufferAggregator(BaseFloatColumnValueSelector selector) { super(selector); } diff --git a/processing/src/main/java/io/druid/query/aggregation/FloatMinAggregator.java b/processing/src/main/java/io/druid/query/aggregation/FloatMinAggregator.java index cbecd26b2238..685d0315333b 100644 --- a/processing/src/main/java/io/druid/query/aggregation/FloatMinAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/FloatMinAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; /** */ @@ -30,11 +30,11 @@ static double combineValues(Object lhs, Object rhs) return Math.min(((Number) lhs).floatValue(), ((Number) rhs).floatValue()); } - private final FloatColumnSelector selector; + private final BaseFloatColumnValueSelector selector; private float min; - public FloatMinAggregator(FloatColumnSelector selector) + public FloatMinAggregator(BaseFloatColumnValueSelector selector) { this.selector = selector; diff --git a/processing/src/main/java/io/druid/query/aggregation/FloatMinAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/FloatMinAggregatorFactory.java index 1129e15bc761..17c078c6cfa3 100644 --- a/processing/src/main/java/io/druid/query/aggregation/FloatMinAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/FloatMinAggregatorFactory.java @@ -53,13 +53,13 @@ public FloatMinAggregatorFactory(String name, String fieldName) @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - return new FloatMinAggregator(getFloatColumnSelector(metricFactory, Float.POSITIVE_INFINITY)); + return new FloatMinAggregator(makeColumnValueSelectorWithFloatDefault(metricFactory, Float.POSITIVE_INFINITY)); } @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - return new FloatMinBufferAggregator(getFloatColumnSelector(metricFactory, Float.POSITIVE_INFINITY)); + return new FloatMinBufferAggregator(makeColumnValueSelectorWithFloatDefault(metricFactory, Float.POSITIVE_INFINITY)); } @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/FloatMinBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/FloatMinBufferAggregator.java index 8df36e8556c7..1ad78c647301 100644 --- a/processing/src/main/java/io/druid/query/aggregation/FloatMinBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/FloatMinBufferAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; import java.nio.ByteBuffer; @@ -28,7 +28,7 @@ public class FloatMinBufferAggregator extends SimpleFloatBufferAggregator { - FloatMinBufferAggregator(FloatColumnSelector selector) + FloatMinBufferAggregator(BaseFloatColumnValueSelector selector) { super(selector); } diff --git a/processing/src/main/java/io/druid/query/aggregation/FloatSumAggregator.java b/processing/src/main/java/io/druid/query/aggregation/FloatSumAggregator.java index d8b866051629..bb756b2cbba2 100644 --- a/processing/src/main/java/io/druid/query/aggregation/FloatSumAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/FloatSumAggregator.java @@ -20,7 +20,7 @@ package io.druid.query.aggregation; import com.google.common.collect.Ordering; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; import java.util.Comparator; @@ -42,11 +42,11 @@ static double combineValues(Object lhs, Object rhs) return ((Number) lhs).floatValue() + ((Number) rhs).floatValue(); } - private final FloatColumnSelector selector; + private final BaseFloatColumnValueSelector selector; private float sum; - public FloatSumAggregator(FloatColumnSelector selector) + public FloatSumAggregator(BaseFloatColumnValueSelector selector) { this.selector = selector; diff --git a/processing/src/main/java/io/druid/query/aggregation/FloatSumAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/FloatSumAggregatorFactory.java index 4986a1ff6a3b..2767a61d311f 100644 --- a/processing/src/main/java/io/druid/query/aggregation/FloatSumAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/FloatSumAggregatorFactory.java @@ -53,13 +53,13 @@ public FloatSumAggregatorFactory(String name, String fieldName) @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - return new FloatSumAggregator(getFloatColumnSelector(metricFactory, 0.0f)); + return new FloatSumAggregator(makeColumnValueSelectorWithFloatDefault(metricFactory, 0.0f)); } @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - return new FloatSumBufferAggregator(getFloatColumnSelector(metricFactory, 0.0f)); + return new FloatSumBufferAggregator(makeColumnValueSelectorWithFloatDefault(metricFactory, 0.0f)); } @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/FloatSumBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/FloatSumBufferAggregator.java index e8b518481602..55b495ec5afe 100644 --- a/processing/src/main/java/io/druid/query/aggregation/FloatSumBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/FloatSumBufferAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; import java.nio.ByteBuffer; @@ -28,7 +28,7 @@ public class FloatSumBufferAggregator extends SimpleFloatBufferAggregator { - FloatSumBufferAggregator(FloatColumnSelector selector) + FloatSumBufferAggregator(BaseFloatColumnValueSelector selector) { super(selector); } diff --git a/processing/src/main/java/io/druid/query/aggregation/HistogramAggregator.java b/processing/src/main/java/io/druid/query/aggregation/HistogramAggregator.java index 344899d7607c..0c6c6028a4fe 100644 --- a/processing/src/main/java/io/druid/query/aggregation/HistogramAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/HistogramAggregator.java @@ -20,7 +20,7 @@ package io.druid.query.aggregation; import com.google.common.primitives.Longs; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; import java.util.Comparator; @@ -40,11 +40,11 @@ static Histogram combineHistograms(Object lhs, Object rhs) return ((Histogram) lhs).fold((Histogram) rhs); } - private final FloatColumnSelector selector; + private final BaseFloatColumnValueSelector selector; private Histogram histogram; - public HistogramAggregator(FloatColumnSelector selector, float[] breaks) + public HistogramAggregator(BaseFloatColumnValueSelector selector, float[] breaks) { this.selector = selector; this.histogram = new Histogram(breaks); diff --git a/processing/src/main/java/io/druid/query/aggregation/HistogramAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/HistogramAggregatorFactory.java index e360836ddde8..77b08cc5281f 100644 --- a/processing/src/main/java/io/druid/query/aggregation/HistogramAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/HistogramAggregatorFactory.java @@ -28,7 +28,6 @@ import io.druid.java.util.common.StringUtils; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.ColumnValueSelector; -import io.druid.segment.ObjectColumnSelector; import org.apache.commons.codec.binary.Base64; import javax.annotation.Nullable; @@ -67,16 +66,13 @@ public HistogramAggregatorFactory( @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - return new HistogramAggregator(metricFactory.makeFloatColumnSelector(fieldName), breaks); + return new HistogramAggregator(metricFactory.makeColumnValueSelector(fieldName), breaks); } @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - return new HistogramBufferAggregator( - metricFactory.makeFloatColumnSelector(fieldName), - breaks - ); + return new HistogramBufferAggregator(metricFactory.makeColumnValueSelector(fieldName), breaks); } @Override @@ -103,8 +99,7 @@ public AggregateCombiner makeAggregateCombiner() @Override public void reset(ColumnValueSelector selector) { - @SuppressWarnings("unchecked") - Histogram first = ((ObjectColumnSelector) selector).getObject(); + Histogram first = (Histogram) selector.getObject(); if (combined == null) { combined = new Histogram(first); } else { @@ -115,8 +110,7 @@ public void reset(ColumnValueSelector selector) @Override public void fold(ColumnValueSelector selector) { - @SuppressWarnings("unchecked") - Histogram other = ((ObjectColumnSelector) selector).getObject(); + Histogram other = (Histogram) selector.getObject(); combined.fold(other); } diff --git a/processing/src/main/java/io/druid/query/aggregation/HistogramBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/HistogramBufferAggregator.java index 9ea948f31ea5..5a6eb269c48d 100644 --- a/processing/src/main/java/io/druid/query/aggregation/HistogramBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/HistogramBufferAggregator.java @@ -22,19 +22,19 @@ import com.google.common.primitives.Floats; import com.google.common.primitives.Longs; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; import java.nio.ByteBuffer; import java.util.Arrays; public class HistogramBufferAggregator implements BufferAggregator { - private final FloatColumnSelector selector; + private final BaseFloatColumnValueSelector selector; private final float[] breaks; private final int minOffset; private final int maxOffset; - public HistogramBufferAggregator(FloatColumnSelector selector, float[] breaks) + public HistogramBufferAggregator(BaseFloatColumnValueSelector selector, float[] breaks) { this.selector = selector; this.breaks = breaks; diff --git a/processing/src/main/java/io/druid/query/aggregation/JavaScriptAggregator.java b/processing/src/main/java/io/druid/query/aggregation/JavaScriptAggregator.java index 09734a037833..7b811a083d59 100644 --- a/processing/src/main/java/io/druid/query/aggregation/JavaScriptAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/JavaScriptAggregator.java @@ -19,8 +19,7 @@ package io.druid.query.aggregation; -import com.google.common.collect.Lists; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import java.util.List; @@ -28,7 +27,7 @@ public class JavaScriptAggregator implements Aggregator { static interface ScriptAggregator { - public double aggregate(double current, ObjectColumnSelector[] selectorList); + public double aggregate(double current, BaseObjectColumnValueSelector[] selectorList); public double combine(double a, double b); @@ -37,14 +36,14 @@ static interface ScriptAggregator public void close(); } - private final ObjectColumnSelector[] selectorList; + private final BaseObjectColumnValueSelector[] selectorList; private final ScriptAggregator script; private double current; - public JavaScriptAggregator(List selectorList, ScriptAggregator script) + public JavaScriptAggregator(List selectorList, ScriptAggregator script) { - this.selectorList = Lists.newArrayList(selectorList).toArray(new ObjectColumnSelector[]{}); + this.selectorList = selectorList.toArray(new BaseObjectColumnValueSelector[]{}); this.script = script; this.current = script.reset(); diff --git a/processing/src/main/java/io/druid/query/aggregation/JavaScriptAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/JavaScriptAggregatorFactory.java index 10e438c189b7..f9e095b67a36 100644 --- a/processing/src/main/java/io/druid/query/aggregation/JavaScriptAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/JavaScriptAggregatorFactory.java @@ -31,16 +31,15 @@ import io.druid.java.util.common.ISE; import io.druid.java.util.common.StringUtils; import io.druid.js.JavaScriptConfig; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.ColumnValueSelector; -import io.druid.segment.ObjectColumnSelector; import org.mozilla.javascript.Context; import org.mozilla.javascript.ContextAction; import org.mozilla.javascript.ContextFactory; import org.mozilla.javascript.Function; import org.mozilla.javascript.ScriptableObject; -import javax.annotation.Nullable; import java.lang.reflect.Array; import java.nio.ByteBuffer; import java.security.MessageDigest; @@ -48,6 +47,7 @@ import java.util.Comparator; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; public class JavaScriptAggregatorFactory extends AggregatorFactory { @@ -95,17 +95,7 @@ public JavaScriptAggregatorFactory( public Aggregator factorize(final ColumnSelectorFactory columnFactory) { return new JavaScriptAggregator( - Lists.transform( - fieldNames, - new com.google.common.base.Function() - { - @Override - public ObjectColumnSelector apply(@Nullable String s) - { - return columnFactory.makeObjectColumnSelector(s); - } - } - ), + fieldNames.stream().map(columnFactory::makeColumnValueSelector).collect(Collectors.toList()), getCompiledScript() ); } @@ -114,17 +104,7 @@ public ObjectColumnSelector apply(@Nullable String s) public BufferAggregator factorizeBuffered(final ColumnSelectorFactory columnSelectorFactory) { return new JavaScriptBufferAggregator( - Lists.transform( - fieldNames, - new com.google.common.base.Function() - { - @Override - public ObjectColumnSelector apply(@Nullable String s) - { - return columnSelectorFactory.makeObjectColumnSelector(s); - } - } - ), + fieldNames.stream().map(columnSelectorFactory::makeColumnValueSelector).collect(Collectors.toList()), getCompiledScript() ); } @@ -330,7 +310,7 @@ static JavaScriptAggregator.ScriptAggregator compileScript( return new JavaScriptAggregator.ScriptAggregator() { @Override - public double aggregate(final double current, final ObjectColumnSelector[] selectorList) + public double aggregate(final double current, final BaseObjectColumnValueSelector[] selectorList) { Context cx = Context.getCurrentContext(); if (cx == null) { @@ -345,7 +325,7 @@ public double aggregate(final double current, final ObjectColumnSelector[] selec args[0] = current; for (int i = 0; i < size; i++) { - final ObjectColumnSelector selector = selectorList[i]; + final BaseObjectColumnValueSelector selector = selectorList[i]; if (selector != null) { final Object arg = selector.getObject(); if (arg != null && arg.getClass().isArray()) { diff --git a/processing/src/main/java/io/druid/query/aggregation/JavaScriptBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/JavaScriptBufferAggregator.java index 046d5362cc8c..4484bd4bbe76 100644 --- a/processing/src/main/java/io/druid/query/aggregation/JavaScriptBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/JavaScriptBufferAggregator.java @@ -19,24 +19,23 @@ package io.druid.query.aggregation; -import com.google.common.collect.Lists; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import java.nio.ByteBuffer; import java.util.List; public class JavaScriptBufferAggregator implements BufferAggregator { - private final ObjectColumnSelector[] selectorList; + private final BaseObjectColumnValueSelector[] selectorList; private final JavaScriptAggregator.ScriptAggregator script; public JavaScriptBufferAggregator( - List selectorList, + List selectorList, JavaScriptAggregator.ScriptAggregator script ) { - this.selectorList = Lists.newArrayList(selectorList).toArray(new ObjectColumnSelector[]{}); + this.selectorList = selectorList.toArray(new BaseObjectColumnValueSelector[]{}); this.script = script; } diff --git a/processing/src/main/java/io/druid/query/aggregation/LongBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/LongBufferAggregator.java index 5e8b06f79e58..497ffe9c0741 100644 --- a/processing/src/main/java/io/druid/query/aggregation/LongBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/LongBufferAggregator.java @@ -20,15 +20,15 @@ package io.druid.query.aggregation; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.nio.ByteBuffer; public abstract class LongBufferAggregator implements BufferAggregator { - protected final LongColumnSelector selector; + protected final BaseLongColumnValueSelector selector; - LongBufferAggregator(LongColumnSelector selector) + LongBufferAggregator(BaseLongColumnValueSelector selector) { this.selector = selector; } diff --git a/processing/src/main/java/io/druid/query/aggregation/LongMaxAggregator.java b/processing/src/main/java/io/druid/query/aggregation/LongMaxAggregator.java index b8bf861cf0f8..b66df6c6942a 100644 --- a/processing/src/main/java/io/druid/query/aggregation/LongMaxAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/LongMaxAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.util.Comparator; @@ -34,11 +34,11 @@ static long combineValues(Object lhs, Object rhs) return Math.max(((Number) lhs).longValue(), ((Number) rhs).longValue()); } - private final LongColumnSelector selector; + private final BaseLongColumnValueSelector selector; private long max; - public LongMaxAggregator(LongColumnSelector selector) + public LongMaxAggregator(BaseLongColumnValueSelector selector) { this.selector = selector; diff --git a/processing/src/main/java/io/druid/query/aggregation/LongMaxAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/LongMaxAggregatorFactory.java index 35c25cffeb30..a63c93cb5b72 100644 --- a/processing/src/main/java/io/druid/query/aggregation/LongMaxAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/LongMaxAggregatorFactory.java @@ -27,9 +27,9 @@ import io.druid.java.util.common.StringUtils; import io.druid.math.expr.ExprMacroTable; import io.druid.math.expr.Parser; +import io.druid.segment.BaseLongColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.ColumnValueSelector; -import io.druid.segment.LongColumnSelector; import java.nio.ByteBuffer; import java.util.Arrays; @@ -84,9 +84,15 @@ public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) return new LongMaxBufferAggregator(getLongColumnSelector(metricFactory)); } - private LongColumnSelector getLongColumnSelector(ColumnSelectorFactory metricFactory) + private BaseLongColumnValueSelector getLongColumnSelector(ColumnSelectorFactory metricFactory) { - return AggregatorUtil.getLongColumnSelector(metricFactory, macroTable, fieldName, expression, Long.MIN_VALUE); + return AggregatorUtil.makeColumnValueSelectorWithLongDefault( + metricFactory, + macroTable, + fieldName, + expression, + Long.MIN_VALUE + ); } @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/LongMaxBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/LongMaxBufferAggregator.java index 429051d2552f..b0ca1c3a7420 100644 --- a/processing/src/main/java/io/druid/query/aggregation/LongMaxBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/LongMaxBufferAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.nio.ByteBuffer; @@ -28,7 +28,7 @@ public class LongMaxBufferAggregator extends LongBufferAggregator { - LongMaxBufferAggregator(LongColumnSelector selector) + LongMaxBufferAggregator(BaseLongColumnValueSelector selector) { super(selector); } diff --git a/processing/src/main/java/io/druid/query/aggregation/LongMinAggregator.java b/processing/src/main/java/io/druid/query/aggregation/LongMinAggregator.java index 1c8f45d3ac80..b17268066abe 100644 --- a/processing/src/main/java/io/druid/query/aggregation/LongMinAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/LongMinAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.util.Comparator; @@ -34,11 +34,11 @@ static long combineValues(Object lhs, Object rhs) return Math.min(((Number) lhs).longValue(), ((Number) rhs).longValue()); } - private final LongColumnSelector selector; + private final BaseLongColumnValueSelector selector; private long min; - public LongMinAggregator(LongColumnSelector selector) + public LongMinAggregator(BaseLongColumnValueSelector selector) { this.selector = selector; diff --git a/processing/src/main/java/io/druid/query/aggregation/LongMinAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/LongMinAggregatorFactory.java index d024dc6afa1c..fc5890cc54e2 100644 --- a/processing/src/main/java/io/druid/query/aggregation/LongMinAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/LongMinAggregatorFactory.java @@ -27,9 +27,9 @@ import io.druid.java.util.common.StringUtils; import io.druid.math.expr.ExprMacroTable; import io.druid.math.expr.Parser; +import io.druid.segment.BaseLongColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.ColumnValueSelector; -import io.druid.segment.LongColumnSelector; import java.nio.ByteBuffer; import java.util.Arrays; @@ -85,9 +85,15 @@ public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) return new LongMinBufferAggregator(getLongColumnSelector(metricFactory)); } - private LongColumnSelector getLongColumnSelector(ColumnSelectorFactory metricFactory) + private BaseLongColumnValueSelector getLongColumnSelector(ColumnSelectorFactory metricFactory) { - return AggregatorUtil.getLongColumnSelector(metricFactory, macroTable, fieldName, expression, Long.MAX_VALUE); + return AggregatorUtil.makeColumnValueSelectorWithLongDefault( + metricFactory, + macroTable, + fieldName, + expression, + Long.MAX_VALUE + ); } @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/LongMinBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/LongMinBufferAggregator.java index ebbae496ccb4..ee5eceac0e13 100644 --- a/processing/src/main/java/io/druid/query/aggregation/LongMinBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/LongMinBufferAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.nio.ByteBuffer; @@ -28,7 +28,7 @@ public class LongMinBufferAggregator extends LongBufferAggregator { - LongMinBufferAggregator(LongColumnSelector selector) + LongMinBufferAggregator(BaseLongColumnValueSelector selector) { super(selector); } diff --git a/processing/src/main/java/io/druid/query/aggregation/LongSumAggregator.java b/processing/src/main/java/io/druid/query/aggregation/LongSumAggregator.java index 0a6154b20d7b..8637673f9b58 100644 --- a/processing/src/main/java/io/druid/query/aggregation/LongSumAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/LongSumAggregator.java @@ -20,7 +20,7 @@ package io.druid.query.aggregation; import com.google.common.primitives.Longs; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.util.Comparator; @@ -42,11 +42,11 @@ static long combineValues(Object lhs, Object rhs) return ((Number) lhs).longValue() + ((Number) rhs).longValue(); } - private final LongColumnSelector selector; + private final BaseLongColumnValueSelector selector; private long sum; - public LongSumAggregator(LongColumnSelector selector) + public LongSumAggregator(BaseLongColumnValueSelector selector) { this.selector = selector; diff --git a/processing/src/main/java/io/druid/query/aggregation/LongSumAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/LongSumAggregatorFactory.java index cec708eb4a60..3a2d07937614 100644 --- a/processing/src/main/java/io/druid/query/aggregation/LongSumAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/LongSumAggregatorFactory.java @@ -27,8 +27,8 @@ import io.druid.java.util.common.StringUtils; import io.druid.math.expr.ExprMacroTable; import io.druid.math.expr.Parser; +import io.druid.segment.BaseLongColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.LongColumnSelector; import java.nio.ByteBuffer; import java.util.Arrays; @@ -83,9 +83,15 @@ public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) return new LongSumBufferAggregator(getLongColumnSelector(metricFactory)); } - private LongColumnSelector getLongColumnSelector(ColumnSelectorFactory metricFactory) + private BaseLongColumnValueSelector getLongColumnSelector(ColumnSelectorFactory metricFactory) { - return AggregatorUtil.getLongColumnSelector(metricFactory, macroTable, fieldName, expression, 0L); + return AggregatorUtil.makeColumnValueSelectorWithLongDefault( + metricFactory, + macroTable, + fieldName, + expression, + 0L + ); } @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/LongSumBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/LongSumBufferAggregator.java index 9ae1d8e1096e..4315f49ee56f 100644 --- a/processing/src/main/java/io/druid/query/aggregation/LongSumBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/LongSumBufferAggregator.java @@ -19,7 +19,7 @@ package io.druid.query.aggregation; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.nio.ByteBuffer; @@ -28,7 +28,7 @@ public class LongSumBufferAggregator extends LongBufferAggregator { - LongSumBufferAggregator(LongColumnSelector selector) + LongSumBufferAggregator(BaseLongColumnValueSelector selector) { super(selector); } diff --git a/processing/src/main/java/io/druid/query/aggregation/ObjectAggregateCombiner.java b/processing/src/main/java/io/druid/query/aggregation/ObjectAggregateCombiner.java index bc19ba476e7a..02fc209c74f4 100644 --- a/processing/src/main/java/io/druid/query/aggregation/ObjectAggregateCombiner.java +++ b/processing/src/main/java/io/druid/query/aggregation/ObjectAggregateCombiner.java @@ -19,6 +19,7 @@ package io.druid.query.aggregation; +import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.ObjectColumnSelector; /** @@ -26,4 +27,10 @@ */ public abstract class ObjectAggregateCombiner implements AggregateCombiner, ObjectColumnSelector { + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + // Usually AggregateCombiner has nothing to inspect + } } diff --git a/processing/src/main/java/io/druid/query/aggregation/SimpleDoubleAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/SimpleDoubleAggregatorFactory.java index 24441d029028..ea6c1f92bb73 100644 --- a/processing/src/main/java/io/druid/query/aggregation/SimpleDoubleAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/SimpleDoubleAggregatorFactory.java @@ -24,8 +24,8 @@ import com.google.common.base.Preconditions; import io.druid.math.expr.ExprMacroTable; import io.druid.math.expr.Parser; +import io.druid.segment.BaseDoubleColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.DoubleColumnSelector; import java.util.Collections; import java.util.Comparator; @@ -57,9 +57,15 @@ public SimpleDoubleAggregatorFactory( ); } - protected DoubleColumnSelector getDoubleColumnSelector(ColumnSelectorFactory metricFactory, Double nullValue) + protected BaseDoubleColumnValueSelector getDoubleColumnSelector(ColumnSelectorFactory metricFactory, double nullValue) { - return AggregatorUtil.getDoubleColumnSelector(metricFactory, macroTable, fieldName, expression, nullValue); + return AggregatorUtil.makeColumnValueSelectorWithDoubleDefault( + metricFactory, + macroTable, + fieldName, + expression, + nullValue + ); } @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/SimpleDoubleBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/SimpleDoubleBufferAggregator.java index ef80cae43e73..a76017abba1e 100644 --- a/processing/src/main/java/io/druid/query/aggregation/SimpleDoubleBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/SimpleDoubleBufferAggregator.java @@ -21,20 +21,20 @@ import io.druid.query.monomorphicprocessing.CalledFromHotLoop; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.DoubleColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; import java.nio.ByteBuffer; public abstract class SimpleDoubleBufferAggregator implements BufferAggregator { - protected final DoubleColumnSelector selector; + protected final BaseDoubleColumnValueSelector selector; - SimpleDoubleBufferAggregator(DoubleColumnSelector selector) + SimpleDoubleBufferAggregator(BaseDoubleColumnValueSelector selector) { this.selector = selector; } - public DoubleColumnSelector getSelector() + public BaseDoubleColumnValueSelector getSelector() { return selector; } diff --git a/processing/src/main/java/io/druid/query/aggregation/SimpleFloatAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/SimpleFloatAggregatorFactory.java index 98461cb62c37..a37e0226e0dd 100644 --- a/processing/src/main/java/io/druid/query/aggregation/SimpleFloatAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/SimpleFloatAggregatorFactory.java @@ -23,8 +23,8 @@ import com.google.common.base.Preconditions; import io.druid.math.expr.ExprMacroTable; import io.druid.math.expr.Parser; +import io.druid.segment.BaseFloatColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.FloatColumnSelector; import java.util.Collections; import java.util.Comparator; @@ -56,9 +56,18 @@ public SimpleFloatAggregatorFactory( ); } - protected FloatColumnSelector getFloatColumnSelector(ColumnSelectorFactory metricFactory, Float nullValue) + BaseFloatColumnValueSelector makeColumnValueSelectorWithFloatDefault( + ColumnSelectorFactory metricFactory, + float nullValue + ) { - return AggregatorUtil.getFloatColumnSelector(metricFactory, macroTable, fieldName, expression, nullValue); + return AggregatorUtil.makeColumnValueSelectorWithFloatDefault( + metricFactory, + macroTable, + fieldName, + expression, + nullValue + ); } @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/SimpleFloatBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/SimpleFloatBufferAggregator.java index adf77103f37e..c33f75153fed 100644 --- a/processing/src/main/java/io/druid/query/aggregation/SimpleFloatBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/SimpleFloatBufferAggregator.java @@ -21,20 +21,20 @@ import io.druid.query.monomorphicprocessing.CalledFromHotLoop; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; import java.nio.ByteBuffer; public abstract class SimpleFloatBufferAggregator implements BufferAggregator { - protected final FloatColumnSelector selector; + protected final BaseFloatColumnValueSelector selector; - SimpleFloatBufferAggregator(FloatColumnSelector selector) + SimpleFloatBufferAggregator(BaseFloatColumnValueSelector selector) { this.selector = selector; } - public FloatColumnSelector getSelector() + public BaseFloatColumnValueSelector getSelector() { return selector; } diff --git a/processing/src/main/java/io/druid/query/aggregation/cardinality/HyperLogLogCollectorAggregateCombiner.java b/processing/src/main/java/io/druid/query/aggregation/cardinality/HyperLogLogCollectorAggregateCombiner.java index 023581faf5e3..17d9954304b2 100644 --- a/processing/src/main/java/io/druid/query/aggregation/cardinality/HyperLogLogCollectorAggregateCombiner.java +++ b/processing/src/main/java/io/druid/query/aggregation/cardinality/HyperLogLogCollectorAggregateCombiner.java @@ -22,7 +22,6 @@ import io.druid.hll.HyperLogLogCollector; import io.druid.query.aggregation.ObjectAggregateCombiner; import io.druid.segment.ColumnValueSelector; -import io.druid.segment.ObjectColumnSelector; import javax.annotation.Nullable; @@ -41,8 +40,7 @@ public void reset(ColumnValueSelector selector) @Override public void fold(ColumnValueSelector selector) { - @SuppressWarnings("unchecked") - HyperLogLogCollector other = ((ObjectColumnSelector) selector).getObject(); + HyperLogLogCollector other = (HyperLogLogCollector) selector.getObject(); if (other == null) { return; } diff --git a/processing/src/main/java/io/druid/query/aggregation/cardinality/types/CardinalityAggregatorColumnSelectorStrategy.java b/processing/src/main/java/io/druid/query/aggregation/cardinality/types/CardinalityAggregatorColumnSelectorStrategy.java index 8dad63f7b401..807eb3ae7ae4 100644 --- a/processing/src/main/java/io/druid/query/aggregation/cardinality/types/CardinalityAggregatorColumnSelectorStrategy.java +++ b/processing/src/main/java/io/druid/query/aggregation/cardinality/types/CardinalityAggregatorColumnSelectorStrategy.java @@ -22,10 +22,8 @@ import com.google.common.hash.Hasher; import io.druid.hll.HyperLogLogCollector; import io.druid.query.dimension.ColumnSelectorStrategy; -import io.druid.segment.ColumnValueSelector; -public interface CardinalityAggregatorColumnSelectorStrategy extends - ColumnSelectorStrategy +public interface CardinalityAggregatorColumnSelectorStrategy extends ColumnSelectorStrategy { /*** * Retrieve the current row from dimSelector and add the row values to the hasher. diff --git a/processing/src/main/java/io/druid/query/aggregation/cardinality/types/DoubleCardinalityAggregatorColumnSelectorStrategy.java b/processing/src/main/java/io/druid/query/aggregation/cardinality/types/DoubleCardinalityAggregatorColumnSelectorStrategy.java index d3a98c1ff4f9..5fd15ae30c1b 100644 --- a/processing/src/main/java/io/druid/query/aggregation/cardinality/types/DoubleCardinalityAggregatorColumnSelectorStrategy.java +++ b/processing/src/main/java/io/druid/query/aggregation/cardinality/types/DoubleCardinalityAggregatorColumnSelectorStrategy.java @@ -22,19 +22,20 @@ import com.google.common.hash.Hasher; import io.druid.hll.HyperLogLogCollector; import io.druid.query.aggregation.cardinality.CardinalityAggregator; -import io.druid.segment.DoubleColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; -public class DoubleCardinalityAggregatorColumnSelectorStrategy implements CardinalityAggregatorColumnSelectorStrategy +public class DoubleCardinalityAggregatorColumnSelectorStrategy + implements CardinalityAggregatorColumnSelectorStrategy { @Override - public void hashRow(DoubleColumnSelector dimSelector, Hasher hasher) + public void hashRow(BaseDoubleColumnValueSelector dimSelector, Hasher hasher) { hasher.putDouble(dimSelector.getDouble()); } @Override - public void hashValues(DoubleColumnSelector dimSelector, HyperLogLogCollector collector) + public void hashValues(BaseDoubleColumnValueSelector dimSelector, HyperLogLogCollector collector) { collector.add(CardinalityAggregator.hashFn.hashLong(Double.doubleToLongBits(dimSelector.getDouble())).asBytes()); } diff --git a/processing/src/main/java/io/druid/query/aggregation/cardinality/types/FloatCardinalityAggregatorColumnSelectorStrategy.java b/processing/src/main/java/io/druid/query/aggregation/cardinality/types/FloatCardinalityAggregatorColumnSelectorStrategy.java index 76d0f44d2fcb..b46261c7b15e 100644 --- a/processing/src/main/java/io/druid/query/aggregation/cardinality/types/FloatCardinalityAggregatorColumnSelectorStrategy.java +++ b/processing/src/main/java/io/druid/query/aggregation/cardinality/types/FloatCardinalityAggregatorColumnSelectorStrategy.java @@ -22,20 +22,20 @@ import com.google.common.hash.Hasher; import io.druid.hll.HyperLogLogCollector; import io.druid.query.aggregation.cardinality.CardinalityAggregator; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; public class FloatCardinalityAggregatorColumnSelectorStrategy - implements CardinalityAggregatorColumnSelectorStrategy + implements CardinalityAggregatorColumnSelectorStrategy { @Override - public void hashRow(FloatColumnSelector dimSelector, Hasher hasher) + public void hashRow(BaseFloatColumnValueSelector selector, Hasher hasher) { - hasher.putFloat(dimSelector.getFloat()); + hasher.putFloat(selector.getFloat()); } @Override - public void hashValues(FloatColumnSelector dimSelector, HyperLogLogCollector collector) + public void hashValues(BaseFloatColumnValueSelector selector, HyperLogLogCollector collector) { - collector.add(CardinalityAggregator.hashFn.hashInt(Float.floatToIntBits(dimSelector.getFloat())).asBytes()); + collector.add(CardinalityAggregator.hashFn.hashInt(Float.floatToIntBits(selector.getFloat())).asBytes()); } } diff --git a/processing/src/main/java/io/druid/query/aggregation/cardinality/types/LongCardinalityAggregatorColumnSelectorStrategy.java b/processing/src/main/java/io/druid/query/aggregation/cardinality/types/LongCardinalityAggregatorColumnSelectorStrategy.java index e3d1dd5a3a52..a666ed64e1a7 100644 --- a/processing/src/main/java/io/druid/query/aggregation/cardinality/types/LongCardinalityAggregatorColumnSelectorStrategy.java +++ b/processing/src/main/java/io/druid/query/aggregation/cardinality/types/LongCardinalityAggregatorColumnSelectorStrategy.java @@ -22,19 +22,19 @@ import com.google.common.hash.Hasher; import io.druid.hll.HyperLogLogCollector; import io.druid.query.aggregation.cardinality.CardinalityAggregator; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; public class LongCardinalityAggregatorColumnSelectorStrategy - implements CardinalityAggregatorColumnSelectorStrategy + implements CardinalityAggregatorColumnSelectorStrategy { @Override - public void hashRow(LongColumnSelector dimSelector, Hasher hasher) + public void hashRow(BaseLongColumnValueSelector dimSelector, Hasher hasher) { hasher.putLong(dimSelector.getLong()); } @Override - public void hashValues(LongColumnSelector dimSelector, HyperLogLogCollector collector) + public void hashValues(BaseLongColumnValueSelector dimSelector, HyperLogLogCollector collector) { collector.add(CardinalityAggregator.hashFn.hashLong(dimSelector.getLong()).asBytes()); } diff --git a/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstAggregator.java b/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstAggregator.java index 2cc135467cf6..1ca91181df14 100644 --- a/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstAggregator.java @@ -21,14 +21,14 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.Aggregator; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; public class DoubleFirstAggregator implements Aggregator { - private final DoubleColumnSelector valueSelector; - private final LongColumnSelector timeSelector; + private final BaseDoubleColumnValueSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; private final String name; protected long firstTime; @@ -36,8 +36,8 @@ public class DoubleFirstAggregator implements Aggregator public DoubleFirstAggregator( String name, - LongColumnSelector timeSelector, - DoubleColumnSelector valueSelector + BaseLongColumnValueSelector timeSelector, + BaseDoubleColumnValueSelector valueSelector ) { this.name = name; diff --git a/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstAggregatorFactory.java index 1fb8564484d8..98681e37c771 100644 --- a/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstAggregatorFactory.java @@ -27,15 +27,15 @@ import com.metamx.common.StringUtils; import io.druid.collections.SerializablePair; import io.druid.java.util.common.UOE; +import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.aggregation.Aggregator; import io.druid.query.aggregation.AggregatorFactory; import io.druid.query.aggregation.AggregatorFactoryNotMergeableException; import io.druid.query.aggregation.AggregatorUtil; import io.druid.query.aggregation.BufferAggregator; -import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.column.Column; import java.nio.ByteBuffer; @@ -78,8 +78,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) { return new DoubleFirstAggregator( name, - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeDoubleColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -87,8 +87,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { return new DoubleFirstBufferAggregator( - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeDoubleColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -118,7 +118,7 @@ public AggregatorFactory getCombiningFactory() @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new DoubleFirstAggregator(name, null, null) { @Override @@ -136,7 +136,7 @@ public void aggregate() @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new DoubleFirstBufferAggregator(null, null) { @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstBufferAggregator.java index 5a03f4765c80..50cf31231192 100644 --- a/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/first/DoubleFirstBufferAggregator.java @@ -22,17 +22,20 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.nio.ByteBuffer; public class DoubleFirstBufferAggregator implements BufferAggregator { - private final LongColumnSelector timeSelector; - private final DoubleColumnSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; + private final BaseDoubleColumnValueSelector valueSelector; - public DoubleFirstBufferAggregator(LongColumnSelector timeSelector, DoubleColumnSelector valueSelector) + public DoubleFirstBufferAggregator( + BaseLongColumnValueSelector timeSelector, + BaseDoubleColumnValueSelector valueSelector + ) { this.timeSelector = timeSelector; this.valueSelector = valueSelector; diff --git a/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstAggregator.java b/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstAggregator.java index 151a343456eb..7de7c5eb213a 100644 --- a/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstAggregator.java @@ -21,14 +21,14 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.Aggregator; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; public class FloatFirstAggregator implements Aggregator { - private final FloatColumnSelector valueSelector; - private final LongColumnSelector timeSelector; + private final BaseFloatColumnValueSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; private final String name; protected long firstTime; @@ -36,8 +36,8 @@ public class FloatFirstAggregator implements Aggregator public FloatFirstAggregator( String name, - LongColumnSelector timeSelector, - FloatColumnSelector valueSelector + BaseLongColumnValueSelector timeSelector, + BaseFloatColumnValueSelector valueSelector ) { this.name = name; diff --git a/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstAggregatorFactory.java index 69a824f83bb9..2d896fb042f5 100644 --- a/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstAggregatorFactory.java @@ -27,15 +27,15 @@ import com.metamx.common.StringUtils; import io.druid.collections.SerializablePair; import io.druid.java.util.common.UOE; +import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.aggregation.Aggregator; import io.druid.query.aggregation.AggregatorFactory; import io.druid.query.aggregation.AggregatorFactoryNotMergeableException; import io.druid.query.aggregation.AggregatorUtil; import io.druid.query.aggregation.BufferAggregator; -import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.column.Column; import java.nio.ByteBuffer; @@ -78,8 +78,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) { return new FloatFirstAggregator( name, - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeFloatColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -87,8 +87,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { return new FloatFirstBufferAggregator( - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeFloatColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -118,7 +118,7 @@ public AggregatorFactory getCombiningFactory() @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new FloatFirstAggregator(name, null, null) { @Override @@ -136,7 +136,7 @@ public void aggregate() @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new FloatFirstBufferAggregator(null, null) { @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstBufferAggregator.java index 62a7a4958ede..672511807935 100644 --- a/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/first/FloatFirstBufferAggregator.java @@ -22,17 +22,20 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.nio.ByteBuffer; public class FloatFirstBufferAggregator implements BufferAggregator { - private final LongColumnSelector timeSelector; - private final FloatColumnSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; + private final BaseFloatColumnValueSelector valueSelector; - public FloatFirstBufferAggregator(LongColumnSelector timeSelector, FloatColumnSelector valueSelector) + public FloatFirstBufferAggregator( + BaseLongColumnValueSelector timeSelector, + BaseFloatColumnValueSelector valueSelector + ) { this.timeSelector = timeSelector; this.valueSelector = valueSelector; diff --git a/processing/src/main/java/io/druid/query/aggregation/first/LongFirstAggregator.java b/processing/src/main/java/io/druid/query/aggregation/first/LongFirstAggregator.java index cdbf33ed7af5..82b22b90af25 100644 --- a/processing/src/main/java/io/druid/query/aggregation/first/LongFirstAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/first/LongFirstAggregator.java @@ -21,13 +21,13 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.Aggregator; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; public class LongFirstAggregator implements Aggregator { - private final LongColumnSelector valueSelector; - private final LongColumnSelector timeSelector; + private final BaseLongColumnValueSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; private final String name; protected long firstTime; @@ -35,8 +35,8 @@ public class LongFirstAggregator implements Aggregator public LongFirstAggregator( String name, - LongColumnSelector timeSelector, - LongColumnSelector valueSelector + BaseLongColumnValueSelector timeSelector, + BaseLongColumnValueSelector valueSelector ) { this.name = name; diff --git a/processing/src/main/java/io/druid/query/aggregation/first/LongFirstAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/first/LongFirstAggregatorFactory.java index 867c99b184b2..cb3ae9cfdb09 100644 --- a/processing/src/main/java/io/druid/query/aggregation/first/LongFirstAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/first/LongFirstAggregatorFactory.java @@ -26,15 +26,15 @@ import com.metamx.common.StringUtils; import io.druid.collections.SerializablePair; import io.druid.java.util.common.UOE; +import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.aggregation.Aggregator; import io.druid.query.aggregation.AggregatorFactory; import io.druid.query.aggregation.AggregatorFactoryNotMergeableException; import io.druid.query.aggregation.AggregatorUtil; import io.druid.query.aggregation.BufferAggregator; -import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.column.Column; import java.nio.ByteBuffer; @@ -71,8 +71,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) { return new LongFirstAggregator( name, - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeLongColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -80,8 +80,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { return new LongFirstBufferAggregator( - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeLongColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -111,7 +111,7 @@ public AggregatorFactory getCombiningFactory() @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new LongFirstAggregator(name, null, null) { @Override @@ -129,7 +129,7 @@ public void aggregate() @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new LongFirstBufferAggregator(null, null) { @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/first/LongFirstBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/first/LongFirstBufferAggregator.java index 1f95668c123f..7bb977371233 100644 --- a/processing/src/main/java/io/druid/query/aggregation/first/LongFirstBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/first/LongFirstBufferAggregator.java @@ -23,16 +23,16 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.nio.ByteBuffer; public class LongFirstBufferAggregator implements BufferAggregator { - private final LongColumnSelector timeSelector; - private final LongColumnSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; + private final BaseLongColumnValueSelector valueSelector; - public LongFirstBufferAggregator(LongColumnSelector timeSelector, LongColumnSelector valueSelector) + public LongFirstBufferAggregator(BaseLongColumnValueSelector timeSelector, BaseLongColumnValueSelector valueSelector) { this.timeSelector = timeSelector; this.valueSelector = valueSelector; diff --git a/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregator.java b/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregator.java index 1ad811a9d827..787418c8e372 100644 --- a/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregator.java @@ -21,40 +21,49 @@ import io.druid.hll.HyperLogLogCollector; import io.druid.query.aggregation.Aggregator; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.BaseObjectColumnValueSelector; + +import javax.annotation.Nullable; /** */ public class HyperUniquesAggregator implements Aggregator { - private final ObjectColumnSelector selector; + private final BaseObjectColumnValueSelector selector; private HyperLogLogCollector collector; - public HyperUniquesAggregator( - ObjectColumnSelector selector - ) + public HyperUniquesAggregator(BaseObjectColumnValueSelector selector) { this.selector = selector; - - this.collector = HyperLogLogCollector.makeLatestCollector(); } @Override public void aggregate() { - collector.fold((HyperLogLogCollector) selector.getObject()); + Object object = selector.getObject(); + if (object == null) { + return; + } + if (collector == null) { + collector = HyperLogLogCollector.makeLatestCollector(); + } + collector.fold((HyperLogLogCollector) object); } @Override public void reset() { - collector = HyperLogLogCollector.makeLatestCollector(); + collector = null; } + @Nullable @Override public Object get() { + if (collector == null) { + return null; + } // Workaround for non-thread-safe use of HyperLogLogCollector. // OnheapIncrementalIndex has a penchant for calling "aggregate" and "get" simultaneously. return HyperLogLogCollector.makeCollectorSharingStorage(collector); diff --git a/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java index e6ded9de10f4..d10b5f35376f 100644 --- a/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java @@ -35,8 +35,9 @@ import io.druid.query.aggregation.NoopBufferAggregator; import io.druid.query.aggregation.cardinality.HyperLogLogCollectorAggregateCombiner; import io.druid.query.cache.CacheKeyBuilder; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.NilColumnValueSelector; import org.apache.commons.codec.binary.Base64; import java.nio.ByteBuffer; @@ -96,39 +97,31 @@ public HyperUniquesAggregatorFactory( @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(fieldName); - - if (selector == null) { + BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); + if (selector instanceof NilColumnValueSelector) { return NoopAggregator.instance(); } - final Class classOfObject = selector.classOfObject(); if (classOfObject.equals(Object.class) || HyperLogLogCollector.class.isAssignableFrom(classOfObject)) { return new HyperUniquesAggregator(selector); } - throw new IAE( - "Incompatible type for metric[%s], expected a HyperUnique, got a %s", fieldName, classOfObject - ); + throw new IAE("Incompatible type for metric[%s], expected a HyperUnique, got a %s", fieldName, classOfObject); } @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(fieldName); - - if (selector == null) { + BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); + if (selector instanceof NilColumnValueSelector) { return NoopBufferAggregator.instance(); } - final Class classOfObject = selector.classOfObject(); if (classOfObject.equals(Object.class) || HyperLogLogCollector.class.isAssignableFrom(classOfObject)) { return new HyperUniquesBufferAggregator(selector); } - throw new IAE( - "Incompatible type for metric[%s], expected a HyperUnique, got a %s", fieldName, classOfObject - ); + throw new IAE("Incompatible type for metric[%s], expected a HyperUnique, got a %s", fieldName, classOfObject); } @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesBufferAggregator.java index e98712a8a87d..0c33914384bc 100644 --- a/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/hyperloglog/HyperUniquesBufferAggregator.java @@ -22,7 +22,7 @@ import io.druid.hll.HyperLogLogCollector; import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import java.nio.ByteBuffer; @@ -31,11 +31,9 @@ public class HyperUniquesBufferAggregator implements BufferAggregator { private static final byte[] EMPTY_BYTES = HyperLogLogCollector.makeEmptyVersionedByteArray(); - private final ObjectColumnSelector selector; + private final BaseObjectColumnValueSelector selector; - public HyperUniquesBufferAggregator( - ObjectColumnSelector selector - ) + public HyperUniquesBufferAggregator(BaseObjectColumnValueSelector selector) { this.selector = selector; } diff --git a/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastAggregator.java b/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastAggregator.java index 6b93f135bf92..5849a4f299a5 100644 --- a/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastAggregator.java @@ -21,14 +21,14 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.Aggregator; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; public class DoubleLastAggregator implements Aggregator { - private final DoubleColumnSelector valueSelector; - private final LongColumnSelector timeSelector; + private final BaseDoubleColumnValueSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; private final String name; protected long lastTime; @@ -36,8 +36,8 @@ public class DoubleLastAggregator implements Aggregator public DoubleLastAggregator( String name, - LongColumnSelector timeSelector, - DoubleColumnSelector valueSelector + BaseLongColumnValueSelector timeSelector, + BaseDoubleColumnValueSelector valueSelector ) { this.name = name; diff --git a/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastAggregatorFactory.java index c7a9a276e355..23f3ee425c37 100644 --- a/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastAggregatorFactory.java @@ -35,8 +35,8 @@ import io.druid.query.aggregation.first.DoubleFirstAggregatorFactory; import io.druid.query.aggregation.first.LongFirstAggregatorFactory; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.column.Column; import java.nio.ByteBuffer; @@ -69,8 +69,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) { return new DoubleLastAggregator( name, - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeDoubleColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -78,8 +78,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { return new DoubleLastBufferAggregator( - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeDoubleColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -109,7 +109,7 @@ public AggregatorFactory getCombiningFactory() @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new DoubleLastAggregator(name, null, null) { @Override @@ -127,7 +127,7 @@ public void aggregate() @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new DoubleLastBufferAggregator(null, null) { @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastBufferAggregator.java index cf2d16b0d45d..167eef13a642 100644 --- a/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/last/DoubleLastBufferAggregator.java @@ -22,17 +22,20 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseDoubleColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.nio.ByteBuffer; public class DoubleLastBufferAggregator implements BufferAggregator { - private final LongColumnSelector timeSelector; - private final DoubleColumnSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; + private final BaseDoubleColumnValueSelector valueSelector; - public DoubleLastBufferAggregator(LongColumnSelector timeSelector, DoubleColumnSelector valueSelector) + public DoubleLastBufferAggregator( + BaseLongColumnValueSelector timeSelector, + BaseDoubleColumnValueSelector valueSelector + ) { this.timeSelector = timeSelector; this.valueSelector = valueSelector; diff --git a/processing/src/main/java/io/druid/query/aggregation/last/FloatLastAggregator.java b/processing/src/main/java/io/druid/query/aggregation/last/FloatLastAggregator.java index 3cc0800b5add..89e18f2e2202 100644 --- a/processing/src/main/java/io/druid/query/aggregation/last/FloatLastAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/last/FloatLastAggregator.java @@ -21,22 +21,22 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.Aggregator; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; public class FloatLastAggregator implements Aggregator { - private final FloatColumnSelector valueSelector; - private final LongColumnSelector timeSelector; + private final BaseFloatColumnValueSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; protected long lastTime; protected float lastValue; public FloatLastAggregator( String name, - LongColumnSelector timeSelector, - FloatColumnSelector valueSelector + BaseLongColumnValueSelector timeSelector, + BaseFloatColumnValueSelector valueSelector ) { this.valueSelector = valueSelector; diff --git a/processing/src/main/java/io/druid/query/aggregation/last/FloatLastAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/last/FloatLastAggregatorFactory.java index 969b614af8d2..c3a4d10a4bcd 100644 --- a/processing/src/main/java/io/druid/query/aggregation/last/FloatLastAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/last/FloatLastAggregatorFactory.java @@ -26,17 +26,17 @@ import com.metamx.common.StringUtils; import io.druid.collections.SerializablePair; import io.druid.java.util.common.UOE; +import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.aggregation.Aggregator; import io.druid.query.aggregation.AggregatorFactory; import io.druid.query.aggregation.AggregatorFactoryNotMergeableException; import io.druid.query.aggregation.AggregatorUtil; import io.druid.query.aggregation.BufferAggregator; -import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.aggregation.first.FloatFirstAggregatorFactory; import io.druid.query.aggregation.first.LongFirstAggregatorFactory; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.column.Column; import java.nio.ByteBuffer; @@ -69,8 +69,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) { return new FloatLastAggregator( name, - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeFloatColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -78,8 +78,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { return new FloatLastBufferAggregator( - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeFloatColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -109,7 +109,7 @@ public AggregatorFactory getCombiningFactory() @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new FloatLastAggregator(name, null, null) { @Override @@ -127,7 +127,7 @@ public void aggregate() @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new FloatLastBufferAggregator(null, null) { @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/last/FloatLastBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/last/FloatLastBufferAggregator.java index ed1befa6639a..08e672cae40e 100644 --- a/processing/src/main/java/io/druid/query/aggregation/last/FloatLastBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/last/FloatLastBufferAggregator.java @@ -22,17 +22,17 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.nio.ByteBuffer; public class FloatLastBufferAggregator implements BufferAggregator { - private final LongColumnSelector timeSelector; - private final FloatColumnSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; + private final BaseFloatColumnValueSelector valueSelector; - public FloatLastBufferAggregator(LongColumnSelector timeSelector, FloatColumnSelector valueSelector) + public FloatLastBufferAggregator(BaseLongColumnValueSelector timeSelector, BaseFloatColumnValueSelector valueSelector) { this.timeSelector = timeSelector; this.valueSelector = valueSelector; diff --git a/processing/src/main/java/io/druid/query/aggregation/last/LongLastAggregator.java b/processing/src/main/java/io/druid/query/aggregation/last/LongLastAggregator.java index e70f0848c7fd..0043ee382d23 100644 --- a/processing/src/main/java/io/druid/query/aggregation/last/LongLastAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/last/LongLastAggregator.java @@ -21,12 +21,12 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.Aggregator; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; public class LongLastAggregator implements Aggregator { - private final LongColumnSelector valueSelector; - private final LongColumnSelector timeSelector; + private final BaseLongColumnValueSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; private final String name; protected long lastTime; @@ -34,8 +34,8 @@ public class LongLastAggregator implements Aggregator public LongLastAggregator( String name, - LongColumnSelector timeSelector, - LongColumnSelector valueSelector + BaseLongColumnValueSelector timeSelector, + BaseLongColumnValueSelector valueSelector ) { this.name = name; diff --git a/processing/src/main/java/io/druid/query/aggregation/last/LongLastAggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/last/LongLastAggregatorFactory.java index ca9f991ae76c..2a3ba885fd24 100644 --- a/processing/src/main/java/io/druid/query/aggregation/last/LongLastAggregatorFactory.java +++ b/processing/src/main/java/io/druid/query/aggregation/last/LongLastAggregatorFactory.java @@ -25,17 +25,17 @@ import com.metamx.common.StringUtils; import io.druid.collections.SerializablePair; import io.druid.java.util.common.UOE; +import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.aggregation.Aggregator; import io.druid.query.aggregation.AggregatorFactory; import io.druid.query.aggregation.AggregatorFactoryNotMergeableException; import io.druid.query.aggregation.AggregatorUtil; import io.druid.query.aggregation.BufferAggregator; -import io.druid.query.aggregation.AggregateCombiner; import io.druid.query.aggregation.first.DoubleFirstAggregatorFactory; import io.druid.query.aggregation.first.LongFirstAggregatorFactory; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.column.Column; import java.nio.ByteBuffer; @@ -67,8 +67,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) { return new LongLastAggregator( name, - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeLongColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -76,8 +76,8 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { return new LongLastBufferAggregator( - metricFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME), - metricFactory.makeLongColumnSelector(fieldName) + metricFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME), + metricFactory.makeColumnValueSelector(fieldName) ); } @@ -107,7 +107,7 @@ public AggregatorFactory getCombiningFactory() @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new LongLastAggregator(name, null, null) { @Override @@ -125,7 +125,7 @@ public void aggregate() @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - final ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(name); + final BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(name); return new LongLastBufferAggregator(null, null) { @Override diff --git a/processing/src/main/java/io/druid/query/aggregation/last/LongLastBufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/last/LongLastBufferAggregator.java index a6d1b5d1c209..0c2a3b390820 100644 --- a/processing/src/main/java/io/druid/query/aggregation/last/LongLastBufferAggregator.java +++ b/processing/src/main/java/io/druid/query/aggregation/last/LongLastBufferAggregator.java @@ -22,16 +22,16 @@ import io.druid.collections.SerializablePair; import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.BaseLongColumnValueSelector; import java.nio.ByteBuffer; public class LongLastBufferAggregator implements BufferAggregator { - private final LongColumnSelector timeSelector; - private final LongColumnSelector valueSelector; + private final BaseLongColumnValueSelector timeSelector; + private final BaseLongColumnValueSelector valueSelector; - public LongLastBufferAggregator(LongColumnSelector timeSelector, LongColumnSelector valueSelector) + public LongLastBufferAggregator(BaseLongColumnValueSelector timeSelector, BaseLongColumnValueSelector valueSelector) { this.timeSelector = timeSelector; this.valueSelector = valueSelector; diff --git a/processing/src/main/java/io/druid/query/dimension/ForwardingFilteredDimensionSelector.java b/processing/src/main/java/io/druid/query/dimension/ForwardingFilteredDimensionSelector.java index fa19679fef6d..880616ef6a21 100644 --- a/processing/src/main/java/io/druid/query/dimension/ForwardingFilteredDimensionSelector.java +++ b/processing/src/main/java/io/druid/query/dimension/ForwardingFilteredDimensionSelector.java @@ -191,6 +191,19 @@ public int lookupId(String name) return forwardMapping.get(baseIdLookup.lookupId(name)); } + @Nullable + @Override + public Object getObject() + { + return defaultGetObject(); + } + + @Override + public Class classOfObject() + { + return Object.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { diff --git a/processing/src/main/java/io/druid/query/dimension/PredicateFilteredDimensionSelector.java b/processing/src/main/java/io/druid/query/dimension/PredicateFilteredDimensionSelector.java index a99eda5c521e..0155ccd98d2f 100644 --- a/processing/src/main/java/io/druid/query/dimension/PredicateFilteredDimensionSelector.java +++ b/processing/src/main/java/io/druid/query/dimension/PredicateFilteredDimensionSelector.java @@ -149,6 +149,19 @@ public IdLookup idLookup() return selector.idLookup(); } + @Nullable + @Override + public Object getObject() + { + return defaultGetObject(); + } + + @Override + public Class classOfObject() + { + return Object.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { diff --git a/processing/src/main/java/io/druid/query/filter/DoubleValueMatcherColumnSelectorStrategy.java b/processing/src/main/java/io/druid/query/filter/DoubleValueMatcherColumnSelectorStrategy.java index f2c20e645ce5..f41e6c6a0242 100644 --- a/processing/src/main/java/io/druid/query/filter/DoubleValueMatcherColumnSelectorStrategy.java +++ b/processing/src/main/java/io/druid/query/filter/DoubleValueMatcherColumnSelectorStrategy.java @@ -20,15 +20,16 @@ package io.druid.query.filter; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseDoubleColumnValueSelector; import io.druid.segment.DimensionHandlerUtils; -import io.druid.segment.DoubleColumnSelector; import io.druid.segment.filter.BooleanValueMatcher; -public class DoubleValueMatcherColumnSelectorStrategy implements ValueMatcherColumnSelectorStrategy +public class DoubleValueMatcherColumnSelectorStrategy + implements ValueMatcherColumnSelectorStrategy { @Override - public ValueMatcher makeValueMatcher(final DoubleColumnSelector selector, final String value) + public ValueMatcher makeValueMatcher(final BaseDoubleColumnValueSelector selector, final String value) { final Double matchVal = DimensionHandlerUtils.convertObjectToDouble(value); if (matchVal == null) { @@ -54,7 +55,8 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) @Override public ValueMatcher makeValueMatcher( - final DoubleColumnSelector selector, DruidPredicateFactory predicateFactory + final BaseDoubleColumnValueSelector selector, + DruidPredicateFactory predicateFactory ) { final DruidDoublePredicate predicate = predicateFactory.makeDoublePredicate(); @@ -76,7 +78,7 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) } @Override - public ValueGetter makeValueGetter(final DoubleColumnSelector selector) + public ValueGetter makeValueGetter(final BaseDoubleColumnValueSelector selector) { return new ValueGetter() { diff --git a/processing/src/main/java/io/druid/query/filter/FloatValueMatcherColumnSelectorStrategy.java b/processing/src/main/java/io/druid/query/filter/FloatValueMatcherColumnSelectorStrategy.java index 209678de818b..af7a2b215ed9 100644 --- a/processing/src/main/java/io/druid/query/filter/FloatValueMatcherColumnSelectorStrategy.java +++ b/processing/src/main/java/io/druid/query/filter/FloatValueMatcherColumnSelectorStrategy.java @@ -20,14 +20,15 @@ package io.druid.query.filter; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseFloatColumnValueSelector; import io.druid.segment.DimensionHandlerUtils; -import io.druid.segment.FloatColumnSelector; import io.druid.segment.filter.BooleanValueMatcher; -public class FloatValueMatcherColumnSelectorStrategy implements ValueMatcherColumnSelectorStrategy +public class FloatValueMatcherColumnSelectorStrategy + implements ValueMatcherColumnSelectorStrategy { @Override - public ValueMatcher makeValueMatcher(final FloatColumnSelector selector, final String value) + public ValueMatcher makeValueMatcher(final BaseFloatColumnValueSelector selector, final String value) { final Float matchVal = DimensionHandlerUtils.convertObjectToFloat(value); if (matchVal == null) { @@ -53,7 +54,8 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) @Override public ValueMatcher makeValueMatcher( - final FloatColumnSelector selector, DruidPredicateFactory predicateFactory + final BaseFloatColumnValueSelector selector, + DruidPredicateFactory predicateFactory ) { final DruidFloatPredicate predicate = predicateFactory.makeFloatPredicate(); @@ -75,7 +77,7 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) } @Override - public ValueGetter makeValueGetter(final FloatColumnSelector selector) + public ValueGetter makeValueGetter(final BaseFloatColumnValueSelector selector) { return new ValueGetter() { diff --git a/processing/src/main/java/io/druid/query/filter/LongValueMatcherColumnSelectorStrategy.java b/processing/src/main/java/io/druid/query/filter/LongValueMatcherColumnSelectorStrategy.java index 73ce3bbaff5e..15a62bd50631 100644 --- a/processing/src/main/java/io/druid/query/filter/LongValueMatcherColumnSelectorStrategy.java +++ b/processing/src/main/java/io/druid/query/filter/LongValueMatcherColumnSelectorStrategy.java @@ -20,14 +20,15 @@ package io.druid.query.filter; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseLongColumnValueSelector; import io.druid.segment.DimensionHandlerUtils; -import io.druid.segment.LongColumnSelector; import io.druid.segment.filter.BooleanValueMatcher; -public class LongValueMatcherColumnSelectorStrategy implements ValueMatcherColumnSelectorStrategy +public class LongValueMatcherColumnSelectorStrategy + implements ValueMatcherColumnSelectorStrategy { @Override - public ValueMatcher makeValueMatcher(final LongColumnSelector selector, final String value) + public ValueMatcher makeValueMatcher(final BaseLongColumnValueSelector selector, final String value) { final Long matchVal = DimensionHandlerUtils.convertObjectToLong(value); if (matchVal == null) { @@ -52,7 +53,8 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) @Override public ValueMatcher makeValueMatcher( - final LongColumnSelector selector, DruidPredicateFactory predicateFactory + final BaseLongColumnValueSelector selector, + DruidPredicateFactory predicateFactory ) { final DruidLongPredicate predicate = predicateFactory.makeLongPredicate(); @@ -74,7 +76,7 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) } @Override - public ValueGetter makeValueGetter(final LongColumnSelector selector) + public ValueGetter makeValueGetter(final BaseLongColumnValueSelector selector) { return new ValueGetter() { diff --git a/processing/src/main/java/io/druid/query/filter/ValueMatcherColumnSelectorStrategy.java b/processing/src/main/java/io/druid/query/filter/ValueMatcherColumnSelectorStrategy.java index 5d61a3cd9b43..688d2b2e5eee 100644 --- a/processing/src/main/java/io/druid/query/filter/ValueMatcherColumnSelectorStrategy.java +++ b/processing/src/main/java/io/druid/query/filter/ValueMatcherColumnSelectorStrategy.java @@ -20,9 +20,8 @@ package io.druid.query.filter; import io.druid.query.dimension.ColumnSelectorStrategy; -import io.druid.segment.ColumnValueSelector; -public interface ValueMatcherColumnSelectorStrategy extends ColumnSelectorStrategy +public interface ValueMatcherColumnSelectorStrategy extends ColumnSelectorStrategy { /** * Create a single value ValueMatcher. diff --git a/processing/src/main/java/io/druid/query/groupby/RowBasedColumnSelectorFactory.java b/processing/src/main/java/io/druid/query/groupby/RowBasedColumnSelectorFactory.java index 0128eef462ee..e8039701c827 100644 --- a/processing/src/main/java/io/druid/query/groupby/RowBasedColumnSelectorFactory.java +++ b/processing/src/main/java/io/druid/query/groupby/RowBasedColumnSelectorFactory.java @@ -29,12 +29,10 @@ import io.druid.query.filter.ValueMatcher; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.ColumnSelectorFactory; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; import io.druid.segment.IdLookup; import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.SingleValueDimensionSelector; import io.druid.segment.column.Column; import io.druid.segment.column.ColumnCapabilities; @@ -189,6 +187,19 @@ public IdLookup idLookup() return null; } + @Nullable + @Override + public Object getObject() + { + return lookupName(0); + } + + @Override + public Class classOfObject() + { + return String.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { @@ -348,146 +359,93 @@ public IdLookup idLookup() return null; } + @Nullable @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) + public Object getObject() { - inspector.visit("row", row); - inspector.visit("extractionFn", extractionFn); + List dimensionValues = row.get().getDimension(dimension); + if (dimensionValues == null) { + return null; + } + if (dimensionValues.size() == 1) { + return dimensionValues.get(0); + } + return dimensionValues.toArray(new String[0]); } - }; - } - } - @Override - public FloatColumnSelector makeFloatColumnSelector(final String columnName) - { - abstract class RowBasedFloatColumnSelector implements FloatColumnSelector - { - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("row", row); - } - } - if (columnName.equals(Column.TIME_COLUMN_NAME)) { - class TimeFloatColumnSelector extends RowBasedFloatColumnSelector - { @Override - public float getFloat() + public Class classOfObject() { - return (float) row.get().getTimestampFromEpoch(); + return Object.class; } - } - return new TimeFloatColumnSelector(); - } else { - return new RowBasedFloatColumnSelector() - { + @Override - public float getFloat() + public void inspectRuntimeShape(RuntimeShapeInspector inspector) { - return row.get().getFloatMetric(columnName); + inspector.visit("row", row); + inspector.visit("extractionFn", extractionFn); } }; } } @Override - public LongColumnSelector makeLongColumnSelector(final String columnName) + public ColumnValueSelector makeColumnValueSelector(String columnName) { - abstract class RowBasedLongColumnSelector implements LongColumnSelector - { - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("row", row); - } - } if (columnName.equals(Column.TIME_COLUMN_NAME)) { - class TimeLongColumnSelector extends RowBasedLongColumnSelector + class TimeLongColumnSelector implements LongColumnSelector { @Override public long getLong() { return row.get().getTimestampFromEpoch(); } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("row", row); + } } return new TimeLongColumnSelector(); } else { - return new RowBasedLongColumnSelector() + return new ColumnValueSelector() { @Override - public long getLong() + public double getDouble() { - return row.get().getLongMetric(columnName); + return row.get().getMetric(columnName).doubleValue(); } - }; - } - } - @Override - public ObjectColumnSelector makeObjectColumnSelector(final String columnName) - { - if (columnName.equals(Column.TIME_COLUMN_NAME)) { - return new ObjectColumnSelector() - { @Override - public Class classOfObject() + public float getFloat() { - return Long.class; + return row.get().getMetric(columnName).floatValue(); } @Override - public Object getObject() + public long getLong() { - return row.get().getTimestampFromEpoch(); - } - }; - } else { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Object.class; + return row.get().getMetric(columnName).longValue(); } + @Nullable @Override public Object getObject() { return row.get().getRaw(columnName); } - }; - } - } - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName) - { - abstract class RowBasedDoubleColumnSelector implements DoubleColumnSelector - { - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("row", row); - } - } - if (columnName.equals(Column.TIME_COLUMN_NAME)) { - class TimeDoubleColumnSelector extends RowBasedDoubleColumnSelector - { @Override - public double getDouble() + public Class classOfObject() { - return (double) row.get().getTimestampFromEpoch(); + return Object.class; } - } - return new TimeDoubleColumnSelector(); - } else { - return new RowBasedDoubleColumnSelector() - { + @Override - public double getDouble() + public void inspectRuntimeShape(RuntimeShapeInspector inspector) { - return row.get().getDoubleMetric(columnName); + inspector.visit("row", row); } }; } diff --git a/processing/src/main/java/io/druid/query/groupby/epinephelinae/RowBasedGrouperHelper.java b/processing/src/main/java/io/druid/query/groupby/epinephelinae/RowBasedGrouperHelper.java index 48c07f1a88cb..a6673b9174dd 100644 --- a/processing/src/main/java/io/druid/query/groupby/epinephelinae/RowBasedGrouperHelper.java +++ b/processing/src/main/java/io/druid/query/groupby/epinephelinae/RowBasedGrouperHelper.java @@ -54,13 +54,13 @@ import io.druid.query.groupby.strategy.GroupByStrategyV2; import io.druid.query.ordering.StringComparator; import io.druid.query.ordering.StringComparators; +import io.druid.segment.BaseDoubleColumnValueSelector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionHandlerUtils; import io.druid.segment.DimensionSelector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; import io.druid.segment.column.ColumnCapabilities; import io.druid.segment.column.ValueType; import io.druid.segment.data.IndexedInts; @@ -537,12 +537,13 @@ public InputRawSupplierColumnSelectorStrategy makeColumnSelectorStrategy( case STRING: return new StringInputRawSupplierColumnSelectorStrategy(); case LONG: - return (InputRawSupplierColumnSelectorStrategy) columnSelector -> columnSelector::getLong; + return (InputRawSupplierColumnSelectorStrategy) + columnSelector -> columnSelector::getLong; case FLOAT: - return (InputRawSupplierColumnSelectorStrategy) + return (InputRawSupplierColumnSelectorStrategy) columnSelector -> columnSelector::getFloat; case DOUBLE: - return (InputRawSupplierColumnSelectorStrategy) + return (InputRawSupplierColumnSelectorStrategy) columnSelector -> columnSelector::getDouble; default: throw new IAE("Cannot create query type helper from invalid type [%s]", type); diff --git a/processing/src/main/java/io/druid/query/groupby/having/HavingSpecMetricComparator.java b/processing/src/main/java/io/druid/query/groupby/having/HavingSpecMetricComparator.java index 324962478447..cae152a1d091 100644 --- a/processing/src/main/java/io/druid/query/groupby/having/HavingSpecMetricComparator.java +++ b/processing/src/main/java/io/druid/query/groupby/having/HavingSpecMetricComparator.java @@ -19,9 +19,8 @@ package io.druid.query.groupby.having; -import com.google.common.primitives.Floats; -import com.google.common.primitives.Longs; import io.druid.data.input.Row; +import io.druid.java.util.common.ISE; import java.util.regex.Pattern; @@ -36,18 +35,25 @@ static int compare(Row row, String aggregationName, Number value) Object metricValueObj = row.getRaw(aggregationName); if (metricValueObj != null) { if (metricValueObj instanceof Long) { - long l = ((Long) metricValueObj).longValue(); - return Longs.compare(l, value.longValue()); + return Long.compare((Long) metricValueObj, value.longValue()); + } else if (metricValueObj instanceof Float) { + return Float.compare((Float) metricValueObj, value.floatValue()); + } else if (metricValueObj instanceof Double) { + return Double.compare((Double) metricValueObj, value.doubleValue()); } else if (metricValueObj instanceof String) { String metricValueStr = (String) metricValueObj; if (LONG_PAT.matcher(metricValueStr).matches()) { - long l = row.getLongMetric(aggregationName); - return Longs.compare(l, value.longValue()); + long l = Long.parseLong(metricValueStr); + return Long.compare(l, value.longValue()); + } else { + double d = Double.parseDouble(metricValueStr); + return Double.compare(d, value.doubleValue()); } + } else { + throw new ISE("Unknown type of metric value: %s", metricValueObj); } + } else { + return Double.compare(0, value.doubleValue()); } - - float f = row.getFloatMetric(aggregationName); - return Floats.compare(f, value.floatValue()); } } diff --git a/processing/src/main/java/io/druid/query/scan/ScanQueryEngine.java b/processing/src/main/java/io/druid/query/scan/ScanQueryEngine.java index 4896bdc6012a..43bb8846c5df 100644 --- a/processing/src/main/java/io/druid/query/scan/ScanQueryEngine.java +++ b/processing/src/main/java/io/druid/query/scan/ScanQueryEngine.java @@ -33,8 +33,8 @@ import io.druid.query.QueryContexts; import io.druid.query.QueryInterruptedException; import io.druid.query.filter.Filter; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.Cursor; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.Segment; import io.druid.segment.StorageAdapter; import io.druid.segment.VirtualColumn; @@ -144,16 +144,16 @@ public Sequence apply(final Cursor cursor) @Override public Iterator make() { - final List columnSelectors = new ArrayList<>(allColumns.size()); + final List columnSelectors = new ArrayList<>(allColumns.size()); for (String column : allColumns) { - final ObjectColumnSelector selector; + final BaseObjectColumnValueSelector selector; if (legacy && column.equals(LEGACY_TIMESTAMP_KEY)) { selector = cursor.getColumnSelectorFactory() - .makeObjectColumnSelector(Column.TIME_COLUMN_NAME); + .makeColumnValueSelector(Column.TIME_COLUMN_NAME); } else { - selector = cursor.getColumnSelectorFactory().makeObjectColumnSelector(column); + selector = cursor.getColumnSelectorFactory().makeColumnValueSelector(column); } columnSelectors.add(selector); @@ -237,7 +237,7 @@ private List> rowsToList() private Object getColumnValue(int i) { - final ObjectColumnSelector selector = columnSelectors.get(i); + final BaseObjectColumnValueSelector selector = columnSelectors.get(i); final Object value; if (legacy && allColumns.get(i).equals(LEGACY_TIMESTAMP_KEY)) { diff --git a/processing/src/main/java/io/druid/query/search/SearchQueryRunner.java b/processing/src/main/java/io/druid/query/search/SearchQueryRunner.java index dcdcef9321e5..7921d717b9a4 100644 --- a/processing/src/main/java/io/druid/query/search/SearchQueryRunner.java +++ b/processing/src/main/java/io/druid/query/search/SearchQueryRunner.java @@ -35,11 +35,11 @@ import io.druid.query.Result; import io.druid.query.dimension.ColumnSelectorStrategy; import io.druid.query.dimension.ColumnSelectorStrategyFactory; +import io.druid.segment.BaseDoubleColumnValueSelector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; import io.druid.segment.Segment; import io.druid.segment.column.ColumnCapabilities; import io.druid.segment.column.ValueType; @@ -90,8 +90,7 @@ public SearchColumnSelectorStrategy makeColumnSelectorStrategy( } } - public interface SearchColumnSelectorStrategy - extends ColumnSelectorStrategy + public interface SearchColumnSelectorStrategy extends ColumnSelectorStrategy { /** * Read the current row from dimSelector and update the search result set. @@ -149,12 +148,13 @@ private static boolean isNilSelector(final DimensionSelector selector) && selector.lookupName(0) == null; } - public static class LongSearchColumnSelectorStrategy implements SearchColumnSelectorStrategy + public static class LongSearchColumnSelectorStrategy + implements SearchColumnSelectorStrategy { @Override public void updateSearchResultSet( String outputName, - LongColumnSelector selector, + BaseLongColumnValueSelector selector, SearchQuerySpec searchQuerySpec, int limit, Object2IntRBTreeMap set @@ -169,12 +169,13 @@ public void updateSearchResultSet( } } - public static class FloatSearchColumnSelectorStrategy implements SearchColumnSelectorStrategy + public static class FloatSearchColumnSelectorStrategy + implements SearchColumnSelectorStrategy { @Override public void updateSearchResultSet( String outputName, - FloatColumnSelector selector, + BaseFloatColumnValueSelector selector, SearchQuerySpec searchQuerySpec, int limit, Object2IntRBTreeMap set @@ -189,12 +190,13 @@ public void updateSearchResultSet( } } - public static class DoubleSearchColumnSelectorStrategy implements SearchColumnSelectorStrategy + public static class DoubleSearchColumnSelectorStrategy + implements SearchColumnSelectorStrategy { @Override public void updateSearchResultSet( String outputName, - DoubleColumnSelector selector, + BaseDoubleColumnValueSelector selector, SearchQuerySpec searchQuerySpec, int limit, Object2IntRBTreeMap set diff --git a/processing/src/main/java/io/druid/query/select/SelectQueryEngine.java b/processing/src/main/java/io/druid/query/select/SelectQueryEngine.java index 71b81335dedf..17bea96cdd9a 100644 --- a/processing/src/main/java/io/druid/query/select/SelectQueryEngine.java +++ b/processing/src/main/java/io/druid/query/select/SelectQueryEngine.java @@ -38,14 +38,14 @@ import io.druid.query.dimension.DefaultDimensionSpec; import io.druid.query.dimension.DimensionSpec; import io.druid.query.filter.Filter; +import io.druid.segment.BaseDoubleColumnValueSelector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnValueSelector; import io.druid.segment.Cursor; import io.druid.segment.DimensionHandlerUtils; import io.druid.segment.DimensionSelector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.Segment; import io.druid.segment.StorageAdapter; import io.druid.segment.column.Column; @@ -90,7 +90,7 @@ public SelectColumnSelectorStrategy makeColumnSelectorStrategy( } } - public interface SelectColumnSelectorStrategy extends ColumnSelectorStrategy + public interface SelectColumnSelectorStrategy extends ColumnSelectorStrategy { /** * Read the current row from dimSelector and add the row values for a dimension to the result map. @@ -132,49 +132,56 @@ public void addRowValuesToSelectResult(String outputName, DimensionSelector sele } } - public static class LongSelectColumnSelectorStrategy implements SelectColumnSelectorStrategy + public static class LongSelectColumnSelectorStrategy + implements SelectColumnSelectorStrategy { @Override public void addRowValuesToSelectResult( - String outputName, LongColumnSelector dimSelector, Map resultMap + String outputName, + BaseLongColumnValueSelector selector, + Map resultMap ) { - if (dimSelector == null) { + if (selector == null) { resultMap.put(outputName, null); } else { - resultMap.put(outputName, dimSelector.getLong()); + resultMap.put(outputName, selector.getLong()); } } } - public static class FloatSelectColumnSelectorStrategy implements SelectColumnSelectorStrategy + public static class FloatSelectColumnSelectorStrategy + implements SelectColumnSelectorStrategy { @Override public void addRowValuesToSelectResult( - String outputName, FloatColumnSelector dimSelector, Map resultMap + String outputName, + BaseFloatColumnValueSelector selector, + Map resultMap ) { - if (dimSelector == null) { + if (selector == null) { resultMap.put(outputName, null); } else { - resultMap.put(outputName, dimSelector.getFloat()); + resultMap.put(outputName, selector.getFloat()); } } } - public static class DoubleSelectColumnSelectorStrategy implements SelectColumnSelectorStrategy + public static class DoubleSelectColumnSelectorStrategy + implements SelectColumnSelectorStrategy { @Override public void addRowValuesToSelectResult( String outputName, - DoubleColumnSelector dimSelector, + BaseDoubleColumnValueSelector selector, Map resultMap ) { - if (dimSelector == null) { + if (selector == null) { resultMap.put(outputName, null); } else { - resultMap.put(outputName, dimSelector.getDouble()); + resultMap.put(outputName, selector.getDouble()); } } } @@ -241,8 +248,8 @@ public Result apply(Cursor cursor) query.isDescending() ); - final LongColumnSelector timestampColumnSelector = - cursor.getColumnSelectorFactory().makeLongColumnSelector(Column.TIME_COLUMN_NAME); + final BaseLongColumnValueSelector timestampColumnSelector = + cursor.getColumnSelectorFactory().makeColumnValueSelector(Column.TIME_COLUMN_NAME); final List> selectorPlusList = Arrays.asList( DimensionHandlerUtils.createColumnSelectorPluses( @@ -256,10 +263,10 @@ public Result apply(Cursor cursor) builder.addDimension(dimSpec.getOutputName()); } - final Map metSelectors = Maps.newHashMap(); + final Map> metSelectors = Maps.newHashMap(); for (String metric : metrics) { - final ObjectColumnSelector metricSelector = - cursor.getColumnSelectorFactory().makeObjectColumnSelector(metric); + final BaseObjectColumnValueSelector metricSelector = + cursor.getColumnSelectorFactory().makeColumnValueSelector(metric); metSelectors.put(metric, metricSelector); builder.addMetric(metric); } @@ -296,9 +303,9 @@ public Result apply(Cursor cursor) public static Map singleEvent( String timestampKey, - LongColumnSelector timestampColumnSelector, + BaseLongColumnValueSelector timestampColumnSelector, List> selectorPlusList, - Map metSelectors + Map> metSelectors ) { final Map theEvent = Maps.newLinkedHashMap(); @@ -308,9 +315,9 @@ public static Map singleEvent( selectorPlus.getColumnSelectorStrategy().addRowValuesToSelectResult(selectorPlus.getOutputName(), selectorPlus.getSelector(), theEvent); } - for (Map.Entry metSelector : metSelectors.entrySet()) { + for (Map.Entry> metSelector : metSelectors.entrySet()) { final String metric = metSelector.getKey(); - final ObjectColumnSelector selector = metSelector.getValue(); + final BaseObjectColumnValueSelector selector = metSelector.getValue(); if (selector == null) { theEvent.put(metric, null); diff --git a/processing/src/main/java/io/druid/query/timeboundary/TimeBoundaryQueryRunnerFactory.java b/processing/src/main/java/io/druid/query/timeboundary/TimeBoundaryQueryRunnerFactory.java index 01ad3166b9c2..0056e2199db9 100644 --- a/processing/src/main/java/io/druid/query/timeboundary/TimeBoundaryQueryRunnerFactory.java +++ b/processing/src/main/java/io/druid/query/timeboundary/TimeBoundaryQueryRunnerFactory.java @@ -37,8 +37,8 @@ import io.druid.query.QueryToolChest; import io.druid.query.QueryWatcher; import io.druid.query.Result; +import io.druid.segment.BaseLongColumnValueSelector; import io.druid.segment.Cursor; -import io.druid.segment.LongColumnSelector; import io.druid.segment.Segment; import io.druid.segment.StorageAdapter; import io.druid.segment.VirtualColumns; @@ -103,8 +103,8 @@ public Result apply(Cursor cursor) if (cursor.isDone()) { return null; } - final LongColumnSelector timestampColumnSelector = - cursor.getColumnSelectorFactory().makeLongColumnSelector(Column.TIME_COLUMN_NAME); + final BaseLongColumnValueSelector timestampColumnSelector = + cursor.getColumnSelectorFactory().makeColumnValueSelector(Column.TIME_COLUMN_NAME); final DateTime timestamp = DateTimes.utc(timestampColumnSelector.getLong()); return new Result<>(adapter.getInterval().getStart(), timestamp); } diff --git a/processing/src/main/java/io/druid/query/topn/Historical1AggPooledTopNScanner.java b/processing/src/main/java/io/druid/query/topn/Historical1AggPooledTopNScanner.java index fc1691a10786..7294a4e13a1e 100644 --- a/processing/src/main/java/io/druid/query/topn/Historical1AggPooledTopNScanner.java +++ b/processing/src/main/java/io/druid/query/topn/Historical1AggPooledTopNScanner.java @@ -20,7 +20,6 @@ package io.druid.query.topn; import io.druid.query.aggregation.BufferAggregator; -import io.druid.segment.ColumnValueSelector; import io.druid.segment.historical.HistoricalCursor; import io.druid.segment.historical.HistoricalDimensionSelector; @@ -28,7 +27,7 @@ public interface Historical1AggPooledTopNScanner< DimensionSelectorType extends HistoricalDimensionSelector, - MetricSelectorType extends ColumnValueSelector, + MetricSelectorType, BufferAggregatorType extends BufferAggregator> { /** diff --git a/processing/src/main/java/io/druid/query/topn/types/NumericTopNColumnSelectorStrategy.java b/processing/src/main/java/io/druid/query/topn/types/NumericTopNColumnSelectorStrategy.java index 22a968519512..6a8202dbfc6e 100644 --- a/processing/src/main/java/io/druid/query/topn/types/NumericTopNColumnSelectorStrategy.java +++ b/processing/src/main/java/io/druid/query/topn/types/NumericTopNColumnSelectorStrategy.java @@ -25,12 +25,11 @@ import io.druid.query.topn.TopNParams; import io.druid.query.topn.TopNQuery; import io.druid.query.topn.TopNResultBuilder; +import io.druid.segment.BaseDoubleColumnValueSelector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; import io.druid.segment.Capabilities; -import io.druid.segment.ColumnValueSelector; import io.druid.segment.Cursor; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; import io.druid.segment.column.ValueType; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -40,7 +39,7 @@ import java.util.Map; public abstract class NumericTopNColumnSelectorStrategy< - ValueSelectorType extends ColumnValueSelector, + ValueSelectorType, DimExtractionAggregateStoreType extends Map> implements TopNColumnSelectorStrategy { @@ -60,7 +59,7 @@ public Aggregator[][] getDimExtractionRowSelector( static long floatDimExtractionScanAndAggregate( TopNQuery query, - FloatColumnSelector selector, + BaseFloatColumnValueSelector selector, Cursor cursor, Int2ObjectMap aggregatesStore ) @@ -84,7 +83,7 @@ static long floatDimExtractionScanAndAggregate( static long doubleDimExtractionScanAndAggregate( TopNQuery query, - DoubleColumnSelector selector, + BaseDoubleColumnValueSelector selector, Cursor cursor, Long2ObjectMap aggregatesStore ) @@ -108,7 +107,7 @@ static long doubleDimExtractionScanAndAggregate( static long longDimExtractionScanAndAggregate( TopNQuery query, - LongColumnSelector selector, + BaseLongColumnValueSelector selector, Cursor cursor, Long2ObjectMap aggregatesStore ) @@ -157,7 +156,8 @@ public void updateDimExtractionResults( abstract Comparable convertAggregatorStoreKeyToColumnValue(Object aggregatorStoreKey); - static class OfFloat extends NumericTopNColumnSelectorStrategy> + static class OfFloat + extends NumericTopNColumnSelectorStrategy> { @Override public ValueType getValueType() @@ -180,7 +180,7 @@ Comparable convertAggregatorStoreKeyToColumnValue(Object aggregatorStoreKey) @Override public long dimExtractionScanAndAggregate( TopNQuery query, - FloatColumnSelector selector, + BaseFloatColumnValueSelector selector, Cursor cursor, Aggregator[][] rowSelector, Int2ObjectMap aggregatesStore @@ -190,7 +190,8 @@ public long dimExtractionScanAndAggregate( } } - static class OfLong extends NumericTopNColumnSelectorStrategy> + static class OfLong + extends NumericTopNColumnSelectorStrategy> { @Override public ValueType getValueType() @@ -213,7 +214,7 @@ Comparable convertAggregatorStoreKeyToColumnValue(Object aggregatorStoreKey) @Override public long dimExtractionScanAndAggregate( TopNQuery query, - LongColumnSelector selector, + BaseLongColumnValueSelector selector, Cursor cursor, Aggregator[][] rowSelector, Long2ObjectMap aggregatesStore @@ -223,7 +224,8 @@ public long dimExtractionScanAndAggregate( } } - static class OfDouble extends NumericTopNColumnSelectorStrategy> + static class OfDouble + extends NumericTopNColumnSelectorStrategy> { @Override public ValueType getValueType() @@ -246,7 +248,7 @@ Comparable convertAggregatorStoreKeyToColumnValue(Object aggregatorStoreKey) @Override public long dimExtractionScanAndAggregate( TopNQuery query, - DoubleColumnSelector selector, + BaseDoubleColumnValueSelector selector, Cursor cursor, Aggregator[][] rowSelector, Long2ObjectMap aggregatesStore diff --git a/processing/src/main/java/io/druid/query/topn/types/TopNColumnSelectorStrategy.java b/processing/src/main/java/io/druid/query/topn/types/TopNColumnSelectorStrategy.java index 2ac610bd5613..3ed8d4ebf439 100644 --- a/processing/src/main/java/io/druid/query/topn/types/TopNColumnSelectorStrategy.java +++ b/processing/src/main/java/io/druid/query/topn/types/TopNColumnSelectorStrategy.java @@ -26,15 +26,13 @@ import io.druid.query.topn.TopNQuery; import io.druid.query.topn.TopNResultBuilder; import io.druid.segment.Capabilities; -import io.druid.segment.ColumnValueSelector; import io.druid.segment.Cursor; import io.druid.segment.column.ValueType; import javax.annotation.Nullable; import java.util.Map; -public interface TopNColumnSelectorStrategy - +public interface TopNColumnSelectorStrategy extends ColumnSelectorStrategy { int CARDINALITY_UNKNOWN = -1; diff --git a/processing/src/main/java/io/druid/segment/BaseDoubleColumnValueSelector.java b/processing/src/main/java/io/druid/segment/BaseDoubleColumnValueSelector.java new file mode 100644 index 000000000000..14c081c964e0 --- /dev/null +++ b/processing/src/main/java/io/druid/segment/BaseDoubleColumnValueSelector.java @@ -0,0 +1,36 @@ +/* + * Licensed to Metamarkets Group Inc. (Metamarkets) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Metamarkets licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.druid.segment; + +import io.druid.query.monomorphicprocessing.CalledFromHotLoop; +import io.druid.query.monomorphicprocessing.HotLoopCallee; + +/** + * Double value selecting polymorphic "part" of the {@link ColumnValueSelector} interface. Users of {@link + * ColumnValueSelector#getDouble()} are encouraged to reduce the parameter/field/etc. type to + * BaseDoubleColumnValueSelector to make it impossible to accidently call any method other than {@link #getDouble()}. + * + * All implementations of this interface MUST also implement {@link ColumnValueSelector}. + */ +public interface BaseDoubleColumnValueSelector extends HotLoopCallee +{ + @CalledFromHotLoop + double getDouble(); +} diff --git a/processing/src/main/java/io/druid/segment/BaseFloatColumnValueSelector.java b/processing/src/main/java/io/druid/segment/BaseFloatColumnValueSelector.java new file mode 100644 index 000000000000..2b7220f2fa98 --- /dev/null +++ b/processing/src/main/java/io/druid/segment/BaseFloatColumnValueSelector.java @@ -0,0 +1,36 @@ +/* + * Licensed to Metamarkets Group Inc. (Metamarkets) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Metamarkets licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.druid.segment; + +import io.druid.query.monomorphicprocessing.CalledFromHotLoop; +import io.druid.query.monomorphicprocessing.HotLoopCallee; + +/** + * Float value selecting polymorphic "part" of the {@link ColumnValueSelector} interface. Users of {@link + * ColumnValueSelector#getFloat()} are encouraged to reduce the parameter/field/etc. type to + * BaseFloatColumnValueSelector to make it impossible to accidently call any method other than {@link #getFloat()}. + * + * All implementations of this interface MUST also implement {@link ColumnValueSelector}. + */ +public interface BaseFloatColumnValueSelector extends HotLoopCallee +{ + @CalledFromHotLoop + float getFloat(); +} diff --git a/processing/src/main/java/io/druid/segment/BaseLongColumnValueSelector.java b/processing/src/main/java/io/druid/segment/BaseLongColumnValueSelector.java new file mode 100644 index 000000000000..5b7f7a664da3 --- /dev/null +++ b/processing/src/main/java/io/druid/segment/BaseLongColumnValueSelector.java @@ -0,0 +1,36 @@ +/* + * Licensed to Metamarkets Group Inc. (Metamarkets) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Metamarkets licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.druid.segment; + +import io.druid.query.monomorphicprocessing.CalledFromHotLoop; +import io.druid.query.monomorphicprocessing.HotLoopCallee; + +/** + * Long value selecting polymorphic "part" of the {@link ColumnValueSelector} interface. Users of {@link + * ColumnValueSelector#getLong()} are encouraged to reduce the parameter/field/etc. type to BaseLongColumnValueSelector + * to make it impossible to accidently call any method other than {@link #getLong()}. + * + * All implementations of this interface MUST also implement {@link ColumnValueSelector}. + */ +public interface BaseLongColumnValueSelector extends HotLoopCallee +{ + @CalledFromHotLoop + long getLong(); +} diff --git a/processing/src/main/java/io/druid/segment/ZeroDoubleColumnSelector.java b/processing/src/main/java/io/druid/segment/BaseObjectColumnValueSelector.java similarity index 59% rename from processing/src/main/java/io/druid/segment/ZeroDoubleColumnSelector.java rename to processing/src/main/java/io/druid/segment/BaseObjectColumnValueSelector.java index 0e6544fe9997..91f3f080ab91 100644 --- a/processing/src/main/java/io/druid/segment/ZeroDoubleColumnSelector.java +++ b/processing/src/main/java/io/druid/segment/BaseObjectColumnValueSelector.java @@ -19,31 +19,19 @@ package io.druid.segment; -import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import javax.annotation.Nullable; -public final class ZeroDoubleColumnSelector implements DoubleColumnSelector +/** + * Object value selecting polymorphic "part" of the {@link ColumnValueSelector} interface. Users of {@link + * ColumnValueSelector#getObject()} are encouraged to reduce the parameter/field/etc. type to + * BaseObjectColumnValueSelector to make it impossible to accidently call any method other than {@link #getObject()}. + * + * All implementations of this interface MUST also implement {@link ColumnValueSelector}. + */ +public interface BaseObjectColumnValueSelector { - private static final ZeroDoubleColumnSelector INSTANCE = new ZeroDoubleColumnSelector(); - - private ZeroDoubleColumnSelector() - { - // No instantiation. - } - - public static ZeroDoubleColumnSelector instance() - { - return INSTANCE; - } - - @Override - public double getDouble() - { - return 0.0d; - } + @Nullable + T getObject(); - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - // nothing to inspect - } + Class classOfObject(); } diff --git a/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java b/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java index 906e050ef533..3dce044b7da9 100644 --- a/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java +++ b/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java @@ -30,12 +30,7 @@ public interface ColumnSelectorFactory { DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec); - FloatColumnSelector makeFloatColumnSelector(String columnName); - LongColumnSelector makeLongColumnSelector(String columnName); - DoubleColumnSelector makeDoubleColumnSelector(String columnName); - - @Nullable - ObjectColumnSelector makeObjectColumnSelector(String columnName); + ColumnValueSelector makeColumnValueSelector(String columnName); /** * Returns capabilities of a particular column, if known. May be null if the column doesn't exist, or if diff --git a/processing/src/main/java/io/druid/segment/ColumnValueSelector.java b/processing/src/main/java/io/druid/segment/ColumnValueSelector.java index 142c72a21274..6d4a47069c94 100644 --- a/processing/src/main/java/io/druid/segment/ColumnValueSelector.java +++ b/processing/src/main/java/io/druid/segment/ColumnValueSelector.java @@ -19,8 +19,6 @@ package io.druid.segment; -import javax.annotation.Nullable; - /** * Base type for interfaces that manage column value selection, e.g. DimensionSelector, LongColumnSelector * @@ -28,16 +26,7 @@ * Druid: Sum, Min, Max, etc: {@link #getFloat()}, {@link #getDouble()} and {@link #getLong()} to support "polymorphic" * rollup aggregation during index merging. */ -public interface ColumnValueSelector +public interface ColumnValueSelector extends BaseLongColumnValueSelector, BaseDoubleColumnValueSelector, + BaseFloatColumnValueSelector, BaseObjectColumnValueSelector { - float getFloat(); - - double getDouble(); - - long getLong(); - - @Nullable - T getObject(); - - Class classOfObject(); } diff --git a/processing/src/main/java/io/druid/segment/ConstantDimensionSelector.java b/processing/src/main/java/io/druid/segment/ConstantDimensionSelector.java index f61e8b6e1ebf..316b8eebd969 100644 --- a/processing/src/main/java/io/druid/segment/ConstantDimensionSelector.java +++ b/processing/src/main/java/io/druid/segment/ConstantDimensionSelector.java @@ -113,6 +113,19 @@ public int lookupId(String name) return value.equals(name) ? 0 : -1; } + @Nullable + @Override + public Object getObject() + { + return value; + } + + @Override + public Class classOfObject() + { + return String.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { diff --git a/processing/src/main/java/io/druid/segment/DimensionHandlerUtils.java b/processing/src/main/java/io/druid/segment/DimensionHandlerUtils.java index 18604eadcf35..f8fade5d5663 100644 --- a/processing/src/main/java/io/druid/segment/DimensionHandlerUtils.java +++ b/processing/src/main/java/io/druid/segment/DimensionHandlerUtils.java @@ -184,11 +184,9 @@ public static ColumnValueSelector getColumnValueSelectorFromDimensionSpec( case STRING: return columnSelectorFactory.makeDimensionSelector(dimSpec); case LONG: - return columnSelectorFactory.makeLongColumnSelector(dimSpec.getDimension()); case FLOAT: - return columnSelectorFactory.makeFloatColumnSelector(dimSpec.getDimension()); case DOUBLE: - return columnSelectorFactory.makeDoubleColumnSelector(dimSpec.getDimension()); + return columnSelectorFactory.makeColumnValueSelector(dimSpec.getDimension()); default: return null; } diff --git a/processing/src/main/java/io/druid/segment/DimensionIndexer.java b/processing/src/main/java/io/druid/segment/DimensionIndexer.java index 2a21ece14807..d20f1579d64d 100644 --- a/processing/src/main/java/io/druid/segment/DimensionIndexer.java +++ b/processing/src/main/java/io/druid/segment/DimensionIndexer.java @@ -221,35 +221,14 @@ DimensionSelector makeDimensionSelector( IncrementalIndex.DimensionDesc desc ); - - /** - * Return an object used to read values from this indexer's column as Longs. - * - * @param currEntry Provides access to the current TimeAndDims object in the Cursor - * @param desc Descriptor object for this dimension within an IncrementalIndex - * @return A new object that reads rows from currEntry - */ - LongColumnSelector makeLongColumnSelector(TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc); - - - /** - * Return an object used to read values from this indexer's column as Floats. - * - * @param currEntry Provides access to the current TimeAndDims object in the Cursor - * @param desc Descriptor object for this dimension within an IncrementalIndex - * @return A new object that reads rows from currEntry - */ - FloatColumnSelector makeFloatColumnSelector(TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc); - - /** - * Return an object used to read values from this indexer's column as Doubles. + * Return an object used to read values from this indexer's column. * * @param currEntry Provides access to the current TimeAndDims object in the Cursor * @param desc Descriptor object for this dimension within an IncrementalIndex * @return A new object that reads rows from currEntry */ - DoubleColumnSelector makeDoubleColumnSelector(TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc); + ColumnValueSelector makeColumnValueSelector(TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc); /** * Compares the row values for this DimensionIndexer's dimension from a TimeAndDims key. diff --git a/processing/src/main/java/io/druid/segment/DimensionSelector.java b/processing/src/main/java/io/druid/segment/DimensionSelector.java index 6b6b8f3eec02..5ba5221afead 100644 --- a/processing/src/main/java/io/druid/segment/DimensionSelector.java +++ b/processing/src/main/java/io/druid/segment/DimensionSelector.java @@ -46,7 +46,7 @@ public interface DimensionSelector extends ColumnValueSelector, HotLoopCallee /** * @param value nullable dimension value */ - ValueMatcher makeValueMatcher(String value); + ValueMatcher makeValueMatcher(@Nullable String value); ValueMatcher makeValueMatcher(Predicate predicate); @@ -148,23 +148,20 @@ default long getLong() throw new UnsupportedOperationException("DimensionSelector cannot be operated as numeric ColumnValueSelector"); } - /** - * @deprecated always throws {@link UnsupportedOperationException} - */ - @Deprecated - @Override - default Object getObject() - { - throw new UnsupportedOperationException("DimensionSelector cannot be operated as object ColumnValueSelector"); - } - - /** - * @deprecated always throws {@link UnsupportedOperationException} - */ - @Deprecated - @Override - default Class classOfObject() + @Nullable + default Object defaultGetObject() { - throw new UnsupportedOperationException("DimensionSelector cannot be operated as object ColumnValueSelector"); + IndexedInts row = getRow(); + if (row.size() == 0) { + return null; + } + if (row.size() == 1) { + return lookupName(row.get(0)); + } + final String[] strings = new String[row.size()]; + for (int i = 0; i < row.size(); i++) { + strings[i] = lookupName(row.get(i)); + } + return strings; } } diff --git a/processing/src/main/java/io/druid/segment/DoubleColumnSelector.java b/processing/src/main/java/io/druid/segment/DoubleColumnSelector.java index fe595dab8298..b17ac07b2f96 100644 --- a/processing/src/main/java/io/druid/segment/DoubleColumnSelector.java +++ b/processing/src/main/java/io/druid/segment/DoubleColumnSelector.java @@ -19,13 +19,15 @@ package io.druid.segment; -import io.druid.query.monomorphicprocessing.CalledFromHotLoop; -import io.druid.query.monomorphicprocessing.HotLoopCallee; - - -public interface DoubleColumnSelector extends ColumnValueSelector, HotLoopCallee +/** + * This interface is convenient for implementation of "double-sourcing" {@link ColumnValueSelector}s, it provides + * default implementations for all {@link ColumnValueSelector}'s methods except {@link #getDouble()}. + * + * This interface should appear ONLY in "implements" clause or anonymous class creation, but NOT in "user" code, where + * {@link BaseDoubleColumnValueSelector} must be used instead. + */ +public interface DoubleColumnSelector extends ColumnValueSelector { - @CalledFromHotLoop @Override double getDouble(); @@ -35,7 +37,6 @@ public interface DoubleColumnSelector extends ColumnValueSelector, HotLo * objects. */ @Deprecated - @CalledFromHotLoop @Override default float getFloat() { @@ -48,7 +49,6 @@ default float getFloat() * objects. */ @Deprecated - @CalledFromHotLoop @Override default long getLong() { diff --git a/processing/src/main/java/io/druid/segment/DoubleDimensionIndexer.java b/processing/src/main/java/io/druid/segment/DoubleDimensionIndexer.java index b3b71e300056..61afffb8726a 100644 --- a/processing/src/main/java/io/druid/segment/DoubleDimensionIndexer.java +++ b/processing/src/main/java/io/druid/segment/DoubleDimensionIndexer.java @@ -91,80 +91,37 @@ public DimensionSelector makeDimensionSelector( IncrementalIndex.DimensionDesc desc ) { - return new DoubleWrappingDimensionSelector(makeDoubleColumnSelector(currEntry, desc), spec.getExtractionFn()); + return new DoubleWrappingDimensionSelector(makeColumnValueSelector(currEntry, desc), spec.getExtractionFn()); } @Override - public LongColumnSelector makeLongColumnSelector(TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc) - { - final int dimIndex = desc.getIndex(); - class IndexerLongColumnSelector implements LongColumnSelector - { - @Override - public long getLong() - { - final Object[] dims = currEntry.getKey().getDims(); - - if (dimIndex >= dims.length) { - return 0L; - } - - double doubleValue = (Double) dims[dimIndex]; - return (long) doubleValue; - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - // nothing to inspect - } - } - - return new IndexerLongColumnSelector(); - } - - @Override - public FloatColumnSelector makeFloatColumnSelector(TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc) + public ColumnValueSelector makeColumnValueSelector( + TimeAndDimsHolder currEntry, + IncrementalIndex.DimensionDesc desc + ) { final int dimIndex = desc.getIndex(); - class IndexerFloatColumnSelector implements FloatColumnSelector + class IndexerDoubleColumnSelector implements DoubleColumnSelector { @Override - public float getFloat() + public double getDouble() { final Object[] dims = currEntry.getKey().getDims(); if (dimIndex >= dims.length) { - return 0.0f; + return 0.0; } - - double doubleValue = (Double) dims[dimIndex]; - return (float) doubleValue; - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - // nothing to inspect + return (Double) dims[dimIndex]; } - } - - return new IndexerFloatColumnSelector(); - } - @Override - public DoubleColumnSelector makeDoubleColumnSelector(TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc) - { - final int dimIndex = desc.getIndex(); - class IndexerDoubleColumnSelector implements DoubleColumnSelector - { + @Nullable @Override - public double getDouble() + public Double getObject() { final Object[] dims = currEntry.getKey().getDims(); if (dimIndex >= dims.length) { - return 0.0; + return null; } return (Double) dims[dimIndex]; } diff --git a/processing/src/main/java/io/druid/segment/DoubleWrappingDimensionSelector.java b/processing/src/main/java/io/druid/segment/DoubleWrappingDimensionSelector.java index 03ba74886636..280a0d9d9135 100644 --- a/processing/src/main/java/io/druid/segment/DoubleWrappingDimensionSelector.java +++ b/processing/src/main/java/io/druid/segment/DoubleWrappingDimensionSelector.java @@ -27,9 +27,9 @@ public class DoubleWrappingDimensionSelector extends BaseSingleValueDimensionSel { private final ExtractionFn extractionFn; - private final DoubleColumnSelector selector; + private final BaseDoubleColumnValueSelector selector; - public DoubleWrappingDimensionSelector(DoubleColumnSelector doubleColumnSelector, ExtractionFn extractionFn) + public DoubleWrappingDimensionSelector(BaseDoubleColumnValueSelector doubleColumnSelector, ExtractionFn extractionFn) { this.extractionFn = extractionFn; selector = doubleColumnSelector; diff --git a/processing/src/main/java/io/druid/segment/FloatColumnSelector.java b/processing/src/main/java/io/druid/segment/FloatColumnSelector.java index eb75c6764ee7..92b4a4c31950 100644 --- a/processing/src/main/java/io/druid/segment/FloatColumnSelector.java +++ b/processing/src/main/java/io/druid/segment/FloatColumnSelector.java @@ -19,17 +19,15 @@ package io.druid.segment; -import io.druid.query.monomorphicprocessing.CalledFromHotLoop; -import io.druid.query.monomorphicprocessing.HotLoopCallee; - /** - * An object that gets a metric value. Metric values are always floats and there is an assumption that the - * FloatColumnSelector has a handle onto some other stateful object (e.g. an Offset) which is changing between calls - * to get() (though, that doesn't have to be the case if you always want the same value...). + * This interface is convenient for implementation of "float-sourcing" {@link ColumnValueSelector}s, it provides default + * implementations for all {@link ColumnValueSelector}'s methods except {@link #getFloat()}. + * + * This interface should appear ONLY in "implements" clause or anonymous class creation, but NOT in "user" code, where + * {@link BaseFloatColumnValueSelector} must be used instead. */ -public interface FloatColumnSelector extends ColumnValueSelector, HotLoopCallee +public interface FloatColumnSelector extends ColumnValueSelector { - @CalledFromHotLoop @Override float getFloat(); @@ -39,7 +37,6 @@ public interface FloatColumnSelector extends ColumnValueSelector, HotLoop * objects. */ @Deprecated - @CalledFromHotLoop @Override default double getDouble() { @@ -52,7 +49,6 @@ default double getDouble() * objects. */ @Deprecated - @CalledFromHotLoop @Override default long getLong() { diff --git a/processing/src/main/java/io/druid/segment/FloatDimensionIndexer.java b/processing/src/main/java/io/druid/segment/FloatDimensionIndexer.java index ce925e04ddfc..62da3ecc5d5f 100644 --- a/processing/src/main/java/io/druid/segment/FloatDimensionIndexer.java +++ b/processing/src/main/java/io/druid/segment/FloatDimensionIndexer.java @@ -87,51 +87,18 @@ public int getCardinality() @Override public DimensionSelector makeDimensionSelector( - DimensionSpec spec, TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc + DimensionSpec spec, + TimeAndDimsHolder currEntry, + IncrementalIndex.DimensionDesc desc ) { - return new FloatWrappingDimensionSelector( - makeFloatColumnSelector(currEntry, desc), - spec.getExtractionFn() - ); + return new FloatWrappingDimensionSelector(makeColumnValueSelector(currEntry, desc), spec.getExtractionFn()); } @Override - public LongColumnSelector makeLongColumnSelector( - final TimeAndDimsHolder currEntry, - final IncrementalIndex.DimensionDesc desc - ) - { - final int dimIndex = desc.getIndex(); - class IndexerLongColumnSelector implements LongColumnSelector - { - @Override - public long getLong() - { - final Object[] dims = currEntry.getKey().getDims(); - - if (dimIndex >= dims.length) { - return 0L; - } - - float floatVal = (Float) dims[dimIndex]; - return (long) floatVal; - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - // nothing to inspect - } - } - - return new IndexerLongColumnSelector(); - } - - @Override - public FloatColumnSelector makeFloatColumnSelector( - final TimeAndDimsHolder currEntry, - final IncrementalIndex.DimensionDesc desc + public ColumnValueSelector makeColumnValueSelector( + TimeAndDimsHolder currEntry, + IncrementalIndex.DimensionDesc desc ) { final int dimIndex = desc.getIndex(); @@ -149,35 +116,18 @@ public float getFloat() return (Float) dims[dimIndex]; } + @SuppressWarnings("deprecation") + @Nullable @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - // nothing to inspect - } - } - - return new IndexerFloatColumnSelector(); - } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector( - final TimeAndDimsHolder currEntry, - final IncrementalIndex.DimensionDesc desc - ) - { - final int dimIndex = desc.getIndex(); - class IndexerDoubleColumnSelector implements DoubleColumnSelector - { - @Override - public double getDouble() + public Float getObject() { final Object[] dims = currEntry.getKey().getDims(); if (dimIndex >= dims.length) { - return 0.0; + return null; } - float floatVal = (Float) dims[dimIndex]; - return (double) floatVal; + + return (Float) dims[dimIndex]; } @Override @@ -187,7 +137,7 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) } } - return new IndexerDoubleColumnSelector(); + return new IndexerFloatColumnSelector(); } @Override diff --git a/processing/src/main/java/io/druid/segment/FloatWrappingDimensionSelector.java b/processing/src/main/java/io/druid/segment/FloatWrappingDimensionSelector.java index 5c81220c2f16..d82838f2abf6 100644 --- a/processing/src/main/java/io/druid/segment/FloatWrappingDimensionSelector.java +++ b/processing/src/main/java/io/druid/segment/FloatWrappingDimensionSelector.java @@ -23,12 +23,14 @@ import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.virtual.BaseSingleValueDimensionSelector; +import javax.annotation.Nullable; + public class FloatWrappingDimensionSelector extends BaseSingleValueDimensionSelector { - private final FloatColumnSelector selector; + private final BaseFloatColumnValueSelector selector; private final ExtractionFn extractionFn; - public FloatWrappingDimensionSelector(FloatColumnSelector selector, ExtractionFn extractionFn) + public FloatWrappingDimensionSelector(BaseFloatColumnValueSelector selector, ExtractionFn extractionFn) { this.selector = selector; this.extractionFn = extractionFn; @@ -44,6 +46,19 @@ protected String getValue() } } + @Nullable + @Override + public Object getObject() + { + return getValue(); + } + + @Override + public Class classOfObject() + { + return String.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { diff --git a/processing/src/main/java/io/druid/segment/IdLookup.java b/processing/src/main/java/io/druid/segment/IdLookup.java index 52a5e16e73ab..aa2990ac39e8 100644 --- a/processing/src/main/java/io/druid/segment/IdLookup.java +++ b/processing/src/main/java/io/druid/segment/IdLookup.java @@ -19,6 +19,8 @@ package io.druid.segment; +import javax.annotation.Nullable; + /** * "Mixin" for {@link DimensionSelector}. */ @@ -27,5 +29,5 @@ public interface IdLookup /** * Inverse of {@link DimensionSelector#lookupName(int)}. */ - int lookupId(String name); + int lookupId(@Nullable String name); } diff --git a/processing/src/main/java/io/druid/segment/LongColumnSelector.java b/processing/src/main/java/io/druid/segment/LongColumnSelector.java index c62041a8937f..85ba51d87f65 100644 --- a/processing/src/main/java/io/druid/segment/LongColumnSelector.java +++ b/processing/src/main/java/io/druid/segment/LongColumnSelector.java @@ -19,14 +19,15 @@ package io.druid.segment; -import io.druid.query.monomorphicprocessing.CalledFromHotLoop; -import io.druid.query.monomorphicprocessing.HotLoopCallee; - /** + * This interface is convenient for implementation of "long-sourcing" {@link ColumnValueSelector}s, it provides default + * implementations for all {@link ColumnValueSelector}'s methods except {@link #getLong()}. + * + * This interface should appear ONLY in "implements" clause or anonymous class creation, but NOT in "user" code, where + * {@link BaseLongColumnValueSelector} must be used instead. */ -public interface LongColumnSelector extends ColumnValueSelector, HotLoopCallee +public interface LongColumnSelector extends ColumnValueSelector { - @CalledFromHotLoop @Override long getLong(); @@ -36,7 +37,6 @@ public interface LongColumnSelector extends ColumnValueSelector, HotLoopCa * objects. */ @Deprecated - @CalledFromHotLoop @Override default float getFloat() { @@ -49,7 +49,6 @@ default float getFloat() * objects. */ @Deprecated - @CalledFromHotLoop @Override default double getDouble() { diff --git a/processing/src/main/java/io/druid/segment/LongDimensionIndexer.java b/processing/src/main/java/io/druid/segment/LongDimensionIndexer.java index 0a189a50dfca..2d8eaea0802f 100644 --- a/processing/src/main/java/io/druid/segment/LongDimensionIndexer.java +++ b/processing/src/main/java/io/druid/segment/LongDimensionIndexer.java @@ -87,19 +87,18 @@ public int getCardinality() @Override public DimensionSelector makeDimensionSelector( - DimensionSpec spec, TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc + DimensionSpec spec, + TimeAndDimsHolder currEntry, + IncrementalIndex.DimensionDesc desc ) { - return new LongWrappingDimensionSelector( - makeLongColumnSelector(currEntry, desc), - spec.getExtractionFn() - ); + return new LongWrappingDimensionSelector(makeColumnValueSelector(currEntry, desc), spec.getExtractionFn()); } @Override - public LongColumnSelector makeLongColumnSelector( - final TimeAndDimsHolder currEntry, - final IncrementalIndex.DimensionDesc desc + public ColumnValueSelector makeColumnValueSelector( + TimeAndDimsHolder currEntry, + IncrementalIndex.DimensionDesc desc ) { final int dimIndex = desc.getIndex(); @@ -117,36 +116,18 @@ public long getLong() return (Long) dims[dimIndex]; } + @SuppressWarnings("deprecation") + @Nullable @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - // nothing to inspect - } - } - - return new IndexerLongColumnSelector(); - } - - @Override - public FloatColumnSelector makeFloatColumnSelector( - final TimeAndDimsHolder currEntry, - final IncrementalIndex.DimensionDesc desc - ) - { - final int dimIndex = desc.getIndex(); - class IndexerFloatColumnSelector implements FloatColumnSelector - { - @Override - public float getFloat() + public Long getObject() { final Object[] dims = currEntry.getKey().getDims(); if (dimIndex >= dims.length) { - return 0.0f; + return null; } - long longVal = (Long) dims[dimIndex]; - return (float) longVal; + return (Long) dims[dimIndex]; } @Override @@ -156,41 +137,9 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) } } - return new IndexerFloatColumnSelector(); - } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector( - final TimeAndDimsHolder currEntry, - final IncrementalIndex.DimensionDesc desc - ) - { - final int dimIndex = desc.getIndex(); - class IndexerDoubleColumnSelector implements DoubleColumnSelector - { - @Override - public double getDouble() - { - final Object[] dims = currEntry.getKey().getDims(); - - if (dimIndex >= dims.length) { - return 0.0; - } - - long longVal = (Long) dims[dimIndex]; - return (double) longVal; - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - // nothing to inspect - } - } - return new IndexerDoubleColumnSelector(); + return new IndexerLongColumnSelector(); } - @Override public int compareUnsortedEncodedKeyComponents(@Nullable Long lhs, @Nullable Long rhs) { diff --git a/processing/src/main/java/io/druid/segment/LongWrappingDimensionSelector.java b/processing/src/main/java/io/druid/segment/LongWrappingDimensionSelector.java index 082ef0c11474..b3d786a89f35 100644 --- a/processing/src/main/java/io/druid/segment/LongWrappingDimensionSelector.java +++ b/processing/src/main/java/io/druid/segment/LongWrappingDimensionSelector.java @@ -23,12 +23,14 @@ import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.virtual.BaseSingleValueDimensionSelector; +import javax.annotation.Nullable; + public class LongWrappingDimensionSelector extends BaseSingleValueDimensionSelector { - private final LongColumnSelector selector; + private final BaseLongColumnValueSelector selector; private final ExtractionFn extractionFn; - public LongWrappingDimensionSelector(LongColumnSelector selector, ExtractionFn extractionFn) + public LongWrappingDimensionSelector(BaseLongColumnValueSelector selector, ExtractionFn extractionFn) { this.selector = selector; this.extractionFn = extractionFn; @@ -44,6 +46,19 @@ protected String getValue() } } + @Nullable + @Override + public Object getObject() + { + return getValue(); + } + + @Override + public Class classOfObject() + { + return String.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { diff --git a/processing/src/main/java/io/druid/segment/ZeroFloatColumnSelector.java b/processing/src/main/java/io/druid/segment/NilColumnValueSelector.java similarity index 69% rename from processing/src/main/java/io/druid/segment/ZeroFloatColumnSelector.java rename to processing/src/main/java/io/druid/segment/NilColumnValueSelector.java index 85ce8c3c78a2..b66e27e922d1 100644 --- a/processing/src/main/java/io/druid/segment/ZeroFloatColumnSelector.java +++ b/processing/src/main/java/io/druid/segment/NilColumnValueSelector.java @@ -20,20 +20,24 @@ package io.druid.segment; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.historical.HistoricalColumnSelector; -public final class ZeroFloatColumnSelector implements FloatColumnSelector, HistoricalColumnSelector +import javax.annotation.Nullable; + +public final class NilColumnValueSelector implements ColumnValueSelector { - private static final ZeroFloatColumnSelector INSTANCE = new ZeroFloatColumnSelector(); + private static final NilColumnValueSelector INSTANCE = new NilColumnValueSelector(); - private ZeroFloatColumnSelector() + public static NilColumnValueSelector instance() { - // No instantiation. + return INSTANCE; } - public static ZeroFloatColumnSelector instance() + private NilColumnValueSelector() {} + + @Override + public double getDouble() { - return INSTANCE; + return 0.0; } @Override @@ -43,9 +47,22 @@ public float getFloat() } @Override - public double getDouble(int offset) + public long getLong() { - return 0.0; + return 0L; + } + + @Nullable + @Override + public Object getObject() + { + return null; + } + + @Override + public Class classOfObject() + { + return Object.class; } @Override diff --git a/processing/src/main/java/io/druid/segment/NullDimensionSelector.java b/processing/src/main/java/io/druid/segment/NullDimensionSelector.java index ef7fd5838ab2..c90a660cc5ac 100644 --- a/processing/src/main/java/io/druid/segment/NullDimensionSelector.java +++ b/processing/src/main/java/io/druid/segment/NullDimensionSelector.java @@ -112,6 +112,19 @@ public int lookupId(String name) return Strings.isNullOrEmpty(name) ? 0 : -1; } + @Nullable + @Override + public Object getObject() + { + return null; + } + + @Override + public Class classOfObject() + { + return Object.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { diff --git a/processing/src/main/java/io/druid/segment/ObjectColumnSelector.java b/processing/src/main/java/io/druid/segment/ObjectColumnSelector.java index 31aa1a959a45..2cf5a6c2173a 100644 --- a/processing/src/main/java/io/druid/segment/ObjectColumnSelector.java +++ b/processing/src/main/java/io/druid/segment/ObjectColumnSelector.java @@ -19,9 +19,16 @@ package io.druid.segment; +/** + * This interface is convenient for implementation of "object-sourcing" {@link ColumnValueSelector}s, it provides + * default implementations for all {@link ColumnValueSelector}'s methods except {@link #getObject()} and {@link + * #classOfObject()}. + * + * This interface should appear ONLY in "implements" clause or anonymous class creation, but NOT in "user" code, where + * {@link BaseObjectColumnValueSelector} must be used instead. + */ public interface ObjectColumnSelector extends ColumnValueSelector { - /** * @deprecated This method is marked as deprecated in ObjectColumnSelector to minimize the probability of accidential * calling. "Polymorphism" of ObjectColumnSelector should be used only when operating on {@link ColumnValueSelector} diff --git a/processing/src/main/java/io/druid/segment/QueryableIndexColumnSelectorFactory.java b/processing/src/main/java/io/druid/segment/QueryableIndexColumnSelectorFactory.java index 1db2cc295f3a..23a4094ca0a1 100644 --- a/processing/src/main/java/io/druid/segment/QueryableIndexColumnSelectorFactory.java +++ b/processing/src/main/java/io/druid/segment/QueryableIndexColumnSelectorFactory.java @@ -20,20 +20,18 @@ package io.druid.segment; import com.google.common.collect.Maps; +import io.druid.java.util.common.ISE; import io.druid.java.util.common.io.Closer; import io.druid.query.dimension.DimensionSpec; import io.druid.query.extraction.ExtractionFn; +import io.druid.segment.column.BaseColumn; import io.druid.segment.column.Column; import io.druid.segment.column.ColumnCapabilities; -import io.druid.segment.column.ComplexColumn; import io.druid.segment.column.DictionaryEncodedColumn; -import io.druid.segment.column.GenericColumn; import io.druid.segment.column.ValueType; -import io.druid.segment.data.IndexedInts; import io.druid.segment.data.ReadableOffset; import javax.annotation.Nullable; -import java.io.Closeable; import java.util.Map; /** @@ -48,9 +46,7 @@ class QueryableIndexColumnSelectorFactory implements ColumnSelectorFactory private final Closer closer; protected final ReadableOffset offset; - private final Map dictionaryColumnCache = Maps.newHashMap(); - private final Map genericColumnCache = Maps.newHashMap(); - private final Map objectColumnCache = Maps.newHashMap(); + private final Map columnCache = Maps.newHashMap(); QueryableIndexColumnSelectorFactory( QueryableIndex index, @@ -88,33 +84,18 @@ private DimensionSelector makeDimensionSelectorUndecorated(DimensionSpec dimensi } if (dimension.equals(Column.TIME_COLUMN_NAME)) { - return new SingleScanTimeDimSelector( - makeLongColumnSelector(dimension), - extractionFn, - descending - ); + return new SingleScanTimeDimSelector(makeColumnValueSelector(dimension), extractionFn, descending); } - if (columnDesc.getCapabilities().getType() == ValueType.LONG) { - return new LongWrappingDimensionSelector(makeLongColumnSelector(dimension), extractionFn); + ValueType type = columnDesc.getCapabilities().getType(); + if (type.isNumeric()) { + return type.makeNumericWrappingDimensionSelector(makeColumnValueSelector(dimension), extractionFn); } - if (columnDesc.getCapabilities().getType() == ValueType.FLOAT) { - return new FloatWrappingDimensionSelector(makeFloatColumnSelector(dimension), extractionFn); - } - - if (columnDesc.getCapabilities().getType() == ValueType.DOUBLE) { - return new DoubleWrappingDimensionSelector(makeDoubleColumnSelector(dimension), extractionFn); - } - - DictionaryEncodedColumn cachedColumn = dictionaryColumnCache.get(dimension); - if (cachedColumn == null) { - cachedColumn = columnDesc.getDictionaryEncoding(); - closer.register(cachedColumn); - dictionaryColumnCache.put(dimension, cachedColumn); - } + @SuppressWarnings("unchecked") + DictionaryEncodedColumn column = (DictionaryEncodedColumn) + columnCache.computeIfAbsent(dimension, d -> closer.register(columnDesc.getDictionaryEncoding())); - final DictionaryEncodedColumn column = cachedColumn; if (column == null) { return DimensionSelectorUtils.constantSelector(null, extractionFn); } else { @@ -123,253 +104,37 @@ private DimensionSelector makeDimensionSelectorUndecorated(DimensionSpec dimensi } @Override - public FloatColumnSelector makeFloatColumnSelector(String columnName) - { - if (virtualColumns.exists(columnName)) { - return virtualColumns.makeFloatColumnSelector(columnName, this); - } - - GenericColumn cachedMetricVals = genericColumnCache.get(columnName); - - if (cachedMetricVals == null) { - Column holder = index.getColumn(columnName); - if (holder != null && ValueType.isNumeric(holder.getCapabilities().getType())) { - cachedMetricVals = holder.getGenericColumn(); - closer.register(cachedMetricVals); - genericColumnCache.put(columnName, cachedMetricVals); - } - } - - if (cachedMetricVals == null) { - return ZeroFloatColumnSelector.instance(); - } - - return cachedMetricVals.makeFloatSingleValueRowSelector(offset); - } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName) - { - if (virtualColumns.exists(columnName)) { - return virtualColumns.makeDoubleColumnSelector(columnName, this); - } - - GenericColumn cachedMetricVals = genericColumnCache.get(columnName); - - if (cachedMetricVals == null) { - Column holder = index.getColumn(columnName); - if (holder != null && ValueType.isNumeric(holder.getCapabilities().getType())) { - cachedMetricVals = holder.getGenericColumn(); - closer.register(cachedMetricVals); - genericColumnCache.put(columnName, cachedMetricVals); - } - } - - if (cachedMetricVals == null) { - return ZeroDoubleColumnSelector.instance(); - } - - return cachedMetricVals.makeDoubleSingleValueRowSelector(offset); - } - - @Override - public LongColumnSelector makeLongColumnSelector(String columnName) + public ColumnValueSelector makeColumnValueSelector(String columnName) { if (virtualColumns.exists(columnName)) { - return virtualColumns.makeLongColumnSelector(columnName, this); + return virtualColumns.makeColumnValueSelector(columnName, this); } - GenericColumn cachedMetricVals = genericColumnCache.get(columnName); + BaseColumn column = columnCache.get(columnName); - if (cachedMetricVals == null) { + if (column == null) { Column holder = index.getColumn(columnName); - if (holder != null && ValueType.isNumeric(holder.getCapabilities().getType())) { - cachedMetricVals = holder.getGenericColumn(); - closer.register(cachedMetricVals); - genericColumnCache.put(columnName, cachedMetricVals); - } - } - - if (cachedMetricVals == null) { - return ZeroLongColumnSelector.instance(); - } - - return cachedMetricVals.makeLongSingleValueRowSelector(offset); - } - - @Nullable - @Override - public ObjectColumnSelector makeObjectColumnSelector(String column) - { - if (virtualColumns.exists(column)) { - return virtualColumns.makeObjectColumnSelector(column, this); - } - - Object cachedColumnVals = objectColumnCache.get(column); - - if (cachedColumnVals == null) { - Column holder = index.getColumn(column); if (holder != null) { final ColumnCapabilities capabilities = holder.getCapabilities(); if (capabilities.isDictionaryEncoded()) { - cachedColumnVals = holder.getDictionaryEncoding(); + column = holder.getDictionaryEncoding(); } else if (capabilities.getType() == ValueType.COMPLEX) { - cachedColumnVals = holder.getComplexColumn(); + column = holder.getComplexColumn(); + } else if (capabilities.getType().isNumeric()) { + column = holder.getGenericColumn(); } else { - cachedColumnVals = holder.getGenericColumn(); + throw new ISE("Unknown column type: %s", capabilities.getType()); } - } - - if (cachedColumnVals != null) { - closer.register((Closeable) cachedColumnVals); - objectColumnCache.put(column, cachedColumnVals); - } - } - - if (cachedColumnVals == null) { - return null; - } - - if (cachedColumnVals instanceof GenericColumn) { - final GenericColumn columnVals = (GenericColumn) cachedColumnVals; - final ValueType type = columnVals.getType(); - - if (columnVals.hasMultipleValues()) { - throw new UnsupportedOperationException( - "makeObjectColumnSelector does not support multi-value GenericColumns" - ); - } - - if (type == ValueType.FLOAT) { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Float.class; - } - - @Override - public Float getObject() - { - return columnVals.getFloatSingleValueRow(offset.getOffset()); - } - }; - } - if (type == ValueType.DOUBLE) { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Double.class; - } - - @Override - public Double getObject() - { - return columnVals.getDoubleSingleValueRow(offset.getOffset()); - } - }; - } - if (type == ValueType.LONG) { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Long.class; - } - - @Override - public Long getObject() - { - return columnVals.getLongSingleValueRow(offset.getOffset()); - } - }; - } - if (type == ValueType.STRING) { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return String.class; - } - - @Override - public String getObject() - { - return columnVals.getStringSingleValueRow(offset.getOffset()); - } - }; - } - } - - if (cachedColumnVals instanceof DictionaryEncodedColumn) { - final DictionaryEncodedColumn columnVals = (DictionaryEncodedColumn) cachedColumnVals; - if (columnVals.hasMultipleValues()) { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Object.class; - } - - @Override - @Nullable - public Object getObject() - { - final IndexedInts multiValueRow = columnVals.getMultiValueRow(offset.getOffset()); - if (multiValueRow.size() == 0) { - return null; - } else if (multiValueRow.size() == 1) { - return columnVals.lookupName(multiValueRow.get(0)); - } else { - final String[] strings = new String[multiValueRow.size()]; - for (int i = 0; i < multiValueRow.size(); i++) { - strings[i] = columnVals.lookupName(multiValueRow.get(i)); - } - return strings; - } - } - }; + closer.register(column); + columnCache.put(columnName, column); } else { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return String.class; - } - - @Override - public String getObject() - { - return columnVals.lookupName(columnVals.getSingleValueRow(offset.getOffset())); - } - }; + return NilColumnValueSelector.instance(); } } - final ComplexColumn columnVals = (ComplexColumn) cachedColumnVals; - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return columnVals.getClazz(); - } - - @Override - public Object getObject() - { - return columnVals.getRowValue(offset.getOffset()); - } - }; + return column.makeColumnValueSelector(offset); } @Override diff --git a/processing/src/main/java/io/druid/segment/SingleScanTimeDimSelector.java b/processing/src/main/java/io/druid/segment/SingleScanTimeDimSelector.java index b36cc6576f93..2baaf9820408 100644 --- a/processing/src/main/java/io/druid/segment/SingleScanTimeDimSelector.java +++ b/processing/src/main/java/io/druid/segment/SingleScanTimeDimSelector.java @@ -34,7 +34,7 @@ public class SingleScanTimeDimSelector implements SingleValueDimensionSelector { private final ExtractionFn extractionFn; - private final LongColumnSelector selector; + private final BaseLongColumnValueSelector selector; private final boolean descending; private final List timeValues = new ArrayList<>(); @@ -47,7 +47,7 @@ public class SingleScanTimeDimSelector implements SingleValueDimensionSelector // - it assumes time values are scanned once and values are grouped together // (i.e. we never revisit a timestamp we have seen before, unless it is the same as the last accessed one) // - it also applies and caches extraction function values at the DimSelector level to speed things up - public SingleScanTimeDimSelector(LongColumnSelector selector, ExtractionFn extractionFn, boolean descending) + public SingleScanTimeDimSelector(BaseLongColumnValueSelector selector, ExtractionFn extractionFn, boolean descending) { if (extractionFn == null) { throw new UnsupportedOperationException("time dimension must provide an extraction function"); @@ -176,6 +176,19 @@ public IdLookup idLookup() return null; } + @Nullable + @Override + public Object getObject() + { + return currentValue; + } + + @Override + public Class classOfObject() + { + return String.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { diff --git a/processing/src/main/java/io/druid/segment/StringDimensionIndexer.java b/processing/src/main/java/io/druid/segment/StringDimensionIndexer.java index 7408c58f5063..571dcdcdd4a8 100644 --- a/processing/src/main/java/io/druid/segment/StringDimensionIndexer.java +++ b/processing/src/main/java/io/druid/segment/StringDimensionIndexer.java @@ -29,6 +29,7 @@ import io.druid.data.input.impl.DimensionSchema.MultiValueHandling; import io.druid.java.util.common.ISE; import io.druid.java.util.common.guava.Comparators; +import io.druid.query.dimension.DefaultDimensionSpec; import io.druid.query.dimension.DimensionSpec; import io.druid.query.extraction.ExtractionFn; import io.druid.query.filter.ValueMatcher; @@ -543,31 +544,50 @@ public int lookupId(String name) return getEncodedValue(name, false); } + @SuppressWarnings("deprecation") + @Nullable + @Override + public Object getObject() + { + IncrementalIndex.TimeAndDims key = currEntry.getKey(); + if (key == null) { + return null; + } + + Object[] dims = key.getDims(); + if (dimIndex >= dims.length) { + return null; + } + + return convertUnsortedEncodedKeyComponentToActualArrayOrList( + (int[]) dims[dimIndex], + DimensionIndexer.ARRAY + ); + } + + @SuppressWarnings("deprecation") + @Override + public Class classOfObject() + { + return Object.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { - inspector.visit("currEntry", currEntry); + // nothing to inspect } } return new IndexerDimensionSelector(); } @Override - public LongColumnSelector makeLongColumnSelector(TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc) - { - return ZeroLongColumnSelector.instance(); - } - - @Override - public FloatColumnSelector makeFloatColumnSelector(TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc) - { - return ZeroFloatColumnSelector.instance(); - } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector(TimeAndDimsHolder currEntry, IncrementalIndex.DimensionDesc desc) + public ColumnValueSelector makeColumnValueSelector( + TimeAndDimsHolder currEntry, + IncrementalIndex.DimensionDesc desc + ) { - return ZeroDoubleColumnSelector.instance(); + return makeDimensionSelector(DefaultDimensionSpec.of(desc.getName()), currEntry, desc); } @Override diff --git a/processing/src/main/java/io/druid/segment/VirtualColumn.java b/processing/src/main/java/io/druid/segment/VirtualColumn.java index cbdc7c3fde5a..752834a99d1c 100644 --- a/processing/src/main/java/io/druid/segment/VirtualColumn.java +++ b/processing/src/main/java/io/druid/segment/VirtualColumn.java @@ -48,17 +48,6 @@ public interface VirtualColumn extends Cacheable */ String getOutputName(); - /** - * Build a selector corresponding to this virtual column. Also provides the name that the - * virtual column was referenced with, which is useful if this column uses dot notation. - * - * @param columnName the name this virtual column was referenced with - * @param factory column selector factory - * - * @return the selector, must not be null - */ - ObjectColumnSelector makeObjectColumnSelector(String columnName, ColumnSelectorFactory factory); - /** * Build a selector corresponding to this virtual column. Also provides the name that the * virtual column was referenced with (through {@link DimensionSpec#getDimension()}, which @@ -81,34 +70,14 @@ public interface VirtualColumn extends Cacheable * * @return the selector, must not be null */ - FloatColumnSelector makeFloatColumnSelector(String columnName, ColumnSelectorFactory factory); + ColumnValueSelector makeColumnValueSelector(String columnName, ColumnSelectorFactory factory); - /** - * Build a selector corresponding to this virtual column. Also provides the name that the - * virtual column was referenced with, which is useful if this column uses dot notation. - * - * @param columnName the name this virtual column was referenced with - * @param factory column selector factory - * - * @return the selector, must not be null - */ - LongColumnSelector makeLongColumnSelector(String columnName, ColumnSelectorFactory factory); - - /** - * Build a selector corresponding to this virtual column. Also provides the name that the - * virtual column was referenced with, which is useful if this column uses dot notation. - * - * @param columnName the name this virtual column was referenced with - * @param factory column selector factory - * - * @return the selector, must not be null - */ - DoubleColumnSelector makeDoubleColumnSelector(String columnName, ColumnSelectorFactory factory); /** - * Returns the capabilities of this virtual column, which includes a type that should match - * the type returned by "makeObjectColumnSelector" and should correspond to the best - * performing selector. May vary based on columnName if this column uses dot notation. + * Returns the capabilities of this virtual column, which includes a type that corresponds to the best + * performing base selector supertype (e. g. {@link BaseLongColumnValueSelector}) of the object, returned from + * {@link #makeColumnValueSelector(String, ColumnSelectorFactory)}. May vary based on columnName if this column uses + * dot notation. * * @param columnName the name this virtual column was referenced with * diff --git a/processing/src/main/java/io/druid/segment/VirtualColumns.java b/processing/src/main/java/io/druid/segment/VirtualColumns.java index ef7003455a7e..b1bd001439ec 100644 --- a/processing/src/main/java/io/druid/segment/VirtualColumns.java +++ b/processing/src/main/java/io/druid/segment/VirtualColumns.java @@ -149,31 +149,6 @@ public VirtualColumn getVirtualColumn(String columnName) return withDotSupport.get(baseColumnName); } - /** - * Create an object selector. - * - * @param columnName column mame - * @param factory base column selector factory - * - * @return selector - * - * @throws IllegalArgumentException if the virtual column does not exist (see {@link #exists(String)} - */ - public ObjectColumnSelector makeObjectColumnSelector(String columnName, ColumnSelectorFactory factory) - { - final VirtualColumn virtualColumn = getVirtualColumn(columnName); - if (virtualColumn == null) { - throw new IAE("No such virtual column[%s]", columnName); - } else { - return Preconditions.checkNotNull( - virtualColumn.makeObjectColumnSelector(columnName, factory), - "VirtualColumn[%s] returned a null ObjectColumnSelector for columnName[%s]", - virtualColumn.getOutputName(), - columnName - ); - } - } - /** * Create a dimension (string) selector. * @@ -197,7 +172,7 @@ public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec, Colu } /** - * Create a float selector. + * Create a column value selector. * * @param columnName column mame * @param factory base column selector factory @@ -206,60 +181,13 @@ public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec, Colu * * @throws IllegalArgumentException if the virtual column does not exist (see {@link #exists(String)} */ - public FloatColumnSelector makeFloatColumnSelector(String columnName, ColumnSelectorFactory factory) - { - final VirtualColumn virtualColumn = getVirtualColumn(columnName); - if (virtualColumn == null) { - throw new IAE("No such virtual column[%s]", columnName); - } else { - final FloatColumnSelector selector = virtualColumn.makeFloatColumnSelector(columnName, factory); - Preconditions.checkNotNull(selector, "selector"); - return selector; - } - } - - /** - * Create a long selector. - * - * @param columnName column mame - * @param factory base column selector factory - * - * @return selector - * - * @throws IllegalArgumentException if the virtual column does not exist (see {@link #exists(String)} - */ - public LongColumnSelector makeLongColumnSelector(String columnName, ColumnSelectorFactory factory) - { - final VirtualColumn virtualColumn = getVirtualColumn(columnName); - if (virtualColumn == null) { - throw new IAE("No such virtual column[%s]", columnName); - } else { - final LongColumnSelector selector = virtualColumn.makeLongColumnSelector(columnName, factory); - Preconditions.checkNotNull(selector, "selector"); - return selector; - } - } - - /** - * Create a double selector. - * - * @param columnName column mame - * @param factory base column selector factory - * - * @return selector - * - * @throws IllegalArgumentException if the virtual column does not exist (see {@link #exists(String)} - */ - public DoubleColumnSelector makeDoubleColumnSelector( - String columnName, - ColumnSelectorFactory factory - ) + public ColumnValueSelector makeColumnValueSelector(String columnName, ColumnSelectorFactory factory) { final VirtualColumn virtualColumn = getVirtualColumn(columnName); if (virtualColumn == null) { throw new IAE("No such virtual column[%s]", columnName); } else { - final DoubleColumnSelector selector = virtualColumn.makeDoubleColumnSelector(columnName, factory); + final ColumnValueSelector selector = virtualColumn.makeColumnValueSelector(columnName, factory); Preconditions.checkNotNull(selector, "selector"); return selector; } diff --git a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/EmptySketchAggregator.java b/processing/src/main/java/io/druid/segment/column/BaseColumn.java similarity index 52% rename from extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/EmptySketchAggregator.java rename to processing/src/main/java/io/druid/segment/column/BaseColumn.java index 35d84d5918ca..7b874357af35 100644 --- a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/EmptySketchAggregator.java +++ b/processing/src/main/java/io/druid/segment/column/BaseColumn.java @@ -17,52 +17,14 @@ * under the License. */ -package io.druid.query.aggregation.datasketches.theta; +package io.druid.segment.column; -import io.druid.query.aggregation.Aggregator; +import io.druid.segment.ColumnValueSelector; +import io.druid.segment.data.ReadableOffset; -public class EmptySketchAggregator implements Aggregator -{ - public EmptySketchAggregator() - { - } - - @Override - public void aggregate() - { - } - - @Override - public void reset() - { - } - - @Override - public Object get() - { - return SketchHolder.EMPTY; - } +import java.io.Closeable; - @Override - public float getFloat() - { - throw new UnsupportedOperationException("Not implemented"); - } - - @Override - public long getLong() - { - throw new UnsupportedOperationException("Not implemented"); - } - - @Override - public double getDouble() - { - throw new UnsupportedOperationException("Not implemented"); - } - - @Override - public void close() - { - } +public interface BaseColumn extends Closeable +{ + ColumnValueSelector makeColumnValueSelector(ReadableOffset offset); } diff --git a/processing/src/main/java/io/druid/segment/column/ComplexColumn.java b/processing/src/main/java/io/druid/segment/column/ComplexColumn.java index b52c18d9f4fd..0594bcdfb2c3 100644 --- a/processing/src/main/java/io/druid/segment/column/ComplexColumn.java +++ b/processing/src/main/java/io/druid/segment/column/ComplexColumn.java @@ -19,11 +19,16 @@ package io.druid.segment.column; -import java.io.Closeable; +import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.ColumnValueSelector; +import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.data.ReadableOffset; + +import javax.annotation.Nullable; /** */ -public interface ComplexColumn extends Closeable +public interface ComplexColumn extends BaseColumn { public Class getClazz(); public String getTypeName(); @@ -31,4 +36,30 @@ public interface ComplexColumn extends Closeable @Override void close(); + + @Override + default ColumnValueSelector makeColumnValueSelector(ReadableOffset offset) + { + return new ObjectColumnSelector() + { + @Nullable + @Override + public Object getObject() + { + return getRowValue(offset.getOffset()); + } + + @Override + public Class classOfObject() + { + return getClazz(); + } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("column", ComplexColumn.this); + } + }; + } } diff --git a/processing/src/main/java/io/druid/segment/column/DictionaryEncodedColumn.java b/processing/src/main/java/io/druid/segment/column/DictionaryEncodedColumn.java index 6fed80fea70c..bc39773bbf0e 100644 --- a/processing/src/main/java/io/druid/segment/column/DictionaryEncodedColumn.java +++ b/processing/src/main/java/io/druid/segment/column/DictionaryEncodedColumn.java @@ -20,15 +20,16 @@ package io.druid.segment.column; import io.druid.query.extraction.ExtractionFn; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; import io.druid.segment.data.IndexedInts; import io.druid.segment.data.ReadableOffset; -import java.io.Closeable; +import javax.annotation.Nullable; /** */ -public interface DictionaryEncodedColumn extends Closeable +public interface DictionaryEncodedColumn extends BaseColumn { public int length(); public boolean hasMultipleValues(); @@ -38,5 +39,11 @@ public interface DictionaryEncodedColumn extends public int lookupId(ActualType name); public int getCardinality(); - DimensionSelector makeDimensionSelector(ReadableOffset offset, ExtractionFn extractionFn); + DimensionSelector makeDimensionSelector(ReadableOffset offset, @Nullable ExtractionFn extractionFn); + + @Override + default ColumnValueSelector makeColumnValueSelector(ReadableOffset offset) + { + return makeDimensionSelector(offset, null); + } } diff --git a/processing/src/main/java/io/druid/segment/column/GenericColumn.java b/processing/src/main/java/io/druid/segment/column/GenericColumn.java index 69b6d431f44e..c82b4a8e90e5 100644 --- a/processing/src/main/java/io/druid/segment/column/GenericColumn.java +++ b/processing/src/main/java/io/druid/segment/column/GenericColumn.java @@ -21,35 +21,25 @@ import io.druid.query.monomorphicprocessing.CalledFromHotLoop; import io.druid.query.monomorphicprocessing.HotLoopCallee; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.data.ReadableOffset; - -import java.io.Closeable; /** */ -public interface GenericColumn extends HotLoopCallee, Closeable +public interface GenericColumn extends BaseColumn, HotLoopCallee { public int length(); public ValueType getType(); - public boolean hasMultipleValues(); @CalledFromHotLoop public String getStringSingleValueRow(int rowNum); @CalledFromHotLoop float getFloatSingleValueRow(int rowNum); - FloatColumnSelector makeFloatSingleValueRowSelector(ReadableOffset offset); @CalledFromHotLoop long getLongSingleValueRow(int rowNum); - LongColumnSelector makeLongSingleValueRowSelector(ReadableOffset offset); @CalledFromHotLoop double getDoubleSingleValueRow(int rowNum); - DoubleColumnSelector makeDoubleSingleValueRowSelector(ReadableOffset offset); @Override void close(); diff --git a/processing/src/main/java/io/druid/segment/column/IndexedDoublesGenericColumn.java b/processing/src/main/java/io/druid/segment/column/IndexedDoublesGenericColumn.java index 47fd8f50c4ae..1058bda30d95 100644 --- a/processing/src/main/java/io/druid/segment/column/IndexedDoublesGenericColumn.java +++ b/processing/src/main/java/io/druid/segment/column/IndexedDoublesGenericColumn.java @@ -20,9 +20,7 @@ package io.druid.segment.column; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.data.IndexedDoubles; import io.druid.segment.data.ReadableOffset; @@ -48,12 +46,6 @@ public ValueType getType() return ValueType.DOUBLE; } - @Override - public boolean hasMultipleValues() - { - return false; - } - @Override public String getStringSingleValueRow(int rowNum) { @@ -61,15 +53,15 @@ public String getStringSingleValueRow(int rowNum) } @Override - public float getFloatSingleValueRow(int rowNum) + public ColumnValueSelector makeColumnValueSelector(ReadableOffset offset) { - return (float) column.get(rowNum); + return column.makeColumnValueSelector(offset); } @Override - public FloatColumnSelector makeFloatSingleValueRowSelector(ReadableOffset offset) + public float getFloatSingleValueRow(int rowNum) { - return column.makeFloatColumnSelector(offset); + return (float) column.get(rowNum); } @Override @@ -78,24 +70,12 @@ public long getLongSingleValueRow(int rowNum) return (long) column.get(rowNum); } - @Override - public LongColumnSelector makeLongSingleValueRowSelector(ReadableOffset offset) - { - return column.makeLongColumnSelector(offset); - } - @Override public double getDoubleSingleValueRow(int rowNum) { return column.get(rowNum); } - @Override - public DoubleColumnSelector makeDoubleSingleValueRowSelector(ReadableOffset offset) - { - return column.makeDoubleColumnSelector(offset); - } - @Override public void close() { diff --git a/processing/src/main/java/io/druid/segment/column/IndexedFloatsGenericColumn.java b/processing/src/main/java/io/druid/segment/column/IndexedFloatsGenericColumn.java index 1841fbf2c13d..de264038d732 100644 --- a/processing/src/main/java/io/druid/segment/column/IndexedFloatsGenericColumn.java +++ b/processing/src/main/java/io/druid/segment/column/IndexedFloatsGenericColumn.java @@ -20,9 +20,7 @@ package io.druid.segment.column; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.data.IndexedFloats; import io.druid.segment.data.ReadableOffset; @@ -49,12 +47,6 @@ public ValueType getType() return ValueType.FLOAT; } - @Override - public boolean hasMultipleValues() - { - return false; - } - @Override public String getStringSingleValueRow(int rowNum) { @@ -62,15 +54,15 @@ public String getStringSingleValueRow(int rowNum) } @Override - public float getFloatSingleValueRow(int rowNum) + public ColumnValueSelector makeColumnValueSelector(ReadableOffset offset) { - return column.get(rowNum); + return column.makeColumnValueSelector(offset); } @Override - public FloatColumnSelector makeFloatSingleValueRowSelector(ReadableOffset offset) + public float getFloatSingleValueRow(int rowNum) { - return column.makeFloatColumnSelector(offset); + return column.get(rowNum); } @Override @@ -79,24 +71,12 @@ public long getLongSingleValueRow(int rowNum) return (long) column.get(rowNum); } - @Override - public LongColumnSelector makeLongSingleValueRowSelector(ReadableOffset offset) - { - return column.makeLongColumnSelector(offset); - } - @Override public double getDoubleSingleValueRow(int rowNum) { return (double) column.get(rowNum); } - @Override - public DoubleColumnSelector makeDoubleSingleValueRowSelector(ReadableOffset offset) - { - return column.makeDoubleColumnSelector(offset); - } - @Override public void close() { diff --git a/processing/src/main/java/io/druid/segment/column/IndexedLongsGenericColumn.java b/processing/src/main/java/io/druid/segment/column/IndexedLongsGenericColumn.java index bb1a035affa7..b7ec8b34fab6 100644 --- a/processing/src/main/java/io/druid/segment/column/IndexedLongsGenericColumn.java +++ b/processing/src/main/java/io/druid/segment/column/IndexedLongsGenericColumn.java @@ -20,9 +20,7 @@ package io.druid.segment.column; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.data.IndexedLongs; import io.druid.segment.data.ReadableOffset; @@ -49,12 +47,6 @@ public ValueType getType() return ValueType.LONG; } - @Override - public boolean hasMultipleValues() - { - return false; - } - @Override public String getStringSingleValueRow(int rowNum) { @@ -62,15 +54,15 @@ public String getStringSingleValueRow(int rowNum) } @Override - public float getFloatSingleValueRow(int rowNum) + public ColumnValueSelector makeColumnValueSelector(ReadableOffset offset) { - return (float) column.get(rowNum); + return column.makeColumnValueSelector(offset); } @Override - public FloatColumnSelector makeFloatSingleValueRowSelector(ReadableOffset offset) + public float getFloatSingleValueRow(int rowNum) { - return column.makeFloatColumnSelector(offset); + return (float) column.get(rowNum); } @Override @@ -79,24 +71,12 @@ public long getLongSingleValueRow(int rowNum) return column.get(rowNum); } - @Override - public LongColumnSelector makeLongSingleValueRowSelector(ReadableOffset offset) - { - return column.makeLongColumnSelector(offset); - } - @Override public double getDoubleSingleValueRow(int rowNum) { return (double) column.get(rowNum); } - @Override - public DoubleColumnSelector makeDoubleSingleValueRowSelector(ReadableOffset offset) - { - return column.makeDoubleColumnSelector(offset); - } - @Override public void close() { diff --git a/processing/src/main/java/io/druid/segment/column/SimpleDictionaryEncodedColumn.java b/processing/src/main/java/io/druid/segment/column/SimpleDictionaryEncodedColumn.java index fb39014125a2..6a6eb0c29554 100644 --- a/processing/src/main/java/io/druid/segment/column/SimpleDictionaryEncodedColumn.java +++ b/processing/src/main/java/io/druid/segment/column/SimpleDictionaryEncodedColumn.java @@ -43,8 +43,7 @@ /** */ -public class SimpleDictionaryEncodedColumn - implements DictionaryEncodedColumn +public class SimpleDictionaryEncodedColumn implements DictionaryEncodedColumn { private final IndexedInts column; private final IndexedMultivalue multiValueColumn; @@ -105,7 +104,10 @@ public int getCardinality() } @Override - public HistoricalDimensionSelector makeDimensionSelector(final ReadableOffset offset, final ExtractionFn extractionFn) + public HistoricalDimensionSelector makeDimensionSelector( + final ReadableOffset offset, + @Nullable final ExtractionFn extractionFn + ) { abstract class QueryableDimensionSelector implements HistoricalDimensionSelector, IdLookup { @@ -141,9 +143,7 @@ public IdLookup idLookup() public int lookupId(String name) { if (extractionFn != null) { - throw new UnsupportedOperationException( - "cannot perform lookup when applying an extraction function" - ); + throw new UnsupportedOperationException("cannot perform lookup when applying an extraction function"); } return SimpleDictionaryEncodedColumn.this.lookupId(name); } @@ -176,6 +176,19 @@ public ValueMatcher makeValueMatcher(Predicate predicate) return DimensionSelectorUtils.makeValueMatcherGeneric(this, predicate); } + @Nullable + @Override + public Object getObject() + { + return defaultGetObject(); + } + + @Override + public Class classOfObject() + { + return Object.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { @@ -265,6 +278,18 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) }; } + @Override + public Object getObject() + { + return lookupName(getRowValue()); + } + + @Override + public Class classOfObject() + { + return String.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { diff --git a/processing/src/main/java/io/druid/segment/column/ValueType.java b/processing/src/main/java/io/druid/segment/column/ValueType.java index a7f1262262c5..26fd90dc08f0 100644 --- a/processing/src/main/java/io/druid/segment/column/ValueType.java +++ b/processing/src/main/java/io/druid/segment/column/ValueType.java @@ -21,17 +21,63 @@ import com.fasterxml.jackson.annotation.JsonCreator; import io.druid.java.util.common.StringUtils; +import io.druid.query.extraction.ExtractionFn; +import io.druid.segment.ColumnValueSelector; +import io.druid.segment.DimensionSelector; +import io.druid.segment.DoubleWrappingDimensionSelector; +import io.druid.segment.FloatWrappingDimensionSelector; +import io.druid.segment.LongWrappingDimensionSelector; /** */ public enum ValueType { - FLOAT, - DOUBLE, - LONG, + FLOAT { + @Override + public DimensionSelector makeNumericWrappingDimensionSelector( + ColumnValueSelector numericColumnValueSelector, + ExtractionFn extractionFn + ) + { + return new FloatWrappingDimensionSelector(numericColumnValueSelector, extractionFn); + } + }, + DOUBLE { + @Override + public DimensionSelector makeNumericWrappingDimensionSelector( + ColumnValueSelector numericColumnValueSelector, + ExtractionFn extractionFn + ) + { + return new DoubleWrappingDimensionSelector(numericColumnValueSelector, extractionFn); + } + }, + LONG { + @Override + public DimensionSelector makeNumericWrappingDimensionSelector( + ColumnValueSelector numericColumnValueSelector, + ExtractionFn extractionFn + ) + { + return new LongWrappingDimensionSelector(numericColumnValueSelector, extractionFn); + } + }, STRING, COMPLEX; + public DimensionSelector makeNumericWrappingDimensionSelector( + ColumnValueSelector numericColumnValueSelector, + ExtractionFn extractionFn + ) + { + throw new UnsupportedOperationException("Not a numeric value type: " + name()); + } + + public boolean isNumeric() + { + return isNumeric(this); + } + @JsonCreator public static ValueType fromString(String name) { diff --git a/processing/src/main/java/io/druid/segment/data/IndexedDoubles.java b/processing/src/main/java/io/druid/segment/data/IndexedDoubles.java index 3de423b3e2aa..d8710b104f28 100644 --- a/processing/src/main/java/io/druid/segment/data/IndexedDoubles.java +++ b/processing/src/main/java/io/druid/segment/data/IndexedDoubles.java @@ -20,9 +20,8 @@ package io.druid.segment.data; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; import io.druid.segment.historical.HistoricalColumnSelector; import java.io.Closeable; @@ -36,7 +35,7 @@ public interface IndexedDoubles extends Closeable @Override void close(); - default DoubleColumnSelector makeDoubleColumnSelector(ReadableOffset offset) + default ColumnValueSelector makeColumnValueSelector(ReadableOffset offset) { class HistoricalDoubleColumnSelector implements DoubleColumnSelector, HistoricalColumnSelector { @@ -61,57 +60,5 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) } return new HistoricalDoubleColumnSelector(); } - - default FloatColumnSelector makeFloatColumnSelector(ReadableOffset offset) - { - class HistoricalFloatColumnSelector implements FloatColumnSelector, HistoricalColumnSelector - { - @Override - public float getFloat() - { - return (float) IndexedDoubles.this.get(offset.getOffset()); - } - - @Override - public double getDouble(int offset) - { - return IndexedDoubles.this.get(offset); - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("indexed", IndexedDoubles.this); - inspector.visit("offset", offset); - } - } - return new HistoricalFloatColumnSelector(); - } - - default LongColumnSelector makeLongColumnSelector(ReadableOffset offset) - { - class HistoricalLongColumnSelector implements LongColumnSelector, HistoricalColumnSelector - { - @Override - public long getLong() - { - return (long) IndexedDoubles.this.get(offset.getOffset()); - } - - @Override - public double getDouble(int offset) - { - return IndexedDoubles.this.get(offset); - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("indexed", IndexedDoubles.this); - inspector.visit("offset", offset); - } - } - return new HistoricalLongColumnSelector(); - } } diff --git a/processing/src/main/java/io/druid/segment/data/IndexedFloats.java b/processing/src/main/java/io/druid/segment/data/IndexedFloats.java index 909b897f6d67..6f7580ea57ab 100644 --- a/processing/src/main/java/io/druid/segment/data/IndexedFloats.java +++ b/processing/src/main/java/io/druid/segment/data/IndexedFloats.java @@ -20,9 +20,8 @@ package io.druid.segment.data; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.DoubleColumnSelector; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; import io.druid.segment.historical.HistoricalColumnSelector; import java.io.Closeable; @@ -39,7 +38,7 @@ public interface IndexedFloats extends Closeable @Override void close(); - default FloatColumnSelector makeFloatColumnSelector(ReadableOffset offset) + default ColumnValueSelector makeColumnValueSelector(ReadableOffset offset) { class HistoricalFloatColumnSelector implements FloatColumnSelector, HistoricalColumnSelector { @@ -64,56 +63,4 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) } return new HistoricalFloatColumnSelector(); } - - default DoubleColumnSelector makeDoubleColumnSelector(ReadableOffset offset) - { - class HistoricalDoubleColumnSelector implements DoubleColumnSelector, HistoricalColumnSelector - { - @Override - public double getDouble() - { - return IndexedFloats.this.get(offset.getOffset()); - } - - @Override - public double getDouble(int offset) - { - return IndexedFloats.this.get(offset); - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("indexed", IndexedFloats.this); - inspector.visit("offset", offset); - } - } - return new HistoricalDoubleColumnSelector(); - } - - default LongColumnSelector makeLongColumnSelector(ReadableOffset offset) - { - class HistoricalLongColumnSelector implements LongColumnSelector, HistoricalColumnSelector - { - @Override - public long getLong() - { - return (long) IndexedFloats.this.get(offset.getOffset()); - } - - @Override - public double getDouble(int offset) - { - return IndexedFloats.this.get(offset); - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("indexed", IndexedFloats.this); - inspector.visit("offset", offset); - } - } - return new HistoricalLongColumnSelector(); - } } diff --git a/processing/src/main/java/io/druid/segment/data/IndexedLongs.java b/processing/src/main/java/io/druid/segment/data/IndexedLongs.java index 5e248ac9d272..ce18f2f222e6 100644 --- a/processing/src/main/java/io/druid/segment/data/IndexedLongs.java +++ b/processing/src/main/java/io/druid/segment/data/IndexedLongs.java @@ -20,8 +20,7 @@ package io.druid.segment.data; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.LongColumnSelector; import io.druid.segment.historical.HistoricalColumnSelector; @@ -39,7 +38,7 @@ public interface IndexedLongs extends Closeable @Override void close(); - default LongColumnSelector makeLongColumnSelector(ReadableOffset offset) + default ColumnValueSelector makeColumnValueSelector(ReadableOffset offset) { class HistoricalLongColumnSelector implements LongColumnSelector, HistoricalColumnSelector { @@ -64,56 +63,4 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) } return new HistoricalLongColumnSelector(); } - - default FloatColumnSelector makeFloatColumnSelector(ReadableOffset offset) - { - class HistoricalFloatColumnSelector implements FloatColumnSelector, HistoricalColumnSelector - { - @Override - public float getFloat() - { - return (float) IndexedLongs.this.get(offset.getOffset()); - } - - @Override - public double getDouble(int offset) - { - return IndexedLongs.this.get(offset); - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("indexed", IndexedLongs.this); - inspector.visit("offset", offset); - } - } - return new HistoricalFloatColumnSelector(); - } - - default DoubleColumnSelector makeDoubleColumnSelector(ReadableOffset offset) - { - class HistoricalDoubleColumnSelector implements DoubleColumnSelector, HistoricalColumnSelector - { - @Override - public double getDouble() - { - return (double) IndexedLongs.this.get(offset.getOffset()); - } - - @Override - public double getDouble(int offset) - { - return IndexedLongs.this.get(offset); - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("indexed", IndexedLongs.this); - inspector.visit("offset", offset); - } - } - return new HistoricalDoubleColumnSelector(); - } } diff --git a/processing/src/main/java/io/druid/segment/filter/ExpressionFilter.java b/processing/src/main/java/io/druid/segment/filter/ExpressionFilter.java index e63f718dfcfe..1645d748f061 100644 --- a/processing/src/main/java/io/druid/segment/filter/ExpressionFilter.java +++ b/processing/src/main/java/io/druid/segment/filter/ExpressionFilter.java @@ -32,7 +32,7 @@ import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.ColumnSelector; import io.druid.segment.ColumnSelectorFactory; -import io.druid.segment.LongColumnSelector; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.virtual.ExpressionSelectors; import java.util.Set; @@ -51,7 +51,7 @@ public ExpressionFilter(final Expr expr) @Override public ValueMatcher makeMatcher(final ColumnSelectorFactory factory) { - final LongColumnSelector selector = ExpressionSelectors.makeLongColumnSelector(factory, expr, 0L); + final ColumnValueSelector selector = ExpressionSelectors.makeColumnValueSelector(factory, expr); return new ValueMatcher() { @Override diff --git a/processing/src/main/java/io/druid/segment/filter/Filters.java b/processing/src/main/java/io/druid/segment/filter/Filters.java index 79d9915c7316..0deacf168965 100644 --- a/processing/src/main/java/io/druid/segment/filter/Filters.java +++ b/processing/src/main/java/io/druid/segment/filter/Filters.java @@ -40,11 +40,11 @@ import io.druid.query.filter.ValueMatcherColumnSelectorStrategy; import io.druid.query.filter.ValueMatcherColumnSelectorStrategyFactory; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseLongColumnValueSelector; import io.druid.segment.ColumnSelector; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.DimensionHandlerUtils; import io.druid.segment.IntIteratorUtils; -import io.druid.segment.LongColumnSelector; import io.druid.segment.column.BitmapIndex; import io.druid.segment.column.Column; import io.druid.segment.column.ColumnCapabilities; @@ -162,7 +162,7 @@ public static ValueMatcher makeValueMatcher( // This should be folded into the ValueMatcherColumnSelectorStrategy once that can handle LONG typed columns. if (capabilities != null && capabilities.getType() == ValueType.LONG) { return getLongPredicateMatcher( - columnSelectorFactory.makeLongColumnSelector(columnName), + columnSelectorFactory.makeColumnValueSelector(columnName), predicateFactory.makeLongPredicate() ); } @@ -446,7 +446,7 @@ static boolean supportsSelectivityEstimation( } public static ValueMatcher getLongPredicateMatcher( - final LongColumnSelector longSelector, + final BaseLongColumnValueSelector longSelector, final DruidLongPredicate predicate ) { diff --git a/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java b/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java index 324f95414d97..4cff134e42ce 100644 --- a/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java +++ b/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java @@ -46,7 +46,9 @@ import io.druid.query.aggregation.PostAggregator; import io.druid.query.dimension.DimensionSpec; import io.druid.query.groupby.RowBasedColumnSelectorFactory; +import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.ColumnSelectorFactory; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionHandler; import io.druid.segment.DimensionHandlerUtils; import io.druid.segment.DimensionIndexer; @@ -55,6 +57,7 @@ import io.druid.segment.FloatColumnSelector; import io.druid.segment.LongColumnSelector; import io.druid.segment.Metadata; +import io.druid.segment.NilColumnValueSelector; import io.druid.segment.ObjectColumnSelector; import io.druid.segment.VirtualColumns; import io.druid.segment.column.Column; @@ -129,27 +132,14 @@ public static ColumnSelectorFactory makeColumnSelectorFactory( class IncrementalIndexInputRowColumnSelectorFactory implements ColumnSelectorFactory { @Override - public LongColumnSelector makeLongColumnSelector(final String columnName) - { - return baseSelectorFactory.makeLongColumnSelector(columnName); - } - - @Override - public FloatColumnSelector makeFloatColumnSelector(final String columnName) - { - return baseSelectorFactory.makeFloatColumnSelector(columnName); - } - - @Override - public ObjectColumnSelector makeObjectColumnSelector(final String column) + public ColumnValueSelector makeColumnValueSelector(final String column) { final String typeName = agg.getTypeName(); - - final ObjectColumnSelector rawColumnSelector = baseSelectorFactory.makeObjectColumnSelector(column); - - if ((GuavaUtils.getEnumIfPresent(ValueType.class, StringUtils.toUpperCase(typeName)) != null && !typeName.equalsIgnoreCase(ValueType.COMPLEX.name())) - || !deserializeComplexMetrics) { - return rawColumnSelector; + boolean isComplexMetric = + GuavaUtils.getEnumIfPresent(ValueType.class, StringUtils.toUpperCase(typeName)) == null || + typeName.equalsIgnoreCase(ValueType.COMPLEX.name()); + if (!isComplexMetric || !deserializeComplexMetrics) { + return baseSelectorFactory.makeColumnValueSelector(column); } else { final ComplexMetricSerde serde = ComplexMetrics.getSerdeForType(typeName); if (serde == null) { @@ -170,6 +160,13 @@ public Object getObject() { return extractor.extractValue(in.get(), column); } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("in", in); + inspector.visit("extractor", extractor); + } }; } } @@ -186,12 +183,6 @@ public ColumnCapabilities getColumnCapabilities(String columnName) { return baseSelectorFactory.getColumnCapabilities(columnName); } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName) - { - return baseSelectorFactory.makeDoubleColumnSelector(columnName); - } } return virtualColumns.wrap(new IncrementalIndexInputRowColumnSelectorFactory()); @@ -657,28 +648,34 @@ public DimensionDesc getDimension(String dimension) } } + @Nullable public String getMetricType(String metric) { final MetricDesc metricDesc = metricDescs.get(metric); return metricDesc != null ? metricDesc.getType() : null; } - public Class getMetricClass(String metric) + public ColumnValueSelector makeMetricColumnValueSelector(String metric, TimeAndDimsHolder currEntry) { MetricDesc metricDesc = metricDescs.get(metric); + if (metricDesc == null) { + return NilColumnValueSelector.instance(); + } + int metricIndex = metricDesc.getIndex(); switch (metricDesc.getCapabilities().getType()) { case COMPLEX: - return ComplexMetrics.getSerdeForType(metricDesc.getType()).getObjectStrategy().getClazz(); - case DOUBLE: - return Double.class; - case FLOAT: - return Float.class; + return new ObjectMetricColumnSelector(metricDesc, currEntry, metricIndex); case LONG: - return Long.class; + return new LongMetricColumnSelector(currEntry, metricIndex); + case FLOAT: + return new FloatMetricColumnSelector(currEntry, metricIndex); + case DOUBLE: + return new DoubleMetricColumnSelector(currEntry, metricIndex); case STRING: - return String.class; + throw new IllegalStateException("String is not a metric column type"); + default: + throw new ISE("Unknown metric value type: %s", metricDesc.getCapabilities().getType()); } - return null; } public Interval getInterval() @@ -762,6 +759,7 @@ public List getMetrics() return ImmutableList.copyOf(metricDescs.values()); } + @Nullable public Integer getMetricIndex(String metricName) { MetricDesc metSpec = metricDescs.get(metricName); @@ -1364,4 +1362,115 @@ public void clear() facts.clear(); } } + + private class LongMetricColumnSelector implements LongColumnSelector + { + private final TimeAndDimsHolder currEntry; + private final int metricIndex; + + public LongMetricColumnSelector(TimeAndDimsHolder currEntry, int metricIndex) + { + this.currEntry = currEntry; + this.metricIndex = metricIndex; + } + + @Override + public long getLong() + { + return getMetricLongValue(currEntry.getValue(), metricIndex); + } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("index", IncrementalIndex.this); + } + } + + private class ObjectMetricColumnSelector implements ObjectColumnSelector + { + private final MetricDesc metricDesc; + private final TimeAndDimsHolder currEntry; + private final int metricIndex; + private Class classOfObject; + + public ObjectMetricColumnSelector( + MetricDesc metricDesc, + TimeAndDimsHolder currEntry, + int metricIndex + ) + { + this.metricDesc = metricDesc; + this.currEntry = currEntry; + this.metricIndex = metricIndex; + classOfObject = ComplexMetrics.getSerdeForType(metricDesc.getType()).getObjectStrategy().getClazz(); + } + + @Nullable + @Override + public Object getObject() + { + return getMetricObjectValue(currEntry.getValue(), metricIndex); + } + + @Override + public Class classOfObject() + { + return classOfObject; + } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("index", IncrementalIndex.this); + } + } + + private class FloatMetricColumnSelector implements FloatColumnSelector + { + private final TimeAndDimsHolder currEntry; + private final int metricIndex; + + public FloatMetricColumnSelector(TimeAndDimsHolder currEntry, int metricIndex) + { + this.currEntry = currEntry; + this.metricIndex = metricIndex; + } + + @Override + public float getFloat() + { + return getMetricFloatValue(currEntry.getValue(), metricIndex); + } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("index", IncrementalIndex.this); + } + } + + private class DoubleMetricColumnSelector implements DoubleColumnSelector + { + private final TimeAndDimsHolder currEntry; + private final int metricIndex; + + public DoubleMetricColumnSelector(TimeAndDimsHolder currEntry, int metricIndex) + { + this.currEntry = currEntry; + this.metricIndex = metricIndex; + } + + @Override + public double getDouble() + { + return getMetricDoubleValue(currEntry.getValue(), metricIndex); + } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("index", IncrementalIndex.this); + } + } } diff --git a/processing/src/main/java/io/druid/segment/incremental/IncrementalIndexColumnSelectorFactory.java b/processing/src/main/java/io/druid/segment/incremental/IncrementalIndexColumnSelectorFactory.java index 8b9ae75f57b6..366b904d7550 100644 --- a/processing/src/main/java/io/druid/segment/incremental/IncrementalIndexColumnSelectorFactory.java +++ b/processing/src/main/java/io/druid/segment/incremental/IncrementalIndexColumnSelectorFactory.java @@ -23,24 +23,15 @@ import io.druid.query.extraction.ExtractionFn; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.ColumnSelectorFactory; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionIndexer; import io.druid.segment.DimensionSelector; import io.druid.segment.DimensionSelectorUtils; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.DoubleWrappingDimensionSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.FloatWrappingDimensionSelector; import io.druid.segment.LongColumnSelector; -import io.druid.segment.LongWrappingDimensionSelector; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.SingleScanTimeDimSelector; import io.druid.segment.VirtualColumns; -import io.druid.segment.ZeroDoubleColumnSelector; -import io.druid.segment.ZeroFloatColumnSelector; -import io.druid.segment.ZeroLongColumnSelector; import io.druid.segment.column.Column; import io.druid.segment.column.ColumnCapabilities; -import io.druid.segment.column.ValueType; import javax.annotation.Nullable; @@ -84,11 +75,7 @@ private DimensionSelector makeDimensionSelectorUndecorated(DimensionSpec dimensi final ExtractionFn extractionFn = dimensionSpec.getExtractionFn(); if (dimension.equals(Column.TIME_COLUMN_NAME)) { - return new SingleScanTimeDimSelector( - makeLongColumnSelector(dimension), - extractionFn, - descending - ); + return new SingleScanTimeDimSelector(makeColumnValueSelector(dimension), extractionFn, descending); } final IncrementalIndex.DimensionDesc dimensionDesc = index.getDimension(dimensionSpec.getDimension()); @@ -98,14 +85,11 @@ private DimensionSelector makeDimensionSelectorUndecorated(DimensionSpec dimensi if (capabilities == null) { return DimensionSelectorUtils.constantSelector(null, extractionFn); } - if (capabilities.getType() == ValueType.LONG) { - return new LongWrappingDimensionSelector(makeLongColumnSelector(dimension), extractionFn); - } - if (capabilities.getType() == ValueType.FLOAT) { - return new FloatWrappingDimensionSelector(makeFloatColumnSelector(dimension), extractionFn); - } - if (capabilities.getType() == ValueType.DOUBLE) { - return new DoubleWrappingDimensionSelector(makeDoubleColumnSelector(dimension), extractionFn); + if (capabilities.getType().isNumeric()) { + return capabilities.getType().makeNumericWrappingDimensionSelector( + makeColumnValueSelector(dimension), + extractionFn + ); } // if we can't wrap the base column, just return a column of all nulls @@ -117,82 +101,10 @@ private DimensionSelector makeDimensionSelectorUndecorated(DimensionSpec dimensi } @Override - public FloatColumnSelector makeFloatColumnSelector(String columnName) - { - if (virtualColumns.exists(columnName)) { - return virtualColumns.makeFloatColumnSelector(columnName, this); - } - - final Integer dimIndex = index.getDimensionIndex(columnName); - if (dimIndex != null) { - final IncrementalIndex.DimensionDesc dimensionDesc = index.getDimension(columnName); - final DimensionIndexer indexer = dimensionDesc.getIndexer(); - return indexer.makeFloatColumnSelector(timeAndDimsHolder, dimensionDesc); - } - - final Integer metricIndexInt = index.getMetricIndex(columnName); - if (metricIndexInt == null) { - return ZeroFloatColumnSelector.instance(); - } - - final int metricIndex = metricIndexInt; - return new FloatColumnSelector() - { - @Override - public float getFloat() - { - return index.getMetricFloatValue(timeAndDimsHolder.getValue(), metricIndex); - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("index", index); - } - }; - } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName) + public ColumnValueSelector makeColumnValueSelector(String columnName) { if (virtualColumns.exists(columnName)) { - return virtualColumns.makeDoubleColumnSelector(columnName, this); - } - - final Integer dimIndex = index.getDimensionIndex(columnName); - if (dimIndex != null) { - final IncrementalIndex.DimensionDesc dimensionDesc = index.getDimension(columnName); - final DimensionIndexer indexer = dimensionDesc.getIndexer(); - return indexer.makeDoubleColumnSelector(timeAndDimsHolder, dimensionDesc); - } - - final Integer metricIndexInt = index.getMetricIndex(columnName); - if (metricIndexInt == null) { - return ZeroDoubleColumnSelector.instance(); - } - - final int metricIndex = metricIndexInt; - return new DoubleColumnSelector() - { - @Override - public double getDouble() - { - return index.getMetricDoubleValue(timeAndDimsHolder.getValue(), metricIndex); - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("index", index); - } - }; - } - - @Override - public LongColumnSelector makeLongColumnSelector(String columnName) - { - if (virtualColumns.exists(columnName)) { - return virtualColumns.makeLongColumnSelector(columnName, this); + return virtualColumns.makeColumnValueSelector(columnName, this); } if (columnName.equals(Column.TIME_COLUMN_NAME)) { @@ -217,115 +129,10 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) if (dimIndex != null) { final IncrementalIndex.DimensionDesc dimensionDesc = index.getDimension(columnName); final DimensionIndexer indexer = dimensionDesc.getIndexer(); - return indexer.makeLongColumnSelector(timeAndDimsHolder, dimensionDesc); - } - - final Integer metricIndexInt = index.getMetricIndex(columnName); - if (metricIndexInt == null) { - return ZeroLongColumnSelector.instance(); - } - - final int metricIndex = metricIndexInt; - - return new LongColumnSelector() - { - @Override - public long getLong() - { - return index.getMetricLongValue(timeAndDimsHolder.getValue(), metricIndex); - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - inspector.visit("index", index); - } - }; - } - - @Override - public ObjectColumnSelector makeObjectColumnSelector(String column) - { - if (virtualColumns.exists(column)) { - return virtualColumns.makeObjectColumnSelector(column, this); - } - - if (column.equals(Column.TIME_COLUMN_NAME)) { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Long.class; - } - - @Override - public Long getObject() - { - return timeAndDimsHolder.getKey().getTimestamp(); - } - }; + return indexer.makeColumnValueSelector(timeAndDimsHolder, dimensionDesc); } - final Integer metricIndexInt = index.getMetricIndex(column); - if (metricIndexInt != null) { - final int metricIndex = metricIndexInt; - final Class classOfObject = index.getMetricClass(column); - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return classOfObject; - } - - @Override - public Object getObject() - { - return index.getMetricObjectValue( - timeAndDimsHolder.getValue(), - metricIndex - ); - } - }; - } - - IncrementalIndex.DimensionDesc dimensionDesc = index.getDimension(column); - - if (dimensionDesc == null) { - return null; - } else { - - final int dimensionIndex = dimensionDesc.getIndex(); - final DimensionIndexer indexer = dimensionDesc.getIndexer(); - - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Object.class; - } - - @Override - public Object getObject() - { - IncrementalIndex.TimeAndDims key = timeAndDimsHolder.getKey(); - if (key == null) { - return null; - } - - Object[] dims = key.getDims(); - if (dimensionIndex >= dims.length) { - return null; - } - - return indexer.convertUnsortedEncodedKeyComponentToActualArrayOrList( - dims[dimensionIndex], DimensionIndexer.ARRAY - ); - } - }; - } + return index.makeMetricColumnValueSelector(columnName, timeAndDimsHolder); } @Nullable diff --git a/processing/src/main/java/io/druid/segment/incremental/OnheapIncrementalIndex.java b/processing/src/main/java/io/druid/segment/incremental/OnheapIncrementalIndex.java index a530981a2d1d..3ce976e2165e 100644 --- a/processing/src/main/java/io/druid/segment/incremental/OnheapIncrementalIndex.java +++ b/processing/src/main/java/io/druid/segment/incremental/OnheapIncrementalIndex.java @@ -31,11 +31,8 @@ import io.druid.query.aggregation.AggregatorFactory; import io.druid.query.dimension.DimensionSpec; import io.druid.segment.ColumnSelectorFactory; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.column.ColumnCapabilities; import javax.annotation.Nullable; @@ -308,10 +305,7 @@ public void close() // operations. static class ObjectCachingColumnSelectorFactory implements ColumnSelectorFactory { - private final Map longColumnSelectorMap; - private final Map floatColumnSelectorMap; - private final Map objectColumnSelectorMap; - private final Map doubleColumnSelectorMap; + private final Map> columnSelectorMap; private final ColumnSelectorFactory delegate; public ObjectCachingColumnSelectorFactory(ColumnSelectorFactory delegate, boolean concurrentEventAdd) @@ -319,15 +313,9 @@ public ObjectCachingColumnSelectorFactory(ColumnSelectorFactory delegate, boolea this.delegate = delegate; if (concurrentEventAdd) { - longColumnSelectorMap = new ConcurrentHashMap<>(); - floatColumnSelectorMap = new ConcurrentHashMap<>(); - objectColumnSelectorMap = new ConcurrentHashMap<>(); - doubleColumnSelectorMap = new ConcurrentHashMap<>(); + columnSelectorMap = new ConcurrentHashMap<>(); } else { - longColumnSelectorMap = new HashMap<>(); - floatColumnSelectorMap = new HashMap<>(); - objectColumnSelectorMap = new HashMap<>(); - doubleColumnSelectorMap = new HashMap<>(); + columnSelectorMap = new HashMap<>(); } } @@ -338,43 +326,13 @@ public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec) } @Override - public FloatColumnSelector makeFloatColumnSelector(String columnName) + public ColumnValueSelector makeColumnValueSelector(String columnName) { - final FloatColumnSelector existing = floatColumnSelectorMap.get(columnName); + final ColumnValueSelector existing = columnSelectorMap.get(columnName); if (existing != null) { return existing; } - return floatColumnSelectorMap.computeIfAbsent(columnName, delegate::makeFloatColumnSelector); - } - - @Override - public LongColumnSelector makeLongColumnSelector(String columnName) - { - final LongColumnSelector existing = longColumnSelectorMap.get(columnName); - if (existing != null) { - return existing; - } - return longColumnSelectorMap.computeIfAbsent(columnName, delegate::makeLongColumnSelector); - } - - @Override - public ObjectColumnSelector makeObjectColumnSelector(String columnName) - { - final ObjectColumnSelector existing = objectColumnSelectorMap.get(columnName); - if (existing != null) { - return existing; - } - return objectColumnSelectorMap.computeIfAbsent(columnName, delegate::makeObjectColumnSelector); - } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName) - { - final DoubleColumnSelector existing = doubleColumnSelectorMap.get(columnName); - if (existing != null) { - return existing; - } - return doubleColumnSelectorMap.computeIfAbsent(columnName, delegate::makeDoubleColumnSelector); + return columnSelectorMap.computeIfAbsent(columnName, delegate::makeColumnValueSelector); } @Nullable diff --git a/processing/src/main/java/io/druid/segment/incremental/SpatialDimensionRowTransformer.java b/processing/src/main/java/io/druid/segment/incremental/SpatialDimensionRowTransformer.java index 45548f98e4d4..665056005b2e 100644 --- a/processing/src/main/java/io/druid/segment/incremental/SpatialDimensionRowTransformer.java +++ b/processing/src/main/java/io/druid/segment/incremental/SpatialDimensionRowTransformer.java @@ -130,21 +130,9 @@ public Object getRaw(String dimension) } @Override - public long getLongMetric(String metric) + public Number getMetric(String metric) { - return row.getLongMetric(metric); - } - - @Override - public double getDoubleMetric(String metric) - { - return row.getDoubleMetric(metric); - } - - @Override - public float getFloatMetric(String metric) - { - return row.getFloatMetric(metric); + return row.getMetric(metric); } @Override diff --git a/processing/src/main/java/io/druid/segment/NullStringObjectColumnSelector.java b/processing/src/main/java/io/druid/segment/package-info.java similarity index 63% rename from processing/src/main/java/io/druid/segment/NullStringObjectColumnSelector.java rename to processing/src/main/java/io/druid/segment/package-info.java index 09c9ed52144c..27f6f009d7a9 100644 --- a/processing/src/main/java/io/druid/segment/NullStringObjectColumnSelector.java +++ b/processing/src/main/java/io/druid/segment/package-info.java @@ -17,30 +17,7 @@ * under the License. */ +@EverythingIsNonnullByDefault package io.druid.segment; -public final class NullStringObjectColumnSelector implements ObjectColumnSelector -{ - private static final NullStringObjectColumnSelector INSTANCE = new NullStringObjectColumnSelector(); - - public static NullStringObjectColumnSelector instance() - { - return INSTANCE; - } - - private NullStringObjectColumnSelector() - { - } - - @Override - public Class classOfObject() - { - return String.class; - } - - @Override - public String getObject() - { - return null; - } -} +import io.druid.annotations.EverythingIsNonnullByDefault; diff --git a/processing/src/main/java/io/druid/segment/virtual/BaseSingleValueDimensionSelector.java b/processing/src/main/java/io/druid/segment/virtual/BaseSingleValueDimensionSelector.java index d7425cd08c0c..d0dd1467686f 100644 --- a/processing/src/main/java/io/druid/segment/virtual/BaseSingleValueDimensionSelector.java +++ b/processing/src/main/java/io/druid/segment/virtual/BaseSingleValueDimensionSelector.java @@ -112,4 +112,17 @@ public IdLookup idLookup() { return null; } + + @Nullable + @Override + public Object getObject() + { + return getValue(); + } + + @Override + public Class classOfObject() + { + return String.class; + } } diff --git a/processing/src/main/java/io/druid/segment/virtual/ExpressionObjectSelector.java b/processing/src/main/java/io/druid/segment/virtual/ExpressionObjectSelector.java index 941c25c3f2cd..868d67491156 100644 --- a/processing/src/main/java/io/druid/segment/virtual/ExpressionObjectSelector.java +++ b/processing/src/main/java/io/druid/segment/virtual/ExpressionObjectSelector.java @@ -27,6 +27,8 @@ import io.druid.math.expr.ExprEval; import io.druid.math.expr.Parser; import io.druid.query.dimension.DefaultDimensionSpec; +import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.DimensionSelector; import io.druid.segment.ObjectColumnSelector; @@ -49,7 +51,7 @@ private ExpressionObjectSelector(Expr.ObjectBinding bindings, Expr expression) this.expression = Preconditions.checkNotNull(expression, "expression"); } - static ExpressionObjectSelector from(ColumnSelectorFactory columnSelectorFactory, Expr expression) + public static ExpressionObjectSelector from(ColumnSelectorFactory columnSelectorFactory, Expr expression) { return new ExpressionObjectSelector(createBindings(columnSelectorFactory, expression), expression); } @@ -63,18 +65,18 @@ private static Expr.ObjectBinding createBindings(ColumnSelectorFactory columnSel final Supplier supplier; if (nativeType == ValueType.FLOAT) { - supplier = columnSelectorFactory.makeFloatColumnSelector(columnName)::getFloat; + supplier = columnSelectorFactory.makeColumnValueSelector(columnName)::getFloat; } else if (nativeType == ValueType.LONG) { - supplier = columnSelectorFactory.makeLongColumnSelector(columnName)::getLong; + supplier = columnSelectorFactory.makeColumnValueSelector(columnName)::getLong; } else if (nativeType == ValueType.DOUBLE) { - supplier = columnSelectorFactory.makeDoubleColumnSelector(columnName)::getDouble; + supplier = columnSelectorFactory.makeColumnValueSelector(columnName)::getDouble; } else if (nativeType == ValueType.STRING) { supplier = supplierFromDimensionSelector( columnSelectorFactory.makeDimensionSelector(new DefaultDimensionSpec(columnName, columnName)) ); } else if (nativeType == null) { // Unknown ValueType. Try making an Object selector and see if that gives us anything useful. - supplier = supplierFromObjectSelector(columnSelectorFactory.makeObjectColumnSelector(columnName)); + supplier = supplierFromObjectSelector(columnSelectorFactory.makeColumnValueSelector(columnName)); } else { // Unhandleable ValueType (COMPLEX). supplier = null; @@ -110,7 +112,7 @@ static Supplier supplierFromDimensionSelector(final DimensionSelector se @VisibleForTesting @Nullable - static Supplier supplierFromObjectSelector(final ObjectColumnSelector selector) + static Supplier supplierFromObjectSelector(final BaseObjectColumnValueSelector selector) { if (selector == null) { return null; @@ -147,4 +149,11 @@ public ExprEval getObject() { return expression.eval(bindings); } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("expression", expression); + inspector.visit("bindings", bindings); + } } diff --git a/processing/src/main/java/io/druid/segment/virtual/ExpressionSelectors.java b/processing/src/main/java/io/druid/segment/virtual/ExpressionSelectors.java index 9d2b2aaeeaff..c345d99ff314 100644 --- a/processing/src/main/java/io/druid/segment/virtual/ExpressionSelectors.java +++ b/processing/src/main/java/io/druid/segment/virtual/ExpressionSelectors.java @@ -25,10 +25,10 @@ import io.druid.query.extraction.ExtractionFn; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.ColumnSelectorFactory; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; + +import javax.annotation.Nullable; public class ExpressionSelectors { @@ -37,78 +37,47 @@ private ExpressionSelectors() // No instantiation. } - public static ExpressionObjectSelector makeObjectColumnSelector( - final ColumnSelectorFactory columnSelectorFactory, - final Expr expression - ) - { - return ExpressionObjectSelector.from(columnSelectorFactory, expression); - } - - public static LongColumnSelector makeLongColumnSelector( - final ColumnSelectorFactory columnSelectorFactory, - final Expr expression, - final long nullValue + public static ColumnValueSelector makeColumnValueSelector( + ColumnSelectorFactory columnSelectorFactory, + Expr expression ) { final ExpressionObjectSelector baseSelector = ExpressionObjectSelector.from(columnSelectorFactory, expression); - class ExpressionLongColumnSelector implements LongColumnSelector + return new ColumnValueSelector() { @Override - public long getLong() + public double getDouble() { final ExprEval exprEval = baseSelector.getObject(); - return exprEval.isNull() ? nullValue : exprEval.asLong(); + return exprEval.isNull() ? 0.0 : exprEval.asDouble(); } @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) + public float getFloat() { - inspector.visit("baseSelector", baseSelector); + final ExprEval exprEval = baseSelector.getObject(); + return exprEval.isNull() ? 0.0f : (float) exprEval.asDouble(); } - } - return new ExpressionLongColumnSelector(); - } - public static FloatColumnSelector makeFloatColumnSelector( - final ColumnSelectorFactory columnSelectorFactory, - final Expr expression, - final float nullValue - ) - { - final ExpressionObjectSelector baseSelector = ExpressionObjectSelector.from(columnSelectorFactory, expression); - class ExpressionFloatColumnSelector implements FloatColumnSelector - { @Override - public float getFloat() + public long getLong() { final ExprEval exprEval = baseSelector.getObject(); - return exprEval.isNull() ? nullValue : (float) exprEval.asDouble(); + return exprEval.isNull() ? 0L : exprEval.asLong(); } + @Nullable @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) + public Object getObject() { - inspector.visit("baseSelector", baseSelector); + final ExprEval exprEval = baseSelector.getObject(); + return exprEval.value(); } - } - return new ExpressionFloatColumnSelector(); - } - public static DoubleColumnSelector makeDoubleColumnSelector( - ColumnSelectorFactory columnSelectorFactory, - Expr expression, - double nullValue - ) - { - final ExpressionObjectSelector baseSelector = ExpressionObjectSelector.from(columnSelectorFactory, expression); - class ExpressionDoubleColumnSelector implements DoubleColumnSelector - { @Override - public double getDouble() + public Class classOfObject() { - final ExprEval exprEval = baseSelector.getObject(); - return exprEval.isNull() ? nullValue : exprEval.asDouble(); + return Object.class; } @Override @@ -116,8 +85,7 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) { inspector.visit("baseSelector", baseSelector); } - } - return new ExpressionDoubleColumnSelector(); + }; } public static DimensionSelector makeDimensionSelector( diff --git a/processing/src/main/java/io/druid/segment/virtual/ExpressionVirtualColumn.java b/processing/src/main/java/io/druid/segment/virtual/ExpressionVirtualColumn.java index c57ae36da96b..e26149fb79ce 100644 --- a/processing/src/main/java/io/druid/segment/virtual/ExpressionVirtualColumn.java +++ b/processing/src/main/java/io/druid/segment/virtual/ExpressionVirtualColumn.java @@ -29,11 +29,8 @@ import io.druid.query.cache.CacheKeyBuilder; import io.druid.query.dimension.DimensionSpec; import io.druid.segment.ColumnSelectorFactory; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.VirtualColumn; import io.druid.segment.column.ColumnCapabilities; import io.druid.segment.column.ColumnCapabilitiesImpl; @@ -82,32 +79,6 @@ public ValueType getOutputType() return outputType; } - @Override - public ObjectColumnSelector makeObjectColumnSelector( - final String columnName, - final ColumnSelectorFactory columnSelectorFactory - ) - { - final ExpressionObjectSelector baseSelector = ExpressionSelectors.makeObjectColumnSelector( - columnSelectorFactory, - parsedExpression - ); - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Object.class; - } - - @Override - public Object getObject() - { - return baseSelector.getObject().value(); - } - }; - } - @Override public DimensionSelector makeDimensionSelector( final DimensionSpec dimensionSpec, @@ -124,21 +95,9 @@ public DimensionSelector makeDimensionSelector( } @Override - public FloatColumnSelector makeFloatColumnSelector( - final String columnName, - final ColumnSelectorFactory columnSelectorFactory - ) - { - return ExpressionSelectors.makeFloatColumnSelector(columnSelectorFactory, parsedExpression, 0.0f); - } - - @Override - public LongColumnSelector makeLongColumnSelector( - final String columnName, - final ColumnSelectorFactory columnSelectorFactory - ) + public ColumnValueSelector makeColumnValueSelector(String columnName, ColumnSelectorFactory factory) { - return ExpressionSelectors.makeLongColumnSelector(columnSelectorFactory, parsedExpression, 0L); + return ExpressionSelectors.makeColumnValueSelector(factory, parsedExpression); } @Override @@ -159,14 +118,6 @@ public boolean usesDotNotation() return false; } - @Override - public DoubleColumnSelector makeDoubleColumnSelector( - String columnName, ColumnSelectorFactory factory - ) - { - return ExpressionSelectors.makeDoubleColumnSelector(factory, parsedExpression, 0.0d); - } - @Override public byte[] getCacheKey() { diff --git a/processing/src/main/java/io/druid/segment/virtual/VirtualizedColumnSelectorFactory.java b/processing/src/main/java/io/druid/segment/virtual/VirtualizedColumnSelectorFactory.java index ae48dc117d55..6a9652d864f6 100644 --- a/processing/src/main/java/io/druid/segment/virtual/VirtualizedColumnSelectorFactory.java +++ b/processing/src/main/java/io/druid/segment/virtual/VirtualizedColumnSelectorFactory.java @@ -22,11 +22,8 @@ import com.google.common.base.Preconditions; import io.druid.query.dimension.DimensionSpec; import io.druid.segment.ColumnSelectorFactory; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.VirtualColumns; import io.druid.segment.column.ColumnCapabilities; @@ -57,43 +54,12 @@ public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec) } @Override - public FloatColumnSelector makeFloatColumnSelector(String columnName) + public ColumnValueSelector makeColumnValueSelector(String columnName) { if (virtualColumns.exists(columnName)) { - return virtualColumns.makeFloatColumnSelector(columnName, baseFactory); + return virtualColumns.makeColumnValueSelector(columnName, baseFactory); } else { - return baseFactory.makeFloatColumnSelector(columnName); - } - } - - @Override - public LongColumnSelector makeLongColumnSelector(String columnName) - { - if (virtualColumns.exists(columnName)) { - return virtualColumns.makeLongColumnSelector(columnName, baseFactory); - } else { - return baseFactory.makeLongColumnSelector(columnName); - } - } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName) - { - if (virtualColumns.exists(columnName)) { - return virtualColumns.makeDoubleColumnSelector(columnName, baseFactory); - } else { - return baseFactory.makeDoubleColumnSelector(columnName); - } - } - - @Nullable - @Override - public ObjectColumnSelector makeObjectColumnSelector(String columnName) - { - if (virtualColumns.exists(columnName)) { - return virtualColumns.makeObjectColumnSelector(columnName, baseFactory); - } else { - return baseFactory.makeObjectColumnSelector(columnName); + return baseFactory.makeColumnValueSelector(columnName); } } diff --git a/processing/src/test/java/io/druid/query/aggregation/DoubleMaxAggregationTest.java b/processing/src/test/java/io/druid/query/aggregation/DoubleMaxAggregationTest.java index ec602d483e1d..12cea46fcdda 100644 --- a/processing/src/test/java/io/druid/query/aggregation/DoubleMaxAggregationTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/DoubleMaxAggregationTest.java @@ -50,7 +50,7 @@ public void setup() { selector = new TestDoubleColumnSelectorImpl(values); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeDoubleColumnSelector("nilly")).andReturn(selector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(selector); EasyMock.replay(colSelectorFactory); } diff --git a/processing/src/test/java/io/druid/query/aggregation/DoubleMinAggregationTest.java b/processing/src/test/java/io/druid/query/aggregation/DoubleMinAggregationTest.java index bd4479736f96..3d4735609d78 100644 --- a/processing/src/test/java/io/druid/query/aggregation/DoubleMinAggregationTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/DoubleMinAggregationTest.java @@ -50,7 +50,7 @@ public void setup() { selector = new TestDoubleColumnSelectorImpl(values); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeDoubleColumnSelector("nilly")).andReturn(selector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(selector); EasyMock.replay(colSelectorFactory); } diff --git a/processing/src/test/java/io/druid/query/aggregation/FilteredAggregatorTest.java b/processing/src/test/java/io/druid/query/aggregation/FilteredAggregatorTest.java index f57d61aa570f..89f70738e398 100644 --- a/processing/src/test/java/io/druid/query/aggregation/FilteredAggregatorTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/FilteredAggregatorTest.java @@ -43,11 +43,7 @@ import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; import io.druid.segment.DimensionSelectorUtils; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; import io.druid.segment.IdLookup; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.column.ColumnCapabilities; import io.druid.segment.column.ColumnCapabilitiesImpl; import io.druid.segment.column.ValueType; @@ -170,6 +166,19 @@ public int lookupId(String name) }; } + @Nullable + @Override + public Object getObject() + { + return defaultGetObject(); + } + + @Override + public Class classOfObject() + { + return Object.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { @@ -183,13 +192,7 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) } @Override - public LongColumnSelector makeLongColumnSelector(String columnName) - { - throw new UnsupportedOperationException(); - } - - @Override - public FloatColumnSelector makeFloatColumnSelector(String columnName) + public ColumnValueSelector makeColumnValueSelector(String columnName) { if (columnName.equals("value")) { return selector; @@ -198,35 +201,6 @@ public FloatColumnSelector makeFloatColumnSelector(String columnName) } } - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName) - { - if (columnName.equals("value")) { - return new DoubleColumnSelector() - { - @Override - public double getDouble() - { - return ((ColumnValueSelector) selector).getDouble(); - } - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - - } - }; - } else { - throw new UnsupportedOperationException(); - } - } - - @Override - public ObjectColumnSelector makeObjectColumnSelector(String columnName) - { - throw new UnsupportedOperationException(); - } - @Override public ColumnCapabilities getColumnCapabilities(String columnName) { diff --git a/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorBenchmark.java b/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorBenchmark.java index 2ee578119677..1bbe415ef078 100644 --- a/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorBenchmark.java +++ b/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorBenchmark.java @@ -21,10 +21,9 @@ import com.google.caliper.Runner; import com.google.caliper.SimpleBenchmark; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import io.druid.segment.ObjectColumnSelector; +import java.util.Collections; import java.util.Map; public class JavaScriptAggregatorBenchmark extends SimpleBenchmark @@ -53,7 +52,7 @@ protected void setUp() throws Exception Map script = scriptDoubleSum; jsAggregator = new JavaScriptAggregator( - Lists.asList(MetricSelectorUtils.wrap(selector), new ObjectColumnSelector[]{}), + Collections.singletonList(selector), JavaScriptAggregatorFactory.compileScript( script.get("fnAggregate"), script.get("fnReset"), diff --git a/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorTest.java b/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorTest.java index ea46da64a2bc..795155e88481 100644 --- a/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorTest.java @@ -20,17 +20,13 @@ package io.druid.query.aggregation; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import io.druid.java.util.common.StringUtils; import io.druid.js.JavaScriptConfig; import io.druid.query.dimension.DimensionSpec; import io.druid.segment.ColumnSelectorFactory; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.column.ColumnCapabilities; import org.junit.Assert; import org.junit.Rule; @@ -56,19 +52,7 @@ public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec) } @Override - public FloatColumnSelector makeFloatColumnSelector(String columnName) - { - return null; - } - - @Override - public LongColumnSelector makeLongColumnSelector(String columnName) - { - return null; - } - - @Override - public ObjectColumnSelector makeObjectColumnSelector(String columnName) + public ColumnValueSelector makeColumnValueSelector(String columnName) { return null; } @@ -78,12 +62,6 @@ public ColumnCapabilities getColumnCapabilities(String columnName) { return null; } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName) - { - return null; - } }; static { @@ -139,7 +117,7 @@ public void testAggregate() Map script = sumLogATimesBPlusTen; JavaScriptAggregator agg = new JavaScriptAggregator( - Arrays.asList(MetricSelectorUtils.wrap(selector1), MetricSelectorUtils.wrap(selector2)), + Arrays.asList(selector1, selector2), JavaScriptAggregatorFactory.compileScript( script.get("fnAggregate"), script.get("fnReset"), @@ -175,7 +153,7 @@ public void testBufferAggregate() Map script = sumLogATimesBPlusTen; JavaScriptBufferAggregator agg = new JavaScriptBufferAggregator( - Arrays.asList(MetricSelectorUtils.wrap(selector1), MetricSelectorUtils.wrap(selector2)), + Arrays.asList(selector1, selector2), JavaScriptAggregatorFactory.compileScript( script.get("fnAggregate"), script.get("fnReset"), @@ -211,7 +189,7 @@ public void testAggregateMissingColumn() Map script = scriptDoubleSum; JavaScriptAggregator agg = new JavaScriptAggregator( - Collections.singletonList(null), + Collections.singletonList(null), JavaScriptAggregatorFactory.compileScript( script.get("fnAggregate"), script.get("fnReset"), @@ -244,7 +222,7 @@ public void testAggregateStrings() new Object[]{"what", null, new String[]{"hey", "there"}} ); final JavaScriptAggregator agg = new JavaScriptAggregator( - Collections.singletonList(ocs), + Collections.singletonList(ocs), JavaScriptAggregatorFactory.compileScript( "function aggregate(current, a) { if (Array.isArray(a)) { return current + a.length; } else if (typeof a === 'string') { return current + 1; } else { return current; } }", scriptDoubleSum.get("fnReset"), @@ -337,7 +315,7 @@ public static void main(String... args) throws Exception Map script = scriptDoubleSum; JavaScriptAggregator aggRhino = new JavaScriptAggregator( - Lists.asList(MetricSelectorUtils.wrap(selector), new ObjectColumnSelector[]{}), + Collections.singletonList(selector), JavaScriptAggregatorFactory.compileScript( script.get("fnAggregate"), script.get("fnReset"), diff --git a/processing/src/test/java/io/druid/query/aggregation/LongMaxAggregationTest.java b/processing/src/test/java/io/druid/query/aggregation/LongMaxAggregationTest.java index 25cd857e294f..e4e3a5490932 100644 --- a/processing/src/test/java/io/druid/query/aggregation/LongMaxAggregationTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/LongMaxAggregationTest.java @@ -50,7 +50,7 @@ public void setup() { selector = new TestLongColumnSelector(values); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeLongColumnSelector("nilly")).andReturn(selector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(selector); EasyMock.replay(colSelectorFactory); } diff --git a/processing/src/test/java/io/druid/query/aggregation/LongMinAggregationTest.java b/processing/src/test/java/io/druid/query/aggregation/LongMinAggregationTest.java index 73357564c42b..0b0227ec03f7 100644 --- a/processing/src/test/java/io/druid/query/aggregation/LongMinAggregationTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/LongMinAggregationTest.java @@ -50,7 +50,7 @@ public void setup() { selector = new TestLongColumnSelector(values); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeLongColumnSelector("nilly")).andReturn(selector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(selector); EasyMock.replay(colSelectorFactory); } diff --git a/processing/src/test/java/io/druid/query/aggregation/MetricSelectorUtils.java b/processing/src/test/java/io/druid/query/aggregation/MetricSelectorUtils.java deleted file mode 100644 index 6c57a8db980e..000000000000 --- a/processing/src/test/java/io/druid/query/aggregation/MetricSelectorUtils.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to Metamarkets Group Inc. (Metamarkets) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. Metamarkets licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package io.druid.query.aggregation; - -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.ObjectColumnSelector; - -public class MetricSelectorUtils -{ - public static ObjectColumnSelector wrap(final FloatColumnSelector selector) - { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Float.class; - } - - @Override - public Float getObject() - { - return selector.getFloat(); - } - }; - } - - public static ObjectColumnSelector wrap(final DoubleColumnSelector selector) - { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Double.class; - } - - @Override - public Double getObject() - { - return selector.getDouble(); - } - }; - } -} diff --git a/processing/src/test/java/io/druid/query/aggregation/TestObjectColumnSelector.java b/processing/src/test/java/io/druid/query/aggregation/TestObjectColumnSelector.java index ecd20b47b0a7..e98b8bb40f43 100644 --- a/processing/src/test/java/io/druid/query/aggregation/TestObjectColumnSelector.java +++ b/processing/src/test/java/io/druid/query/aggregation/TestObjectColumnSelector.java @@ -19,11 +19,9 @@ package io.druid.query.aggregation; -import io.druid.segment.ObjectColumnSelector; - /** */ -public class TestObjectColumnSelector implements ObjectColumnSelector +public class TestObjectColumnSelector extends io.druid.segment.TestObjectColumnSelector { private final Object[] objects; @@ -35,15 +33,15 @@ public TestObjectColumnSelector(T[] objects) } @Override - public Class classOfObject() + public Class classOfObject() { - return objects[index].getClass(); + return (Class) objects[index].getClass(); } @Override - public Object getObject() + public T getObject() { - return objects[index]; + return (T) objects[index]; } public void increment() diff --git a/processing/src/test/java/io/druid/query/aggregation/cardinality/CardinalityAggregatorTest.java b/processing/src/test/java/io/druid/query/aggregation/cardinality/CardinalityAggregatorTest.java index 444eb83541cc..e8024d913faf 100644 --- a/processing/src/test/java/io/druid/query/aggregation/cardinality/CardinalityAggregatorTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/cardinality/CardinalityAggregatorTest.java @@ -198,6 +198,19 @@ public int lookupId(String s) }; } + @Nullable + @Override + public Object getObject() + { + return defaultGetObject(); + } + + @Override + public Class classOfObject() + { + return Object.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { diff --git a/processing/src/test/java/io/druid/query/aggregation/first/DoubleFirstAggregationTest.java b/processing/src/test/java/io/druid/query/aggregation/first/DoubleFirstAggregationTest.java index 53023b899823..746d36aa42d8 100644 --- a/processing/src/test/java/io/druid/query/aggregation/first/DoubleFirstAggregationTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/first/DoubleFirstAggregationTest.java @@ -62,9 +62,9 @@ public void setup() valueSelector = new TestDoubleColumnSelectorImpl(doubleValues); objectSelector = new TestObjectColumnSelector<>(pairs); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); - EasyMock.expect(colSelectorFactory.makeDoubleColumnSelector("nilly")).andReturn(valueSelector); - EasyMock.expect(colSelectorFactory.makeObjectColumnSelector("billy")).andReturn(objectSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(valueSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("billy")).andReturn(objectSelector); EasyMock.replay(colSelectorFactory); } diff --git a/processing/src/test/java/io/druid/query/aggregation/first/FloatFirstAggregationTest.java b/processing/src/test/java/io/druid/query/aggregation/first/FloatFirstAggregationTest.java index 75e639d57d1d..246dcf68f03f 100644 --- a/processing/src/test/java/io/druid/query/aggregation/first/FloatFirstAggregationTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/first/FloatFirstAggregationTest.java @@ -62,9 +62,9 @@ public void setup() valueSelector = new TestFloatColumnSelector(floats); objectSelector = new TestObjectColumnSelector<>(pairs); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); - EasyMock.expect(colSelectorFactory.makeFloatColumnSelector("nilly")).andReturn(valueSelector); - EasyMock.expect(colSelectorFactory.makeObjectColumnSelector("billy")).andReturn(objectSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(valueSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("billy")).andReturn(objectSelector); EasyMock.replay(colSelectorFactory); } diff --git a/processing/src/test/java/io/druid/query/aggregation/first/LongFirstAggregationTest.java b/processing/src/test/java/io/druid/query/aggregation/first/LongFirstAggregationTest.java index 9bf9cdcc2567..186d086e9fd2 100644 --- a/processing/src/test/java/io/druid/query/aggregation/first/LongFirstAggregationTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/first/LongFirstAggregationTest.java @@ -61,9 +61,9 @@ public void setup() valueSelector = new TestLongColumnSelector(longValues); objectSelector = new TestObjectColumnSelector<>(pairs); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); - EasyMock.expect(colSelectorFactory.makeLongColumnSelector("nilly")).andReturn(valueSelector); - EasyMock.expect(colSelectorFactory.makeObjectColumnSelector("billy")).andReturn(objectSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(valueSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("billy")).andReturn(objectSelector); EasyMock.replay(colSelectorFactory); } diff --git a/processing/src/test/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregationTest.java b/processing/src/test/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregationTest.java index 3f50290af54a..b653faec82a9 100644 --- a/processing/src/test/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregationTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/hyperloglog/HyperUniquesAggregationTest.java @@ -120,8 +120,8 @@ public void testIngestAndQuery() throws Exception ); MapBasedRow row = (MapBasedRow) Sequences.toList(seq, Lists.newArrayList()).get(0); - Assert.assertEquals(3.0, row.getFloatMetric("index_hll"), 0.1); - Assert.assertEquals(3.0, row.getFloatMetric("index_unique_count"), 0.1); + Assert.assertEquals(3.0, row.getMetric("index_hll").floatValue(), 0.1); + Assert.assertEquals(3.0, row.getMetric("index_unique_count").floatValue(), 0.1); } @Test @@ -182,7 +182,7 @@ public void testIngestAndQueryPrecomputedHll() throws Exception ); MapBasedRow row = (MapBasedRow) Sequences.toList(seq, Lists.newArrayList()).get(0); - Assert.assertEquals(4.0, row.getFloatMetric("index_hll"), 0.1); - Assert.assertEquals(4.0, row.getFloatMetric("index_unique_count"), 0.1); + Assert.assertEquals(4.0, row.getMetric("index_hll").floatValue(), 0.1); + Assert.assertEquals(4.0, row.getMetric("index_unique_count").floatValue(), 0.1); } } diff --git a/processing/src/test/java/io/druid/query/aggregation/last/DoubleLastAggregationTest.java b/processing/src/test/java/io/druid/query/aggregation/last/DoubleLastAggregationTest.java index 6917dfa223e9..7f88266124dc 100644 --- a/processing/src/test/java/io/druid/query/aggregation/last/DoubleLastAggregationTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/last/DoubleLastAggregationTest.java @@ -62,9 +62,9 @@ public void setup() valueSelector = new TestDoubleColumnSelectorImpl(doubles); objectSelector = new TestObjectColumnSelector<>(pairs); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); - EasyMock.expect(colSelectorFactory.makeDoubleColumnSelector("nilly")).andReturn(valueSelector); - EasyMock.expect(colSelectorFactory.makeObjectColumnSelector("billy")).andReturn(objectSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(valueSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("billy")).andReturn(objectSelector); EasyMock.replay(colSelectorFactory); } diff --git a/processing/src/test/java/io/druid/query/aggregation/last/FloatLastAggregationTest.java b/processing/src/test/java/io/druid/query/aggregation/last/FloatLastAggregationTest.java index 757e02e8e915..1e1215aea896 100644 --- a/processing/src/test/java/io/druid/query/aggregation/last/FloatLastAggregationTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/last/FloatLastAggregationTest.java @@ -62,9 +62,9 @@ public void setup() valueSelector = new TestFloatColumnSelector(floats); objectSelector = new TestObjectColumnSelector<>(pairs); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); - EasyMock.expect(colSelectorFactory.makeFloatColumnSelector("nilly")).andReturn(valueSelector); - EasyMock.expect(colSelectorFactory.makeObjectColumnSelector("billy")).andReturn(objectSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(valueSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("billy")).andReturn(objectSelector); EasyMock.replay(colSelectorFactory); } diff --git a/processing/src/test/java/io/druid/query/aggregation/last/LongLastAggregationTest.java b/processing/src/test/java/io/druid/query/aggregation/last/LongLastAggregationTest.java index 855daa2a29f1..389d6b12f25d 100644 --- a/processing/src/test/java/io/druid/query/aggregation/last/LongLastAggregationTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/last/LongLastAggregationTest.java @@ -61,9 +61,9 @@ public void setup() valueSelector = new TestLongColumnSelector(longValues); objectSelector = new TestObjectColumnSelector<>(pairs); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeLongColumnSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); - EasyMock.expect(colSelectorFactory.makeLongColumnSelector("nilly")).andReturn(valueSelector); - EasyMock.expect(colSelectorFactory.makeObjectColumnSelector("billy")).andReturn(objectSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector(Column.TIME_COLUMN_NAME)).andReturn(timeSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(valueSelector); + EasyMock.expect(colSelectorFactory.makeColumnValueSelector("billy")).andReturn(objectSelector); EasyMock.replay(colSelectorFactory); } diff --git a/processing/src/test/java/io/druid/query/aggregation/post/FinalizingFieldAccessPostAggregatorTest.java b/processing/src/test/java/io/druid/query/aggregation/post/FinalizingFieldAccessPostAggregatorTest.java index d7d7c6643586..8a3f64f2bd0b 100644 --- a/processing/src/test/java/io/druid/query/aggregation/post/FinalizingFieldAccessPostAggregatorTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/post/FinalizingFieldAccessPostAggregatorTest.java @@ -235,8 +235,8 @@ public void testIngestAndQueryWithArithmeticPostAggregator() throws Exception ); MapBasedRow row = (MapBasedRow) Sequences.toList(seq, Lists.newArrayList()).get(0); - Assert.assertEquals(3.0, row.getFloatMetric("hll_market"), 0.1); - Assert.assertEquals(9.0, row.getFloatMetric("hll_quality"), 0.1); - Assert.assertEquals(12.0, row.getFloatMetric("uniq_add"), 0.1); + Assert.assertEquals(3.0, row.getMetric("hll_market").floatValue(), 0.1); + Assert.assertEquals(9.0, row.getMetric("hll_quality").floatValue(), 0.1); + Assert.assertEquals(12.0, row.getMetric("uniq_add").floatValue(), 0.1); } } diff --git a/processing/src/test/java/io/druid/query/dimension/TestDimensionSelector.java b/processing/src/test/java/io/druid/query/dimension/TestDimensionSelector.java index a105b6e2378d..1613b005a858 100644 --- a/processing/src/test/java/io/druid/query/dimension/TestDimensionSelector.java +++ b/processing/src/test/java/io/druid/query/dimension/TestDimensionSelector.java @@ -94,6 +94,19 @@ public int lookupId(String name) }; } + @Nullable + @Override + public Object getObject() + { + return defaultGetObject(); + } + + @Override + public Class classOfObject() + { + return Object.class; + } + @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { diff --git a/processing/src/test/java/io/druid/query/groupby/GroupByQueryRunnerTest.java b/processing/src/test/java/io/druid/query/groupby/GroupByQueryRunnerTest.java index 07a9e902eb82..dcb64932e9f5 100644 --- a/processing/src/test/java/io/druid/query/groupby/GroupByQueryRunnerTest.java +++ b/processing/src/test/java/io/druid/query/groupby/GroupByQueryRunnerTest.java @@ -47,7 +47,6 @@ import io.druid.java.util.common.guava.MergeSequence; import io.druid.java.util.common.guava.Sequence; import io.druid.java.util.common.guava.Sequences; -import io.druid.java.util.common.parsers.ParseException; import io.druid.js.JavaScriptConfig; import io.druid.query.BySegmentResultValue; import io.druid.query.BySegmentResultValueClass; @@ -2764,7 +2763,7 @@ public void testMergeResultsWithOrderBy() @Override public int compare(Row o1, Row o2) { - return Float.compare(o1.getFloatMetric("idx"), o2.getFloatMetric("idx")); + return Float.compare(o1.getMetric("idx").floatValue(), o2.getMetric("idx").floatValue()); } }; @@ -2775,7 +2774,7 @@ public int compare(Row o1, Row o2) @Override public int compare(Row o1, Row o2) { - int value = Float.compare(o1.getFloatMetric("rows"), o2.getFloatMetric("rows")); + int value = Float.compare(o1.getMetric("rows").floatValue(), o2.getMetric("rows").floatValue()); if (value != 0) { return value; } @@ -3321,8 +3320,8 @@ public void testGroupByWithHavingOnHyperUnique() // havingSpec equalTo/greaterThan/lessThan do not work on complex aggregators, even if they could be finalized. // See also: https://github.com/druid-io/druid/issues/2507 - expectedException.expect(ParseException.class); - expectedException.expectMessage("Unknown type[class io.druid.hll.HLLCV1]"); + expectedException.expect(ISE.class); + expectedException.expectMessage("Unknown type of metric value"); Iterable results = GroupByQueryRunnerTestHelper.runQuery(factory, runner, query); TestHelper.assertExpectedObjects(expectedResults, results, "order-limit"); } @@ -5121,7 +5120,7 @@ public void testSubqueryWithPostAggregatorsAndHaving() @Override public boolean eval(Row row) { - return (row.getFloatMetric("idx_subpostagg") < 3800); + return (row.getMetric("idx_subpostagg").floatValue() < 3800); } } ) @@ -5386,7 +5385,7 @@ public void testSubqueryWithMultiColumnAggregators() @Override public boolean eval(Row row) { - return (row.getFloatMetric("idx_subpostagg") < 3800); + return (row.getMetric("idx_subpostagg").floatValue() < 3800); } } ) diff --git a/processing/src/test/java/io/druid/query/groupby/epinephelinae/ConcurrentGrouperTest.java b/processing/src/test/java/io/druid/query/groupby/epinephelinae/ConcurrentGrouperTest.java index 396707ee287a..30b65721dd76 100644 --- a/processing/src/test/java/io/druid/query/groupby/epinephelinae/ConcurrentGrouperTest.java +++ b/processing/src/test/java/io/druid/query/groupby/epinephelinae/ConcurrentGrouperTest.java @@ -31,11 +31,8 @@ import io.druid.query.groupby.epinephelinae.Grouper.KeySerde; import io.druid.query.groupby.epinephelinae.Grouper.KeySerdeFactory; import io.druid.segment.ColumnSelectorFactory; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.column.ColumnCapabilities; import org.junit.AfterClass; import org.junit.Test; @@ -160,19 +157,7 @@ public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec) } @Override - public FloatColumnSelector makeFloatColumnSelector(String columnName) - { - return null; - } - - @Override - public LongColumnSelector makeLongColumnSelector(String columnName) - { - return null; - } - - @Override - public ObjectColumnSelector makeObjectColumnSelector(String columnName) + public ColumnValueSelector makeColumnValueSelector(String columnName) { return null; } @@ -182,12 +167,6 @@ public ColumnCapabilities getColumnCapabilities(String columnName) { return null; } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName) - { - return null; - } }; @Test(timeout = 5000L) diff --git a/processing/src/test/java/io/druid/query/groupby/epinephelinae/TestColumnSelectorFactory.java b/processing/src/test/java/io/druid/query/groupby/epinephelinae/TestColumnSelectorFactory.java index a022d7a73c72..8428981da063 100644 --- a/processing/src/test/java/io/druid/query/groupby/epinephelinae/TestColumnSelectorFactory.java +++ b/processing/src/test/java/io/druid/query/groupby/epinephelinae/TestColumnSelectorFactory.java @@ -21,17 +21,14 @@ import io.druid.data.input.Row; import io.druid.query.dimension.DimensionSpec; +import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.ColumnSelectorFactory; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; -import io.druid.segment.TestDoubleColumnSelector; -import io.druid.segment.TestFloatColumnSelector; -import io.druid.segment.TestLongColumnSelector; import io.druid.segment.column.ColumnCapabilities; +import javax.annotation.Nullable; + public class TestColumnSelectorFactory implements ColumnSelectorFactory { private ThreadLocal row = new ThreadLocal<>(); @@ -48,46 +45,45 @@ public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec) } @Override - public FloatColumnSelector makeFloatColumnSelector(final String columnName) + public ColumnValueSelector makeColumnValueSelector(String columnName) { - return new TestFloatColumnSelector() + return new ColumnValueSelector() { + @Override + public double getDouble() + { + return row.get().getMetric(columnName).doubleValue(); + } + @Override public float getFloat() { - return row.get().getFloatMetric(columnName); + return row.get().getMetric(columnName).floatValue(); } - }; - } - @Override - public LongColumnSelector makeLongColumnSelector(final String columnName) - { - return new TestLongColumnSelector() - { @Override public long getLong() { - return row.get().getLongMetric(columnName); + return row.get().getMetric(columnName).longValue(); + } + + @Nullable + @Override + public Object getObject() + { + return row.get().getRaw(columnName); } - }; - } - @Override - public ObjectColumnSelector makeObjectColumnSelector(final String columnName) - { - return new ObjectColumnSelector() - { @Override - public Class classOfObject() + public Class classOfObject() { return Object.class; } @Override - public Object getObject() + public void inspectRuntimeShape(RuntimeShapeInspector inspector) { - return row.get().getRaw(columnName); + // don't inspect in tests } }; } @@ -97,17 +93,4 @@ public ColumnCapabilities getColumnCapabilities(String columnName) { return null; } - - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName) - { - return new TestDoubleColumnSelector() - { - @Override - public double getDouble() - { - return row.get().getFloatMetric(columnName); - } - }; - } } diff --git a/processing/src/main/java/io/druid/segment/ZeroLongColumnSelector.java b/processing/src/test/java/io/druid/segment/TestObjectColumnSelector.java similarity index 71% rename from processing/src/main/java/io/druid/segment/ZeroLongColumnSelector.java rename to processing/src/test/java/io/druid/segment/TestObjectColumnSelector.java index 7117b824a798..34dc1e1375cc 100644 --- a/processing/src/main/java/io/druid/segment/ZeroLongColumnSelector.java +++ b/processing/src/test/java/io/druid/segment/TestObjectColumnSelector.java @@ -21,29 +21,11 @@ import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -public final class ZeroLongColumnSelector implements LongColumnSelector +public abstract class TestObjectColumnSelector implements ObjectColumnSelector { - private static final ZeroLongColumnSelector INSTANCE = new ZeroLongColumnSelector(); - - private ZeroLongColumnSelector() - { - // No instantiation. - } - - public static ZeroLongColumnSelector instance() - { - return INSTANCE; - } - - @Override - public long getLong() - { - return 0; - } - @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { - // nothing to inspect + // Don't care about runtime shape in tests } } diff --git a/processing/src/test/java/io/druid/segment/data/IncrementalIndexTest.java b/processing/src/test/java/io/druid/segment/data/IncrementalIndexTest.java index 788c465e038a..cdcfd4118c38 100644 --- a/processing/src/test/java/io/druid/segment/data/IncrementalIndexTest.java +++ b/processing/src/test/java/io/druid/segment/data/IncrementalIndexTest.java @@ -388,22 +388,22 @@ public void testFilteredAggregators() throws Exception Assert.assertEquals(Arrays.asList("1"), row.getDimension("dim1")); Assert.assertEquals(Arrays.asList("2"), row.getDimension("dim2")); Assert.assertEquals(Arrays.asList("a", "b"), row.getDimension("dim3")); - Assert.assertEquals(1L, row.getLongMetric("count")); - Assert.assertEquals(1L, row.getLongMetric("count_selector_filtered")); - Assert.assertEquals(1L, row.getLongMetric("count_bound_filtered")); - Assert.assertEquals(1L, row.getLongMetric("count_multivaldim_filtered")); - Assert.assertEquals(0L, row.getLongMetric("count_numeric_filtered")); + Assert.assertEquals(1L, row.getMetric("count")); + Assert.assertEquals(1L, row.getMetric("count_selector_filtered")); + Assert.assertEquals(1L, row.getMetric("count_bound_filtered")); + Assert.assertEquals(1L, row.getMetric("count_multivaldim_filtered")); + Assert.assertEquals(0L, row.getMetric("count_numeric_filtered")); row = rows.next(); Assert.assertEquals(timestamp, row.getTimestampFromEpoch()); Assert.assertEquals(Arrays.asList("3"), row.getDimension("dim1")); Assert.assertEquals(Arrays.asList("4"), row.getDimension("dim2")); Assert.assertEquals(Arrays.asList("c", "d"), row.getDimension("dim3")); - Assert.assertEquals(1L, row.getLongMetric("count")); - Assert.assertEquals(0L, row.getLongMetric("count_selector_filtered")); - Assert.assertEquals(0L, row.getLongMetric("count_bound_filtered")); - Assert.assertEquals(0L, row.getLongMetric("count_multivaldim_filtered")); - Assert.assertEquals(1L, row.getLongMetric("count_numeric_filtered")); + Assert.assertEquals(1L, row.getMetric("count")); + Assert.assertEquals(0L, row.getMetric("count_selector_filtered")); + Assert.assertEquals(0L, row.getMetric("count_bound_filtered")); + Assert.assertEquals(0L, row.getMetric("count_multivaldim_filtered")); + Assert.assertEquals(1L, row.getMetric("count_numeric_filtered")); } @Test @@ -767,7 +767,7 @@ public void run() while (iterator.hasNext()) { Row row = iterator.next(); Assert.assertEquals(timestamp + (isRollup ? curr : curr / threadCount), row.getTimestampFromEpoch()); - Assert.assertEquals(Float.valueOf(isRollup ? threadCount : 1), (Float) row.getFloatMetric("count")); + Assert.assertEquals(isRollup ? threadCount : 1, row.getMetric("count").intValue()); curr++; } Assert.assertEquals(elementsPerThread * (isRollup ? 1 : threadCount), curr); diff --git a/processing/src/test/java/io/druid/segment/virtual/ExpressionObjectSelectorTest.java b/processing/src/test/java/io/druid/segment/virtual/ExpressionObjectSelectorTest.java index 272da8f504a4..d8fa31d538a6 100644 --- a/processing/src/test/java/io/druid/segment/virtual/ExpressionObjectSelectorTest.java +++ b/processing/src/test/java/io/druid/segment/virtual/ExpressionObjectSelectorTest.java @@ -22,8 +22,9 @@ import com.google.common.base.Supplier; import io.druid.common.guava.SettableSupplier; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; -import io.druid.segment.ObjectColumnSelector; +import io.druid.segment.TestObjectColumnSelector; import org.junit.Assert; import org.junit.Test; @@ -142,12 +143,12 @@ public void inspectRuntimeShape(final RuntimeShapeInspector inspector) }; } - private static ObjectColumnSelector objectSelectorFromSupplier( + private static ColumnValueSelector objectSelectorFromSupplier( final Supplier supplier, final Class clazz ) { - return new ObjectColumnSelector() + return new TestObjectColumnSelector() { @Override public Class classOfObject() diff --git a/processing/src/test/java/io/druid/segment/virtual/ExpressionVirtualColumnTest.java b/processing/src/test/java/io/druid/segment/virtual/ExpressionVirtualColumnTest.java index d8e0569fb6f4..c0f9030a7365 100644 --- a/processing/src/test/java/io/druid/segment/virtual/ExpressionVirtualColumnTest.java +++ b/processing/src/test/java/io/druid/segment/virtual/ExpressionVirtualColumnTest.java @@ -30,10 +30,10 @@ import io.druid.query.extraction.BucketExtractionFn; import io.druid.query.filter.ValueMatcher; import io.druid.query.groupby.epinephelinae.TestColumnSelectorFactory; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.DimensionSelector; -import io.druid.segment.FloatColumnSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.column.ValueType; import org.junit.Assert; import org.junit.Test; @@ -92,7 +92,7 @@ public class ExpressionVirtualColumnTest @Test public void testObjectSelector() { - final ObjectColumnSelector selector = XPLUSY.makeObjectColumnSelector("expr", COLUMN_SELECTOR_FACTORY); + final BaseObjectColumnValueSelector selector = XPLUSY.makeColumnValueSelector("expr", COLUMN_SELECTOR_FACTORY); COLUMN_SELECTOR_FACTORY.setRow(ROW0); Assert.assertEquals(null, selector.getObject()); @@ -110,7 +110,7 @@ public void testObjectSelector() @Test public void testLongSelector() { - final LongColumnSelector selector = XPLUSY.makeLongColumnSelector("expr", COLUMN_SELECTOR_FACTORY); + final BaseLongColumnValueSelector selector = XPLUSY.makeColumnValueSelector("expr", COLUMN_SELECTOR_FACTORY); COLUMN_SELECTOR_FACTORY.setRow(ROW0); Assert.assertEquals(0L, selector.getLong()); @@ -128,7 +128,7 @@ public void testLongSelector() @Test public void testLongSelectorUsingStringFunction() { - final LongColumnSelector selector = ZCONCATX.makeLongColumnSelector("expr", COLUMN_SELECTOR_FACTORY); + final BaseLongColumnValueSelector selector = ZCONCATX.makeColumnValueSelector("expr", COLUMN_SELECTOR_FACTORY); COLUMN_SELECTOR_FACTORY.setRow(ROW0); Assert.assertEquals(0L, selector.getLong()); @@ -146,7 +146,7 @@ public void testLongSelectorUsingStringFunction() @Test public void testFloatSelector() { - final FloatColumnSelector selector = XPLUSY.makeFloatColumnSelector("expr", COLUMN_SELECTOR_FACTORY); + final BaseFloatColumnValueSelector selector = XPLUSY.makeColumnValueSelector("expr", COLUMN_SELECTOR_FACTORY); COLUMN_SELECTOR_FACTORY.setRow(ROW0); Assert.assertEquals(0.0f, selector.getFloat(), 0.0f); @@ -265,7 +265,8 @@ public void testDimensionSelectorWithExtraction() @Test public void testLongSelectorWithConstantLikeExprMacro() { - final LongColumnSelector selector = CONSTANT_LIKE.makeLongColumnSelector("expr", COLUMN_SELECTOR_FACTORY); + final BaseLongColumnValueSelector selector = + CONSTANT_LIKE.makeColumnValueSelector("expr", COLUMN_SELECTOR_FACTORY); COLUMN_SELECTOR_FACTORY.setRow(ROW0); Assert.assertEquals(1L, selector.getLong()); @@ -274,7 +275,7 @@ public void testLongSelectorWithConstantLikeExprMacro() @Test public void testLongSelectorWithZLikeExprMacro() { - final LongColumnSelector selector = ZLIKE.makeLongColumnSelector("expr", COLUMN_SELECTOR_FACTORY); + final BaseLongColumnValueSelector selector = ZLIKE.makeColumnValueSelector("expr", COLUMN_SELECTOR_FACTORY); COLUMN_SELECTOR_FACTORY.setRow(ROW0); Assert.assertEquals(0L, selector.getLong()); diff --git a/processing/src/test/java/io/druid/segment/virtual/VirtualColumnsTest.java b/processing/src/test/java/io/druid/segment/virtual/VirtualColumnsTest.java index d6d6fad58b41..d6aa0fc517d2 100644 --- a/processing/src/test/java/io/druid/segment/virtual/VirtualColumnsTest.java +++ b/processing/src/test/java/io/druid/segment/virtual/VirtualColumnsTest.java @@ -31,17 +31,14 @@ import io.druid.query.extraction.ExtractionFn; import io.druid.query.filter.ValueMatcher; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; +import io.druid.segment.BaseFloatColumnValueSelector; +import io.druid.segment.BaseLongColumnValueSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.ColumnValueSelector; import io.druid.segment.DimensionSelector; import io.druid.segment.DimensionSelectorUtils; -import io.druid.segment.DoubleColumnSelector; -import io.druid.segment.FloatColumnSelector; import io.druid.segment.IdLookup; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; -import io.druid.segment.TestDoubleColumnSelector; -import io.druid.segment.TestFloatColumnSelector; import io.druid.segment.TestHelper; import io.druid.segment.TestLongColumnSelector; import io.druid.segment.VirtualColumn; @@ -84,14 +81,14 @@ public void testNonExistentSelector() expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("No such virtual column[bar]"); - virtualColumns.makeObjectColumnSelector("bar", null); + virtualColumns.makeColumnValueSelector("bar", null); } @Test public void testMakeSelectors() { final VirtualColumns virtualColumns = makeVirtualColumns(); - final ObjectColumnSelector objectSelector = virtualColumns.makeObjectColumnSelector("expr", null); + final BaseObjectColumnValueSelector objectSelector = virtualColumns.makeColumnValueSelector("expr", null); final DimensionSelector dimensionSelector = virtualColumns.makeDimensionSelector( new DefaultDimensionSpec("expr", "x"), null @@ -100,8 +97,8 @@ public void testMakeSelectors() new ExtractionDimensionSpec("expr", "x", new BucketExtractionFn(1.0, 0.5)), null ); - final FloatColumnSelector floatSelector = virtualColumns.makeFloatColumnSelector("expr", null); - final LongColumnSelector longSelector = virtualColumns.makeLongColumnSelector("expr", null); + final BaseFloatColumnValueSelector floatSelector = virtualColumns.makeColumnValueSelector("expr", null); + final BaseLongColumnValueSelector longSelector = virtualColumns.makeColumnValueSelector("expr", null); Assert.assertEquals(1L, objectSelector.getObject()); Assert.assertEquals("1", dimensionSelector.lookupName(dimensionSelector.getRow().get(0))); @@ -114,13 +111,13 @@ public void testMakeSelectors() public void testMakeSelectorsWithDotSupport() { final VirtualColumns virtualColumns = makeVirtualColumns(); - final ObjectColumnSelector objectSelector = virtualColumns.makeObjectColumnSelector("foo.5", null); + final BaseObjectColumnValueSelector objectSelector = virtualColumns.makeColumnValueSelector("foo.5", null); final DimensionSelector dimensionSelector = virtualColumns.makeDimensionSelector( new DefaultDimensionSpec("foo.5", "x"), null ); - final FloatColumnSelector floatSelector = virtualColumns.makeFloatColumnSelector("foo.5", null); - final LongColumnSelector longSelector = virtualColumns.makeLongColumnSelector("foo.5", null); + final BaseFloatColumnValueSelector floatSelector = virtualColumns.makeColumnValueSelector("foo.5", null); + final BaseLongColumnValueSelector longSelector = virtualColumns.makeColumnValueSelector("foo.5", null); Assert.assertEquals(5L, objectSelector.getObject()); Assert.assertEquals("5", dimensionSelector.lookupName(dimensionSelector.getRow().get(0))); @@ -132,13 +129,13 @@ public void testMakeSelectorsWithDotSupport() public void testMakeSelectorsWithDotSupportBaseNameOnly() { final VirtualColumns virtualColumns = makeVirtualColumns(); - final ObjectColumnSelector objectSelector = virtualColumns.makeObjectColumnSelector("foo", null); + final BaseObjectColumnValueSelector objectSelector = virtualColumns.makeColumnValueSelector("foo", null); final DimensionSelector dimensionSelector = virtualColumns.makeDimensionSelector( new DefaultDimensionSpec("foo", "x"), null ); - final FloatColumnSelector floatSelector = virtualColumns.makeFloatColumnSelector("foo", null); - final LongColumnSelector longSelector = virtualColumns.makeLongColumnSelector("foo", null); + final BaseFloatColumnValueSelector floatSelector = virtualColumns.makeColumnValueSelector("foo", null); + final BaseLongColumnValueSelector longSelector = virtualColumns.makeColumnValueSelector("foo", null); Assert.assertEquals(-1L, objectSelector.getObject()); Assert.assertEquals("-1", dimensionSelector.lookupName(dimensionSelector.getRow().get(0))); @@ -306,30 +303,10 @@ public String getOutputName() return name; } - @Override - public ObjectColumnSelector makeObjectColumnSelector(String columnName, ColumnSelectorFactory factory) - { - final LongColumnSelector selector = makeLongColumnSelector(columnName, factory); - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Long.class; - } - - @Override - public Object getObject() - { - return selector.getLong(); - } - }; - } - @Override public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec, ColumnSelectorFactory factory) { - final LongColumnSelector selector = makeLongColumnSelector(dimensionSpec.getDimension(), factory); + final BaseLongColumnValueSelector selector = makeColumnValueSelector(dimensionSpec.getDimension(), factory); final ExtractionFn extractionFn = dimensionSpec.getExtractionFn(); final DimensionSelector dimensionSelector = new DimensionSelector() { @@ -389,27 +366,26 @@ public void inspectRuntimeShape(RuntimeShapeInspector inspector) { // Don't care about runtime shape in tests } - }; - return dimensionSpec.decorate(dimensionSelector); - } + @Nullable + @Override + public Object getObject() + { + return lookupName(0); + } - @Override - public FloatColumnSelector makeFloatColumnSelector(String columnName, ColumnSelectorFactory factory) - { - final ColumnValueSelector selector = makeLongColumnSelector(columnName, factory); - return new TestFloatColumnSelector() - { @Override - public float getFloat() + public Class classOfObject() { - return selector.getFloat(); + return String.class; } }; + + return dimensionSpec.decorate(dimensionSelector); } @Override - public LongColumnSelector makeLongColumnSelector(String columnName, ColumnSelectorFactory factory) + public ColumnValueSelector makeColumnValueSelector(String columnName, ColumnSelectorFactory factory) { final String subColumn = VirtualColumns.splitColumnName(columnName).rhs; final Long boxed = subColumn == null ? null : Longs.tryParse(subColumn); @@ -424,21 +400,6 @@ public long getLong() }; } - @Override - public DoubleColumnSelector makeDoubleColumnSelector(String columnName, ColumnSelectorFactory factory) - { - final ColumnValueSelector selector = makeLongColumnSelector(columnName, factory); - return new TestDoubleColumnSelector() - { - - @Override - public double getDouble() - { - return selector.getDouble(); - } - }; - } - @Override public ColumnCapabilities capabilities(String columnName) { diff --git a/server/src/main/java/io/druid/segment/realtime/firehose/IngestSegmentFirehose.java b/server/src/main/java/io/druid/segment/realtime/firehose/IngestSegmentFirehose.java index 2d114ef66b86..c0860af83d53 100644 --- a/server/src/main/java/io/druid/segment/realtime/firehose/IngestSegmentFirehose.java +++ b/server/src/main/java/io/druid/segment/realtime/firehose/IngestSegmentFirehose.java @@ -35,10 +35,10 @@ import io.druid.query.dimension.DefaultDimensionSpec; import io.druid.query.filter.DimFilter; import io.druid.query.select.EventHolder; +import io.druid.segment.BaseLongColumnValueSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.Cursor; import io.druid.segment.DimensionSelector; -import io.druid.segment.LongColumnSelector; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.VirtualColumns; import io.druid.segment.column.Column; import io.druid.segment.data.IndexedInts; @@ -85,8 +85,8 @@ public Sequence apply(WindowedStorageAdapter adapter) @Override public Sequence apply(final Cursor cursor) { - final LongColumnSelector timestampColumnSelector = - cursor.getColumnSelectorFactory().makeLongColumnSelector(Column.TIME_COLUMN_NAME); + final BaseLongColumnValueSelector timestampColumnSelector = + cursor.getColumnSelectorFactory().makeColumnValueSelector(Column.TIME_COLUMN_NAME); final Map dimSelectors = Maps.newHashMap(); for (String dim : dims) { @@ -99,13 +99,11 @@ public Sequence apply(final Cursor cursor) } } - final Map metSelectors = Maps.newHashMap(); + final Map metSelectors = Maps.newHashMap(); for (String metric : metrics) { - final ObjectColumnSelector metricSelector = - cursor.getColumnSelectorFactory().makeObjectColumnSelector(metric); - if (metricSelector != null) { - metSelectors.put(metric, metricSelector); - } + final BaseObjectColumnValueSelector metricSelector = + cursor.getColumnSelectorFactory().makeColumnValueSelector(metric); + metSelectors.put(metric, metricSelector); } return Sequences.simple( @@ -129,7 +127,8 @@ public InputRow next() final long timestamp = timestampColumnSelector.getLong(); theEvent.put(EventHolder.timestampKey, DateTimes.utc(timestamp)); - for (Map.Entry dimSelector : dimSelectors.entrySet()) { + for (Map.Entry dimSelector : + dimSelectors.entrySet()) { final String dim = dimSelector.getKey(); final DimensionSelector selector = dimSelector.getValue(); final IndexedInts vals = selector.getRow(); @@ -146,10 +145,14 @@ public InputRow next() } } - for (Map.Entry metSelector : metSelectors.entrySet()) { + for (Map.Entry metSelector : + metSelectors.entrySet()) { final String metric = metSelector.getKey(); - final ObjectColumnSelector selector = metSelector.getValue(); - theEvent.put(metric, selector.getObject()); + final BaseObjectColumnValueSelector selector = metSelector.getValue(); + Object value = selector.getObject(); + if (value != null) { + theEvent.put(metric, value); + } } cursor.advance(); return new MapBasedInputRow(timestamp, dims, theEvent); diff --git a/server/src/main/java/io/druid/segment/realtime/firehose/WikipediaIrcDecoder.java b/server/src/main/java/io/druid/segment/realtime/firehose/WikipediaIrcDecoder.java index 813a638739ce..1436b1d2b4bd 100644 --- a/server/src/main/java/io/druid/segment/realtime/firehose/WikipediaIrcDecoder.java +++ b/server/src/main/java/io/druid/segment/realtime/firehose/WikipediaIrcDecoder.java @@ -283,25 +283,12 @@ public Object getRaw(String dimension) return dimensions.get(dimension); } - - @Override - public double getDoubleMetric(String metric) - { - return new Double(metrics.get(metric)).doubleValue(); - } - @Override - public float getFloatMetric(String metric) + public Number getMetric(String metric) { return metrics.get(metric); } - @Override - public long getLongMetric(String metric) - { - return new Float(metrics.get(metric)).longValue(); - } - @Override public int compareTo(Row o) { diff --git a/server/src/test/java/io/druid/realtime/firehose/CombiningFirehoseFactoryTest.java b/server/src/test/java/io/druid/realtime/firehose/CombiningFirehoseFactoryTest.java index c44f7b80efe9..ea57a8d8e848 100644 --- a/server/src/test/java/io/druid/realtime/firehose/CombiningFirehoseFactoryTest.java +++ b/server/src/test/java/io/druid/realtime/firehose/CombiningFirehoseFactoryTest.java @@ -58,7 +58,7 @@ public void testCombiningfirehose() throws IOException Assert.assertTrue(firehose.hasMore()); final InputRow inputRow = firehose.nextRow(); Assert.assertEquals(i, inputRow.getTimestampFromEpoch()); - Assert.assertEquals(i, inputRow.getFloatMetric("test"), 0); + Assert.assertEquals(i, inputRow.getMetric("test").floatValue(), 0); } Assert.assertFalse(firehose.hasMore()); } @@ -92,24 +92,11 @@ public List getDimension(String dimension) } @Override - public float getFloatMetric(String metric) + public Number getMetric(String metric) { return metricValue; } - @Override - public long getLongMetric(String metric) - { - return new Float(metricValue).longValue(); - } - - @Override - public double getDoubleMetric(String metric) - { - return new Float(metricValue).doubleValue(); - } - - @Override public Object getRaw(String dimension) { diff --git a/server/src/test/java/io/druid/segment/realtime/RealtimeManagerTest.java b/server/src/test/java/io/druid/segment/realtime/RealtimeManagerTest.java index f71739b50a1f..cf4f9e6e90a9 100644 --- a/server/src/test/java/io/druid/segment/realtime/RealtimeManagerTest.java +++ b/server/src/test/java/io/druid/segment/realtime/RealtimeManagerTest.java @@ -823,23 +823,11 @@ public List getDimension(String dimension) } @Override - public float getFloatMetric(String metric) + public Number getMetric(String metric) { return 0; } - @Override - public long getLongMetric(String metric) - { - return 0L; - } - - @Override - public double getDoubleMetric(String metric) - { - return 0.0d; - } - @Override public Object getRaw(String dimension) { diff --git a/server/src/test/java/io/druid/segment/realtime/plumber/RealtimePlumberSchoolTest.java b/server/src/test/java/io/druid/segment/realtime/plumber/RealtimePlumberSchoolTest.java index 5f1586a0d677..a0015353b015 100644 --- a/server/src/test/java/io/druid/segment/realtime/plumber/RealtimePlumberSchoolTest.java +++ b/server/src/test/java/io/druid/segment/realtime/plumber/RealtimePlumberSchoolTest.java @@ -596,19 +596,7 @@ public List getDimension(String dimension) } @Override - public float getFloatMetric(String metric) - { - return 0; - } - - @Override - public long getLongMetric(String metric) - { - return 0L; - } - - @Override - public double getDoubleMetric(String metric) + public Number getMetric(String metric) { return 0; } @@ -656,29 +644,17 @@ public List getDimension(String dimension) } @Override - public float getFloatMetric(String metric) + public Number getMetric(String metric) { return 0; } - @Override - public long getLongMetric(String metric) - { - return 0L; - } - @Override public Object getRaw(String dimension) { return dimVals; } - @Override - public double getDoubleMetric(String metric) - { - return 0; - } - @Override public int compareTo(Row o) { diff --git a/server/src/test/java/io/druid/segment/realtime/plumber/SinkTest.java b/server/src/test/java/io/druid/segment/realtime/plumber/SinkTest.java index b84d154b2f07..291a5e8aa4b7 100644 --- a/server/src/test/java/io/druid/segment/realtime/plumber/SinkTest.java +++ b/server/src/test/java/io/druid/segment/realtime/plumber/SinkTest.java @@ -112,23 +112,11 @@ public List getDimension(String dimension) } @Override - public float getFloatMetric(String metric) + public Number getMetric(String metric) { return 0; } - @Override - public long getLongMetric(String metric) - { - return 0L; - } - - @Override - public double getDoubleMetric(String metric) - { - return 0.0d; - } - @Override public Object getRaw(String dimension) { @@ -177,23 +165,11 @@ public List getDimension(String dimension) } @Override - public float getFloatMetric(String metric) + public Number getMetric(String metric) { return 0; } - @Override - public long getLongMetric(String metric) - { - return 0L; - } - - @Override - public double getDoubleMetric(String metric) - { - return 0.0d; - } - @Override public Object getRaw(String dimension) { diff --git a/server/src/test/java/io/druid/timeline/partition/HashBasedNumberedShardSpecTest.java b/server/src/test/java/io/druid/timeline/partition/HashBasedNumberedShardSpecTest.java index e7688a52de99..5798083c0454 100644 --- a/server/src/test/java/io/druid/timeline/partition/HashBasedNumberedShardSpecTest.java +++ b/server/src/test/java/io/druid/timeline/partition/HashBasedNumberedShardSpecTest.java @@ -237,23 +237,11 @@ public Object getRaw(String s) } @Override - public float getFloatMetric(String s) + public Number getMetric(String metric) { return 0; } - @Override - public long getLongMetric(String s) - { - return 0L; - } - - @Override - public double getDoubleMetric(String metric) - { - return 0.0d; - } - @Override public int compareTo(Row o) { diff --git a/services/src/main/java/io/druid/cli/DumpSegment.java b/services/src/main/java/io/druid/cli/DumpSegment.java index 9bd8697aae71..794e9181cbae 100644 --- a/services/src/main/java/io/druid/cli/DumpSegment.java +++ b/services/src/main/java/io/druid/cli/DumpSegment.java @@ -61,17 +61,16 @@ import io.druid.query.QueryRunnerFactoryConglomerate; import io.druid.query.SegmentDescriptor; import io.druid.query.TableDataSource; -import io.druid.query.dimension.DefaultDimensionSpec; import io.druid.query.filter.DimFilter; import io.druid.query.metadata.metadata.ListColumnIncluderator; import io.druid.query.metadata.metadata.SegmentAnalysis; import io.druid.query.metadata.metadata.SegmentMetadataQuery; +import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.query.spec.SpecificSegmentSpec; -import io.druid.segment.ColumnSelectorFactory; +import io.druid.segment.BaseObjectColumnValueSelector; +import io.druid.segment.ColumnValueSelector; import io.druid.segment.Cursor; -import io.druid.segment.DimensionSelector; import io.druid.segment.IndexIO; -import io.druid.segment.ObjectColumnSelector; import io.druid.segment.QueryableIndex; import io.druid.segment.QueryableIndexSegment; import io.druid.segment.QueryableIndexStorageAdapter; @@ -81,7 +80,6 @@ import io.druid.segment.column.ColumnConfig; import io.druid.segment.data.BitmapSerdeFactory; import io.druid.segment.data.ConciseBitmapSerdeFactory; -import io.druid.segment.data.IndexedInts; import io.druid.segment.data.RoaringBitmapSerdeFactory; import io.druid.segment.filter.Filters; import org.joda.time.DateTime; @@ -89,10 +87,12 @@ import org.joda.time.chrono.ISOChronology; import org.roaringbitmap.IntIterator; +import javax.annotation.Nullable; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.Arrays; import java.util.EnumSet; import java.util.List; import java.util.Map; @@ -275,12 +275,12 @@ public Object apply(final OutputStream out) @Override public Object apply(Cursor cursor) { - final List selectors = Lists.newArrayList(); + final List selectors = Lists.newArrayList(); for (String columnName : columnNames) { - selectors.add( - makeSelector(columnName, index.getColumn(columnName), cursor.getColumnSelectorFactory()) - ); + ColumnValueSelector selector = + cursor.getColumnSelectorFactory().makeColumnValueSelector(columnName); + selectors.add(new ListObjectSelector(selector)); } while (!cursor.isDone()) { @@ -502,84 +502,55 @@ public Object accumulate(Object accumulated, T in) ); } - private static ObjectColumnSelector makeSelector( - final String columnName, - final Column column, - final ColumnSelectorFactory columnSelectorFactory - ) + private static class ListObjectSelector implements ColumnValueSelector { - final ObjectColumnSelector selector; + private final ColumnValueSelector delegate; - if (column.getDictionaryEncoding() != null) { - // Special case for dimensions -> always wrap multi-value in arrays - final DimensionSelector dimensionSelector = columnSelectorFactory.makeDimensionSelector( - new DefaultDimensionSpec(columnName, columnName) - ); - if (column.getDictionaryEncoding().hasMultipleValues()) { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return List.class; - } + private ListObjectSelector(ColumnValueSelector delegate) + { + this.delegate = delegate; + } - @Override - public List getObject() - { - final IndexedInts row = dimensionSelector.getRow(); - if (row.size() == 0) { - return null; - } else { - final List retVal = Lists.newArrayList(); - for (int i = 0; i < row.size(); i++) { - retVal.add(dimensionSelector.lookupName(row.get(i))); - } - return retVal; - } - } - }; - } else { - return new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return String.class; - } + @Override + public double getDouble() + { + return delegate.getDouble(); + } - @Override - public String getObject() - { - final IndexedInts row = dimensionSelector.getRow(); - return row.size() == 0 ? null : dimensionSelector.lookupName(row.get(0)); - } - }; - } - } else { - final ObjectColumnSelector maybeSelector = columnSelectorFactory.makeObjectColumnSelector(columnName); - if (maybeSelector != null) { - selector = maybeSelector; - } else { - // Selector failed to create (unrecognized column type?) - log.warn("Could not create selector for column[%s], returning null.", columnName); - selector = new ObjectColumnSelector() - { - @Override - public Class classOfObject() - { - return Object.class; - } + @Override + public float getFloat() + { + return delegate.getFloat(); + } - @Override - public Object getObject() - { - return null; - } - }; + @Override + public long getLong() + { + return delegate.getLong(); + } + + @Nullable + @Override + public Object getObject() + { + Object object = delegate.getObject(); + if (object instanceof String[]) { + return Arrays.asList((String[]) object); + } else { + return object; } } - return selector; + @Override + public Class classOfObject() + { + return Object.class; + } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("delegate", delegate); + } } } From 31226c973482b0416d5b977f087d5c3d68298aca Mon Sep 17 00:00:00 2001 From: leventov Date: Sun, 1 Oct 2017 19:29:02 -0500 Subject: [PATCH 02/13] Fix MapVirtualColumn.makeColumnValueSelector() --- .../io/druid/segment/MapVirtualColumn.java | 131 +++++++++++++++++- 1 file changed, 130 insertions(+), 1 deletion(-) diff --git a/extensions-contrib/virtual-columns/src/main/java/io/druid/segment/MapVirtualColumn.java b/extensions-contrib/virtual-columns/src/main/java/io/druid/segment/MapVirtualColumn.java index e5485a0cc506..c17b219a0389 100644 --- a/extensions-contrib/virtual-columns/src/main/java/io/druid/segment/MapVirtualColumn.java +++ b/extensions-contrib/virtual-columns/src/main/java/io/druid/segment/MapVirtualColumn.java @@ -23,16 +23,23 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Maps; import com.metamx.common.StringUtils; +import io.druid.query.dimension.DefaultDimensionSpec; import io.druid.query.dimension.DimensionSpec; import io.druid.query.filter.DimFilterUtils; +import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.column.ColumnCapabilities; import io.druid.segment.column.ColumnCapabilitiesImpl; import io.druid.segment.column.ValueType; +import io.druid.segment.data.IndexedInts; import io.druid.segment.virtual.VirtualColumnCacheHelper; +import javax.annotation.Nullable; import java.nio.ByteBuffer; import java.util.List; +import java.util.Map; +import java.util.Objects; /** */ @@ -68,7 +75,129 @@ public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec, Colu @Override public ColumnValueSelector makeColumnValueSelector(String columnName, ColumnSelectorFactory factory) { - return NilColumnValueSelector.instance(); + final DimensionSelector keySelector = factory.makeDimensionSelector(DefaultDimensionSpec.of(keyDimension)); + final DimensionSelector valueSelector = factory.makeDimensionSelector(DefaultDimensionSpec.of(valueDimension)); + + final String subColumnName = VirtualColumns.splitColumnName(columnName).rhs; + + if (subColumnName == null) { + return new MapVirtualColumnValueSelector(keySelector, valueSelector) + { + @Override + public Class classOfObject() + { + return Map.class; + } + + @Override + public Map getObject() + { + final IndexedInts keyIndices = keySelector.getRow(); + final IndexedInts valueIndices = valueSelector.getRow(); + final int limit = Math.min(keyIndices.size(), valueIndices.size()); + final Map map = Maps.newHashMapWithExpectedSize(limit); + for (int i = 0; i < limit; i++) { + map.put( + keySelector.lookupName(keyIndices.get(i)), + valueSelector.lookupName(valueIndices.get(i)) + ); + } + return map; + } + }; + } + + IdLookup keyIdLookup = keySelector.idLookup(); + if (keyIdLookup != null) { + final int keyId = keyIdLookup.lookupId(subColumnName); + if (keyId < 0) { + return NilColumnValueSelector.instance(); + } + return new MapVirtualColumnValueSelector(keySelector, valueSelector) + { + @Override + public Class classOfObject() + { + return String.class; + } + + @Nullable + @Override + public String getObject() + { + final IndexedInts keyIndices = keySelector.getRow(); + final IndexedInts valueIndices = valueSelector.getRow(); + final int limit = Math.min(keyIndices.size(), valueIndices.size()); + for (int i = 0; i < limit; i++) { + if (keyIndices.get(i) == keyId) { + return valueSelector.lookupName(valueIndices.get(i)); + } + } + return null; + } + }; + } else { + return new MapVirtualColumnValueSelector(keySelector, valueSelector) + { + @Override + public Class classOfObject() + { + return String.class; + } + + @Nullable + @Override + public String getObject() + { + final IndexedInts keyIndices = keySelector.getRow(); + final IndexedInts valueIndices = valueSelector.getRow(); + final int limit = Math.min(keyIndices.size(), valueIndices.size()); + for (int i = 0; i < limit; i++) { + if (Objects.equals(keySelector.lookupName(keyIndices.get(i)), subColumnName)) { + return valueSelector.lookupName(valueIndices.get(i)); + } + } + return null; + } + }; + } + } + + private static abstract class MapVirtualColumnValueSelector implements ColumnValueSelector + { + final DimensionSelector keySelector; + final DimensionSelector valueSelector; + + private MapVirtualColumnValueSelector(DimensionSelector keySelector, DimensionSelector valueSelector) + { + this.keySelector = keySelector; + this.valueSelector = valueSelector; + } + + @Override + public double getDouble() + { + return 0.0; + } + + @Override + public float getFloat() + { + return 0.0f; + } + + @Override + public long getLong() + { + return 0L; + } + + @Override + public void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + inspector.visit("keySelector", keySelector); + inspector.visit("valueSelector", valueSelector); + } } @Override From c843943ab9d923de42f551bc09b2f079415a9486 Mon Sep 17 00:00:00 2001 From: leventov Date: Sun, 1 Oct 2017 19:54:08 -0500 Subject: [PATCH 03/13] Minor fixes --- .../main/java/io/druid/query/select/SelectQueryEngine.java | 6 +++--- .../src/main/java/io/druid/segment/DimensionSelector.java | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/processing/src/main/java/io/druid/query/select/SelectQueryEngine.java b/processing/src/main/java/io/druid/query/select/SelectQueryEngine.java index 17bea96cdd9a..54a38a5fd027 100644 --- a/processing/src/main/java/io/druid/query/select/SelectQueryEngine.java +++ b/processing/src/main/java/io/druid/query/select/SelectQueryEngine.java @@ -93,17 +93,17 @@ public SelectColumnSelectorStrategy makeColumnSelectorStrategy( public interface SelectColumnSelectorStrategy extends ColumnSelectorStrategy { /** - * Read the current row from dimSelector and add the row values for a dimension to the result map. + * Read the current row from selector and add the row values for a dimension to the result map. * * Multi-valued rows should be added to the result as a List, single value rows should be added as a single object. * * @param outputName Output name for this dimension in the select query being served - * @param dimSelector Dimension value selector + * @param selector Dimension value selector * @param resultMap Row value map for the current row being retrieved by the select query */ void addRowValuesToSelectResult( String outputName, - ValueSelectorType dimSelector, + ValueSelectorType selector, Map resultMap ); } diff --git a/processing/src/main/java/io/druid/segment/DimensionSelector.java b/processing/src/main/java/io/druid/segment/DimensionSelector.java index 5ba5221afead..2a4f12340084 100644 --- a/processing/src/main/java/io/druid/segment/DimensionSelector.java +++ b/processing/src/main/java/io/druid/segment/DimensionSelector.java @@ -148,6 +148,10 @@ default long getLong() throw new UnsupportedOperationException("DimensionSelector cannot be operated as numeric ColumnValueSelector"); } + /** + * This method is not the default implementation of {@link #getObject()} to minimize the chance that implementations + * "forget" to override it with more optimized version. + */ @Nullable default Object defaultGetObject() { From 58a7fb3d41a66072ef35c1fe25c3ab7cefde3a8f Mon Sep 17 00:00:00 2001 From: leventov Date: Sun, 1 Oct 2017 21:35:14 -0500 Subject: [PATCH 04/13] Fix IndexGeneratorCombinerTest --- .../java/io/druid/indexer/IndexGeneratorCombinerTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/indexing-hadoop/src/test/java/io/druid/indexer/IndexGeneratorCombinerTest.java b/indexing-hadoop/src/test/java/io/druid/indexer/IndexGeneratorCombinerTest.java index 9d67ec19cb1a..f9ddd428e097 100644 --- a/indexing-hadoop/src/test/java/io/druid/indexer/IndexGeneratorCombinerTest.java +++ b/indexing-hadoop/src/test/java/io/druid/indexer/IndexGeneratorCombinerTest.java @@ -186,7 +186,7 @@ public void testMultipleRowsMerged() throws Exception Assert.assertEquals(Arrays.asList("host", "keywords"), capturedRow.getDimensions()); Assert.assertEquals(ImmutableList.of(), capturedRow.getDimension("host")); Assert.assertEquals(Arrays.asList("bar", "foo"), capturedRow.getDimension("keywords")); - Assert.assertEquals(15, capturedRow.getMetric("visited_sum")); + Assert.assertEquals(15, capturedRow.getMetric("visited_sum").longValue()); Assert.assertEquals( 2.0, (Double) HyperUniquesAggregatorFactory.estimateCardinality( @@ -256,7 +256,7 @@ public void testMultipleRowsNotMerged() throws Exception Assert.assertEquals(Arrays.asList("host", "keywords"), capturedRow1.getDimensions()); Assert.assertEquals(Collections.singletonList("host1"), capturedRow1.getDimension("host")); Assert.assertEquals(Arrays.asList("bar", "foo"), capturedRow1.getDimension("keywords")); - Assert.assertEquals(10, capturedRow1.getMetric("visited_sum")); + Assert.assertEquals(10, capturedRow1.getMetric("visited_sum").longValue()); Assert.assertEquals( 1.0, (Double) HyperUniquesAggregatorFactory.estimateCardinality(capturedRow1.getRaw("unique_hosts"), false), @@ -267,7 +267,7 @@ public void testMultipleRowsNotMerged() throws Exception Assert.assertEquals(Arrays.asList("host", "keywords"), capturedRow2.getDimensions()); Assert.assertEquals(Collections.singletonList("host2"), capturedRow2.getDimension("host")); Assert.assertEquals(Arrays.asList("bar", "foo"), capturedRow2.getDimension("keywords")); - Assert.assertEquals(5, capturedRow2.getMetric("visited_sum")); + Assert.assertEquals(5, capturedRow2.getMetric("visited_sum").longValue()); Assert.assertEquals( 1.0, (Double) HyperUniquesAggregatorFactory.estimateCardinality(capturedRow2.getRaw("unique_hosts"), false), From 6609d151714a7810cf63d44331f1f22580c6612a Mon Sep 17 00:00:00 2001 From: leventov Date: Mon, 2 Oct 2017 12:21:25 -0500 Subject: [PATCH 05/13] DimensionSelector to return zeros when treated as numeric ColumnValueSelector --- .../druid/segment/DimensionHandlerUtils.java | 6 ++++-- .../io/druid/segment/DimensionSelector.java | 18 ++++++------------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/processing/src/main/java/io/druid/segment/DimensionHandlerUtils.java b/processing/src/main/java/io/druid/segment/DimensionHandlerUtils.java index f8fade5d5663..c10ed586325f 100644 --- a/processing/src/main/java/io/druid/segment/DimensionHandlerUtils.java +++ b/processing/src/main/java/io/druid/segment/DimensionHandlerUtils.java @@ -237,6 +237,7 @@ private static Colu return strategyFactory.makeColumnSelectorStrategy(capabilities, selector); } + @Nullable public static Long convertObjectToLong(@Nullable Object valObj) { if (valObj == null) { @@ -254,6 +255,7 @@ public static Long convertObjectToLong(@Nullable Object valObj) } } + @Nullable public static Float convertObjectToFloat(@Nullable Object valObj) { if (valObj == null) { @@ -271,6 +273,7 @@ public static Float convertObjectToFloat(@Nullable Object valObj) } } + @Nullable public static Double convertObjectToDouble(@Nullable Object valObj) { if (valObj == null) { @@ -282,8 +285,7 @@ public static Double convertObjectToDouble(@Nullable Object valObj) } else if (valObj instanceof Number) { return ((Number) valObj).doubleValue(); } else if (valObj instanceof String) { - Double doubleValue = Doubles.tryParse((String) valObj); - return doubleValue == null ? ZERO_DOUBLE : doubleValue; + return Doubles.tryParse((String) valObj); } else { throw new ParseException("Unknown type[%s]", valObj.getClass()); } diff --git a/processing/src/main/java/io/druid/segment/DimensionSelector.java b/processing/src/main/java/io/druid/segment/DimensionSelector.java index 2a4f12340084..6ad0b9321954 100644 --- a/processing/src/main/java/io/druid/segment/DimensionSelector.java +++ b/processing/src/main/java/io/druid/segment/DimensionSelector.java @@ -118,34 +118,28 @@ public interface DimensionSelector extends ColumnValueSelector, HotLoopCallee @Nullable IdLookup idLookup(); - /** - * @deprecated always throws {@link UnsupportedOperationException} - */ @Deprecated @Override default float getFloat() { - throw new UnsupportedOperationException("DimensionSelector cannot be operated as numeric ColumnValueSelector"); + // This is controversial, see https://github.com/druid-io/druid/issues/4888 + return 0.0f; } - /** - * @deprecated always throws {@link UnsupportedOperationException} - */ @Deprecated @Override default double getDouble() { - throw new UnsupportedOperationException("DimensionSelector cannot be operated as numeric ColumnValueSelector"); + // This is controversial, see https://github.com/druid-io/druid/issues/4888 + return 0.0; } - /** - * @deprecated always throws {@link UnsupportedOperationException} - */ @Deprecated @Override default long getLong() { - throw new UnsupportedOperationException("DimensionSelector cannot be operated as numeric ColumnValueSelector"); + // This is controversial, see https://github.com/druid-io/druid/issues/4888 + return 0L; } /** From eefca44d711da71ad947640b9ca0d3f149647eb4 Mon Sep 17 00:00:00 2001 From: leventov Date: Mon, 2 Oct 2017 13:34:25 -0500 Subject: [PATCH 06/13] Fix IncrementalIndexTest --- .../java/io/druid/segment/incremental/IncrementalIndexTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/processing/src/test/java/io/druid/segment/incremental/IncrementalIndexTest.java b/processing/src/test/java/io/druid/segment/incremental/IncrementalIndexTest.java index e283efed0905..ee728cb51605 100644 --- a/processing/src/test/java/io/druid/segment/incremental/IncrementalIndexTest.java +++ b/processing/src/test/java/io/druid/segment/incremental/IncrementalIndexTest.java @@ -227,7 +227,7 @@ public void testNullDimensionTransform() throws IndexSizeExceededException Assert.assertEquals(Arrays.asList(new String[]{"", "", "A"}), row.getRaw("string")); Assert.assertEquals(Arrays.asList(new String[]{"", "", String.valueOf(Float.POSITIVE_INFINITY)}), row.getRaw("float")); Assert.assertEquals(Arrays.asList(new String[]{"", "", String.valueOf(Long.MIN_VALUE)}), row.getRaw("long")); - Assert.assertEquals(0.0, row.getRaw("double")); + Assert.assertEquals(0.0, row.getMetric("double").doubleValue(), 0.0); } @Test From b8992dc05c877f26908758303c94a099e634e76c Mon Sep 17 00:00:00 2001 From: leventov Date: Mon, 2 Oct 2017 13:58:42 -0500 Subject: [PATCH 07/13] Fix IncrementalIndex.makeColumnSelectorFactory() --- .../segment/incremental/IncrementalIndex.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java b/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java index 4cff134e42ce..61bc83b2ccce 100644 --- a/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java +++ b/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java @@ -141,14 +141,33 @@ public ColumnValueSelector makeColumnValueSelector(final String column) if (!isComplexMetric || !deserializeComplexMetrics) { return baseSelectorFactory.makeColumnValueSelector(column); } else { + ColumnValueSelector baseSelector = baseSelectorFactory.makeColumnValueSelector(column); final ComplexMetricSerde serde = ComplexMetrics.getSerdeForType(typeName); if (serde == null) { throw new ISE("Don't know how to handle type[%s]", typeName); } final ComplexMetricExtractor extractor = serde.getExtractor(); - return new ObjectColumnSelector() + return new ColumnValueSelector() { + @Override + public long getLong() + { + return baseSelector.getLong(); + } + + @Override + public float getFloat() + { + return baseSelector.getFloat(); + } + + @Override + public double getDouble() + { + return baseSelector.getDouble(); + } + @Override public Class classOfObject() { @@ -164,6 +183,7 @@ public Object getObject() @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { + inspector.visit("baseSelector", baseSelector); inspector.visit("in", in); inspector.visit("extractor", extractor); } From a7937e339cc46bcca8ddb09d67eb2391f104d63c Mon Sep 17 00:00:00 2001 From: leventov Date: Mon, 2 Oct 2017 14:39:24 -0500 Subject: [PATCH 08/13] Optimize MapBasedRow.getMetric() --- .../java/io/druid/data/input/MapBasedRow.java | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/io/druid/data/input/MapBasedRow.java b/api/src/main/java/io/druid/data/input/MapBasedRow.java index afc2c0930536..784b5069fd84 100644 --- a/api/src/main/java/io/druid/data/input/MapBasedRow.java +++ b/api/src/main/java/io/druid/data/input/MapBasedRow.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.Lists; +import com.google.common.primitives.Longs; import io.druid.guice.annotations.PublicApi; import io.druid.java.util.common.DateTimes; import io.druid.java.util.common.StringUtils; @@ -31,14 +32,12 @@ import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.regex.Pattern; /** */ @PublicApi public class MapBasedRow implements Row { - private static final Pattern LONG_PAT = Pattern.compile("[-|+]?\\d+"); private static final Long LONG_ZERO = 0L; private final DateTime timestamp; @@ -115,10 +114,13 @@ public Number getMetric(String metric) return (Number) metricValue; } else if (metricValue instanceof String) { try { - String metricValueString = StringUtils.removeChar((String) metricValue, ','); + String metricValueString = StringUtils.removeChar(((String) metricValue).trim(), ','); + // Longs.tryParse() doesn't support leading '+', so we need to trim it ourselves + metricValueString = trimLeadingPlusOfLongString(metricValueString); + Long v = Longs.tryParse(metricValueString); // Do NOT use ternary operator here, because it makes Java to convert Long to Double - if (LONG_PAT.matcher(metricValueString).matches()) { - return Long.valueOf(metricValueString); + if (v != null) { + return v; } else { return Double.valueOf(metricValueString); } @@ -131,6 +133,22 @@ public Number getMetric(String metric) } } + private static String trimLeadingPlusOfLongString(String metricValueString) + { + if (metricValueString.isEmpty()) { + return metricValueString; + } + if (metricValueString.charAt(0) == '+') { + if (metricValueString.length() > 1) { + char secondChar = metricValueString.charAt(1); + if (secondChar >= '0' && secondChar <= '9') { + metricValueString = metricValueString.substring(1); + } + } + } + return metricValueString; + } + @Override public String toString() { From e2b61862ffd65e39f2fc9803a1e27c35ff625419 Mon Sep 17 00:00:00 2001 From: leventov Date: Mon, 2 Oct 2017 15:59:42 -0500 Subject: [PATCH 09/13] Fix VarianceAggregatorTest --- .../query/aggregation/variance/VarianceAggregatorTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorTest.java b/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorTest.java index 202ac7980de8..0945705bdb57 100644 --- a/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorTest.java +++ b/extensions-core/stats/src/test/java/io/druid/query/aggregation/variance/VarianceAggregatorTest.java @@ -21,7 +21,6 @@ import io.druid.jackson.DefaultObjectMapper; import io.druid.query.aggregation.TestFloatColumnSelector; -import io.druid.query.aggregation.TestObjectColumnSelector; import io.druid.segment.ColumnSelectorFactory; import org.easymock.EasyMock; import org.junit.Assert; @@ -66,8 +65,6 @@ public void setup() { selector = new TestFloatColumnSelector(values); colSelectorFactory = EasyMock.createMock(ColumnSelectorFactory.class); - EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")) - .andReturn(new TestObjectColumnSelector<>(new Object[] {0.0f})); EasyMock.expect(colSelectorFactory.makeColumnValueSelector("nilly")).andReturn(selector); EasyMock.replay(colSelectorFactory); } From 9d544c250081cbdf75972d0b7e3eb8643003d9d7 Mon Sep 17 00:00:00 2001 From: leventov Date: Mon, 2 Oct 2017 16:02:25 -0500 Subject: [PATCH 10/13] Simplify IncrementalIndex.makeColumnSelectorFactory() --- .../io/druid/segment/incremental/IncrementalIndex.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java b/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java index 61bc83b2ccce..3a75bf8255ee 100644 --- a/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java +++ b/processing/src/main/java/io/druid/segment/incremental/IncrementalIndex.java @@ -141,7 +141,6 @@ public ColumnValueSelector makeColumnValueSelector(final String column) if (!isComplexMetric || !deserializeComplexMetrics) { return baseSelectorFactory.makeColumnValueSelector(column); } else { - ColumnValueSelector baseSelector = baseSelectorFactory.makeColumnValueSelector(column); final ComplexMetricSerde serde = ComplexMetrics.getSerdeForType(typeName); if (serde == null) { throw new ISE("Don't know how to handle type[%s]", typeName); @@ -153,19 +152,19 @@ public ColumnValueSelector makeColumnValueSelector(final String column) @Override public long getLong() { - return baseSelector.getLong(); + return in.get().getMetric(column).longValue(); } @Override public float getFloat() { - return baseSelector.getFloat(); + return in.get().getMetric(column).floatValue(); } @Override public double getDouble() { - return baseSelector.getDouble(); + return in.get().getMetric(column).doubleValue(); } @Override @@ -183,7 +182,6 @@ public Object getObject() @Override public void inspectRuntimeShape(RuntimeShapeInspector inspector) { - inspector.visit("baseSelector", baseSelector); inspector.visit("in", in); inspector.visit("extractor", extractor); } From 4190afdd8032f1607be471c8f5881cc332e1cadd Mon Sep 17 00:00:00 2001 From: leventov Date: Thu, 12 Oct 2017 19:46:39 -0500 Subject: [PATCH 11/13] Address comments --- .../java/io/druid/data/input/MapBasedRow.java | 13 ++++-------- .../datasketches/theta/SketchAggregator.java | 6 +++--- .../theta/SketchAggregatorFactory.java | 5 +++-- .../theta/SketchBufferAggregator.java | 6 +++--- .../query/aggregation/AggregateCombiner.java | 7 +++++++ .../aggregation/DoubleAggregateCombiner.java | 6 ------ .../aggregation/LongAggregateCombiner.java | 6 ------ .../aggregation/ObjectAggregateCombiner.java | 7 ------- .../BaseDoubleColumnValueSelector.java | 2 ++ .../segment/BaseFloatColumnValueSelector.java | 2 ++ .../segment/BaseLongColumnValueSelector.java | 2 ++ .../BaseObjectColumnValueSelector.java | 3 +++ .../druid/segment/ColumnSelectorFactory.java | 2 ++ .../io/druid/segment/ColumnValueSelector.java | 7 +++++++ .../io/druid/segment/DimensionSelector.java | 5 +++++ .../druid/segment/NilColumnValueSelector.java | 20 +++++++++++++++++++ .../io/druid/segment/data/IndexedInts.java | 2 ++ 17 files changed, 65 insertions(+), 36 deletions(-) diff --git a/api/src/main/java/io/druid/data/input/MapBasedRow.java b/api/src/main/java/io/druid/data/input/MapBasedRow.java index 784b5069fd84..8e5af6541d00 100644 --- a/api/src/main/java/io/druid/data/input/MapBasedRow.java +++ b/api/src/main/java/io/druid/data/input/MapBasedRow.java @@ -135,15 +135,10 @@ public Number getMetric(String metric) private static String trimLeadingPlusOfLongString(String metricValueString) { - if (metricValueString.isEmpty()) { - return metricValueString; - } - if (metricValueString.charAt(0) == '+') { - if (metricValueString.length() > 1) { - char secondChar = metricValueString.charAt(1); - if (secondChar >= '0' && secondChar <= '9') { - metricValueString = metricValueString.substring(1); - } + if (metricValueString.length() > 1 && metricValueString.charAt(0) == '+') { + char secondChar = metricValueString.charAt(1); + if (secondChar >= '0' && secondChar <= '9') { + metricValueString = metricValueString.substring(1); } } return metricValueString; diff --git a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregator.java b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregator.java index 4bb52520c036..d383b0e3757b 100644 --- a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregator.java +++ b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregator.java @@ -24,17 +24,17 @@ import com.yahoo.sketches.theta.Union; import io.druid.java.util.common.ISE; import io.druid.query.aggregation.Aggregator; -import io.druid.segment.ColumnValueSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import java.util.List; public class SketchAggregator implements Aggregator { - private final ColumnValueSelector selector; + private final BaseObjectColumnValueSelector selector; private final int size; private Union union; - public SketchAggregator(ColumnValueSelector selector, int size) + public SketchAggregator(BaseObjectColumnValueSelector selector, int size) { this.selector = selector; this.size = size; diff --git a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java index 25281be9dbef..d0594854b9a3 100644 --- a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java +++ b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java @@ -32,6 +32,7 @@ import io.druid.query.aggregation.AggregatorFactory; import io.druid.query.aggregation.BufferAggregator; import io.druid.query.aggregation.ObjectAggregateCombiner; +import io.druid.segment.BaseObjectColumnValueSelector; import io.druid.segment.ColumnSelectorFactory; import io.druid.segment.ColumnValueSelector; @@ -65,7 +66,7 @@ public SketchAggregatorFactory(String name, String fieldName, Integer size, byte @Override public Aggregator factorize(ColumnSelectorFactory metricFactory) { - ColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); + BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); return new SketchAggregator(selector, size); } @@ -73,7 +74,7 @@ public Aggregator factorize(ColumnSelectorFactory metricFactory) @Override public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) { - ColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); + BaseObjectColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); return new SketchBufferAggregator(selector, size, getMaxIntermediateSize()); } diff --git a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchBufferAggregator.java b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchBufferAggregator.java index ea67f448c0cf..3ce323e348ad 100644 --- a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchBufferAggregator.java +++ b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchBufferAggregator.java @@ -25,7 +25,7 @@ import com.yahoo.sketches.theta.Union; import io.druid.query.aggregation.BufferAggregator; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; -import io.druid.segment.ColumnValueSelector; +import io.druid.segment.BaseObjectColumnValueSelector; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -34,13 +34,13 @@ public class SketchBufferAggregator implements BufferAggregator { - private final ColumnValueSelector selector; + private final BaseObjectColumnValueSelector selector; private final int size; private final int maxIntermediateSize; private final IdentityHashMap> unions = new IdentityHashMap<>(); private final IdentityHashMap memCache = new IdentityHashMap<>(); - public SketchBufferAggregator(ColumnValueSelector selector, int size, int maxIntermediateSize) + public SketchBufferAggregator(BaseObjectColumnValueSelector selector, int size, int maxIntermediateSize) { this.selector = selector; this.size = size; diff --git a/processing/src/main/java/io/druid/query/aggregation/AggregateCombiner.java b/processing/src/main/java/io/druid/query/aggregation/AggregateCombiner.java index 1a4bdbd66d07..ddf62d4b0638 100644 --- a/processing/src/main/java/io/druid/query/aggregation/AggregateCombiner.java +++ b/processing/src/main/java/io/druid/query/aggregation/AggregateCombiner.java @@ -19,6 +19,7 @@ package io.druid.query.aggregation; +import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.ColumnValueSelector; /** @@ -66,4 +67,10 @@ public interface AggregateCombiner extends ColumnValueSelector * @see AggregatorFactory#combine */ void fold(ColumnValueSelector selector); + + @Override + default void inspectRuntimeShape(RuntimeShapeInspector inspector) + { + // Usually AggregateCombiner has nothing to inspect + } } diff --git a/processing/src/main/java/io/druid/query/aggregation/DoubleAggregateCombiner.java b/processing/src/main/java/io/druid/query/aggregation/DoubleAggregateCombiner.java index daad0a7520ad..ecbad1c27ab2 100644 --- a/processing/src/main/java/io/druid/query/aggregation/DoubleAggregateCombiner.java +++ b/processing/src/main/java/io/druid/query/aggregation/DoubleAggregateCombiner.java @@ -19,7 +19,6 @@ package io.druid.query.aggregation; -import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.DoubleColumnSelector; /** @@ -27,9 +26,4 @@ */ public abstract class DoubleAggregateCombiner implements AggregateCombiner, DoubleColumnSelector { - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - // Usually AggregateCombiner has nothing to inspect - } } diff --git a/processing/src/main/java/io/druid/query/aggregation/LongAggregateCombiner.java b/processing/src/main/java/io/druid/query/aggregation/LongAggregateCombiner.java index 4c9414decffc..af1b73e3986f 100644 --- a/processing/src/main/java/io/druid/query/aggregation/LongAggregateCombiner.java +++ b/processing/src/main/java/io/druid/query/aggregation/LongAggregateCombiner.java @@ -19,7 +19,6 @@ package io.druid.query.aggregation; -import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.LongColumnSelector; /** @@ -27,9 +26,4 @@ */ public abstract class LongAggregateCombiner implements AggregateCombiner, LongColumnSelector { - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - // Usually AggregateCombiner has nothing to inspect - } } diff --git a/processing/src/main/java/io/druid/query/aggregation/ObjectAggregateCombiner.java b/processing/src/main/java/io/druid/query/aggregation/ObjectAggregateCombiner.java index 02fc209c74f4..bc19ba476e7a 100644 --- a/processing/src/main/java/io/druid/query/aggregation/ObjectAggregateCombiner.java +++ b/processing/src/main/java/io/druid/query/aggregation/ObjectAggregateCombiner.java @@ -19,7 +19,6 @@ package io.druid.query.aggregation; -import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import io.druid.segment.ObjectColumnSelector; /** @@ -27,10 +26,4 @@ */ public abstract class ObjectAggregateCombiner implements AggregateCombiner, ObjectColumnSelector { - - @Override - public void inspectRuntimeShape(RuntimeShapeInspector inspector) - { - // Usually AggregateCombiner has nothing to inspect - } } diff --git a/processing/src/main/java/io/druid/segment/BaseDoubleColumnValueSelector.java b/processing/src/main/java/io/druid/segment/BaseDoubleColumnValueSelector.java index 14c081c964e0..e1d0d40d23f7 100644 --- a/processing/src/main/java/io/druid/segment/BaseDoubleColumnValueSelector.java +++ b/processing/src/main/java/io/druid/segment/BaseDoubleColumnValueSelector.java @@ -19,6 +19,7 @@ package io.druid.segment; +import io.druid.guice.annotations.PublicApi; import io.druid.query.monomorphicprocessing.CalledFromHotLoop; import io.druid.query.monomorphicprocessing.HotLoopCallee; @@ -29,6 +30,7 @@ * * All implementations of this interface MUST also implement {@link ColumnValueSelector}. */ +@PublicApi public interface BaseDoubleColumnValueSelector extends HotLoopCallee { @CalledFromHotLoop diff --git a/processing/src/main/java/io/druid/segment/BaseFloatColumnValueSelector.java b/processing/src/main/java/io/druid/segment/BaseFloatColumnValueSelector.java index 2b7220f2fa98..9223ff339422 100644 --- a/processing/src/main/java/io/druid/segment/BaseFloatColumnValueSelector.java +++ b/processing/src/main/java/io/druid/segment/BaseFloatColumnValueSelector.java @@ -19,6 +19,7 @@ package io.druid.segment; +import io.druid.guice.annotations.PublicApi; import io.druid.query.monomorphicprocessing.CalledFromHotLoop; import io.druid.query.monomorphicprocessing.HotLoopCallee; @@ -29,6 +30,7 @@ * * All implementations of this interface MUST also implement {@link ColumnValueSelector}. */ +@PublicApi public interface BaseFloatColumnValueSelector extends HotLoopCallee { @CalledFromHotLoop diff --git a/processing/src/main/java/io/druid/segment/BaseLongColumnValueSelector.java b/processing/src/main/java/io/druid/segment/BaseLongColumnValueSelector.java index 5b7f7a664da3..ac06ab7d3273 100644 --- a/processing/src/main/java/io/druid/segment/BaseLongColumnValueSelector.java +++ b/processing/src/main/java/io/druid/segment/BaseLongColumnValueSelector.java @@ -19,6 +19,7 @@ package io.druid.segment; +import io.druid.guice.annotations.PublicApi; import io.druid.query.monomorphicprocessing.CalledFromHotLoop; import io.druid.query.monomorphicprocessing.HotLoopCallee; @@ -29,6 +30,7 @@ * * All implementations of this interface MUST also implement {@link ColumnValueSelector}. */ +@PublicApi public interface BaseLongColumnValueSelector extends HotLoopCallee { @CalledFromHotLoop diff --git a/processing/src/main/java/io/druid/segment/BaseObjectColumnValueSelector.java b/processing/src/main/java/io/druid/segment/BaseObjectColumnValueSelector.java index 91f3f080ab91..619e9a23d2cc 100644 --- a/processing/src/main/java/io/druid/segment/BaseObjectColumnValueSelector.java +++ b/processing/src/main/java/io/druid/segment/BaseObjectColumnValueSelector.java @@ -19,6 +19,8 @@ package io.druid.segment; +import io.druid.guice.annotations.PublicApi; + import javax.annotation.Nullable; /** @@ -28,6 +30,7 @@ * * All implementations of this interface MUST also implement {@link ColumnValueSelector}. */ +@PublicApi public interface BaseObjectColumnValueSelector { @Nullable diff --git a/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java b/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java index 3dce044b7da9..fb22220a9922 100644 --- a/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java +++ b/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java @@ -19,6 +19,7 @@ package io.druid.segment; +import io.druid.guice.annotations.PublicApi; import io.druid.query.dimension.DimensionSpec; import io.druid.segment.column.ColumnCapabilities; @@ -27,6 +28,7 @@ /** * Factory class for MetricSelectors */ +@PublicApi public interface ColumnSelectorFactory { DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec); diff --git a/processing/src/main/java/io/druid/segment/ColumnValueSelector.java b/processing/src/main/java/io/druid/segment/ColumnValueSelector.java index 6d4a47069c94..efb8c27caab8 100644 --- a/processing/src/main/java/io/druid/segment/ColumnValueSelector.java +++ b/processing/src/main/java/io/druid/segment/ColumnValueSelector.java @@ -19,13 +19,20 @@ package io.druid.segment; +import io.druid.guice.annotations.PublicApi; + /** * Base type for interfaces that manage column value selection, e.g. DimensionSelector, LongColumnSelector * * This interface has methods to get the value in all primitive types, that have corresponding basic aggregators in * Druid: Sum, Min, Max, etc: {@link #getFloat()}, {@link #getDouble()} and {@link #getLong()} to support "polymorphic" * rollup aggregation during index merging. + * + * "Absent" column, i. e. that always returns zero from {@link #getLong()}, {@link #getFloat()} and {@link #getDouble()} + * methods and null from {@link #getObject()}, should always be an instance of {@link NilColumnValueSelector}. + * `selector instanceof NilColumnValueSelector` is the recommended way to check for this condition. */ +@PublicApi public interface ColumnValueSelector extends BaseLongColumnValueSelector, BaseDoubleColumnValueSelector, BaseFloatColumnValueSelector, BaseObjectColumnValueSelector { diff --git a/processing/src/main/java/io/druid/segment/DimensionSelector.java b/processing/src/main/java/io/druid/segment/DimensionSelector.java index 6ad0b9321954..5f42fa707512 100644 --- a/processing/src/main/java/io/druid/segment/DimensionSelector.java +++ b/processing/src/main/java/io/druid/segment/DimensionSelector.java @@ -20,6 +20,7 @@ package io.druid.segment; import com.google.common.base.Predicate; +import io.druid.guice.annotations.PublicApi; import io.druid.query.filter.ValueMatcher; import io.druid.query.monomorphicprocessing.CalledFromHotLoop; import io.druid.query.monomorphicprocessing.HotLoopCallee; @@ -29,6 +30,7 @@ /** */ +@PublicApi public interface DimensionSelector extends ColumnValueSelector, HotLoopCallee { public static int CARDINALITY_UNKNOWN = -1; @@ -143,6 +145,9 @@ default long getLong() } /** + * Converts the current result of {@link #getRow()} into null, if the row is empty, a String, if the row has size 1, + * or a String[] array, if the row has size > 1, using {@link #lookupName(int)}. + * * This method is not the default implementation of {@link #getObject()} to minimize the chance that implementations * "forget" to override it with more optimized version. */ diff --git a/processing/src/main/java/io/druid/segment/NilColumnValueSelector.java b/processing/src/main/java/io/druid/segment/NilColumnValueSelector.java index b66e27e922d1..26ba95715743 100644 --- a/processing/src/main/java/io/druid/segment/NilColumnValueSelector.java +++ b/processing/src/main/java/io/druid/segment/NilColumnValueSelector.java @@ -19,10 +19,15 @@ package io.druid.segment; +import io.druid.guice.annotations.PublicApi; import io.druid.query.monomorphicprocessing.RuntimeShapeInspector; import javax.annotation.Nullable; +/** + * Represents "absent" column. + */ +@PublicApi public final class NilColumnValueSelector implements ColumnValueSelector { private static final NilColumnValueSelector INSTANCE = new NilColumnValueSelector(); @@ -34,24 +39,36 @@ public static NilColumnValueSelector instance() private NilColumnValueSelector() {} + /** + * Always returns 0.0. + */ @Override public double getDouble() { return 0.0; } + /** + * Always returns 0.0f. + */ @Override public float getFloat() { return 0.0f; } + /** + * Always returns 0L. + */ @Override public long getLong() { return 0L; } + /** + * Always returns null. + */ @Nullable @Override public Object getObject() @@ -59,6 +76,9 @@ public Object getObject() return null; } + /** + * Returns Object.class. + */ @Override public Class classOfObject() { diff --git a/processing/src/main/java/io/druid/segment/data/IndexedInts.java b/processing/src/main/java/io/druid/segment/data/IndexedInts.java index f94b5eca4b40..bb7abce7ce8f 100644 --- a/processing/src/main/java/io/druid/segment/data/IndexedInts.java +++ b/processing/src/main/java/io/druid/segment/data/IndexedInts.java @@ -19,6 +19,7 @@ package io.druid.segment.data; +import io.druid.guice.annotations.PublicApi; import io.druid.query.monomorphicprocessing.CalledFromHotLoop; import io.druid.query.monomorphicprocessing.HotLoopCallee; @@ -31,6 +32,7 @@ * Doesn't extend {@link Iterable} (or {@link it.unimi.dsi.fastutil.ints.IntIterable} to avoid accidential * for-each iteration with boxing. */ +@PublicApi public interface IndexedInts extends Closeable, HotLoopCallee { @CalledFromHotLoop From 09505be0c5eca6275a723b730ab0d65c3808a73c Mon Sep 17 00:00:00 2001 From: leventov Date: Thu, 12 Oct 2017 20:02:24 -0500 Subject: [PATCH 12/13] More comments --- .../main/java/io/druid/segment/ColumnSelectorFactory.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java b/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java index fb22220a9922..40fe05862c90 100644 --- a/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java +++ b/processing/src/main/java/io/druid/segment/ColumnSelectorFactory.java @@ -32,6 +32,11 @@ public interface ColumnSelectorFactory { DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec); + + /** + * Returns ColumnValueSelector corresponding to the given column name, or {@link NilColumnValueSelector} if the + * column with such name is absent. + */ ColumnValueSelector makeColumnValueSelector(String columnName); /** From 7e3d267ac5bbb7ed962cacb8539f3e57046cbe7e Mon Sep 17 00:00:00 2001 From: leventov Date: Thu, 12 Oct 2017 20:03:09 -0500 Subject: [PATCH 13/13] Test --- .../datasketches/theta/SketchAggregatorFactory.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java index d0594854b9a3..5896216e0987 100644 --- a/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java +++ b/extensions-core/datasketches/src/main/java/io/druid/query/aggregation/datasketches/theta/SketchAggregatorFactory.java @@ -91,11 +91,8 @@ public Comparator getComparator() } @Override - public Object combine(Object lhs, @Nullable Object rhs) + public Object combine(Object lhs, Object rhs) { - if (rhs == null) { - return lhs; - } return SketchHolder.combine(lhs, rhs, size); }