Wrap the OrCriteria correctly.

Original Pull Request #2855
Closes #2854
This commit is contained in:
Aouichaoui Youssef 2024-02-26 20:05:03 +01:00 committed by GitHub
parent c965862e82
commit 7a8a9a15f1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 79 additions and 0 deletions

View File

@ -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();
}

View File

@ -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;
}

View File

@ -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);
}
}