package org.neodatis.odb.impl.core.query.values;

import java.math.BigDecimal;

import org.neodatis.odb.OID;
import org.neodatis.odb.OdbConfiguration;
import org.neodatis.odb.core.layers.layer2.meta.AttributeValuesMap;
import org.neodatis.odb.core.query.execution.IQueryFieldAction;
import org.neodatis.odb.core.query.values.AbstractQueryFieldAction;
import org.neodatis.tool.wrappers.NeoDatisNumber;

/**
 * An action to compute the average value of a field
 * @author osmadja
 *
 */
public class AverageValueAction extends AbstractQueryFieldAction {
	private static BigDecimal ONE = new BigDecimal(1);
	private BigDecimal totalValue;
	private BigDecimal nbValues;
	private BigDecimal average;
	
	private int scale;
	private int roundType;
	
	public AverageValueAction(String attributeName, String alias) {
		super(attributeName,alias,false);
		this.totalValue = new BigDecimal(0);
		this.nbValues = new BigDecimal(0);
		this.attributeName = attributeName;
		
		this.scale = OdbConfiguration.getScaleForAverageDivision();
		this.roundType = OdbConfiguration.getRoundTypeForAverageDivision();
	}


	public void execute(OID oid, AttributeValuesMap values) {
		Number n = (Number) values.get(attributeName);
		totalValue = NeoDatisNumber.add(totalValue,ValuesUtil.convert(n));
		nbValues = NeoDatisNumber.add(nbValues,ONE);
	}


	public Object getValue() {
		return average;
	}


	public void end() {
		average = NeoDatisNumber.divide(totalValue,nbValues, roundType,scale);
	}

	public void start() {
		
	}

	public IQueryFieldAction copy() {
		return new AverageValueAction(attributeName,alias);
	}	
}

 

Ads help maintain this website.