SimpleDB的query planning算法
1. 为from语句中的每个表T创建一个plan;
a) 如果T是一个实际存储的表,则为该表创建一个的Table plan;
b) 如果T是一个视图,那么该视图对应的plan对象则是,递归调用定义该视图的SQL语句所对应的plan对象。
2. 按照from语句中给定表名的顺序,依次求product操作后的结果;
3. 按照where语句中给定的谓词,选择满足谓词的记录;
4. 按照select语句中给定的字段名,project出结果。
// QueryPlanner.java
public interface QueryPlanner {
public Plan createPlan(QueryData queryData, Transaction tx) throws IOException;
}
// BasicQueryPlanner.java
public class BasicQueryPlanner implements QueryPlanner {
@Override
public Plan createPlan(QueryData queryData, Transaction tx) throws IOException {
// 步骤1: 对每个表或视图,创建一个plan
List<Plan> plans = new ArrayList<>();
for (String tblName : queryData.getTables()) {
String viewDef = SimpleDB.metadataMgr().getViewDef(tblName, tx);
if (null != viewDef)
plans.add(SimpleDB.planner().createQueryPlan(viewDef, tx));
else
plans.add(new TablePlan(tblName, tx));
}
// 步骤2: 依次做product操作
Plan p = plans.remove(0);
for (Plan nextPlan : plans) {
p = new ProductPlan(p, nextPlan);
}
// 步骤3: 根据where部分的谓词筛选
p=new SelectPlan(p,queryData.getPred());
// 步骤4: 根据select部分做project操作
p=new ProjectPlan(p,queryData.getFields());
return p;
}
}
// UpdatePlanner.java
public interface UpdatePlanner {
public int executeInsert(InsertData insertData, Transaction tx) throws IOException;
public int executeDelete(DeleteData deleteData,Transaction tx) throws IOException;
public int executeModify(ModifyData modifyData,Transaction tx) throws IOException;
public int executeCreateTable(CreateTableData data,Transaction tx) throws IOException;
public int executeCreateView(CreateViewData data, Transaction tx) throws IOException;
public int executeCreateIndex(CreateIndexData data,Transaction tx) throws IOException;
}
// BasicUpdatePlanner.java
public class BasicUpdatePlanner implements UpdatePlanner {
@Override
public int executeInsert(InsertData insertData, Transaction tx) throws IOException {
Plan p = new TablePlan(insertData.getTblName(), tx);
UpdateScan scan = (UpdateScan) p.open();
scan.insert();
// 插入的新记录各字段的取值
Iterator<Constant> iter = insertData.getVals().iterator();
for (String fieldName : insertData.getFields()) {
Constant val = iter.next();
scan.setVal(fieldName, val);
}
scan.close();
return 1;
}
@Override
public int executeDelete(DeleteData deleteData, Transaction tx) throws IOException {
Plan p = new TablePlan(deleteData.getTblName(), tx);
p = new SelectPlan(p, deleteData.getPred());
UpdateScan scan = (UpdateScan) p.open();
int cnt = 0;
while (scan.next()) {
scan.delete();
cnt++;
}
scan.close();
return cnt;
}
@Override
public int executeModify(ModifyData modifyData, Transaction tx) throws IOException {
Plan p = new TablePlan(modifyData.getTblName(), tx);
p = new SelectPlan(p, modifyData.getPred());
UpdateScan scan = (UpdateScan) p.open();
int cnt = 0;
while (scan.next()) {
scan.setVal(modifyData.getFldName(),
modifyData.getNewVal().asConstant());
cnt++;
}
scan.close();
return cnt;
}
@Override
public int executeCreateTable(CreateTableData data, Transaction tx) throws IOException {
SimpleDB.metadataMgr().createTable(data.getTblName(),
data.getSchema(),
tx);
return 0;
}
@Override
public int executeCreateView(CreateViewData data, Transaction tx) throws IOException {
SimpleDB.metadataMgr().createView(data.getViewName(),
data.getViewDef(),
tx);
return 0;
}
@Override
public int executeCreateIndex(CreateIndexData data, Transaction tx) throws IOException {
SimpleDB.metadataMgr().createIndex(data.getIndexName(),
data.getTblName(),
data.getFldName(),
tx);
return 0;
}
}
update STUDENT
set MajorId = 20
where MajorId = 30 and GradYear = 2008
delete from STUDENT
where MajorId = 30 and GradYear = 2008