跳转至

基础功能

Note

实验开始前请先更新实验框架

本次实验的目标比较明确,每次任务实现一个算子的 Next 函数,正确实现后便可通过该算子对应的测试。因此本次实验不再给出详细的实验步骤,你只需按照实验任务说明完成相应的算子即可。

基础功能中所有算子仅要求在内存中实现即可,如果你对外存算子的实现感兴趣,可以参考本次实验的高级功能

任务 1:Limit 算子(3 分)

Limit 算子是本次实验最基础的一个任务,算子本身的实现非常简单,希望你通过这个任务熟悉实验框架中火山模型的运作流程。

你需要补充 executors/limit_executor.cpp 中的 Next 函数,实现过程中你可能会用到对应的 LimitOperator 中的成员变量。你也可以为 LimitExecutor 增加新的成员变量来存储信息。

完成后你将通过 10-limit.test 测例。需要注意的是,为确保 limit 结果的唯一性,在该测例中使用了 order by 语句,而排序算子的实现是任务 2 的内容。但是该测例中所有排序均与插入顺序一致,因此只要你在 lab 1 中的实现可以保证读取顺序与插入顺序保持一致,便可以通过本测例。如果你的实现不能保证这一点,你可以在完成任务 2 后再来进行本测例的测试。

任务 2:排序算子(4 分)

你需要补充 executors/orderby_executor.cpp 中的 Next 函数,与 Limit 算子类似,你可能会使用到 OrderByOperator 中的成员变量,从中获取排序的列以及排序的类型(升序还是降序),实现过程中可以使用 C++ 标准库的 sort 函数。

正确实现后将通过 20-sort.test 测例。

任务 3:嵌套循环连接算子(4 分)

你需要补充 executors/nested_loop_join_executor.cpp 中的 Next 函数,从 NestedLoopJoinOperator 中获取连接条件,本次实验中仅要求实现内连接,不要求实现外连接。

正确实现后将通过 30-nested-loop-join.test 测例。

任务 4:归并连接算子(4 分)

你需要补充 executors/merge_join_executor.cpp 中的 Next 函数,从 MergeJoinOperator 中获取连接条件,本次实验中仅要求实现内连接,不要求实现外连接。注意可能需要对 join 两侧的表存在重复值的情况特殊处理。

在查询计划生成时,已对归并连接的两个子节点添加了 OrderBy 节点进行排序操作,你在实现归并连接时无需再进行排序。

正确实现后将通过 40-merge-join.test 测例。

报告提交要求

本次实验的代码补充位置清晰,请在实验报告中粘贴你的代码,并对代码辅以必要的注释或文字解释。

报告要求

实验报告的通用要求请查看实验提交要求中的实验报告部分

本次实验的代码补充位置清晰,请在实验报告中分别粘贴四次任务的实现代码,并对代码辅以必要的注释或文字解释,描述每个算子的运行流程。