limousine_engine 0.3.1

limousine_engine can reason about a large design continuum of hybrid key-value store designs and materialize an optimal implementation using procedural macros.
Documentation

limousine_engine provides a procedural macro to automatically generate an hybrid key-value store design consisting of both classical and learned components.

As of the current version, learned components are not yet fully supported.

use limousine_engine::prelude::*;

create_kv_store! {
name: ExampleStore,
layout: [
btree_top(),
pgm(epsilon = 8),
pgm(epsilon = 8),
btree(fanout = 32),
btree(fanout = 32, persist),
btree(fanout = 64, persist)   
]
}

To generate a design, we provide a name for the structure and a layout description which consists of a stack of components. For instance in the above example, the key-value store consists of a base layer of on-disk BTree nodes of fanout 64, underneath a
layer of on on-disk BTree nodes with fanout 32, underneath an in-memory layer of BTree nodes with fanout 32. On top of this, we have two in-memory PGM learned layers with epsilon parameters of 8, and a tiny in-memory BTree as a top layer.

Since learned components are not yet fully supported, the above example will not compile. To get a working key-value store in the current version, we should only use BTree components.

use limousine_engine::prelude::*;

create_kv_store! {
name: ExampleStore,
layout: [
btree_top(),
btree(fanout = 8),
btree(fanout = 8),
btree(fanout = 32),
btree(fanout = 32, persist),
btree(fanout = 64, persist)   
]
}

We can then use these generated data structures to perform queries:

// Load the first two layer of the index from memory
let index: ExampleStore<u128, u128> = ExampleStore::open("data/index")?;

index.insert(10, 50)?;
index.insert(20, 60)?;
index.insert(30, 70)?;
index.insert(40, 80)?;

assert_eq!(index.search(10)?, Some(50));