#udf #scylla #macro

scylla-udf-macros

scylla-udf宏的实现

1 个不稳定版本

0.1.0 2023年2月15日

#22#udf

Download history 126/week @ 2024-03-13 61/week @ 2024-03-20 99/week @ 2024-03-27 59/week @ 2024-04-03 37/week @ 2024-04-10 112/week @ 2024-04-17 101/week @ 2024-04-24 91/week @ 2024-05-01 236/week @ 2024-05-08 298/week @ 2024-05-15 303/week @ 2024-05-22 196/week @ 2024-05-29 142/week @ 2024-06-05 130/week @ 2024-06-12 105/week @ 2024-06-19 99/week @ 2024-06-26

520 每月下载量
scylla-udf 中使用

MIT/Apache

22KB
354

Rust辅助库,用于Scylla UDFs

该crate允许编写纯Rust函数,这些函数可以用作Scylla UDFs。

注意:此crate是官方支持的,并准备好使用。但是,UDFs在ScyllaDB中仍然是实验性功能,该crate尚未得到广泛使用,这就是为什么它仍然处于beta版本,其API可能发生变化。我们感谢错误报告和拉取请求!

使用方法

先决条件

要在Scylla中使用此辅助库,您需要

编译

我们建议使用cargo设置。

  1. 从库包开始
cargo new --lib
  1. 将以下行添加到Cargo.toml中,以将crate类型设置为cdylib
[lib]
crate-type = ["cdylib"]
  1. 实现您的包,使用 scylla_udf::export_udf 宏导出Scylla UDFs。
  2. 使用wasm32-wasi目标构建包
cargo build --target=wasm32-wasi
  1. 找到编译的 .wasm 二进制文件。假设它是 target/wasm32-wasi/debug/abc.wasm
  2. (可选) 使用 wasm-opt -O3 target/wasm32-wasi/debug/abc.wasm 优化二进制文件(可以与使用 cargo build --release 配置文件一起使用)
  3. 将二进制文件转换为 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 类型 T1T2 等映射到 Rust 类型 RustT1RustT2 等,则可以在元组中使用它们

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