use crate::store::StoreItem;
use crate::store::fst::{StoreFSTActionBuilder, StoreFSTMisc};
use crate::store::kv::StoreKVAcquireMode;
use crate::store::kv::StoreKVActionBuilder;
impl super::Executor {
pub fn count(&self, item: StoreItem) -> Result<u32, ()> {
match item {
StoreItem(collection, Some(bucket), Some(object)) => {
let _kv_read_guard = self.kv_pool.lock_read_access();
if let Ok(kv_store) = self
.kv_pool
.acquire(StoreKVAcquireMode::OpenOnly, collection)
{
executor_kv_lock_read!(kv_store);
let kv_action = StoreKVActionBuilder::access(bucket, kv_store);
let oid = object.as_str();
kv_action
.get_oid_to_iid(oid)
.unwrap_or(None)
.map(|iid| {
if let Some(terms) = kv_action.get_iid_to_terms(iid).unwrap_or(None) {
terms.len() as u32
} else {
0
}
})
.ok_or(())
.or(Ok(0))
} else {
Err(())
}
}
StoreItem(collection, Some(bucket), None) => {
let _fst_read_guard = self.fst_pool.lock_read_access();
if let Ok(fst_store) = self.fst_pool.acquire(collection, bucket) {
let fst_action = StoreFSTActionBuilder::access(fst_store);
Ok(fst_action.count_words() as u32)
} else {
Err(())
}
}
StoreItem(collection, None, None) => {
StoreFSTMisc::count_collection_buckets(collection, &self.app_conf.store.fst)
.map(|count| count as u32)
}
_ => Err(()),
}
}
}