/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: Location.java,v 1.4 2006/02/21 13:16:51 akabane Exp $
 */
package org.logical_paradox.koike.core.search;

import org.logical_paradox.common.io.ByteStream;

/**
 * 索引語の位置情報
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.4 $
 */
public class Location implements ByteStream {
	/** シリアルバージョンUID */
	private static final long serialVersionUID = 2960017230783541006L;
	/** 先頭からのオフセット */
	private final int offset;
	/** ノードID */
	private final String nodeId;
	/** 文書番号 */
	private final int docno;
	/**
	 * コンストラクタ
	 * @param nodeId_ ノードID
	 * @param docno_ ドキュメント番号
	 * @param offset_ 先頭からのオフセット
	 */
	public Location(String nodeId_, int docno_, int offset_) {
		nodeId = nodeId_;
		docno = docno_;
		offset = offset_;
	}

	/**
	 * 先頭からのオフセットを返す
	 * @return 先頭からのオフセット
	 */
	public int getOffset() {
		return offset;
	}
	/**
	 * 比較する
	 */
	public boolean equals(Object o) {
		if(o == null || o instanceof Location == false) {
			return false;
		}
		Location l = (Location)o;

		// ノードID, ドキュメント番号, オフセットが完全に一致していればtrue
		return l.getNodeId().equals(getNodeId()) && l.getDocno() == getDocno() && l.offset == offset;
	}
	/**
	 * このインスタンスをコピーする
	 * @return コピー
	 */
	public Object clone() throws CloneNotSupportedException {
		return new Location(getNodeId(), getDocno(), offset);
	}
	/**
	 * このインスタンスのハッシュコードを返す
	 * @return ハッシュコード
	 */
	public int hashCode() {
		return getNodeId().hashCode() * getDocno() + (getDocno() /2) + offset;
	}

	/**
	 * 文書番号を返す
	 * @return 文書番号
	 */
	public int getDocno() {
		return docno;
	}

	/**
	 * ノードIDを返す
	 * @return ノードID
	 */
	public String getNodeId() {
		return nodeId;
	}

	/**
	 * 位置情報をバイト列に変換する．
	 */
	public byte[] byteStream() {
		// TODO 自動生成されたメソッド・スタブ
		return null;
	}

}
