You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by dn...@apache.org on 2015/09/03 17:58:00 UTC

svn commit: r1701055 - in /poi/trunk/src/java/org/apache/poi/ss/formula: eval/FunctionEval.java functions/DGet.java functions/DMin.java functions/DStarRunner.java functions/IDStarAlgorithm.java

Author: dnorth
Date: Thu Sep  3 15:58:00 2015
New Revision: 1701055

URL: http://svn.apache.org/r1701055
Log:
Make D* functions thread safe, thanks to Patrick Zimmermann for the patch.

https://bz.apache.org/bugzilla/show_bug.cgi?id=58039

Modified:
    poi/trunk/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java
    poi/trunk/src/java/org/apache/poi/ss/formula/functions/DGet.java
    poi/trunk/src/java/org/apache/poi/ss/formula/functions/DMin.java
    poi/trunk/src/java/org/apache/poi/ss/formula/functions/DStarRunner.java
    poi/trunk/src/java/org/apache/poi/ss/formula/functions/IDStarAlgorithm.java

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=1701055&r1=1701054&r2=1701055&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 Thu Sep  3 15:58:00 2015
@@ -98,7 +98,7 @@ public final class FunctionEval {
         retval[38] = BooleanFunction.NOT;
         retval[39] = NumericFunction.MOD;
 
-        retval[43] = new DStarRunner(new DMin());
+        retval[43] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DMIN);
 
         retval[46] = AggregateFunction.VAR;
         retval[48] = TextFunction.TEXT;
@@ -191,7 +191,7 @@ public final class FunctionEval {
         retval[233] = NumericFunction.ACOSH;
         retval[234] = NumericFunction.ATANH;
 
-        retval[235] = new DStarRunner(new DGet());
+        retval[235] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DGET);
 
         retval[FunctionID.EXTERNAL_FUNC] = null; // ExternalFunction is a FreeREfFunction
 

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/functions/DGet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/functions/DGet.java?rev=1701055&r1=1701054&r2=1701055&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/functions/DGet.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/functions/DGet.java Thu Sep  3 15:58:00 2015
@@ -23,18 +23,11 @@ import org.apache.poi.ss.formula.eval.Va
 /**
  * Implementation of the DGet function:
  * Finds the value of a column in an area with given conditions.
- * 
- * TODO:
- * - wildcards ? and * in string conditions
- * - functions as conditions
  */
 public final class DGet implements IDStarAlgorithm {
     private ValueEval result;
-    
-    public void reset() {
-        result = null;
-    }
 
+    @Override
     public boolean processMatch(ValueEval eval) {
         if(result == null) // First match, just set the value.
         {
@@ -49,6 +42,7 @@ public final class DGet implements IDSta
         return true;
     }
 
+    @Override
     public ValueEval getResult() {
         if(result == null) {
             return ErrorEval.VALUE_INVALID;

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/functions/DMin.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/functions/DMin.java?rev=1701055&r1=1701054&r2=1701055&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/functions/DMin.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/functions/DMin.java Thu Sep  3 15:58:00 2015
@@ -32,10 +32,7 @@ import org.apache.poi.ss.formula.eval.Va
 public final class DMin implements IDStarAlgorithm {
     private ValueEval minimumValue;
 
-    public void reset() {
-        minimumValue = null;
-    }
-
+    @Override
     public boolean processMatch(ValueEval eval) {
         if(eval instanceof NumericValueEval) {
             if(minimumValue == null) { // First match, just set the value.
@@ -52,6 +49,7 @@ public final class DMin implements IDSta
         return true;
     }
 
+    @Override
     public ValueEval getResult() {
         if(minimumValue == null) {
             return NumberEval.ZERO;

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=1701055&r1=1701054&r2=1701055&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 Thu Sep  3 15:58:00 2015
@@ -32,12 +32,21 @@ import org.apache.poi.ss.util.NumberComp
  * This class performs a D* calculation. It takes an {@link IDStarAlgorithm} object and
  * uses it for calculating the result value. Iterating a database and checking the
  * entries against the set of conditions is done here.
+ *
+ * TODO:
+ * - wildcards ? and * in string conditions
+ * - functions as conditions
  */
 public final class DStarRunner implements Function3Arg {
-    private IDStarAlgorithm algorithm;
+    public enum DStarAlgorithmEnum {
+        DGET,
+        DMIN,
+        // DMAX, // DMAX is not yet implemented
+    }
+    private final DStarAlgorithmEnum algoType;
 
-    public DStarRunner(IDStarAlgorithm algorithm) {
-        this.algorithm = algorithm;
+    public DStarRunner(DStarAlgorithmEnum algorithm) {
+        this.algoType = algorithm;
     }
 
     public final ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
@@ -69,10 +78,14 @@ public final class DStarRunner implement
             return ErrorEval.VALUE_INVALID;
         }
 
-        // Reset algorithm.
-        algorithm.reset();
+        // Create an algorithm runner.
+        IDStarAlgorithm algorithm = null;
+        switch(algoType) {
+            case DGET: algorithm = new DGet(); break;
+            case DMIN: algorithm = new DMin(); break;
+        }
 
-        // Iterate over all db entries.
+        // Iterate over all DB entries.
         for(int row = 1; row < db.getHeight(); ++row) {
             boolean matches = true;
             try {

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/functions/IDStarAlgorithm.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/functions/IDStarAlgorithm.java?rev=1701055&r1=1701054&r2=1701055&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/functions/IDStarAlgorithm.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/functions/IDStarAlgorithm.java Thu Sep  3 15:58:00 2015
@@ -25,11 +25,6 @@ import org.apache.poi.ss.formula.eval.Va
  */
 public interface IDStarAlgorithm {
     /**
-     * Reset the state of this algorithm.
-     * This is called before each run through a database.
-     */
-    void reset();
-    /**
      * Process a match that is found during a run through a database.
      * @param eval ValueEval of the cell in the matching row. References will already be resolved.
      * @return Whether we should continue iterating through the database.



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org