ValueExpr arg = countOp.getArg();
if (arg != null) {
Set<Value> values = makeValueSet(strategy, arg, bindingSets);
return new LiteralImpl(Integer.toString(values.size()), XMLSchema.INTEGER);
}
else {
return new LiteralImpl(Integer.toString(bindingSets.size()), XMLSchema.INTEGER);
}
}
else if (operator instanceof Min) {
Min minOp = (Min)operator;
Set<Value> values = makeValueSet(strategy, minOp.getArg(), bindingSets);
// FIXME: handle case where 'values' is empty
double min = Double.POSITIVE_INFINITY;
for (Value v : values) {
if (v instanceof Literal) {
Literal l = (Literal)v;
try {
min = Math.min(min, Double.parseDouble(l.getLabel()));
}
catch (NumberFormatException e) {
// ignore
}
}
}
return new LiteralImpl(Double.toString(min), XMLSchema.DOUBLE);
}
else if (operator instanceof Max) {
Max maxOp = (Max)operator;
Set<Value> values = makeValueSet(strategy, maxOp.getArg(), bindingSets);
// FIXME: handle case where 'values' is empty
double max = Double.NEGATIVE_INFINITY;
for (Value v : values) {
if (v instanceof Literal) {
Literal l = (Literal)v;
try {
max = Math.max(max, Double.parseDouble(l.getLabel()));
}
catch (NumberFormatException e) {
// ignore
}
}
}
return new LiteralImpl(Double.toString(max), XMLSchema.DOUBLE);
}
return null;
}