use wdev::Device;
use wobject::list::list_object::OperationDirection;
use crate::{
api::{garnet_status::GarnetStatus, hash_fields, set_members},
storage::session::{
objectstore::{
common::{OBJ_TAG_HASH, OBJ_TAG_SET},
sorted_set_geo_ops::{GeoCenter, GeoCmd},
sorted_set_ops::{ZSetAggregate, ZSetRemoveRange},
},
storage_session::StorageSession,
},
};
pub struct GarnetApiObjectCommands;
impl GarnetApiObjectCommands {
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_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_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_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_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_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_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_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_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 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_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_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_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_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_intersection<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
weights: &[f64],
aggregate: ZSetAggregate,
) -> wkv::Result<(GarnetStatus, Vec<(Vec<u8>, f64)>)> {
ss.sorted_set_intersection(keys, weights, aggregate).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_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_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 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_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_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_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_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_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_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 set_intersect_length<D: Device>(
ss: &StorageSession<'_, D>,
keys: &[&[u8]],
) -> wkv::Result<(GarnetStatus, usize)> {
ss.set_intersect_length(keys).await
}
pub async fn list_push<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
values: &[&[u8]],
direction: OperationDirection,
only_if_exists: bool,
) -> wkv::Result<(GarnetStatus, Option<usize>)> {
ss.list_push(key, values, direction, only_if_exists).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_pop<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
direction: OperationDirection,
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.list_pop(key, direction).await
}
pub async fn list_pop_multiple<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
count: usize,
direction: OperationDirection,
) -> wkv::Result<(GarnetStatus, Vec<Vec<u8>>)> {
ss.list_pop_multiple(key, count, direction).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_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_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_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_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_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 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<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
fields: &[(&[u8], &[u8])],
nx: bool,
) -> wkv::Result<(GarnetStatus, i64)> {
ss.hash_set(key, fields, nx).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_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_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 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 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_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 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
}
}