]> source.dussan.org Git - poi.git/commitdiff
Make D* functions thread safe, thanks to Patrick Zimmermann for the patch.
authorDavid North <dnorth@apache.org>
Thu, 3 Sep 2015 15:58:00 +0000 (15:58 +0000)
committerDavid North <dnorth@apache.org>
Thu, 3 Sep 2015 15:58:00 +0000 (15:58 +0000)
https://bz.apache.org/bugzilla/show_bug.cgi?id=58039

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1701055 13f79535-47bb-0310-9956-ffa450edef68

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

index cf88b37a62dd628c854aafdef789e3476c0cba91..c64afbd55fc025bfe97510c0d29874d5d16bd4c4 100644 (file)
@@ -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
 
index 273c4eaacb565e801eebf66c929673f0665744ed..91a9934b5046bf872d97b97dd3e219d963591c1f 100644 (file)
@@ -23,18 +23,11 @@ import org.apache.poi.ss.formula.eval.ValueEval;
 /**
  * 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 IDStarAlgorithm {
         return true;
     }
 
+    @Override
     public ValueEval getResult() {
         if(result == null) {
             return ErrorEval.VALUE_INVALID;
index 6f996c55f20c0bad95fcd23a986662f6d9a65e04..61b75768c7116ef5bf3ea5851a0244dd62451bcf 100644 (file)
@@ -32,10 +32,7 @@ import org.apache.poi.ss.formula.eval.ValueEval;
 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 IDStarAlgorithm {
         return true;
     }
 
+    @Override
     public ValueEval getResult() {
         if(minimumValue == null) {
             return NumberEval.ZERO;
index fbf074cdb125d286c8f87c96496cb3fc591da18d..c5fffbda3ad63c2689fe52dddf0407cfb4459910 100644 (file)
@@ -32,12 +32,21 @@ import org.apache.poi.ss.util.NumberComparer;
  * 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 implements Function3Arg {
             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 {
index b23dd7f6bd18043df62328746f657268e6e36f05..111964a4c47bae40eceda6ce94a09456a5e88456 100644 (file)
@@ -24,11 +24,6 @@ import org.apache.poi.ss.formula.eval.ValueEval;
  * Each implementing class should correspond to one of the D* functions.
  */
 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.