// ============================================================================
//
// 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 org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.swt.widgets.Display;
import org.talend.cwm.db.connection.ConnectionUtils;
import org.talend.cwm.helper.TaggedValueHelper;
import org.talend.cwm.management.i18n.Messages;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.analysis.AnalysisType;
import org.talend.dataquality.analysis.ExecutionLanguage;
import org.talend.dataquality.helpers.AnalysisHelper;
import org.talend.dataquality.properties.TDQAnalysisItem;
import org.talend.dq.helper.resourcehelper.AnaResourceFileHelper;
import org.talend.dq.writer.impl.AnalysisWriter;
import org.talend.dq.writer.impl.ElementWriterFactory;
import org.talend.utils.sugars.ReturnCode;
import orgomg.cwm.foundation.softwaredeployment.DataProvider;
/**
* @author scorreia
*
* A class to get the correct executor for a given analysis.
*/
public final class AnalysisExecutorSelector {
private static Logger log = Logger.getLogger(AnalysisExecutorSelector.class);
private AnalysisExecutorSelector() {
}
/**
* Method "getAnalysisExecutor".
*
* @param analysis the analysis to be run by the executor.
* @return the appropriate executor of the analysis or null when no appropriate executor has been found.
*/
public static IAnalysisExecutor getAnalysisExecutor(Analysis analysis) {
assert analysis != null;
AnalysisType analysisType = AnalysisHelper.getAnalysisType(analysis);
if (analysisType == null) {
log.error(Messages.getString("AnalysisExecutorSelector.ANALYSISTYPEISNOTSET", analysis.getName())); //$NON-NLS-1$
return null;
}
ExecutionLanguage executionEngine = AnalysisHelper.getExecutionEngine(analysis);
IAnalysisExecutor exec = null;
switch (analysisType) {
case MULTIPLE_COLUMN:
exec = getModelElementAnalysisExecutor(analysis, executionEngine);
break;
case CONNECTION:
exec = new ConnectionAnalysisExecutor();
break;
case SCHEMA:
exec = new SchemaAnalysisExecutor();
break;
case CATALOG:
exec = new CatalogAnalysisExecutor();
break;
case COLUMNS_COMPARISON:
exec = new RowMatchingAnalysisExecutor();
break;
case COLUMN_CORRELATION:
exec = new MultiColumnAnalysisExecutor();
break;
case COLUMN_SET:
// MOD yyi 2011-02-22 17871:delimitefile
exec = getColumnSetAnalysisExecutor(analysis, executionEngine);
break;
case TABLE:
exec = new TableAnalysisSqlExecutor();
break;
case TABLE_FUNCTIONAL_DEPENDENCY:
exec = new FunctionalDependencyExecutor();
break;
case MATCH_ANALYSIS:
exec = new MatchAnalysisExecutor();
break;
default:
// this should not happen. This executor has not been tested for a long time.
exec = null;
}
return exec;
}
/**
* return Column or TdXMLElement analysis executor. ADD xqliu bug 10238 2009-12-24
*
* @param analysis
* @param executionEngine
* @return
*/
private static AnalysisExecutor getModelElementAnalysisExecutor(Analysis analysis, ExecutionLanguage executionEngine) {
// MOD qiongli 2010-11-9 feature 16796
boolean isDelimitedFile = ConnectionUtils.isDelimitedFileConnection((DataProvider) analysis.getContext().getConnection());
boolean sql = ExecutionLanguage.SQL.equals(executionEngine);
boolean isValid = hasSampleDataValid(analysis);
if (isDelimitedFile) {
if (isValid) {
return new DelimitedFileAnalysisExecutorWithSampleData();
} else {
return new DelimitedFileAnalysisExecutor();
}
} else {
if (isValid) {
return new ColumnAnalysisExecutorWithSampleData();
} else {
return sql ? new ColumnAnalysisSqlExecutor() : new ColumnAnalysisExecutor();
}
}
}
/**
* DOC zshen Comment method "judgeEditorOpenning".
*
* @param analysisItem
* @return
*/
private static boolean hasSampleDataValid(Analysis analysis) {
return TaggedValueHelper.getValueBoolean(TaggedValueHelper.IS_USE_SAMPLE_DATA, analysis);
}
/**
* yyi 2011-02-22 17871:delimitefile.
*
* @param analysis
* @param executionEngine
* @return
*/
private static AnalysisExecutor getColumnSetAnalysisExecutor(Analysis analysis, ExecutionLanguage executionEngine) {
boolean isDelimitedFile = ConnectionUtils.isDelimitedFileConnection((DataProvider) analysis.getContext().getConnection());
boolean sql = ExecutionLanguage.SQL.equals(executionEngine);
boolean isValid = hasSampleDataValid(analysis);
if (isValid) {
return new ColumnSetAnalysisExecutorWithSampleData(false, false);
} else {
return sql ? new MultiColumnAnalysisExecutor() : new ColumnSetAnalysisExecutor(isDelimitedFile, false);
}
}
/**
* Method "executeAnalysis".
*
* @param analysis an analysis to be run
* @return a return code with an error message when the analysis failed to run.
*/
public static ReturnCode executeAnalysis(Analysis analysis) {
return executeAnalysis(analysis, null);
}
public static ReturnCode executeAnalysis(final TDQAnalysisItem analysisItem, final IProgressMonitor monitor) {
IAnalysisExecutor analysisExecutor = getAnalysisExecutor(analysisItem.getAnalysis());
if (analysisExecutor != null) {
// MOD xqliu 2009-02-09 bug 6237
analysisExecutor.setMonitor(monitor);
ReturnCode execute = analysisExecutor.execute(analysisItem.getAnalysis());
// save analysis.
if (Platform.isRunning()) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (monitor != null && !monitor.isCanceled()) {
monitor.subTask(Messages.getString("AnalysisExecutorSelector.SavingAnalysisTask")); //$NON-NLS-1$
AnalysisWriter writer = ElementWriterFactory.getInstance().createAnalysisWrite();
writer.save(analysisItem, Boolean.FALSE);
monitor.worked(10);
}
}
});
}
return execute;
}
// else
return new ReturnCode(Messages.getString(
"AnalysisExecutorSelector.NotFindHowExecute", analysisItem.getAnalysis().getName()), false); //$NON-NLS-1$
}
/**
*
* DOC xqliu Comment method "executeAnalysis".
*
* @param analysis
* @param monitor
* @return
* @deprecated use {@link #executeAnalysis(TDQAnalysisItem, IProgressMonitor)} instead.
*/
@Deprecated
public static ReturnCode executeAnalysis(final Analysis analysis, IProgressMonitor monitor) {
IAnalysisExecutor analysisExecutor = getAnalysisExecutor(analysis);
if (analysisExecutor != null) {
// MOD xqliu 2009-02-09 bug 6237
analysisExecutor.setMonitor(monitor);
ReturnCode execute = analysisExecutor.execute(analysis);
// save analysis.
if (Platform.isRunning()) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
AnaResourceFileHelper.getInstance().save(analysis);
}
});
}
return execute;
}
// else
return new ReturnCode(Messages.getString("AnalysisExecutorSelector.NotFindHowExecute", analysis.getName()), false); //$NON-NLS-1$
}
}