/*
 * FullTextSearch
 * 全文検索アプリケーション
 */
package org.logical_paradox.fts;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.Vector;

/**
 * 索引語の出現位置を文書番号ごとに管理している配列<p>
 * 
 * locations[dicno][n] = KeywordLocation の形式で管理している．<br>
 * dicno = 文書番号，n = 連番<br>
 * 従って，文書番号3の位置情報全てを取得する場合，get(dicno)メソッドで取得できる．<br>
 * 
 * @author satoshi akabane@logical-paradox.org
 */
public class ParsedKeyLocation {
	private final Hashtable locations;
	public long docno;

	/**
	 * コンストラクタ
	 *
	 */
	public ParsedKeyLocation() {
		docno = 0;
		locations = new Hashtable();
	}
	/**
	 * 配列が空かどうかを返す
	 * 
	 * @return true:空 / false:空でない
	 */
	public boolean isEmpty() {
		return locations.isEmpty();
	}
	/**
	 * この配列に新しく索引語情報を追加する
	 * @param lo 追加する索引語情報
	 */
	public void add( KeywordLocation lo ) {
		Integer dn = new Integer( lo._dicno );
		Vector locationsInDocument = (Vector)locations.get(dn);
		if( locationsInDocument == null ) {
			locationsInDocument = new Vector();
		}
		locationsInDocument.addElement( lo );
		locations.put( dn, locationsInDocument );
	}
	/**
	 * この配列に新しく索引語情報の配列を追加する
	 * @param lo 追加する索引語情報の配列
	 */
	public void add( KeywordLocation[] lo ) {
		for( int i = 0; i < lo.length; i++ ) {
			add( lo[i] );
		}
	}
	/**
	 * 管理されている全ての索引語情報を返す
	 * @return 索引語情報の配列
	 */
	public KeywordLocation[] getLocations() {
		Iterator it = locations.keySet().iterator();
		Vector v = new Vector();
		Vector lo = null;

		while( it.hasNext() ) {
			Integer dn = (Integer)it.next();
			if( dn == null ) {
				continue;
			}
			if( dn != null && (lo = (Vector)locations.get(dn)) != null ) {
				v.addAll( lo );
			}
		}

		return (KeywordLocation[])v.toArray( new KeywordLocation[0] );
	}
	/**
	 * 指定された文書番号の索引語情報を全て返す
	 * @param dn 文書番号
	 * @return 取得された索引語情報(存在しない場合は[0]の配列が返る)
	 */
	public KeywordLocation[] get( int dn ) {
		Vector locationsInDocument = (Vector)locations.get( new Integer( dn ) );
		if( locationsInDocument == null ) {
			return new KeywordLocation[0];
		} else {
			return (KeywordLocation[])locationsInDocument.toArray( new KeywordLocation[0] );
		}
	}
}
