use crate::infinitedb_core::{
address::{DimensionVector, SpaceId},
space::SpaceRegistry,
};
use super::query::space_key;
pub const DEFAULT_SHARD_BITS: u32 = 4;
pub fn shard_count(shard_bits: u32) -> u32 {
1u32.checked_shl(shard_bits.min(16)).unwrap_or(1)
}
pub fn hilbert_shard_id(key: u128, shard_bits: u32) -> u32 {
if shard_bits == 0 {
return 0;
}
let shift = 128u32.saturating_sub(shard_bits.min(16));
(key >> shift) as u32
}
pub fn shard_for_point(
spaces: &SpaceRegistry,
space: SpaceId,
point: &DimensionVector,
shard_bits: u32,
) -> u32 {
let key = space_key(spaces, space, point);
hilbert_shard_id(key, shard_bits)
}
pub fn pack_shard_key(space_id: u64, shard_id: u32) -> u64 {
(space_id << 16) | (shard_id as u64)
}
pub fn unpack_shard_key(key: u64) -> (u64, u32) {
(key >> 16, (key & 0xFFFF) as u32)
}