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

📄 indexmanager.java

📁 用JAVA实现的miniSQL
💻 JAVA
字号:
import java.io.*;
import java.util.*;

public class IndexManager {
    BufferManager buffer;
    public IndexManager(BufferManager bf) {
    	buffer = bf;
    }
    public boolean createIndex(Interpreter cmd){
    	long total; //总个多少记录
    	long blocknumber;//总共多少个块
    	int num;//每个块有多少记录
    	int length; //每条记录的长度
    	int attnumber=0;
    	int type = 0;
    	try{
    		RandomAccessFile indexfile = new RandomAccessFile(new File(cmd.indexname),"rws");
    		indexfile.writeLong(0);
    		for(int i=0;i<cmd.attribute.length;i++){
    			if(cmd.uniqueatt.equalsIgnoreCase(cmd.attribute[i])){
    				attnumber = i;
    				break;
    			}
    		}
    		indexfile.write(cmd.atttype[attnumber]);
    		indexfile.write(cmd.attlength[attnumber]/2);
    		indexfile.writeLong(0);
    		indexfile.writeInt(0);
    		indexfile.writeLong(0);
    		indexfile.writeLong(1024);
    		indexfile.close();
    		RandomAccessFile recordfile = new RandomAccessFile(new File(cmd.table),"r");
    		total = recordfile.readLong();
    		blocknumber = recordfile.readLong();
    		length = recordfile.readInt();
    		num = recordfile.readInt();
    		recordfile.close();
    	}catch(Exception e){
    		return false;
    	}
    	Btree btree = new Btree(cmd.indexname, buffer);
    	int current = 0;
    	int offset = 1;
    	long pos = 0;
    	for(int i=0;i<attnumber;i++)
    		offset = offset+1+cmd.attlength[i];
        type = cmd.atttype[attnumber];
        File recordfile = new File(cmd.table);
        if(type == 1){
        	int key;
        	for(int i=0;i<blocknumber-1;i++){
        		buffer.getBlock(recordfile, i, 1024);
        		Block b = buffer.list.getFirst();
        		current = 0;
        		for(int j= 0;j<num ; j++){
        			b.seek(current);
        		    if(!b.readBoolean()){
        		    	current = current + length;
        		    	continue;
        		    }
        			b.seek(current+offset+1);
        			key = b.readInt();
        			pos = i*4096+1024+current;
        			btree.insert(new Keyword(key),pos);
        			current = current + length;
        		}
            }
        	if(blocknumber==0)
            	return true;
            buffer.getBlock(recordfile,blocknumber-1,1024);
            Block b = buffer.list.getFirst();
            int rest = (int)(total - (blocknumber-1)*num);
            current = 0;
        	for(int j= 0;j<rest ; j++){
        		b.seek(current);
        		if(!b.readBoolean()){
        		    current = current + length;
        		    continue;
        		}  
        		b.seek(current+offset+1);
        		key = b.readInt();
        		pos = (blocknumber-1)*4096+1024+current;
        		btree.insert(new Keyword(key),pos);
        		current = current + length;
        	}
        }
        else if(type == 2){
        	float key;
        	for(int i=0;i<blocknumber-1;i++){
        		buffer.getBlock(recordfile, i, 1024);
        		Block b = buffer.list.getFirst();
        		current = 0;
        		for(int j= 0;j<num ; j++){
        			b.seek(current);
        		    if(!b.readBoolean()){
        		    	current = current + length;
        		    	continue;
        		    }  
        			b.seek(current+offset+1);
        			key = b.readFloat();
        			pos = i*4096+1024+current;
        			btree.insert(new Keyword(key),pos);
        			current = current + length;
        		}
            }
        	if(blocknumber==0)
            	return true;
            buffer.getBlock(recordfile,blocknumber-1,1024);
            Block b = buffer.list.getFirst();
            int rest = (int)(total - (blocknumber-1)*num);
            current = 0;
        	for(int j= 0;j<rest ; j++){
        		b.seek(current);
        		if(!b.readBoolean()){
        		    current = current + length;
        		    continue;
        		}  
        		b.seek(current+offset+1);
        		key = b.readFloat();
        		pos = (blocknumber-1)*4096+1024+current;
        		btree.insert(new Keyword(key),pos);
        		current = current + length;
        	}
        }
        else if(type == 3){
        	String key=null;
        	for(int i=0;i<blocknumber-1;i++){
        		buffer.getBlock(recordfile, i, 1024);
        		Block b = buffer.list.getFirst();
        		current = 0;
        		for(int j= 0;j<num ; j++){
        			b.seek(current);
        		    if(!b.readBoolean()){
        		    	current = current + length;
        		    	continue;
        		    }  
        			b.seek(current+offset);
        			int len = b.read()*2;
        			byte[] name = new byte[len];
        			b.read(name);
        			try{
        		        key = new String(name, "UTF16");
        	      	}catch(Exception e){}
        			pos = i*4096+1024+current;
        			btree.insert(new Keyword(key),pos);
        			current = current + length;
        		}
            }
            if(blocknumber==0)
            	return true;
            buffer.getBlock(recordfile,blocknumber-1,1024);
            Block b = buffer.list.getFirst();
            int rest = (int)(total - (blocknumber-1)*num);
            current = 0;
        	for(int j= 0;j<rest ; j++){
        		b.seek(current);
        		if(!b.readBoolean()){
        		    current = current + length;
        		    continue;
        		}  
        	    b.seek(current+offset);
        	    int len = b.read()*2;
        		byte[] name = new byte[len];
        		b.read(name);
        		try{
        		    key = new String(name, "UTF16");
        		}catch(Exception e){}
        		pos = (blocknumber-1)*4096+1024+current;
        		btree.insert(new Keyword(key),pos);
        		current = current + length;
        	}
        }
    	return true;
    }
    public boolean insertIndex(String indexfile, Keyword key, long pos){
    	Btree btree = new Btree(indexfile, buffer);
        return btree.insert(key,pos);
    }
    public long getAddress(String indexfile, Keyword key){
    	Btree btree = new Btree(indexfile, buffer);
    	return btree.search(key);
    }
    public long getMinAddress(String indexfile){
    	Btree btree = new Btree(indexfile, buffer);
    	return btree.getMinAddress();
    }
    public LinkedList<Long> getAddress(String indexfile, Keyword key1, Keyword key2){
    	Btree btree = new Btree(indexfile, buffer);
    	return btree.searchbetween(key1, key2);
    }
    public LinkedList<Long> getlessAddress(String indexfile, Keyword key){
    	Btree btree = new Btree(indexfile, buffer);
    	return btree.searchless(key);
    }
    public LinkedList<Long> getlargeAddress(String indexfile, Keyword key){
    	Btree btree = new Btree(indexfile, buffer);
    	return btree.searchlarge(key);
    }
    public boolean delete(String index, String key, int type){
    	Keyword K=null;
    	if(type == 1)
    	    K = new Keyword(Integer.parseInt(key));
    	else if(type == 2)
    		K = new Keyword(Float.parseFloat(key));
    	else
    		K = new Keyword(key);
    	Btree btree = new Btree(index, buffer);
    	return btree.delete(K);
    }
}

⌨️ 快捷键说明

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