// ============================================================================
//
// 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.analysis.explore;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataquality.indicators.columnset.ColumnDependencyIndicator;
import org.talend.dq.dbms.GenericSQLHandler;
import org.talend.dq.dbms.HiveDbmsLanguage;
import org.talend.dq.helper.ColumnDependencyHelper;
import org.talend.dq.helper.ContextHelper;
import org.talend.dq.indicators.preview.table.ChartDataEntity;
import org.talend.dq.nodes.indicator.type.IndicatorEnum;
/**
* DOC xqliu class global comment. Detailled comment
*/
public class ColumnDependencyExplorer extends DataExplorer {
@Override
public Map<String, String> getSubClassQueryMap() {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put(MENU_VIEW_VALID_ROWS, getComment(MENU_VIEW_VALID_ROWS) + getValidRowsStatement());
map.put(MENU_VIEW_VALID_VALUES, getComment(MENU_VIEW_VALID_VALUES) + getValidValuesStatement());
map.put(MENU_VIEW_DETAILED_VALID_VALUES, getComment(MENU_VIEW_DETAILED_VALID_VALUES) + getDetailedValidValuesStatement());
map.put(MENU_VIEW_INVALID_ROWS, getComment(MENU_VIEW_INVALID_ROWS) + getInvalidRowsStatement());
map.put(MENU_VIEW_INVALID_VALUES, getComment(MENU_VIEW_INVALID_VALUES) + getInvalidValuesStatement());
map.put(MENU_VIEW_DETAILED_INVALID_VALUES, getComment(MENU_VIEW_DETAILED_INVALID_VALUES)
+ getDetailedInvalidValuesStatement());
return map;
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.analysis.explore.DataExplorer#NotShowMenu()
*/
@Override
protected boolean NotShowMenu() {
// MOD qiongli 2012-8-14 TDQ-5907 Hive dosen't support these sql
return dbmsLanguage instanceof HiveDbmsLanguage;
}
/**
* DOC xqliu Comment method "getInvalidRowsStatement".
*
* @return
*/
private String getInvalidRowsStatement() {
return getStatement(dbmsLanguage.getFDGenericInvalidRows());
}
private String getDetailedInvalidValuesStatement() {
// MOD by zshen fixed 12039 to distinguish the same name of column.
String genericSQL = dbmsLanguage.getFDGenericInvalidDetailedValues();
ColumnDependencyIndicator cdIndicator = ((ColumnDependencyIndicator) this.indicator);
TdColumn columnA = cdIndicator.getColumnA();
TdColumn columnB = cdIndicator.getColumnB();
if (columnA.getName().equals(columnB.getName())) {
genericSQL = genericSQL.replaceFirst(GenericSQLHandler.COLUMN_NAMES_A, dbmsLanguage.quote(columnA.getName()) + " AS "//$NON-NLS-1$
+ columnA.getName() + "_A");//$NON-NLS-1$
genericSQL = genericSQL.replaceFirst(GenericSQLHandler.COLUMN_NAMES_B, dbmsLanguage.quote(columnB.getName()) + " AS "//$NON-NLS-1$
+ columnA.getName() + "_B");//$NON-NLS-1$
}
return getStatement(genericSQL);
}
private String getDetailedValidValuesStatement() {
// MOD by zshen fixed 12039 to distinguish the same name of column.
String genericSQL = dbmsLanguage.getFDGenericValidDetailedValues();
ColumnDependencyIndicator cdIndicator = ((ColumnDependencyIndicator) this.indicator);
TdColumn columnA = cdIndicator.getColumnA();
TdColumn columnB = cdIndicator.getColumnB();
if (columnA.getName().equals(columnB.getName())) {
genericSQL = genericSQL.replaceFirst(GenericSQLHandler.COLUMN_NAMES_A, dbmsLanguage.quote(columnA.getName()) + " AS "//$NON-NLS-1$
+ columnA.getName() + "_A");//$NON-NLS-1$
genericSQL = genericSQL.replaceFirst(GenericSQLHandler.COLUMN_NAMES_B, dbmsLanguage.quote(columnB.getName()) + " AS "//$NON-NLS-1$
+ columnA.getName() + "_B");//$NON-NLS-1$
}
return getStatement(genericSQL);
}
private String getInvalidValuesStatement() {
return getStatement(dbmsLanguage.getFDGenericInvalidValues());
}
private String getValidValuesStatement() {
return getStatement(dbmsLanguage.getFDGenericValidValues());
}
/**
* DOC xqliu Comment method "getValidRowsStatement".
*
* @return
*/
private String getValidRowsStatement() {
return getStatement(dbmsLanguage.getFDGenericValidRows());
}
/**
* DOC xqliu Comment method "getStatement".
*
* @param genericSQL
* @return
*/
private String getStatement(String genericSQL) {
ColumnDependencyIndicator cdIndicator = ((ColumnDependencyIndicator) this.indicator);
TdColumn columnA = cdIndicator.getColumnA();
TdColumn columnB = cdIndicator.getColumnB();
GenericSQLHandler sqlHandler = new GenericSQLHandler(genericSQL);
sqlHandler.replaceColumnA(dbmsLanguage.quote(columnA.getName())).replaceColumnB(dbmsLanguage.quote(columnB.getName()))
.replaceTable(dbmsLanguage.quote(getFullyQualifiedTableName(columnA)));
String instantiatedSQL = sqlHandler.getSqlString();
List<String> whereClauses = new ArrayList<String>();
String dataFilter = ContextHelper.getDataFilterWithoutContext(this.analysis);
if (!StringUtils.isEmpty(dataFilter)) {
whereClauses.add(dataFilter);
}
instantiatedSQL = dbmsLanguage.addWhereToSqlStringStatement(instantiatedSQL, whereClauses);
return instantiatedSQL;
}
@Override
public void setEnitty(ChartDataEntity entity) {
this.entity = entity;
this.indicator = entity.getIndicator();
this.indicatorEnum = IndicatorEnum.findIndicatorEnum(indicator.eClass());
this.columnName = ColumnDependencyHelper.getIndicatorName(entity.getIndicator());
}
}