// ============================================================================
//
// 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.editor.analysis;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.metadata.builder.connection.MetadataColumn;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.repositoryObject.MetadataColumnRepositoryObject;
import org.talend.cwm.helper.SwitchHelpers;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataprofiler.core.PluginConstant;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.ui.action.actions.RunAnalysisAction;
import org.talend.dataprofiler.core.ui.chart.jung.JungGraphGenerator;
import org.talend.dataprofiler.core.ui.dialog.ColumnsSelectionDialog;
import org.talend.dataprofiler.core.ui.editor.composite.AnalysisColumnNominalIntervalTreeViewer;
import org.talend.dataprofiler.core.ui.editor.composite.IndicatorsComp;
import org.talend.dataprofiler.core.ui.editor.preview.HideSeriesChartComposite;
import org.talend.dataprofiler.core.ui.pref.EditorPreferencePage;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.analysis.ExecutionLanguage;
import org.talend.dataquality.domain.Domain;
import org.talend.dataquality.exception.DataprofilerCoreException;
import org.talend.dataquality.helpers.MetadataHelper;
import org.talend.dataquality.indicators.CompositeIndicator;
import org.talend.dataquality.indicators.DataminingType;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dataquality.indicators.IndicatorsFactory;
import org.talend.dataquality.indicators.columnset.ColumnSetMultiValueIndicator;
import org.talend.dataquality.indicators.columnset.ColumnsetFactory;
import org.talend.dataquality.indicators.columnset.ColumnsetPackage;
import org.talend.dataquality.indicators.columnset.CountAvgNullIndicator;
import org.talend.dq.analysis.AnalysisHandler;
import org.talend.dq.analysis.ColumnCorrelationAnalysisHandler;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.indicators.definitions.DefinitionHandler;
import org.talend.dq.indicators.graph.GraphBuilder;
import org.talend.dq.nodes.DBColumnRepNode;
import org.talend.dq.nodes.DBConnectionRepNode;
import org.talend.dq.writer.impl.ElementWriterFactory;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryNode;
import org.talend.utils.sql.Java2SqlType;
import org.talend.utils.sugars.ReturnCode;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* @author xzhao
*/
public class CorrelationAnalysisDetailsPage extends AbstractAnalysisMetadataPage implements PropertyChangeListener {
private static Logger log = Logger.getLogger(CorrelationAnalysisDetailsPage.class);
AnalysisColumnNominalIntervalTreeViewer treeViewer;
ColumnCorrelationAnalysisHandler correlationAnalysisHandler;
private ColumnSetMultiValueIndicator columnSetMultiIndicator;
private Composite chartComposite;
private static final int TREE_MAX_LENGTH = 400;
private static final int INDICATORS_SECTION_HEIGHT = 300;
protected Composite[] previewChartCompsites;
private EList<ModelElement> analyzedColumns;
private Section analysisColSection;
private Section previewSection;
private Section indicatorsSection;
private IndicatorsComp indicatorsViewer;
private SashForm sForm;
private Composite previewComp;
public CorrelationAnalysisDetailsPage(FormEditor editor, String id, String title) {
super(editor, id, title);
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#isConnectionSupport(org.talend.
* repository.model.IRepositoryNode)
*/
@Override
protected boolean isConnectionSupport(IRepositoryNode repNode) {
// ADD msjian TDQ-8458 2014-1-24: if the current analysis is correlation analysis, Disable to ability file
// and MDM connenction
if (repNode instanceof DBConnectionRepNode) {
return true;
}
return false;
// TDQ-8458~
}
@Override
public void initialize(FormEditor editor) {
super.initialize(editor);
recomputeIndicators();
}
public void recomputeIndicators() {
correlationAnalysisHandler = new ColumnCorrelationAnalysisHandler();
correlationAnalysisHandler.setAnalysis(getCurrentModelElement());
stringDataFilter = correlationAnalysisHandler.getStringDataFilter();
analyzedColumns = correlationAnalysisHandler.getAnalyzedColumns();
if (correlationAnalysisHandler.getIndicator() == null && columnSetMultiIndicator != null) {
ColumnsetFactory columnsetFactory = ColumnsetFactory.eINSTANCE;
// MOD qiongli 2010-6-18 bug 12766
if (ColumnsetPackage.eINSTANCE.getCountAvgNullIndicator() == columnSetMultiIndicator.eClass()) {
columnSetMultiIndicator = columnsetFactory.createCountAvgNullIndicator();
// MOD xqliu 2010-04-06 bug 12161
fillSimpleIndicators(columnSetMultiIndicator);
// ~12161
}
if (ColumnsetPackage.eINSTANCE.getMinMaxDateIndicator() == columnSetMultiIndicator.eClass()) {
columnSetMultiIndicator = columnsetFactory.createMinMaxDateIndicator();
}
if (ColumnsetPackage.eINSTANCE.getWeakCorrelationIndicator() == columnSetMultiIndicator.eClass()) {
columnSetMultiIndicator = columnsetFactory.createWeakCorrelationIndicator();
}
} else {
columnSetMultiIndicator = (ColumnSetMultiValueIndicator) correlationAnalysisHandler.getIndicator();
}
if (columnSetMultiIndicator == null) {
columnSetMultiIndicator = ColumnsetFactory.eINSTANCE.createCountAvgNullIndicator();
}
initializeIndicator(columnSetMultiIndicator);
columnSetMultiIndicator.setStoreData(true);
for (ModelElement element : analyzedColumns) {
TdColumn tdColumn = SwitchHelpers.COLUMN_SWITCH.doSwitch(element);
if (tdColumn == null) {
continue;
}
// currentColumnIndicator = new ColumnIndicator(tdColumn);
DataminingType dataminingType = correlationAnalysisHandler.getDatamingType(tdColumn);
MetadataHelper.setDataminingType(dataminingType == null ? DataminingType.NOMINAL : dataminingType, tdColumn);
}
}
/**
* DOC xqliu Comment method "fillSimpleIndicators". ADD xqliu 2010-04-06 bug 12161
*
* @param countAvgNullIndicator
*/
private void fillSimpleIndicators(ColumnSetMultiValueIndicator countAvgNullIndicator) {
countAvgNullIndicator.setRowCountIndicator(IndicatorsFactory.eINSTANCE.createRowCountIndicator());
countAvgNullIndicator.setDistinctCountIndicator(IndicatorsFactory.eINSTANCE.createDistinctCountIndicator());
countAvgNullIndicator.setDuplicateCountIndicator(IndicatorsFactory.eINSTANCE.createDuplicateCountIndicator());
countAvgNullIndicator.setUniqueCountIndicator(IndicatorsFactory.eINSTANCE.createUniqueCountIndicator());
}
private void initializeIndicator(Indicator indicator) {
if (indicator.getIndicatorDefinition() == null) {
DefinitionHandler.getInstance().setDefaultIndicatorDefinition(indicator);
}
// MOD xqliu 2010-04-06 bug 12161
if (indicator instanceof CountAvgNullIndicator) {
if (((CountAvgNullIndicator) indicator).getChildIndicators().size() == 0) {
CountAvgNullIndicator countAvgNullIndicator = (CountAvgNullIndicator) indicator;
fillSimpleIndicators(countAvgNullIndicator);
}
for (Indicator child : ((CompositeIndicator) indicator).getChildIndicators()) {
initializeIndicator(child); // recurse
}
} else if (indicator instanceof CompositeIndicator) {
// MOD qiongli 2012-5-14 TDQ-5256 should initialize children
for (Indicator child : ((CompositeIndicator) indicator).getChildIndicators()) {
initializeIndicator(child);
}
}
}
@Override
protected void createFormContent(IManagedForm managedForm) {
this.form = managedForm.getForm();
Composite body = form.getBody();
body.setLayout(new GridLayout());
sForm = new SashForm(body, SWT.NULL);
sForm.setLayoutData(new GridData(GridData.FILL_BOTH));
topComp = toolkit.createComposite(sForm);
topComp.setLayoutData(new GridData(GridData.FILL_BOTH));
topComp.setLayout(new GridLayout());
setMetadataSectionTitle(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.analysisMeta")); //$NON-NLS-1$
setMetadataSectionDescription(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.setPropOfAnalysis")); //$NON-NLS-1$
metadataSection = creatMetadataSection(form, topComp);
// set title of form.
if (ColumnsetPackage.eINSTANCE.getCountAvgNullIndicator() == columnSetMultiIndicator.eClass()) {
form.setText(DefaultMessagesImpl
.getString("ColumnCorrelationNominalAndIntervalMasterPage.CorrelationAnalysisInterval")); //$NON-NLS-1$
}
if (ColumnsetPackage.eINSTANCE.getMinMaxDateIndicator() == columnSetMultiIndicator.eClass()) {
form.setText(DefaultMessagesImpl.getString("ColumnCorrelationNominalAndIntervalMasterPage.CorrelationAnalysisDate")); //$NON-NLS-1$
}
if (ColumnsetPackage.eINSTANCE.getWeakCorrelationIndicator() == columnSetMultiIndicator.eClass()) {
form.setText(DefaultMessagesImpl.getString("ColumnCorrelationNominalAndIntervalMasterPage.NominalCorrelation")); //$NON-NLS-1$
}
createAnalysisColumnsSection(form, topComp);
createIndicatorsSection(form, topComp);
createDataFilterSection(form, topComp);
dataFilterComp.addPropertyChangeListener(this);
createAnalysisParamSection(form, topComp);
createContextGroupSection(form, topComp);
// createAnalysisParamSection(form, topComp);
if (!EditorPreferencePage.isHideGraphicsSectionForSettingsPage()) {
previewComp = toolkit.createComposite(sForm);
previewComp.setLayoutData(new GridData(GridData.FILL_BOTH));
previewComp.setLayout(new GridLayout());
// add by hcheng for 0007290: Chart cannot auto compute it's size in
// DQRule analsyis Editor
previewComp.addControlListener(new ControlAdapter() {
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.ControlAdapter#controlResized(org.eclipse .swt.events.ControlEvent)
*/
@Override
public void controlResized(ControlEvent e) {
super.controlResized(e);
sForm.redraw();
form.reflow(true);
}
});
// ~
createPreviewSection(form, previewComp);
}
}
void createAnalysisColumnsSection(final ScrolledForm form, Composite anasisDataComp) {
analysisColSection = createSection(form, anasisDataComp,
DefaultMessagesImpl.getString("ColumnMasterDetailsPage.analyzeColumn"), null); //$NON-NLS-1$
Composite topComp = toolkit.createComposite(analysisColSection);
topComp.setLayout(new GridLayout());
// ~ MOD mzhao 2009-05-05,Bug 6587.
createConnBindWidget(topComp);
// ~
Button clmnBtn = toolkit.createButton(topComp, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.selectColumnBtn"), //$NON-NLS-1$
SWT.NONE);
clmnBtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
openColumnsSelectionDialog();
}
});
Composite tree = toolkit.createComposite(topComp, SWT.NONE);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(tree);
tree.setLayout(new GridLayout());
((GridData) tree.getLayoutData()).heightHint = TREE_MAX_LENGTH;
// TDQ-11622: msjian make the icons have a transparent background
tree.setBackgroundMode(SWT.INHERIT_DEFAULT);
treeViewer = new AnalysisColumnNominalIntervalTreeViewer(tree, this);
treeViewer.addPropertyChangeListener(this);
treeViewer.setInput(analyzedColumns.toArray());
treeViewer.setDirty(false);
analysisColSection.setClient(topComp);
}
@Override
public void openColumnsSelectionDialog() {
List<RepositoryNode> columnList = treeViewer.getColumnSetMultiValueList();
if (columnList == null) {
columnList = new ArrayList<RepositoryNode>();
}
RepositoryNode connNode = getConnComboSelectNode();
ColumnsSelectionDialog dialog = new ColumnsSelectionDialog(
this,
/* getEditor().getActiveEditor().getSite().getShell() */null,
DefaultMessagesImpl.getString("ColumnMasterDetailsPage.columnSelection"), columnList, connNode, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.columnSelections")); //$NON-NLS-1$ //$NON-NLS-2$
if (dialog.open() == Window.OK) {
Object[] columns = dialog.getResult();
treeViewer.setInput(columns);
return;
}
}
void createPreviewSection(final ScrolledForm form, Composite parent) {
previewSection = createSection(
form,
parent,
DefaultMessagesImpl.getString("ColumnMasterDetailsPage.graphics"), DefaultMessagesImpl.getString("ColumnMasterDetailsPage.space")); //$NON-NLS-1$ //$NON-NLS-2$
previewSection.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite sectionClient = toolkit.createComposite(previewSection);
sectionClient.setLayout(new GridLayout());
sectionClient.setLayoutData(new GridData(GridData.FILL_BOTH));
Button chartButton = new Button(sectionClient, SWT.NONE);
chartButton.setText(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.refreshGraphics")); //$NON-NLS-1$
final Label message = toolkit.createLabel(sectionClient,
DefaultMessagesImpl.getString("ColumnMasterDetailsPage.spaceWhite")); //$NON-NLS-1$
message.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED));
message.setVisible(false);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).applyTo(sectionClient);
chartComposite = toolkit.createComposite(sectionClient);
chartComposite.setLayout(new GridLayout());
chartComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
final Analysis analysis = correlationAnalysisHandler.getAnalysis();
chartButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
for (Control control : chartComposite.getChildren()) {
control.dispose();
}
boolean analysisStatue = analysis.getResults().getResultMetadata() != null
&& analysis.getResults().getResultMetadata().getExecutionDate() != null;
if (!analysisStatue) {
boolean returnCode = MessageDialog.openConfirm(null,
DefaultMessagesImpl.getString("ColumnMasterDetailsPage.ViewResult"), //$NON-NLS-1$
DefaultMessagesImpl.getString("ColumnMasterDetailsPage.RunOrSeeSampleData")); //$NON-NLS-1$
if (returnCode) {
new RunAnalysisAction().run();
message.setVisible(false);
} else {
createPreviewCharts(form, chartComposite, false);
message.setText(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.warning")); //$NON-NLS-1$
message.setVisible(true);
}
} else {
createPreviewCharts(form, chartComposite, true);
}
chartComposite.layout();
form.reflow(true);
}
});
previewSection.setClient(sectionClient);
}
public void createPreviewCharts(final ScrolledForm form, final Composite composite, final boolean isCreate) {
List<Composite> previewChartList = new ArrayList<Composite>();
if (ColumnsetPackage.eINSTANCE.getWeakCorrelationIndicator() == columnSetMultiIndicator.eClass()) {
GraphBuilder gBuilder = new GraphBuilder();
gBuilder.setTotalWeight(columnSetMultiIndicator.getCount());
List<Object[]> listRows = columnSetMultiIndicator.getListRows();
// MOD msjian TDQ-4781 2012-6-8: make sure exist data
if (listRows != null && listRows.size() > 0) {
// TDQ-4781~
JungGraphGenerator generator = new JungGraphGenerator(gBuilder, listRows);
// MOD yyi 2009-09-09 feature 8834
generator.generate(composite, false, true);
}
} else {
List<ModelElement> numericOrDateList = new ArrayList<ModelElement>();
if (ColumnsetPackage.eINSTANCE.getCountAvgNullIndicator() == columnSetMultiIndicator.eClass()) {
numericOrDateList = columnSetMultiIndicator.getNumericColumns();
}
if (ColumnsetPackage.eINSTANCE.getMinMaxDateIndicator() == columnSetMultiIndicator.eClass()) {
numericOrDateList = columnSetMultiIndicator.getDateColumns();
}
for (ModelElement column : numericOrDateList) {
final MetadataColumn tdColumn = (MetadataColumn) column;
ExpandableComposite exComp = toolkit.createExpandableComposite(composite, ExpandableComposite.TREE_NODE
| ExpandableComposite.CLIENT_INDENT);
exComp.setText(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.column", tdColumn.getName())); //$NON-NLS-1$
exComp.setLayout(new GridLayout());
exComp.setData(columnSetMultiIndicator);
previewChartList.add(exComp);
final Composite comp = toolkit.createComposite(exComp);
comp.setLayout(new GridLayout());
comp.setLayoutData(new GridData(GridData.FILL_BOTH));
if (tdColumn != null) {
IRunnableWithProgress rwp = new IRunnableWithProgress() {
public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
monitor.beginTask(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.createPreview", //$NON-NLS-1$
tdColumn.getName()), IProgressMonitor.UNKNOWN);
Display.getDefault().asyncExec(new Runnable() {
public void run() {
new HideSeriesChartComposite(comp, getCurrentModelElement(), columnSetMultiIndicator,
tdColumn, false);
}
});
monitor.done();
}
};
try {
new ProgressMonitorDialog(getSite().getShell()).run(true, false, rwp);
} catch (Exception ex) {
log.error(ex, ex);
}
}
exComp.addExpansionListener(new ExpansionAdapter() {
@Override
public void expansionStateChanged(ExpansionEvent e) {
getChartComposite().layout();
form.reflow(true);
}
});
exComp.setExpanded(true);
exComp.setClient(comp);
}
}
if (!previewChartList.isEmpty()) {
this.previewChartCompsites = previewChartList.toArray(new Composite[previewChartList.size()]);
}
}
@Override
public void refreshGraphicsInSettingsPage() {
if (EditorPreferencePage.isHideGraphicsSectionForSettingsPage()) {
if (sForm.getChildren().length > 1) {
if (null != sForm.getChildren()[1] && !sForm.getChildren()[1].isDisposed()) {
sForm.getChildren()[1].dispose();
}
topComp.getParent().layout();
topComp.layout();
}
} else {
if (chartComposite != null && !chartComposite.isDisposed()) {
try {
for (Control control : chartComposite.getChildren()) {
control.dispose();
}
createPreviewCharts(form, chartComposite, true);
chartComposite.getParent().layout();
chartComposite.layout();
} catch (Exception ex) {
log.error(ex, ex);
}
} else {
previewComp = toolkit.createComposite(sForm);
previewComp.setLayoutData(new GridData(GridData.FILL_BOTH));
previewComp.setLayout(new GridLayout());
previewComp.addControlListener(new ControlAdapter() {
@Override
public void controlResized(ControlEvent e) {
super.controlResized(e);
sForm.redraw();
form.reflow(true);
}
});
createPreviewSection(form, previewComp);
createPreviewCharts(form, chartComposite, true);
}
}
}
/**
* DOC yyi Comment method "createIndicatorsSection".
*
* @param topComp
* @param form
*/
private void createIndicatorsSection(ScrolledForm form, Composite topComp) {
indicatorsSection = createSection(form, topComp, "Indicators", null); //$NON-NLS-1$
Composite indicatorsComp = toolkit.createComposite(indicatorsSection, SWT.NONE);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(indicatorsComp);
indicatorsComp.setLayout(new GridLayout());
((GridData) indicatorsComp.getLayoutData()).heightHint = INDICATORS_SECTION_HEIGHT;
indicatorsViewer = new IndicatorsComp(indicatorsComp, this);
indicatorsViewer.setDirty(false);
indicatorsViewer.addPropertyChangeListener(this);
indicatorsViewer.setInput(columnSetMultiIndicator);
indicatorsSection.setClient(indicatorsComp);
}
/**
* @param outputFolder
* @throws DataprofilerCoreException
*/
@Override
public void saveAnalysis() throws DataprofilerCoreException {
for (Domain domain : getCurrentModelElement().getParameters().getDataFilter()) {
domain.setName(getCurrentModelElement().getName());
}
IRepositoryViewObject reposObject = null;
Connection tdProvider = null;
correlationAnalysisHandler.clearAnalysis();
columnSetMultiIndicator.getAnalyzedColumns().clear();
// set execute engine
Analysis analysis = correlationAnalysisHandler.getAnalysis();
analysis.getParameters().setExecutionLanguage(ExecutionLanguage.get(execLang));
// set data filter
correlationAnalysisHandler.setStringDataFilter(dataFilterComp.getDataFilterString());
// save analysis
List<RepositoryNode> repositoryNodeList = treeViewer.getColumnSetMultiValueList();
if (repositoryNodeList != null && !repositoryNodeList.isEmpty()) {
reposObject = repositoryNodeList.get(0).getObject();
tdProvider = ((ConnectionItem) reposObject.getProperty().getItem()).getConnection();
analysis.getContext().setConnection(tdProvider);
List<TdColumn> columnLst = new ArrayList<TdColumn>();
for (RepositoryNode repNode : repositoryNodeList) {
columnLst.add((TdColumn) ((MetadataColumnRepositoryObject) repNode.getObject()).getTdColumn());
}
columnSetMultiIndicator.getAnalyzedColumns().addAll(columnLst);
correlationAnalysisHandler.addIndicator(columnLst, columnSetMultiIndicator);
} else {
analysis.getContext().setConnection(null);
// MOD by zshen for bug 12042.
ColumnsetFactory columnsetFactory = ColumnsetFactory.eINSTANCE;
ColumnSetMultiValueIndicator columnSetMultiValueIndicator = null;
if (ColumnsetPackage.eINSTANCE.getCountAvgNullIndicator() == columnSetMultiIndicator.eClass()) {
columnSetMultiValueIndicator = columnsetFactory.createCountAvgNullIndicator();
}
if (ColumnsetPackage.eINSTANCE.getMinMaxDateIndicator() == columnSetMultiIndicator.eClass()) {
columnSetMultiValueIndicator = columnsetFactory.createMinMaxDateIndicator();
}
if (ColumnsetPackage.eINSTANCE.getWeakCorrelationIndicator() == columnSetMultiIndicator.eClass()) {
columnSetMultiValueIndicator = columnsetFactory.createWeakCorrelationIndicator();
}
fillSimpleIndicators(columnSetMultiValueIndicator);
analysis.getResults().getIndicators().add(columnSetMultiValueIndicator);
// ~12042
}
// save the number of connections per analysis
this.saveNumberOfConnectionsPerAnalysis();
// 2011.1.12 MOD by zhsne to unify anlysis and connection id when saving.
this.nameText.setText(analysis.getName());
// ~
// MOD yyi 2012-02-08 TDQ-4621:Explicitly set true for updating dependencies.
ReturnCode saved = ElementWriterFactory.getInstance().createAnalysisWrite()
.save(getCurrentRepNode().getObject().getProperty().getItem(), true);
// MOD yyi 2012-02-03 TDQ-3602:Avoid to rewriting all analyzes after saving, no reason to update all analyzes
// which is depended in the referred connection.
// Extract saving log function.
// @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#logSaved(ReturnCode)
logSaved(saved);
treeViewer.setDirty(false);
dataFilterComp.setDirty(false);
}
public void propertyChange(PropertyChangeEvent evt) {
if (PluginConstant.ISDIRTY_PROPERTY.equals(evt.getPropertyName())) {
((AnalysisEditor) this.getEditor()).firePropertyChange(IEditorPart.PROP_DIRTY);
} else if (PluginConstant.DATAFILTER_PROPERTY.equals(evt.getPropertyName())) {
this.correlationAnalysisHandler.setStringDataFilter((String) evt.getNewValue());
}
}
@Override
public boolean isDirty() {
return super.isDirty() || (treeViewer != null && treeViewer.isDirty())
|| (dataFilterComp != null && dataFilterComp.isDirty());
}
@Override
public void dispose() {
super.dispose();
if (this.treeViewer != null) {
this.treeViewer.removePropertyChangeListener(this);
}
if (dataFilterComp != null) {
this.dataFilterComp.removePropertyChangeListener(this);
}
}
/**
* Getter for treeViewer.
*
* @return the treeViewer
*/
@Override
public AnalysisColumnNominalIntervalTreeViewer getTreeViewer() {
return this.treeViewer;
}
public ColumnSetMultiValueIndicator getColumnSetMultiValueIndicator() {
return columnSetMultiIndicator;
}
public Composite[] getPreviewChartCompsites() {
// ADD msjian TDQ-6213 2012-12-18: filter the disposed composite
if (previewChartCompsites != null && previewChartCompsites.length > 0) {
List<Composite> withOutDisposed = new ArrayList<Composite>();
for (Composite com : previewChartCompsites) {
if (!com.isDisposed()) {
withOutDisposed.add(com);
}
}
this.previewChartCompsites = withOutDisposed.toArray(new ExpandableComposite[withOutDisposed.size()]);
}
// TDQ-6213~
return previewChartCompsites;
}
@Override
public Composite getChartComposite() {
return chartComposite;
}
@Override
public ReturnCode canSave() {
// MOD by gdbu 2011-3-21 bug 19179
ReturnCode canModRetCode = super.canSave();
if (!canModRetCode.isOk()) {
return canModRetCode;
}
// ~19179
String message = null;
List<RepositoryNode> columnSetMultiValueList = getTreeViewer().getColumnSetMultiValueList();
if (!columnSetMultiValueList.isEmpty()) {
// MOD qiongli 2010-8-19.bug 14436.move some codes to the method of 'canDrop()', which judge to come
// from same table
List<RepositoryNode> nodes = treeViewer.getColumnSetMultiValueList();
if (ColumnsetPackage.eINSTANCE.getCountAvgNullIndicator() == columnSetMultiIndicator.eClass()
|| ColumnsetPackage.eINSTANCE.getMinMaxDateIndicator() == columnSetMultiIndicator.eClass()) {
message = verifyColumn(nodes, columnSetMultiIndicator.eClass());
} else if (ColumnsetPackage.eINSTANCE.getWeakCorrelationIndicator() == columnSetMultiIndicator.eClass()) {
List<DBColumnRepNode> columnNodes = RepositoryNodeHelper.getColumnNodeList(nodes.toArray());
for (DBColumnRepNode columNode : columnNodes) {
TdColumn tdColumn = columNode.getTdColumn();
if (correlationAnalysisHandler.getDatamingType(tdColumn) != DataminingType.NOMINAL) {
message = DefaultMessagesImpl.getString("ColumnCorrelationNominalAndIntervalMasterPage.NotAllNominal"); //$NON-NLS-1$
break;
}
}
}
}
if (message == null) {
return new ReturnCode(true);
}
return new ReturnCode(message, false);
}
/**
*
* DOC hcheng Comment method "verifyColumn". For 7513,Condition striction when save the correlation analysis.
*
* @param columns
* @param className
* @return
*/
private String verifyColumn(List<RepositoryNode> columns, EClass className) {
List<TdColumn> invalidCols = new ArrayList<TdColumn>();
List<TdColumn> nominalCols = new ArrayList<TdColumn>();
List<TdColumn> intervalCols = new ArrayList<TdColumn>();
String message = null;
for (int i = 0; i < columns.size(); i++) {
RepositoryNode tdColumnNode = columns.get(i);
TdColumn tdColumn = (TdColumn) ((MetadataColumnRepositoryObject) tdColumnNode.getObject()).getTdColumn();
if (className == ColumnsetPackage.eINSTANCE.getCountAvgNullIndicator()) {
if (Java2SqlType.isDateInSQL(tdColumn.getSqlDataType().getJavaDataType())) {
invalidCols.add(tdColumn);
break;
}
} else if (className == ColumnsetPackage.eINSTANCE.getMinMaxDateIndicator()) {
if (Java2SqlType.isNumbericInSQL(tdColumn.getSqlDataType().getJavaDataType())) {
invalidCols.add(tdColumn);
break;
}
}
if (correlationAnalysisHandler.getDatamingType(tdColumn) == DataminingType.NOMINAL) {
nominalCols.add(tdColumn);
}
if (correlationAnalysisHandler.getDatamingType(tdColumn) == DataminingType.INTERVAL) {
intervalCols.add(tdColumn);
}
}
if (invalidCols.size() > 0) {
if (className == ColumnsetPackage.eINSTANCE.getCountAvgNullIndicator()) {
message = DefaultMessagesImpl.getString("ColumnCorrelationNominalAndIntervalMasterPage.ColumnNotUsed"); //$NON-NLS-1$
} else if (className == ColumnsetPackage.eINSTANCE.getMinMaxDateIndicator()) {
message = DefaultMessagesImpl.getString("ColumnCorrelationNominalAndIntervalMasterPage.NumbericColumn"); //$NON-NLS-1$
}
} else if (nominalCols.size() == 0 || intervalCols.size() == 0) {
message = DefaultMessagesImpl.getString("ColumnCorrelationNominalAndIntervalMasterPage.HaveIntervalAndNominal"); //$NON-NLS-1$
}
return message;
}
@Override
protected ReturnCode canRun() {
List<RepositoryNode> columnSetMultiValueList = getTreeViewer().getColumnSetMultiValueList();
if (columnSetMultiValueList.isEmpty()) {
return new ReturnCode(
DefaultMessagesImpl.getString("ColumnCorrelationNominalAndIntervalMasterPage.NoColumnsAssigned"), false); //$NON-NLS-1$
}
return new ReturnCode(true);
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#getConnectionsWithoutDeleted()
*/
@Override
protected List<IRepositoryNode> getConnectionsWithoutDeleted() {
return RepositoryNodeHelper.getConnectionRepositoryNodes(false, false);
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#getAnalysisHandler()
*/
@Override
public AnalysisHandler getAnalysisHandler() {
return correlationAnalysisHandler;
}
}