public Object call(List arguments, ExpressionContext context) {
SimpleData arg0 = getArg(arguments, 0);
if (!(arg0 instanceof ResultSetData))
return null;
ResultSetData rs = (ResultSetData) arg0;
if (!rs.test())
return null;
List toFind = collapseLists(arguments, 1);
if (toFind.isEmpty())
return null;
boolean sum = false;
String targetColName = asStringVal(toFind.remove(toFind.size() - 1));
if (targetColName.toLowerCase().startsWith("sum(")
&& targetColName.endsWith(")")) {
sum = true;
targetColName = targetColName.substring(4,
targetColName.length() - 1);
}
int targetCol = rs.getColumnPos(targetColName);
if (targetCol == -1)
return null;
int[] findColumns = new int[toFind.size()];
String[] findValues = new String[toFind.size()];
for (int i = 0; i < findColumns.length; i++) {
String findItem = asString(toFind.get(i));
int eqPos = findItem.indexOf('=');
if (eqPos == -1)
return null;
String findColumnName = findItem.substring(0, eqPos);
findColumns[i] = rs.getColumnPos(findColumnName);
if (findColumns[i] == -1)
return null;
findValues[i] = findItem.substring(eqPos + 1);
}
double sumResult = 0;
List<Object[]> rawResultData = rs.getData();
for (Object[] oneRow : rawResultData) {
if (matches(oneRow, findColumns, findValues)) {
if (targetCol >= oneRow.length) {
return null;
} else if (sum) {