SequenceType::Ptr RemoveFN::staticType() const { const SequenceType::Ptr opType(m_operands.first()->staticType()); const Cardinality c(opType->cardinality()); if(c.minimum() == 0) return makeGenericSequenceType(opType->itemType(), c); else { return makeGenericSequenceType(opType->itemType(), Cardinality::fromRange(c.minimum() - 1, c.maximum())); } }
Expression::Ptr CountFN::compress(const StaticContext::Ptr &context) { const Expression::Ptr me(FunctionCall::compress(context)); if(me != this) return me; const Cardinality card(m_operands.first()->staticType()->cardinality()); if(card.isExactlyOne()) return wrapLiteral(CommonValues::IntegerOne, context, this); else if(card.isEmpty()) { /* One might think that if the operand is (), that compress() would have * evaluated us and therefore this line never be reached, but "()" can * be combined with the DisableElimination flag. */ return wrapLiteral(CommonValues::IntegerZero, context, this); } else if(card.isExact()) return wrapLiteral(Integer::fromValue(card.minimum()), context, this); else return me; }