Fix from Josh from bug #44421 - Update Match function to properly support Area references
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@628035 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e113d12d34
commit
8bbaecfd84
@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
<!-- Don't forget to update status.xml too! -->
|
<!-- Don't forget to update status.xml too! -->
|
||||||
<release version="3.1-beta1" date="2008-??-??">
|
<release version="3.1-beta1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="fix">44421 - Update Match function to properly support Area references</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44417 - Improved handling of references for the need to quote the sheet name for some formulas, but not when fetching a sheet by name</action>
|
<action dev="POI-DEVELOPERS" type="fix">44417 - Improved handling of references for the need to quote the sheet name for some formulas, but not when fetching a sheet by name</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44413 - Fix for circular references in INDEX, OFFSET, VLOOKUP formulas, where a cell is actually allowed to reference itself</action>
|
<action dev="POI-DEVELOPERS" type="fix">44413 - Fix for circular references in INDEX, OFFSET, VLOOKUP formulas, where a cell is actually allowed to reference itself</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44403 - Fix for Mid function handling its arguments wrong</action>
|
<action dev="POI-DEVELOPERS" type="fix">44403 - Fix for Mid function handling its arguments wrong</action>
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
<!-- Don't forget to update changes.xml too! -->
|
<!-- Don't forget to update changes.xml too! -->
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.1-beta1" date="2008-??-??">
|
<release version="3.1-beta1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="fix">44421 - Update Match function to properly support Area references</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44417 - Improved handling of references for the need to quote the sheet name for some formulas, but not when fetching a sheet by name</action>
|
<action dev="POI-DEVELOPERS" type="fix">44417 - Improved handling of references for the need to quote the sheet name for some formulas, but not when fetching a sheet by name</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44413 - Fix for circular references in INDEX, OFFSET, VLOOKUP formulas, where a cell is actually allowed to reference itself</action>
|
<action dev="POI-DEVELOPERS" type="fix">44413 - Fix for circular references in INDEX, OFFSET, VLOOKUP formulas, where a cell is actually allowed to reference itself</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44403 - Fix for Mid function handling its arguments wrong</action>
|
<action dev="POI-DEVELOPERS" type="fix">44403 - Fix for Mid function handling its arguments wrong</action>
|
||||||
|
@ -26,7 +26,6 @@ import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
|
|||||||
import org.apache.poi.hssf.record.formula.eval.RefEval;
|
import org.apache.poi.hssf.record.formula.eval.RefEval;
|
||||||
import org.apache.poi.hssf.record.formula.eval.StringEval;
|
import org.apache.poi.hssf.record.formula.eval.StringEval;
|
||||||
import org.apache.poi.hssf.record.formula.eval.ValueEval;
|
import org.apache.poi.hssf.record.formula.eval.ValueEval;
|
||||||
import org.apache.poi.hssf.util.AreaReference;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation for the MATCH() Excel function.<p/>
|
* Implementation for the MATCH() Excel function.<p/>
|
||||||
@ -188,7 +187,7 @@ public final class Match implements Function {
|
|||||||
private static double evaluateMatchTypeArg(Eval arg, int srcCellRow, short srcCellCol)
|
private static double evaluateMatchTypeArg(Eval arg, int srcCellRow, short srcCellCol)
|
||||||
throws EvalEx {
|
throws EvalEx {
|
||||||
Eval match_type = arg;
|
Eval match_type = arg;
|
||||||
if(arg instanceof AreaReference) {
|
if(arg instanceof AreaEval) {
|
||||||
AreaEval ae = (AreaEval) arg;
|
AreaEval ae = (AreaEval) arg;
|
||||||
// an area ref can work as a scalar value if it is 1x1
|
// an area ref can work as a scalar value if it is 1x1
|
||||||
if(ae.isColumn() && ae.isRow()) {
|
if(ae.isColumn() && ae.isRow()) {
|
||||||
|
@ -21,6 +21,7 @@ import junit.framework.TestCase;
|
|||||||
|
|
||||||
import org.apache.poi.hssf.record.formula.AreaPtg;
|
import org.apache.poi.hssf.record.formula.AreaPtg;
|
||||||
import org.apache.poi.hssf.record.formula.eval.Area2DEval;
|
import org.apache.poi.hssf.record.formula.eval.Area2DEval;
|
||||||
|
import org.apache.poi.hssf.record.formula.eval.AreaEval;
|
||||||
import org.apache.poi.hssf.record.formula.eval.BoolEval;
|
import org.apache.poi.hssf.record.formula.eval.BoolEval;
|
||||||
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
|
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.Eval;
|
||||||
@ -53,6 +54,13 @@ public final class TestMatch extends TestCase {
|
|||||||
NumericValueEval nve = (NumericValueEval)actualEval;
|
NumericValueEval nve = (NumericValueEval)actualEval;
|
||||||
assertEquals(expected, nve.getNumberValue(), 0);
|
assertEquals(expected, nve.getNumberValue(), 0);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Convenience method
|
||||||
|
* @return <code>new Area2DEval(new AreaPtg(ref), values)</code>
|
||||||
|
*/
|
||||||
|
private static AreaEval createAreaEval(String ref, ValueEval[] values) {
|
||||||
|
return new Area2DEval(new AreaPtg(ref), values);
|
||||||
|
}
|
||||||
|
|
||||||
public void testSimpleNumber() {
|
public void testSimpleNumber() {
|
||||||
|
|
||||||
@ -64,9 +72,7 @@ public final class TestMatch extends TestCase {
|
|||||||
new NumberEval(25),
|
new NumberEval(25),
|
||||||
};
|
};
|
||||||
|
|
||||||
AreaPtg areaPtg = new AreaPtg("A1:A5");
|
AreaEval ae = createAreaEval("A1:A5", values);
|
||||||
Area2DEval ae = new Area2DEval(areaPtg, values);
|
|
||||||
|
|
||||||
|
|
||||||
confirmInt(2, invokeMatch(new NumberEval(5), ae, MATCH_LARGEST_LTE));
|
confirmInt(2, invokeMatch(new NumberEval(5), ae, MATCH_LARGEST_LTE));
|
||||||
confirmInt(2, invokeMatch(new NumberEval(5), ae, MATCH_EXACT));
|
confirmInt(2, invokeMatch(new NumberEval(5), ae, MATCH_EXACT));
|
||||||
@ -86,9 +92,7 @@ public final class TestMatch extends TestCase {
|
|||||||
new NumberEval(4),
|
new NumberEval(4),
|
||||||
};
|
};
|
||||||
|
|
||||||
AreaPtg areaPtg = new AreaPtg("A1:A5");
|
AreaEval ae = createAreaEval("A1:A5", values);
|
||||||
Area2DEval ae = new Area2DEval(areaPtg, values);
|
|
||||||
|
|
||||||
|
|
||||||
confirmInt(2, invokeMatch(new NumberEval(10), ae, MATCH_SMALLEST_GTE));
|
confirmInt(2, invokeMatch(new NumberEval(10), ae, MATCH_SMALLEST_GTE));
|
||||||
confirmInt(2, invokeMatch(new NumberEval(10), ae, MATCH_EXACT));
|
confirmInt(2, invokeMatch(new NumberEval(10), ae, MATCH_EXACT));
|
||||||
@ -108,8 +112,7 @@ public final class TestMatch extends TestCase {
|
|||||||
new StringEval("Ian"),
|
new StringEval("Ian"),
|
||||||
};
|
};
|
||||||
|
|
||||||
AreaPtg areaPtg = new AreaPtg("A1:A5");
|
AreaEval ae = createAreaEval("A1:A5", values);
|
||||||
Area2DEval ae = new Area2DEval(areaPtg, values);
|
|
||||||
|
|
||||||
// Note String comparisons are case insensitive
|
// Note String comparisons are case insensitive
|
||||||
confirmInt(3, invokeMatch(new StringEval("Ed"), ae, MATCH_LARGEST_LTE));
|
confirmInt(3, invokeMatch(new StringEval("Ed"), ae, MATCH_LARGEST_LTE));
|
||||||
@ -129,8 +132,7 @@ public final class TestMatch extends TestCase {
|
|||||||
BoolEval.TRUE,
|
BoolEval.TRUE,
|
||||||
};
|
};
|
||||||
|
|
||||||
AreaPtg areaPtg = new AreaPtg("A1:A4");
|
AreaEval ae = createAreaEval("A1:A4", values);
|
||||||
Area2DEval ae = new Area2DEval(areaPtg, values);
|
|
||||||
|
|
||||||
// Note String comparisons are case insensitive
|
// Note String comparisons are case insensitive
|
||||||
confirmInt(2, invokeMatch(BoolEval.FALSE, ae, MATCH_LARGEST_LTE));
|
confirmInt(2, invokeMatch(BoolEval.FALSE, ae, MATCH_LARGEST_LTE));
|
||||||
@ -157,8 +159,7 @@ public final class TestMatch extends TestCase {
|
|||||||
new StringEval("Ed"),
|
new StringEval("Ed"),
|
||||||
};
|
};
|
||||||
|
|
||||||
AreaPtg areaPtg = new AreaPtg("A1:A13");
|
AreaEval ae = createAreaEval("A1:A13", values);
|
||||||
Area2DEval ae = new Area2DEval(areaPtg, values);
|
|
||||||
|
|
||||||
assertEquals(ErrorEval.NA, invokeMatch(new StringEval("Aaron"), ae, MATCH_LARGEST_LTE));
|
assertEquals(ErrorEval.NA, invokeMatch(new StringEval("Aaron"), ae, MATCH_LARGEST_LTE));
|
||||||
|
|
||||||
@ -181,4 +182,34 @@ public final class TestMatch extends TestCase {
|
|||||||
confirmInt(12, invokeMatch(BoolEval.TRUE, ae, MATCH_LARGEST_LTE));
|
confirmInt(12, invokeMatch(BoolEval.TRUE, ae, MATCH_LARGEST_LTE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensures that the match_type argument can be an <tt>AreaEval</tt>.<br/>
|
||||||
|
* Bugzilla 44421
|
||||||
|
*/
|
||||||
|
public void testMatchArgTypeArea() {
|
||||||
|
|
||||||
|
ValueEval[] values = {
|
||||||
|
new NumberEval(4),
|
||||||
|
new NumberEval(5),
|
||||||
|
new NumberEval(10),
|
||||||
|
new NumberEval(10),
|
||||||
|
new NumberEval(25),
|
||||||
|
};
|
||||||
|
|
||||||
|
AreaEval ae = createAreaEval("A1:A5", values);
|
||||||
|
|
||||||
|
AreaEval matchAE = createAreaEval("C1:C1", new ValueEval[] { MATCH_LARGEST_LTE, });
|
||||||
|
|
||||||
|
try {
|
||||||
|
confirmInt(4, invokeMatch(new NumberEval(10), ae, matchAE));
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
if(e.getMessage().startsWith("Unexpected match_type type")) {
|
||||||
|
// identified bug 44421
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
// some other error ??
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user