Skip to content

Commit 7bb4098

Browse files
committed
DATAES-81 - extended RangeFacetRequest to support string ranges
1 parent 230c041 commit 7bb4098

File tree

3 files changed

+112
-16
lines changed

3 files changed

+112
-16
lines changed

src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java

Lines changed: 61 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@
2929
* Range facet for numeric fields
3030
*
3131
* @author Artur Konczak
32+
* @author Akos Bordas
3233
*/
3334
public class RangeFacetRequest extends AbstractFacetRequest {
3435

3536
private String field;
3637
private String keyField;
3738
private String valueField;
3839

39-
private List<Double> from = new ArrayList<Double>();
40-
private List<Double> to = new ArrayList<Double>();
40+
private List<Entry> entries = new ArrayList<Entry>();
4141

4242
public RangeFacetRequest(String name) {
4343
super(name);
@@ -53,17 +53,19 @@ public void setFields(String keyField, String valueField) {
5353
}
5454

5555
public void range(Double from, Double to) {
56-
if (from == null) {
57-
this.from.add(Double.NEGATIVE_INFINITY);
58-
} else {
59-
this.from.add(from);
60-
}
56+
entries.add(new DoubleEntry(from, to));
57+
}
6158

62-
if (to == null) {
63-
this.to.add(Double.POSITIVE_INFINITY);
64-
} else {
65-
this.to.add(to);
66-
}
59+
public void range(String from, String to) {
60+
entries.add(new StringEntry(from, to));
61+
}
62+
63+
public void addRange(Double from, Double to) {
64+
entries.add(new DoubleEntry(from, to));
65+
}
66+
67+
public void addRange(String from, String to) {
68+
entries.add(new StringEntry(from, to));
6769
}
6870

6971
@Override
@@ -77,11 +79,54 @@ public FacetBuilder getFacet() {
7779
} else {
7880
builder.field(field);
7981
}
80-
Assert.notEmpty(from, "Please select at last one range");
81-
Assert.notEmpty(to, "Please select at last one range");
82-
for (int i = 0; i < from.size(); i++) {
83-
builder.addRange(from.get(i), to.get(i));
82+
83+
for (Entry entry : entries) {
84+
if (entry instanceof DoubleEntry) {
85+
DoubleEntry doubleEntry = (DoubleEntry) entry;
86+
builder.addRange(validateValue(doubleEntry.getFrom(), Double.NEGATIVE_INFINITY), validateValue(doubleEntry.getTo(), Double.POSITIVE_INFINITY));
87+
} else {
88+
StringEntry stringEntry = (StringEntry) entry;
89+
builder.addRange(stringEntry.getFrom(), stringEntry.getTo());
90+
}
8491
}
92+
8593
return builder;
8694
}
95+
96+
private double validateValue(Double value, double defaultValue) {
97+
return value == null ? defaultValue : value;
98+
}
99+
100+
static class DoubleEntry extends Entry<Double> {
101+
102+
DoubleEntry(Double from, Double to) {
103+
super(from, to);
104+
}
105+
}
106+
107+
static class StringEntry extends Entry<String> {
108+
109+
StringEntry(String from, String to) {
110+
super(from, to);
111+
}
112+
}
113+
114+
static class Entry<T> {
115+
116+
T from;
117+
T to;
118+
119+
Entry(T from, T to) {
120+
this.from = from;
121+
this.to = to;
122+
}
123+
124+
public T getFrom() {
125+
return from;
126+
}
127+
128+
public T getTo() {
129+
return to;
130+
}
131+
}
87132
}

src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequestBuilder.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ public RangeFacetRequestBuilder range(double from, double to) {
4646
return this;
4747
}
4848

49+
public RangeFacetRequestBuilder range(String from, String to) {
50+
result.range(from, to);
51+
return this;
52+
}
53+
4954
public RangeFacetRequestBuilder from(double from) {
5055
result.range(from, null);
5156
return this;
@@ -56,6 +61,16 @@ public RangeFacetRequestBuilder to(double to) {
5661
return this;
5762
}
5863

64+
public RangeFacetRequestBuilder from(String from) {
65+
result.range(from, null);
66+
return this;
67+
}
68+
69+
public RangeFacetRequestBuilder to(String to) {
70+
result.range(null, to);
71+
return this;
72+
}
73+
5974
public RangeFacetRequestBuilder applyQueryFilter() {
6075
result.setApplyQueryFilter(true);
6176
return this;

src/test/java/org/springframework/data/elasticsearch/core/facet/ElasticsearchTemplateFacetTests.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,42 @@ public void shouldReturnKeyValueRangeFacetForGivenQuery() {
473473
assertThat(range.getTotal(), is(40.0));
474474
}
475475

476+
@Test
477+
public void shouldReturnKeyValueRangeFacetForStringValuesInGivenQuery() {
478+
// given
479+
String facetName = "rangeScoreOverYears";
480+
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
481+
.withFacet(
482+
new RangeFacetRequestBuilder(facetName).fields(PUBLISHED_YEARS, "score")
483+
.to("2000").range("2000", "2002").from("2002").build()
484+
).build();
485+
// when
486+
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
487+
// then
488+
assertThat(result.getNumberOfElements(), is(equalTo(4)));
489+
490+
RangeResult facet = (RangeResult) result.getFacet(facetName);
491+
assertThat(facet.getRanges().size(), is(equalTo(3)));
492+
493+
Range range = facet.getRanges().get(0);
494+
assertThat(range.getFrom(), nullValue());
495+
assertThat(range.getTo(), is((double) YEAR_2000));
496+
assertThat(range.getCount(), is(0L));
497+
assertThat(range.getTotal(), is(0.0));
498+
499+
range = facet.getRanges().get(1);
500+
assertThat(range.getFrom(), is((double) YEAR_2000));
501+
assertThat(range.getTo(), is((double) YEAR_2002));
502+
assertThat(range.getCount(), is(3L));
503+
assertThat(range.getTotal(), is(90.0));
504+
505+
range = facet.getRanges().get(2);
506+
assertThat(range.getFrom(), is((double) YEAR_2002));
507+
assertThat(range.getTo(), nullValue());
508+
assertThat(range.getCount(), is(1L));
509+
assertThat(range.getTotal(), is(40.0));
510+
}
511+
476512
@Test
477513
public void shouldReturnStatisticalFacetForGivenQuery() {
478514
// given

0 commit comments

Comments
 (0)