/*
* Copyright (c) 2014 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.internal.util.table;
/**
* @author Eike Stepper
*/
public interface Formula
{
public Object evaluate();
/**
* @author Eike Stepper
*/
public static class Sum implements Formula
{
private final Range range;
public Sum(Range range)
{
this.range = range;
}
public Double evaluate()
{
double sum = 0.0;
for (Cell cell : range)
{
Number number = cell.number();
if (number != null)
{
sum += number.doubleValue();
}
}
return sum;
}
}
/**
* @author Eike Stepper
*/
public static class Min implements Formula
{
private final Range range;
public Min(Range range)
{
this.range = range;
}
public Double evaluate()
{
double min = Double.MAX_VALUE;
boolean empty = true;
for (Cell cell : range)
{
Number number = cell.number();
if (number != null)
{
min = Math.min(min, number.doubleValue());
empty = false;
}
}
return empty ? null : min;
}
}
/**
* @author Eike Stepper
*/
public static class Max implements Formula
{
private final Range range;
public Max(Range range)
{
this.range = range;
}
public Double evaluate()
{
double max = Double.MIN_VALUE;
boolean empty = true;
for (Cell cell : range)
{
Number number = cell.number();
if (number != null)
{
max = Math.max(max, number.doubleValue());
empty = false;
}
}
return empty ? null : max;
}
}
/**
* @author Eike Stepper
*/
public static class Avg implements Formula
{
private final Range range;
public Avg(Range range)
{
this.range = range;
}
public Double evaluate()
{
double sum = 0.0;
int count = 0;
for (Cell cell : range)
{
Number number = cell.number();
if (number != null)
{
sum += number.doubleValue();
++count;
}
}
return sum / count;
}
}
/**
* @author Eike Stepper
*/
public static class CountNumbers implements Formula
{
private final Range range;
public CountNumbers(Range range)
{
this.range = range;
}
public Integer evaluate()
{
int count = 0;
for (Cell cell : range)
{
Number number = cell.number();
if (number != null)
{
++count;
}
}
return count;
}
}
/**
* @author Eike Stepper
*/
public static class Percent extends Sum
{
private final Cell cell;
public Percent(Range range, Cell cell)
{
super(range);
this.cell = cell;
}
@Override
public Double evaluate()
{
Number number = cell.number();
if (number == null)
{
return null;
}
double value = number.doubleValue();
if (value == 0.0)
{
return value;
}
Double sum = super.evaluate();
if (sum == null)
{
return null;
}
if (sum == 0.0)
{
return value < 0 ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
}
return value / sum;
}
}
}