use crate::{
key::TxKey,
lock_guards::LockGuards,
lock_policies::lock_policy::LockPolicy,
new_types::BitMask,
prepared::{ops::op_trait::OpTrait, schema::TxKeySelector},
result::MISSING_LOCK_GUARD_ERROR,
};
use std::hash::Hash;
pub(crate) struct GetOp<'tx, K, V, KEYS, PARAMS, STATE>
where
K: Hash + Eq,
{
pub key_selector: Box<dyn TxKeySelector<TxKey<K>, KEYS> + 'tx>,
#[allow(clippy::type_complexity)]
pub get: Box<dyn Fn(&K, Option<&V>, &PARAMS, &mut STATE) + 'tx>,
}
impl<'tx, K, V, L, KEYS, PARAMS, STATE> OpTrait<K, V, L, KEYS, PARAMS, STATE>
for GetOp<'tx, K, V, KEYS, PARAMS, STATE>
where
K: Hash + Eq + 'tx,
V: 'tx,
L: LockPolicy + 'tx,
KEYS: 'tx,
PARAMS: 'tx,
STATE: Default + 'tx,
{
fn read_write_bitmasks(&self, keys: &KEYS) -> (BitMask, BitMask) {
(
self.key_selector.get(keys).shard_index.bitmask(),
BitMask::ZERO,
)
}
fn apply(
&self,
lock_guards: &mut LockGuards<'_, K, V, L>,
keys: &KEYS,
params: &PARAMS,
state: &mut STATE,
) {
let key = self.key_selector.get(keys);
if (key.shard_index.bitmask() & lock_guards.write_bitmask) != BitMask::ZERO {
let value_ref = lock_guards
.write
.get(key.shard_index.0)
.expect(MISSING_LOCK_GUARD_ERROR)
.find(key.hash_code.0, |entry| entry.0 == key.key)
.map(|(_, value)| value);
(self.get)(&key.key, value_ref, params, state)
} else {
let value_ref = lock_guards
.read
.get(key.shard_index.0)
.expect(MISSING_LOCK_GUARD_ERROR)
.find(key.hash_code.0, |entry| entry.0 == key.key)
.map(|(_, value)| value);
(self.get)(&key.key, value_ref, params, state)
}
}
}