1 个不稳定版本
| 0.1.0 | 2023年2月15日 |
|---|
#22 在 #udf
520 每月下载量
在 scylla-udf 中使用
22KB
354 行
Rust辅助库,用于Scylla UDFs
该crate允许编写纯Rust函数,这些函数可以用作Scylla UDFs。
注意:此crate是官方支持的,并准备好使用。但是,UDFs在ScyllaDB中仍然是实验性功能,该crate尚未得到广泛使用,这就是为什么它仍然处于beta版本,其API可能发生变化。我们感谢错误报告和拉取请求!
使用方法
先决条件
要在Scylla中使用此辅助库,您需要
- Rust标准库
wasm32-wasi- 可以使用
rustup target add wasm32-wasi将其添加到rustup安装中 - 对于非rustup设置,您可以尝试按照 https://wasm.rust-lang.net.cn/docs/wasm-pack/prerequisites/non-rustup-setups.html 中的步骤进行
- 也可作为rpm提供:
rust-std-static-wasm32-wasi
- 可以使用
wasm2wat解析器- 在许多发行版的
wabt软件包中可用
- 在许多发行版的
编译
我们建议使用cargo设置。
- 从库包开始
cargo new --lib
- 将以下行添加到Cargo.toml中,以将crate类型设置为cdylib
[lib]
crate-type = ["cdylib"]
- 实现您的包,使用
scylla_udf::export_udf宏导出Scylla UDFs。 - 使用wasm32-wasi目标构建包
cargo build --target=wasm32-wasi
- 找到编译的
.wasm二进制文件。假设它是target/wasm32-wasi/debug/abc.wasm。 - (可选) 使用
wasm-opt -O3 target/wasm32-wasi/debug/abc.wasm优化二进制文件(可以与使用cargo build --release配置文件一起使用) - 将二进制文件转换为
wat
wasm2wat target/wasm32-wasi/debug/abc.wasm > target/wasm32/wasi/debug/abc.wat
CQL语句
生成的 target/wasm32/wasi/debug/abc.wat 代码现在可以直接用在 CREATE FUNCTION 语句中。生成的代码可能包含 ' 字符,因此可能需要先将其替换为 '',以便在 CQL 字符串中使用。
例如,如果您有一个使用逗号连接单词列表的 Rust UDF,您可以使用以下语句创建 Scylla UDF:
CREATE FUNCTION commas(string list<text>) CALLED ON NULL INPUT RETURNS text AS ' (module ...) '
CQL 类型映射
使用 #[export_udf] 注释的函数中使用的参数和返回值类型必须映射到 Scylla 中使用的 CREATE FUNCTION 语句中使用的 CQL 类型,如下表所示。
如果 Scylla 函数使用与 Rust 函数中使用的类型不匹配的类型创建,则调用 UDF 将失败或产生任意结果。
本地类型
| CQL 类型 | Rust 类型 |
|---|---|
| ASCII | String |
| BIGINT | i64 |
| BLOB | Vec<u8> |
| BOOLEAN | bool |
| COUNTER | scylla_udf::Counter |
| DATE | chrono::NaiveDate |
| DECIMAL | bigdecimal::Decimal |
| DOUBLE | f64 |
| DURATION | scylla_udf::CqlDuration |
| FLOAT | f32 |
| INET | std::net::IpAddr |
| INT | i32 |
| SMALLINT | i16 |
| TEXT | String |
| TIME | scylla_udf::Time |
| TIMESTAMP | scylla_udf::Timestamp |
| TIMEUUID | uuid::Uuid |
| TINYINT | i8 |
| UUID | uuid::Uuid |
| VARCHAR | String |
| VARINT | num_bigint::BigInt |
集合
如果 CQL 类型 T 映射到 Rust 类型 RustT,则可以使用它作为集合参数
| CQL 类型 | Rust 类型 |
|---|---|
| LIST<T> | Vec<RustT> |
| MAP<T> | std::collections::BTreeMap<RustT>, std::collections::HashMap<RustT> |
| SET<T> | Vec<RustT>, std::collections::BTreeSet<RustT>, std::collections::HashSet<RustT> |
元组
如果 CQL 类型 T1、T2 等映射到 Rust 类型 RustT1、RustT2 等,则可以在元组中使用它们
| CQL 类型 | Rust 类型 |
|---|---|
| TUPLE<T1, T2, ...> | (RustT1, RustT2, ...) |
空值
如果类型为 T 的 CQL 值,映射到类型 RustT,可能是空值(在非 RETURNS NULL ON NULL INPUT UDFs)中,Rust 函数中使用的类型应该是 Option<RustT>。
贡献
通常,尽量遵循 https://github.com/scylladb/scylla-rust-driver/blob/main/CONTRIBUTING.md 中的相同规则。
测试
这个crate旨在编译为 wasm32-wasi 目标,并在 WASM 运行时中运行。使用 WASM 专用代码的测试很可能在以不同的方式执行时(特别是使用简单的 cargo test 命令)无法成功。
例如,如果您已安装并设置在 PATH 中的 wasmtime 运行时,可以使用以下命令运行测试
CARGO_TARGET_WASM32_WASI_RUNNER="wasmtime --allow-unknown-exports" cargo test --target=wasm32-wasi
依赖
~1.5MB
~35K SLoC