MIT 6.830 实现简易数据库 lab2

Posted by zsh on July 12, 2022

exercise 1

实现Filter和Join的操作,对应sql的where和join语法,所有的Operator都需要遍历,因此都需要实现迭代器逻辑,可以参考Project和OrderBy 字段类型,实验1需要实现

  • src/java/simpledb/execution/Predicate.java
  • src/java/simpledb/execution/JoinPredicate.java
  • src/java/simpledb/execution/Filter.java
  • src/java/simpledb/execution/Join.java

同时需要通过PredicateTest,JoinPredicateTest,FilterTest,JoinTest

exercise 2

实现几个分组聚合的函数,比如sum, count, avg, min, max,大概的思路是定义map用来存分组field和聚合值的下标,下标为聚合值的list下标,需要注意的是 在求avg的时候需要知道当前组的元素个数,因此还需要用一个map存储。IntegerAggregator和StringAggregator是基本字段的聚合器,外部使用通过Aggregate 获取聚合结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Main {
	public void mergeTupleIntoGroup(Tuple tup) {
		Field groupByField;
		Field aggregateField = tup.getField(aggregateFieldIndex);
		if (groupByFieldIndex == NO_GROUPING) {
			groupByField = new IntField(Integer.MAX_VALUE);
		} else {
			groupByField = tup.getField(groupByFieldIndex);
		}
		Integer index = fieldWithTupleIndex.get(groupByField);
		if (index == null) {
			Tuple tuple = new Tuple(tupleDesc);
			tuple.setField(0, groupByField);
			tuple.setField(1, aggregateField);
			fieldWithTupleIndex.put(groupByField, aggregateTuples.size());
			aggregateTuples.add(tuple);
		} else {
			Tuple tuple = aggregateTuples.get(index);
			int aggregateFieldValue = ((IntField) aggregateField).getValue();
			int tupleFieldValue = ((IntField) tuple.getField(1)).getValue();
			switch (op) {
				case SUM: {
					tuple.setField(1, new IntField(aggregateFieldValue + tupleFieldValue));
					break;
				}
				case MIN: {
					tuple.setField(1, new IntField(Math.min(aggregateFieldValue, tupleFieldValue)));
					break;
				}
				case MAX: {
					tuple.setField(1, new IntField(Math.max(aggregateFieldValue, tupleFieldValue)));
					break;
				}
				case AVG: {
					tuple.setField(1, new IntField((aggregateFieldValue + tupleFieldValue) / 2));
					break;
				}
			}
		}
	}
}

实验2需要实现

  • src/java/simpledb/execution/IntegerAggregator.java
  • src/java/simpledb/execution/StringAggregator.java
  • src/java/simpledb/execution/Aggregate.java

并通过IntegerAggregatorTest,StringAggregatorTest,AggregateTest

exercise 3

实现HeapFile和HeapPage的insert和delete,HeapFile和HeapPage中都有,HeapFile重点在找到能插入的HeapPage,然后调用HeapPage的方法就行,重点逻辑在HeapPage 插入:记录当前页最后插入位置,往数组里设置tuple,同时更新header 删除:通过recordId删除指定位置的tuple,同时更新header 最后再实现BufferPool里的insert和delete方法 实验3需要实现

  • src/java/simpledb/storage/HeapPage.java
  • src/java/simpledb/storage/HeapFile.java
  • src/java/simpledb/storage/BufferPool.java

并通过HeapPageWriteTest,HeapFileWriteTest的addTuple,BufferPoolWriteTest

exercise 4

实现Insert和Delete类,作为insert和delete的SQL语句具体执行类,底层还是调用的实验3写的insertTuple和deleteTuple,这里需要实现writePage方法, 在insert或者delete之后调用,把操作结果落盘 实现2需要实现

  • src/java/simpledb/execution/Insert.java
  • src/java/simpledb/execution/Delete.java

并通过InsertTest, DeleteTest, HeapFileWriteTest,HeapPageWriteTest,systemtest/InsertTest,systemtest/DeleteTest

exercise 5

实现页置换算法,当BufferPool的pages满了后,需要挑选一页置换,可以选择LRU,LFU,Clock等 实验5需要实现

  • src/java/simpledb/storage/BufferPool.java

并通过systemtest/EvictionTest