long start = System.currentTimeMillis();
	public NodeSet[] getNodesExact(DocumentSet docs, String[] expr) {		long start = System.currentTimeMillis();		ArraySet[] result = new ArraySet[expr.length];		DocumentImpl doc;		Value ref;		Value value;		byte[] data;		long gid;		int docId;		int len;		long last;		long delta;		String term;		Collection collection;		short collectionId;		VariableByteInputStream is;		Lock lock = dbWords.getLock();		for (int i = 0; i < expr.length; i++) {			if (expr[i] == null)				continue;			if (stoplist.contains(expr[i]))				continue;			term =				(stem)					? stemmer.stem(expr[i].toLowerCase())					: expr[i].toLowerCase();			result[i] = new ArraySet(1000);			for (Iterator iter = docs.getCollectionIterator();				iter.hasNext();				) {				collection = (Collection) iter.next();				collectionId = collection.getId();				ref = new WordRef(collectionId, term);				try {					lock.acquire(this);					lock.enter(this);					value = dbWords.get(ref);				} catch (LockException e) {					LOG.warn("could not acquire lock on words db", e);					value = null;				} finally {					lock.release(this);				}				if (value == null) {					continue;				}				data = value.getData();				is = new VariableByteInputStream(data);				try {					while (is.available() > 0) {						docId = is.readInt();						len = is.readInt();						if ((doc = docs.getDoc(docId)) == null) {							is.skip(len);							continue;						}						last = 0;						for (int j = 0; j < len; j++) {							delta = is.readLong();							gid = last + delta;							last = gid;							result[i].add(								new NodeProxy(doc, gid, Node.TEXT_NODE));						}					}				} catch (EOFException e) {				}			}			//( (ArraySet) result[i] ).setIsSorted( true );						LOG.debug("found: " + result[i].getLength() + " in "						 + (System.currentTimeMillis() - start)						 + "ms.");		}		return result;	}