/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2016 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.platform.dataaccess.metadata.model;
import java.io.Serializable;
/**
* Operator is used in the definition of a @see MqlCondition
*/
public enum Operator implements Serializable {
GREATER_THAN( ">", 1, true ), //$NON-NLS-1$
LESS_THAN( "<", 1, true ), //$NON-NLS-1$
EQUAL( "=", 1, true ), //$NON-NLS-1$
GREATOR_OR_EQUAL( ">=", 1, true ), //$NON-NLS-1$
LESS_OR_EQUAL( "<=", 1, true ), //$NON-NLS-1$
EXACTLY_MATCHES( "EXACTLY MATCHES", 0, true ), //$NON-NLS-1$
CONTAINS( "CONTAINS", 0, true ), //$NON-NLS-1$
DOES_NOT_CONTAIN( "DOES NOT CONTAIN", 0, true ), //$NON-NLS-1$
BEGINS_WITH( "BEGINS WITH", 0, true ), //$NON-NLS-1$
ENDS_WITH( "ENDS WITH", 0, true ), //$NON-NLS-1$
IS_NULL( "IS NULL", 2, false ), //$NON-NLS-1$
IS_NOT_NULL( "IS NOT NULL", 2, false ); //$NON-NLS-1$
private String strVal;
// 0 = string
// 1 = numeric
// 2 = both
private int operatorType;
private boolean requiresValue;
private Operator( String str, int operatorType, boolean requiresValue ) {
this.strVal = str;
this.operatorType = operatorType;
this.requiresValue = requiresValue;
}
public String toString() {
return strVal;
}
public static Operator parse( String val ) {
if ( val == null || val.equals( "" ) ) { //$NON-NLS-1$
return Operator.EQUAL;
}
val = val.toUpperCase();
// These are the UI equivalents that are re-resolved. Note this needs to be i18n
// @TODO i18n
if ( val.equals( ">" ) ) { //$NON-NLS-1$
return Operator.GREATER_THAN;
} else if ( val.equals( ">=" ) ) { //$NON-NLS-1$
return Operator.GREATOR_OR_EQUAL;
} else if ( val.equals( "=" ) ) { //$NON-NLS-1$
return Operator.EQUAL;
} else if ( val.equals( "<" ) ) { //$NON-NLS-1$
return Operator.LESS_THAN;
} else if ( val.equals( "<=" ) ) { //$NON-NLS-1$
return Operator.LESS_OR_EQUAL;
} else if ( val.equals( "EXACTLY MATCHES" ) ) { //$NON-NLS-1$
return Operator.EXACTLY_MATCHES;
} else if ( val.equals( "CONTAINS" ) ) { //$NON-NLS-1$
return Operator.CONTAINS;
} else if ( val.equals( "DOES NOT CONTAIN" ) ) { //$NON-NLS-1$
return Operator.DOES_NOT_CONTAIN;
} else if ( val.equals( "BEGINS WITH" ) ) { //$NON-NLS-1$
return Operator.BEGINS_WITH;
} else if ( val.equals( "ENDS WITH" ) ) { //$NON-NLS-1$
return Operator.ENDS_WITH;
} else if ( val.equals( "IS NULL" ) ) { //$NON-NLS-1$
return Operator.IS_NULL;
} else if ( val.equals( "IS NOT NULL" ) ) { //$NON-NLS-1$
return Operator.IS_NOT_NULL;
}
// Actual generated Open Formula formula name is passed in from deserialization routine. Try to match those here.
if ( val.equals( "CONTAINS" ) ) { //$NON-NLS-1$
return Operator.CONTAINS;
} else if ( val.equals( "BEGINSWITH" ) ) { //$NON-NLS-1$
return Operator.BEGINS_WITH;
} else if ( val.equals( "ENDSWITH" ) ) { //$NON-NLS-1$
return Operator.ENDS_WITH;
} else if ( val.equals( "ISNA" ) ) { //$NON-NLS-1$
return Operator.IS_NULL;
}
return Operator.EQUAL;
}
public boolean requiresValue() {
return requiresValue;
}
/**
* Returns an array of types separated by whether or not they're string types
*
* @return array of Operators
*/
/*
public static Operator[] values(boolean stringType){
Operator[] vals = Operator.values();
List<Operator> ops = new ArrayList<Operator>();
for(int i=0; i < vals.length; i++){
if (vals[i].operatorType == 2) {
ops.add(vals[i]);
} else if(vals[i].operatorType == 0 && stringType){
ops.add(vals[i]);
} else if (vals[i].operatorType == 1 && !stringType) {
ops.add(vals[i]);
}
}
return ops.toArray(new Operator[]{});
}
*/
public String formatCondition( String columnName, String paramName, String[] value, boolean parameterized ) {
if ( parameterized ) {
value = new String[] { "[param:" + paramName.replaceAll( "[\\{\\}]", "" )
+ "]" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
} else if ( this.operatorType == 0 || this.operatorType == 2 ) {
for ( int idx = 0; idx < value.length; idx++ ) {
if ( !value[ idx ].startsWith( "\"" ) && !value[ idx ].endsWith( "\"" ) ) { //$NON-NLS-1$ //$NON-NLS-2$
value[ idx ] = "\"" + value[ idx ] + "\""; //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
String retVal = ""; //$NON-NLS-1$
switch ( this ) {
case EXACTLY_MATCHES:
if ( value.length == 1 ) {
retVal += columnName + " = " + value[ 0 ]; //$NON-NLS-1$
} else {
StringBuilder sb = new StringBuilder();
sb.append( "IN(" ) //$NON-NLS-1$
.append( columnName )
.append( "; " ); //$NON-NLS-1$
for ( int idx = 0; idx < value.length; idx++ ) {
if ( idx > 0 ) {
sb.append( ";" ); //$NON-NLS-1$
}
sb.append( value[ idx ] );
}
sb.append( ")" ); //$NON-NLS-1$
retVal = sb.toString();
}
break;
case CONTAINS:
retVal += "CONTAINS(" + columnName + ";" + value[ 0 ] + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
break;
case DOES_NOT_CONTAIN:
retVal += "NOT(CONTAINS(" + columnName + ";" + value[ 0 ] + "))"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
break;
case BEGINS_WITH:
retVal += "BEGINSWITH(" + columnName + ";" + value[ 0 ] + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
break;
case ENDS_WITH:
retVal += "ENDSWITH(" + columnName + ";" + value[ 0 ] + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
break;
case IS_NULL:
retVal += "ISNA(" + columnName + ")"; //$NON-NLS-1$ //$NON-NLS-2$
break;
case IS_NOT_NULL:
retVal += "NOT(ISNA(" + columnName + "))"; //$NON-NLS-1$ //$NON-NLS-2$
break;
default:
retVal = columnName + " " + this.toString(); //$NON-NLS-1$
if ( this.requiresValue ) {
retVal += value[ 0 ];
}
break;
}
return retVal;
}
}