diff --git a/src/pg/sql/44_observatory_geometries.sql b/src/pg/sql/44_observatory_geometries.sql index af7354e..0588273 100644 --- a/src/pg/sql/44_observatory_geometries.sql +++ b/src/pg/sql/44_observatory_geometries.sql @@ -185,7 +185,7 @@ $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION cdb_observatory.OBS_GetBoundaryById( geometry_id text, -- ex: '36047' boundary_id text, -- ex: '"us.census.tiger".county' - time_span text DEFAULT NULL --ex: '2009' + time_span text DEFAULT NULL -- ex: '2009' ) RETURNS geometry(geometry, 4326) AS $$ @@ -196,8 +196,8 @@ DECLARE geom_colname text; BEGIN -SELECT * INTO geoid_colname, target_table, geom_colname -FROM cdb_observatory._OBS_GetGeometryMetadata(boundary_id); + SELECT * INTO geoid_colname, target_table, geom_colname + FROM cdb_observatory._OBS_GetGeometryMetadata(boundary_id); RAISE NOTICE '%', target_table; @@ -258,23 +258,23 @@ DECLARE target_table text; BEGIN --- check inputs -IF lower(overlap_type) NOT IN ('contains', 'intersects', 'within') -THEN - -- recognized overlap type (map to ST_Contains, ST_Intersects, and ST_Within) - RAISE EXCEPTION 'Overlap type ''%'' is not an accepted type (choose contains, within, intersects)', overlap_type; -ELSIF ST_GeometryType(geom) NOT IN ('ST_Polygon', 'ST_MultiPolygon') -THEN - RAISE EXCEPTION 'Invalid geometry type (%), expecting ''ST_MultiPolygon'' or ''ST_Polygon''', ST_GeometryType(geom); -END IF; + -- check inputs + IF lower(overlap_type) NOT IN ('contains', 'intersects', 'within') + THEN + -- recognized overlap type (map to ST_Contains, ST_Intersects, and ST_Within) + RAISE EXCEPTION 'Overlap type ''%'' is not an accepted type (choose contains, within, intersects)', overlap_type; + ELSIF ST_GeometryType(geom) NOT IN ('ST_Polygon', 'ST_MultiPolygon') + THEN + RAISE EXCEPTION 'Invalid geometry type (%), expecting ''ST_MultiPolygon'' or ''ST_Polygon''', ST_GeometryType(geom); + END IF; --- TODO: add timespan in search --- TODO: add overlap info in search --- TODO: turn this into a function _OBS_GetGeometryMetadata(geo_ref_name, tablename, and geom_colname) --- SELECT geo_ref_name, tablename, geom_colname INTO a, b, c --- FROM _OBS_GetGeometryMetadata -SELECT * INTO geoid_colname, target_table, geom_colname -FROM cdb_observatory._OBS_GetGeometryMetadata(boundary_id); + -- TODO: add timespan in search + -- TODO: add overlap info in search + -- TODO: turn this into a function _OBS_GetGeometryMetadata(geo_ref_name, tablename, and geom_colname) + -- SELECT geo_ref_name, tablename, geom_colname INTO a, b, c + -- FROM _OBS_GetGeometryMetadata + SELECT * INTO geoid_colname, target_table, geom_colname + FROM cdb_observatory._OBS_GetGeometryMetadata(boundary_id); -- if no tables are found, raise notice and return null IF target_table IS NULL @@ -377,19 +377,19 @@ DECLARE target_table text; BEGIN -IF lower(overlap_type) NOT IN ('contains', 'within', 'intersects') -THEN - RAISE EXCEPTION 'Overlap type ''%'' is not an accepted type (choose contains, within, intersects)', overlap_type; -ELSIF ST_GeometryType(geom) NOT IN ('ST_Polygon', 'ST_MultiPolygon') -THEN - RAISE EXCEPTION 'Invalid geometry type (%), expecting ''ST_MultiPolygon'' or ''ST_Polygon''', ST_GeometryType(geom); -END IF; + IF lower(overlap_type) NOT IN ('contains', 'within', 'intersects') + THEN + RAISE EXCEPTION 'Overlap type ''%'' is not an accepted type (choose contains, within, intersects)', overlap_type; + ELSIF ST_GeometryType(geom) NOT IN ('ST_Polygon', 'ST_MultiPolygon') + THEN + RAISE EXCEPTION 'Invalid geometry type (%), expecting ''ST_MultiPolygon'' or ''ST_Polygon''', ST_GeometryType(geom); + END IF; -SELECT * INTO geoid_colname, target_table, geom_colname -FROM cdb_observatory._OBS_GetGeometryMetadata(boundary_id); + SELECT * INTO geoid_colname, target_table, geom_colname + FROM cdb_observatory._OBS_GetGeometryMetadata(boundary_id); -RAISE NOTICE 'geoid_colname: %, target_table: %, geom_colname: %', - geoid_colname, target_table, geom_colname; + RAISE NOTICE 'geoid_colname: %, target_table: %, geom_colname: %', + geoid_colname, target_table, geom_colname; -- if no tables are found, raise notice and return null IF target_table IS NULL @@ -462,30 +462,31 @@ RETURNS table(geoid_colname text, target_table text, geom_colname text) AS $$ BEGIN -RETURN QUERY -EXECUTE -format($string$ - SELECT geoid_ct.colname As geoid_colname, - tablename, - geom_ct.colname As geom_colname - FROM observatory.obs_column_table As geoid_ct, - observatory.obs_table As geom_t, - observatory.obs_column_table As geom_ct, - observatory.obs_column As geom_c - WHERE geoid_ct.column_id - IN ( - SELECT source_id - FROM observatory.obs_column_to_column - WHERE reltype = 'geom_ref' - AND target_id = '%s' - ) - AND geoid_ct.table_id = geom_t.id and - geom_t.id = geom_ct.table_id and - geom_ct.column_id = geom_c.id and - geom_c.type ILIKE 'geometry' - -- TODO: filter by clipped vs. not so appropriate tablename are unique - -- so the limit 1 can be removed - LIMIT 1 - $string$, boundary_id); + RETURN QUERY + EXECUTE + format($string$ + SELECT geoid_ct.colname As geoid_colname, + tablename, + geom_ct.colname As geom_colname + FROM observatory.obs_column_table As geoid_ct, + observatory.obs_table As geom_t, + observatory.obs_column_table As geom_ct, + observatory.obs_column As geom_c + WHERE geoid_ct.column_id + IN ( + SELECT source_id + FROM observatory.obs_column_to_column + WHERE reltype = 'geom_ref' + AND target_id = '%s' + ) + AND geoid_ct.table_id = geom_t.id and + geom_t.id = geom_ct.table_id and + geom_ct.column_id = geom_c.id and + geom_c.type ILIKE 'geometry' + -- TODO: filter by clipped vs. not so appropriate tablename are unique + -- so the limit 1 can be removed + LIMIT 1 + $string$, boundary_id); + END; $$ LANGUAGE plpgsql;