Skip to content

Commit 839d4f3

Browse files
committed
DATAES-10 added support for term and range facet
1 parent 8862e01 commit 839d4f3

23 files changed

+594
-154
lines changed

src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
4848
import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter;
4949
import org.springframework.data.elasticsearch.core.facet.FacetMapper;
50+
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
5051
import org.springframework.data.elasticsearch.core.facet.FacetResult;
5152
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
5253
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;

src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import org.elasticsearch.common.xcontent.XContentBuilder;
1919
import org.springframework.data.elasticsearch.annotations.*;
20-
import org.springframework.data.elasticsearch.core.query.FacetRequest;
20+
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
2121
import org.springframework.data.mapping.model.SimpleTypeHolder;
2222
import org.springframework.data.util.ClassTypeInformation;
2323
import org.springframework.data.util.TypeInformation;

src/main/java/org/springframework/data/elasticsearch/core/query/AbstractFacetRequest.java renamed to src/main/java/org/springframework/data/elasticsearch/core/facet/AbstractFacetRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.springframework.data.elasticsearch.core.query;
1+
package org.springframework.data.elasticsearch.core.facet;
22

33
import org.springframework.util.Assert;
44

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package org.springframework.data.elasticsearch.core.facet;
22

33
import org.elasticsearch.search.facet.Facet;
4+
import org.elasticsearch.search.facet.range.RangeFacet;
45
import org.elasticsearch.search.facet.terms.TermsFacet;
6+
import org.springframework.data.elasticsearch.core.facet.result.Range;
7+
import org.springframework.data.elasticsearch.core.facet.result.RangeResult;
8+
import org.springframework.data.elasticsearch.core.facet.result.Term;
9+
import org.springframework.data.elasticsearch.core.facet.result.TermResult;
510

611
import java.util.ArrayList;
712
import java.util.List;
@@ -11,19 +16,32 @@
1116
*/
1217
public class FacetMapper {
1318

14-
public static FacetResult parse(Facet facet){
15-
if(facet instanceof TermsFacet){
19+
public static FacetResult parse(Facet facet) {
20+
if (facet instanceof TermsFacet) {
1621
return parseTerm((TermsFacet) facet);
1722
}
23+
24+
if (facet instanceof RangeFacet) {
25+
return parseRange((RangeFacet) facet);
26+
}
27+
1828
return null;
1929
}
2030

2131
private static FacetResult parseTerm(TermsFacet facet) {
22-
List<Term> terms = new ArrayList<Term>();
23-
for(TermsFacet.Entry entry:facet.getEntries()){
24-
terms.add(new Term(entry.getTerm().toString(),entry.getCount()));
32+
List<Term> entries = new ArrayList<Term>();
33+
for (TermsFacet.Entry entry : facet.getEntries()) {
34+
entries.add(new Term(entry.getTerm().toString(), entry.getCount()));
35+
}
36+
return new TermResult(facet.getName(), entries);
37+
}
38+
39+
private static FacetResult parseRange(RangeFacet facet) {
40+
List<Range> entries = new ArrayList<Range>();
41+
for (RangeFacet.Entry entry : facet.getEntries()) {
42+
entries.add(new Range(entry.getFrom() == Double.NEGATIVE_INFINITY ? null : entry.getFrom(), entry.getTo() == Double.POSITIVE_INFINITY ? null : entry.getTo(), entry.getCount(), entry.getTotal()));
2543
}
26-
return new TermResult(facet.getName(),terms);
44+
return new RangeResult(facet.getName(), entries);
2745
}
2846

2947
}

src/main/java/org/springframework/data/elasticsearch/core/query/FacetRequest.java renamed to src/main/java/org/springframework/data/elasticsearch/core/facet/FacetRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.springframework.data.elasticsearch.core.query;
1+
package org.springframework.data.elasticsearch.core.facet;
22

33
import org.elasticsearch.search.facet.FacetBuilder;
44

src/main/java/org/springframework/data/elasticsearch/core/query/NativeFacetRequest.java renamed to src/main/java/org/springframework/data/elasticsearch/core/facet/request/NativeFacetRequest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
package org.springframework.data.elasticsearch.core.query;
1+
package org.springframework.data.elasticsearch.core.facet.request;
22

33
import org.elasticsearch.search.facet.FacetBuilder;
4+
import org.elasticsearch.search.facet.terms.TermsFacetBuilder;
5+
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
6+
7+
import org.elasticsearch.search.facet.FacetBuilder;
8+
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
49

510
/**
611
* @author Artur Konczak
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.springframework.data.elasticsearch.core.facet.request;
2+
3+
import org.apache.commons.lang.StringUtils;
4+
import org.elasticsearch.search.facet.FacetBuilder;
5+
import org.elasticsearch.search.facet.FacetBuilders;
6+
import org.elasticsearch.search.facet.range.RangeFacetBuilder;
7+
import org.springframework.data.elasticsearch.core.facet.AbstractFacetRequest;
8+
import org.springframework.util.Assert;
9+
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
/**
14+
* Range facet for numeric fields
15+
*
16+
* @author Artur Konczak
17+
*/
18+
public class RangeFacetRequest extends AbstractFacetRequest {
19+
20+
private String field;
21+
private String keyField;
22+
private String valueField;
23+
24+
private List<Double> from = new ArrayList<Double>();
25+
private List<Double> to = new ArrayList<Double>();
26+
27+
public RangeFacetRequest(String name) {
28+
super(name);
29+
}
30+
31+
public void setField(String field) {
32+
this.field = field;
33+
}
34+
35+
public void setFields(String keyField, String valueField) {
36+
this.keyField = keyField;
37+
this.valueField = valueField;
38+
}
39+
40+
public void range(Double from, Double to) {
41+
if (from == null) {
42+
this.from.add(Double.NEGATIVE_INFINITY);
43+
} else {
44+
this.from.add(from);
45+
}
46+
47+
if (to == null) {
48+
this.to.add(Double.POSITIVE_INFINITY);
49+
} else {
50+
this.to.add(to);
51+
}
52+
}
53+
54+
@Override
55+
public FacetBuilder getFacet() {
56+
Assert.notNull(getName(), "Facet name can't be a null !!!");
57+
Assert.isTrue(StringUtils.isNotBlank(field) || StringUtils.isNotBlank(keyField) && StringUtils.isNotBlank(valueField), "Please select field or key field and value field !!!");
58+
59+
RangeFacetBuilder builder = FacetBuilders.rangeFacet(getName());
60+
if (StringUtils.isNotBlank(keyField)) {
61+
builder.keyField(keyField).valueField(valueField);
62+
} else {
63+
builder.field(field);
64+
}
65+
Assert.notEmpty(from, "Please select at last one range");
66+
Assert.notEmpty(to, "Please select at last one range");
67+
for (int i = 0; i < from.size(); i++) {
68+
builder.addRange(from.get(i), to.get(i));
69+
}
70+
return builder;
71+
}
72+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.springframework.data.elasticsearch.core.facet.request;
2+
3+
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
4+
5+
/**
6+
* Basic range facet
7+
*
8+
* @author Artur Konczak
9+
*/
10+
public class RangeFacetRequestBuilder {
11+
12+
RangeFacetRequest result;
13+
14+
public RangeFacetRequestBuilder(String name) {
15+
result = new RangeFacetRequest(name);
16+
}
17+
18+
public RangeFacetRequestBuilder field(String field) {
19+
result.setField(field);
20+
return this;
21+
}
22+
23+
public RangeFacetRequestBuilder fields(String keyField, String valueField) {
24+
result.setFields(keyField, valueField);
25+
return this;
26+
}
27+
28+
29+
public RangeFacetRequestBuilder range(double from, double to) {
30+
result.range(from, to);
31+
return this;
32+
}
33+
34+
public RangeFacetRequestBuilder from(double from) {
35+
result.range(from, null);
36+
return this;
37+
}
38+
39+
public RangeFacetRequestBuilder to(double to) {
40+
result.range(null, to);
41+
return this;
42+
}
43+
44+
public RangeFacetRequestBuilder applyQueryFilter() {
45+
result.setApplyQueryFilter(true);
46+
return this;
47+
}
48+
49+
public FacetRequest build() {
50+
return result;
51+
}
52+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.springframework.data.elasticsearch.core.facet.request;
2+
3+
/**
4+
*
5+
*/
6+
public enum TermFacetOrder {
7+
8+
ascTerm, descTerm, ascCount, descCount;
9+
10+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package org.springframework.data.elasticsearch.core.facet.request;
2+
3+
import org.apache.commons.lang.ArrayUtils;
4+
import org.apache.commons.lang.StringUtils;
5+
import org.elasticsearch.search.facet.FacetBuilder;
6+
import org.elasticsearch.search.facet.FacetBuilders;
7+
import org.elasticsearch.search.facet.terms.TermsFacet;
8+
import org.elasticsearch.search.facet.terms.TermsFacetBuilder;
9+
import org.springframework.data.elasticsearch.core.facet.AbstractFacetRequest;
10+
import org.springframework.util.Assert;
11+
12+
/**
13+
* Term facet
14+
*
15+
* @author Artur Konczak
16+
*/
17+
public class TermFacetRequest extends AbstractFacetRequest {
18+
19+
private String[] fields;
20+
private Object[] excludeTerms;
21+
private int size = 10;
22+
private TermFacetOrder order = TermFacetOrder.descCount;
23+
private boolean allTerms = false;
24+
private String regex = null;
25+
private int regexFlag = 0;
26+
27+
public TermFacetRequest(String name) {
28+
super(name);
29+
}
30+
31+
public void setFields(String... fields) {
32+
this.fields = fields;
33+
}
34+
35+
public void setSize(int size) {
36+
Assert.isTrue(size >= 0, "Size should be bigger then zero !!!");
37+
this.size = size;
38+
}
39+
40+
public void setOrder(TermFacetOrder order) {
41+
this.order = order;
42+
}
43+
44+
public void setExcludeTerms(Object... excludeTerms) {
45+
this.excludeTerms = excludeTerms;
46+
}
47+
48+
public void setAllTerms(boolean allTerms) {
49+
this.allTerms = allTerms;
50+
}
51+
52+
public void setRegex(String regex) {
53+
this.regex = regex;
54+
}
55+
56+
public void setRegex(String regex, int regexFlag) {
57+
this.regex = regex;
58+
this.regexFlag = regexFlag;
59+
}
60+
61+
@Override
62+
public FacetBuilder getFacet() {
63+
Assert.notEmpty(fields, "Please select at last one field !!!");
64+
TermsFacetBuilder builder = FacetBuilders.termsFacet(getName()).fields(fields).size(size);
65+
switch (order) {
66+
67+
case descTerm:
68+
builder.order(TermsFacet.ComparatorType.REVERSE_TERM);
69+
break;
70+
case ascTerm:
71+
builder.order(TermsFacet.ComparatorType.TERM);
72+
break;
73+
case ascCount:
74+
builder.order(TermsFacet.ComparatorType.REVERSE_COUNT);
75+
break;
76+
default:
77+
builder.order(TermsFacet.ComparatorType.COUNT);
78+
}
79+
if (ArrayUtils.isNotEmpty(excludeTerms)) {
80+
builder.exclude(excludeTerms);
81+
}
82+
83+
if (allTerms) {
84+
builder.allTerms(allTerms);
85+
}
86+
87+
if (StringUtils.isNotBlank(regex)) {
88+
builder.regex(regex, regexFlag);
89+
}
90+
91+
return builder;
92+
}
93+
}

0 commit comments

Comments
 (0)