/*
* 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.dataset.def;
import org.dashbuilder.dataprovider.DataSetProviderType;
import org.dashbuilder.dataset.sort.ColumnSort;
import org.dashbuilder.dataset.validation.groups.ElasticSearchDataSetDefValidation;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* <p>DataSet definition class for ElasticSearch provider.</p>
*
* <p>This dataset provides these configuration parameters:</p>
* <ul>
* <li>
* <code>serverURL</code> - The URL for the ElasticSearch server instance (MANDATORY)
* </li>
* <li>
* <code>clusterName</code> - The name of the cluster in the ElasticSearch server.
* </li>
* <li>
* <code>index</code> - The name of the index. It can be a concrete index name, a collection of index names, comma separated, or the keyword <code>_all</code> for working with all available indexes in the ElasticSearch server (OPTIONAL - Defaults to <code>_all</code>)
* </li>
* <li>
* <code>type</code> - The type name. Only applicable if <code>index</code> parameter is set. It can be a concrete type name, a collection of type names, comma separated, or the keyword <code>_all</code> for working with all available type in the ElasticSearch server (OPTIONAL - Defaults to <code>_all</code>)
* </li>
* <li>
* <code>query</code> - You can perform your custom ElasticSearch DSL query for this data provider. If this parameter exist, the parameters <code>index</code>, <code>type</code> and <code>field</code> are skipped. (OPTIONAL)
* </li>
* <li>
* <code>relevance</code> - The relevance value for search results (OPTIONAL)
* </li>
* <li>
* <code>columns</code> - If not specified, the column definitions for the ElasticSearch dataset are automatically given by querying the index mappings. Otherwise, you can bind a column to another datatype in dashbuilder application using this parameters (OPTIONAL)
* </li>
* </ul>
*
* @since 0.3.0
*/
public class ElasticSearchDataSetDef extends DataSetDef {
// Constants.
public static enum ElasticSearchKeywords {
ALL;
private static final String KEYWORD_ALL = "_all";
@Override
public String toString() {
if (this.equals(ALL)) return KEYWORD_ALL;
return super.toString();
}
}
// Data Set user parameters.
@NotNull(groups = {ElasticSearchDataSetDefValidation.class})
@Size(min = 1, groups = {ElasticSearchDataSetDefValidation.class})
protected String serverURL;
protected String clusterName;
/**
* Index/es to query. Can handle multiple values, comma separated.
*/
@NotNull(groups = {ElasticSearchDataSetDefValidation.class})
@Size(min = 1, groups = {ElasticSearchDataSetDefValidation.class})
protected String index;
/**
* Type/es to query. Can handle multiple values, comma separated. Not mandatory.
*/
protected String type;
protected String query;
protected String relevance;
protected ColumnSort columnSort;
public ElasticSearchDataSetDef() {
super.setProvider(DataSetProviderType.ELASTICSEARCH);
}
public String getServerURL() {
return serverURL;
}
public void setServerURL(String serverURL) {
this.serverURL = serverURL;
}
public String getClusterName() {
return clusterName;
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
public String getIndex() {
return index;
}
public void setIndex(String index) {
this.index = index;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
public String getRelevance() {
return relevance;
}
public void setRelevance(String relevance) {
this.relevance = relevance;
}
public boolean isCacheEnabled() {
return cacheEnabled;
}
public void setCacheEnabled(boolean cacheEnabled) {
this.cacheEnabled = cacheEnabled;
}
public Integer getCacheMaxRows() {
return cacheMaxRows;
}
public void setCacheMaxRows(Integer cacheMaxRows) {
this.cacheMaxRows = cacheMaxRows;
}
public ColumnSort getColumnSort() {
return columnSort;
}
public void setColumnSort(ColumnSort columnSort) {
this.columnSort = columnSort;
}
@Override
public boolean equals(Object obj) {
try {
ElasticSearchDataSetDef other = (ElasticSearchDataSetDef) obj;
if (!super.equals(other)) {
return false;
}
if (serverURL != null && !serverURL.equals(other.serverURL)) {
return false;
}
if (clusterName != null && !clusterName.equals(other.clusterName)) {
return false;
}
if (index != null && !index.equals(other.index)) {
return false;
}
return true;
} catch (ClassCastException e) {
return false;
}
}
@Override
public DataSetDef clone() {
ElasticSearchDataSetDef def = new ElasticSearchDataSetDef();
clone(def);
def.setServerURL(getServerURL());
def.setClusterName(getClusterName());
def.setIndex(getIndex());
def.setType(getType());
return def;
}
public String toString() {
StringBuilder out = new StringBuilder();
out.append("UUID=").append(UUID).append("\n");
out.append("Provider=").append(provider).append("\n");
out.append("Public=").append(isPublic).append("\n");
out.append("Push enabled=").append(pushEnabled).append("\n");
out.append("Push max size=").append(pushMaxSize).append(" Kb\n");
out.append("Server URL=").append(serverURL).append("\n");
out.append("Index=").append(index).append("\n");
out.append("Type=").append(type).append("\n");
out.append("Query=").append(query).append("\n");
out.append("Get all columns=").append(allColumnsEnabled).append("\n");
out.append("Cache enabled=").append(cacheEnabled).append("\n");
out.append("Cache max rows=").append(cacheMaxRows).append(" Kb\n");
return out.toString();
}
}