Skip to content

feat(unnest): 增加表函数平铺支持 - #32

Merged
zhou-hao merged 2 commits into
masterfrom
codex/unnest-table-function
Jul 4, 2026
Merged

feat(unnest): 增加表函数平铺支持#32
zhou-hao merged 2 commits into
masterfrom
codex/unnest-table-function

Conversation

@zhou-ai-bot

Copy link
Copy Markdown
Contributor

目的

  • 新增 unnest / explode 表函数平铺能力,支持以 SQL 方言更通用的方式展开数组、集合、Map entries 和有限 Publisher。
  • 让实时数据处理中的一行多值展开可以通过 FROM unnest(...)cross join unnest(...) 表达,减少对 flat_array 固定写法的依赖。

核心变动

  • DefaultReactorQL:支持在 join 右侧使用 TableFunction,让 cross join unnest(src.items) as u(value) 能访问左侧当前行上下文。
  • UnnestFeature:新增 unnest / explode 表函数实现,支持单参数、多参数、别名列、Map key/value 和命名列映射。
  • DefaultReactorQLMetadata:注册 unnestexplode 表函数,补充 arrayarray_valuelist_valuelist_pack 数组构造函数,并为 select flat-map 注册 unnestexplodeeach 别名。
  • ValueMapFeature:支持 ARRAY[...] 构造表达式,并避免表函数与 flat-map 函数同名时误报使用位置。
  • 测试:补充表函数、cross join、Map entries、Publisher、别名列和兼容 flat-map 写法的覆盖。

设计与测试目标

  • 设计稿:不适用;本次为 ReactorQL SQL 函数能力补充,需求与验收点已在当前任务上下文确认。
  • 用户确认:已确认提交 PR。
  • 测试目标:覆盖正常路径、别名列、空输入、参数错误、Map key/value、命名列映射、有限 Publisher、ARRAY[...] 构造和 flat_array 兼容别名。
  • 注释 / 公共契约:适用;新增 UnnestFeature 已补类级说明,join 表函数上下文传递处已补关键逻辑注释,不涉及 SPI 方法新增。
  • 数据权限:不适用;不涉及 JetLinks 资产权限或 CRUD 数据权限。
  • 数据库兼容与性能:适用;语法对齐常见 SQL unnest / explode / ARRAY[...] 用法,不涉及数据库连接、索引、分页或原生 SQL 下推。
  • 链路追踪:不适用;不涉及业务链路、外部 I/O 或 TraceHolder 上下文写入。
  • MBean 运维可观测性:不适用;不新增常驻任务、缓存、队列或后台执行器。

测试结果

  • 命令:mvn test
  • 新增/更新测试:UnnestFeatureTest 覆盖表函数默认列名、别名列、空参数、cross join、Map entries、命名列映射、有限 Publisher 和 unnest / explode / each flat-map 别名;ReactorQLTest 补充方言兼容平铺、表函数、cross join 和 Map entries 场景。
  • 单元测试:272 passed, 0 failed, 0 skipped
  • 集成测试:不适用;未涉及数据库、消息、事件、协议、跨模块边界、外部依赖或启动装配。
  • 压力测试:不适用;本次为单行平铺算子能力,未新增跨源排序、join 或大文件缓存逻辑。
  • 覆盖率:line 94.84%, branch 81.92%

文档同步情况

  • 已同步:无;当前仓库未提供对应长期函数手册落点。
  • 未同步:无;后续可在上层 ai-agent / rule-editor ReactorQL 手册中引用本 PR 的通用 unnest 用法。
  • 说明:README 未涉及长期总览变化;测试证据放 PR / CI,未新增独立任务流水文档。

风险与说明

  • 影响范围:ReactorQL 函数注册、表达式解析、FROM 表函数和 join 右侧表函数处理。
  • 注释 / 公共契约:已补 UnnestFeature 类注释和 join 表函数处理注释,不涉及 SPI 契约变更。
  • 链路追踪 / 可观测性:不涉及。
  • MBean / 运维可观测性:不涉及。
  • 未覆盖场景:未覆盖无界 Publisher 作为 unnest 参数的长期运行场景;该能力应只用于有限数组、集合、Map entries 或有限流。
  • 已知限制:多参数 unnest 会先收集各参数展开结果后按最大长度补齐,适合有限参数;对无界流应继续使用流式算子组合而不是表函数 zip 展开。

@codecov

codecov Bot commented Jul 4, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 94.07407% with 8 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.36%. Comparing base (8c99f80) to head (0747de2).

Files with missing lines Patch % Lines
...java/org/jetlinks/reactor/ql/DefaultReactorQL.java 66.66% 3 Missing and 1 partial ⚠️
...tlinks/reactor/ql/supports/from/UnnestFeature.java 96.51% 0 Missing and 3 partials ⚠️
...ks/reactor/ql/supports/map/PropertyMapFeature.java 88.88% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##             master      #32      +/-   ##
============================================
+ Coverage     88.17%   88.36%   +0.18%     
- Complexity     1832     1873      +41     
============================================
  Files            77       78       +1     
  Lines          4898     5026     +128     
  Branches        765      784      +19     
============================================
+ Hits           4319     4441     +122     
- Misses          259      260       +1     
- Partials        320      325       +5     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@zhou-hao
zhou-hao merged commit d430595 into master Jul 4, 2026
3 of 4 checks passed
@zhou-hao
zhou-hao deleted the codex/unnest-table-function branch July 4, 2026 11:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants