/*
 * Parser
 */
package org.logical_paradox.fts;

import java.util.HashMap;


public class Parser {
	public final int gramLength;
	private final IndexAccessor accessor;
	private final HashMap cache;

	// コンストラクタ
	public Parser(IndexAccessor axsr, HashMap m, int length) {
		accessor = axsr;
		gramLength = length;
		cache = m;
	}

	// 解析結果の取得
	public HashMap getResult() {
		return cache;
	}
	// パーザー
	public void parse(String txt, int dicno) throws IndexAccessException {
		int loopCnt = txt.length() - gramLength;
		if( loopCnt < 0 ) {
			throw new IndexAccessException( "与えられた文字列の長さに対してN-gram分割数が大きすぎます" );
		}

		for( int cnt = 0; cnt < txt.length(); cnt++ ) {									// C v1.1 2003-12-13
			int tokenLength = gramLength - ((cnt-loopCnt) <= 0 ? 0 : cnt-loopCnt);			// C v1.1 2003-12-13
			String token = txt.substring( cnt, cnt + tokenLength );							// C v1.1 2003-12-13
			if( token.length() < gramLength ) {
				System.err.println( token.length() + ":" + token );
			}

			Key key = new InvertedIndexKey(token);

			// キャッシュされていないので，アクセサから取得する
			synchronized (cache) {
				KeywordLocationArray pos = (KeywordLocationArray)cache.get(key);

				if(pos == null) {
					// キャッシュに存在しない場合，ファイルから取得してみる
					pos = (KeywordLocationArray)accessor.getValue(key);
					if(pos == null) {
						// ファイルにすら存在しない場合，新しく領域を作成する
						pos = new KeywordLocationArray();
					}
				}

				pos.add(new KeywordLocation(dicno, cnt));
				cache.put(key, pos);
			}
		}
	}
}

// end of Parser.java
