blob: 20c124554353d89d693e975ea5fa16b5df45b579 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.chart.ui.aggregator;
import java.math.BigDecimal;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.internal.tmf.chart.core.aggregator.IConsumerAggregator;
import org.eclipse.tracecompass.internal.tmf.chart.core.consumer.IDataConsumer;
import org.eclipse.tracecompass.internal.tmf.chart.core.consumer.NumericalConsumer;
import org.eclipse.tracecompass.internal.tmf.chart.ui.data.ChartRange;
import org.eclipse.tracecompass.internal.tmf.chart.ui.data.ChartRangeMap;
/**
* This class is used for processing {@link NumericalConsumer} after they are
* done processing objects from the stream of data. Right now, it only computes
* the total range of multiple consumers.
*
* FIXME: This should not be implemented as a Consumer. A consumer should be
* stateless. This could be implemented via a andThen on the data consumers and
* modify an object that contains the information of this class.
*
* @author Gabriel-Andrew Pollo-Guilbert
*/
public class NumericalConsumerAggregator implements IConsumerAggregator {
// ------------------------------------------------------------------------
// Members
// ------------------------------------------------------------------------
private @Nullable BigDecimal fMinimum;
private @Nullable BigDecimal fMaximum;
// ------------------------------------------------------------------------
// Overriden Methods
// ------------------------------------------------------------------------
@Override
public void accept(IDataConsumer obj) {
NumericalConsumer consumer = (NumericalConsumer) obj;
BigDecimal nextMin = new BigDecimal(consumer.getMin().toString());
BigDecimal nextMax = new BigDecimal(consumer.getMax().toString());
BigDecimal min = fMinimum;
BigDecimal max = fMaximum;
/* Set initial min and max values */
if (min == null || max == null) {
fMinimum = nextMin;
fMaximum = nextMax;
return;
}
/* Update min and max values */
fMinimum = min.min(nextMin);
fMaximum = max.max(nextMax);
}
// ------------------------------------------------------------------------
// Accessors
// ------------------------------------------------------------------------
/**
* Accessor that returns a range map of all the numerical consumers. The
* internal range of the map created with default values and the external
* range is created from the computed minimum and maximum values of this
* aggregator.
*
* @return The chart range map that covers all data points
*/
public ChartRangeMap getChartRanges() {
BigDecimal min = fMinimum;
BigDecimal max = fMaximum;
if (min == null || max == null) {
return new ChartRangeMap();
}
ChartRange external = new ChartRange(min, max);
return new ChartRangeMap(external);
}
}