new demo mode & tenure
Some checks failed
Build and publish Docker image / build-and-push (push) Successful in 8m43s
CI / Check (push) Failing after 8m49s

This commit is contained in:
Andras Schmelczer 2026-06-17 07:54:30 +01:00
parent 7656f24544
commit 4a0f00f2a4
64 changed files with 2875 additions and 338 deletions

View file

@ -251,6 +251,26 @@ pub(super) fn address_search_tokens(text: &str) -> Vec<String> {
tokens
}
/// Search tokens for a property row, covering its display address plus an
/// alternative spelling (`alt`, the EPC form) when distinct — so the property is
/// findable by either form. The result is deduped: each token appears at most
/// once, which the inverted-index posting lists rely on (a token must post a
/// given row exactly once to keep those lists strictly ascending and unique).
pub(super) fn merged_address_search_tokens(display: &str, alt: Option<&str>) -> Vec<String> {
let mut tokens = address_search_tokens(display);
if let Some(alt) = alt {
let alt = alt.trim();
if !alt.is_empty() && alt != display.trim() {
for token in address_search_tokens(alt) {
if !tokens.contains(&token) {
tokens.push(token);
}
}
}
}
tokens
}
fn is_address_search_token(token: &str) -> bool {
if looks_like_postcode_fragment(token) {
return false;
@ -929,6 +949,60 @@ mod tests {
assert_eq!(parsed.text_groups[1].alternatives, vec!["cour".to_string()]);
}
#[test]
fn merged_tokens_index_both_address_forms() {
// A property whose price-paid form is "10 Park Road" but whose EPC form
// names the building ("Kingswood House 10 Park Road") must be findable by
// the building name too: the distinctive "kingswood" token comes only
// from the EPC form.
let display_only = address_search_tokens("10 Park Road");
assert!(!display_only.contains(&"kingswood".to_string()));
let merged =
merged_address_search_tokens("10 Park Road", Some("Kingswood House 10 Park Road"));
assert!(merged.contains(&"kingswood".to_string()));
// Tokens shared by both forms are still present and not duplicated.
assert!(merged.contains(&"park".to_string()));
assert!(merged.contains(&"road".to_string()));
assert!(merged.contains(&"10".to_string()));
// No token repeats — posting-list uniqueness depends on this.
let mut deduped = merged.clone();
deduped.sort_unstable();
deduped.dedup();
assert_eq!(deduped.len(), merged.len());
}
#[test]
fn merged_tokens_ignore_redundant_or_missing_alt_form() {
let baseline = address_search_tokens("12 Baker Street");
// An EPC form identical to the display adds nothing.
assert_eq!(
merged_address_search_tokens("12 Baker Street", Some("12 Baker Street")),
baseline
);
// A blank EPC form (whitespace) and an absent one are both no-ops.
assert_eq!(
merged_address_search_tokens("12 Baker Street", Some(" ")),
baseline
);
assert_eq!(
merged_address_search_tokens("12 Baker Street", None),
baseline
);
}
#[test]
fn merged_tokens_handle_epc_only_display() {
// EPC-only dwellings have no price-paid form, so the EPC address IS the
// display; passing it as both arguments must not duplicate its tokens.
let epc = "Flat 4 Rosewood Court";
assert_eq!(
merged_address_search_tokens(epc, Some(epc)),
address_search_tokens(epc)
);
}
#[test]
fn address_search_tokens_keep_actual_address_terms_for_scoring() {
let tokens = address_search_tokens("Flat 2, 10 Downing Cour");