diff --git a/pom.xml b/pom.xml
index b3ce1ce66..041b11445 100644
--- a/pom.xml
+++ b/pom.xml
@@ -121,6 +121,13 @@
test
+
+ org.projectlombok
+ lombok
+ 1.16.4
+ test
+
+
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java
index 739344855..f91d8c348 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java
@@ -24,10 +24,11 @@ import java.util.List;
import java.util.ListIterator;
import org.apache.lucene.queryparser.flexible.core.util.StringUtils;
-import org.elasticsearch.index.query.*;
-import org.springframework.data.elasticsearch.core.geo.GeoPoint;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.BoostableQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.springframework.data.elasticsearch.core.query.Criteria;
-import org.springframework.data.geo.Point;
import org.springframework.util.Assert;
/**
@@ -36,6 +37,7 @@ import org.springframework.util.Assert;
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Franck Marchand
+ * @author Artur Konczak
*/
class CriteriaQueryProcessor {
@@ -49,11 +51,19 @@ class CriteriaQueryProcessor {
List mustQueryBuilderList = new LinkedList();
ListIterator chainIterator = criteria.getCriteriaChain().listIterator();
+
+ QueryBuilder firstQuery = null;
+ boolean negateFirstQuery = false;
+
while (chainIterator.hasNext()) {
Criteria chainedCriteria = chainIterator.next();
QueryBuilder queryFragmentForCriteria = createQueryFragmentForCriteria(chainedCriteria);
-
if (queryFragmentForCriteria != null) {
+ if (firstQuery == null) {
+ firstQuery = queryFragmentForCriteria;
+ negateFirstQuery = chainedCriteria.isNegating();
+ continue;
+ }
if (chainedCriteria.isOr()) {
shouldQueryBuilderList.add(queryFragmentForCriteria);
} else if (chainedCriteria.isNegating()) {
@@ -64,6 +74,18 @@ class CriteriaQueryProcessor {
}
}
+ if (firstQuery != null) {
+ if (!shouldQueryBuilderList.isEmpty() && mustNotQueryBuilderList.isEmpty() && mustQueryBuilderList.isEmpty()) {
+ shouldQueryBuilderList.add(0, firstQuery);
+ } else {
+ if (negateFirstQuery) {
+ mustNotQueryBuilderList.add(0, firstQuery);
+ } else {
+ mustQueryBuilderList.add(0, firstQuery);
+ }
+ }
+ }
+
BoolQueryBuilder query = null;
if (!shouldQueryBuilderList.isEmpty() || !mustNotQueryBuilderList.isEmpty() || !mustQueryBuilderList.isEmpty()) {
@@ -98,12 +120,12 @@ class CriteriaQueryProcessor {
if (singeEntryCriteria) {
Criteria.CriteriaEntry entry = it.next();
- query = processCriteriaEntry(entry.getKey(), entry.getValue(), fieldName);
+ query = processCriteriaEntry(entry, fieldName);
} else {
query = boolQuery();
while (it.hasNext()) {
Criteria.CriteriaEntry entry = it.next();
- ((BoolQueryBuilder) query).must(processCriteriaEntry(entry.getKey(), entry.getValue(), fieldName));
+ ((BoolQueryBuilder) query).must(processCriteriaEntry(entry, fieldName));
}
}
@@ -112,14 +134,18 @@ class CriteriaQueryProcessor {
}
- private QueryBuilder processCriteriaEntry(OperationKey key, Object value, String fieldName) {
+ private QueryBuilder processCriteriaEntry(Criteria.CriteriaEntry entry,/* OperationKey key, Object value,*/ String fieldName) {
+ Object value = entry.getValue();
if (value == null) {
return null;
}
+ OperationKey key = entry.getKey();
QueryBuilder query = null;
String searchText = StringUtils.toString(value);
+ Iterable