From df1d6c0d8d935bfc716024e46acfc3c50275a32c Mon Sep 17 00:00:00 2001 From: Carla Iriberri Date: Fri, 20 Nov 2015 15:50:46 +0100 Subject: [PATCH] Add guessing function and tests to extension --- .../expected/40_namedplaces_test.out | 14 +++++++- .../extension/sql/0.0.1/40_namedplaces.sql | 34 +++++++++++++++++++ .../extension/sql/40_namedplaces_test.sql | 4 ++- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/geocoder/extension/expected/40_namedplaces_test.out b/geocoder/extension/expected/40_namedplaces_test.out index 1e654fe..feabe8a 100644 --- a/geocoder/extension/expected/40_namedplaces_test.out +++ b/geocoder/extension/expected/40_namedplaces_test.out @@ -46,13 +46,25 @@ SELECT (geocode_namedplace(Array['Portland', 'Portland', 'New York City'], Array Portland | Maine | USA | | f (3 rows) +SELECT namedplace_guess_country(Array['granada', 'jaen', 'cordoba', 'madrid', 'valladolid']); + namedplace_guess_country +-------------------------- + +(1 row) + -- Add a named place source COPY global_cities_alternates_limited (geoname_id, name, the_geom, created_at, updated_at, the_geom_webmercator, preferred, lowername, cartodb_id, admin1_geonameid, iso2, admin1) FROM stdin; COPY global_cities_points_limited (geoname_id, name, asciiname, altnames, featclass, featcode, iso2, admin1, admin2, population, the_geom, created_at, updated_at, the_geom_webmercator, cartodb_id, lowername) FROM stdin; -- Check that the geocoding function is callable, should return success = true -SELECT (geocode_namedplace(Array['Barcelona'])).* +SELECT (geocode_namedplace(Array['Barcelona'])).*; q | geom | success -----------+----------------------------------------------------+--------- Barcelona | 0101000020E6100000CA15DEE522E653C0A4C2D842902B4540 | t (1 row) +SELECT namedplace_guess_country(Array['Barcelona']); + namedplace_guess_country +-------------------------- + ES +(1 row) + diff --git a/geocoder/extension/sql/0.0.1/40_namedplaces.sql b/geocoder/extension/sql/0.0.1/40_namedplaces.sql index 381ff8d..4cd1620 100644 --- a/geocoder/extension/sql/0.0.1/40_namedplaces.sql +++ b/geocoder/extension/sql/0.0.1/40_namedplaces.sql @@ -288,6 +288,40 @@ CREATE OR REPLACE FUNCTION geocode_namedplace(places text[]) RETURNS SETOF geoco END $$; +CREATE OR REPLACE FUNCTION namedplace_guess_country(places text[]) +RETURNS text AS $$ +DECLARE + country_code text; + threshold CONSTANT float := 0.8; + input_length integer := array_length(places, 1); +BEGIN + BEGIN + WITH hist AS ( + SELECT count(DISTINCT(lower(p.s), gp.iso2)) AS c, iso2 + FROM global_cities_points_limited gp + inner join (SELECT unnest(places) AS s) p + ON (gp.lowername = lower(s)) + GROUP BY iso2 + ), + best_two AS ( + SELECT iso2, c + FROM hist + WHERE c > input_length * threshold + ORDER BY c DESC + LIMIT 2 + ) + SELECT iso2 INTO STRICT country_code + FROM (SELECT iso2, c, max(c) over() AS maxcount FROM best_two) bt + WHERE bt.c = bt.maxcount; + EXCEPTION + WHEN NO_DATA_FOUND OR too_many_rows THEN + RETURN NULL; + END; + RETURN country_code; +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER IMMUTABLE; + + -------------------------------------------------------------------------------- -- Support tables diff --git a/geocoder/extension/sql/40_namedplaces_test.sql b/geocoder/extension/sql/40_namedplaces_test.sql index 91f06e2..f9e67ed 100644 --- a/geocoder/extension/sql/40_namedplaces_test.sql +++ b/geocoder/extension/sql/40_namedplaces_test.sql @@ -5,6 +5,7 @@ SELECT (geocode_namedplace(Array['sunapee', 'sunapeeee', 'New York City', 'Madri SELECT (geocode_namedplace(Array['Portland', 'Portland', 'New York City'], Array['Maine', 'Oregon', NULL], 'USA')).*; SELECT (geocode_namedplace(Array['Portland'], 'Oregon', 'USA')).*; SELECT (geocode_namedplace(Array['Portland', 'Portland', 'New York City'], Array['Maine', 'Oregon', NULL], Array['USA'])).*; +SELECT namedplace_guess_country(Array['granada', 'jaen', 'cordoba', 'madrid', 'valladolid']); -- Add a named place source COPY global_cities_alternates_limited (geoname_id, name, the_geom, created_at, updated_at, the_geom_webmercator, preferred, lowername, cartodb_id, admin1_geonameid, iso2, admin1) FROM stdin; @@ -16,5 +17,6 @@ COPY global_cities_points_limited (geoname_id, name, asciiname, altnames, featcl \. -- Check that the geocoding function is callable, should return success = true -SELECT (geocode_namedplace(Array['Barcelona'])).* +SELECT (geocode_namedplace(Array['Barcelona'])).*; +SELECT namedplace_guess_country(Array['Barcelona']);