Value value;
	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;		InputStream dis = null;		NodeProxy p;		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();					//value = dbWords.get(ref);					dis = dbWords.getAsStream(ref);				} catch (LockException e) {					LOG.warn("could not acquire lock on words db", e);					//value = null;					dis = null;				} finally {					lock.release();				}				if (dis == null) {					continue;				}				//data = value.getData();				is = new VariableByteInputStream(dis);				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;							p = new NodeProxy(doc, gid, Node.TEXT_NODE);							p.addMatch(new Match(term, gid));							result[i].add(p);						}					}				} catch (EOFException e) {				} catch (IOException e) {				}			}			//( (ArraySet) result[i] ).setIsSorted( true );			LOG.debug(				"found "					+ expr[i]					+ ": "					+ result[i].getLength()					+ " in "					+ (System.currentTimeMillis() - start)					+ "ms.");		}		return result;	}