/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.client.util; import com.emc.storageos.db.client.DbAggregatorItf; import com.emc.storageos.db.client.impl.*; import com.emc.storageos.db.client.model.DataObject; import com.netflix.astyanax.model.Column; import com.netflix.astyanax.model.Row; import java.util.Arrays; import java.util.Map; import java.util.HashMap; import java.util.Iterator; public class SumPrimitiveFieldAggregator implements DbAggregatorItf { private String[] _fields; private Map<String, DoubleValue> _valueMap = new HashMap<String, DoubleValue>(); private DataObjectType _doType; private long n_records; public String[] getAggregatedFields() { return Arrays.copyOf(_fields, _fields.length); } /** * @return the aggregated value. */ public double getAggregate(String field) { return _valueMap.get(field).value; } public long getRecordNum() { return n_records; } public SumPrimitiveFieldAggregator(Class<? extends DataObject> clazz, String[] fields) { _doType = TypeMap.getDoType(clazz); _fields = java.util.Arrays.copyOf(fields, fields.length); for (String field : fields) { _valueMap.put(field, new DoubleValue()); } n_records = 0; } @Override public void aggregate(Row<String, CompositeColumnName> row) { if (row.getColumns().size() == 0) { return; } Iterator<Column<CompositeColumnName>> columnIter = row.getColumns().iterator(); String prevColumnName = ""; Object prevValue = null; DoubleValue prevDValue = null; while (columnIter.hasNext()) { Column<CompositeColumnName> column = columnIter.next(); String curName = column.getName().getOne(); if (!_valueMap.containsKey(curName)) { if (prevValue != null) { prevDValue = _valueMap.get(prevColumnName); prevDValue.value += getDouble(prevValue); } prevValue = null; prevDValue = null; prevColumnName = curName; } else { if (!prevColumnName.equals(curName) && prevValue != null) { prevDValue.value += getDouble(prevValue); } ColumnField field = _doType.getColumnField(curName); Object curValue = ColumnValue.getPrimitiveColumnValue(column, field.getPropertyDescriptor()); prevValue = curValue; prevDValue = _valueMap.get(curName); prevColumnName = curName; } } if (prevValue != null) { prevDValue.value += getDouble(prevValue); } n_records++; } protected double getDouble(Object value) { double val = 0; if (value instanceof Integer) { val = (double) ((Integer) value).intValue(); } else if (value instanceof Long) { val = (double) ((Long) value).longValue(); } else if (value instanceof Byte) { val = (double) ((Byte) value).byteValue(); } else if (value instanceof Short) { val = (double) ((Short) value).shortValue(); } else if (value instanceof Float) { val = (double) ((Float) value).floatValue(); } else if (value instanceof Double) { val = (Double) value; } else { throw new UnsupportedOperationException(); } return val; } private static class DoubleValue { public double value; public DoubleValue() { value = 0.0; } } }