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