MtasDataDoubleBasic.java
package mtas.codec.util.collector;
import java.io.IOException;
import java.util.Collections;
import java.util.SortedSet;
import org.apache.commons.lang.ArrayUtils;
import mtas.codec.util.CodecUtil;
/**
* The Class MtasDataDoubleBasic.
*/
public class MtasDataDoubleBasic extends MtasDataBasic<Double, Double> {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/**
* Instantiates a new mtas data double basic.
*
* @param collectorType the collector type
* @param statsItems the stats items
* @param sortType the sort type
* @param sortDirection the sort direction
* @param start the start
* @param number the number
* @param subCollectorTypes the sub collector types
* @param subDataTypes the sub data types
* @param subStatsTypes the sub stats types
* @param subStatsItems the sub stats items
* @param subSortTypes the sub sort types
* @param subSortDirections the sub sort directions
* @param subStart the sub start
* @param subNumber the sub number
* @param segmentRegistration the segment registration
* @param boundary the boundary
* @throws IOException Signals that an I/O exception has occurred.
*/
public MtasDataDoubleBasic(String collectorType, SortedSet<String> statsItems,
String sortType, String sortDirection, Integer start, Integer number,
String[] subCollectorTypes, String[] subDataTypes, String[] subStatsTypes,
SortedSet<String>[] subStatsItems, String[] subSortTypes,
String[] subSortDirections, Integer[] subStart, Integer[] subNumber,
String segmentRegistration, String boundary) throws IOException {
super(collectorType, CodecUtil.DATA_TYPE_DOUBLE, statsItems, sortType,
sortDirection, start, number, subCollectorTypes, subDataTypes,
subStatsTypes, subStatsItems, subSortTypes, subSortDirections, subStart,
subNumber, new MtasDataDoubleOperations(), segmentRegistration,
boundary);
}
/*
* (non-Javadoc)
*
* @see mtas.codec.util.DataCollector.MtasDataCollector#getItem(int)
*/
@Override
protected MtasDataItemDoubleBasic getItem(int i) {
if (i >= 0 && i < size) {
return new MtasDataItemDoubleBasic(basicValueSumList[i],
basicValueNList[i], hasSub() ? subCollectorListNextLevel[i] : null,
getStatsItems(), sortType, sortDirection, errorNumber[i],
errorList[i], sourceNumberList[i]);
} else {
return null;
}
}
/*
* (non-Javadoc)
*
* @see mtas.codec.util.DataCollector.MtasDataCollector#add(long, long)
*/
@Override
public MtasDataCollector<?, ?> add(long valueSum, long valueN)
throws IOException {
MtasDataCollector<?, ?> dataCollector = add(false);
setValue(newCurrentPosition, Double.valueOf(valueSum), valueN,
newCurrentExisting);
return dataCollector;
}
/*
* (non-Javadoc)
*
* @see mtas.codec.util.DataCollector.MtasDataCollector#add(long[], int)
*/
@Override
public MtasDataCollector<?, ?> add(long[] values, int number)
throws IOException {
MtasDataCollector<?, ?> dataCollector = add(false);
Double[] newValues = new Double[number];
for (int i = 0; i < values.length; i++)
newValues[i] = Long.valueOf(values[i]).doubleValue();
setValue(newCurrentPosition, newValues, number, newCurrentExisting);
return dataCollector;
}
/*
* (non-Javadoc)
*
* @see mtas.codec.util.DataCollector.MtasDataCollector#add(double, long)
*/
@Override
public MtasDataCollector<?, ?> add(double valueSum, long valueN)
throws IOException {
MtasDataCollector<?, ?> dataCollector = add(false);
setValue(newCurrentPosition, valueSum, valueN, newCurrentExisting);
return dataCollector;
}
/*
* (non-Javadoc)
*
* @see mtas.codec.util.DataCollector.MtasDataCollector#add(double[], int)
*/
@Override
public MtasDataCollector<?, ?> add(double[] values, int number)
throws IOException {
MtasDataCollector<?, ?> dataCollector = add(false);
setValue(newCurrentPosition, ArrayUtils.toObject(values), number,
newCurrentExisting);
return dataCollector;
}
/*
* (non-Javadoc)
*
* @see
* mtas.codec.util.DataCollector.MtasDataCollector#add(java.lang.String[],
* long, long)
*/
@Override
public MtasDataCollector<?, ?> add(String key, long valueSum, long valueN)
throws IOException {
if (key != null) {
MtasDataCollector<?, ?> subCollector = add(key, false);
setValue(newCurrentPosition, Double.valueOf(valueSum), valueN,
newCurrentExisting);
return subCollector;
} else {
return null;
}
}
/*
* (non-Javadoc)
*
* @see
* mtas.codec.util.DataCollector.MtasDataCollector#add(java.lang.String[],
* long[], int)
*/
@Override
public MtasDataCollector<?, ?> add(String key, long[] values, int number)
throws IOException {
if (key != null) {
Double[] newValues = new Double[number];
for (int i = 0; i < values.length; i++)
newValues[i] = Long.valueOf(values[i]).doubleValue();
MtasDataCollector<?, ?> subCollector = add(key, false);
setValue(newCurrentPosition, newValues, number, newCurrentExisting);
return subCollector;
} else {
return null;
}
}
/*
* (non-Javadoc)
*
* @see
* mtas.codec.util.DataCollector.MtasDataCollector#add(java.lang.String[],
* double, long)
*/
@Override
public MtasDataCollector<?, ?> add(String key, double valueSum, long valueN)
throws IOException {
if (key != null) {
MtasDataCollector<?, ?> subCollector = add(key, false);
setValue(newCurrentPosition, valueSum, valueN, newCurrentExisting);
return subCollector;
} else {
return null;
}
}
/*
* (non-Javadoc)
*
* @see
* mtas.codec.util.DataCollector.MtasDataCollector#add(java.lang.String[],
* double[], int)
*/
@Override
public MtasDataCollector<?, ?> add(String key, double[] values, int number)
throws IOException {
if (key != null) {
MtasDataCollector<?, ?> subCollector = add(key, false);
setValue(newCurrentPosition, ArrayUtils.toObject(values), number,
newCurrentExisting);
return subCollector;
} else {
return null;
}
}
/*
* (non-Javadoc)
*
* @see
* mtas.codec.util.DataCollector.MtasDataCollector#compareForComputingSegment(
* java.lang.Number, java.lang.Number)
*/
@Override
protected boolean compareWithBoundary(Double value, Double boundary)
throws IOException {
if (segmentRegistration.equals(SEGMENT_SORT_ASC)
|| segmentRegistration.equals(SEGMENT_BOUNDARY_ASC)) {
return value <= boundary;
} else if (segmentRegistration.equals(SEGMENT_SORT_DESC)
|| segmentRegistration.equals(SEGMENT_BOUNDARY_DESC)) {
return value >= boundary;
} else {
throw new IOException(
"can't compare for segmentRegistration " + segmentRegistration);
}
}
/*
* (non-Javadoc)
*
* @see
* mtas.codec.util.DataCollector.MtasDataCollector#minimumForComputingSegment(
* java.lang.Number, java.lang.Number)
*/
@Override
protected Double lastForComputingSegment(Double value, Double boundary)
throws IOException {
if (segmentRegistration.equals(SEGMENT_SORT_ASC)) {
return Math.max(value, boundary);
} else if (segmentRegistration.equals(SEGMENT_SORT_DESC)) {
return Math.min(value, boundary);
} else {
throw new IOException(
"can't compute last for segmentRegistration " + segmentRegistration);
}
}
/*
* (non-Javadoc)
*
* @see
* mtas.codec.util.DataCollector.MtasDataCollector#minimumForComputingSegment(
* )
*/
@Override
protected Double lastForComputingSegment() throws IOException {
if (segmentRegistration.equals(SEGMENT_SORT_ASC)
|| segmentRegistration.equals(SEGMENT_BOUNDARY_ASC)) {
return Collections.max(segmentValueTopList);
} else if (segmentRegistration.equals(SEGMENT_SORT_DESC)
|| segmentRegistration.equals(SEGMENT_BOUNDARY_DESC)) {
return Collections.min(segmentValueTopList);
} else {
throw new IOException(
"can't compute last for segmentRegistration " + segmentRegistration);
}
}
/*
* (non-Javadoc)
*
* @see
* mtas.codec.util.DataCollector.MtasDataCollector#boundaryForComputingSegment
* ()
*/
@Override
protected Double boundaryForSegmentComputing(String segmentName)
throws IOException {
if (segmentRegistration.equals(SEGMENT_SORT_ASC)
|| segmentRegistration.equals(SEGMENT_SORT_DESC)) {
Double boundary = boundaryForSegment(segmentName);
if (boundary == null) {
return null;
} else {
if (segmentRegistration.equals(SEGMENT_SORT_DESC)) {
long correctionBoundary = 0;
for (String otherSegmentName : segmentValueTopListLast.keySet()) {
if (!otherSegmentName.equals(segmentName)) {
Double otherBoundary = segmentValuesBoundary
.get(otherSegmentName);
if (otherBoundary != null) {
correctionBoundary += Math.max(0, otherBoundary - boundary);
}
}
}
return boundary + correctionBoundary;
} else {
return boundary;
}
}
} else {
throw new IOException("can't compute boundary for segmentRegistration "
+ segmentRegistration);
}
}
/*
* (non-Javadoc)
*
* @see mtas.codec.util.DataCollector.MtasDataCollector#boundaryForSegment()
*/
@Override
protected Double boundaryForSegment(String segmentName) throws IOException {
if (segmentRegistration.equals(SEGMENT_SORT_ASC)
|| segmentRegistration.equals(SEGMENT_SORT_DESC)) {
Double thisLast = segmentValueTopListLast.get(segmentName);
if (thisLast == null) {
return null;
} else if (segmentRegistration.equals(SEGMENT_SORT_ASC)) {
return thisLast * segmentNumber;
} else {
return thisLast / segmentNumber;
}
} else {
throw new IOException("can't compute boundary for segmentRegistration "
+ segmentRegistration);
}
}
/*
* (non-Javadoc)
*
* @see
* mtas.codec.util.collector.MtasDataCollector#stringToBoundary(java.lang.
* String, java.lang.Integer)
*/
@Override
protected Double stringToBoundary(String boundary, Integer segmentNumber)
throws IOException {
if (segmentRegistration.equals(SEGMENT_BOUNDARY_ASC)
|| segmentRegistration.equals(SEGMENT_BOUNDARY_DESC)) {
if (segmentNumber == null) {
return Double.valueOf(boundary);
} else {
return Double.valueOf(boundary) / segmentNumber;
}
} else {
throw new IOException(
"not available for segmentRegistration " + segmentRegistration);
}
}
/*
* (non-Javadoc)
*
* @see
* mtas.codec.util.collector.MtasDataCollector#validateSegmentBoundary(java.
* lang.Object)
*/
@Override
public boolean validateSegmentBoundary(Object o) throws IOException {
if (o instanceof Double) {
return validateWithSegmentBoundary((Double) o);
} else {
throw new IOException("incorrect type");
}
}
}