// ============================================================================
//
// 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.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringEscapeUtils;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataquality.helpers.AnalysisHelper;
import org.talend.dq.dbms.DbmsLanguageFactory;
/**
* DOC mzhao class global comment. Detailled comment
*/
public class SoundexFrequencyExplorer extends FrequencyStatisticsExplorer {
private static final String REGEX = "SELECT.*\\s*MAX\\((.*)\\)\\s*, (SOUNDEX|NYSIIS)\\(.*\\)\\s*, COUNT\\(\\*\\)\\s*(AS|as)?\\s*\\w*\\s*, COUNT\\(DISTINCT .*\\)\\s*(AS|as)?\\s*\\w*\\s* FROM"; //$NON-NLS-1$
@Override
protected String getFreqRowsStatement() {
TdColumn column = (TdColumn) indicator.getAnalyzedElement();
// MOD zshen 11005: SQL syntax error for all analysis on Informix databases in Talend Open Profiler
String resultSql = null;
// MOD klliu 0013242: set soundex indicator for null field,drill down will get NPE
if (entity.getKey() != null) {
resultSql = dbmsLanguage.getFreqRowsStatement(this.columnName, getFullyQualifiedTableName(column), entity.getKey()
.toString());
if (resultSql != null) {
return resultSql;
}
}
String clause = getInstantiatedClause();
return "SELECT * FROM " + getFullyQualifiedTableName(column) + dbmsLanguage.where() + inBrackets(clause) //$NON-NLS-1$
+ andDataFilterClause();
}
@Override
protected String getInstantiatedClause() {
// get function which convert data into a pattern
String function = getFunction();
// MOD zshen bug 11005 sometimes(when instead of soundex() with some sql),the Variable named "function" is not
// is
// colName.
if (function != null
&& (DbmsLanguageFactory.isInfomix(this.dbmsLanguage.getDbmsName()) || DbmsLanguageFactory
.isOracle(this.dbmsLanguage.getDbmsName()))) {
function = columnName;
}
// ~11005
// MOD mzhao bug 9740 2009-11-10
String clause = entity.isLabelNull() || function == null ? columnName + dbmsLanguage.isNull()
: dbmsLanguage.getSoundexPrefix()
+ "("//$NON-NLS-1$
+ function
+ ")" + dbmsLanguage.equal() + dbmsLanguage.getSoundexPrefix() + "('" + StringEscapeUtils.escapeSql(entity.getKey().toString()) + "')"; //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$
return clause;
}
private String getFunction() {
String instantiatedSQL = getIndicatorExpressionSQL();
if (instantiatedSQL == null) {
return instantiatedSQL;
}
Pattern p = Pattern.compile(REGEX, Pattern.CASE_INSENSITIVE);
Matcher matcher = p.matcher(instantiatedSQL);
matcher.find();
String group = matcher.group(1);
return group;
}
@Override
public Map<String, String> getSubClassQueryMap() {
Map<String, String> map = new HashMap<String, String>();
map.put(MENU_VIEW_ROWS, getComment(MENU_VIEW_ROWS) + getFreqRowsStatement());
return map;
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.analysis.explore.DataExplorer#NotShowMenu()
*/
@Override
protected boolean NotShowMenu() {
return AnalysisHelper.isJavaExecutionEngine(this.analysis);
}
}