lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From luc...@nitwit.de
Subject Re: ValueListHandler pattern with Lucene
Date Mon, 12 Apr 2004 18:54:15 GMT
On Sunday 11 April 2004 17:46, Erik Hatcher wrote:
> In other words, you need to invent your own "pattern" here?!  :)

I just experimented a bit and came up with the ValueListSupplier which 
replaces the ValueList in the VLH. Seems to work so far... :-) Comments are 
greatly appreciated!

Timo

public class ValueListSupplier implements IValueListIterator
{
	private final Log log = LogFactory.getLog(this.getClass());

	// TODO junit test case
	private Hits hits;
	protected BitSet fetched;
	protected List list;
	protected int index;
	
	public ValueListSupplier(Hits hits)
	{
		int size = hits.length();
		this.list = new ArrayList(size);
		// stupid idiots at SUN
		for (int i = 0; i < size; i++) list.add(null);
		this.fetched = new BitSet();
		this.hits = hits;
		this.index = 0;
	}

	public List getList()
	{
		return list;
	}

	public int size()
	{
		return list.size();
	}

	public boolean hasPrevious()
	{
		return index > 0;
	}

	public boolean hasNext()
	{
		return index < size();
	}

	/**
	 * @param index
	 */
	public synchronized void move(int index)
	{
		this.index = index;
	}

	public void reset()
	{
		move(0);
	}

	public Object current()
	{
		validate(index, index + 1);
		return list.get(index);
	}

	public List previous(int count)
	{
		int from = Math.max(0, index - count);
		int to = index;

		validate(from, to);
		move(from);
		return list.subList(from, to);
	}

	public List next(int count)
	{
		int from = index;
		int to = Math.min(Math.max(0, size() - 1), index + count);

		validate(from, to);
		move(to);
		return list.subList(from, to);
	}

	/**
	 * @param from
	 *                 starting index (inclusive)
	 * @param to
	 *                 ending index (exclusive)
	 */
	private void validate(int from, int to)
	{
		while ((from = fetched.nextClearBit(from)) < to)
		{
			log.debug("fetching #" + from);

			try
			{
				list.set(from, SearchResultAdapter.wrap(hits.doc(from)));
				fetched.set(from);
			}
			catch (IOException e)
			{
				// TODO potentially bug
				e.printStackTrace();
			}
		}
	}

}

---------------------------------------------------------------------
To unsubscribe, e-mail: lucene-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: lucene-user-help@jakarta.apache.org


Mime
View raw message