144 releases (53 breaking)

new 0.54.1 Mar 10, 2025
0.53.2 Feb 12, 2025
0.50.4 Dec 27, 2024
0.49.1 Nov 25, 2024
0.1.0 Mar 5, 2022

#96 in Encoding

Download history 135140/week @ 2024-11-19 63555/week @ 2024-11-26 96876/week @ 2024-12-03 160967/week @ 2024-12-10 104040/week @ 2024-12-17 32236/week @ 2024-12-24 85927/week @ 2024-12-31 146818/week @ 2025-01-07 134501/week @ 2025-01-14 125129/week @ 2025-01-21 120776/week @ 2025-01-28 138952/week @ 2025-02-04 131926/week @ 2025-02-11 157317/week @ 2025-02-18 195979/week @ 2025-02-25 144001/week @ 2025-03-04

655,803 downloads per month
Used in 12 crates (3 directly)

Apache-2.0

72KB
1.5K SLoC

substrait-rs

substrait

crates.io docs.rs

Rust crate for Substrait: Cross-Language Serialization for Relational Algebra.

Documentation


lib.rs:

Substrait: Cross-Language Serialization for Relational Algebra

Serialization and deserialization

This crate provides generated types to serialize and deserialize Substrait data.

Protobuf

Protobuf serialization and deserialization are provided via [prost] in the [proto] module.

Example

Serialize and deserialize a plan

use prost::Message;
use substrait::proto::Plan;

let plan = Plan::default();

// Serialize the plan
let encoded = plan.encode_to_vec();

// Deserialize the buffer to a Plan
let decoded = Plan::decode(encoded.as_slice())?;

assert_eq!(plan, decoded);

Serde support

The serde feature generates serde implementations that match the Protobuf JSON Mapping via pbjson.

Example
Deserialize a plan version using the serde feature
use substrait::proto::Version;

let version_json = r#"{
  "minorNumber": 21
}"#;

let version = serde_json::from_str::<Version>(version_json)?;
assert_eq!(
  version,
  Version {
    minor_number: 21,
    ..Default::default()
  }
);

Text

Substrait defines a YAML schema for extensions. Types with serialization and deserialization support for these are provided via typify in the [text] module.

Example

Read a simple extension

use substrait::text::simple_extensions::SimpleExtensions;

let simple_extension_yaml = r#"
%YAML 1.2
---
scalar_functions:
  -
    name: "add"
    description: "Add two values."
    impls:
      - args:
         - name: x
           value: i8
         - name: y
           value: i8
        options:
          overflow:
            values: [ SILENT, SATURATE, ERROR ]
        return: i8
"#;

let simple_extension = serde_yaml::from_str::<SimpleExtensions>(simple_extension_yaml)?;

assert_eq!(simple_extension.scalar_functions.len(), 1);
assert_eq!(simple_extension.scalar_functions[0].name, "add");

Dependencies

~4–8.5MB
~172K SLoC