canic_core/workflow/placement/sharding/
query.rs

1use crate::{
2    dto::placement::sharding::{
3        ShardingRegistryEntryView, ShardingRegistryView, ShardingTenantsView,
4    },
5    ops::storage::placement::sharding::ShardingRegistryOps,
6    workflow::{placement::sharding::mapper::ShardingMapper, prelude::*},
7};
8
9///
10/// ShardingQuery
11/// Public, read-only query APIs for shard placement and inspection.
12///
13
14pub struct ShardingQuery;
15
16impl ShardingQuery {
17    /// Lookup the shard assigned to a tenant in a pool, if any.
18    #[must_use]
19    pub fn lookup_tenant(pool: &str, tenant: &str) -> Option<Principal> {
20        ShardingRegistryOps::tenant_shard(pool, tenant)
21    }
22
23    /// Return a view of the full sharding registry.
24    #[must_use]
25    pub fn registry_view() -> ShardingRegistryView {
26        let data = ShardingRegistryOps::export();
27
28        let view = data
29            .entries
30            .into_iter()
31            .map(|(pid, entry)| ShardingRegistryEntryView {
32                pid,
33                entry: ShardingMapper::shard_entry_to_view(&entry),
34            })
35            .collect();
36
37        ShardingRegistryView(view)
38    }
39
40    /// Return all tenants currently assigned to a shard.
41    #[must_use]
42    pub fn tenants_view(pool: &str, shard: Principal) -> ShardingTenantsView {
43        let tenants = ShardingRegistryOps::tenants_in_shard(pool, shard);
44
45        ShardingTenantsView(tenants)
46    }
47}