// ============================================================================ // // 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.service.utils; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.talend.dataprofiler.service.ITOPChartService; import org.talend.utils.collections.DoubleValueAggregate; import org.talend.utils.collections.MultiMapHelper; import org.talend.utils.collections.MultipleKey; /** * created by yyin on 2014-12-17 Detailled comment * */ public class ValueAggregator extends DoubleValueAggregate<MultipleKey> { private Map<String, List<String>> seriesKeyToLabel = new HashMap<String, List<String>>(); /** * Method "getLabels". Must not be called before the {@link #addSeriesToXYZDataset(Object, String,ITOPChartService)} * method. * * @param seriesKey * @return the label for each item of the dataset */ public List<String> getLabels(String seriesKey) { return seriesKeyToLabel.get(seriesKey); } public Iterator<Entry<MultipleKey, Double[]>> getKeyValueMap() { return keyToVal.entrySet().iterator(); } public Double[] getValueByKey(MultipleKey key) { return keyToVal.get(key); } /* * (non-Javadoc) * * @see org.talend.utils.collections.DoubleValueAggregate#addValue(java.lang.Object, java.lang.Double[]) Need to * compute average. */ @Override public void addValue(MultipleKey key, Double[] values) { Double[] doubles = keyToVal.get(key); if (doubles == null) { doubles = new Double[values.length]; Arrays.fill(doubles, 0.0); } // handle average which is an not additive variable assert values.length == 3; // specific code for CountAvgNullIndicator Double avg = values[0]; Double count = values[1]; Double nulls = values[2]; if (count == null || avg == null || nulls == null) { nullResults.add(key); return; } // else add values Double previousCount = doubles[1]; Double sumCount = previousCount + count; doubles[0] = (doubles[0] * previousCount + avg * count) / sumCount; // sum averages doubles[1] = sumCount; doubles[2] += nulls; keyToVal.put(key, doubles); } /** * Method "addSeriesToXYZDataset" adds a new series of data to the given dataset. * * @param dataset a dataset * @param keyOfDataset the series key of the data series */ public void addSeriesToXYZDataset(Object dataset, String keyOfDataset, ITOPChartService chartService) { final int size = keyToVal.size(); double[] xDouble = new double[size]; double[] yDouble = new double[size]; double[] zDouble = new double[size]; // get x,y,z for each key int i = 0; for (MultipleKey key : keyToVal.keySet()) { final Double[] doubles = keyToVal.get(key); xDouble[i] = doubles[0]; yDouble[i] = doubles[1]; zDouble[i] = doubles[2]; MultiMapHelper.addUniqueObjectToListMap(keyOfDataset, key.toString(), this.seriesKeyToLabel); i++; } // array of data for jfreechart double[][] data = new double[][] { xDouble, yDouble, zDouble }; chartService.addSeriesToDefaultXYZDataset(dataset, keyOfDataset, data); } }