From d4ec8ceb1120c574b2a1623a178ffa8db8fb3658 Mon Sep 17 00:00:00 2001
From: Josh Micich
Date: Tue, 13 Jan 2009 22:02:52 +0000
Subject: [PATCH] Bugzilla 46523 - added implementation for SUMIF
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@734252 13f79535-47bb-0310-9956-ffa450edef68
---
src/documentation/content/xdocs/changes.xml | 1 +
src/documentation/content/xdocs/status.xml | 1 +
.../hssf/record/formula/functions/Sumif.java | 140 +++++++++++++++---
.../poi/hssf/data/FormulaEvalTestData.xls | Bin 157184 -> 157184 bytes
4 files changed, 121 insertions(+), 21 deletions(-)
diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml
index 139b48f9a..0502ddc4b 100644
--- a/src/documentation/content/xdocs/changes.xml
+++ b/src/documentation/content/xdocs/changes.xml
@@ -37,6 +37,7 @@
+ 46523 - added implementation for SUMIF function
Support for reading HSSF column styles
Hook up POIXMLTextExtractor.getMetadataTextExtractor() to the already written POIXMLPropertiesTextExtractor
46472 - Avoid NPE in HPSFPropertiesExtractor when no properties exist
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml
index 1af660ed7..aaab68a12 100644
--- a/src/documentation/content/xdocs/status.xml
+++ b/src/documentation/content/xdocs/status.xml
@@ -34,6 +34,7 @@
+ 46523 - added implementation for SUMIF function
Support for reading HSSF column styles
Hook up POIXMLTextExtractor.getMetadataTextExtractor() to the already written POIXMLPropertiesTextExtractor
46472 - Avoid NPE in HPSFPropertiesExtractor when no properties exist
diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/Sumif.java b/src/java/org/apache/poi/hssf/record/formula/functions/Sumif.java
index 11cb02315..5255cda28 100644
--- a/src/java/org/apache/poi/hssf/record/formula/functions/Sumif.java
+++ b/src/java/org/apache/poi/hssf/record/formula/functions/Sumif.java
@@ -1,25 +1,123 @@
-/*
-* 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.
-*/
-/*
- * Created on May 15, 2005
- *
- */
+/* ====================================================================
+ 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;
-public class Sumif extends NotImplementedFunction {
+import org.apache.poi.hssf.record.formula.eval.AreaEval;
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.Eval;
+import org.apache.poi.hssf.record.formula.eval.EvaluationException;
+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 Excel function SUMIF
+ *
+ * Syntax :
+ * SUMIF ( range, criteria, sum_range )
+ *
+ * range | The range over which criteria is applied. Also used for addend values when the third parameter is not present |
+ * criteria | The value or expression used to filter rows from range |
+ * sum_range | Locates the top-left corner of the corresponding range of addends - values to be added (after being selected by the criteria) |
+ *
+ *
+ * @author Josh Micich
+ */
+public final class Sumif implements Function {
+
+ public Eval evaluate(Eval[] args, int srcRowIndex, short srcColumnIndex) {
+ if (args.length < 2) {
+ return ErrorEval.VALUE_INVALID;
+ }
+
+ AreaEval aeRange;
+ AreaEval aeSum;
+ try {
+ aeRange = convertRangeArg(args[0]);
+
+ switch (args.length) {
+ case 2:
+ aeSum = aeRange;
+ break;
+ case 3:
+ aeSum = createSumRange(args[2], aeRange);
+ break;
+ default:
+ return ErrorEval.VALUE_INVALID;
+ }
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ I_MatchPredicate mp = Countif.createCriteriaPredicate(args[1], srcRowIndex, srcRowIndex);
+ double result = sumMatchingCells(aeRange, mp, aeSum);
+ return new NumberEval(result);
+ }
+
+ private static double sumMatchingCells(AreaEval aeRange, I_MatchPredicate mp, AreaEval aeSum) {
+ int height=aeRange.getHeight();
+ int width= aeRange.getWidth();
+
+ double result = 0.0;
+ for (int r=0; rMgh!$lv$ij-SDzXa_T#bZPV5Noxlubv|HVB$(DHEyMniw;z
z|EVR4eaNGdhUZ9#ZQ2a7Q`a%E-DX6=;)t!a&V*R)q!mnsg(fD1$oAYtqs{ns9`AeK
zIp;g~oO{n3JlzIQx1r9>#y~A8X1_RIZNhd|#q`zg_a}G#MA<0zFmA7d=q9VVn|)ko&MkZ1np7
zm;Ix0T$cWNdBj#5yYQ(}vvBHTRXUkC3Q9MZZ{Ae&!wUBcn>KIS4Uw?xTZ(t#O+4sr
zdSXjX%}@Z~#(x2heGYJb3}Askm=%U_Ee0Vh4q@;ygf=sRW}#wI5LVAZC`m*3TP8y3
z0)!7-2$PBtnpYyc_5#8Wsu4DBM!=U5{_Q~s>>_(D!k&W&`x_9_T1e+@gregJFP_49
zC_0NUa)qkAhLHL%gu|bZVF2NcAyj+f*#>X?)YM`ns1
zDZA{{bm{A@Jhdk(@-Fo}NcY`fFzEg2-0?&N<=s9FgWlr)#UiAs+)n2n%68^<7H>R}EA=)Mk+fCPe*WdQyBMt?yVgn{tu{p5ZZjF5uR1<>IQO
zN{nRuSfUyu+C&S5`r3_{o5uY|ZR)4l_*Z_N!1?+3PjQmA+Slg56H`SSLA7!PT6qk~
z9a@3&x#vHX>cti45RF;QT#YEjd7?+6C8d}ltl5ONl%iW4lOh*OaX3m`{&OZ*JIXPe
zm#JJGE62x0iS(OafmYEb*R-YrXNm3vLUj@yYqSaVbOrgj>2#=fD)3eA_Gs!)*I*`(
z-LCoGS%a={Q71({`w^xKzYI;SqQYL13x2K&(?qpgz`iP6o6Zwy?L&vr&Fi;oYGD%=
zijy+5z6qCd>kiF#tqDy+6w1&qo2gbi`Onm-*2_CIwM?U0JEebg!bdmXq=cw}`c
zXYm=nnrvInVj)LjJ~)d-qD_`G=^W;XfLzzAbC@lhQd2pH-w`nmLbuOR9*_}pIX_Ww_1alw+g|PLX324tl>KGucV16D7Ox6=z!dHa`FqyvCPS{3+#91^XQ`&eZbll53PCcyb(=OsjgwSM#zxoj4
zMWaNgKg0x4C(%D7YLOkoUOGRoNiMyYIJ-n8gm__!P5p5%ZCj#jPHQi1b2T;nQZLRG
zR_Vn)LW@Y0$SRRZqGvwB9>eY!`WWDD$n>RN!?z3~Mp}AqlBS2cICK-!c^?5wA00%G
z+zodhW(rR_rPFq)4Q>{do3Gri1wuS(mu*)*j!T@G)Db4PF7fwL`lGTzk)f8xZXGNJywBF7vvQbxbj>J>{;}4JbYWCjQJ%?axAWS
zu8e|t_UwWs_W9#CS(fIJVX@0mu-NW$*)#0&w!3`4d7e!{-yh1@Q>f!+`d7{uUCxHZ
F{{SgS*3$q0
delta 2397
zcmZuzdrVYk7C-0vJ{~hX#4YkzM;%A%P61&C6bFSmmWSA&%sOO);uZyrV9AyUn_93s
zYSpBR6?LK;eVgvu&Y+!deN^9+wsjFxQ(
zo91G)vKbUEAQqYt00c}28fX8wykdxsOhyC;d?B8ATrn(sB4IE-7K_uC7-v!y%^+je
zk198eG2sZSeyR~2S@m<-zZoCP($y!!8dAmB_uAeS@pF$TP8jkGXw!-b_WcnTUahF*kM(tvcS#O<`
zF#u(beLHO?!SUOJ3j9s=Ypzp*)ny=N~HFU~D>|J2h6H#&RJ${2Hm!wF5e18AMihkda01}0X)XbEdjdX_{S=e+DO}Q1
zxMbA#k%VHCuk~(Jlq#fl>1Pa>q-q%rF!C@8Hxg=Mw33i)OY-W~M*OvUkE!!){D9G@
z5mQwMA-_2cS0zhxZ=+tm9RDeu1RM^$scNam{`r~M8Lw&x>i^k*R@p&v(v8cdbKI?G
zyV0Q_)~oc_+?cLH8FjePuA&&-a$~WoVv+1(oQP1?1*btzFUJhoP%QMCa$Kh3*zZ(1
zT2&YC=}I|1r%EKDDMr@z6sadwkY7JN7QM0pUzaT(SSz7H{_k0&UUKR$>{g(RBH*R`l=lx7D*^=)dw!%
z3gx-bsPwrP(Iu~w+V3vnt1>`f=psHZJ=I?Qxl6cRfkx%ET*CDdlD+z^OIRS8v2|mi
zs^ywI-I$|_d1Kw(n4#KO6npSDs(_Q1_E4hFTPecZgD&M_ztJA*f{U%@%eX4Sv(YR0
z)rbw6^XOOl)MZ?#AGwSl%ND9^WiKV}r}~?Eu_P#w$9+){5BMaFFs~AVc=&hIOg~=D
z*!+9@@NSqYypCLMmUO!9(lRx+xo-(LpwtO-~nnP4m
z-w>uq*yPo5nC7CNdy_tlX{w7mS3QhNrHwMT4O3<-2mWgq7t3h!pJM+6rfeg)SZ(2L
zZ5p9%nQ2=GM{tR>lGkS=QIo>Xz1GjRe_Lgj}PPzyyrVk5UL;r`6C-b^Re$|3x&<3O-2#v2FIx3}yaf
zQ6e@X_}nuB#$x>xGhe7^?n~bSQK~>uO{r#KRRONJ)GT(YaOSRr4>k3&cIpD|1AZeFGH18rT4CkZp0;9qF0&%(R)4_%%7%
smi(Ojyu6&{%j`M%c6%=WYtnnn*aa+