From 7a8a9a15f12a43ebf28a40f2ec389cb6350ad401 Mon Sep 17 00:00:00 2001 From: Aouichaoui Youssef <21143371+youssef3wi@users.noreply.github.com> Date: Mon, 26 Feb 2024 20:05:03 +0100 Subject: [PATCH] Wrap the OrCriteria correctly. Original Pull Request #2855 Closes #2854 --- .../client/elc/CriteriaQueryProcessor.java | 6 ++ .../elasticsearch/core/query/Criteria.java | 3 + .../elc/CriteriaQueryProcessorUnitTests.java | 70 +++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/CriteriaQueryProcessor.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/CriteriaQueryProcessor.java index 2e8dcb665..080920959 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/CriteriaQueryProcessor.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/CriteriaQueryProcessor.java @@ -174,6 +174,12 @@ class CriteriaQueryProcessor { .scoreMode(ChildScoreMode.Avg)); } + if (criteria.isNegating() && criteria.isOr()) { + final Query query = queryBuilder.build(); + queryBuilder = new Query.Builder(); + queryBuilder.bool(mnqb -> mnqb.mustNot(query)); + } + return queryBuilder.build(); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java b/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java index 7abdb21ef..e1581390d 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java @@ -316,6 +316,9 @@ public class Criteria { Criteria orCriteria = new OrCriteria(this.criteriaChain, criteria.getField()); orCriteria.queryCriteriaEntries.addAll(criteria.queryCriteriaEntries); orCriteria.filterCriteriaEntries.addAll(criteria.filterCriteriaEntries); + orCriteria.subCriteria.addAll(criteria.subCriteria); + orCriteria.boost = criteria.boost; + orCriteria.negating = criteria.isNegating(); return orCriteria; } diff --git a/src/test/java/org/springframework/data/elasticsearch/client/elc/CriteriaQueryProcessorUnitTests.java b/src/test/java/org/springframework/data/elasticsearch/client/elc/CriteriaQueryProcessorUnitTests.java index 45ce2ee92..2e6a8c8af 100644 --- a/src/test/java/org/springframework/data/elasticsearch/client/elc/CriteriaQueryProcessorUnitTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/client/elc/CriteriaQueryProcessorUnitTests.java @@ -483,4 +483,74 @@ class CriteriaQueryProcessorUnitTests { assertEquals(expected, queryString, false); } + @Test + void shouldWrapOrCriteria() throws JSONException { + // Given + String expected = """ + { + "bool": { + "should": [ + { + "query_string": { + "analyze_wildcard": true, + "fields": [ + "field1" + ], + "query": "*xyz*" + } + }, + { + "bool": { + "must_not": [ + { + "query_string": { + "boost": 1.5, + "default_operator": "and", + "fields": [ + "field1" + ], + "query": "abc" + } + } + ] + } + }, + { + "bool": { + "must": [ + { + "query_string": { + "analyze_wildcard": true, + "fields": [ + "field2" + ], + "query": "elastic*" + } + } + ] + } + } + ] + } + } + """; + + Criteria criteria = Criteria.where("field1") + .contains("xyz") + .or( + Criteria.where("field1") + .is("abc").not() + .boost(1.5f) + .subCriteria( + Criteria.where("field2") + .startsWith("elastic") + ) + ); + + // Then + String queryString = queryToJson(CriteriaQueryProcessor.createQuery(criteria), mapper); + + assertEquals(expected, queryString, false); + } + }