// ============================================================================
//
// 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;
import java.sql.Connection;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.talend.cwm.db.connection.ConnectionUtils;
import org.talend.cwm.helper.ColumnSetHelper;
import org.talend.cwm.helper.SwitchHelpers;
import org.talend.cwm.management.i18n.Messages;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataquality.PluginConstant;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dataquality.indicators.RegexpMatchingIndicator;
import org.talend.dataquality.indicators.columnset.AllMatchIndicator;
import org.talend.dataquality.indicators.columnset.ColumnSetMultiValueIndicator;
import org.talend.dataquality.indicators.columnset.ColumnsetPackage;
import org.talend.dq.dbms.GenericSQLHandler;
import org.talend.dq.indicators.ColumnSetIndicatorEvaluator;
import org.talend.utils.sugars.ReturnCode;
import org.talend.utils.sugars.TypedReturnCode;
import orgomg.cwm.objectmodel.core.Classifier;
import orgomg.cwm.objectmodel.core.ModelElement;
import orgomg.cwm.resource.relational.ColumnSet;
/**
* DOC qiongli class global comment. Detailled comment
*/
public class ColumnSetAnalysisExecutor extends AnalysisExecutor {
private static Logger log = Logger.getLogger(ColumnSetAnalysisExecutor.class);
protected boolean isDelimitedFile = false;
protected boolean isMdm = false;
/**
* DOC yyi 2011-02-24 17871:delimitefile.
*/
public ColumnSetAnalysisExecutor(boolean isDelimitedFile, boolean isMdm) {
super();
this.isDelimitedFile = isDelimitedFile;
this.isMdm = isMdm;
}
/*
* (non-Jsdoc)
*
* @see org.talend.dq.analysis.AnalysisExecutor#runAnalysis(org.talend.dataquality.analysis.Analysis,
* java.lang.String)
*/
@Override
protected boolean runAnalysis(Analysis analysis, String sqlStatement) {
ColumnSetIndicatorEvaluator eval = createIndicatorEvaluator(analysis);
eval.setMonitor(getMonitor());
// --- add indicators
EList<Indicator> indicators = analysis.getResults().getIndicators();
for (Indicator indicator : indicators) {
if (ColumnsetPackage.eINSTANCE.getColumnSetMultiValueIndicator().isSuperTypeOf(indicator.eClass())) {
ColumnSetMultiValueIndicator colSetMultValIndicator = (ColumnSetMultiValueIndicator) indicator;
colSetMultValIndicator.prepare();
eval.storeIndicator(indicator.getName(), colSetMultValIndicator);
}
}
TypedReturnCode<java.sql.Connection> connection = null;
// MOD yyi 2011-02-22 17871:delimitefile
if (!isDelimitedFile) {
connection = initConnection(analysis, eval);
if (!connection.isOk()) {
return false;
}
}
// when to close connection
boolean closeAtTheEnd = true;
ReturnCode rc = eval.evaluateIndicators(sqlStatement, closeAtTheEnd);
// MOD gdbu 2011-8-12 : file delimited connection is null
// close connection
if (connection != null) {
if (POOLED_CONNECTION) {
// release the pooled connection
resetConnectionPool(analysis);
} else {
ConnectionUtils.closeConnection(connection.getObject());
}
}
if (!rc.isOk()) {
traceError(rc.getMessage());
}
if (getMonitor() != null) {
getMonitor().worked(compIndicatorsWorked);
}
return rc.isOk();
}
/**
* DOC zshen Comment method "initConnection".
*
* @param analysis
* @param eval
* @return
*/
protected TypedReturnCode<java.sql.Connection> initConnection(Analysis analysis, ColumnSetIndicatorEvaluator eval) {
TypedReturnCode<java.sql.Connection> connection;
connection = getConnectionBeforeRun(analysis);
if (!connection.isOk()) {
this.traceError(connection.getMessage());
return connection;
}
// set it into the evaluator
eval.setConnection(connection.getObject());
// use pooled connection
eval.setPooledConnection(POOLED_CONNECTION);
return connection;
}
/**
* DOC zshen Comment method "createIndicatorEvaluator".
*
* @param analysis
* @return
*/
protected ColumnSetIndicatorEvaluator createIndicatorEvaluator(Analysis analysis) {
return new ColumnSetIndicatorEvaluator(analysis);
}
/*
* (non-Jsdoc)
*
* @see org.talend.dq.analysis.AnalysisExecutor#createSqlStatement(org.talend.dataquality.analysis.Analysis)
*/
@Override
protected String createSqlStatement(Analysis analysis) {
// MOD yyi 2011-02-22 17871:delimitefile
if (isDelimitedFile) {
return PluginConstant.EMPTY_STRING;
}
// ~
this.cachedAnalysis = analysis;
StringBuilder sql = new StringBuilder("SELECT ");//$NON-NLS-1$
EList<Indicator> indicators = analysis.getResults().getIndicators();
// MOD yyi 2011-02-22 17871:delimitefile
EList<ModelElement> analysedElements = null;
for (Indicator indicator : indicators) {
if (ColumnsetPackage.eINSTANCE.getColumnSetMultiValueIndicator().isSuperTypeOf(indicator.eClass())) {
ColumnSetMultiValueIndicator colSetMultValIndicator = (ColumnSetMultiValueIndicator) indicator;
if (analysedElements == null) {
analysedElements = colSetMultValIndicator.getAnalyzedColumns();
} else {
analysedElements.addAll(colSetMultValIndicator.getAnalyzedColumns());
}
}
}
if (analysedElements == null || analysedElements.isEmpty()) {
setError(Messages.getString("ColumnAnalysisExecutor.CannotCreateSQLStatement",//$NON-NLS-1$
analysis.getName()));
return null;
}
// MOD yyi 2011-02-22 17871:delimitefile, indiactor changed
final Iterator<ModelElement> iterator = analysedElements.iterator();
while (iterator.hasNext()) { // for (ModelElement modelElement : analysedElements) {
ModelElement modelElement = iterator.next();
// --- preconditions
TdColumn col = SwitchHelpers.COLUMN_SWITCH.doSwitch(modelElement);
if (col == null) {
setError(Messages.getString("ColumnAnalysisExecutor.GivenElementIsNotColumn", modelElement)); //$NON-NLS-1$
return null;
}
Classifier owner = col.getOwner();
if (owner == null) {
setError(Messages.getString("ColumnAnalysisExecutor.NoOwnerFound", col.getName())); //$NON-NLS-1$
}
ColumnSet colSet = SwitchHelpers.COLUMN_SET_SWITCH.doSwitch(owner);
if (colSet == null) {
setError(Messages.getString("ColumnAnalysisExecutor.NoContainerFound", col.getName()));//$NON-NLS-1$
return null;
}
// else add into select
// select all the column to be prepare for drill down when user need.
if (!analysis.getParameters().isStoreData()) {
sql.append(this.quote(col.getName()));
// append comma if more columns exist
if (iterator.hasNext()) {
sql.append(',');
}
}
}
TdColumn firstColumn = SwitchHelpers.COLUMN_SWITCH.doSwitch(analysedElements.get(0));
// select all the column to be prepare for drill down.
if (analysis.getParameters().isStoreData()) {
// MOD klliu 2011-06-30 bug 22523 whichever is Table or View,that finds columns should ues columnset
EObject eContainer = firstColumn.eContainer();
List<TdColumn> columnList = ColumnSetHelper.getColumns(SwitchHelpers.COLUMN_SET_SWITCH.doSwitch(eContainer));
// ~
Iterator<TdColumn> iter = columnList.iterator();
while (iter.hasNext()) {
TdColumn column = iter.next();
sql.append(this.quote(column.getName()));
// append comma if more columns exist
if (iter.hasNext()) {
sql.append(',');
}
}
}
// add from clause
sql.append(dbms().from());
sql.append(dbms().getQueryColumnSetWithPrefix(firstColumn));
// add where clause
// --- get data filter
ModelElementAnalysisHandler handler = new ModelElementAnalysisHandler();
handler.setAnalysis(analysis);
String stringDataFilter = handler.getStringDataFilter();
sql.append(GenericSQLHandler.WHERE_CLAUSE);
String sqlStatement = sql.toString();
sqlStatement = dbms().addWhereToStatement(sqlStatement, stringDataFilter);
return sqlStatement;
}
@Override
protected boolean check(Analysis analysis) {
if (!super.check(analysis)) {
return false;
} else {
EList<Indicator> indicators = analysis.getResults().getIndicators();
for (Indicator indicator : indicators) {
if (indicator instanceof AllMatchIndicator) {
if (!checkAllMatchIndicator((AllMatchIndicator) indicator)) {
return false;
}
}
}
}
return true;
}
protected boolean checkAllMatchIndicator(AllMatchIndicator indicator) {
EList<RegexpMatchingIndicator> indicators = indicator.getCompositeRegexMatchingIndicators();
String patternNames = PluginConstant.EMPTY_STRING;
for (RegexpMatchingIndicator rmi : indicators) {
if (null == rmi.getRegex()) {
patternNames += System.getProperty("line.separator") + "\"" + rmi.getName() + "\"";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
} else if (rmi.getRegex().equals(rmi.getName())) {
patternNames += System.getProperty("line.separator") + "\"" + rmi.getName() + "\"";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
}
}
if (PluginConstant.EMPTY_STRING != patternNames) {
traceError(Messages.getString("MultiColumnAnalysisExecutor.checkAllMatchIndicatorForDbType", patternNames)); //$NON-NLS-1$
return false;
}
return true;
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.analysis.AnalysisExecutor#evaluate(org.talend.dataquality.analysis.Analysis,
* java.sql.Connection, java.lang.String)
*/
@Override
protected ReturnCode evaluate(Analysis analysis, Connection connection, String sqlStatement) {
// no need to implement
return null;
}
}