From 6f3b895d51e5cf3ff94fafe31e2dfb23fcfb2d1b Mon Sep 17 00:00:00 2001 From: wym <1057857414@qq.com> Date: Sat, 24 Jun 2023 22:28:06 -0700 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=BA=9B=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=EF=BC=8C=E5=9C=A8Rmfilehandle=E4=B8=AD=E5=A3=B0?= =?UTF-8?q?=E6=98=8E=E5=8F=8B=E7=B1=BBSeqRecScan,=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E4=BA=86executor=E4=B8=AD=E7=9A=84=E9=A1=BA=E5=BA=8F=E6=89=AB?= =?UTF-8?q?=E6=8F=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/execution/executor_seq_scan.h | 159 ++++++++++++++++++++++++++++-- src/record/rm_file_handle.h | 3 +- src/record/rm_scan.cpp | 1 + 3 files changed, 156 insertions(+), 7 deletions(-) diff --git a/src/execution/executor_seq_scan.h b/src/execution/executor_seq_scan.h index d50912b..0f23ccc 100755 --- a/src/execution/executor_seq_scan.h +++ b/src/execution/executor_seq_scan.h @@ -16,6 +16,84 @@ See the Mulan PSL v2 for more details. */ #include "index/ix.h" #include "system/sm.h" +class SeqRecScan : public RecScan { +private: + // å…¶ä»–æˆå‘˜å˜é‡å’Œæ–¹æ³• + const RmFileHandle *file_handle_; + Rid rid_; +public: + SeqRecScan(RmFileHandle *fh_) : file_handle_(fh_) { + // Todo: + // åˆå§‹åŒ–file_handleå’Œrid(指å‘ç¬¬ä¸€ä¸ªå˜æ”¾äº†è®°å½•çš„ä½ç½®ï¼‰ + rid_={1,-1}; + int start_page=rid_.page_no; + int start_slot=rid_.slot_no; + for(int i = start_page; i < file_handle_->file_hdr_.num_pages; i++){ + RmPageHandle page_handle = file_handle_->fetch_page_handle(i); + if (page_handle.page_hdr->num_records != 0) { + rid_ = {i, Bitmap::next_bit(true, page_handle.bitmap, page_handle.file_hdr->num_records_per_page, -1)}; + file_handle_->buffer_pool_manager_->unpin_page(page_handle.page->get_page_id(), false); + return; + } + } + rid_ = {file_handle_->file_hdr_.num_pages, -1}; + return; + } + + void next() override { + // 实现获å–下一个记录的逻辑 + // Todo: + // 找到文件ä¸ä¸‹ä¸€ä¸ªå˜æ”¾äº†è®°å½•çš„éžç©ºé—²ä½ç½®ï¼Œç”¨rid_æ¥æŒ‡å‘这个ä½ç½® + + //è®¾ç½®ä¸€ä¸ªæ ‡å¿—ä½æ¥æŒ‡ç¤ºæ˜¯åœ¨å½“å‰é¡µè¿˜æ˜¯ä¸‹ä¸€é¡µæœå¯» + bool flag = false; + // 当剿§½ä½ä¸º -1ï¼ˆè¡¨ç¤ºç»“æŸæˆ–åˆå§‹çжæ€ï¼‰ï¼Œåˆ™æ— éœ€ç»§ç»æ‰§è¡Œï¼Œå‡½æ•°ç›´æŽ¥è¿”回 + if (rid_.slot_no == -1) { + return; + } + int max_pages_num=file_handle_->file_hdr_.num_pages; + + //for循环扫æ + for (int i = rid_.page_no; i < max_pages_num; i++) { + RmPageHandle page_handle = file_handle_->fetch_page_handle(i); + + if (page_handle.page_hdr->num_records != 0) { + int slot_no = Bitmap::next_bit(true, page_handle.bitmap, page_handle.file_hdr->num_records_per_page, flag ? -1 : rid_.slot_no); + int page_end=page_handle.file_hdr->num_records_per_page; + //next_bit扫æåˆ°äº†é¡µé¢æœ«å°¾ä»æœªæ‰¾åˆ°1ä½,进入下一次for循环扫æä¸‹ä¸€é¡µ + if (slot_no == page_end) { + rid_.slot_no = -1; + continue; + } + //nextbit找到了1ä½ + else{ + rid_ = {i, slot_no}; + file_handle_->buffer_pool_manager_->unpin_page(page_handle.page->get_page_id(), false); + return; + } + } + //unpin + file_handle_->buffer_pool_manager_->unpin_page(page_handle.page->get_page_id(), false); + //ç½®æ ‡å¿—ä½ä¸º1,从本页的slotnoè€Œä¸æ˜¯-1开始寻找 + flag = true; + } + rid_ = {max_pages_num, -1}; + return; + } + + bool is_end() const override { + // å®žçŽ°åˆ¤æ–æ˜¯å¦åˆ°è¾¾è®°å½•集的末尾的逻辑 + return rid_.slot_no == -1; + } + + Rid rid() const override { + // 返回当å‰è®°å½•çš„ RID + return rid_; + } +}; + + + class SeqScanExecutor : public AbstractExecutor { private: std::string tab_name_; // 表的åç§° @@ -26,9 +104,10 @@ class SeqScanExecutor : public AbstractExecutor { std::vector<Condition> fed_conds_; // åŒconds_ï¼Œä¸¤ä¸ªå—æ®µç›¸åŒ Rid rid_; - std::unique_ptr<RecScan> scan_; // table_iterator + std::unique_ptr<SeqRecScan> scan_; // table_iterator SmManager *sm_manager_; + std::vector<ColMeta> cols_check_; // æ¡ä»¶è¯å¥ä¸æ‰€æœ‰ç”¨åˆ°åˆ—的列的元数æ®ä¿¡æ¯ public: SeqScanExecutor(SmManager *sm_manager, std::string tab_name, std::vector<Condition> conds, Context *context) { @@ -39,22 +118,90 @@ class SeqScanExecutor : public AbstractExecutor { fh_ = sm_manager_->fhs_.at(tab_name_).get(); cols_ = tab.cols; len_ = cols_.back().offset + cols_.back().len; - + //hashmap + std::unordered_map<std::string, ColMeta> ColName_to_ColMeta_=tab.ColName_to_ColMeta; context_ = context; - fed_conds_ = conds_; + fed_conds_ = conds_;//åŽç»æŸ¥è¯¢ä¼˜åŒ–å¯ä»¥ä»Žfedcond入手!!!!!!!!!!!!!!!!!!! + + //åˆå§‹åŒ–æ¡ä»¶è¯å¥ä¸æ‰€æœ‰ç”¨åˆ°åˆ—的列的元数æ®ä¿¡æ¯ + int i=0; + for (const auto& condition : fed_conds_) { + + // 检查左æ“作数是å¦ä¸ºåˆ—æ“作数 + if (!condition.lhs_col.tab_name.empty() && !condition.lhs_col.col_name.empty()) { + // 查找colmeta + ColMeta temp=ColName_to_ColMeta_[condition.lhs_col.col_name]; + // 将元数æ®å¯¹è±¡æ·»åŠ åˆ°åˆ—çš„å…ƒæ•°æ®å‘é‡ä¸ + cols_check_.push_back(temp); + } + + // æ£€æŸ¥å³æ“作数是å¦ä¸ºåˆ—æ“作数 + if (!condition.is_rhs_val && !condition.rhs_col.tab_name.empty() && !condition.rhs_col.col_name.empty()) { + // 查找colmeta + ColMeta temp=ColName_to_ColMeta_[condition.rhs_col.col_name]; + // 将元数æ®å¯¹è±¡æ·»åŠ åˆ°åˆ—çš„å…ƒæ•°æ®å‘é‡ä¸ + cols_check_.push_back(temp); + } + } } void beginTuple() override { - + // åˆå§‹åŒ–执行器的状æ€ï¼Œå‡†å¤‡å¼€å§‹é历记录 + // 这个函数在第一次调用 Next() å‰ä¼šè¢«è‡ªåŠ¨è°ƒç”¨ + // å¯ä»¥åœ¨è¿™é‡Œè¿›è¡Œä¸€äº›åˆå§‹åŒ–æ“作 + + // åˆå§‹åŒ–记录è¿ä»£å™¨ + scan_ = std::make_unique<SeqRecScan>(fh_); + // 设置åˆå§‹ RID + rid_ = scan_->rid(); + } void nextTuple() override { - + scan_->next(); + rid_=scan_->rid(); } std::unique_ptr<RmRecord> Next() override { - return nullptr; + + //-1表明为空或到达了末尾 + if(rid_.slot_no==-1){ + return nullptr; + } + + //è®¾ç½®æ ‡å¿—ä½ï¼Œè¡¨ç¤ºæ˜¯å¦æ‰¾åˆ°ç¬¦åˆæ¡ä»¶record + bool found=false; + + //è¿›å…¥å¾ªçŽ¯ï¼Œå¯»æ‰¾åˆ°ç¬¦åˆæ¡ä»¶çš„record就返回,å¦åˆ™ç»§ç»å–下一æ¡record + for(;!scan_->is_end();nextTuple()){ + + //å–出当å‰è®°å½• + auto record_for_check = fh_->get_record(rid_,nullptr); + + //æ ‡å¿—ä½ï¼Œè¡¨è¾¾å¼æ˜¯å¦ä¸ºtrue + bool right=false; + + //便¬¡åˆ¤æ–所有condition + int right_num=0; + int should_right=fed_conds_.size(); + for (const auto& condition : fed_conds_) { + if(!ConditionEvaluator::evaluate(condition,cols_check_,*record_for_check)){ + + //一旦有一个condition为falseå°±ç»ˆæ¢æ±‚æ¡ä»¶è¡¨è¾¾å¼å€¼ break,ç„¶åŽè¿›å…¥å¤–部的continue,å–下一æ¡è®°å½• + break; + } + + //è¯¥æ¡æ¡ä»¶è¯å¥ä¸ºtrueï¼Œè®¡æ•°å™¨åŠ ä¸€ + right_num++; + + //所有æ¡ä»¶è¯å¥éƒ½true,返回该æ¡è®°å½• + if(right_num==should_right){ + return record_for_check; + } + } + continue; + } } Rid &rid() override { return rid_; } diff --git a/src/record/rm_file_handle.h b/src/record/rm_file_handle.h index 541aa8d..567deb8 100644 --- a/src/record/rm_file_handle.h +++ b/src/record/rm_file_handle.h @@ -42,7 +42,8 @@ struct RmPageHandle { /* æ¯ä¸ªRmFileHandleå¯¹åº”ä¸€ä¸ªè¡¨çš„æ•°æ®æ–‡ä»¶ï¼Œé‡Œé¢æœ‰å¤šä¸ªpage,æ¯ä¸ªpage的数æ®å°è£…在RmPageHandleä¸ */ class RmFileHandle { - friend class RmScan; + friend class RmScan; + friend class SeqRecScan; friend class RmManager; private: diff --git a/src/record/rm_scan.cpp b/src/record/rm_scan.cpp index 17d15eb..1d8beef 100644 --- a/src/record/rm_scan.cpp +++ b/src/record/rm_scan.cpp @@ -22,6 +22,7 @@ RmScan::RmScan(const RmFileHandle *file_handle) : file_handle_(file_handle) { rid_={1,-1}; int start_page=rid_.page_no; int start_slot=rid_.slot_no; + //从第一页的-1å·ä½å¼€å§‹é历 for(int i = start_page; i < file_handle_->file_hdr_.num_pages; i++){ auto page_handle = file_handle_->fetch_page_handle(i); if (page_handle.page_hdr->num_records != 0) { -- GitLab