// ============================================================================ // // 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.preview.model.states; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.talend.dataprofiler.common.ui.editor.preview.CustomerDefaultCategoryDataset; import org.talend.dataprofiler.common.ui.editor.preview.ICustomerDataset; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.model.TableIndicator; import org.talend.dataprofiler.core.ui.editor.preview.TableIndicatorUnit; import org.talend.dataprofiler.core.ui.editor.preview.model.dataset.CustomerXYSeriesCollection; import org.talend.dataprofiler.core.ui.editor.preview.model.states.utils.CommonStateUtil; import org.talend.dataprofiler.core.ui.editor.preview.model.states.utils.WhereRuleStatisticsStateUtil; import org.talend.dataprofiler.core.ui.pref.EditorPreferencePage; import org.talend.dataprofiler.core.ui.utils.TOPChartUtils; import org.talend.dataquality.indicators.Indicator; import org.talend.dq.analysis.explore.DataExplorer; import org.talend.dq.indicators.preview.table.ChartDataEntity; import org.talend.dq.indicators.preview.table.WhereRuleChartDataEntity; import org.talend.dq.nodes.indicator.type.IndicatorEnum; import org.talend.utils.format.StringFormatUtil; /** * DOC xqliu class global comment. Detailled comment */ public class WhereRuleStatisticsStateTable extends AbstractChartTypeStatesTable { public static final String ROW_KEY_PASS = DefaultMessagesImpl.getString("WhereRuleStatisticsStateTable.match"); //$NON-NLS-1$ public static final String ROW_KEY_NOT_PASS = DefaultMessagesImpl.getString("WhereRuleStatisticsStateTable.notMatch"); //$NON-NLS-1$ private TableIndicator tableIndicator; private Long rowCount; public TableIndicator getTableIndicator() { return tableIndicator; } public Long getRowCount() { return rowCount; } public WhereRuleStatisticsStateTable(List<TableIndicatorUnit> units, TableIndicator tableIndicator) { super(units); this.tableIndicator = tableIndicator; this.rowCount = WhereRuleStatisticsStateUtil.initRowCount(tableIndicator); } @Override public Object getChart() { List<Object> chartList = getChartList(); if (chartList != null && chartList.size() > 0) { return chartList.get(0); } return null; } public ICustomerDataset getCustomerDataset() { // MOD xqliu 2010-03-10 feature 10834 CustomerDefaultCategoryDataset customerDataset = new CustomerDefaultCategoryDataset(); for (TableIndicatorUnit unit : units) { addDataEntity2CustomerDataset(customerDataset, unit); } return customerDataset; // ~10834 } /** * DOC xqliu Comment method "getCustomerDatasetRownCount". * * @return */ public ICustomerDataset getCustomerDatasetRownCount() { CustomerDefaultCategoryDataset customerDataset = new CustomerDefaultCategoryDataset(); TableIndicatorUnit rownCountUnit = getRownCountUnit(units); if (rownCountUnit != null) { addRownCountDataEntity2CustomerDataset(customerDataset, rownCountUnit); } return customerDataset; } @Override public ICustomerDataset getCustomerXYDataset() { Map<Integer, Double> valueMap = new HashMap<Integer, Double>(); int x = 0; for (TableIndicatorUnit unit : units) { x++; double y = 100 * (1 - (Double.parseDouble(unit.getValue().toString()) / getRowCount())); valueMap.put(x, y); } final CustomerXYSeriesCollection dataset = new CustomerXYSeriesCollection(valueMap); return dataset; } public DataExplorer getDataExplorer() { return WhereRuleStatisticsStateUtil.getDataExplorer(); } public Object getExampleChart() { return null; } public String getReferenceLink() { return null; } private List<Object> tempDatasets; // better call this after getChartList() public List<Object> getTempDatasetList() { return tempDatasets; } @Override public List<Object> getChartList() { // MOD xqliu 2010-03-17 feature 10834 tempDatasets = getOptimizeShowDataset(); return getChartList(tempDatasets); } /** * DOC xqliu Comment method "getOptimizeShowDataset". ADD xqliu 2010-03-10 feature 10834 * * @return */ private List<Object> getOptimizeShowDataset() { List<Object> result = new ArrayList<Object>(); // get the page size int size = getSizeOfDQRulePerChart(); // Add RowCountIndicator dataset CustomerDefaultCategoryDataset customerDatasetRownCount = new CustomerDefaultCategoryDataset(); // MOD msjian TDQ-5119: fix a NPE if (units != null && units.size() > 0) { addRownCountDataEntity2CustomerDataset(customerDatasetRownCount, getRownCountUnit(units)); result.add(customerDatasetRownCount); // MOD xqliu 2012-04-23 TDQ-5057: don't include RowCountUnit List<TableIndicatorUnit> whereRuleUnits = removeRowCountUnit(units); int totalNum = whereRuleUnits.size(); int pageNum = totalNum % size == 0 ? totalNum / size : totalNum / size + 1; for (int i = 0; i < pageNum; i++) { CustomerDefaultCategoryDataset customerDataset = new CustomerDefaultCategoryDataset(); for (int j = 0; j < size; ++j) { int index = i * size + j; if (index < totalNum) { addDataEntity2CustomerDataset(customerDataset, whereRuleUnits.get(index)); } else { break; } } result.add(customerDataset); } } // TDQ-5119~ return result; } /** * DOC yyin Comment method "getSizeOfDQRule". * * @return */ public static int getSizeOfDQRulePerChart() { String dqruleSize = EditorPreferencePage.getDQRuleSize(); int maxSize = Integer.MAX_VALUE; int size = maxSize; try { size = Integer.parseInt(dqruleSize); if (size < 1) { size = maxSize; } } catch (NumberFormatException e) { size = maxSize; } return size; } public List<List<Indicator>> getPagedIndicators() { return WhereRuleStatisticsStateUtil.getPagedIndicators(units); } /** * DOC xqliu Comment method "removeRowCountUnit". * * @param units1 * @return */ public List<TableIndicatorUnit> removeRowCountUnit(List<TableIndicatorUnit> units1) { return WhereRuleStatisticsStateUtil.removeRowCountUnit(units1); } /** * DOC xqliu Comment method "getRownCountUnit". * * @param units1 * @return */ public TableIndicatorUnit getRownCountUnit(List<TableIndicatorUnit> units1) { return WhereRuleStatisticsStateUtil.getRownCountUnit(units1); } /** * DOC xqliu Comment method "addDataEntity2CustomerDataset". ADD xqliu 2010-03-10 feature 10834 * * @param customerDataset * @param unit */ private void addDataEntity2CustomerDataset(CustomerDefaultCategoryDataset customerDataset, TableIndicatorUnit unit) { if (IndicatorEnum.WhereRuleIndicatorEnum.equals(unit.getType())) { String columnKey = unit.getIndicatorName(); double value = WhereRuleStatisticsStateUtil.getMatchValue(unit.getValue()); double valueNotM = WhereRuleStatisticsStateUtil.getNotMatchValue(unit.getValue(), value, unit.geIndicatorCount()); customerDataset.addValue(valueNotM, ROW_KEY_NOT_PASS, columnKey); customerDataset.addValue(value, ROW_KEY_PASS, columnKey); WhereRuleChartDataEntity entity = WhereRuleStatisticsStateUtil .createRuleDataEntity(unit, columnKey, value, valueNotM); customerDataset.addDataEntity(entity); } } /** * DOC xqliu Comment method "addRownCountDataEntity2CustomerDataset". * * @param customerDataset * @param unit */ private void addRownCountDataEntity2CustomerDataset(CustomerDefaultCategoryDataset customerDataset, TableIndicatorUnit unit) { if (IndicatorEnum.RowCountIndicatorEnum.equals(unit.getType())) { String value = CommonStateUtil.getUnitValue(unit.getValue(), StringFormatUtil.DOUBLE_NUMBER); String label = unit.getIndicatorName(); customerDataset.addValue(Double.parseDouble(value), label, label); ChartDataEntity entityCount = CommonStateUtil.createDataEntity(unit, value, label); customerDataset.addDataEntity(entityCount); } } /* * (non-Javadoc) * * @see * org.talend.dataprofiler.core.ui.editor.preview.model.states.IChartTypeStates#getChart(org.jfree.data.category * .CategoryDataset) */ public Object getChart(Object dataset) { return null; } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.editor.preview.model.states.IChartTypeStates#getChartList(java.util.List) */ public List<Object> getChartList(List<Object> datasets) { List<Object> ret = new ArrayList<Object>(); if (datasets == null || datasets.size() < 1) { return ret; } // first get the chart for the row count Object chart = TOPChartUtils.getInstance().createBarChart( DefaultMessagesImpl.getString("SimpleStatisticsState.SimpleStatistics"), datasets.get(0), false); //$NON-NLS-1$ TOPChartUtils.getInstance().decorateChart(chart, false); ret.add(chart); // THEN get the charts for each paged rules for (int i = 1; i < datasets.size(); i++) { Object dataset = datasets.get(i); Object stackChart = TOPChartUtils.getInstance().createStackedBarChart( DefaultMessagesImpl.getString("WhereRuleStatisticsStateTable.WhereRuleStatistics"), dataset, true); //$NON-NLS-1$ ret.add(stackChart); } return ret; } }