/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.translator.jdbc.actian;
import static org.teiid.translator.TypeFacility.RUNTIME_NAMES.BIG_DECIMAL;
import static org.teiid.translator.TypeFacility.RUNTIME_NAMES.CHAR;
import static org.teiid.translator.TypeFacility.RUNTIME_NAMES.DATE;
import static org.teiid.translator.TypeFacility.RUNTIME_NAMES.FLOAT;
import static org.teiid.translator.TypeFacility.RUNTIME_NAMES.INTEGER;
import static org.teiid.translator.TypeFacility.RUNTIME_NAMES.STRING;
import static org.teiid.translator.TypeFacility.RUNTIME_NAMES.TIME;
import static org.teiid.translator.TypeFacility.RUNTIME_NAMES.TIMESTAMP;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.teiid.language.Function;
import org.teiid.translator.SourceSystemFunctions;
import org.teiid.translator.Translator;
import org.teiid.translator.TranslatorException;
import org.teiid.translator.jdbc.AliasModifier;
import org.teiid.translator.jdbc.ConvertModifier;
import org.teiid.translator.jdbc.FunctionModifier;
import org.teiid.translator.jdbc.JDBCExecutionFactory;
@Translator(name="actian-vector", description="A translator for Actian Vector in Hadoop")
public class ActianVectorInHadoopExecutionFactory extends JDBCExecutionFactory{
public static final String ACTIAN = "actian"; //$NON-NLS-1$
@Override
public void start() throws TranslatorException {
super.start();
ConvertModifier convertModifier = new ConvertModifier();
convertModifier.addTypeMapping("CHAR(1)", FunctionModifier.CHAR); //$NON-NLS-1$
convertModifier.addTypeMapping("VARCHAR", FunctionModifier.STRING); //$NON-NLS-1$
convertModifier.addTypeMapping("NVARCHAR", FunctionModifier.STRING); //$NON-NLS-1$
convertModifier.addTypeMapping("INTEGER1", FunctionModifier.BYTE); //$NON-NLS-1$
convertModifier.addTypeMapping("INTEGER2", FunctionModifier.SHORT); //$NON-NLS-1$
convertModifier.addTypeMapping("INTEGER4", FunctionModifier.INTEGER); //$NON-NLS-1$
convertModifier.addTypeMapping("INTEGER8", FunctionModifier.LONG); //$NON-NLS-1$
convertModifier.addTypeMapping("DECIMAL", FunctionModifier.BIGDECIMAL); //$NON-NLS-1$
convertModifier.addTypeMapping("MONEY", FunctionModifier.BIGDECIMAL); //$NON-NLS-1$
convertModifier.addTypeMapping("FLOAT", FunctionModifier.DOUBLE); //$NON-NLS-1$
convertModifier.addTypeMapping("FLOAT4", FunctionModifier.FLOAT); //$NON-NLS-1$
convertModifier.addTypeMapping("ANSIDATE", FunctionModifier.DATE); //$NON-NLS-1$
convertModifier.addTypeMapping("TIME WITHOUT TIME ZONE", FunctionModifier.TIME); //$NON-NLS-1$
convertModifier.addTypeMapping("TIME WITH TIME ZONE", FunctionModifier.TIME); //$NON-NLS-1$
convertModifier.addTypeMapping("TIME WITH LOCAL TIME ZONE", FunctionModifier.TIME); //$NON-NLS-1$
convertModifier.addTypeMapping("TIMESTAMP WITHOUT TIME ZONE", FunctionModifier.TIMESTAMP); //$NON-NLS-1$
convertModifier.addTypeMapping("TIMESTAMP WITH TIME ZONE", FunctionModifier.TIMESTAMP); //$NON-NLS-1$
convertModifier.addTypeMapping("TIMESTAMP WITH LOCAL TIME ZONE", FunctionModifier.TIMESTAMP); //$NON-NLS-1$
registerFunctionModifier(SourceSystemFunctions.CONVERT, convertModifier);
registerFunctionModifier(SourceSystemFunctions.CHAR, new AliasModifier("CHR"));
registerFunctionModifier(SourceSystemFunctions.LCASE, new AliasModifier("LOWERCASE"));
registerFunctionModifier(SourceSystemFunctions.UCASE, new AliasModifier("UPPERCASE"));
registerFunctionModifier(SourceSystemFunctions.CEILING, new AliasModifier("CEIL"));
registerFunctionModifier(SourceSystemFunctions.NULLIF, new AliasModifier("NVL"));
registerFunctionModifier(SourceSystemFunctions.CURDATE, new Constant("CURRENT_DATE"));
registerFunctionModifier(SourceSystemFunctions.CURTIME, new Constant("CURRENT_TIME"));
registerFunctionModifier(SourceSystemFunctions.RAND, new AliasModifier("RANDOM"));
registerFunctionModifier("CURRENT_TIMESTAMP", new Constant());
registerFunctionModifier("CURRENT_USER", new Constant());
registerFunctionModifier("INITIAL_USER", new Constant());
registerFunctionModifier("LOCAL_TIME", new Constant());
registerFunctionModifier("LOCAL_TIMESTAMP", new Constant());
registerFunctionModifier("SESSION_USER", new Constant());
registerFunctionModifier("SYSTEM_USER", new Constant());
registerFunctionModifier("USER", new Constant());
//pushdown
addPushDownFunction(ACTIAN, "CHAREXTRACT", CHAR, STRING, INTEGER);
addPushDownFunction(ACTIAN, "SHIFT", STRING, STRING, INTEGER);
addPushDownFunction(ACTIAN, "SIZE", INTEGER, STRING);
addPushDownFunction(ACTIAN, "SOUNDEX", STRING, STRING);
addPushDownFunction(ACTIAN, "SQUEEZE", STRING, STRING);
addPushDownFunction(ACTIAN, "TRUNC", BIG_DECIMAL, BIG_DECIMAL, INTEGER);
addPushDownFunction(ACTIAN, "DAY", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "DAY", INTEGER, DATE);
addPushDownFunction(ACTIAN, "CURRENT_TIMESTAMP", TIMESTAMP);
addPushDownFunction(ACTIAN, "CURRENT_USER", STRING);
addPushDownFunction(ACTIAN, "INITIAL_USER", STRING);
addPushDownFunction(ACTIAN, "LOCAL_TIME", TIME);
addPushDownFunction(ACTIAN, "LOCAL_TIMESTAMP", TIMESTAMP);
addPushDownFunction(ACTIAN, "SESSION_USER", STRING);
addPushDownFunction(ACTIAN, "SYSTEM_USER", STRING);
addPushDownFunction(ACTIAN, "USER", STRING);
addPushDownFunction(ACTIAN, "ADD_MONTHS", TIMESTAMP, TIMESTAMP, INTEGER);
addPushDownFunction(ACTIAN, "DATE_FORMAT", STRING, TIMESTAMP, STRING);
addPushDownFunction(ACTIAN, "DATE_PART", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "DATE_TRUNC", TIMESTAMP, TIMESTAMP);
addPushDownFunction(ACTIAN, "DAY", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "DAYOFMONTH", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "DAYOFWEEK", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "DAYOFYEAR", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "FROM_UNIXTIME", TIMESTAMP, INTEGER);
addPushDownFunction(ACTIAN, "HOUR", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "LASTDAY", TIMESTAMP, TIMESTAMP);
addPushDownFunction(ACTIAN, "MICROSECOND", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "MILLISECOND", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "MINUTE", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "MONTH", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "MONTHS_BETWEEN", FLOAT, TIMESTAMP, DATE, DATE);
addPushDownFunction(ACTIAN, "MONTHS_BETWEEN", FLOAT, TIMESTAMP, TIMESTAMP, TIMESTAMP);
addPushDownFunction(ACTIAN, "NANOSECOND", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "QUATER", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "SECOND", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "WEEK", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "YEAR", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "YEAR_WEEK", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "UNIX_TIMESTAMP", INTEGER, TIMESTAMP);
addPushDownFunction(ACTIAN, "WEEK_ISO", INTEGER, TIMESTAMP);
}
@Override
public List<String> getSupportedFunctions() {
List<String> supportedFunctions = new ArrayList<String>();
supportedFunctions.addAll(super.getSupportedFunctions());
supportedFunctions.add(SourceSystemFunctions.CONVERT);
// string functions
supportedFunctions.add(SourceSystemFunctions.ASCII);
supportedFunctions.add(SourceSystemFunctions.CHAR);
supportedFunctions.add(SourceSystemFunctions.CONCAT);
supportedFunctions.add(SourceSystemFunctions.INITCAP);
supportedFunctions.add(SourceSystemFunctions.LEFT);
supportedFunctions.add(SourceSystemFunctions.LENGTH);
supportedFunctions.add(SourceSystemFunctions.LOCATE);
supportedFunctions.add(SourceSystemFunctions.LCASE);
supportedFunctions.add(SourceSystemFunctions.LPAD);
supportedFunctions.add(SourceSystemFunctions.LTRIM);
supportedFunctions.add(SourceSystemFunctions.REPEAT);
supportedFunctions.add(SourceSystemFunctions.REPLACE);
supportedFunctions.add(SourceSystemFunctions.RIGHT);
supportedFunctions.add(SourceSystemFunctions.RPAD);
supportedFunctions.add(SourceSystemFunctions.RTRIM);
supportedFunctions.add(SourceSystemFunctions.SUBSTRING);
supportedFunctions.add(SourceSystemFunctions.TRIM);
supportedFunctions.add(SourceSystemFunctions.UCASE);
// numeric functions
supportedFunctions.add(SourceSystemFunctions.ABS);
supportedFunctions.add(SourceSystemFunctions.ACOS);
supportedFunctions.add(SourceSystemFunctions.ASIN);
supportedFunctions.add(SourceSystemFunctions.ATAN);
supportedFunctions.add(SourceSystemFunctions.ATAN2);
supportedFunctions.add(SourceSystemFunctions.CEILING);
supportedFunctions.add(SourceSystemFunctions.COS);
supportedFunctions.add(SourceSystemFunctions.EXP);
supportedFunctions.add(SourceSystemFunctions.FLOOR);
supportedFunctions.add(SourceSystemFunctions.LOG);
supportedFunctions.add(SourceSystemFunctions.MOD);
supportedFunctions.add(SourceSystemFunctions.PI);
supportedFunctions.add(SourceSystemFunctions.POWER);
supportedFunctions.add(SourceSystemFunctions.RAND);
supportedFunctions.add(SourceSystemFunctions.ROUND);
supportedFunctions.add(SourceSystemFunctions.SIGN);
supportedFunctions.add(SourceSystemFunctions.SIN);
supportedFunctions.add(SourceSystemFunctions.SQRT);
supportedFunctions.add(SourceSystemFunctions.TAN);
//date time functions
supportedFunctions.add(SourceSystemFunctions.DAYOFMONTH);
supportedFunctions.add(SourceSystemFunctions.DAYOFWEEK);
supportedFunctions.add(SourceSystemFunctions.DAYOFYEAR);
supportedFunctions.add(SourceSystemFunctions.HOUR);
supportedFunctions.add(SourceSystemFunctions.MINUTE);
supportedFunctions.add(SourceSystemFunctions.MONTH);
supportedFunctions.add(SourceSystemFunctions.MONTHNAME);
supportedFunctions.add(SourceSystemFunctions.NOW);
supportedFunctions.add(SourceSystemFunctions.QUARTER);
supportedFunctions.add(SourceSystemFunctions.SECOND);
supportedFunctions.add(SourceSystemFunctions.WEEK);
supportedFunctions.add(SourceSystemFunctions.YEAR);
supportedFunctions.add(SourceSystemFunctions.CURDATE);
supportedFunctions.add(SourceSystemFunctions.CURTIME);
supportedFunctions.add(SourceSystemFunctions.IFNULL);
supportedFunctions.add(SourceSystemFunctions.NULLIF);
return supportedFunctions;
}
static class Constant extends FunctionModifier{
private String name;
public Constant() {
}
public Constant(String name) {
this.name = name;
}
@Override
public List<?> translate(Function function) {
if (this.name != null) {
function.setName(this.name);
}
return Arrays.asList(function.getName());
}
}
@Override
public boolean supportsInlineViews() {
return true;
}
@Override
public boolean supportsIntersect() {
return true;
}
@Override
public boolean supportsOrderByWithExtendedGrouping() {
return true;
}
@Override
public boolean supportsGroupByRollup() {
return true;
}
@Override
public boolean supportsAggregatesEnhancedNumeric() {
return true;
}
@Override
public boolean supportsExcept() {
return true;
}
@Override
public boolean supportsSetQueryOrderBy() {
return true;
}
@Override
public boolean supportsCommonTableExpressions() {
return true;
}
@Override
public boolean supportsSubqueryCommonTableExpressions() {
return true;
}
@Override
public boolean supportsElementaryOlapOperations(){
return true;
}
@Override
public boolean supportsWindowOrderByWithAggregates() {
return true;
}
@Override
public boolean supportsSelectWithoutFrom() {
return true;
}
@Override
public boolean supportsSelectExpression() {
return true;
}
}