// ============================================================================
//
// 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.LinkedHashMap;
import java.util.Map;
import org.eclipse.emf.common.util.EList;
import org.talend.cwm.relational.TdExpression;
import org.talend.dataquality.PluginConstant;
import org.talend.dataquality.analysis.ExecutionLanguage;
import org.talend.dataquality.indicators.columnset.ColumnsetPackage;
import org.talend.dataquality.indicators.definition.IndicatorDefinition;
import org.talend.dataquality.indicators.definition.userdefine.UDIndicatorDefinition;
import org.talend.dq.dbms.DbmsLanguage;
import org.talend.dq.dbms.GenericSQLHandler;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* @author scorreia
*
* This class explores the data that matched or did not match a pattern indicator.
*/
public abstract class PatternExplorer extends DataExplorer {
/**
* DOC scorreia PatternExplorer constructor comment.
*
*/
public PatternExplorer() {
}
@Override
public Map<String, String> getSubClassQueryMap() {
Map<String, String> map = new LinkedHashMap<String, String>();
// engin on result page
boolean isSqlEngine = ExecutionLanguage.SQL.equals(analysis.getParameters().getExecutionLanguage());
initRegularExpressionParameter();
// MOD zshen 10448 Add menus "view invalid values" and "view valid values" on pattern matching indicator
map.put(MENU_VIEW_VALID_ROWS, isSqlEngine ? getComment(MENU_VIEW_VALID_ROWS) + getValidRowsStatement() : null);
map.put(MENU_VIEW_VALID_VALUES, isSqlEngine ? getComment(MENU_VIEW_VALID_VALUES) + getValidValuesStatement() : null);
map.put(MENU_VIEW_INVALID_ROWS, isSqlEngine ? getComment(MENU_VIEW_INVALID_ROWS) + getInvalidRowsStatement() : null);
map.put(MENU_VIEW_INVALID_VALUES, isSqlEngine ? getComment(MENU_VIEW_INVALID_VALUES) + getInvalidValuesStatement() : null);
// ~10448
return map;
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.analysis.explore.DataExplorer#NotShowMenu()
*/
@Override
protected boolean NotShowMenu() {
// MOD qiongli 2011-3-30,feature 19192,filter this menu and query for ColumnSet AllMatchIndicator
return ColumnsetPackage.eINSTANCE.getAllMatchIndicator().isSuperTypeOf(indicator.eClass());
}
protected void initRegularExpressionParameter() {
// The code should be implemented on the sub class
}
/**
*
* get the Valid Values Statement.
*
* @return SELECT statement for the invalid Value of select column
*/
public String getInvalidValuesStatement() {
// when the indicator is the use define match
IndicatorDefinition indicatorDefinition = this.indicator.getIndicatorDefinition();
if (indicatorDefinition instanceof UDIndicatorDefinition) {
EList<TdExpression> list = ((UDIndicatorDefinition) indicatorDefinition).getViewInvalidValuesExpression();
return getQueryAfterReplaced(indicatorDefinition, list);
}
String regexPatternString = dbmsLanguage.getRegexPatternString(this.indicator);
String regexCmp = getRegexNotLike(regexPatternString);
// add null as invalid rows
String nullClause = dbmsLanguage.or() + columnName + dbmsLanguage.isNull();
// mzhao TDQ-4967 add "(" and ")" for regex and null clause.
String pattCondStr = "(" + regexCmp + nullClause + ")";//$NON-NLS-1$//$NON-NLS-2$
return getValuesStatement(columnName, pattCondStr);
}
abstract protected String getRegexNotLike(String regexPatternString);
/**
*
* get the Valid Values Statement.
*
* @return SELECT statement for the valid Value of select column
*/
public String getValidValuesStatement() {
// when the indicator is the use define match
IndicatorDefinition indicatorDefinition = this.indicator.getIndicatorDefinition();
if (indicatorDefinition instanceof UDIndicatorDefinition) {
EList<TdExpression> list = ((UDIndicatorDefinition) indicatorDefinition).getViewValidValuesExpression();
return getQueryAfterReplaced(indicatorDefinition, list);
}
String regexPatternString = dbmsLanguage.getRegexPatternString(this.indicator);
String regexCmp = getRegexLike(regexPatternString);
return getValuesStatement(columnName, regexCmp);
}
abstract protected String getRegexLike(String regexPatternString);
/**
* get the Invalid Rows Statement.
*
* @return
*/
public String getInvalidRowsStatement() {
// when the indicator is the use define match
IndicatorDefinition indicatorDefinition = this.indicator.getIndicatorDefinition();
if (indicatorDefinition instanceof UDIndicatorDefinition) {
EList<TdExpression> list = ((UDIndicatorDefinition) indicatorDefinition).getViewInvalidRowsExpression();
return getQueryAfterReplaced(indicatorDefinition, list);
}
String regexPatternString = dbmsLanguage.getRegexPatternString(this.indicator);
String regexCmp = getRegexNotLike(regexPatternString);
// add null as invalid rows
String nullClause = dbmsLanguage.or() + columnName + dbmsLanguage.isNull();
// mzhao TDQ-4967 add "(" and ")" for regex and null clause.
String pattCondStr = "(" + regexCmp + nullClause + ")";//$NON-NLS-1$//$NON-NLS-2$
return getRowsStatement(pattCondStr);
}
/**
* get the Valid Rows Statement.
*
* @return
*/
public String getValidRowsStatement() {
// when the indicator is the use define match
IndicatorDefinition indicatorDefinition = this.indicator.getIndicatorDefinition();
if (indicatorDefinition instanceof UDIndicatorDefinition) {
EList<TdExpression> list = ((UDIndicatorDefinition) indicatorDefinition).getViewValidRowsExpression();
return getQueryAfterReplaced(indicatorDefinition, list);
}
String regexPatternString = dbmsLanguage.getRegexPatternString(this.indicator);
String regexCmp = getRegexLike(regexPatternString);
return getRowsStatement(regexCmp);
}
/**
* get the Query After Replaced.
*
* @param indicatorDefinition
* @param list
* @return String
*/
public String getQueryAfterReplaced(IndicatorDefinition indicatorDefinition, EList<TdExpression> list) {
String sql = PluginConstant.EMPTY_STRING;
TdExpression tdExp = DbmsLanguage.getSqlExpression(indicatorDefinition, dbmsLanguage.getDbmsName(), list,
dbmsLanguage.getDbVersion());
sql = tdExp.getBody();
String dataFilterClause = getDataFilterClause();
if (!dataFilterClause.equals(PluginConstant.EMPTY_STRING)) {
sql = sql.replace(GenericSQLHandler.WHERE_CLAUSE, dbmsLanguage.where() + "(" + dataFilterClause + ")"); //$NON-NLS-1$ //$NON-NLS-2$
sql = sql.replace(GenericSQLHandler.AND_WHERE_CLAUSE, dbmsLanguage.and() + "(" + dataFilterClause + ")"); //$NON-NLS-1$ //$NON-NLS-2$
} else {
sql = sql.replace(GenericSQLHandler.WHERE_CLAUSE, PluginConstant.EMPTY_STRING);
sql = sql.replace(GenericSQLHandler.AND_WHERE_CLAUSE, PluginConstant.EMPTY_STRING);
}
ModelElement analyzedElement = indicator.getAnalyzedElement();
String tableName = getFullyQualifiedTableName(analyzedElement);
sql = dbmsLanguage.fillGenericQueryWithColumnsAndTable(sql, dbmsLanguage.quote(analyzedElement.getName()), tableName);
if (sql.indexOf(GenericSQLHandler.GROUP_BY_ALIAS) != -1) {
sql = sql.replace(GenericSQLHandler.GROUP_BY_ALIAS, dbmsLanguage.quote(analyzedElement.getName()));
}
return sql;
}
public boolean isImplementRegexFunction(String menuLabel) {
if (menuLabel == null) {
return false;
}
String regexPatternString = dbmsLanguage.getRegexPatternString(this.indicator);
if (menuLabel.equals(MENU_VIEW_VALID_ROWS) || menuLabel.equals(MENU_VIEW_VALID_VALUES)) {
if (getRegexLike(regexPatternString) != null) {
return true;
}
} else if (menuLabel.equals(DataExplorer.MENU_VIEW_INVALID_ROWS) || menuLabel.equals(MENU_VIEW_INVALID_VALUES)) {
if (getRegexNotLike(regexPatternString) != null) {
return true;
}
}
return false;
}
}