Crate stal [] [src]

stal-rs

Set algebra solver for Redis in Rust, based on Stal.

Description

stal-rs provide set operations and resolves them in Redis.

Usage

stal-rs has no dependencies. It produces a vector of Redis operations that have to be run by the user.

extern crate stal;

let foobar = stal::Set::Inter(vec![stal::Set::Key(b"foo".to_vec()), stal::Set::Key(b"bar".to_vec())]);
let foobar_nobaz = stal::Set::Diff(vec![foobar, stal::Set::Key(b"baz".to_vec())]);
let foobar_nobaz_andqux = stal::Set::Union(vec![stal::Set::Key(b"qux".to_vec()), foobar_nobaz]);

assert_eq!(
   stal::Stal::new("SMEMBERS".to_string(), foobar_nobaz_andqux).solve(),
   (
    vec![
        vec![b"MULTI".to_vec()],
        vec![b"SINTERSTORE".to_vec(), b"stal:2".to_vec(), b"foo".to_vec(), b"bar".to_vec()],
        vec![b"SDIFFSTORE".to_vec(), b"stal:1".to_vec(), b"stal:2".to_vec(), b"baz".to_vec()],
        vec![b"SUNIONSTORE".to_vec(), b"stal:0".to_vec(), b"qux".to_vec(), b"stal:1".to_vec()],
        vec![b"SMEMBERS".to_vec(), b"stal:0".to_vec()],
        vec![b"DEL".to_vec(), b"stal:0".to_vec(), b"stal:1".to_vec(), b"stal:2".to_vec()],
        vec![b"EXEC".to_vec()],
    ],
    4
   ));

stal-rs translates the internal calls to SUNION, SDIFF and SINTER into SDIFFSTORE, SINTERSTORE and SUNIONSTORE to perform the underlying operations, and it takes care of generating and deleting any temporary keys.

The outmost command can be any set operation, for example:

extern crate stal;
let myset = stal::Set::Key(b"my set".to_vec());
stal::Stal::new("SCARD".to_string(), myset).solve();

If you want to preview the commands Stal will send to generate the results, you can use Stal.explain:

extern crate stal;

assert_eq!(
stal::Stal::new("SMEMBERS".to_string(),
        stal::Set::Inter(vec![
            stal::Set::Union(vec![
                stal::Set::Key(b"foo".to_vec()),
                stal::Set::Key(b"bar".to_vec()),
                ]),
            stal::Set::Key(b"baz".to_vec()),
            ])
        ).explain(),
vec![
    vec![b"SUNIONSTORE".to_vec(), b"stal:1".to_vec(), b"foo".to_vec(), b"bar".to_vec()],
    vec![b"SINTERSTORE".to_vec(), b"stal:0".to_vec(), b"stal:1".to_vec(), b"baz".to_vec()],
    vec![b"SMEMBERS".to_vec(), b"stal:0".to_vec()],
]
)

All commands are wrapped in a MULTI/EXEC transaction.

Structs

Stal

An operation to be executed on a set

Enums

Set

A set of values. It can be generated from a Redis key or from a set operation based on other sets.