From 392a87ab0a6e2eadf9eaa0c8e2006a860db23fea Mon Sep 17 00:00:00 2001 From: Artur Konczak Date: Tue, 31 May 2016 16:47:48 +0100 Subject: [PATCH] DATAES-180 - added faceted page back powered by aggregation --- .../elasticsearch/core/FacetedPageImpl.java | 29 ++- .../core/facet/AbstractFacetRequest.java | 2 + .../core/facet/DefaultFacetMapper.java | 81 ------- .../facet/request/HistogramFacetRequest.java | 2 + .../core/facet/request/RangeFacetRequest.java | 12 +- .../request/StatisticalFacetRequest.java | 2 +- .../core/facet/request/TermFacetRequest.java | 10 +- .../ElasticsearchTemplateFacetTests.java | 200 +++++++----------- 8 files changed, 122 insertions(+), 216 deletions(-) delete mode 100644 src/main/java/org/springframework/data/elasticsearch/core/facet/DefaultFacetMapper.java diff --git a/src/main/java/org/springframework/data/elasticsearch/core/FacetedPageImpl.java b/src/main/java/org/springframework/data/elasticsearch/core/FacetedPageImpl.java index 79d6d1fde..d0a728516 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/FacetedPageImpl.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/FacetedPageImpl.java @@ -24,11 +24,15 @@ import org.elasticsearch.search.aggregations.Aggregation; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.range.Range; import org.elasticsearch.search.aggregations.bucket.terms.Terms; -import org.elasticsearch.search.aggregations.metrics.stats.Stats; +import org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStats; +import org.elasticsearch.search.aggregations.metrics.sum.Sum; +import org.joda.time.DateTime; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; +import org.springframework.data.elasticsearch.core.facet.AbstractFacetRequest; import org.springframework.data.elasticsearch.core.facet.FacetResult; +import org.springframework.data.elasticsearch.core.facet.request.RangeFacetRequest; import org.springframework.data.elasticsearch.core.facet.result.*; /** @@ -88,24 +92,35 @@ public abstract class FacetedPageImpl extends PageImpl implements FacetedP for (Terms.Bucket t : ((Terms) agg).getBuckets()) { terms.add(new Term(t.getKeyAsString(), t.getDocCount())); } - addFacet(new TermResult(agg.getName(), terms, terms.size(), ((Terms) agg).getSumOfOtherDocCounts(), -1)); + addFacet(new TermResult(agg.getName(), terms, terms.size(), ((Terms) agg).getSumOfOtherDocCounts(), 0)); } if (agg instanceof Range) { List buckets = ((Range) agg).getBuckets(); List ranges = new ArrayList(); for (Range.Bucket b : buckets) { - ranges.add(new org.springframework.data.elasticsearch.core.facet.result.Range((Double) b.getFrom(), (Double) b.getTo(), b.getDocCount(), 0, 0, 0, 0)); + ExtendedStats rStats = (ExtendedStats) b.getAggregations().get(AbstractFacetRequest.INTERNAL_STATS); + if (rStats != null) { + Sum sum = (Sum) b.getAggregations().get(RangeFacetRequest.RANGE_INTERNAL_SUM); + ranges.add(new org.springframework.data.elasticsearch.core.facet.result.Range((Double) b.getFrom(), (Double) b.getTo(), b.getDocCount(), sum != null ? sum.getValue() : rStats.getSum(), rStats.getCount(), rStats.getMin(), rStats.getMax())); + } else { + ranges.add(new org.springframework.data.elasticsearch.core.facet.result.Range((Double) b.getFrom(), (Double) b.getTo(), b.getDocCount(), 0, 0, 0, 0)); + } } addFacet(new RangeResult(agg.getName(), ranges)); } - if (agg instanceof Stats) { - Stats stats = (Stats) agg; - addFacet(new StatisticalResult(agg.getName(), stats.getCount(), stats.getMax(), stats.getMin(), stats.getAvg(), -1, -1, stats.getSum(), -1)); + if (agg instanceof ExtendedStats) { + ExtendedStats stats = (ExtendedStats) agg; + addFacet(new StatisticalResult(agg.getName(), stats.getCount(), stats.getMax(), stats.getMin(), stats.getAvg(), stats.getStdDeviation(), stats.getSumOfSquares(), stats.getSum(), stats.getVariance())); } if (agg instanceof Histogram) { List intervals = new ArrayList(); for (Histogram.Bucket h : ((Histogram) agg).getBuckets()) { - new IntervalUnit((Long) h.getKey(), h.getDocCount(), h.getDocCount(), -1, -1, -1, -1); + ExtendedStats hStats = (ExtendedStats) h.getAggregations().get(AbstractFacetRequest.INTERNAL_STATS); + if (hStats != null) { + intervals.add(new IntervalUnit(((DateTime) h.getKey()).getMillis(), h.getDocCount(), h.getDocCount(), hStats.getSum(), hStats.getAvg(), hStats.getMin(), hStats.getMax())); + } else { + intervals.add(new IntervalUnit(((DateTime) h.getKey()).getMillis(), h.getDocCount(), h.getDocCount(), 0, 0, 0, 0)); + } } addFacet(new HistogramResult(agg.getName(), intervals)); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/AbstractFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/AbstractFacetRequest.java index 7008f8f14..2d0cbcd66 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/AbstractFacetRequest.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/facet/AbstractFacetRequest.java @@ -25,6 +25,8 @@ import org.springframework.util.Assert; @Deprecated public abstract class AbstractFacetRequest implements FacetRequest { + public static final String INTERNAL_STATS = "internal-stats"; + private String name; private boolean applyQueryFilter; diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/DefaultFacetMapper.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/DefaultFacetMapper.java deleted file mode 100644 index 0195e02b1..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/DefaultFacetMapper.java +++ /dev/null @@ -1,81 +0,0 @@ -///* -// * Copyright 2014 the original author or authors. -// * -// * Licensed 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 org.springframework.data.elasticsearch.core.facet; -// -//import java.util.ArrayList; -//import java.util.List; -// -//import org.elasticsearch.search.facet.Facet; -//import org.elasticsearch.search.facet.histogram.HistogramFacet; -//import org.elasticsearch.search.facet.range.RangeFacet; -//import org.elasticsearch.search.facet.statistical.StatisticalFacet; -//import org.elasticsearch.search.facet.terms.TermsFacet; -//import org.springframework.data.elasticsearch.core.facet.result.*; -// -///** -// * @author Artur Konczak -// * @author Petar Tahchiev -// */ -//public class DefaultFacetMapper { -// -// public static FacetResult parse(Facet facet) { -// if (facet instanceof TermsFacet) { -// return parseTerm((TermsFacet) facet); -// } -// -// if (facet instanceof RangeFacet) { -// return parseRange((RangeFacet) facet); -// } -// -// if (facet instanceof StatisticalFacet) { -// return parseStatistical((StatisticalFacet) facet); -// } -// -// if (facet instanceof HistogramFacet) { -// return parseHistogram((HistogramFacet) facet); -// } -// -// return null; -// } -// -// private static FacetResult parseTerm(TermsFacet facet) { -// List entries = new ArrayList(); -// for (TermsFacet.Entry entry : facet.getEntries()) { -// entries.add(new Term(entry.getTerm().toString(), entry.getCount())); -// } -// return new TermResult(facet.getName(), entries, facet.getTotalCount(), facet.getOtherCount(), facet.getMissingCount()); -// } -// -// private static FacetResult parseRange(RangeFacet facet) { -// List entries = new ArrayList(); -// for (RangeFacet.Entry entry : facet.getEntries()) { -// entries.add(new Range(entry.getFrom() == Double.NEGATIVE_INFINITY ? null : entry.getFrom(), entry.getTo() == Double.POSITIVE_INFINITY ? null : entry.getTo(), entry.getCount(), entry.getTotal(), entry.getTotalCount(), entry.getMin(), entry.getMax())); -// } -// return new RangeResult(facet.getName(), entries); -// } -// -// private static FacetResult parseStatistical(StatisticalFacet facet) { -// return new StatisticalResult(facet.getName(), facet.getCount(), facet.getMax(), facet.getMin(), facet.getMean(), facet.getStdDeviation(), facet.getSumOfSquares(), facet.getTotal(), facet.getVariance()); -// } -// -// private static FacetResult parseHistogram(HistogramFacet facet) { -// List entries = new ArrayList(); -// for (HistogramFacet.Entry entry : facet.getEntries()) { -// entries.add(new IntervalUnit(entry.getKey(), entry.getCount(), entry.getTotalCount(), entry.getTotal(), entry.getMean(), entry.getMin(), entry.getMax())); -// } -// return new HistogramResult(facet.getName(), entries); -// } -//} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequest.java index 83d7e78b6..1923041b7 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequest.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequest.java @@ -66,6 +66,8 @@ public class HistogramFacetRequest extends AbstractFacetRequest { dateHistogramBuilder.interval(interval); } + dateHistogramBuilder.subAggregation(AggregationBuilders.extendedStats(INTERNAL_STATS)); + return dateHistogramBuilder; } } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java index 063bf7ea5..7b1999889 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java @@ -19,6 +19,7 @@ package org.springframework.data.elasticsearch.core.facet.request; import java.util.ArrayList; import java.util.List; +import org.apache.commons.lang.StringUtils; import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.range.RangeBuilder; @@ -35,6 +36,7 @@ import org.springframework.util.Assert; @Deprecated public class RangeFacetRequest extends AbstractFacetRequest { + public static final String RANGE_INTERNAL_SUM = "range-internal-sum"; private String field; private String keyField; private String valueField; @@ -50,7 +52,8 @@ public class RangeFacetRequest extends AbstractFacetRequest { } public void setFields(String keyField, String valueField) { - throw new UnsupportedOperationException("Native Facet are not supported in Elasticsearch 2.x - use Aggregation"); + this.keyField = keyField; + this.valueField = valueField; } public void range(Double from, Double to) { @@ -74,13 +77,18 @@ public class RangeFacetRequest extends AbstractFacetRequest { Assert.notNull(getName(), "Facet name can't be a null !!!"); RangeBuilder rangeBuilder = AggregationBuilders.range(getName()); - rangeBuilder.field(field); + rangeBuilder.field(StringUtils.isNotBlank(keyField) ? keyField : field ); for (Entry entry : entries) { DoubleEntry doubleEntry = (DoubleEntry) entry; rangeBuilder.addRange(validateValue(doubleEntry.getFrom(), Double.NEGATIVE_INFINITY), validateValue(doubleEntry.getTo(), Double.POSITIVE_INFINITY)); } + rangeBuilder.subAggregation(AggregationBuilders.extendedStats(INTERNAL_STATS)); + if(StringUtils.isNotBlank(valueField)){ + rangeBuilder.subAggregation(AggregationBuilders.sum(RANGE_INTERNAL_SUM).field(valueField)); + } + return rangeBuilder; } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/StatisticalFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/StatisticalFacetRequest.java index f7170222a..85496b349 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/StatisticalFacetRequest.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/StatisticalFacetRequest.java @@ -48,6 +48,6 @@ public class StatisticalFacetRequest extends AbstractFacetRequest { public AbstractAggregationBuilder getFacet() { Assert.notNull(getName(), "Facet name can't be a null !!!"); Assert.isTrue(StringUtils.isNotBlank(field) && fields == null, "Please select field or fields on which to build the facets !!!"); - return AggregationBuilders.stats(getName()).field(field); + return AggregationBuilders.extendedStats(getName()).field(field); } } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequest.java index 8a67ab2c5..72859ecc6 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequest.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequest.java @@ -46,8 +46,8 @@ public class TermFacetRequest extends AbstractFacetRequest { } public void setFields(String... fields) { - Assert.isTrue(ArrayUtils.isNotEmpty(fields), "Term agg need one field"); - Assert.isTrue(ArrayUtils.getLength(fields) == 1, "Term agg need one field"); + Assert.isTrue(ArrayUtils.isNotEmpty(fields), "Term agg need one field only"); + Assert.isTrue(ArrayUtils.getLength(fields) == 1, "Term agg need one field only"); this.fields = fields; } @@ -84,11 +84,11 @@ public class TermFacetRequest extends AbstractFacetRequest { case ascTerm: termsBuilder.order(Terms.Order.term(true)); break; - case ascCount: - termsBuilder.order(Terms.Order.count(true)); + case descCount: + termsBuilder.order(Terms.Order.count(false)); break; default: - termsBuilder.order(Terms.Order.count(false)); + termsBuilder.order(Terms.Order.count(true)); } if (ArrayUtils.isNotEmpty(excludeTerms)) { termsBuilder.exclude(excludeTerms); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/facet/ElasticsearchTemplateFacetTests.java b/src/test/java/org/springframework/data/elasticsearch/core/facet/ElasticsearchTemplateFacetTests.java index ab97d5360..11ddc2e4f 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/facet/ElasticsearchTemplateFacetTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/facet/ElasticsearchTemplateFacetTests.java @@ -12,7 +12,7 @@ * 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 org.springframework.data.elasticsearch.core.facet; @@ -20,8 +20,6 @@ import static org.elasticsearch.index.query.QueryBuilders.*; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; -import org.elasticsearch.index.query.FilterBuilders; -import org.elasticsearch.search.facet.FacetBuilders; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,13 +34,12 @@ import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -*/ /** * @author Rizwan Idrees * @author Mohsin Husen * @author Jonathan Yan * @author Artur Konczak - *//* + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:elasticsearch-template-test.xml") @@ -64,7 +61,7 @@ public class ElasticsearchTemplateFacetTests { elasticsearchTemplate.deleteIndex(ArticleEntity.class); elasticsearchTemplate.createIndex(ArticleEntity.class); elasticsearchTemplate.putMapping(ArticleEntity.class); - elasticsearchTemplate.refresh(ArticleEntity.class, true); + elasticsearchTemplate.refresh(ArticleEntity.class); IndexQuery article1 = new ArticleEntityBuilder("1").title("article four").addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addAuthor(JONATHAN_YAN).score(10).buildIndex(); IndexQuery article2 = new ArticleEntityBuilder("2").title("article three").addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addPublishedYear(YEAR_2000).score(20).buildIndex(); @@ -75,7 +72,7 @@ public class ElasticsearchTemplateFacetTests { elasticsearchTemplate.index(article2); elasticsearchTemplate.index(article3); elasticsearchTemplate.index(article4); - elasticsearchTemplate.refresh(ArticleEntity.class, true); + elasticsearchTemplate.refresh(ArticleEntity.class); } @Test @@ -92,21 +89,21 @@ public class ElasticsearchTemplateFacetTests { TermResult facet = (TermResult) result.getFacet(facetName); Term term = facet.getTerms().get(0); assertThat(term.getTerm(), is(RIZWAN_IDREES)); - assertThat(term.getCount(), is(4)); + assertThat(term.getCount(), is(4l)); term = facet.getTerms().get(1); assertThat(term.getTerm(), is(ARTUR_KONCZAK)); - assertThat(term.getCount(), is(3)); + assertThat(term.getCount(), is(3l)); term = facet.getTerms().get(2); assertThat(term.getTerm(), is(MOHSIN_HUSEN)); - assertThat(term.getCount(), is(2)); + assertThat(term.getCount(), is(2l)); term = facet.getTerms().get(3); assertThat(term.getTerm(), is(JONATHAN_YAN)); - assertThat(term.getCount(), is(1)); + assertThat(term.getCount(), is(1l)); - assertThat(facet.getTotal(), is(10l)); + assertThat(facet.getTotal(), is(4l)); assertThat(facet.getOther(), is(0l)); assertThat(facet.getMissing(), is(0l)); } @@ -117,27 +114,26 @@ public class ElasticsearchTemplateFacetTests { // given String facetName = "fauthors"; SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFilter(FilterBuilders.notFilter(FilterBuilders.termFilter("title", "four"))) .withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").build()).build(); // when FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); // then - assertThat(result.getNumberOfElements(), is(equalTo(3))); + assertThat(result.getNumberOfElements(), is(equalTo(4))); TermResult facet = (TermResult) result.getFacet(facetName); Term term = facet.getTerms().get(0); assertThat(term.getTerm(), is(RIZWAN_IDREES)); - assertThat(term.getCount(), is(3)); + assertThat(term.getCount(), is(4l)); term = facet.getTerms().get(1); assertThat(term.getTerm(), is(ARTUR_KONCZAK)); - assertThat(term.getCount(), is(2)); + assertThat(term.getCount(), is(3l)); term = facet.getTerms().get(2); assertThat(term.getTerm(), is(MOHSIN_HUSEN)); - assertThat(term.getCount(), is(1)); + assertThat(term.getCount(), is(2l)); - assertThat(facet.getTotal(), is(6l)); + assertThat(facet.getTotal(), is(4l)); assertThat(facet.getOther(), is(0l)); assertThat(facet.getMissing(), is(0l)); } @@ -147,23 +143,26 @@ public class ElasticsearchTemplateFacetTests { // given String facetName = "fauthors"; SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFilter(FilterBuilders.notFilter(FilterBuilders.termFilter("title", "four"))) .withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").excludeTerms(RIZWAN_IDREES, ARTUR_KONCZAK).build()).build(); // when FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); // then - assertThat(result.getNumberOfElements(), is(equalTo(3))); + assertThat(result.getNumberOfElements(), is(equalTo(4))); TermResult facet = (TermResult) result.getFacet(facetName); - assertThat(facet.getTerms().size(), is(1)); + assertThat(facet.getTerms().size(), is(2)); Term term = facet.getTerms().get(0); assertThat(term.getTerm(), is(MOHSIN_HUSEN)); - assertThat(term.getCount(), is(1)); + assertThat(term.getCount(), is(2l)); + + Term term1 = facet.getTerms().get(1); + assertThat(term1.getTerm(), is(JONATHAN_YAN)); + assertThat(term1.getCount(), is(1l)); - assertThat(facet.getTotal(), is(6l)); - assertThat(facet.getOther(), is(5l)); + assertThat(facet.getTotal(), is(2l)); + assertThat(facet.getOther(), is(0l)); assertThat(facet.getMissing(), is(0l)); } @@ -182,21 +181,21 @@ public class ElasticsearchTemplateFacetTests { TermResult facet = (TermResult) result.getFacet(facetName); Term term = facet.getTerms().get(0); assertThat(term.getTerm(), is(ARTUR_KONCZAK)); - assertThat(term.getCount(), is(3)); + assertThat(term.getCount(), is(3l)); term = facet.getTerms().get(1); assertThat(term.getTerm(), is(JONATHAN_YAN)); - assertThat(term.getCount(), is(1)); + assertThat(term.getCount(), is(1l)); term = facet.getTerms().get(2); assertThat(term.getTerm(), is(MOHSIN_HUSEN)); - assertThat(term.getCount(), is(2)); + assertThat(term.getCount(), is(2l)); term = facet.getTerms().get(3); assertThat(term.getTerm(), is(RIZWAN_IDREES)); - assertThat(term.getCount(), is(4)); + assertThat(term.getCount(), is(4l)); - assertThat(facet.getTotal(), is(10l)); + assertThat(facet.getTotal(), is(4l)); assertThat(facet.getOther(), is(0l)); assertThat(facet.getMissing(), is(0l)); } @@ -216,21 +215,21 @@ public class ElasticsearchTemplateFacetTests { TermResult facet = (TermResult) result.getFacet(facetName); Term term = facet.getTerms().get(0); assertThat(term.getTerm(), is(JONATHAN_YAN)); - assertThat(term.getCount(), is(1)); + assertThat(term.getCount(), is(1l)); term = facet.getTerms().get(1); assertThat(term.getTerm(), is(MOHSIN_HUSEN)); - assertThat(term.getCount(), is(2)); + assertThat(term.getCount(), is(2l)); term = facet.getTerms().get(2); assertThat(term.getTerm(), is(ARTUR_KONCZAK)); - assertThat(term.getCount(), is(3)); + assertThat(term.getCount(), is(3l)); term = facet.getTerms().get(3); assertThat(term.getTerm(), is(RIZWAN_IDREES)); - assertThat(term.getCount(), is(4)); + assertThat(term.getCount(), is(4l)); - assertThat(facet.getTotal(), is(10l)); + assertThat(facet.getTotal(), is(4l)); assertThat(facet.getOther(), is(0l)); assertThat(facet.getMissing(), is(0l)); } @@ -252,19 +251,19 @@ public class ElasticsearchTemplateFacetTests { Term term = facet.getTerms().get(0); assertThat(term.getTerm(), is(Integer.toString(YEAR_2000))); - assertThat(term.getCount(), is(3)); + assertThat(term.getCount(), is(3l)); term = facet.getTerms().get(1); assertThat(term.getTerm(), is(Integer.toString(YEAR_2001))); - assertThat(term.getCount(), is(2)); + assertThat(term.getCount(), is(2l)); term = facet.getTerms().get(2); assertThat(term.getTerm(), is(Integer.toString(YEAR_2002))); - assertThat(term.getCount(), is(1)); + assertThat(term.getCount(), is(1l)); - assertThat(facet.getTotal(), is(6l)); + assertThat(facet.getTotal(), is(3l)); assertThat(facet.getOther(), is(0l)); - assertThat(facet.getMissing(), is(1l)); + assertThat(facet.getMissing(), is(0l)); } @Test @@ -273,36 +272,35 @@ public class ElasticsearchTemplateFacetTests { // given String facetName = "fyears"; SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFilter(FilterBuilders.notFilter(FilterBuilders.missingFilter("publishedYears"))) .withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("publishedYears").descCount().build()).build(); // when FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); // then - assertThat(result.getNumberOfElements(), is(equalTo(3))); + assertThat(result.getNumberOfElements(), is(equalTo(4))); TermResult facet = (TermResult) result.getFacet(facetName); assertThat(facet.getTerms().size(), is(equalTo(3))); Term term = facet.getTerms().get(0); assertThat(term.getTerm(), is(Integer.toString(YEAR_2000))); - assertThat(term.getCount(), is(3)); + assertThat(term.getCount(), is(3l)); term = facet.getTerms().get(1); assertThat(term.getTerm(), is(Integer.toString(YEAR_2001))); - assertThat(term.getCount(), is(2)); + assertThat(term.getCount(), is(2l)); term = facet.getTerms().get(2); assertThat(term.getTerm(), is(Integer.toString(YEAR_2002))); - assertThat(term.getCount(), is(1)); + assertThat(term.getCount(), is(1l)); - assertThat(facet.getTotal(), is(6l)); + assertThat(facet.getTotal(), is(3l)); assertThat(facet.getOther(), is(0l)); assertThat(facet.getMissing(), is(0l)); } - @Test - public void shouldReturnSingleFacetOverYearsAndAuthorsForGivenQuery() { + @Test(expected = IllegalArgumentException.class) + public void shouldThrowExeptionsForMultiFieldFacet() { // given String facetName = "fyears"; @@ -318,31 +316,31 @@ public class ElasticsearchTemplateFacetTests { Term term = facet.getTerms().get(0); assertThat(term.getTerm(), is(Integer.toString(YEAR_2000))); - assertThat(term.getCount(), is(3)); + assertThat(term.getCount(), is(3l)); term = facet.getTerms().get(1); assertThat(term.getTerm(), is(Integer.toString(YEAR_2001))); - assertThat(term.getCount(), is(2)); + assertThat(term.getCount(), is(2l)); term = facet.getTerms().get(2); assertThat(term.getTerm(), is(Integer.toString(YEAR_2002))); - assertThat(term.getCount(), is(1)); + assertThat(term.getCount(), is(1l)); term = facet.getTerms().get(3); assertThat(term.getTerm(), is(ARTUR_KONCZAK)); - assertThat(term.getCount(), is(3)); + assertThat(term.getCount(), is(3l)); term = facet.getTerms().get(4); assertThat(term.getTerm(), is(JONATHAN_YAN)); - assertThat(term.getCount(), is(1)); + assertThat(term.getCount(), is(1l)); term = facet.getTerms().get(5); assertThat(term.getTerm(), is(MOHSIN_HUSEN)); - assertThat(term.getCount(), is(2)); + assertThat(term.getCount(), is(2l)); term = facet.getTerms().get(6); assertThat(term.getTerm(), is(RIZWAN_IDREES)); - assertThat(term.getCount(), is(4)); + assertThat(term.getCount(), is(4l)); assertThat(facet.getTotal(), is(16l)); assertThat(facet.getOther(), is(0l)); @@ -369,46 +367,46 @@ public class ElasticsearchTemplateFacetTests { Term numberTerm = numberFacet.getTerms().get(0); assertThat(numberTerm.getTerm(), is(Integer.toString(YEAR_2000))); - assertThat(numberTerm.getCount(), is(3)); + assertThat(numberTerm.getCount(), is(3l)); numberTerm = numberFacet.getTerms().get(1); assertThat(numberTerm.getTerm(), is(Integer.toString(YEAR_2001))); - assertThat(numberTerm.getCount(), is(2)); + assertThat(numberTerm.getCount(), is(2l)); numberTerm = numberFacet.getTerms().get(2); assertThat(numberTerm.getTerm(), is(Integer.toString(YEAR_2002))); - assertThat(numberTerm.getCount(), is(1)); + assertThat(numberTerm.getCount(), is(1l)); TermResult stringFacet = (TermResult) result.getFacet(stringFacetName); Term stringTerm = stringFacet.getTerms().get(0); assertThat(stringTerm.getTerm(), is(ARTUR_KONCZAK)); - assertThat(stringTerm.getCount(), is(3)); + assertThat(stringTerm.getCount(), is(3l)); stringTerm = stringFacet.getTerms().get(1); assertThat(stringTerm.getTerm(), is(JONATHAN_YAN)); - assertThat(stringTerm.getCount(), is(1)); + assertThat(stringTerm.getCount(), is(1l)); stringTerm = stringFacet.getTerms().get(2); assertThat(stringTerm.getTerm(), is(MOHSIN_HUSEN)); - assertThat(stringTerm.getCount(), is(2)); + assertThat(stringTerm.getCount(), is(2l)); stringTerm = stringFacet.getTerms().get(3); assertThat(stringTerm.getTerm(), is(RIZWAN_IDREES)); - assertThat(stringTerm.getCount(), is(4)); + assertThat(stringTerm.getCount(), is(4l)); - assertThat(stringFacet.getTotal(), is(10l)); + assertThat(stringFacet.getTotal(), is(4l)); assertThat(stringFacet.getOther(), is(0l)); assertThat(stringFacet.getMissing(), is(0l)); } - @Test - public void shouldReturnFacetedYearsForNativeFacet() { + @Test(expected = UnsupportedOperationException.class) + public void shouldThrowExceptionForNativeFacets() { // given String facetName = "fyears"; SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new NativeFacetRequest(FacetBuilders.termsFacet(facetName).field("publishedYears"))).build(); + .withFacet(new NativeFacetRequest()).build(); // when FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); // then @@ -419,15 +417,15 @@ public class ElasticsearchTemplateFacetTests { Term term = facet.getTerms().get(0); assertThat(term.getTerm(), is(Integer.toString(YEAR_2000))); - assertThat(term.getCount(), is(3)); + assertThat(term.getCount(), is(3l)); term = facet.getTerms().get(1); assertThat(term.getTerm(), is(Integer.toString(YEAR_2001))); - assertThat(term.getCount(), is(2)); + assertThat(term.getCount(), is(2l)); term = facet.getTerms().get(2); assertThat(term.getTerm(), is(Integer.toString(YEAR_2002))); - assertThat(term.getCount(), is(1)); + assertThat(term.getCount(), is(1l)); assertThat(facet.getTotal(), is(6l)); assertThat(facet.getOther(), is(0l)); @@ -439,12 +437,11 @@ public class ElasticsearchTemplateFacetTests { // given String facetName = "regex_authors"; SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFilter(FilterBuilders.notFilter(FilterBuilders.termFilter("title", "four"))) .withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").regex("Art.*").build()).build(); // when FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); // then - assertThat(result.getNumberOfElements(), is(equalTo(3))); + assertThat(result.getNumberOfElements(), is(equalTo(4))); TermResult facet = (TermResult) result.getFacet(facetName); @@ -452,10 +449,10 @@ public class ElasticsearchTemplateFacetTests { Term term = facet.getTerms().get(0); assertThat(term.getTerm(), is(ARTUR_KONCZAK)); - assertThat(term.getCount(), is(2)); + assertThat(term.getCount(), is(3l)); - assertThat(facet.getTotal(), is(6l)); - assertThat(facet.getOther(), is(4l)); + assertThat(facet.getTotal(), is(1l)); + assertThat(facet.getOther(), is(0l)); assertThat(facet.getMissing(), is(0l)); } @@ -464,18 +461,17 @@ public class ElasticsearchTemplateFacetTests { // given String facetName = "all_authors"; SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFilter(FilterBuilders.notFilter(FilterBuilders.termFilter("title", "four"))) .withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").allTerms().build()).build(); // when FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); // then - assertThat(result.getNumberOfElements(), is(equalTo(3))); + assertThat(result.getNumberOfElements(), is(equalTo(4))); TermResult facet = (TermResult) result.getFacet(facetName); assertThat(facet.getTerms().size(), is(4)); - assertThat(facet.getTotal(), is(6l)); + assertThat(facet.getTotal(), is(4l)); assertThat(facet.getOther(), is(0l)); assertThat(facet.getMissing(), is(0l)); } @@ -499,7 +495,7 @@ public class ElasticsearchTemplateFacetTests { assertThat(facet.getRanges().size(), is(equalTo(3))); Range range = facet.getRanges().get(0); - assertThat(range.getFrom(), nullValue()); + assertThat(range.getFrom(), is(Double.NEGATIVE_INFINITY)); assertThat(range.getTo(), is((double) YEAR_2000)); assertThat(range.getCount(), is(0L)); assertThat(range.getTotal(), is(0.0)); @@ -508,17 +504,17 @@ public class ElasticsearchTemplateFacetTests { assertThat(range.getFrom(), is((double) YEAR_2000)); assertThat(range.getTo(), is((double) YEAR_2002)); assertThat(range.getCount(), is(3L)); - assertThat(range.getTotal(), is(6000.0)); + assertThat(range.getTotal(), is(12004.0)); range = facet.getRanges().get(2); assertThat(range.getFrom(), is((double) YEAR_2002)); - assertThat(range.getTo(), nullValue()); + assertThat(range.getTo(), is(Double.POSITIVE_INFINITY)); assertThat(range.getCount(), is(1L)); - assertThat(range.getTotal(), is(2002.0)); + assertThat(range.getTotal(), is(6003.0)); } @Test - public void shouldReturnKeyValueRangeFacetForGivenQuery() { + public void shouldReturnKeyValueRangeFacetForStringValuesInGivenQuery() { // given String facetName = "rangeScoreOverYears"; SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) @@ -535,7 +531,7 @@ public class ElasticsearchTemplateFacetTests { assertThat(facet.getRanges().size(), is(equalTo(3))); Range range = facet.getRanges().get(0); - assertThat(range.getFrom(), nullValue()); + assertThat(range.getFrom(), is(Double.NEGATIVE_INFINITY)); assertThat(range.getTo(), is((double) YEAR_2000)); assertThat(range.getCount(), is(0L)); assertThat(range.getTotal(), is(0.0)); @@ -548,43 +544,7 @@ public class ElasticsearchTemplateFacetTests { range = facet.getRanges().get(2); assertThat(range.getFrom(), is((double) YEAR_2002)); - assertThat(range.getTo(), nullValue()); - assertThat(range.getCount(), is(1L)); - assertThat(range.getTotal(), is(40.0)); - } - - @Test - public void shouldReturnKeyValueRangeFacetForStringValuesInGivenQuery() { - // given - String facetName = "rangeScoreOverYears"; - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet( - new RangeFacetRequestBuilder(facetName).fields(PUBLISHED_YEARS, "score") - .to("2000").range("2000", "2002").from("2002").build() - ).build(); - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - // then - assertThat(result.getNumberOfElements(), is(equalTo(4))); - - RangeResult facet = (RangeResult) result.getFacet(facetName); - assertThat(facet.getRanges().size(), is(equalTo(3))); - - Range range = facet.getRanges().get(0); - assertThat(range.getFrom(), nullValue()); - assertThat(range.getTo(), is((double) YEAR_2000)); - assertThat(range.getCount(), is(0L)); - assertThat(range.getTotal(), is(0.0)); - - range = facet.getRanges().get(1); - assertThat(range.getFrom(), is((double) YEAR_2000)); - assertThat(range.getTo(), is((double) YEAR_2002)); - assertThat(range.getCount(), is(3L)); - assertThat(range.getTotal(), is(90.0)); - - range = facet.getRanges().get(2); - assertThat(range.getFrom(), is((double) YEAR_2002)); - assertThat(range.getTo(), nullValue()); + assertThat(range.getTo(), is(Double.POSITIVE_INFINITY)); assertThat(range.getCount(), is(1L)); assertThat(range.getTotal(), is(40.0)); } @@ -635,4 +595,4 @@ public class ElasticsearchTemplateFacetTests { assertThat(unit.getCount(), is(1L)); } } -*/ +