/* * Copyright 2014 Red Hat, Inc. and/or its affiliates. * * 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. */ package org.dashbuilder.dataprovider.backend.elasticsearch.rest.model; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; /** * <p>An ElasticSearch query representation.</p> * * <p>Generates a group of ElasticSearch queries and filters to run from a the previous pasing of a DataSetFilter.</p> * * <p>Parameters for each query type:</p> * <ul> * <li> * <p>Query - Boolean</p> * <ul> * <li>must - Contains a List of other Query objects.</li> * <li>must_not - Contains a List of other Query objects.</li> * <li>should - Contains a List of other Query objects.</li> * </ul> * </li> * <li> * <p>Query - Match</p> * <ul> * <li>value - The value to match.</li> * </ul> * </li> * <li> * <p>Query - Match All</p> * </li> * <li> * <p>Query - Filtered</p> * <ul> * <li>query - The query.</li> * <li>filter - The filter for this query.</li> * </ul> * </li> * <li> * <p>Filter - And</p> * <ul> * <li>filters - Contains a List of other filters.</li> * </ul> * </li> * <li> * <p>Filter - Or</p> * <ul> * <li>filters - Contains a List of other filters.</li> * </ul> * </li> * <li> * <p>Filter - Not</p> * <ul> * <li>filter - Contains another query instance that represents a filter.</li> * </ul> * </li> * <li> * <p>Filter - Exist</p> * <p>Does not contain any parameter. Only check if the value for <code>field</code> exists.</p> * </li> * <li> * <p>Filter - Term</p> * <ul> * <li>value - The value for the term to search.</li> * </ul> * </li> * <li> * <p>Filter - Range</p> * <ul> * <li>gt - The value for greater than.</li> * <li>gte - The value for greater than or equals.</li> * <li>lt - The value for lower than.</li> * <li>lte - The value for lower than or equals.</li> * </ul> * </li> * </ul> */ public class Query { public static enum Parameter { MUST, MUST_NOT, SHOULD, VALUE, QUERY, FILTER, FILTERS, GT, GTE, LT, LTE, DEFAULT_FIELD, DEFAULT_OPERATOR, LOWERCASE_EXPANDED_TERMS, OPERATOR; } public static enum Type { QUERY(null), BOOL(QUERY), MATCH(QUERY), MATCH_ALL(QUERY), WILDCARD(QUERY), QUERY_STRING(QUERY), FILTERED(QUERY), FILTER(null), AND(FILTER), OR(FILTER), NOT(FILTER), EXISTS(FILTER), TERM(FILTER), TERMS(FILTER), RANGE(FILTER); private Type type; private Type(Type type) { this.type = type; } public Type getType() { return type; } } private final Type type; private final String field; private final Map<String, Object> params; public Query(Type type) { this.type = type; this.field = null; params = new HashMap<String, Object>(); } public Query(String field, Type type) { this.type = type; this.field = field; params = new HashMap<String, Object>(); } public Type getType() { return type; } public String getField() { return field; } public Query setParam(String key, Object value) { params.put(key, value); return this; } public Object getParam(String key) { if (params.isEmpty()) return null; return params.get(key); } @Override public String toString() { return toString(-1); } public String toString(int level) { level++; StringBuilder result = new StringBuilder(); result.append(indent(level)).append("|").append(getType().name()).append("\n"); if (!params.isEmpty()) { for (Map.Entry<String, Object> paramEntry : params.entrySet()) { String key = paramEntry.getKey(); Object value = paramEntry.getValue(); if (value instanceof Query) { result.append(indent(level)).append("|").append(key).append(":\n"); result.append(((Query)value).toString(level)); } else if (value instanceof List) { result.append(indent(level)).append("|").append(key).append(":\n"); result.append(collectionToString(((List<Query>)value), level)); } else { result.append(indent(level)).append("|").append(key).append(" -> ").append(value).append("\n"); } } } return result.toString(); } protected String indent(int level) { StringBuilder result = new StringBuilder(); for (int x = 0; x < level; x++) { result.append("--"); } return result.toString(); } protected String collectionToString(Collection<Query> queries, int level) { StringBuilder result = new StringBuilder(); for (Query query : queries) { result.append(query.toString(level)); } return result.toString(); } }