- 向量数据库
- 数据库
- 人工智能
- 后端
【免费下载链接】lancedb
Developer-friendly OSS embedded retrieval library for multimodal AI. Search More; Manage Less.
导读
RefreshColumnResult是 LanceDB 官方 Node.js SDK(@lancedb/lancedb)中由Table#refreshColumn返回的结果对象,用于描述一次"计算列(computed column)刷新"的执行结果。它只有两个字段:本次实际填充的行数rowsFilled,以及刷新提交后表的新版本号version。读完本文,你将掌握该接口每个字段的精确语义、它与addColumns计算列声明机制的关系、本地表与云端(LanceDB Cloud/Enterprise)行为差异,以及如何通过源码与测试验证其真实行为。
一、接口定义:两个字段,各司其职
该接口由 TypeDoc 自动生成于 docs/src/js/interfaces/RefreshColumnResult.md,原始定义极为精炼:
interface RefreshColumnResult { rowsFilled: number; version: number; }| 属性 | 类型 | 语义 |
|---|---|---|
rowsFilled | number | 本次刷新实际填充(或重算)的行数。注意:只统计请求列自身被写入值的行,不包含为满足该列依赖而顺带填充的其他计算列 |
version | number | 本次刷新操作关联的表提交版本号;若刷新没有产生任何数据写入,则该值回落到读取时的源版本 |
在 nodejs/lancedb/table.ts 中,refreshColumn的 JSDoc 对该返回对象作了官方注释:
@returns {Promise<RefreshColumnResult>} A promise that resolves to the number of rows filled and the new version number of the table.
即:“解析为已填充行数与表的新版本号”。这正是两个字段的完整概括。
二、数据来源:本地表的 Rust 核心实现
RefreshColumnResult并非 JS 层凭空构造,而是来自 Rust 核心层。在 nodejs/src/table.rs 中,Node 绑定通过 napi 定义了同名字段(snake_case 自动映射为 JS 的 camelCase):
#[napi(object)] pub struct RefreshColumnResult { pub rows_filled: i64, pub version: i64, }而真正的计算逻辑位于 rust/lancedb/src/table/refresh.rs 的lancedb::table::RefreshColumnResult:
pub struct RefreshColumnResult { /// Rows that had a value computed, in the requested column only; inputs /// filled on its behalf are not counted. pub rows_filled: u64, /// The commit version associated with the operation. pub version: u64, }这里的注释给出了rowsFilled最关键的一条语义:只统计请求列本身被计算出的行,不把“为其输入的依赖列”顺带填充的行计入。从源码结构看,这一计数由execute_refresh_column_with_source内部的fill_stream与gained(AtomicU64)逐 fragment 累加得出,最终经Dataset::commit提交后,把rows_filled与新的version一并返回。
version字段的取值有两种路径(见 refresh.rs):
- 有数据写入:以
Dataset::commit(Operation::DataReplacement, ...)提交后,返回新提交的版本号; - 无数据可填(
replacements.is_empty()):此时不会产生新提交,version取读取时的source_version(即当前最新版本),仅可能在内部记录 freshness 印记时更新。
三、配套方法:refreshColumn与refreshColumnAsync
该结果对象由两个公开 API 产出,二者共用同一份核心逻辑:
await table.refreshColumn(column):阻塞直到刷新完成,直接返回RefreshColumnResult(见 table.ts)。await table.refreshColumnAsync(column):返回Job句柄,不阻塞;调用方须await job.wait()后再确认数据已填充,且非法输入(未知列、非计算列)会在此处立即 reject,而不是等到任务失败(见 table.ts)。
本地表场景下,refreshColumnAsync的任务在当前进程内以tokio::spawn执行(见 refresh.rs);在 LanceDB Cloud 与 Enterprise 上,刷新则以服务端 job的形式运行。
最小可运行示例
结合Table#addColumns的官方示例与 nodejs/test/table.test.ts 的测试用例,完整的“声明计算列 → 刷新 → 读取结果”流程如下:
import { connect } from "@lancedb/lancedb"; const db = await connect("./data"); const table = await db.createTable("computed", [{ x: 1 }, { x: 2 }]); // 1. 声明计算列:此时只存储表达式,不计算任何值 await table.addColumns({ computed: [{ name: "doubled", valueSql: "x * 2" }], }); // 声明后该列全为 null let rows = await table.query().toArray(); console.log(rows.map((r) => r.doubled)); // [null, null] // 2. 刷新计算列:填充 2 行,返回结果对象 const result = await table.refreshColumn("doubled"); console.log(result.rowsFilled); // 2 console.log(result.version); // 例如 2(提交后的新版本号) rows = await table.query().toArray(); console.log(rows.map((r) => r.doubled).sort()); // [2, 4]测试用例还验证了追加后的增量填充行为(table.test.ts):第一次refreshColumn后add([{ x: 5 }])再刷新,rowsFilled为1——只填充新追加的那一行,旧行保持不变。这正是rowsFilled作为“本次实际写入行数”而非“表总行数”的含义。
四、语义边界与底层原理
1. 刷新 = 填充 + 重算
按 add_columns.rs 的文档说明:addColumns({ computed })只是声明——列以无值状态提交,声明成本与表大小无关;真正的求值推迟到refreshColumn。而一次刷新会做两件事:
- 填充上次刷新以来新追加的、仍为 null 的行;
- 重算那些“输入在计算后发生变化”的行,使输入变更在下一次刷新时得以反映。
因此rowsFilled是“本次被写入/被重算”的行数,既可能是全量(首次刷新),也可能是增量(追加后的刷新)。
2. 依赖顺序约束
ensure_inputs_filled(refresh.rs)会在刷新前检查:若请求列读取了另一个计算列,而后者尚有未填充行,则拒绝刷新并报错(提示“先刷新依赖列”),防止把占位 null 当成真实值计算并保留下来。
3. LSM 写规范下的拒绝
ensure_no_lsm_write_spec(refresh.rs)明确拒绝在启用 LSM 写规范的表上刷新:因为刷新枚举的是基础 fragment,而写规范会把可见行放在未压缩的 MemWAL 层中,导致刷新静默遗漏可读行。
4. 对输入的列级限制
计算列声明期间,其读取的输入列不能被重命名、改类型或删除——因为表达式按名字引用它们(见 add_columns.rs)。
五、测试与验证
- Node.js 集成测试:nodejs/test/table.test.ts 覆盖了首次刷新
rowsFilled === 2、refreshColumnAsync返回可wait()的 Job(job.status() === "finished")、追加后增量刷新rowsFilled === 1三类核心场景,同时验证非法列名会以"not a computed column"拒绝。 - Rust 核心测试:rust/lancedb/src/table/refresh.rs 等大量用例直接断言
refresh_column(...).rows_filled的精确数值,覆盖了含__lancedb_computed内部列的刷新、refresh_column_async的错误拒绝(refresh.rs)等边界。
六、小结
RefreshColumnResult是 LanceDB Node.js SDK 中计算列刷新流程的“对账凭据”:rowsFilled告诉你本次真正算了几行,version告诉你表被推到了哪个提交版本。理解它,就理解了 LanceDB “声明式计算列 + 惰性求值 + 增量刷新”这套数据流水线的核心反馈机制——无论是本地嵌入式表,还是 Cloud/Enterprise 的服务端 job 场景,你都能够用这两个字段可靠地监控刷新进度与结果。
更多相关接口可继续阅读:接口定义 RefreshColumnResult.md、配套返回类型 AddColumnsResult、任务句柄 Job。
- 向量数据库
- 数据库
- 人工智能
- 后端
【免费下载链接】lancedb
Developer-friendly OSS embedded retrieval library for multimodal AI. Search More; Manage Less.
相关推荐
LanceDB Node.js 客户端 RefreshMaterializedViewResult 接口详解:读懂物化视图刷新的四种返回值
LanceDB Node.js 客户端 RefreshMaterializedViewResult 接口详解:读懂物化视图刷新的四种返回值 RefreshMat
向量数据库数据库人工智能后端WarcraftHelper:让魔兽争霸III在现代电脑上焕发新生的终极解决方案
WarcraftHelper:让魔兽争霸III在现代电脑上焕发新生的终极解决方案 你是否还在为魔兽争霸III在现代Windows系统上的兼容性问题而烦恼?画面拉
向量数据库数据库人工智能后端探索语言模型新境界:RetNet深度解析与应用展望
探索语言模型新境界:RetNet深度解析与应用展望 在人工智能的浩瀚宇宙中,语言模型一直是闪耀的星体。随着Transformer架构的革新,我们迎来了一个更加强
向量数据库数据库人工智能后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考