nodes[dx].addMatches(al.nodes[ax].match);
nodes[dx].addMatches(al.nodes[ax]);
	public NodeSet getChildrenX(		NodeSet ancestors,		int mode,		boolean rememberContext) {		if (!(ancestors instanceof ArraySet))			return super.selectParentChild(ancestors, mode, rememberContext);		ArraySet al = (ArraySet) ancestors;		if (al.counter == 0 || counter == 0) {			return new ArraySet(1);		}		long start = System.currentTimeMillis();		sort();		al.sort();		final ArraySet result = new ArraySet(al.counter);		// get a deep copy of array - will be modified		NodeProxy[] dl = null;		if (mode == DESCENDANT) {			dl = copyNodeSet(al, this);			result.sorted = true;		} else			dl = nodes;		//result.sorted = true;		int ax = 0;		int dx = 0;		final int dlen = dl.length;		int cmp;		getParentSet(dl, dlen);		while (dx < dlen) {			while (dl[dx] == null && ++dx < dlen);			if (dx == dlen)				break;			//			          System.out.println(			//			              dl[dx].doc.getDocId()			//			                  + ":"			//			                  + dl[dx].gid			//			                  + " = "			//			                  + al.nodes[ax].doc.getDocId()			//			                  + ':'			//			                  + al.nodes[ax].gid);			cmp = dl[dx].compareTo(al.nodes[ax]);			if (cmp > 0) {				if (ax < al.counter - 1)					ax++;				else					break;			} else if (cmp < 0)				dx++;			else {				switch (mode) {					case ANCESTOR :						al.nodes[ax].addMatches(dl[dx].match);						if (rememberContext)							al.nodes[ax].addContextNode(dl[dx]);						else							al.nodes[ax].copyContext(dl[dx]);						result.add(al.nodes[ax]);						break;					case DESCENDANT :						nodes[dx].addMatches(al.nodes[ax].match);						if (rememberContext)							nodes[dx].addContextNode(al.nodes[ax]);						else							nodes[dx].copyContext(al.nodes[ax]);						result.add(nodes[dx]);						break;				}				dx++;			}		}		LOG.debug(			"getChildren found "				+ result.getLength()				+ " in "				+ (System.currentTimeMillis() - start)				+ "ms.");		return result;	}