package org.basex.query.flwor;
import org.basex.query.QueryException;
import org.basex.query.item.Item;
import org.basex.query.item.Value;
import org.basex.util.InputInfo;
/**
* GroupNode defines one valid partitioning setting.
*
* @author BaseX Team 2005-12, BSD License
* @author Michael Seiferle
*/
final class GroupNode {
/** Cached hash code. */
private final int hash;
/** List of grouping values. */
final Value[] vals;
/**
* Creates a group node.
* @param ii input info
* @param vl grouping values
* @throws QueryException query exception
*/
GroupNode(final InputInfo ii, final Value[] vl) throws QueryException {
vals = vl;
int h = 0;
for(final Value v : vals) h = (h << 5) - h + v.hash(ii);
hash = h;
}
/**
* Checks the nodes for equality.
* @param c second group node
* @return result of check
* @throws QueryException query exception
*/
boolean eq(final GroupNode c) throws QueryException {
if(vals.length != c.vals.length) return false;
for(int i = 0; i < vals.length; ++i) {
final boolean it = vals[i].isItem();
if(it ^ c.vals[i].isItem() || it &&
!((Item) vals[i]).equiv(null, (Item) c.vals[i])) return false;
}
return true;
}
/**
* Returns the hash code of this node.
* @return hash code
*/
public int hash() {
return hash;
}
}