/*
 * KeywordLocation
 * 索引語が出現する位置情報を記録する構造体
 * 文書番号と出現位置を格納できる
 */
package org.logical_paradox.fts;

import java.io.Serializable;
import java.nio.ByteBuffer;

import org.logical_paradox.common.io.ByteStream;
import org.logical_paradox.common.lang.VariableFormatNumber;

public class KeywordLocation implements ByteStream, Serializable {
	public int _dicno;
	public int _pos;
	public String _str;

	public KeywordLocation( int dicno, int pos ) {
		_dicno = dicno;
		_pos = pos;

		_str = new String( "[" + dicno + "]" + pos );
	}
	/**
	 * コンストラクタ
	 * 指定されたバイト列から索引語位置情報を復元する
	 * @param bstream バイト列
	 */
	public KeywordLocation(byte[] bstream) {
		createObjectFromByteStream(bstream);
	}
	protected int findNextNumber(byte[] bstream, int offset) {
		while(offset < bstream.length) {
			if((bstream[offset] & 0x80) == 0) {
				return offset+1;
			}
			offset++;
		}
		return -1;
	}
	public String toString() {
		return _str;
	}
	/**
	 * この索引語位置情報をバイト列に変換する
	 * @return 変換されたバイト列
	 */
	public byte[] byteStream() {
		byte[] byteOfDicno = new VariableFormatNumber(_dicno).byteStream();
		byte[] byteOfPos = new VariableFormatNumber(_pos).byteStream();
		byte[] byteOfStr = _str.getBytes();

		// バイト列を格納するためのバッファを確保する
		ByteBuffer buffer = ByteBuffer.allocate(byteOfDicno.length + byteOfPos.length + byteOfStr.length);
		buffer.rewind();

		buffer.put(byteOfDicno);			// 文書番号の格納
		buffer.put(byteOfPos);				// 位置情報の格納
		buffer.put(byteOfStr);				// 文字列本体の格納

		// バイト列を返す
		return buffer.array();
	}
	/**
	 * バイト列からキー位置情報を復元する
	 * @param bstream バイト列
	 * @throws IllegalArgumentException バイト列からの復元に失敗した
	 */
	protected void createObjectFromByteStream(byte[] bstream) throws IllegalArgumentException {
		int offset = 0;
		_dicno = new VariableFormatNumber(bstream, offset).intValue();

		offset = findNextNumber(bstream, offset);
		_pos = new VariableFormatNumber(bstream, offset).intValue();

		offset = findNextNumber(bstream, offset);
		_str = new String(bstream,offset, bstream.length-offset);
	}
	/**
	 * レコード値を比較する
	 * @param o 比較対象
	 * @return true: 同じ / false:違う
	 */
	public boolean equals(Object o) {
		KeywordLocation l = (KeywordLocation)o;
		return
				_dicno == l._dicno &&
				_pos == l._pos &&
				_str.equals(l._str);
	}
	/**
	 * このレコードのサイズを返す
	 * @return レコードサイズ(バイト数)
	 */
	public int getRecordSize() {
		return byteStream().length;
	}
}

// end of KeywordLocation.java
