// ============================================================================
//
// 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.events;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.talend.dataprofiler.core.ui.editor.preview.ColumnIndicatorUnit;
import org.talend.dataprofiler.core.ui.editor.preview.IndicatorUnit;
import org.talend.dataprofiler.core.ui.editor.preview.model.dataset.CustomerDefaultBAWDataset;
import org.talend.dataprofiler.core.ui.editor.preview.model.states.SummaryStatisticsState;
import org.talend.dataprofiler.core.ui.utils.TOPChartUtils;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dq.indicators.IndicatorCommonUtil;
import org.talend.dq.nodes.indicator.type.IndicatorEnum;
/**
* For Summary statistics indicators: when select all
*/
public class DynamicBAWChartEventReceiver extends DynamicChartEventReceiver {
private CustomerDefaultBAWDataset bawDataset;
private Object BAWparentComposite = null;
private List<IndicatorUnit> indicators = new ArrayList<IndicatorUnit>();
private DynamicChartEventReceiver IRQIndicatorEvent = null;
private Indicator IRQIndicator = null;
private DynamicChartEventReceiver rangeIndicatorEvent = null;
private Indicator rangeIndicator = null;
Map<IndicatorEnum, Double> summaryValues = new HashMap<IndicatorEnum, Double>();
public DynamicChartEventReceiver createEventReceiver(IndicatorEnum type, Indicator oneIndicator) {
// the receiver for each summary indicator, just need to put the indicator name and its related value into the
// map, and call the method which judge the total
DynamicChartEventReceiver eReceiver = new DynamicChartEventReceiver() {
@Override
public boolean handle(Object value) {
super.handle(value);
addToSummaryMap(getIndicatorType(), value);
if (isIntact()) {
if (this.getTableViewer() != null) {
String str = value == null ? String.valueOf(Double.NaN) : String.valueOf(value);
this.refreshTable(str);
if (isLastIndicator()) {
// when current is last one indicator which Summary statistics indicators then update IQRIndicator and
// RangeIndicator
updateValueOfIRQAndRange();
}
}
} else {
updateValueOfIRQAndRange();
}
return true;
}
};
eReceiver.setIndicatorType(type);
eReceiver.setIndicatorName(oneIndicator.getName());
indicators.add(new ColumnIndicatorUnit(type, oneIndicator, null));
if (IndicatorEnum.IQRIndicatorEnum.equals(type)) {
this.IRQIndicator = oneIndicator;
this.IRQIndicatorEvent = eReceiver;
} else if (IndicatorEnum.RangeIndicatorEnum.equals(type)) {
this.rangeIndicator = oneIndicator;
this.rangeIndicatorEvent = eReceiver;
}
return eReceiver;
}
private void addToSummaryMap(IndicatorEnum indicatorType, Object value) {
Object indValue = value;
if (value == null || "null".equals(value)) { //$NON-NLS-1$
indValue = 0;
}
try {
summaryValues.put(indicatorType, Double.parseDouble(String.valueOf(indValue)));
} catch (NumberFormatException e) {
// nothing to do, when the value is a date, will throw NumberFormatException.
}
refreshChart();
}
private boolean isIntact() {
return indicators.size() == SummaryStatisticsState.FULL_FLAG;
}
@Override
public void refreshChart() {
Map<IndicatorUnit, String> indicators2ValueMap = converIndicatorListToMap();
SummaryStatisticsState state = new SummaryStatisticsState(indicators, indicators2ValueMap);
if (!isLastIndicator()) {
state.setSupportDynamicChart(true);
}
state.setSqltype(Types.DOUBLE);
Object chart = state.getChart();
TOPChartUtils.getInstance().decorateChart(chart, false);
if (BAWparentComposite != null) {
TOPChartUtils.getInstance().refrechChart(BAWparentComposite, chart);
}
EventManager.getInstance().publish(chartComposite, EventEnum.DQ_DYNAMIC_REFRESH_DYNAMIC_CHART, null);
}
/**
* DOC zshen Comment method "copyIndicatorUnit".
*
* @param indicators2
* @return
*/
private Map<IndicatorUnit, String> converIndicatorListToMap() {
Map<IndicatorUnit, String> returnIndicators = new HashMap<IndicatorUnit, String>();
for (IndicatorUnit indUnit : indicators) {
if (summaryValues.containsKey(indUnit.getType())) {
returnIndicators.put(indUnit, indUnit.getValue() == null ? "0.0" : String.valueOf(indUnit.getValue())); //$NON-NLS-1$
} else {
returnIndicators.put(indUnit, "0.0"); //$NON-NLS-1$
}
}
return returnIndicators;
}
/**
* DOC yyin Comment method "updateValueOfIRQAndRange".
*/
private void updateValueOfIRQAndRange() {
if (this.getTableViewer() != null) {
if (IRQIndicator != null) {
Object indicatorValue = IndicatorCommonUtil.getIndicatorValue(IRQIndicator);
String str = indicatorValue == null ? String.valueOf(Double.NaN) : String.valueOf(indicatorValue);
IRQIndicatorEvent.refreshTable(str);
}
if (rangeIndicator != null) {
Object indicatorValue = IndicatorCommonUtil.getIndicatorValue(rangeIndicator);
String str = indicatorValue == null ? String.valueOf(Double.NaN) : String.valueOf(indicatorValue);
rangeIndicatorEvent.refreshTable(str);
}
}
}
@Override
public boolean handle(Object value) {
return true;
}
@Override
public void clearValue() {
if (bawDataset != null && bawDataset.getRowCount() == 7) {
bawDataset.clear();
}
}
public CustomerDefaultBAWDataset getBawDataset() {
return bawDataset;
}
public void setBawDataset(CustomerDefaultBAWDataset bawDataset) {
this.bawDataset = bawDataset;
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.events.DynamicChartEventReceiver#clear()
*/
@Override
public void clear() {
super.clear();
// reset the values
summaryValues.clear();
indicators.clear();
BAWparentComposite = null;
bawDataset = null;
}
/**
* Sets the bAWparentComposite.
*
* @param bAWparentComposite the bAWparentComposite to set
*/
public void setBAWparentComposite(Object bAWparentComposite) {
this.BAWparentComposite = bAWparentComposite;
}
private boolean isLastIndicator() {
return summaryValues.size() == SummaryStatisticsState.FULL_CHART;
}
}