fine
This commit is contained in:
parent
6df2812a4e
commit
9e4e65fa2a
35 changed files with 1172 additions and 70 deletions
|
|
@ -18,7 +18,7 @@ mod quant;
|
|||
mod stats;
|
||||
|
||||
pub use h3::precompute_h3;
|
||||
pub use poi_metrics::PostcodePoiMetrics;
|
||||
pub use poi_metrics::{PostcodePoiMetrics, COMBINED_STATION_CATEGORY};
|
||||
pub use quant::QuantRef;
|
||||
pub use stats::{FeatureStats, Histogram};
|
||||
|
||||
|
|
@ -90,6 +90,14 @@ pub struct PropertyData {
|
|||
postcode_keys: SpillVec<lasso::Spur>,
|
||||
/// Rows for each postcode, keyed by the interned postcode key.
|
||||
postcode_row_index: FxHashMap<lasso::Spur, Vec<u32>>,
|
||||
/// Postcode keys for each postcode sector (e.g. "E14 2"). Stores interned
|
||||
/// keys, not rows, so the wider-area price-history charts can enumerate a
|
||||
/// sector's properties (via `postcode_row_index`) for ~1/13th the memory of
|
||||
/// duplicating the row ids.
|
||||
sector_postcode_index: FxHashMap<String, Vec<lasso::Spur>>,
|
||||
/// Postcode keys for each outward code (e.g. "E14"). Same rationale as
|
||||
/// `sector_postcode_index`.
|
||||
outcode_postcode_index: FxHashMap<String, Vec<lasso::Spur>>,
|
||||
/// Inverted index from address tokens to property rows.
|
||||
address_token_index: FxHashMap<String, Vec<u32>>,
|
||||
/// Prefix lookup from typed address-token prefix to indexed full address tokens.
|
||||
|
|
@ -156,6 +164,31 @@ impl PropertyData {
|
|||
.unwrap_or(&[])
|
||||
}
|
||||
|
||||
/// All property rows in a postcode sector (e.g. "E14 2"), gathered across the
|
||||
/// sector's postcodes. Empty if the sector is unknown. Materializes a new Vec
|
||||
/// since the rows live in per-postcode buckets; callers downsample it.
|
||||
pub fn rows_for_sector(&self, sector: &str) -> Vec<u32> {
|
||||
self.rows_for_area(self.sector_postcode_index.get(sector))
|
||||
}
|
||||
|
||||
/// All property rows in an outward code (e.g. "E14"). See `rows_for_sector`.
|
||||
pub fn rows_for_outcode(&self, outcode: &str) -> Vec<u32> {
|
||||
self.rows_for_area(self.outcode_postcode_index.get(outcode))
|
||||
}
|
||||
|
||||
fn rows_for_area(&self, postcode_keys: Option<&Vec<lasso::Spur>>) -> Vec<u32> {
|
||||
let Some(keys) = postcode_keys else {
|
||||
return Vec::new();
|
||||
};
|
||||
let mut rows = Vec::new();
|
||||
for key in keys {
|
||||
if let Some(bucket) = self.postcode_row_index.get(key) {
|
||||
rows.extend_from_slice(bucket);
|
||||
}
|
||||
}
|
||||
rows
|
||||
}
|
||||
|
||||
/// Get the is_approx_build_date flag for a given row (bit-packed).
|
||||
pub fn is_approx_build_date(&self, row: usize) -> bool {
|
||||
let byte = self.approx_build_date_bits[row / 8];
|
||||
|
|
@ -253,6 +286,8 @@ impl PropertyData {
|
|||
postcode_interner: lasso::Rodeo::default().into_reader(),
|
||||
postcode_keys: SpillVec::owned(Vec::new()),
|
||||
postcode_row_index: FxHashMap::default(),
|
||||
sector_postcode_index: FxHashMap::default(),
|
||||
outcode_postcode_index: FxHashMap::default(),
|
||||
address_token_index: FxHashMap::default(),
|
||||
address_prefix_index: FxHashMap::default(),
|
||||
address_search_interner: lasso::Rodeo::default().into_resolver(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue