⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashindex.java

📁 用java语言简单实现数据库的初步功能
💻 JAVA
字号:
package simpledb.index.hash;import simpledb.tx.Transaction;import simpledb.record.*;import simpledb.query.*;import simpledb.index.Index;/** * A static hash implementation of the Index interface. * A fixed number of buckets is allocated (currently, 100), * and each bucket is implemented as a file of index records. * @author Edward Sciore */public class HashIndex implements Index {	public static int NUM_BUCKETS = 100;	private int idxnumber;	private Schema sch;	private Transaction tx;	private Constant searchkey = null;	private TableScan ts = null;	/**	 * Opens a hash index for the specified index.	 * @param idxnumber the ID ofthe index	 * @param sch the schema of the index records	 * @param tx the calling transaction	 */	public HashIndex(int idxnumber, Schema sch, Transaction tx) {		this.idxnumber = idxnumber;		this.sch = sch;		this.tx = tx;	}    /**     * Positions the index before the first index record      * having the specified search key.     * The method hashes the search key to determine the bucket,     * and then opens a table scan on the file     * corresponding to the bucket.     * The table scan for the previous bucket (if any) is closed.     * @see simpledb.index.Index#beforeFirst(simpledb.query.Constant)     */    public void beforeFirst(Constant searchkey) {		close();		this.searchkey = searchkey;		int bucket = searchkey.hashCode() % NUM_BUCKETS;		String tblname = "idx" + idxnumber + "b" + bucket;		TableInfo ri = new TableInfo(tblname, sch);		ts = new TableScan(ri, tx);    }	/**	 * Moves to the next record having the search key.	 * The method loops through the table scan for the bucket,	 * looking for a matching record, and returning false	 * if there are no more such records.	 * @see simpledb.index.Index#next()	 */	public boolean next() {		while (ts.next())			if (ts.getVal("dataval").equals(searchkey))				return true;		return false;	}	/**	 * Retrieves the dataRID from the current record	 * in the table scan for the bucket.	 * @see simpledb.index.Index#getDataRid()	 */	public RID getDataRid() {		int blknum = ts.getInt("block");		int id = ts.getInt("id");		return new RID(blknum, id);	}	/**	 * Inserts a new record into the table scan for the bucket.	 * @see simpledb.index.Index#insert(simpledb.query.Constant, simpledb.record.RID)	 */	public void insert(Constant val, RID rid) {		beforeFirst(val);		ts.insert();		ts.setInt("block", rid.blockNumber());		ts.setInt("id", rid.id());		ts.setVal("dataval", val);	}	/**	 * Deletes the specified record from the table scan for	 * the bucket.  The method starts at the beginning of the	 * scan, and loops through the records until the 	 * specified record is found.	 * @see simpledb.index.Index#delete(simpledb.query.Constant, simpledb.record.RID)	 */	public void delete(Constant val, RID rid) {		beforeFirst(val);		while(next())			if (getDataRid().equals(rid)) {				ts.delete();				return;			}	}    /**     * Closes the index by closing the current table scan.     * @see simpledb.index.Index#close()     */    public void close() {        if (ts != null)        	ts.close();    }	/**	 * Returns the cost of searching an index file having the	 * specified number of blocks.	 * The method assumes that all buckets are about the 	 * same size, and so the cost is simply the size of 	 * the bucket.	 * @param numblocks the number of blocks of index records	 * @param rpb the number of records per block (not used here)	 * @return the cost of traversing the index	 */	public static int searchCost(int numblocks, int rpb){		return numblocks / HashIndex.NUM_BUCKETS;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -