Simple-db-lab1

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

    Simple-db-lab1
  • Tuple.java

上一篇:sqli-lab1~4


下一篇:数字后端APR_lab1——innovus认识