use wdev::Device;
use wobject::list::list_object::OperationDirection;
use crate::{
api::{garnet_status::GarnetStatus, hash_fields, hash_or_set_members, set_members},
storage::session::{
mainstore::{
bitmap_ops::{BitFieldOp, BitmapOp},
main_store_ops::LcsResult,
},
objectstore::{
common::{OBJ_TAG_HASH, OBJ_TAG_SET},
sorted_set_geo_ops::{GeoCenter, GeoCmd},
sorted_set_ops::{ZSetAggregate, ZSetRemoveRange},
},
storage_session::{StorageSession, StoreType},
},
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ObjectSubCommand {
Encoding,
RefCount,
IdleTime,
Freq,
}
pub struct IGarnetApi;
impl IGarnetApi {
pub async fn getex<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
ttl_ms: Option<u64>,
persist: bool,
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.getex(key, ttl_ms, persist).await
}
pub async fn set_conditional<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
val: &[u8],
nx: bool,
xx: bool,
get_old: bool,
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.set_conditional(key, val, nx, xx, get_old).await
}
pub async fn set_e_tag_conditional<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
val: &[u8],
etag: u64,
) -> wkv::Result<GarnetStatus> {
let _ = etag;
ss.upsert_string(key, val).await?;
Ok(GarnetStatus::Ok)
}
pub async fn del_e_tag_conditional<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
etag: u64,
) -> wkv::Result<GarnetStatus> {
ss.del_conditional(key, etag).await
}
pub async fn setex<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
val: &[u8],
ttl_ms: u64,
) -> wkv::Result<GarnetStatus> {
ss.setex(key, val, ttl_ms).await
}
pub async fn setrange<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
offset: usize,
val: &[u8],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.setrange(key, offset, val).await
}
pub async fn mset_conditional<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
values: &[&[u8]],
nx: bool,
) -> wkv::Result<GarnetStatus> {
ss.mset_conditional(keys, values, nx).await
}
pub async fn append<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
val: &[u8],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.append(key, val).await
}
pub async fn renamenx<D: Device>(
ss: &StorageSession<'_, D>,
old_key: &[u8],
new_key: &[u8],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.renamenx(old_key, new_key).await
}
pub async fn exists<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.exists(key).await
}
pub async fn increment_by_float<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
delta: f64,
) -> wkv::Result<(GarnetStatus, Option<f64>)> {
ss.increment_by_float(key, delta).await
}
pub async fn delifexpim<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.delifexpim(key).await
}
pub async fn getdel<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.getdel(key).await
}
pub async fn type_<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<Option<Vec<u8>>> {
ss.handle_type(key).await
}
pub async fn memoryusage<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<Option<usize>> {
ss.handle_memory_usage(key).await
}
pub async fn object<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
sub: ObjectSubCommand,
) -> wkv::Result<Option<Vec<u8>>> {
match sub {
ObjectSubCommand::Encoding => ss.handle_object_encoding(key).await,
ObjectSubCommand::RefCount => Ok(
ss.handle_object_ref_count(key)
.await?
.map(|c| c.to_string().into_bytes()),
),
ObjectSubCommand::IdleTime => Ok(
ss.handle_object_idle_time(key)
.await?
.map(|t| t.to_string().into_bytes()),
),
ObjectSubCommand::Freq => ss
.handle_object_freq(key)
.await
.map(|f| f.map(|v| v.to_string().into_bytes())),
}
}
pub async fn sorted_set_add<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
members: &[(&[u8], f64)],
nx: bool,
gt: bool,
lt: bool,
ch: bool,
) -> wkv::Result<(GarnetStatus, i64)> {
ss.sorted_set_add(key, members, nx, gt, lt, ch).await
}
pub async fn sorted_set_range_store<D: Device>(
ss: &StorageSession<'_, D>,
dest: &[u8],
src: &[u8],
start: i64,
stop: i64,
rev: bool,
) -> wkv::Result<(GarnetStatus, usize)> {
ss.sorted_set_range_store(dest, src, start, stop, rev).await
}
pub async fn sorted_set_remove<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
members: &[&[u8]],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.sorted_set_remove(key, members).await
}
pub async fn sorted_set_remove_range_by_lex<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
min: &[u8],
max: &[u8],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.sorted_set_remove_range_by_lex(key, min, max).await
}
pub async fn sorted_set_pop<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
count: usize,
min: bool,
) -> wkv::Result<(GarnetStatus, Vec<(Vec<u8>, f64)>)> {
ss.sorted_set_pop(key, count, min).await
}
pub async fn sorted_set_m_pop<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
count: usize,
min: bool,
) -> wkv::Result<(GarnetStatus, Option<(Vec<u8>, Vec<(Vec<u8>, f64)>)>)> {
ss.sorted_set_m_pop(keys, count, min).await
}
pub async fn sorted_set_increment<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
member: &[u8],
delta: f64,
) -> wkv::Result<(GarnetStatus, Option<f64>)> {
ss.sorted_set_increment(key, member, delta).await
}
pub async fn sorted_set_remove_range<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
range: ZSetRemoveRange<'_>,
) -> wkv::Result<(GarnetStatus, i64)> {
ss.sorted_set_remove_range(key, range).await
}
pub async fn sorted_set_remove_range_by_score<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
min: &[u8],
max: &[u8],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.sorted_set_remove_range_by_score(key, min, max).await
}
pub async fn sorted_set_remove_range_by_rank<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
start: i64,
stop: i64,
) -> wkv::Result<(GarnetStatus, i64)> {
ss.sorted_set_remove_range_by_rank(key, start, stop).await
}
pub async fn sorted_set_difference_store<D: Device>(
ss: &StorageSession<'_, D>,
dest: &[u8],
keys: &[&[u8]],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.sorted_set_difference_store(dest, keys).await
}
pub async fn geo_add<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
items: &[(f64, f64, &[u8])],
nx: bool,
ch: bool,
) -> wkv::Result<(GarnetStatus, i64)> {
ss.geo_add(key, items, nx, ch).await
}
pub async fn geo_search_store<D: Device>(
ss: &StorageSession<'_, D>,
dest: &[u8],
src: &[u8],
center: GeoCenter<'_>,
radius_m: f64,
) -> wkv::Result<(GarnetStatus, usize)> {
ss.geo_search_store(dest, src, center, radius_m).await
}
pub async fn sorted_set_intersect_store<D: Device>(
ss: &StorageSession<'_, D>,
dest: &[u8],
keys: &[&[u8]],
weights: &[f64],
aggregate: ZSetAggregate,
) -> wkv::Result<(GarnetStatus, usize)> {
ss.sorted_set_intersect_store(dest, keys, weights, aggregate)
.await
}
pub async fn sorted_set_union_store<D: Device>(
ss: &StorageSession<'_, D>,
dest: &[u8],
keys: &[&[u8]],
weights: &[f64],
aggregate: ZSetAggregate,
) -> wkv::Result<(GarnetStatus, usize)> {
ss.sorted_set_union_store(dest, keys, weights, aggregate)
.await
}
pub async fn sorted_set_expire<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
ttl_ms: u64,
) -> wkv::Result<(GarnetStatus, bool)> {
ss.sorted_set_expire(key, ttl_ms).await
}
pub async fn sorted_set_persist<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, bool)> {
ss.sorted_set_persist(key).await
}
pub async fn sorted_set_collect<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<usize> {
ss.sorted_set_collect(key).await
}
pub async fn set_add<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
members: &[&[u8]],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.set_add(key, members).await
}
pub async fn set_remove<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
members: &[&[u8]],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.set_remove(key, members).await
}
pub async fn set_pop<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
count: usize,
) -> wkv::Result<(GarnetStatus, Vec<Vec<u8>>)> {
ss.set_pop(key, count).await
}
pub async fn set_move<D: Device>(
ss: &StorageSession<'_, D>,
src: &[u8],
dest: &[u8],
member: &[u8],
) -> wkv::Result<(GarnetStatus, bool)> {
ss.set_move(src, dest, member).await
}
pub async fn set_random_member<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
count: i64,
) -> wkv::Result<(GarnetStatus, Vec<Vec<u8>>)> {
ss.set_random_member(key, count).await
}
pub async fn set_union_store<D: Device>(
ss: &StorageSession<'_, D>,
dest: &[u8],
keys: &[&[u8]],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.set_union_store(dest, keys).await
}
pub async fn set_intersect_store<D: Device>(
ss: &StorageSession<'_, D>,
dest: &[u8],
keys: &[&[u8]],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.set_intersect_store(dest, keys).await
}
pub async fn set_diff_store<D: Device>(
ss: &StorageSession<'_, D>,
dest: &[u8],
keys: &[&[u8]],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.set_diff_store(dest, keys).await
}
pub async fn list_position<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
element: &[u8],
rank: i64,
maxlen: Option<usize>,
) -> wkv::Result<(GarnetStatus, Option<usize>)> {
ss.list_position(key, element, rank, maxlen).await
}
pub async fn list_left_push<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
values: &[&[u8]],
only_if_exists: bool,
) -> wkv::Result<(GarnetStatus, Option<usize>)> {
ss.list_push(key, values, OperationDirection::Left, only_if_exists)
.await
}
pub async fn list_right_push<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
values: &[&[u8]],
only_if_exists: bool,
) -> wkv::Result<(GarnetStatus, Option<usize>)> {
ss.list_push(key, values, OperationDirection::Right, only_if_exists)
.await
}
pub async fn list_left_pop<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.list_pop(key, OperationDirection::Left).await
}
pub async fn list_right_pop<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.list_pop(key, OperationDirection::Right).await
}
pub async fn list_move<D: Device>(
ss: &StorageSession<'_, D>,
src: &[u8],
dest: &[u8],
src_dir: OperationDirection,
dest_dir: OperationDirection,
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.list_move(src, dest, src_dir, dest_dir).await
}
pub async fn list_trim<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
start: i64,
stop: i64,
) -> wkv::Result<GarnetStatus> {
ss.list_trim(key, start, stop).await
}
pub async fn list_insert<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
pivot: &[u8],
element: &[u8],
before: bool,
) -> wkv::Result<(GarnetStatus, Option<usize>)> {
ss.list_insert(key, pivot, element, before).await
}
pub async fn list_remove<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
element: &[u8],
count: i64,
) -> wkv::Result<(GarnetStatus, i64)> {
ss.list_remove(key, element, count).await
}
pub async fn list_set<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
index: i64,
element: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.list_set(key, index, element).await
}
pub async fn hash_set_when_not_exists<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
fields: &[(&[u8], &[u8])],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.hash_set(key, fields, true).await
}
pub async fn hash_delete<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
fields: &[&[u8]],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.hash_delete(key, fields).await
}
pub async fn hash_increment<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
field: &[u8],
delta: &[u8],
float: bool,
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.hash_increment(key, field, delta, float).await
}
pub async fn string_set_bit<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
offset: u64,
bit: u8,
) -> wkv::Result<(GarnetStatus, u8)> {
ss.string_set_bit(key, offset, bit).await
}
pub async fn string_bit_operation<D: Device>(
ss: &StorageSession<'_, D>,
op: BitmapOp,
dest: &[u8],
keys: &[&[u8]],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.string_bit_operation(op, dest, keys).await
}
pub async fn string_bit_field<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
ops: &[BitFieldOp],
) -> wkv::Result<(GarnetStatus, Vec<Option<i64>>)> {
ss.string_bit_field(key, ops).await
}
pub async fn hyper_log_log_add<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
elements: &[&[u8]],
) -> wkv::Result<(GarnetStatus, i32)> {
ss.hyper_log_log_add(key, elements).await
}
pub async fn hyper_log_log_merge<D: Device>(
ss: &StorageSession<'_, D>,
dest: &[u8],
sources: &[&[u8]],
) -> wkv::Result<GarnetStatus> {
ss.hyper_log_log_merge(dest, sources).await
}
pub async fn vector_set_add<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_add(key).await
}
pub async fn vector_set_remove<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_remove(key).await
}
pub async fn vector_set_set_attribute<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_set_attribute(key).await
}
pub async fn get_for_memory_result<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.read_main_store(key).await
}
pub async fn lcs<D: Device>(
ss: &StorageSession<'_, D>,
key1: &[u8],
key2: &[u8],
) -> wkv::Result<(GarnetStatus, Option<LcsResult>)> {
ss.lcs(key1, key2).await
}
pub async fn getrange<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
start: i64,
end: i64,
) -> wkv::Result<Vec<u8>> {
ss.getrange(key, start, end).await
}
pub async fn sorted_set_length<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.sorted_set_length(key).await
}
pub async fn sorted_set_range<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
start: i64,
stop: i64,
rev: bool,
with_scores: bool,
) -> wkv::Result<(GarnetStatus, Vec<(Vec<u8>, Option<f64>)>)> {
ss.sorted_set_range(key, start, stop, rev, with_scores)
.await
}
pub async fn sorted_set_score<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
member: &[u8],
) -> wkv::Result<(GarnetStatus, Option<f64>)> {
ss.sorted_set_score(key, member).await
}
pub async fn sorted_set_scores<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
members: &[&[u8]],
) -> wkv::Result<(GarnetStatus, Vec<Option<f64>>)> {
ss.sorted_set_scores(key, members).await
}
pub async fn sorted_set_count<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
min: &[u8],
max: &[u8],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.sorted_set_count(key, min, max).await
}
pub async fn sorted_set_length_by_value<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
min: &[u8],
max: &[u8],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.sorted_set_length_by_value(key, min, max).await
}
pub async fn sorted_set_rank<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
member: &[u8],
rev: bool,
) -> wkv::Result<(GarnetStatus, Option<i64>)> {
ss.sorted_set_rank(key, member, rev).await
}
pub async fn sorted_set_random_member<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
count: i64,
with_scores: bool,
) -> wkv::Result<(GarnetStatus, Vec<(Vec<u8>, Option<f64>)>)> {
ss.sorted_set_random_member(key, count, with_scores).await
}
pub async fn sorted_set_difference<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
) -> wkv::Result<(GarnetStatus, Vec<(Vec<u8>, f64)>)> {
ss.sorted_set_difference(keys).await
}
pub async fn sorted_set_union<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
weights: &[f64],
aggregate: ZSetAggregate,
) -> wkv::Result<(GarnetStatus, Vec<(Vec<u8>, f64)>)> {
ss.sorted_set_union(keys, weights, aggregate).await
}
pub async fn sorted_set_scan<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
cursor: &[u8],
pattern: &[u8],
count: usize,
) -> wkv::Result<(GarnetStatus, Vec<u8>, Vec<Vec<u8>>)> {
ss.sorted_set_scan(key, cursor, pattern, count).await
}
pub async fn sorted_set_intersect<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
weights: &[f64],
aggregate: ZSetAggregate,
) -> wkv::Result<(GarnetStatus, Vec<(Vec<u8>, f64)>)> {
ss.sorted_set_intersect(keys, weights, aggregate).await
}
pub async fn sorted_set_intersect_length<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
weights: &[f64],
aggregate: ZSetAggregate,
) -> wkv::Result<(GarnetStatus, usize)> {
ss.sorted_set_intersect_length(keys, weights, aggregate)
.await
}
pub async fn sorted_set_time_to_live<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.sorted_set_time_to_live(key).await
}
pub async fn geo_commands<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
cmd: GeoCmd<'_>,
) -> wkv::Result<(GarnetStatus, Vec<Option<Vec<u8>>>)> {
ss.geo_commands(key, cmd).await
}
pub async fn geo_search_read_only<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
center: GeoCenter<'_>,
radius_m: f64,
) -> wkv::Result<(GarnetStatus, Vec<(Vec<u8>, f64)>)> {
ss.geo_search_read_only(key, center, radius_m).await
}
pub async fn list_length<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.list_length(key).await
}
pub async fn list_range<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
start: i64,
stop: i64,
) -> wkv::Result<(GarnetStatus, Vec<Vec<u8>>)> {
ss.list_range(key, start, stop).await
}
pub async fn list_index<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
index: i64,
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.list_index(key, index).await
}
pub async fn set_length<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.set_length(key).await
}
pub async fn set_members<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Vec<Vec<u8>>)> {
ss.set_members(key).await
}
pub async fn set_is_member<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
member: &[u8],
) -> wkv::Result<(GarnetStatus, bool)> {
ss.set_is_member(key, member).await
}
pub async fn set_scan<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
cursor: &[u8],
pattern: &[u8],
count: usize,
) -> wkv::Result<(GarnetStatus, Vec<u8>, Vec<Vec<u8>>)> {
ss.object_scan(key, OBJ_TAG_SET, pattern, cursor, count, set_members)
.await
}
pub async fn set_union<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
) -> wkv::Result<(GarnetStatus, Vec<Vec<u8>>)> {
ss.set_union(keys).await
}
pub async fn set_intersect<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
) -> wkv::Result<(GarnetStatus, Vec<Vec<u8>>)> {
ss.set_intersect(keys).await
}
pub async fn set_diff<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
) -> wkv::Result<(GarnetStatus, Vec<Vec<u8>>)> {
ss.set_diff(keys).await
}
pub async fn set_intersect_length<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.set_intersect_length(keys).await
}
pub async fn hash_get<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
field: &[u8],
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.hash_get(key, field).await
}
pub async fn hash_get_multiple<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
fields: &[&[u8]],
) -> wkv::Result<(GarnetStatus, Vec<Option<Vec<u8>>>)> {
ss.hash_get_multiple(key, fields).await
}
pub async fn hash_get_all<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Vec<(Vec<u8>, Vec<u8>)>)> {
ss.hash_get_all(key).await
}
pub async fn hash_length<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.hash_length(key).await
}
pub async fn hash_str_length<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
field: &[u8],
) -> wkv::Result<(GarnetStatus, Option<usize>)> {
ss.hash_str_length(key, field).await
}
pub async fn hash_exists<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
field: &[u8],
) -> wkv::Result<(GarnetStatus, bool)> {
ss.hash_exists(key, field).await
}
pub async fn hash_random_field<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
count: i64,
with_values: bool,
) -> wkv::Result<(GarnetStatus, Vec<(Vec<u8>, Option<Vec<u8>>)>)> {
ss.hash_random_field(key, count, with_values).await
}
pub async fn hash_keys<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Vec<Vec<u8>>)> {
ss.hash_keys(key).await
}
pub async fn hash_vals<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Vec<Vec<u8>>)> {
ss.hash_vals(key).await
}
pub async fn hash_scan<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
cursor: &[u8],
pattern: &[u8],
count: usize,
) -> wkv::Result<(GarnetStatus, Vec<u8>, Vec<Vec<u8>>)> {
ss.object_scan(key, OBJ_TAG_HASH, pattern, cursor, count, hash_fields)
.await
}
pub async fn hash_time_to_live<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, i64)> {
ss.hash_time_to_live(key).await
}
pub async fn string_get_bit<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
offset: u64,
) -> wkv::Result<(GarnetStatus, u8)> {
ss.string_get_bit(key, offset).await
}
pub async fn string_bit_count<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
start: i64,
end: i64,
bit_mode: bool,
) -> wkv::Result<(GarnetStatus, u64)> {
ss.string_bit_count(key, start, end, bit_mode).await
}
pub async fn string_bit_position<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
bit: u8,
start: i64,
end: i64,
bit_mode: bool,
) -> wkv::Result<(GarnetStatus, i64)> {
ss.string_bit_position(key, bit, start, end, bit_mode).await
}
pub async fn string_bit_field_read_only<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
gets: &[(bool, u8, u64)],
) -> wkv::Result<(GarnetStatus, Vec<Option<i64>>)> {
ss.string_bit_field_read_only(key, gets).await
}
pub async fn hyper_log_log_length<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, f64)> {
ss.hyper_log_log_length(key).await
}
pub async fn get_db_keys<D: Device>(
ss: &StorageSession<'_, D>,
pattern: &[u8],
) -> wkv::Result<Vec<Vec<u8>>> {
ss.db_keys(pattern).await
}
pub async fn get_db_size<D: Device>(ss: &StorageSession<'_, D>) -> wkv::Result<usize> {
ss.db_size().await
}
pub async fn db_scan<D: Device>(
ss: &StorageSession<'_, D>,
pattern: &[u8],
all_keys: bool,
cursor: &[u8],
count: usize,
) -> wkv::Result<(Vec<u8>, Vec<Vec<u8>>)> {
ss.db_scan(pattern, all_keys, cursor, count).await
}
pub async fn iterate_store<D: Device>(
ss: &StorageSession<'_, D>,
on_record: impl FnMut(&[u8], &[u8]) -> bool,
) -> wkv::Result<usize> {
ss.iterate_store(on_record).await
}
pub async fn delete_slot_keys<D: Device>(
ss: &StorageSession<'_, D>,
slots: &[u16],
) -> wkv::Result<u64> {
ss.delete_slot_keys(slots).await
}
pub async fn object_scan<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
tag: u8,
cursor: &[u8],
pattern: &[u8],
count: usize,
) -> wkv::Result<(GarnetStatus, Vec<u8>, Vec<Vec<u8>>)> {
ss.object_scan(key, tag, pattern, cursor, count, hash_or_set_members)
.await
}
pub fn reset_scratch_buffer() {}
pub async fn vector_set_cardinality<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_cardinality(key).await
}
pub async fn vector_set_is_member<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_is_member(key).await
}
pub async fn vector_set_links<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_links(key).await
}
pub async fn vector_set_random_members<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_random_members(key).await
}
pub async fn vector_set_value_similarity<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_value_similarity(key).await
}
pub async fn vector_set_element_similarity<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_element_similarity(key).await
}
pub async fn vector_set_embedding<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_embedding(key).await
}
pub async fn vector_set_raw_embedding<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_raw_embedding(key).await
}
pub async fn vector_set_dimensions<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_dimensions(key).await
}
pub async fn vector_set_info<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_info(key).await
}
pub async fn vector_set_get_attribute<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<GarnetStatus> {
ss.vector_set_get_attribute(key).await
}
pub fn watch<D: Device>(ss: &StorageSession<'_, D>, key: &[u8], store_type: StoreType) {
ss.watch(key, store_type);
}
}