/*
 * InvertedIndexKey
 * 転置インデックスの1レコード
 */
package org.logical_paradox.fts;

public class InvertedIndexKey extends Key {
	public static final int SUPPORTED_DOCUMENTS = 64;	// この索引キーでサポートできる文書数

	protected long document;						// 索引語がどの文書に含まれているかを示す情報．
													// MSB = 文書番号1 LSB = 文書番号64
													// 各ビットごと，1で索引語あり，0で索引語なし

	/*
	 * コンストラクタ
	 */
	public InvertedIndexKey( String key ) {
		super( key );
		document = 0;
	}
	public InvertedIndexKey( String key, long documents ) {
		super( key );
		document = documents;
	}

	public long getDocument() {
		return document;
	}

	/*
	 * 指定された文書番号に索引語が含まれているものとする
	 */
	public void setIndexTermOnDocument( int documentNo, boolean stat ) throws IllegalArgumentException {
		if( documentNo < 0 || documentNo > 63 ) {
			throw new IllegalArgumentException( "指定された文書番号は無効です" );
		}

		long rad = 1;
		rad <<= (63-documentNo);

		if( stat ) {
			document |= rad;			// ビットをセットする場合
		} else {
			rad = rad ^ (-1);
			document &= rad;			// ビットをリセットする場合
		}

		//System.err.println( "rad=" + get64bitFormat(rad) );
	}

	public boolean isTermFoundInDocument( int documentNo ) throws IllegalArgumentException {
		if( documentNo < 0 || documentNo > 63 ) {
			throw new IllegalArgumentException( "指定された文書番号は無効です" );
		}

		long rad = 1;
		rad <<= (63-documentNo);

//System.err.println( get64bitFormat( document & rad ) );
		if( (document & rad) != 0 ) {
			return true;
		} else {
			return false;
		}
	}

	public String get64bitFormat( long l ) {
		String bit64String = "0000000000000000000000000000000000000000000000000000000000000000" + Long.toBinaryString( l );
		return bit64String.substring( bit64String.length() - 64, bit64String.length() );
	}

	public static void main( String args[] ) {
		InvertedIndexKey r = new InvertedIndexKey( "キー" );
		r.setIndexTermOnDocument( 0, true );
		r.setIndexTermOnDocument( 1, true );
		r.setIndexTermOnDocument( 2, true );
		r.setIndexTermOnDocument( 3, true );
		System.err.println( r.toString() );
	}
}

// end of InvertedIndexKey.java
