// ============================================================================
//
// 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.dataprofiler.core.ui.action.actions;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFolder;
import org.eclipse.jface.action.Action;
import org.talend.commons.utils.VersionUtils;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.cwm.dependencies.DependenciesHandler;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataprofiler.core.CorePlugin;
import org.talend.dataprofiler.core.ui.editor.analysis.AnalysisEditor;
import org.talend.dataprofiler.core.ui.editor.analysis.AnalysisItemEditorInput;
import org.talend.dataprofiler.core.ui.utils.MessageUI;
import org.talend.dataprofiler.core.ui.utils.WorkbenchUtils;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.analysis.AnalysisType;
import org.talend.dataquality.analysis.ExecutionLanguage;
import org.talend.dataquality.domain.Domain;
import org.talend.dataquality.helpers.MetadataHelper;
import org.talend.dataquality.indicators.DuplicateCountIndicator;
import org.talend.dataquality.indicators.IndicatorsFactory;
import org.talend.dataquality.indicators.RowCountIndicator;
import org.talend.dq.analysis.AnalysisBuilder;
import org.talend.dq.analysis.parameters.AnalysisParameter;
import org.talend.dq.helper.PropertyHelper;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.indicators.definitions.DefinitionHandler;
import org.talend.dq.nodes.AnalysisRepNode;
import org.talend.dq.writer.impl.AnalysisWriter;
import org.talend.dq.writer.impl.ElementWriterFactory;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryNode;
import org.talend.resource.EResourceConstant;
import org.talend.utils.sugars.ReturnCode;
import org.talend.utils.sugars.TypedReturnCode;
import orgomg.cwm.resource.relational.ColumnSet;
/**
* Create an Analysis which analyze duplicates.
*/
public class CreateDuplicatesAnalysisAction extends Action {
private Map<ColumnSet, List<TdColumn>> columnsMap;
public Map<ColumnSet, List<TdColumn>> getColumnsMap() {
return this.columnsMap;
}
public void setColumnsMap(Map<ColumnSet, List<TdColumn>> columnsMap) {
this.columnsMap = columnsMap;
}
private Connection connection;
public Connection getConnection() {
return this.connection;
}
public void setConnection(Connection connection) {
this.connection = connection;
}
/**
* DOC xqliu CreateDuplicatesAnalysisAction constructor comment.
*
* @param columnsMap
*/
public CreateDuplicatesAnalysisAction(Map<ColumnSet, List<TdColumn>> columnsMap) {
this.setColumnsMap(columnsMap);
if (columnsMap != null && !columnsMap.isEmpty()) {
this.setConnection(ConnectionHelper.getConnection(columnsMap.keySet().iterator().next()));
}
}
@Override
public void run() {
ReturnCode success = new ReturnCode(true);
if (this.getColumnsMap() == null || this.getColumnsMap().isEmpty() || this.getConnection() == null) {
return;
}
try {
Set<ColumnSet> keySet = this.getColumnsMap().keySet();
for (ColumnSet cs : keySet) {
List<TdColumn> columns = this.getColumnsMap().get(cs);
// create the analysis
Analysis analysis = null;
AnalysisBuilder analysisBuilder = new AnalysisBuilder();
boolean analysisInitialized = analysisBuilder.initializeAnalysis(getAnalysisName(cs),
AnalysisType.MULTIPLE_COLUMN);
if (analysisInitialized) {
analysis = analysisBuilder.getAnalysis();
}
fillMetadataToAnalysis(analysis, createDefaultAnalysisParameter(cs));
// add Connection into the Analysis Context
analysis.getContext().setConnection(this.getConnection());
for (TdColumn theColumn : columns) {
// add TdColumn into the Analysis Context
analysis.getContext().getAnalysedElements().add(theColumn);
// create Row Count Indicator
RowCountIndicator rcIndicator = IndicatorsFactory.eINSTANCE.createRowCountIndicator();
rcIndicator.setAnalyzedElement(theColumn);
DefinitionHandler.getInstance().setDefaultIndicatorDefinition(rcIndicator);
analysis.getResults().getIndicators().add(rcIndicator);
// create Duplicate Count Indicator
DuplicateCountIndicator dcIndicator = IndicatorsFactory.eINSTANCE.createDuplicateCountIndicator();
dcIndicator.setAnalyzedElement(theColumn);
DefinitionHandler.getInstance().setDefaultIndicatorDefinition(dcIndicator);
analysis.getResults().getIndicators().add(dcIndicator);
}
// create dependencies
DependenciesHandler.getInstance().setDependencyOn(analysis, this.getConnection());
// set the domain
for (Domain domain : analysis.getParameters().getDataFilter()) {
domain.setName(analysis.getName());
}
// set execution language
analysis.getParameters().setExecutionLanguage(ExecutionLanguage.SQL);
// save the analysis
RepositoryNode analysisRepNode = (RepositoryNode) RepositoryNodeHelper
.getDataProfilingFolderNode(EResourceConstant.ANALYSIS);
IFolder folder = WorkbenchUtils.getFolder(analysisRepNode);
AnalysisWriter analysisWriter = ElementWriterFactory.getInstance().createAnalysisWrite();
TypedReturnCode<Object> create = analysisWriter.create(analysis, folder);
if (create.isOk()) {
// refresh the RepositoryView
CorePlugin.getDefault().refreshDQView(analysisRepNode);
// open the editor
AnalysisRepNode anaRepNode = RepositoryNodeHelper.recursiveFindAnalysis(analysis);
AnalysisItemEditorInput analysisEditorInput = new AnalysisItemEditorInput(anaRepNode);
IRepositoryNode connectionRepNode = RepositoryNodeHelper.recursiveFind(this.getConnection());
analysisEditorInput.setConnectionNode(connectionRepNode);
CorePlugin.getDefault().openEditor(analysisEditorInput, AnalysisEditor.class.getName());
} else {
success.setOk(false);
success.setMessage(create.getMessage());
}
} // for
} catch (Exception e) {
success.setOk(false);
success.setMessage(e.getMessage());
}
if (!success.isOk()) {
MessageUI.openError(success.getMessage());
}
}
/**
* DOC xqliu Comment method "getAnalysisName".
*
* @param columnSet
* @return
*/
private String getAnalysisName(ColumnSet columnSet) {
String anaName = "AnalyzeDuplicatesOn_"; //$NON-NLS-1$
anaName = anaName.concat(columnSet.getName());
SimpleDateFormat sf = new SimpleDateFormat("_yyyyMMddHHmmss"); //$NON-NLS-1$
anaName = anaName.concat(sf.format(new Date()));
// check the new Analysis Name
String finalAnaName = anaName;
int i = 1;
while (PropertyHelper.existDuplicateName(finalAnaName, null, ERepositoryObjectType.TDQ_ANALYSIS_ELEMENT)) {
finalAnaName = anaName + i;
i++;
}
return finalAnaName;
}
/**
* DOC xqliu Comment method "fillMetadataToAnalysis".
*
* @param analysis
* @param anaParam
*/
private void fillMetadataToAnalysis(Analysis analysis, AnalysisParameter anaParam) {
MetadataHelper.setDevStatus(analysis, anaParam.getStatus());
MetadataHelper.setAuthor(analysis, anaParam.getAuthor());
MetadataHelper.setPurpose(anaParam.getPurpose(), analysis);
MetadataHelper.setDescription(anaParam.getDescription(), analysis);
MetadataHelper.setVersion(anaParam.getVersion(), analysis);
}
/**
* DOC xqliu Comment method "createDefaultAnalysisParameter".
*
* @param columnSet
* @return
*/
private AnalysisParameter createDefaultAnalysisParameter(ColumnSet columnSet) {
AnalysisParameter result = new AnalysisParameter();
result.setStatus("development"); //$NON-NLS-1$
result.setAuthor(ProjectManager.getInstance().getCurrentProject().getAuthor().getLogin());
result.setPurpose(""); //$NON-NLS-1$
result.setDescription("Analysis the duplicated columns on the table " + columnSet.getName()); //$NON-NLS-1$
result.setVersion(VersionUtils.DEFAULT_VERSION);
return result;
}
}