Diretório de artigos
Código
Experimento 1: tupla e tupleDesc
Objetivo: implementar tupla e tupleDesc
tupleDesc = tupleDescription
Experimento 2: catálogo
- Contém tabelas e esquemas de tabelas: referências de tabelas, nomes de tabelas, chaves primárias de tabelas
- adição de tabela e pesquisa
- Obtenha o único catálogo por meio de Database.getCatalog()
- Maneira importante de obter tabelas. Obtenha informações de tabela ou arquivos de tabela por id.
Experimento 3: buffer pool
Experimento 4: implementar heapPageId, heapPage, recordID
1. Métodos e propriedades que precisam ser implementados
- pilha
1. getNumTuples() : 获取元组数目
2. HeapPage(HeapPageId id, byte[] data)
3. getHeaderSize() :获取头(位示图)的长度
4. isSlotUsed(int i):该槽位是否被使用
5. iterator()
6. getNumEmptySlots()
属性
1. pageid
2. tupleDesc // 表的信息,元组信息和元组
3. []header and tuples
Basta concluir HeapPageIdTest, RecordIDTest e HeapPageReadTest.
Experimento 5: Implementar heapFile
- Leia o arquivo usando randomFile
- iterador
- Comece após a abertura, leia apenas a primeira página
- Se não estiver vazio, verifique se chegou ao final da página, caso contrário, aponte para o início da próxima página.
Experimento 6: Manipulação
área
- id de transação única
- apelido de mesa
- id da tabela
- iterador de tabela
operação concreta
- Alias nulo.
- O iterador deve ser julgado se não está vazio para evitar que não seja aberto.
Experimento 7:
- Crie um arquivo test.txt semelhante ao seguinte, com uma nova linha no final
1,1,1
2,2,2
3,3,3
- Converter test.txt em um arquivo .dat, usando convert em HeapFileEncode
- Execute o teste fornecido, preste atenção ao nome do arquivo correspondente
- some_data_file.dat
package simpledb;
import java.io.*;
public class test {
public static void main(String[] argv) {
// construct a 3-column table schema
Type types[] = new Type[]{
Type.INT_TYPE, Type.INT_TYPE, Type.INT_TYPE };
String names[] = new String[]{
"field0", "field1", "field2" };
TupleDesc descriptor = new TupleDesc(types, names);
// create the table, associate it with some_data_file.dat
// and tell the catalog about the schema of this table.
HeapFile table1 = new HeapFile(new File("some_data_file.dat"), descriptor);
Database.getCatalog().addTable(table1, "test");
// construct the query: we use a simple SeqScan, which spoonfeeds
// tuples via its iterator.
TransactionId tid = new TransactionId();
SeqScan f = new SeqScan(tid, table1.getId());
try {
// and run it
f.open();
while (f.hasNext()) {
Tuple tup = f.next();
System.out.println(tup);
}
f.close();
Database.getBufferPool().transactionComplete(tid);
} catch (Exception e) {
System.out.println ("Exception : " + e);
}
}
}
- Ou execute o seguinte arquivo diretamente após criar o arquivo
package simpledb;
import org.junit.Test;
import simpledb.common.Database;
import simpledb.common.Type;
import simpledb.execution.SeqScan;
import simpledb.storage.*;
import simpledb.transaction.TransactionId;
import java.io.*;
/**
* @author: Zekun Fu
* @date: 2023/2/22 10:04
* @Description:
*/
public class SQLTest {
// 看当前的类路径
@Test
public void testPath() {
System.out.println(String.format("当前的类路径是%s", System.getProperty("user.dir")));
}
// 测试文件转化
@Test
public void convert() {
File infile = new File("test.txt");
File outFile = new File("some_data_file.dat");
try {
HeapFileEncoder.convert(infile, outFile, BufferPool.getPageSize(), 3); // 默认3个int类型
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test() throws IOException{
// construct a 3-column table schema
// 构建表头
Type types[] = new Type[]{
Type.INT_TYPE, Type.INT_TYPE, Type.INT_TYPE};
String names[] = new String[]{
"field0", "field1", "field2"};
TupleDesc descriptor = new TupleDesc(types, names);
// create the table, associate it with some_data_file.dat
// and tell the catalog about the schema of this table.
// 创建表文件映射
File file = new File("test.txt");
if (!file.exists()) {
throw new IOException(".dat文件不存在!");
}
File heapFile = new File("some_data_file.dat");
HeapFileEncoder.convert(file, heapFile, BufferPool.getPageSize(), 3);
HeapFile table1 = new HeapFile(heapFile, descriptor);
Database.getCatalog().addTable(table1, "test");
// construct the query: we use a simple SeqScan, which spoonfeeds
// tuples via its iterator.
// 创建查询
TransactionId tid = new TransactionId();
SeqScan f = new SeqScan(tid, table1.getId());
try {
// and run it
f.open();
while (f.hasNext()) {
Tuple tup = f.next();
System.out.print(tup);
}
f.close();
Database.getBufferPool().transactionComplete(tid);
} catch (Exception e) {
System.out.println("Exception : " + e);
}
boolean end = heapFile.delete();
System.out.println("临时数据库文件是否删除成功:" + end);
}
}
pergunta
- O tamanho do arquivo em heapFile é um múltiplo inteiro de páginas? Caso contrário, o que devo fazer se houver menos de uma página ao ler os dados da página? Se sim, o que devo fazer se houver menos de uma página ao escrever?
- Ao escrever, escreve-se página a página, portanto, ao ler, não haverá menos de uma página?
- Após a verificação, o tamanho de cada DBfIle deve ser um múltiplo inteiro de Page.
- Se 4k, dois dados do tipo int, podem armazenar 504 informações
- Por que a chave primária deve ser colocada nas informações da tabela no catálogo?
- A interface DBfile da tabela, o id é determinado pelo id do DBfile.
- nome da tabela e chave primária
- Porque a chave primária e o nome são informações importantes da tabela.
- Por que NoSunElementException é lançado?
- Como isso está definido, o teste pode continuar executando se esse erro for lançado.
- Não há saída no experimento 7. Não sei se há um erro na conversão do .dat ou um erro na leitura do arquivo.
- De acordo com a depuração de depuração, o problema foi encontrado.
- De acordo com o trace, verifica-se que os campos na tupla de saída existem, indicando que não há erro na conversão, e não há problema na leitura no dbfile.
- leia de cabeça primeiro
- Em seguida, leia as tuplas de acordo com
- Finalmente, coloque o conteúdo lido na página.
- Então, como não há problema com a leitura e o iterador, a tupla retornada não é problema, então apenas a saída toString tem problema. Realmente é o caso. Ele foi comentado na hora e esqueci de restaurá-lo.