Skip to content

Commit bb62148

Browse files
fmarchandmohsinh
authored andcommitted
DATAES-129 : Custom Repository Method for simple geo request does not work
1 parent 7cf7cb9 commit bb62148

File tree

5 files changed

+81
-15
lines changed

5 files changed

+81
-15
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
import java.util.ListIterator;
2525

2626
import org.apache.lucene.queryparser.flexible.core.util.StringUtils;
27-
import org.elasticsearch.index.query.BoolQueryBuilder;
28-
import org.elasticsearch.index.query.BoostableQueryBuilder;
29-
import org.elasticsearch.index.query.QueryBuilder;
27+
import org.elasticsearch.index.query.*;
28+
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
3029
import org.springframework.data.elasticsearch.core.query.Criteria;
30+
import org.springframework.data.geo.Point;
3131
import org.springframework.util.Assert;
3232

3333
/**
@@ -118,9 +118,9 @@ private QueryBuilder processCriteriaEntry(OperationKey key, Object value, String
118118
}
119119
QueryBuilder query = null;
120120

121-
String searchText = StringUtils.toString(value);
121+
String searchText = StringUtils.toString(value);
122122

123-
switch (key) {
123+
switch (key) {
124124
case EQUALS:
125125
query = queryString(searchText).field(fieldName);
126126
break;

src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ public Criteria or(String fieldName) {
193193
* @return
194194
*/
195195
public Criteria is(Object o) {
196-
queryCriteria.add(new CriteriaEntry(OperationKey.EQUALS, o));
196+
queryCriteria.add(new CriteriaEntry(OperationKey.EQUALS, o));
197197
return this;
198198
}
199199

src/main/java/org/springframework/data/elasticsearch/repository/query/parser/ElasticsearchQueryCreator.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public ElasticsearchQueryCreator(PartTree tree, MappingContext<?, ElasticsearchP
6161
protected CriteriaQuery create(Part part, Iterator<Object> iterator) {
6262
PersistentPropertyPath<ElasticsearchPersistentProperty> path = context
6363
.getPersistentPropertyPath(part.getProperty());
64-
return new CriteriaQuery(from(part.getType(),
64+
return new CriteriaQuery(from(part,
6565
new Criteria(path.toDotPath(ElasticsearchPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), iterator));
6666
}
6767

@@ -72,7 +72,7 @@ protected CriteriaQuery and(Part part, CriteriaQuery base, Iterator<Object> iter
7272
}
7373
PersistentPropertyPath<ElasticsearchPersistentProperty> path = context
7474
.getPersistentPropertyPath(part.getProperty());
75-
return base.addCriteria(from(part.getType(),
75+
return base.addCriteria(from(part,
7676
new Criteria(path.toDotPath(ElasticsearchPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), iterator));
7777
}
7878

@@ -89,7 +89,9 @@ protected CriteriaQuery complete(CriteriaQuery query, Sort sort) {
8989
return query.addSort(sort);
9090
}
9191

92-
private Criteria from(Part.Type type, Criteria instance, Iterator<?> parameters) {
92+
private Criteria from(Part part, Criteria instance, Iterator<?> parameters) {
93+
Part.Type type = part.getType();
94+
9395
Criteria criteria = instance;
9496
if (criteria == null) {
9597
criteria = new Criteria();
@@ -99,8 +101,6 @@ private Criteria from(Part.Type type, Criteria instance, Iterator<?> parameters)
99101
return criteria.is(true);
100102
case FALSE:
101103
return criteria.is(false);
102-
case SIMPLE_PROPERTY:
103-
return criteria.is(parameters.next());
104104
case NEGATING_SIMPLE_PROPERTY:
105105
return criteria.is(parameters.next()).not();
106106
case REGEX:
@@ -126,11 +126,24 @@ private Criteria from(Part.Type type, Criteria instance, Iterator<?> parameters)
126126
return criteria.in(asArray(parameters.next()));
127127
case NOT_IN:
128128
return criteria.in(asArray(parameters.next())).not();
129+
case SIMPLE_PROPERTY:
129130
case WITHIN: {
130131
Object firstParameter = parameters.next();
131-
Object secondParameter = parameters.next();
132-
133-
if (firstParameter instanceof GeoPoint && secondParameter instanceof String)
132+
Object secondParameter = null;
133+
if(type == Part.Type.SIMPLE_PROPERTY) {
134+
if(part.getProperty().getType() != GeoPoint.class)
135+
return criteria.is(firstParameter);
136+
else {
137+
// it means it's a simple find with exact geopoint matching (e.g. findByLocation)
138+
// and because Elasticsearch does not have any kind of query with just a geopoint
139+
// as argument we use a "geo distance" query with a distance of one meter.
140+
secondParameter = ".001km";
141+
}
142+
} else {
143+
secondParameter = parameters.next();
144+
}
145+
146+
if (firstParameter instanceof GeoPoint && secondParameter instanceof String)
134147
return criteria.within((GeoPoint) firstParameter, (String) secondParameter);
135148

136149
if (firstParameter instanceof Point && secondParameter instanceof Distance)

src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTests.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,55 @@ public void shouldReturnListForMessage() {
495495
assertThat(sampleEntities.size(), is(1));
496496
}
497497

498+
@Test
499+
public void shouldExecuteCustomMethodWithGeoPoint() {
500+
// given
501+
String documentId = randomNumeric(5);
502+
SampleEntity sampleEntity = new SampleEntity();
503+
sampleEntity.setId(documentId);
504+
sampleEntity.setType("test");
505+
sampleEntity.setRate(10);
506+
sampleEntity.setMessage("foo");
507+
sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d));
508+
509+
repository.save(sampleEntity);
510+
511+
// when
512+
Page<SampleEntity> page = repository.findByLocation(new GeoPoint(45.7806d, 3.0875d), new PageRequest(0, 10));
513+
// then
514+
assertThat(page, is(notNullValue()));
515+
assertThat(page.getTotalElements(), is(equalTo(1L)));
516+
}
517+
@Test
518+
public void shouldExecuteCustomMethodWithGeoPointAndString() {
519+
// given
520+
String documentId = randomNumeric(5);
521+
SampleEntity sampleEntity = new SampleEntity();
522+
sampleEntity.setId(documentId);
523+
sampleEntity.setType("test");
524+
sampleEntity.setRate(10);
525+
sampleEntity.setMessage("foo");
526+
sampleEntity.setLocation(new GeoPoint(45.7806d, 3.0875d));
527+
528+
repository.save(sampleEntity);
529+
530+
documentId = randomNumeric(5);
531+
sampleEntity = new SampleEntity();
532+
sampleEntity.setId(documentId);
533+
sampleEntity.setType("test");
534+
sampleEntity.setRate(10);
535+
sampleEntity.setMessage("foo");
536+
sampleEntity.setLocation(new GeoPoint(48.7806d, 3.0875d));
537+
538+
repository.save(sampleEntity);
539+
540+
// when
541+
Page<SampleEntity> page = repository.findByLocationAndMessage(new GeoPoint(45.7806d, 3.0875d), "foo", new PageRequest(0, 10));
542+
// then
543+
assertThat(page, is(notNullValue()));
544+
assertThat(page.getTotalElements(), is(equalTo(1L)));
545+
}
546+
498547
@Test
499548
public void shouldExecuteCustomMethodWithWithinGeoPoint() {
500549
// given

src/test/java/org/springframework/data/elasticsearch/repositories/custom/SampleCustomMethodRepository.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,11 @@ public interface SampleCustomMethodRepository extends ElasticsearchRepository<Sa
7171

7272
Page<SampleEntity> findByMessageOrderByTypeAsc(String message, Pageable pageable);
7373

74-
Page<SampleEntity> findByLocationWithin(GeoPoint point, String distance, Pageable pageable);
74+
Page<SampleEntity> findByLocation(GeoPoint point, Pageable pageable);
75+
76+
Page<SampleEntity> findByLocationAndMessage(GeoPoint point, String msg, Pageable pageable);
77+
78+
Page<SampleEntity> findByLocationWithin(GeoPoint point, String distance, Pageable pageable);
7579

7680
Page<SampleEntity> findByLocationWithin(Point point, Distance distance, Pageable pageable);
7781

0 commit comments

Comments
 (0)