aboutsummaryrefslogtreecommitdiffstats
path: root/search-data-service-app/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Filter.java
diff options
context:
space:
mode:
Diffstat (limited to 'search-data-service-app/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Filter.java')
-rw-r--r--search-data-service-app/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Filter.java183
1 files changed, 183 insertions, 0 deletions
diff --git a/search-data-service-app/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Filter.java b/search-data-service-app/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Filter.java
new file mode 100644
index 0000000..134c660
--- /dev/null
+++ b/search-data-service-app/src/main/java/org/onap/aai/sa/searchdbabstraction/searchapi/Filter.java
@@ -0,0 +1,183 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2018 Amdocs
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.sa.searchdbabstraction.searchapi;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class represents the filter stanza in a search statement.
+ *
+ * <p>
+ * The expected JSON structure for a filter stanza is as follows:
+ *
+ * <pre>
+ * {
+ * "filter": {
+ * "all": [ {query structure}, {query structure}, ... {query structure} ],
+ * "any": [ {query structure}, {query structure}, ... {query structure} ]
+ * }
+ * }
+ * </pre>
+ */
+public class Filter {
+
+ /**
+ * All queries in this list must evaluate to true for the filter to pass.
+ */
+ private QueryStatement[] all;
+
+ /**
+ * Any one of the queries in this list must evaluate to true for the filter to pass.
+ */
+ private QueryStatement[] any;
+
+
+ public QueryStatement[] getAll() {
+ return all;
+ }
+
+ public void setAll(QueryStatement[] all) {
+ this.all = all;
+ }
+
+ public QueryStatement[] getAny() {
+ return any;
+ }
+
+ public void setAny(QueryStatement[] any) {
+ this.any = any;
+ }
+
+ /**
+ * This method returns a string which represents this filter in syntax that is understandable by ElasticSearch and
+ * is suitable for inclusion in an ElasticSearch query string.
+ *
+ * @return - ElasticSearch syntax string.
+ */
+ public String toElasticSearch() {
+
+ StringBuilder sb = new StringBuilder();
+
+ List<QueryStatement> notMatchQueries = new ArrayList<>();
+ sb.append("{");
+ sb.append("\"bool\": {");
+
+ // Add the queries from our 'all' list.
+ int matchQueriesCount = 0;
+ int notMatchQueriesCount = 0;
+ if (all != null) {
+ sb.append("\"must\": [");
+
+ for (QueryStatement query : all) {
+ if (matchQueriesCount > 0) {
+ sb.append(", ");
+ }
+
+ if (query.isNotMatch()) {
+ notMatchQueries.add(query);
+ } else {
+ sb.append(query.toElasticSearch());
+ matchQueriesCount++;
+ }
+ }
+ sb.append("],");
+
+
+ sb.append("\"must_not\": [");
+ for (QueryStatement query : notMatchQueries) {
+ if (notMatchQueriesCount > 0) {
+ sb.append(", ");
+ }
+ sb.append(query.toElasticSearch());
+ notMatchQueriesCount++;
+ }
+ sb.append("]");
+ }
+
+ // Add the queries from our 'any' list.
+ notMatchQueries.clear();
+ if (any != null) {
+ if (all != null) {
+ sb.append(",");
+ }
+ sb.append("\"should\": [");
+
+ matchQueriesCount = 0;
+ for (QueryStatement query : any) {
+ if (matchQueriesCount > 0) {
+ sb.append(", ");
+ }
+
+ if (query.isNotMatch()) {
+ notMatchQueries.add(query);
+ } else {
+ sb.append(query.toElasticSearch());
+ matchQueriesCount++;
+ }
+ }
+ sb.append("],");
+
+ notMatchQueriesCount = 0;
+ sb.append("\"must_not\": [");
+ for (QueryStatement query : notMatchQueries) {
+ if (notMatchQueriesCount > 0) {
+ sb.append(", ");
+ }
+ sb.append(query.toElasticSearch());
+ notMatchQueriesCount++;
+ }
+ sb.append("]");
+ }
+ sb.append("}");
+ sb.append("}");
+
+ return sb.toString();
+ }
+
+ @Override
+ public String toString() {
+
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("{");
+
+ sb.append("all: [");
+ if (all != null) {
+ for (QueryStatement query : all) {
+ sb.append(query.toString());
+ }
+ }
+ sb.append("], ");
+
+ sb.append("any: [");
+ if (any != null) {
+ for (QueryStatement query : any) {
+ sb.append(query.toString());
+ }
+ }
+ sb.append("] ");
+
+ sb.append("}");
+
+ return sb.toString();
+ }
+}