?? indexmanager.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 + -