restrict addr:* tags that are used for search term

Fixes #1001.
This commit is contained in:
Sarah Hoffmann
2018-04-15 22:00:56 +02:00
parent 3087ac1145
commit 14c25717ab

View File

@@ -1234,6 +1234,7 @@ DECLARE
relation_members TEXT[]; relation_members TEXT[];
relMember RECORD; relMember RECORD;
linkedplacex RECORD; linkedplacex RECORD;
addr_item RECORD;
search_diameter FLOAT; search_diameter FLOAT;
search_prevdiameter FLOAT; search_prevdiameter FLOAT;
search_maxrank INTEGER; search_maxrank INTEGER;
@@ -1766,28 +1767,43 @@ BEGIN
parent_place_id_rank = 0; parent_place_id_rank = 0;
-- convert isin to array of tokenids -- convert address store to array of tokenids
--DEBUG: RAISE WARNING 'Starting address search'; --DEBUG: RAISE WARNING 'Starting address search';
isin_tokens := '{}'::int[]; isin_tokens := '{}'::int[];
IF NEW.address IS NOT NULL THEN IF NEW.address IS NOT NULL THEN
isin := avals(NEW.address); FOR addr_item IN SELECT * FROM each(NEW.address)
IF array_upper(isin, 1) IS NOT NULL THEN LOOP
FOR i IN 1..array_upper(isin, 1) LOOP IF addr_item.key IN ('city', 'tiger:county', 'state', 'suburb', 'province', 'district', 'region', 'county', 'municipality', 'hamlet', 'village', 'subdistrict', 'town', 'neighbourhood', 'quarter', 'parish') THEN
-- TODO further split terms with comma and semicolon address_street_word_id := get_name_id(make_standard_name(addr_item.value));
address_street_word_id := get_name_id(make_standard_name(isin[i]));
IF address_street_word_id IS NOT NULL AND NOT(ARRAY[address_street_word_id] <@ isin_tokens) THEN IF address_street_word_id IS NOT NULL AND NOT(ARRAY[address_street_word_id] <@ isin_tokens) THEN
nameaddress_vector := array_merge(nameaddress_vector, ARRAY[address_street_word_id]);
isin_tokens := isin_tokens || address_street_word_id; isin_tokens := isin_tokens || address_street_word_id;
END IF; END IF;
address_street_word_id := get_word_id(make_standard_name(addr_item.value));
-- merge word into address vector
address_street_word_id := get_word_id(make_standard_name(isin[i]));
IF address_street_word_id IS NOT NULL THEN IF address_street_word_id IS NOT NULL THEN
nameaddress_vector := array_merge(nameaddress_vector, ARRAY[address_street_word_id]); nameaddress_vector := array_merge(nameaddress_vector, ARRAY[address_street_word_id]);
END IF; END IF;
END LOOP; END IF;
END IF; IF addr_item.key = 'is_in' THEN
-- is_in items need splitting
isin := regexp_split_to_array(NEW.isin, E'[;,]');
IF array_upper(isin, 1) IS NOT NULL THEN
FOR i IN 1..array_upper(isin, 1) LOOP
address_street_word_id := get_name_id(make_standard_name(isin[i]));
IF address_street_word_id IS NOT NULL AND NOT(ARRAY[address_street_word_id] <@ isin_tokens) THEN
isin_tokens := isin_tokens || address_street_word_id;
END IF;
-- merge word into address vector
address_street_word_id := get_word_id(make_standard_name(isin[i]));
IF address_street_word_id IS NOT NULL THEN
nameaddress_vector := array_merge(nameaddress_vector, ARRAY[address_street_word_id]);
END IF;
END LOOP;
END IF;
END IF;
END LOOP;
END IF; END IF;
nameaddress_vector := array_merge(nameaddress_vector, isin_tokens);
-- %NOTIGERDATA% IF 0 THEN -- %NOTIGERDATA% IF 0 THEN
-- for the USA we have an additional address table. Merge in zip codes from there too -- for the USA we have an additional address table. Merge in zip codes from there too