/* (non-Javadoc)
  * @see org.exist.xquery.value.AtomicValue#compareTo(int, org.exist.xquery.value.AtomicValue)
  */
 public boolean compareTo(Collator collator, int operator, AtomicValue other)
     throws XPathException {
   if (other.isEmpty()) return false;
   if (Type.subTypeOf(other.getType(), Type.STRING)
       || Type.subTypeOf(other.getType(), Type.UNTYPED_ATOMIC)) {
     int cmp = Collations.compare(collator, value, other.getStringValue());
     switch (operator) {
       case Constants.EQ:
         return cmp == 0;
       case Constants.NEQ:
         return cmp != 0;
       case Constants.LT:
         return cmp < 0;
       case Constants.LTEQ:
         return cmp <= 0;
       case Constants.GT:
         return cmp > 0;
       case Constants.GTEQ:
         return cmp >= 0;
       default:
         throw new XPathException("Type error: cannot apply operand to string value");
     }
   }
   throw new XPathException(
       "Type error: operands are not comparable; expected xdt:untypedAtomic; got "
           + Type.getTypeName(other.getType()));
 }
 /* (non-Javadoc)
  * @see org.exist.xquery.value.AtomicValue#min(org.exist.xquery.value.AtomicValue)
  */
 public AtomicValue min(Collator collator, AtomicValue other) throws XPathException {
   if (Type.subTypeOf(other.getType(), Type.UNTYPED_ATOMIC))
     return Collations.compare(collator, value, ((UntypedAtomicValue) other).value) < 0
         ? this
         : other;
   else return Collations.compare(collator, value, other.getStringValue()) < 0 ? this : other;
 }
 /* (non-Javadoc)
  * @see java.lang.Comparable#compareTo(java.lang.Object)
  */
 public int compareTo(Object o) {
   final AtomicValue other = (AtomicValue) o;
   if (Type.subTypeOf(other.getType(), Type.DATE_TIME))
     try {
       // TODO : find something that will consume less resources
       return calendar.compare(
           TimeUtils.getInstance().newXMLGregorianCalendar(other.getStringValue()));
     } catch (XPathException e) {
       System.out.println("Failed to get string value of '" + other + "'");
       // Why not ?
       return Constants.SUPERIOR;
     }
   else return getType() > other.getType() ? Constants.SUPERIOR : Constants.INFERIOR;
 }
 public MemoryNodeSet toMemNodeSet() throws XPathException {
   if (count == 0) {
     return MemoryNodeSet.EMPTY;
   }
   if (itemType == Type.ANY_TYPE || !Type.subTypeOf(itemType, Type.NODE)) {
     throw new XPathException(
         "Type error: the sequence cannot be converted into"
             + " a node set. Item type is "
             + Type.getTypeName(itemType));
   }
   NodeValue v;
   for (int i = 0; i <= count; i++) {
     v = (NodeValue) items[i];
     if (v.getImplementationType() == NodeValue.PERSISTENT_NODE) {
       return null;
     }
   }
   return new ValueSequence(this);
 }
 /* (non-Javadoc)
  * @see org.exist.xquery.value.Sequence#toNodeSet()
  */
 public NodeSet toNodeSet() throws XPathException {
   // for this method to work, all items have to be nodes
   if (itemType != Type.ANY_TYPE && Type.subTypeOf(itemType, Type.NODE)) {
     final NodeSet set = new ExtArrayNodeSet();
     // We can't make it from an ExtArrayNodeSet (probably because it is sorted ?)
     // NodeSet set = new ArraySet(100);
     for (int i = 0; i < this.count; i++) {
       NodeValue v = null;
       final Entry temp = items[i];
       v = (NodeValue) temp.item;
       if (v.getImplementationType() != NodeValue.PERSISTENT_NODE) {
         set.add((NodeProxy) v);
       } else {
         set.add((NodeProxy) v);
       }
     }
     return set;
   } else {
     throw new XPathException(
         "Type error: the sequence cannot be converted into"
             + " a node set. Item type is "
             + Type.getTypeName(itemType));
   }
 }