poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j...@apache.org
Subject svn commit: r829293 - in /poi/trunk: src/documentation/content/xdocs/ src/java/org/apache/poi/hssf/record/formula/eval/ src/java/org/apache/poi/hssf/record/formula/functions/ src/testcases/org/apache/poi/hssf/record/formula/functions/ test-data/spreads...
Date Sat, 24 Oct 2009 00:41:31 GMT
Author: josh
Date: Sat Oct 24 00:41:30 2009
New Revision: 829293

URL: http://svn.apache.org/viewvc?rev=829293&view=rev
Log:
Bugzilla 48044 - added implementation for CountBlank function (patch from Mads Mohr Christensen)

Added:
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/functions/Countblank.java
    poi/trunk/test-data/spreadsheet/countblankExamples.xls   (with props)
Modified:
    poi/trunk/src/documentation/content/xdocs/status.xml
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/eval/FunctionEval.java
    poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java

Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=829293&r1=829292&r2=829293&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Sat Oct 24 00:41:30 2009
@@ -33,6 +33,7 @@
 
     <changes>
         <release version="3.6-beta1" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="add">48044 - added implementation for
CountBlank function</action>
            <action dev="POI-DEVELOPERS" type="fix">48036 - added IntersectionEval to
allow evaluation of the intersection formula operator</action>
            <action dev="POI-DEVELOPERS" type="fix">47999 - avoid un-needed call to
the JVM Garbage Collector when working on OOXML OPC Packages</action>
            <action dev="POI-DEVELOPERS" type="add">47922 - added example HSMF application
that converts a .msg file to text and extracts attachments</action>

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/eval/FunctionEval.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/eval/FunctionEval.java?rev=829293&r1=829292&r2=829293&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/eval/FunctionEval.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/eval/FunctionEval.java Sat Oct 24
00:41:30 2009
@@ -203,6 +203,7 @@
 
 		retval[345] = new Sumif();
 		retval[346] = new Countif();
+		retval[347] = new Countblank();
 
 		retval[359] = new Hyperlink();
 

Added: poi/trunk/src/java/org/apache/poi/hssf/record/formula/functions/Countblank.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/functions/Countblank.java?rev=829293&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/functions/Countblank.java (added)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/functions/Countblank.java Sat Oct
24 00:41:30 2009
@@ -0,0 +1,67 @@
+/* ====================================================================
+   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.hssf.record.formula.functions;
+
+import org.apache.poi.hssf.record.formula.eval.AreaEval;
+import org.apache.poi.hssf.record.formula.eval.BlankEval;
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.NumberEval;
+import org.apache.poi.hssf.record.formula.eval.RefEval;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+import org.apache.poi.hssf.record.formula.functions.CountUtils.I_MatchPredicate;
+
+/**
+ * Implementation for the function COUNTBLANK
+ * <p>
+ *  Syntax: COUNTBLANK ( range )
+ *    <table border="0" cellpadding="1" cellspacing="0" summary="Parameter descriptions">
+ *      <tr><th>range&nbsp;&nbsp;&nbsp;</th><td>is the
range of cells to count blanks</td></tr>
+ *    </table>
+ * </p>
+ *
+ * @author Mads Mohr Christensen
+ */
+public final class Countblank implements Function {
+
+	public ValueEval evaluate(ValueEval[] args, int srcRowIndex, short srcColumnIndex) {
+		if (args.length != 1) {
+			// TODO - it doesn't seem to be possible to enter COUNTBLANK() into Excel with the wrong
arg count
+			// perhaps this should be an exception
+			return ErrorEval.VALUE_INVALID;
+		}
+
+		double result;
+		ValueEval arg0 = args[0];
+		if (arg0 instanceof RefEval) {
+			result = CountUtils.countMatchingCell((RefEval) arg0, predicate);
+		} else if (arg0 instanceof AreaEval) {
+			result = CountUtils.countMatchingCellsInArea((AreaEval) arg0, predicate);
+		} else {
+			throw new IllegalArgumentException("Bad range arg type (" + arg0.getClass().getName()
+ ")");
+		}
+		return new NumberEval(result);
+	}
+
+	private static final I_MatchPredicate predicate = new I_MatchPredicate() {
+
+		public boolean matches(ValueEval valueEval) {
+			// Note - only BlankEval counts
+			return valueEval == BlankEval.INSTANCE;
+		}
+	};
+}

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java?rev=829293&r1=829292&r2=829293&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java
(original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java
Sat Oct 24 00:41:30 2009
@@ -46,6 +46,34 @@
 
 	private static final String NULL = null;
 
+	public void testCountBlank() {
+
+		AreaEval range;
+		ValueEval[] values;
+
+		values = new ValueEval[] {
+				new NumberEval(0),
+				new StringEval(""),	// note - does not match blank
+				BoolEval.TRUE,
+				BoolEval.FALSE,
+				ErrorEval.DIV_ZERO,
+				BlankEval.INSTANCE,
+		};
+		range = EvalFactory.createAreaEval("A1:B3", values);
+		confirmCountBlank(1, range);
+
+		values = new ValueEval[] {
+				new NumberEval(0),
+				new StringEval(""),	// note - does not match blank
+				BlankEval.INSTANCE,
+				BoolEval.FALSE,
+				BoolEval.TRUE,
+				BlankEval.INSTANCE,
+		};
+		range = EvalFactory.createAreaEval("A1:B3", values);
+		confirmCountBlank(2, range);
+	}
+
 	public void testCountA() {
 
 		ValueEval[] args;
@@ -196,6 +224,12 @@
 		double result = NumericFunctionInvoker.invoke(new Countif(), args);
 		assertEquals(expected, result, 0);
 	}
+	private static void confirmCountBlank(int expected, AreaEval range) {
+
+		ValueEval[] args = { range };
+		double result = NumericFunctionInvoker.invoke(new Countblank(), args);
+		assertEquals(expected, result, 0);
+	}
 
 	private static I_MatchPredicate createCriteriaPredicate(ValueEval ev) {
 		return Countif.createCriteriaPredicate(ev, 0, 0);
@@ -388,10 +422,14 @@
 	}
 
 	public void testCountifFromSpreadsheet() {
-		final String FILE_NAME = "countifExamples.xls";
-		final int START_ROW_IX = 1;
-		final int COL_IX_ACTUAL = 2;
-		final int COL_IX_EXPECTED = 3;
+		testCountFunctionFromSpreadsheet("countifExamples.xls", 1, 2, 3, "countif");
+	}
+
+	public void testCountBlankFromSpreadsheet() {
+		testCountFunctionFromSpreadsheet("countblankExamples.xls", 1, 3, 4, "countblank");
+	}
+
+	private static void testCountFunctionFromSpreadsheet(String FILE_NAME, int START_ROW_IX,
int COL_IX_ACTUAL, int COL_IX_EXPECTED, String functionName) {
 
 		int failureCount = 0;
 		HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook(FILE_NAME);
@@ -415,7 +453,8 @@
 		}
 
 		if (failureCount > 0) {
-			throw new AssertionFailedError(failureCount + " countif evaluations failed. See stderr
for more details");
+			throw new AssertionFailedError(failureCount + " " + functionName
+					+ " evaluations failed. See stderr for more details");
 		}
 	}
 }

Added: poi/trunk/test-data/spreadsheet/countblankExamples.xls
URL: http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/countblankExamples.xls?rev=829293&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/test-data/spreadsheet/countblankExamples.xls
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream



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


Mime
View raw message