|
@@ -19,6 +19,7 @@
|
|
|
package org.elasticsearch.search.aggregations.bucket.terms;
|
|
|
|
|
|
import org.apache.lucene.document.Document;
|
|
|
+import org.apache.lucene.document.SortedNumericDocValuesField;
|
|
|
import org.apache.lucene.document.SortedSetDocValuesField;
|
|
|
import org.apache.lucene.index.DirectoryReader;
|
|
|
import org.apache.lucene.index.IndexReader;
|
|
@@ -27,11 +28,21 @@ import org.apache.lucene.search.IndexSearcher;
|
|
|
import org.apache.lucene.search.MatchAllDocsQuery;
|
|
|
import org.apache.lucene.store.Directory;
|
|
|
import org.apache.lucene.util.BytesRef;
|
|
|
+import org.apache.lucene.util.NumericUtils;
|
|
|
+import org.elasticsearch.common.settings.Settings;
|
|
|
+import org.elasticsearch.common.util.MockBigArrays;
|
|
|
import org.elasticsearch.index.mapper.KeywordFieldMapper;
|
|
|
import org.elasticsearch.index.mapper.MappedFieldType;
|
|
|
+import org.elasticsearch.index.mapper.NumberFieldMapper;
|
|
|
+import org.elasticsearch.indices.breaker.NoneCircuitBreakerService;
|
|
|
import org.elasticsearch.search.aggregations.AggregatorTestCase;
|
|
|
+import org.elasticsearch.search.aggregations.InternalAggregation;
|
|
|
import org.elasticsearch.search.aggregations.support.ValueType;
|
|
|
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
|
|
|
public void testTermsAggregator() throws Exception {
|
|
@@ -83,4 +94,108 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
directory.close();
|
|
|
}
|
|
|
|
|
|
+ public void testMixLongAndDouble() throws IOException {
|
|
|
+ for (TermsAggregatorFactory.ExecutionMode executionMode : TermsAggregatorFactory.ExecutionMode.values()) {
|
|
|
+ TermsAggregationBuilder aggregationBuilder = new TermsAggregationBuilder("_name", ValueType.LONG)
|
|
|
+ .executionHint(executionMode.toString())
|
|
|
+ .field("number")
|
|
|
+ .order(Terms.Order.term(true));
|
|
|
+ List<InternalAggregation> aggs = new ArrayList<> ();
|
|
|
+ int numLongs = randomIntBetween(1, 3);
|
|
|
+ for (int i = 0; i < numLongs; i++) {
|
|
|
+ final Directory dir;
|
|
|
+ try (IndexReader reader = createIndexWithLongs()) {
|
|
|
+ dir = ((DirectoryReader) reader).directory();
|
|
|
+ IndexSearcher searcher = new IndexSearcher(reader);
|
|
|
+ MappedFieldType fieldType =
|
|
|
+ new NumberFieldMapper.NumberFieldType(NumberFieldMapper.NumberType.LONG);
|
|
|
+ fieldType.setName("number");
|
|
|
+ fieldType.setHasDocValues(true);
|
|
|
+ aggs.add(buildInternalAggregation(aggregationBuilder, fieldType, searcher));
|
|
|
+ }
|
|
|
+ dir.close();
|
|
|
+ }
|
|
|
+ int numDoubles = randomIntBetween(1, 3);
|
|
|
+ for (int i = 0; i < numDoubles; i++) {
|
|
|
+ final Directory dir;
|
|
|
+ try (IndexReader reader = createIndexWithDoubles()) {
|
|
|
+ dir = ((DirectoryReader) reader).directory();
|
|
|
+ IndexSearcher searcher = new IndexSearcher(reader);
|
|
|
+ MappedFieldType fieldType =
|
|
|
+ new NumberFieldMapper.NumberFieldType(NumberFieldMapper.NumberType.DOUBLE);
|
|
|
+ fieldType.setName("number");
|
|
|
+ fieldType.setHasDocValues(true);
|
|
|
+ aggs.add(buildInternalAggregation(aggregationBuilder, fieldType, searcher));
|
|
|
+ }
|
|
|
+ dir.close();
|
|
|
+ }
|
|
|
+ InternalAggregation.ReduceContext ctx =
|
|
|
+ new InternalAggregation.ReduceContext(new MockBigArrays(Settings.EMPTY,
|
|
|
+ new NoneCircuitBreakerService()), null);
|
|
|
+ for (InternalAggregation internalAgg : aggs) {
|
|
|
+ InternalAggregation mergedAggs = internalAgg.doReduce(aggs, ctx);
|
|
|
+ assertTrue(mergedAggs instanceof DoubleTerms);
|
|
|
+ long expected = numLongs + numDoubles;
|
|
|
+ List<Terms.Bucket> buckets = ((DoubleTerms) mergedAggs).getBuckets();
|
|
|
+ assertEquals(4, buckets.size());
|
|
|
+ assertEquals("1.0", buckets.get(0).getKeyAsString());
|
|
|
+ assertEquals(expected, buckets.get(0).getDocCount());
|
|
|
+ assertEquals("10.0", buckets.get(1).getKeyAsString());
|
|
|
+ assertEquals(expected * 2, buckets.get(1).getDocCount());
|
|
|
+ assertEquals("100.0", buckets.get(2).getKeyAsString());
|
|
|
+ assertEquals(expected * 2, buckets.get(2).getDocCount());
|
|
|
+ assertEquals("1000.0", buckets.get(3).getKeyAsString());
|
|
|
+ assertEquals(expected, buckets.get(3).getDocCount());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private IndexReader createIndexWithLongs() throws IOException {
|
|
|
+ Directory directory = newDirectory();
|
|
|
+ RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory);
|
|
|
+ Document document = new Document();
|
|
|
+ document.add(new SortedNumericDocValuesField("number", 10));
|
|
|
+ document.add(new SortedNumericDocValuesField("number", 100));
|
|
|
+ indexWriter.addDocument(document);
|
|
|
+ document = new Document();
|
|
|
+ document.add(new SortedNumericDocValuesField("number", 1));
|
|
|
+ document.add(new SortedNumericDocValuesField("number", 100));
|
|
|
+ indexWriter.addDocument(document);
|
|
|
+ document = new Document();
|
|
|
+ document.add(new SortedNumericDocValuesField("number", 10));
|
|
|
+ document.add(new SortedNumericDocValuesField("number", 1000));
|
|
|
+ indexWriter.addDocument(document);
|
|
|
+ indexWriter.close();
|
|
|
+ return DirectoryReader.open(directory);
|
|
|
+ }
|
|
|
+
|
|
|
+ private IndexReader createIndexWithDoubles() throws IOException {
|
|
|
+ Directory directory = newDirectory();
|
|
|
+ RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory);
|
|
|
+ Document document = new Document();
|
|
|
+ document.add(new SortedNumericDocValuesField("number", NumericUtils.doubleToSortableLong(10.0d)));
|
|
|
+ document.add(new SortedNumericDocValuesField("number", NumericUtils.doubleToSortableLong(100.0d)));
|
|
|
+ indexWriter.addDocument(document);
|
|
|
+ document = new Document();
|
|
|
+ document.add(new SortedNumericDocValuesField("number", NumericUtils.doubleToSortableLong(1.0d)));
|
|
|
+ document.add(new SortedNumericDocValuesField("number", NumericUtils.doubleToSortableLong(100.0d)));
|
|
|
+ indexWriter.addDocument(document);
|
|
|
+ document = new Document();
|
|
|
+ document.add(new SortedNumericDocValuesField("number", NumericUtils.doubleToSortableLong(10.0d)));
|
|
|
+ document.add(new SortedNumericDocValuesField("number", NumericUtils.doubleToSortableLong(1000.0d)));
|
|
|
+ indexWriter.addDocument(document);
|
|
|
+ indexWriter.close();
|
|
|
+ return DirectoryReader.open(directory);
|
|
|
+ }
|
|
|
+
|
|
|
+ private InternalAggregation buildInternalAggregation(TermsAggregationBuilder builder, MappedFieldType fieldType,
|
|
|
+ IndexSearcher searcher) throws IOException {
|
|
|
+ try (TermsAggregator aggregator = createAggregator(builder, fieldType, searcher)) {
|
|
|
+ aggregator.preCollection();
|
|
|
+ searcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
+ aggregator.postCollection();
|
|
|
+ return aggregator.buildAggregation(0L);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|