Simple-db-lab1
Exercise 1
-
TupleDesc.java
TupleDesc
用来描述一张 数据表,一张数据表会包含一个或多个字段(如 Student(id, name, age, ...)),每一个字段都需要确定的知道它的 类型+字段名,其中定义了一个中间结构TDItem
封装 类型+字段名 来简化字段的管理。为了描述数据表中的多个字段,TupleDesc
类中必须要包含一个私有的TDItem
数组:private final TDItem[] tds;
剩下的函数主要是针对
tds
数组的一些操作,这里记录几个函数的实现:// 实现数据表字段的迭代器,Iterator 必须要实现 hasNext 与 next 方法。 public Iterator<tditem> iterator() { return new Iterator<tditem>(){ private int idx = 0; public boolean hasNext() { return (idx < tds.length); } public TDItem next() { if (!hasNext()) { throw new NoSuchElementException(); } return tds[idx++]; } }; }
// 构造函数1,需要申请指定长度的数组,并用参数type,field数组构造TDItem数组 public TupleDesc(Type[] typeAr, String[] fieldAr) { tds = new TDItem[typeAr.length]; for (int i = 0; i < typeAr.length; i++) { tds[i] = new TDItem(typeAr[i], fieldAr[i]); } }
// 这里由于对java语言不熟,出现一些问题。首先是java字符串的比较不能直接 == (原因见百度) // 其次没有考虑name为null的情况 public int fieldNameToIndex(String name) throws NoSuchElementException { for (int idx = 0; idx < tds.length; idx++) { if (name == null) { if (tds[idx].fieldName == null) return idx; continue; } else if (name.equals(tds[idx].fieldName)) { return idx; } } throw new NoSuchElementException("fieldNameToIndex: invalid name " + name); }
// 本实验中只有 int 与 string(固定长) 类型的数据,其定义在 /src/java/simpledb/ // common/Type.java 中 public int getSize() { int size = 0; for (int i = 0; i < tds.length; i++) { size += tds[i].fieldType.getLen(); } return size; }
执行
TupleDesc
的测试代码ant runtest -Dtest=TupleDescTest
: -
Tuple.java