// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.dq.dbms;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.lang.StringUtils;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataquality.indicators.BenfordLawFrequencyIndicator;
import org.talend.dataquality.indicators.Indicator;
import org.talend.utils.ProductVersion;
import org.talend.utils.sql.Java2SqlType;
import orgomg.cwm.objectmodel.core.Expression;
/**
* DOC qiongli class global comment. Detailled comment <br/>
*
* $Id: talend.epf 55206 2011-02-15 17:32:14Z mhirt $
*
*/
public class HiveDbmsLanguage extends DbmsLanguage {
private static final String HIVE_IDENTIFIER_QUOTE = "`"; //$NON-NLS-1$
/**
* DOC qiongli HiveDbmsLanguage constructor comment.
*/
public HiveDbmsLanguage() {
super(DbmsLanguage.HIVE);
}
/**
* DOC qiongli HiveDbmsLanguage constructor comment.
*
* @param dbmsType
*/
public HiveDbmsLanguage(String dbmsType) {
super(dbmsType);
}
/**
* DOC qiongli HiveDbmsLanguage constructor comment.
*
* @param dbmsType
* @param dbVersion
*/
public HiveDbmsLanguage(String dbmsType, ProductVersion dbVersion) {
super(dbmsType, dbVersion);
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#charLength(java.lang.String)
*/
@Override
public String charLength(String columnName) {
return " LENGTH(" + columnName + ") "; //$NON-NLS-1$ //$NON-NLS-2$
}
/*
* (non-Javadoc)
*
* @see org.talend.cwm.management.api.DbmsLanguage#regexLike(java.lang.String, java.lang.String)
*/
@Override
public String regexLike(String element, String regex) {
return surroundWithSpaces(element + surroundWithSpaces(getRegularExpressionFunction()) + regex);
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#regexNotLike(java.lang.String, java.lang.String)
*/
@Override
public String regexNotLike(String element, String regex) {
return surroundWithSpaces(element + surroundWithSpaces(this.not() + getRegularExpressionFunction()) + regex);
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#getRegularExpressionFunction()
*/
@Override
public String getRegularExpressionFunction() {
return "REGEXP"; //$NON-NLS-1$
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#extractRegularExpressionFunction(orgomg.cwm.objectmodel.core.Expression)
*/
@Override
public String extractRegularExpressionFunction(Expression expression, String regex) {
return getRegularExpressionFunction();
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#isPkIndexSupported()
*/
@Override
public boolean isPkIndexSupported() {
return false;
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#supportCatalogSelection()
*/
@Override
public boolean supportCatalogSelection() {
return false;
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#createStatement(java.sql.Connection)
*/
@Override
public Statement createStatement(java.sql.Connection connection, int fetchSize) throws SQLException {
// hive don't need to set fetch size
return createStatement(connection);
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#getQueryColumnsWithPrefix(org.talend.cwm.relational.TdColumn[])
*/
@Override
public String getQueryColumnsWithPrefix(TdColumn[] columns) {
return getQueryColumns(columns);
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dq.dbms.DbmsLanguage#castColumn4ColumnAnalysisSqlExecutor(org.talend.dataquality.indicators.Indicator,
* org.talend.cwm.relational.TdColumn, java.lang.String)
*/
@Override
public String castColumn4ColumnAnalysisSqlExecutor(Indicator indicator, TdColumn tdColumn, String colName) {
if (indicator instanceof BenfordLawFrequencyIndicator) {
int javaType = tdColumn.getSqlDataType().getJavaDataType();
if (Java2SqlType.isNumbericInSQL(javaType)) {
return castColumnNameToChar(colName);
}
}
return super.castColumn4ColumnAnalysisSqlExecutor(indicator, tdColumn, colName);
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#castColumnNameToChar(java.lang.String)
*/
@Override
public String castColumnNameToChar(String columnName) {
// for impala, int type can not be used for string method,
return "CAST(" + columnName + " AS String)";//$NON-NLS-1$ //$NON-NLS-2$
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#getInvalidClauseBenFord(java.lang.String)
*/
@Override
public String getInvalidClauseBenFord(String columnName) {
// for impala, int type can not be used for REGEXP method
return super.getInvalidClauseBenFord(castColumnNameToChar(columnName));
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dq.dbms.DbmsLanguage#getQueryColumnSetWithPrefixFromContext(org.talend.core.model.metadata.builder
* .connection.DatabaseConnection, java.lang.String, java.lang.String, java.lang.String)
*/
@Override
protected String getQueryColumnSetWithPrefixFromContext(DatabaseConnection dbConn, String catalogName, String schemaName,
String tableName) {
String catalogNameFromContext = getCatalogNameFromContext(dbConn);
String schemaNameFromContext = getSchemaNameFromContext(dbConn);
if (StringUtils.isBlank(catalogNameFromContext) && StringUtils.isBlank(schemaNameFromContext)) {
catalogNameFromContext = catalogName;
schemaNameFromContext = schemaName;
}
return toQualifiedName(catalogNameFromContext, schemaNameFromContext, tableName);
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#getCatalogNameFromContext(org.talend.core.model.metadata.builder.connection.
* DatabaseConnection)
*/
@Override
public String getCatalogNameFromContext(DatabaseConnection dbConn) {
return null;
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.dbms.DbmsLanguage#getPatternFinderFunction(java.lang.String, java.lang.String,
* java.lang.String)
*/
@Override
protected String getPatternFinderFunction(String expression, String charsToReplace, String replacementChars) {
// TDQ-12042: fix hive can not run well for indicator "Pattern Low Frequency".
assert charsToReplace != null && replacementChars != null && charsToReplace.length() == replacementChars.length();
return translateUsingPattern(expression, charsToReplace, replacementChars);
}
@Override
public String getHardCodedQuoteIdentifier() {
return HIVE_IDENTIFIER_QUOTE;
}
}