selectors = Arrays.asList(
+ new TermSelector(),
+ new TermsSelector(),
+ new TermsSetSelector(),
+ new IdsSelector(),
+ new RangeSelector(),
+ new PrefixSelector(),
+ new ExistsSelector(),
+ new FuzzySelector(),
+ new WildcardSelector(),
+ new RegexpSelector(),
+ new BoolSelector(),
+ new MatchSelector()
+ );
public QueryOperation parse(Object query) {
return selectors.stream()
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/BoolOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/BoolOperation.java
new file mode 100644
index 0000000000..316c63cdb1
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/BoolOperation.java
@@ -0,0 +1,59 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+import java.util.List;
+
+/**
+ * Represents Bool operation.
+ * A Boolean query can combine several query clauses into one advanced query. The clauses are combined
+ * with Boolean logic to find matching documents returned in the results.
+ *
+ * OpenSearch Bool Operation
+ */
+public class BoolOperation extends QueryOperation {
+ private final List must;
+ private final List mustNot;
+ private final List should;
+ private final List filter;
+ private final Integer minimumShouldMatch;
+ private final Float boost;
+
+ public BoolOperation(List must, List mustNot,
+ List should, List filter) {
+ this(must, mustNot, should, filter, null, null);
+ }
+
+ public BoolOperation(List must, List mustNot,
+ List should, List filter,
+ Integer minimumShouldMatch, Float boost) {
+ this.must = must;
+ this.mustNot = mustNot;
+ this.should = should;
+ this.filter = filter;
+ this.minimumShouldMatch = minimumShouldMatch;
+ this.boost = boost;
+ }
+
+ public List getMust() {
+ return must;
+ }
+
+ public List getMustNot() {
+ return mustNot;
+ }
+
+ public List getShould() {
+ return should;
+ }
+
+ public List getFilter() {
+ return filter;
+ }
+
+ public Integer getMinimumShouldMatch() {
+ return minimumShouldMatch;
+ }
+
+ public Float getBoost() {
+ return boost;
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/CommonQueryParameters.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/CommonQueryParameters.java
new file mode 100644
index 0000000000..60a925ef3f
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/CommonQueryParameters.java
@@ -0,0 +1,77 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+/**
+ * Common parameters shared across multiple OpenSearch query operations.
+ */
+public class CommonQueryParameters {
+ private final Float boost;
+ private final String name;
+ private final String rewrite;
+ private final Boolean caseInsensitive;
+
+ public CommonQueryParameters(Float boost, String name, String rewrite, Boolean caseInsensitive) {
+ this.boost = boost;
+ this.name = name;
+ this.rewrite = rewrite;
+ this.caseInsensitive = caseInsensitive;
+ }
+
+ public static CommonQueryParameters empty() {
+ return new CommonQueryParameters(null, null, null, null);
+ }
+
+ public static CommonQueryParameters withBoost(Float boost) {
+ return new CommonQueryParameters(boost, null, null, null);
+ }
+
+ public static CommonQueryParameters withCaseInsensitive(Boolean caseInsensitive) {
+ return new CommonQueryParameters(null, null, null, caseInsensitive);
+ }
+
+ public Float getBoost() {
+ return boost;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getRewrite() {
+ return rewrite;
+ }
+
+ public Boolean getCaseInsensitive() {
+ return caseInsensitive;
+ }
+
+ public static class Builder {
+ private Float boost;
+ private String name;
+ private String rewrite;
+ private Boolean caseInsensitive;
+
+ public Builder boost(Float boost) {
+ this.boost = boost;
+ return this;
+ }
+
+ public Builder name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Builder rewrite(String rewrite) {
+ this.rewrite = rewrite;
+ return this;
+ }
+
+ public Builder caseInsensitive(Boolean caseInsensitive) {
+ this.caseInsensitive = caseInsensitive;
+ return this;
+ }
+
+ public CommonQueryParameters build() {
+ return new CommonQueryParameters(boost, name, rewrite, caseInsensitive);
+ }
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/ExistsOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/ExistsOperation.java
new file mode 100644
index 0000000000..e6bd92403e
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/ExistsOperation.java
@@ -0,0 +1,29 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+/**
+ * Represents Exists operation.
+ * Searches for documents that contain a specific field.
+ *
+ * OpenSearch Exists Operation
+ */
+public class ExistsOperation extends QueryOperation {
+ private final String field;
+ private final Float boost;
+
+ public ExistsOperation(String field) {
+ this(field, null);
+ }
+
+ public ExistsOperation(String field, Float boost) {
+ this.field = field;
+ this.boost = boost;
+ }
+
+ public String getField() {
+ return field;
+ }
+
+ public Float getBoost() {
+ return boost;
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/FieldValueOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/FieldValueOperation.java
new file mode 100644
index 0000000000..008cb2e144
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/FieldValueOperation.java
@@ -0,0 +1,45 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+/**
+ * Abstract base class for OpenSearch operations that operate on a specific field with a value.
+ * This includes operations like Term, Prefix, Wildcard, Fuzzy, and Regexp.
+ */
+public abstract class FieldValueOperation extends QueryOperation {
+ private final String fieldName;
+ private final String value;
+ private final CommonQueryParameters commonParams;
+
+ protected FieldValueOperation(String fieldName, String value, CommonQueryParameters commonParams) {
+ this.fieldName = fieldName;
+ this.value = value;
+ this.commonParams = commonParams != null ? commonParams : CommonQueryParameters.empty();
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public Float getBoost() {
+ return commonParams.getBoost();
+ }
+
+ public String getName() {
+ return commonParams.getName();
+ }
+
+ public String getRewrite() {
+ return commonParams.getRewrite();
+ }
+
+ public Boolean getCaseInsensitive() {
+ return commonParams.getCaseInsensitive();
+ }
+
+ protected CommonQueryParameters getCommonParams() {
+ return commonParams;
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/FuzzyOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/FuzzyOperation.java
new file mode 100644
index 0000000000..f5fae92516
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/FuzzyOperation.java
@@ -0,0 +1,68 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+/**
+ * Represents Fuzzy operation.
+ * Searches for documents containing terms that are similar to the search term within the maximum allowed
+ * Damerau-Levenshtein distance. The Damerau-Levenshtein distance measures the number of one-character
+ * changes needed to change one term to another term.
+ *
+ * OpenSearch Fuzzy Operation
+ */
+public class FuzzyOperation extends QueryOperation {
+ private final String fieldName;
+ private final String value;
+ private final Float boost;
+ private final Integer fuzziness;
+ private final Integer maxExpansions;
+ private final Integer prefixLength;
+ private final Boolean transpositions;
+ private final String rewrite;
+
+ public FuzzyOperation(String fieldName, String value) {
+ this(fieldName, value, null, null, null, null, null, null);
+ }
+
+ public FuzzyOperation(String fieldName, String value, Float boost, Integer fuzziness,
+ Integer maxExpansions, Integer prefixLength, Boolean transpositions, String rewrite) {
+ this.fieldName = fieldName;
+ this.value = value;
+ this.boost = boost;
+ this.fuzziness = fuzziness;
+ this.maxExpansions = maxExpansions;
+ this.prefixLength = prefixLength;
+ this.transpositions = transpositions;
+ this.rewrite = rewrite;
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public Float getBoost() {
+ return boost;
+ }
+
+ public Integer getFuzziness() {
+ return fuzziness;
+ }
+
+ public Integer getMaxExpansions() {
+ return maxExpansions;
+ }
+
+ public Integer getPrefixLength() {
+ return prefixLength;
+ }
+
+ public Boolean getTranspositions() {
+ return transpositions;
+ }
+
+ public String getRewrite() {
+ return rewrite;
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/IdsOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/IdsOperation.java
new file mode 100644
index 0000000000..7b2eb1b77a
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/IdsOperation.java
@@ -0,0 +1,31 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+import java.util.List;
+
+/**
+ * Represents IDs operation.
+ * Searches for documents with one or more specific document ID values in the _id field.
+ *
+ * OpenSearch IDs Operation
+ */
+public class IdsOperation extends QueryOperation {
+ private final List values;
+ private final Float boost;
+
+ public IdsOperation(List values) {
+ this(values, null);
+ }
+
+ public IdsOperation(List values, Float boost) {
+ this.values = values;
+ this.boost = boost;
+ }
+
+ public List getValues() {
+ return values;
+ }
+
+ public Float getBoost() {
+ return boost;
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/MatchOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/MatchOperation.java
new file mode 100644
index 0000000000..046b321393
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/MatchOperation.java
@@ -0,0 +1,81 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+/**
+ * Represents Match operation.
+ * The match query is the standard query for performing full-text searches, including fuzzy matching and phrase or proximity searches.
+ *
+ * OpenSearch Match Operation
+ */
+public class MatchOperation extends FieldValueOperation {
+ private final String operator; // "and" or "or"
+ private final Integer minimumShouldMatch;
+ private final String fuzziness;
+ private final Integer prefixLength;
+ private final Integer maxExpansions;
+ private final String analyzer;
+ private final Boolean fuzzyTranspositions;
+ private final Boolean lenient;
+ private final Boolean zeroTermsQuery;
+ private final Float cutoffFrequency;
+
+ public MatchOperation(String fieldName, String value) {
+ this(fieldName, value, CommonQueryParameters.empty(), null, null, null, null, null, null, null, null, null, null);
+ }
+
+ public MatchOperation(String fieldName, String value, CommonQueryParameters commonParams,
+ String operator, Integer minimumShouldMatch, String fuzziness, Integer prefixLength,
+ Integer maxExpansions, String analyzer, Boolean fuzzyTranspositions,
+ Boolean lenient, Boolean zeroTermsQuery, Float cutoffFrequency) {
+ super(fieldName, value, commonParams);
+ this.operator = operator;
+ this.minimumShouldMatch = minimumShouldMatch;
+ this.fuzziness = fuzziness;
+ this.prefixLength = prefixLength;
+ this.maxExpansions = maxExpansions;
+ this.analyzer = analyzer;
+ this.fuzzyTranspositions = fuzzyTranspositions;
+ this.lenient = lenient;
+ this.zeroTermsQuery = zeroTermsQuery;
+ this.cutoffFrequency = cutoffFrequency;
+ }
+
+ public String getOperator() {
+ return operator;
+ }
+
+ public Integer getMinimumShouldMatch() {
+ return minimumShouldMatch;
+ }
+
+ public String getFuzziness() {
+ return fuzziness;
+ }
+
+ public Integer getPrefixLength() {
+ return prefixLength;
+ }
+
+ public Integer getMaxExpansions() {
+ return maxExpansions;
+ }
+
+ public String getAnalyzer() {
+ return analyzer;
+ }
+
+ public Boolean getFuzzyTranspositions() {
+ return fuzzyTranspositions;
+ }
+
+ public Boolean getLenient() {
+ return lenient;
+ }
+
+ public Boolean getZeroTermsQuery() {
+ return zeroTermsQuery;
+ }
+
+ public Float getCutoffFrequency() {
+ return cutoffFrequency;
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/PrefixOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/PrefixOperation.java
new file mode 100644
index 0000000000..10bb9de8e4
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/PrefixOperation.java
@@ -0,0 +1,22 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+/**
+ * Represents Prefix operation.
+ * Searches for terms that begin with a specific prefix.
+ *
+ * OpenSearch Prefix Operation
+ */
+public class PrefixOperation extends FieldValueOperation {
+
+ public PrefixOperation(String fieldName, String value) {
+ this(fieldName, value, CommonQueryParameters.empty());
+ }
+
+ public PrefixOperation(String fieldName, String value, Float boost, Boolean caseInsensitive, String rewrite) {
+ this(fieldName, value, new CommonQueryParameters(boost, null, rewrite, caseInsensitive));
+ }
+
+ public PrefixOperation(String fieldName, String value, CommonQueryParameters commonParams) {
+ super(fieldName, value, commonParams);
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/RangeOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/RangeOperation.java
new file mode 100644
index 0000000000..9ce6da8891
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/RangeOperation.java
@@ -0,0 +1,72 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+/**
+ * Represents Range operation.
+ * Searches for a range of values in a field using operators like gte, gt, lte, lt.
+ *
+ * OpenSearch Range Operation
+ */
+public class RangeOperation extends QueryOperation {
+ private final String fieldName;
+ private final Object gte; // Greater than or equal to
+ private final Object gt; // Greater than
+ private final Object lte; // Less than or equal to
+ private final Object lt; // Less than
+ private final String format;
+ private final String relation;
+ private final Float boost;
+ private final String timeZone;
+
+ public RangeOperation(String fieldName, Object gte, Object gt, Object lte, Object lt) {
+ this(fieldName, gte, gt, lte, lt, null, null, null, null);
+ }
+
+ public RangeOperation(String fieldName, Object gte, Object gt, Object lte, Object lt,
+ String format, String relation, Float boost, String timeZone) {
+ this.fieldName = fieldName;
+ this.gte = gte;
+ this.gt = gt;
+ this.lte = lte;
+ this.lt = lt;
+ this.format = format;
+ this.relation = relation;
+ this.boost = boost;
+ this.timeZone = timeZone;
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public Object getGte() {
+ return gte;
+ }
+
+ public Object getGt() {
+ return gt;
+ }
+
+ public Object getLte() {
+ return lte;
+ }
+
+ public Object getLt() {
+ return lt;
+ }
+
+ public String getFormat() {
+ return format;
+ }
+
+ public String getRelation() {
+ return relation;
+ }
+
+ public Float getBoost() {
+ return boost;
+ }
+
+ public String getTimeZone() {
+ return timeZone;
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/RegexpOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/RegexpOperation.java
new file mode 100644
index 0000000000..27e7024864
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/RegexpOperation.java
@@ -0,0 +1,39 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+/**
+ * Represents Regexp operation.
+ * Searches for terms that match a regular expression. Regular expressions are applied to the terms
+ * (that is, tokens) in the field—not to the entire field.
+ *
+ * OpenSearch Regexp Operation
+ */
+public class RegexpOperation extends FieldValueOperation {
+ private final String flags;
+ private final Integer maxDeterminizedStates;
+
+ public RegexpOperation(String fieldName, String value) {
+ this(fieldName, value, null, null, null, null, null);
+ }
+
+ public RegexpOperation(String fieldName, String value, Float boost, Boolean caseInsensitive,
+ String flags, Integer maxDeterminizedStates, String rewrite) {
+ super(fieldName, value, new CommonQueryParameters(boost, null, rewrite, caseInsensitive));
+ this.flags = flags;
+ this.maxDeterminizedStates = maxDeterminizedStates;
+ }
+
+ public RegexpOperation(String fieldName, String value, CommonQueryParameters commonParams,
+ String flags, Integer maxDeterminizedStates) {
+ super(fieldName, value, commonParams);
+ this.flags = flags;
+ this.maxDeterminizedStates = maxDeterminizedStates;
+ }
+
+ public String getFlags() {
+ return flags;
+ }
+
+ public Integer getMaxDeterminizedStates() {
+ return maxDeterminizedStates;
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/TermOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/TermOperation.java
index 67fc8d8f9b..88f723aa55 100644
--- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/TermOperation.java
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/TermOperation.java
@@ -3,9 +3,38 @@
/**
* Represent Term operation.
* Matches documents where the value of a field equals the specified value.
+ *
+ * OpenSearch Term Operation
*/
public class TermOperation extends ComparisonOperation {
+ private final Boolean caseInsensitive;
+ private final Float boost;
+ private final String name;
+
public TermOperation(String fieldName, V value) {
+ this(fieldName, value, Boolean.FALSE, null, null);
+ }
+
+ public TermOperation(String fieldName, V value, Boolean caseInsensitive) {
+ this(fieldName, value, caseInsensitive, null, null);
+ }
+
+ public TermOperation(String fieldName, V value, Boolean caseInsensitive, Float boost, String name) {
super(fieldName, value);
+ this.caseInsensitive = caseInsensitive;
+ this.boost = boost;
+ this.name = name;
+ }
+
+ public Boolean getCaseInsensitive() {
+ return caseInsensitive;
+ }
+
+ public Float getBoost() {
+ return boost;
+ }
+
+ public String getName() {
+ return name;
}
}
\ No newline at end of file
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/TermsOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/TermsOperation.java
new file mode 100644
index 0000000000..d53d373422
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/TermsOperation.java
@@ -0,0 +1,49 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+import java.util.List;
+
+/**
+ * Represents Terms operation.
+ * Matches documents where the value of a field matches any of the specified terms.
+ *
+ * OpenSearch Terms Operation
+ */
+public class TermsOperation extends QueryOperation {
+ private final String fieldName;
+ private final List values;
+ private final Float boost;
+ private final String name;
+ private final String valueType;
+
+ public TermsOperation(String fieldName, List values) {
+ this(fieldName, values, null, null, null);
+ }
+
+ public TermsOperation(String fieldName, List values, Float boost, String name, String valueType) {
+ this.fieldName = fieldName;
+ this.values = values;
+ this.boost = boost;
+ this.name = name;
+ this.valueType = valueType;
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public List getValues() {
+ return values;
+ }
+
+ public Float getBoost() {
+ return boost;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getValueType() {
+ return valueType;
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/TermsSetOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/TermsSetOperation.java
new file mode 100644
index 0000000000..5c79de572c
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/TermsSetOperation.java
@@ -0,0 +1,51 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+import java.util.List;
+
+/**
+ * Represents Terms Set operation.
+ * Matches documents that contain a minimum number of exact terms in a specified field.
+ * Similar to Terms query but allows specifying minimum number of matching terms required.
+ *
+ * OpenSearch Terms Set Operation
+ */
+public class TermsSetOperation extends QueryOperation {
+ private final String fieldName;
+ private final List terms;
+ private final String minimumShouldMatchField;
+ private final String minimumShouldMatchScript;
+ private final Float boost;
+
+ public TermsSetOperation(String fieldName, List terms, String minimumShouldMatchField) {
+ this(fieldName, terms, minimumShouldMatchField, null, null);
+ }
+
+ public TermsSetOperation(String fieldName, List terms, String minimumShouldMatchField,
+ String minimumShouldMatchScript, Float boost) {
+ this.fieldName = fieldName;
+ this.terms = terms;
+ this.minimumShouldMatchField = minimumShouldMatchField;
+ this.minimumShouldMatchScript = minimumShouldMatchScript;
+ this.boost = boost;
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public List getTerms() {
+ return terms;
+ }
+
+ public String getMinimumShouldMatchField() {
+ return minimumShouldMatchField;
+ }
+
+ public String getMinimumShouldMatchScript() {
+ return minimumShouldMatchScript;
+ }
+
+ public Float getBoost() {
+ return boost;
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/WildcardOperation.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/WildcardOperation.java
new file mode 100644
index 0000000000..0552a04954
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/operations/WildcardOperation.java
@@ -0,0 +1,24 @@
+package org.evomaster.client.java.controller.opensearch.operations;
+
+/**
+ * Represents Wildcard operation.
+ * Searches for terms that match a wildcard pattern. Wildcard queries support the following operators:
+ * * (asterisk) - Matches zero or more characters
+ * ? (question mark) - Matches any single character
+ *
+ * OpenSearch Wildcard Operation
+ */
+public class WildcardOperation extends FieldValueOperation {
+
+ public WildcardOperation(String fieldName, String value) {
+ this(fieldName, value, CommonQueryParameters.empty());
+ }
+
+ public WildcardOperation(String fieldName, String value, Float boost, Boolean caseInsensitive, String rewrite) {
+ this(fieldName, value, new CommonQueryParameters(boost, null, rewrite, caseInsensitive));
+ }
+
+ public WildcardOperation(String fieldName, String value, CommonQueryParameters commonParams) {
+ super(fieldName, value, commonParams);
+ }
+}
diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/selectors/BoolSelector.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/selectors/BoolSelector.java
new file mode 100644
index 0000000000..cca9958dc3
--- /dev/null
+++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/opensearch/selectors/BoolSelector.java
@@ -0,0 +1,59 @@
+package org.evomaster.client.java.controller.opensearch.selectors;
+
+import org.evomaster.client.java.controller.opensearch.operations.BoolOperation;
+import org.evomaster.client.java.controller.opensearch.operations.QueryOperation;
+import org.evomaster.client.java.controller.opensearch.OpenSearchQueryParser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.evomaster.client.java.controller.opensearch.utils.OpenSearchQueryHelper.extractBoolClause;
+import static org.evomaster.client.java.controller.opensearch.utils.OpenSearchQueryHelper.extractBoost;
+import static org.evomaster.client.java.controller.opensearch.utils.OpenSearchQueryHelper.extractIntegerParameter;
+
+/**
+ * Selector for Bool queries.
+ * Structure: { bool: { must: [...], must_not: [...], should: [...], filter: [...] } }
+ */
+public class BoolSelector extends SingleConditionQuerySelector {
+
+ private static final String OPERATOR = "Bool";
+ private static final String STRUCTURE = "bool";
+
+ @Override
+ protected QueryOperation parse(Object query) {
+ List must = parseNestedQueries(extractBoolClause(query, structure(), "must"));
+ List mustNot = parseNestedQueries(extractBoolClause(query, structure(), "mustNot"));
+ List should = parseNestedQueries(extractBoolClause(query, structure(), "should"));
+ List filter = parseNestedQueries(extractBoolClause(query, structure(), "filter"));
+
+ Integer minimumShouldMatch = extractIntegerParameter(query, structure(), "minimumShouldMatch");
+ Float boost = extractBoost(query, structure());
+
+ return new BoolOperation(must, mustNot, should, filter, minimumShouldMatch, boost);
+ }
+
+ private List parseNestedQueries(List