6.3 嵌套循环连接 nest loop

嵌套循环系列中最简单的形式是其中的循环是对所涉及关系的各个元组来尽心。在这个我们称为基于元组的嵌套循环连接算法中,我们将计算连接R(X,Y) S(Y,Z)

for S 中的每个元组 s DO
    for R 中的每个元组 r DO
        if r与s连接形成元组 t THEN
            output t;

主要函数

physical_scan physical_scan_join_nest_loop_create(physical_scan scan1, physical_scan *scan2);

传入两个物理计划,创建一个连接的物理计划,如果成功,返回一个physical_scan结构体,否则返回NULL

void physical_scan_join_nest_loop_init_scan(physical_scan *scan);

初始化连接的物理计划,为函数指针赋值

int physical_scan_join_nest_loop_before_first(physical_scan *tableScan);

分别对连接的两个物理计划进行扫描前初始化,将第一个物理计划的读取位置移动到第一条,将第二个物理计划的读取位置移动到第0条

int physical_scan_join_nest_loop_next(physical_scan *tableScan);

首先获得要连接的两个物理计划,如果第二个物理计划还有记录,返回1;否则移动第二个物理计划要读取的位置到第0条的位置,返回 scan2->next(scan2) && scan1->next(scan1);

int physical_scan_join_nest_loop_close(physical_scan *tableScan);

关闭连接物理计划

variant physical_scan_join_nest_loop_get_val(physical_scan scan, char tableName, char fieldName);

(未实现?)如果第一个物理计划中表拥有 fieldName 字段,则该字段的值;否则尝试返回第二个物理计划中fieldName 字段的值

int physical_scan_join_nest_loop_get_int(physical_scan tableScan, char tableName, char *fieldName);

如果第一个物理计划中表拥有 fieldName 字段,则该字段的Int 值;否则尝试返回第二个物理计划中fieldName 字段的Int值

int physical_scan_join_nest_loop_get_string(physical_scan tableScan, char tableName, char fieldName, char value);

如果第一个物理计划中表拥有 fieldName 字段,则该字段的字符串值;否则尝试返回第二个物理计划中fieldName 字段的字符串值

int physical_scan_join_nest_loop_has_field(physical_scan tableScan, char tableName, char *fieldName);

判断第一、第二个物理计划中是否函数fieldname字段,返回它们结果的或

field_info physical_scan_join_nest_loop_get_field(physical_scan scan, char tableName, char fieldName);

如果第一个物理计划中表拥有 fieldName 字段,则该字段的field_info结构体;否则尝试返回第二个物理计划中fieldName字段的field_info结构体

arraylist physical_scan_join_nest_loop_get_fields_name(physical_scan scan, char *tableName);

将两个物理计划中表中的全部字段全部放入一个arraylist中,并返回这个arraylist

int physical_scan_join_nest_loop_get_rid(physical_scan tableScan, record_id recordId);

int physical_scan_join_nest_loop_moveto_rid(physical_scan tableScan, record_id recordId);