uqa_storage/diskann_index/
metadata.rs1use super::{
10 format::DiskANNManifest,
11 pages::{read_manifest, DiskANNPageSource, DiskANNReadCapabilities, DiskANNReadLimits},
12 DiskANNCanonicalCounts, DiskANNCanonicalRead,
13};
14use crate::{
15 read_control::StorageReadControl, vector_index::DiskANNIndexParams, StorageBackendResult,
16};
17use sha2::{Digest, Sha256};
18
19mod statistics;
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22pub struct DiskANNQueryMetadata {
23 pub manifest: DiskANNManifest,
24 pub corpus_fingerprint: Option<[u8; 32]>,
26 pub canonical_counts: Option<DiskANNCanonicalCounts>,
28 pub read_limits: DiskANNReadLimits,
29 pub read_capabilities: DiskANNReadCapabilities,
30}
31
32impl DiskANNQueryMetadata {
33 pub fn capture(
35 canonical: &dyn DiskANNCanonicalRead,
36 source: &dyn DiskANNPageSource,
37 parameters: DiskANNIndexParams,
38 limits: DiskANNReadLimits,
39 control: &StorageReadControl,
40 ) -> StorageBackendResult<Self> {
41 canonical.check_control(control)?;
42 let manifest = read_manifest(
43 source,
44 canonical.dimensions(),
45 parameters,
46 limits.max_record_bytes,
47 control,
48 )?;
49 let corpus_fingerprint = canonical.corpus_fingerprint(control)?;
50 let canonical_counts = canonical.population_counts(manifest.input().generation, control)?;
51 canonical.check_control(control)?;
52 Ok(Self {
53 manifest,
54 corpus_fingerprint,
55 canonical_counts,
56 read_limits: limits,
57 read_capabilities: source.capabilities(),
58 })
59 }
60
61 pub fn index_fingerprint(
63 &self,
64 control: &StorageReadControl,
65 ) -> StorageBackendResult<[u8; 32]> {
66 control.check()?;
67 let mut digest = Sha256::new();
68 digest.update(b"uqa-diskann-index-v1\0");
69 digest.update(&*self.manifest.encode(control)?);
70 control.check()?;
71 Ok(digest.finalize().into())
72 }
73}