created test_ version of new admin1 geocoder function

This commit is contained in:
andrewxhill
2014-08-27 12:46:30 -04:00
parent e0ee93bc3e
commit 24d53e5f6f
2 changed files with 68 additions and 56 deletions
+55 -47
View File
@@ -2,37 +2,73 @@
--- SELECT (geocode_admin1_polygons(Array['az', 'Texas'], 'Ecuador')).* --- SELECT (geocode_admin1_polygons(Array['az', 'Texas'], 'Ecuador')).*
--- Function --- Function
CREATE OR REPLACE FUNCTION test_geocode_admin1_polygons(name text[], inputcountry text) CREATE OR REPLACE FUNCTION test_geocode_admin1_polygons(name text[], inputcountry text)
RETURNS SETOF geocode_admin_v1 AS $$ RETURNS SETOF geocode_admin_country_v1 AS $$
DECLARE DECLARE
ret geocode_admin_v1%rowtype; ret geocode_admin_country_v1%rowtype;
adm0 TEXT;
adm0_check BOOLEAN := TRUE;
BEGIN BEGIN
FOR ret IN WITH IF inputcountry IS NULL THEN
p AS (SELECT r.c, r.q, (SELECT iso3 FROM country_decoder WHERE lower(inputcountry) = ANY (synonyms)) i FROM (SELECT trim(replace(lower(unnest(name)),'.',' ')) c, unnest(name) q) r) adm0_check = FALSE;
END IF;
IF trim(inputcountry)='' THEN
adm0_check = FALSE;
END IF;
IF adm0_check IS TRUE THEN
SELECT INTO adm0 adm0_a3 FROM admin0_synonyms WHERE name_ = lower(regexp_replace(inputcountry, '[^a-zA-Z\u00C0-\u00ff]+', '', 'g'))::text LIMIT 1;
FOR ret IN
SELECT SELECT
q, geom, CASE WHEN geom IS NULL THEN FALSE ELSE TRUE END AS success q, inputcountry, geom, CASE WHEN geom IS NULL THEN FALSE ELSE TRUE END AS success
FROM ( FROM (
SELECT SELECT
q, ( q, (
SELECT the_geom SELECT the_geom FROM qs_adm1 WHERE global_id = (
FROM global_province_polygons SELECT global_id
WHERE p.c = ANY (synonyms) FROM admin1_synonyms
AND iso3 = p.i WHERE name_ = lower(regexp_replace(d.q, '[^a-zA-Z\u00C0-\u00ff]+', '', 'g'))::text
-- To calculate frequency, I simply counted the number of users AND adm0_a3 = adm0
-- we had signed up in each country. Countries with more users, LIMIT 1
-- we favor higher in the geocoder :) )
ORDER BY frequency DESC LIMIT 1
) geom ) geom
FROM p) n FROM (SELECT unnest(name) q) d
) v
LOOP LOOP
RETURN NEXT ret; RETURN NEXT ret;
END LOOP; END LOOP;
--Handle cases where country couldn't be found
ELSE
FOR ret IN
SELECT
q, inputcountry, geom, CASE WHEN geom IS NULL THEN FALSE ELSE TRUE END AS success
FROM (
SELECT
q, (
SELECT the_geom FROM qs_adm1 WHERE global_id = (
SELECT global_id
FROM admin1_synonyms
WHERE name_ = lower(regexp_replace(d.q, '[^a-zA-Z\u00C0-\u00ff]+', '', 'g'))::text
LIMIT 1
)
) geom
FROM (SELECT unnest(name) q) d
) v
LOOP
RETURN NEXT ret;
END LOOP;
END IF;
RETURN; RETURN;
END END
$$ LANGUAGE 'plpgsql' SECURITY DEFINER; $$ LANGUAGE 'plpgsql';
Text array, country array
--Text array, country array
--- Usage --- Usage
@@ -44,40 +80,12 @@ CREATE OR REPLACE FUNCTION test_geocode_admin1_polygons(names text[], country te
RETURNS SETOF geocode_admin_country_v1 AS $$ RETURNS SETOF geocode_admin_country_v1 AS $$
DECLARE DECLARE
ret geocode_admin_country_v1%rowtype; ret geocode_admin_country_v1%rowtype;
nans TEXT[];
BEGIN BEGIN
FOR ret IN SELECT (test_geocode_admin1_polygons(array_agg(n), c)).* FROM (SELECT unnest(names) n, unnest(country) c) a GROUP BY c LOOP
SELECT array_agg(p) INTO nans FROM (SELECT unnest(names) p, unnest(country) c) g WHERE c IS NULL;
IF 0 < array_length(nans, 1) THEN
SELECT array_agg(p), array_agg(c) INTO names, country FROM (SELECT unnest(names) p, unnest(country) c) g WHERE c IS NOT NULL;
FOR ret IN SELECT g.q, NULL as c, g.geom, g.success FROM (SELECT (geocode_admin1_polygons(nans)).*) g LOOP
RETURN NEXT ret;
END LOOP;
END IF;
FOR ret IN WITH
p AS (SELECT r.p, r.q, c, (SELECT iso3 FROM country_decoder WHERE lower(r.c) = ANY (synonyms)) i FROM (SELECT trim(replace(lower(unnest(names)),'.',' ')) p, unnest(names) q, unnest(country) c) r)
SELECT
q, c, geom, CASE WHEN geom IS NULL THEN FALSE ELSE TRUE END AS success
FROM (
SELECT
q, c, (
SELECT the_geom
FROM global_province_polygons
WHERE p.p = ANY (synonyms)
AND iso3 = p.i
-- To calculate frequency, I simply counted the number of users
-- we had signed up in each country. Countries with more users,
-- we favor higher in the geocoder :)
ORDER BY frequency DESC LIMIT 1
) geom
FROM p) n
LOOP
RETURN NEXT ret; RETURN NEXT ret;
END LOOP; END LOOP;
RETURN; RETURN;
END END
$$ LANGUAGE 'plpgsql' SECURITY DEFINER; $$ LANGUAGE 'plpgsql';
+4
View File
@@ -4,6 +4,10 @@ CREATE INDEX idx_admin0_synonyms_name_ ON admin0_synonyms (name_);
CREATE INDEX idx_admin0_synonyms_rank ON admin0_synonyms (rank); CREATE INDEX idx_admin0_synonyms_rank ON admin0_synonyms (rank);
-- CREATE INDEX idx_admin0_synonyms_name_rank ON admin0_synonyms (name_, rank); -- CREATE INDEX idx_admin0_synonyms_name_rank ON admin0_synonyms (name_, rank);
-- Index on admin1 id
CREATE UNIQUE INDEX idx_qs_adm1_global_id ON qs_adm1 (global_id)
CREATE INDEX idx_admin1_synonyms_name_adm0 ON admin1_synonyms (name_, adm0_a3)
-- create indexes on polygon table -- create indexes on polygon table
CREATE UNIQUE INDEX idx_ne_admin0_v3_adm0_a3 ON ne_admin0_v3 (adm0_a3); CREATE UNIQUE INDEX idx_ne_admin0_v3_adm0_a3 ON ne_admin0_v3 (adm0_a3);