fix ApproximateHistogram combining factory

This commit is contained in:
Xavier Léauté 2014-10-06 17:38:13 -07:00
parent 1a67d6cb2e
commit f78b8f2c31
4 changed files with 81 additions and 36 deletions

View File

@ -84,18 +84,6 @@ public class ApproximateHistogramAggregatorFactory implements AggregatorFactory
@Override @Override
public Aggregator factorize(ColumnSelectorFactory metricFactory) public Aggregator factorize(ColumnSelectorFactory metricFactory)
{ {
ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(fieldName);
if (selector == null) {
return Aggregators.noopAggregator();
}
final Class classOfObject = selector.classOfObject();
if (classOfObject != null && (classOfObject.equals(Object.class)
|| ApproximateHistogramAggregator.class.isAssignableFrom(classOfObject))) {
System.out.println("here");
//return new HyperUniquesAggregator(name, selector);
}
return new ApproximateHistogramAggregator( return new ApproximateHistogramAggregator(
name, name,
metricFactory.makeFloatColumnSelector(fieldName), metricFactory.makeFloatColumnSelector(fieldName),
@ -108,18 +96,6 @@ public class ApproximateHistogramAggregatorFactory implements AggregatorFactory
@Override @Override
public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory) public BufferAggregator factorizeBuffered(ColumnSelectorFactory metricFactory)
{ {
//ObjectColumnSelector selector = metricFactory.makeObjectColumnSelector(fieldName);
//
//if (selector == null) {
// return Aggregators.noopBufferAggregator();
//}
//
//final Class classOfObject = selector.classOfObject();
//if (classOfObject != null && (classOfObject.equals(Object.class) || ApproximateHistogramAggregator.class.isAssignableFrom(classOfObject))) {
// System.out.println("here");
// //return new HyperUniquesAggregator(name, selector);
//}
return new ApproximateHistogramBufferAggregator( return new ApproximateHistogramBufferAggregator(
metricFactory.makeFloatColumnSelector(fieldName), metricFactory.makeFloatColumnSelector(fieldName),
resolution, resolution,
@ -143,7 +119,7 @@ public class ApproximateHistogramAggregatorFactory implements AggregatorFactory
@Override @Override
public AggregatorFactory getCombiningFactory() public AggregatorFactory getCombiningFactory()
{ {
return new ApproximateHistogramAggregatorFactory(name, name, resolution, numBuckets, lowerLimit, upperLimit); return new ApproximateHistogramFoldingAggregatorFactory(name, name, resolution, numBuckets, lowerLimit, upperLimit);
} }
@Override @Override

View File

@ -76,8 +76,8 @@ public class ApproximateHistogramFoldingAggregatorFactory extends ApproximateHis
}; };
} }
final Class classOfObject = selector.classOfObject(); final Class cls = selector.classOfObject();
if (classOfObject.equals(Object.class) || ApproximateHistogram.class.isAssignableFrom(classOfObject)) { if (cls.equals(Object.class) || ApproximateHistogram.class.isAssignableFrom(cls)) {
return new ApproximateHistogramFoldingAggregator( return new ApproximateHistogramFoldingAggregator(
name, name,
selector, selector,
@ -90,7 +90,7 @@ public class ApproximateHistogramFoldingAggregatorFactory extends ApproximateHis
throw new IAE( throw new IAE(
"Incompatible type for metric[%s], expected a ApproximateHistogram, got a %s", "Incompatible type for metric[%s], expected a ApproximateHistogram, got a %s",
fieldName, fieldName,
selector.classOfObject() cls
); );
} }
@ -118,14 +118,15 @@ public class ApproximateHistogramFoldingAggregatorFactory extends ApproximateHis
}; };
} }
if (ApproximateHistogram.class.isAssignableFrom(selector.classOfObject())) { final Class cls = selector.classOfObject();
if (cls.equals(Object.class) || ApproximateHistogram.class.isAssignableFrom(cls)) {
return new ApproximateHistogramFoldingBufferAggregator(selector, resolution, lowerLimit, upperLimit); return new ApproximateHistogramFoldingBufferAggregator(selector, resolution, lowerLimit, upperLimit);
} }
throw new IAE( throw new IAE(
"Incompatible type for metric[%s], expected a ApproximateHistogram, got a %s", "Incompatible type for metric[%s], expected a ApproximateHistogram, got a %s",
fieldName, fieldName,
selector.classOfObject() cls
); );
} }

View File

@ -84,5 +84,12 @@ public class Histogram
return result; return result;
} }
@Override
public String toString()
{
return "Histogram{" +
"breaks=" + Arrays.toString(breaks) +
", counts=" + Arrays.toString(counts) +
'}';
}
} }

View File

@ -1,3 +1,22 @@
/*
* Druid - a distributed column store.
* Copyright (C) 2014 Metamarkets Group Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package io.druid.query.aggregation.histogram; package io.druid.query.aggregation.histogram;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
@ -23,6 +42,8 @@ import io.druid.query.groupby.GroupByQueryEngine;
import io.druid.query.groupby.GroupByQueryQueryToolChest; import io.druid.query.groupby.GroupByQueryQueryToolChest;
import io.druid.query.groupby.GroupByQueryRunnerFactory; import io.druid.query.groupby.GroupByQueryRunnerFactory;
import io.druid.query.groupby.GroupByQueryRunnerTestHelper; import io.druid.query.groupby.GroupByQueryRunnerTestHelper;
import io.druid.query.groupby.orderby.DefaultLimitSpec;
import io.druid.query.groupby.orderby.OrderByColumnSpec;
import io.druid.segment.TestHelper; import io.druid.segment.TestHelper;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -130,7 +151,7 @@ public class ApproximateHistogramGroupByQueryTest
} }
@Test @Test
public void testGroupByNWithApproximateHistogramAgg() public void testGroupByWithApproximateHistogramAgg()
{ {
ApproximateHistogramAggregatorFactory aggFactory = new ApproximateHistogramAggregatorFactory( ApproximateHistogramAggregatorFactory aggFactory = new ApproximateHistogramAggregatorFactory(
"apphisto", "apphisto",
@ -146,8 +167,18 @@ public class ApproximateHistogramGroupByQueryTest
.setGranularity(QueryRunnerTestHelper.allGran) .setGranularity(QueryRunnerTestHelper.allGran)
.setDimensions(Arrays.<DimensionSpec>asList(new LegacyDimensionSpec(QueryRunnerTestHelper.providerDimension))) .setDimensions(Arrays.<DimensionSpec>asList(new LegacyDimensionSpec(QueryRunnerTestHelper.providerDimension)))
.setInterval(QueryRunnerTestHelper.fullOnInterval) .setInterval(QueryRunnerTestHelper.fullOnInterval)
.setLimitSpec(
new DefaultLimitSpec(
Lists.newArrayList(
new OrderByColumnSpec(
QueryRunnerTestHelper.providerDimension,
OrderByColumnSpec.Direction.DESCENDING
)
), 1
)
)
.setAggregatorSpecs( .setAggregatorSpecs(
Lists.<AggregatorFactory>newArrayList( Lists.newArrayList(
Iterables.concat( Iterables.concat(
QueryRunnerTestHelper.commonAggregators, QueryRunnerTestHelper.commonAggregators,
Lists.newArrayList( Lists.newArrayList(
@ -159,7 +190,7 @@ public class ApproximateHistogramGroupByQueryTest
) )
) )
.setPostAggregatorSpecs( .setPostAggregatorSpecs(
Arrays.<PostAggregator>asList( Arrays.asList(
QueryRunnerTestHelper.addRowsIndexConstant, QueryRunnerTestHelper.addRowsIndexConstant,
QueryRunnerTestHelper.dependentPostAgg, QueryRunnerTestHelper.dependentPostAgg,
new QuantilePostAggregator("quantile", "apphisto", 0.5f) new QuantilePostAggregator("quantile", "apphisto", 0.5f)
@ -167,7 +198,37 @@ public class ApproximateHistogramGroupByQueryTest
) )
.build(); .build();
List<Row> expectedResults = Arrays.<Row>asList( List<Row> expectedResults = Arrays.asList(
GroupByQueryRunnerTestHelper.createExpectedRow(
"1970-01-01T00:00:00.000Z",
"provider", "spot",
"rows", 837L,
"addRowsIndexConstant", 96444.5703125,
"dependentPostAgg", 97282.5703125,
"index", 95606.5703125,
"maxIndex", 277.2735290527344,
"minIndex", 59.02102279663086,
"quantile", 101.78856f,
"uniques", QueryRunnerTestHelper.UNIQUES_9,
"apphisto",
new Histogram(
new float[]{
4.457897186279297f,
59.02102279663086f,
113.58415222167969f,
168.14727783203125f,
222.7104034423828f,
277.2735290527344f
},
new double[]{
0.0,
462.4309997558594,
357.5404968261719,
15.022850036621094,
2.0056631565093994
}
)
)
); );
Iterable<Row> results = GroupByQueryRunnerTestHelper.runQuery(factory, runner, query); Iterable<Row> results = GroupByQueryRunnerTestHelper.runQuery(factory, runner, query);