You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by gw...@apache.org on 2017/12/27 22:33:03 UTC
svn commit: r1819376 - in /poi/trunk:
src/java/org/apache/poi/ss/formula/eval/
src/java/org/apache/poi/ss/formula/functions/ test-data/spreadsheet/
Author: gwoolsey
Date: Wed Dec 27 22:33:03 2017
New Revision: 1819376
URL: http://svn.apache.org/viewvc?rev=1819376&view=rev
Log:
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.
Added:
poi/trunk/src/java/org/apache/poi/ss/formula/functions/DMax.java (with props)
poi/trunk/src/java/org/apache/poi/ss/formula/functions/DSum.java (with props)
Modified:
poi/trunk/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java
poi/trunk/src/java/org/apache/poi/ss/formula/functions/DStarRunner.java
poi/trunk/test-data/spreadsheet/DStar.xls
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java?rev=1819376&r1=1819375&r2=1819376&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java Wed Dec 27 22:33:03 2017
@@ -106,10 +106,10 @@ public final class FunctionEval {
retval[38] = BooleanFunction.NOT;
retval[39] = NumericFunction.MOD;
// 40: DCOUNT
- // 41: DSUM
+ retval[41] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DSUM);
// 42: DAVERAGE
retval[43] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DMIN);
- // 44: DMAX
+ retval[44] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DMAX);
// 45: DSTDEV
retval[46] = AggregateFunction.VAR;
// 47: DVAR
@@ -144,7 +144,6 @@ public final class FunctionEval {
retval[FunctionID.OFFSET] = new Offset(); //nominally 78
retval[82] = TextFunction.SEARCH;
- // 83: TRANSPOSE
retval[83] = MatrixFunction.TRANSPOSE;
// 86: TYPE
Added: poi/trunk/src/java/org/apache/poi/ss/formula/functions/DMax.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/functions/DMax.java?rev=1819376&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/functions/DMax.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/functions/DMax.java Wed Dec 27 22:33:03 2017
@@ -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;
+ }
+ }
+}
Propchange: poi/trunk/src/java/org/apache/poi/ss/formula/functions/DMax.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/functions/DStarRunner.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/functions/DStarRunner.java?rev=1819376&r1=1819375&r2=1819376&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/functions/DStarRunner.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/functions/DStarRunner.java Wed Dec 27 22:33:03 2017
@@ -17,6 +17,8 @@
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.BlankEval;
import org.apache.poi.ss.formula.eval.ErrorEval;
@@ -39,13 +41,38 @@ import org.apache.poi.ss.util.NumberComp
* - functions as conditions
*/
public final class DStarRunner implements Function3Arg {
+ /**
+ * Enum for convenience to identify and source implementations of the D* functions
+ */
public enum DStarAlgorithmEnum {
- DGET,
- DMIN,
- // DMAX, // DMAX is not yet implemented
+ /** @see DGet */
+ DGET(DGet::new),
+ /** @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;
+ /**
+ * @param algorithm to implement
+ */
public DStarRunner(DStarAlgorithmEnum algorithm) {
this.algoType = algorithm;
}
@@ -86,13 +113,7 @@ public final class DStarRunner implement
}
// Create an algorithm runner.
- IDStarAlgorithm algorithm;
- switch(algoType) {
- case DGET: algorithm = new DGet(); break;
- case DMIN: algorithm = new DMin(); break;
- default:
- throw new IllegalStateException("Unexpected algorithm type " + algoType + " encountered.");
- }
+ IDStarAlgorithm algorithm = algoType.newInstance();
// Iterate over all DB entries.
final int height = db.getHeight();
Added: poi/trunk/src/java/org/apache/poi/ss/formula/functions/DSum.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/functions/DSum.java?rev=1819376&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/functions/DSum.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/functions/DSum.java Wed Dec 27 22:33:03 2017
@@ -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);
+ }
+}
Propchange: poi/trunk/src/java/org/apache/poi/ss/formula/functions/DSum.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: poi/trunk/test-data/spreadsheet/DStar.xls
URL: http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/DStar.xls?rev=1819376&r1=1819375&r2=1819376&view=diff
==============================================================================
Binary files poi/trunk/test-data/spreadsheet/DStar.xls (original) and poi/trunk/test-data/spreadsheet/DStar.xls Wed Dec 27 22:33:03 2017 differ
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org