首页 > 其他分享 >CMU_15445_P3_Part1

CMU_15445_P3_Part1

时间:2024-12-16 15:59:13浏览次数:5  
标签:返回 P3 15445 Projection tuple 回溯 CMU 节点 SELECT

CMU_15445_P3_Part1

这部分主要是实现一些基本的 Plan_Node 的 Executor, 我们可以首先通过一个列子来看, 就是 Projection Plan_Node 的例子.
Projection 类型的 PLAN_NODE 是作为有条件的 SELECT语句 或者嵌套的 SELECT 语句的根节点, 例如:

SELECT a, b FROM t1 WHERE c > 10;
SELECT a + b FROM (SELECT a, b FROM t1 WHERE c > 10) AS sub;

但是没有条件的 SELECT 语句通常不使用 Projection PLAN_NODE 节点.
并且 Projection 类型的 PLAN_NODE 只有一个孩子节点返回读取到的 Tuples, Projection 的 PLAN_NODE 中还包含各种表达式, 这些表达式定义了如何从孩子节点返回的 tuple 获取 Projection 的 tuple.

auto ProjectionExecutor::Next(Tuple *tuple, RID *rid) -> bool {
  Tuple child_tuple{};
  /**
   * 从孩子节点获取 tuple, 也就是孩子节点返回 tuple. 
   * 并且, 这里实现了一个递归的调用机制, 从上到下, 先调用孩子节点的 Next() 函数
   */
  const auto status = child_executor_->Next(&child_tuple, rid);
  if (!status) {
    return false;
  }
  /**
   * 实际这部分是调用孩子节点的 Next() 函数之后的回溯部分, 孩子节点返回 tuple 到父节点之后
   * 父节点根据自身的逻辑修改与判断这个 tuple 是否符合条件, 继续返回至根节点
   */
  std::vector<Value> values{};
  // 每一列的 Column 对应着从 孩子节点的 tuple 中取一个值
  values.reserve(GetOutputSchema().GetColumnCount());
  // Projection 节点通常有多个表达式, 获取孩子节点的 tuple 之后, 在回溯节点使用表达式的逻辑得到该节点的 tuple 输出
  for (const auto &expr : plan_->GetExpressions()) {
    values.push_back(expr->Evaluate(&child_tuple, child_executor_->GetOutputSchema()));
  }
  // 组合成一个 tuple 返回
  *tuple = Tuple{values, &GetOutputSchema()};
  return true;
}

Iterator Model 的 Executor 执行的过程类似于一个递归回溯的过程, 但是并不完全是递归回溯, 上面的代码就展示了该调用的过程, 首先会递归的调用 Next() 函数, 然后调用完之后会使用该节点的处理逻辑, 返回该节点的 tuple. 这里还有一个问题, 常见的递归回溯会将递归的过程全部执行完, 再进行回溯, 而 Iterator Model 每次只返回一个 tuple, 下次调用该节点的时候, 继续返回 tuple, 这里的实现方式在后续会揭开.

标签:返回,P3,15445,Projection,tuple,回溯,CMU,节点,SELECT
From: https://www.cnblogs.com/wevolf/p/18610353

相关文章

  • 基于ESP32的桌面小屏幕实战[4]:硬件设计之PCB Layout
    1.PCBLayout步骤生成PCB确定PCBlayout规范绘制板框尺寸布局布局规范:按电气性能合理分区,一般分为:数字电路区(即怕干扰、又产生干扰)、模拟电路区(怕干扰)、功率驱动区(干扰源);完成同一功能的电路,应尽量靠近放置,并调整各元器件以保证连线最为简洁;对于质量大的元器......
  • 洛谷P3389 【模板】高斯消元法 高斯消元模板题
    题目链接:https://www.luogu.com.cn/problem/P3389题目大意:略解题思路:略(因为是模板题)示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=110;constdoubleeps=1e-7;intn;doublea[maxn][maxn];boolgauss(){for(inti=1;i<=n;i++......
  • csp35
    密码时间限制: 1.0秒空间限制: 512MiB相关文件: 题目目录(样例文件)题目背景西西艾弗网对用户密码有一套安全级别评定标准。题目描述在西西艾弗网上,用户的密码是一个由大写字母(A-Z)、小写字母(a-z)、数字(0-9)和特殊字符(* 和 #)共 6464 种字符组成的字符串。根据复杂程度......
  • 【决策单调性】P3648 [APIO2014] 序列分割 题解
    题目链接:P3648[APIO2014]序列分割(注:由于本题解的状态转移方程需要用到\(k\),所以原题中的\(k\)对应本题解中的\(m\)。)给你一个长度为\(n\)的序列\(A_1,A_2,...,A_n\),一开始把它看作一个块。初始你的分数为\(0\),现在你需要进行下列操作恰好\(m\)次:选一个块,并从一处......
  • WIFI&蓝牙(ESP32)转CAN总线&串口TTL模块 - micropython开发环境搭建
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ESP32_CAN"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p> 题外话:脚本语言运行原理: https:......
  • 【保姆级】免踩坑,快速在Arduino IDE搭建esp8266/esp32开发环境
    1.安装ArduinoIDE首先安装好ArduinoIDE推荐下载一个1.8.x的经典稳定版本入手开发,再下载一个最新的2.x版本的zip版本体验跳转、调试、快速编译等全新体验下载ArduinoIDEArduino官网下载2.添加附加开发板地址打开ArduinoIDE的菜单>文件>首选项,在附加开发板管理......
  • 【经验分享】怎样在ESP32平台上实现高效刷图动画
    此篇文章在2024年11月5日被记录怎样在ESP32上流畅的播放动画最近有一个预研项目,在ESP32上播放动画,于是来测试一下ESP32刷动态图的极限性能1.硬件以及内容描述名称描述CPUESP32S3@240MhzRAM512KB(IRAM(192KB)+DRAM(328KB))LCDILI9341分辨率240......
  • 用Beetle ESP32 C6复现ncnn_on_esp32
    前言偶然发现nihui大佬的知乎文章在esp32c3用ncnn跑神经网络mnist-知乎该项目的项目地址:GitHub-nihui/ncnn_on_esp32于是我买了一块BeetleESP32C6,尝试复现该项目。该开发板小巧可爱,性能也是比较好的。本博客希望能够通过列举自己在复现过程中遇到的问题,帮助同......
  • .m3u 格式的起源可以追溯到早期的计算机多媒体应用,尤其是在音频播放和流媒体播放的场
    .m3u是一种常用的播放列表文件格式,用于存储多媒体文件的路径,通常被媒体播放器(如VLC、WindowsMediaPlayer、Winamp等)所使用。它的文件内容是纯文本的,包含一个或多个媒体文件的路径,支持本地路径和网络地址。.m3u 格式的基本说明.m3u文件的基本结构非常简单,每一行一般包含一......
  • 基于ESP32的环境监测系统设计
    最终效果环境监测项目介绍该项目是“物联网实验室监测控制系统设计(仿智能家居)”项目中的“环境监测系统设计”子项目,前者还包括“物联网设计”、“门禁设计”、“家电控制设计”和“小程序设计”等内容。本文只介绍“环境监测”部分。项目功能实现的大致思路为:单片机采......