diff --git a/geocoder/admin0/sql/build_synonym_table.sql b/geocoder/admin0/sql/build_synonym_table.sql index 2a689ef..3888949 100644 --- a/geocoder/admin0/sql/build_synonym_table.sql +++ b/geocoder/admin0/sql/build_synonym_table.sql @@ -1,5 +1,11 @@ ---- ADMIN0_SYNONYMS --- +--- --- +--- NOTE --- +--- insert order should be from lowest rank to highest --- +--- this allows us to use table sort order instead of an explicit ORDER BY rank --- +--- in searches and reduces search cost / time --- +--- --- -- insert data from ne_admin_0 into admin0_synonyms -- the name column from ne_10m_countries is assigned a rank of 0 INSERT INTO admin0_synonyms (name, rank, adm0_a3) diff --git a/geocoder/admin0/sql/geocoder.sql b/geocoder/admin0/sql/geocoder.sql index 97a6b8d..e7062c3 100644 --- a/geocoder/admin0/sql/geocoder.sql +++ b/geocoder/admin0/sql/geocoder.sql @@ -1,28 +1,12 @@ -CREATE OR REPLACE FUNCTION geocode_admin0_polygons(name text[]) +--CREATE TYPE geocode_admin_v1 AS (q TEXT, geom GEOMETRY, success BOOLEAN); + +CREATE OR REPLACE FUNCTION test_geocode_admin0_polygons(name text[]) RETURNS SETOF geocode_admin_v1 AS $$ DECLARE ret geocode_admin_v1%rowtype; BEGIN - FOR ret IN - SELECT - q, geom, CASE WHEN geom IS NULL THEN FALSE ELSE TRUE END AS success - FROM ( - SELECT - q, ( - SELECT the_geom - FROM ne_admin0_v3 - WHERE adm0_a3 = ( - SELECT adm0_a3 FROM admin0_synonyms - WHERE name_ = - lower(regexp_replace(d.q, '[^A-z\u00C0-\u00ff]+', '', 'g')) - ORDER BY rank ASC LIMIT 1 - ) - ) geom - FROM (SELECT unnest(name) q) d - ) v - LOOP - RETURN NEXT ret; - END LOOP; - RETURN; + -- FOR ret IN + RETURN QUERY + SELECT d.q, n.the_geom as geom, CASE WHEN s.adm0_a3 IS NULL then FALSE ELSE TRUE END AS success FROM (SELECT q, lower(regexp_replace(q, '[^A-z\u00C0-\u00ff]+', '', 'g'))::text x FROM (SELECT unnest(name) q) g) d LEFT OUTER JOIN admin0_synonyms s ON name_ = d.x LEFT OUTER JOIN ne_admin0_v3 n ON s.adm0_a3 = n.adm0_a3; END $$ LANGUAGE 'plpgsql' SECURITY DEFINER; diff --git a/geocoder/admin0/sql/indexes.sql b/geocoder/admin0/sql/indexes.sql index 90bf8b2..bfd1da4 100644 --- a/geocoder/admin0/sql/indexes.sql +++ b/geocoder/admin0/sql/indexes.sql @@ -1,8 +1,9 @@ -- create indexes on synonyms table +CREATE INDEX idx_admin0_synonyms_name_patt ON admin0_synonyms (name_ text_pattern_ops); 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_name_rank ON admin0_synonyms (name_, rank); +-- CREATE INDEX idx_admin0_synonyms_name_rank ON admin0_synonyms (name_, rank); -- create indexes on polygon table -CREATE 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); diff --git a/geocoder/admin1/sql/geocoder.sql b/geocoder/admin1/sql/geocoder.sql index d086e4d..318301e 100644 --- a/geocoder/admin1/sql/geocoder.sql +++ b/geocoder/admin1/sql/geocoder.sql @@ -4,7 +4,7 @@ --- Function -CREATE OR REPLACE FUNCTION geocode_admin1_polygons(name text[]) +CREATE OR REPLACE FUNCTION test_geocode_admin1_polygons(name text[]) RETURNS SETOF geocode_admin_v1 AS $$ DECLARE ret geocode_admin_v1%rowtype; @@ -38,7 +38,7 @@ Text array, country name --- SELECT (geocode_admin1_polygons(Array['az', 'Texas'], 'Ecuador')).* --- Function -CREATE OR REPLACE FUNCTION 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 $$ DECLARE ret geocode_admin_v1%rowtype; @@ -75,7 +75,7 @@ Text array, country array --- Function -CREATE OR REPLACE FUNCTION geocode_admin1_polygons(names text[], country text[]) +CREATE OR REPLACE FUNCTION test_geocode_admin1_polygons(names text[], country text[]) RETURNS SETOF geocode_admin_country_v1 AS $$ DECLARE ret geocode_admin_country_v1%rowtype;