/*
* 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.filter;
import java.util.List;
import java.util.ArrayList;
import org.dashbuilder.dataset.ColumnType;
/**
* Type of core filter functions available
*/
public enum CoreFunctionType {
IS_NULL(0),
NOT_NULL(0),
EQUALS_TO(1),
NOT_EQUALS_TO(1),
/**
* <p>The <code>LIKE_TO</code> operator is intended to emulate the SQL like operator.It's used to search for a specified pattern in a data set's column.</p>
* <p>Allowed wildcards are:</p>
* <ul>
* <li><code>_</code> - A substitute for a single character.</li>
* <li><code>%</code> - A substitute for zero or more characters.</li>
* <li><code>[charlist]</code> - Sets and ranges of characters to match.</li>
* <li><code>[^charlist]</code> - Matches only a character NOT specified within the brackets.</li>
* </ul>
* <p>The implementation is supported for TEXT or LABEL column types and it's case sensitive or
* unsensitive depending on the boolean value returned by its second parameter.</p>
*/
LIKE_TO(2),
GREATER_THAN(1),
GREATER_OR_EQUALS_TO(1),
LOWER_THAN(1),
LOWER_OR_EQUALS_TO(1),
BETWEEN(2),
TIME_FRAME(1),
IN(1),
NOT_IN(1);
private final int parametersCount;
private CoreFunctionType(int parametersCount) {
this.parametersCount = parametersCount;
}
private static final CoreFunctionType[] coreFunctionTypes = values();
public int getIndex() {
return ordinal();
}
public int getParametersCount() {
return parametersCount;
}
public boolean supportsType(ColumnType type) {
if (TIME_FRAME.equals(this)) {
return ColumnType.DATE.equals(type);
}
if (LIKE_TO.equals(this)) {
return ColumnType.LABEL.equals(type) || ColumnType.TEXT.equals(type);
}
if (IN.equals(this) || NOT_IN.equals(this)) {
return !ColumnType.DATE.equals(type);
}
return true;
}
public static CoreFunctionType getByIndex(int index) {
return coreFunctionTypes[index];
}
public static CoreFunctionType getByName(String type) {
try {
return valueOf(type.toUpperCase());
} catch (Exception e) {
return null;
}
}
public static int getNumberOfParameters(String type) {
CoreFunctionType ft = getByName(type);
return ft.getParametersCount();
}
public static List<CoreFunctionType> getSupportedTypes(ColumnType columnType) {
List<CoreFunctionType> result = new ArrayList<CoreFunctionType>();
for (CoreFunctionType funType : coreFunctionTypes) {
if (funType.supportsType(columnType)) {
result.add(funType);
}
}
return result;
}
}