mirror of https://github.com/apache/poi.git
Implement DMAX and DSUM functions, following the pattern from DMIN.
Refactored the D* function enum to have instances return the function implementation instances rather than using a case construct, now that Java 8 is required. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1819376 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
80e430f295
commit
94bec76385
|
@ -106,10 +106,10 @@ public final class FunctionEval {
|
||||||
retval[38] = BooleanFunction.NOT;
|
retval[38] = BooleanFunction.NOT;
|
||||||
retval[39] = NumericFunction.MOD;
|
retval[39] = NumericFunction.MOD;
|
||||||
// 40: DCOUNT
|
// 40: DCOUNT
|
||||||
// 41: DSUM
|
retval[41] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DSUM);
|
||||||
// 42: DAVERAGE
|
// 42: DAVERAGE
|
||||||
retval[43] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DMIN);
|
retval[43] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DMIN);
|
||||||
// 44: DMAX
|
retval[44] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DMAX);
|
||||||
// 45: DSTDEV
|
// 45: DSTDEV
|
||||||
retval[46] = AggregateFunction.VAR;
|
retval[46] = AggregateFunction.VAR;
|
||||||
// 47: DVAR
|
// 47: DVAR
|
||||||
|
@ -144,7 +144,6 @@ public final class FunctionEval {
|
||||||
retval[FunctionID.OFFSET] = new Offset(); //nominally 78
|
retval[FunctionID.OFFSET] = new Offset(); //nominally 78
|
||||||
|
|
||||||
retval[82] = TextFunction.SEARCH;
|
retval[82] = TextFunction.SEARCH;
|
||||||
// 83: TRANSPOSE
|
|
||||||
retval[83] = MatrixFunction.TRANSPOSE;
|
retval[83] = MatrixFunction.TRANSPOSE;
|
||||||
|
|
||||||
// 86: TYPE
|
// 86: TYPE
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.ss.formula.functions;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.formula.eval.NumberEval;
|
||||||
|
import org.apache.poi.ss.formula.eval.NumericValueEval;
|
||||||
|
import org.apache.poi.ss.formula.eval.ValueEval;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of the DMax function:
|
||||||
|
* Finds the maximum value of a column in an area with given conditions.
|
||||||
|
*
|
||||||
|
* TODO:
|
||||||
|
* - wildcards ? and * in string conditions
|
||||||
|
* - functions as conditions
|
||||||
|
*/
|
||||||
|
public final class DMax implements IDStarAlgorithm {
|
||||||
|
private ValueEval maximumValue;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean processMatch(ValueEval eval) {
|
||||||
|
if(eval instanceof NumericValueEval) {
|
||||||
|
if(maximumValue == null) { // First match, just set the value.
|
||||||
|
maximumValue = eval;
|
||||||
|
} else { // There was a previous match, find the new minimum.
|
||||||
|
double currentValue = ((NumericValueEval)eval).getNumberValue();
|
||||||
|
double oldValue = ((NumericValueEval)maximumValue).getNumberValue();
|
||||||
|
if(currentValue > oldValue) {
|
||||||
|
maximumValue = eval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ValueEval getResult() {
|
||||||
|
if(maximumValue == null) {
|
||||||
|
return NumberEval.ZERO;
|
||||||
|
} else {
|
||||||
|
return maximumValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
package org.apache.poi.ss.formula.functions;
|
package org.apache.poi.ss.formula.functions;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import org.apache.poi.ss.formula.eval.AreaEval;
|
import org.apache.poi.ss.formula.eval.AreaEval;
|
||||||
import org.apache.poi.ss.formula.eval.BlankEval;
|
import org.apache.poi.ss.formula.eval.BlankEval;
|
||||||
import org.apache.poi.ss.formula.eval.ErrorEval;
|
import org.apache.poi.ss.formula.eval.ErrorEval;
|
||||||
|
@ -39,13 +41,38 @@ import org.apache.poi.ss.util.NumberComparer;
|
||||||
* - functions as conditions
|
* - functions as conditions
|
||||||
*/
|
*/
|
||||||
public final class DStarRunner implements Function3Arg {
|
public final class DStarRunner implements Function3Arg {
|
||||||
|
/**
|
||||||
|
* Enum for convenience to identify and source implementations of the D* functions
|
||||||
|
*/
|
||||||
public enum DStarAlgorithmEnum {
|
public enum DStarAlgorithmEnum {
|
||||||
DGET,
|
/** @see DGet */
|
||||||
DMIN,
|
DGET(DGet::new),
|
||||||
// DMAX, // DMAX is not yet implemented
|
/** @see DMin */
|
||||||
|
DMIN(DMin::new),
|
||||||
|
/** @see DMax */
|
||||||
|
DMAX(DMax::new),
|
||||||
|
/** @see DSum */
|
||||||
|
DSUM(DSum::new),
|
||||||
|
;
|
||||||
|
|
||||||
|
private final Supplier<IDStarAlgorithm> implSupplier;
|
||||||
|
|
||||||
|
private DStarAlgorithmEnum(Supplier<IDStarAlgorithm> implSupplier) {
|
||||||
|
this.implSupplier = implSupplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a new function implementation instance
|
||||||
|
*/
|
||||||
|
public IDStarAlgorithm newInstance() {
|
||||||
|
return implSupplier.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
private final DStarAlgorithmEnum algoType;
|
private final DStarAlgorithmEnum algoType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param algorithm to implement
|
||||||
|
*/
|
||||||
public DStarRunner(DStarAlgorithmEnum algorithm) {
|
public DStarRunner(DStarAlgorithmEnum algorithm) {
|
||||||
this.algoType = algorithm;
|
this.algoType = algorithm;
|
||||||
}
|
}
|
||||||
|
@ -86,13 +113,7 @@ public final class DStarRunner implements Function3Arg {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create an algorithm runner.
|
// Create an algorithm runner.
|
||||||
IDStarAlgorithm algorithm;
|
IDStarAlgorithm algorithm = algoType.newInstance();
|
||||||
switch(algoType) {
|
|
||||||
case DGET: algorithm = new DGet(); break;
|
|
||||||
case DMIN: algorithm = new DMin(); break;
|
|
||||||
default:
|
|
||||||
throw new IllegalStateException("Unexpected algorithm type " + algoType + " encountered.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterate over all DB entries.
|
// Iterate over all DB entries.
|
||||||
final int height = db.getHeight();
|
final int height = db.getHeight();
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.ss.formula.functions;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.formula.eval.NumberEval;
|
||||||
|
import org.apache.poi.ss.formula.eval.NumericValueEval;
|
||||||
|
import org.apache.poi.ss.formula.eval.ValueEval;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of the DSum function:
|
||||||
|
* Finds the total value of matching values in a column in an area with given conditions.
|
||||||
|
*
|
||||||
|
* TODO:
|
||||||
|
* - wildcards ? and * in string conditions
|
||||||
|
* - functions as conditions
|
||||||
|
*/
|
||||||
|
public final class DSum implements IDStarAlgorithm {
|
||||||
|
private double totalValue = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean processMatch(ValueEval eval) {
|
||||||
|
if(eval instanceof NumericValueEval) {
|
||||||
|
double currentValue = ((NumericValueEval)eval).getNumberValue();
|
||||||
|
totalValue += currentValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ValueEval getResult() {
|
||||||
|
return new NumberEval(totalValue);
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Loading…
Reference in New Issue