diff --git a/src/pg/sql/41_observatory_augmentation.sql b/src/pg/sql/41_observatory_augmentation.sql index 1494df4..4a293ef 100644 --- a/src/pg/sql/41_observatory_augmentation.sql +++ b/src/pg/sql/41_observatory_augmentation.sql @@ -456,6 +456,42 @@ BEGIN END; $$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION cdb_observatory.OBS_GetCategory( + geom GEOMETRY, + category_id TEXT, + boundary_id TEXT DEFAULT NULL, + time_span TEXT DEFAULT NULL +) +RETURNS TEXT +AS $$ +DECLARE + names TEXT[]; + category_ids TEXT[]; + denominator_id TEXT; + categories TEXT[]; +BEGIN + + IF boundary_id IS NULL THEN + -- TODO we should determine best boundary for this geom + boundary_id := '"us.census.tiger".census_tract'; + END IF; + + IF time_span IS NULL THEN + -- TODO we should determine latest timespan for this measure + time_span := '2009 - 2013'; + END IF; + + EXECUTE ' + SELECT names, categories FROM cdb_observatory._OBS_GetCategories($1, $2, $3, $4) LIMIT 1 + ' + INTO names, categories + USING geom, ARRAY[category_id], boundary_id, time_span; + + RETURN (categories)[1]; + +END; +$$ LANGUAGE plpgsql; + CREATE OR REPLACE FUNCTION cdb_observatory.OBS_GetUSCensusMeasure( geom GEOMETRY, name TEXT, @@ -489,6 +525,39 @@ BEGIN END; $$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION cdb_observatory.OBS_GetUSCensusCategory( + geom GEOMETRY, + name TEXT, + boundary_id TEXT DEFAULT NULL, + time_span TEXT DEFAULT NULL + ) +RETURNS TEXT AS $$ +DECLARE + standardized_name text; + category_id text; + result TEXT; +BEGIN + standardized_name = cdb_observatory._OBS_StandardizeMeasureName(name); + + EXECUTE $string$ + SELECT c.id + FROM observatory.obs_column c + --JOIN observatory.obs_column_tag ct + -- ON c.id = ct.column_id + WHERE cdb_observatory._OBS_StandardizeMeasureName(c.name) = $1 + AND c.type ILIKE 'TEXT' + AND c.id ILIKE '"us.census%' -- TODO this should be done by tag + --AND ct.tag_id = '"us.census.acs".demographics' + $string$ + INTO category_id + USING standardized_name; + + EXECUTE 'SELECT cdb_observatory.OBS_GetCategory($1, $2, $3, $4)' + INTO result + USING geom, category_id, boundary_id, time_span; + RETURN result; +END; +$$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION cdb_observatory.OBS_GetPopulation( geom geometry, diff --git a/src/pg/test/sql/41_observatory_augmentation_test.sql b/src/pg/test/sql/41_observatory_augmentation_test.sql index 5f0fd57..8ba6153 100644 --- a/src/pg/test/sql/41_observatory_augmentation_test.sql +++ b/src/pg/test/sql/41_observatory_augmentation_test.sql @@ -149,6 +149,14 @@ SELECT cdb_observatory.OBS_GetMeasure( cdb_observatory._TestArea(), '"us.census.acs".B01001002', 'denominator'); +-- Point-based OBS_GetCategory +SELECT cdb_observatory.OBS_GetCategory( + cdb_observatory._TestPoint(), '"us.census.spielman_singleton_segments".X10'); + +-- Poly-based OBS_GetCategory +SELECT cdb_observatory.OBS_GetCategory( + cdb_observatory._TestArea(), '"us.census.spielman_singleton_segments".X10'); + -- Point-based OBS_GetPopulation, default normalization (area) SELECT * FROM cdb_observatory.OBS_GetPopulation( @@ -169,4 +177,13 @@ SELECT cdb_observatory.obs_getuscensusmeasure( SELECT cdb_observatory.obs_getuscensusmeasure( cdb_observatory._testarea(), 'male population'); +-- Point-based OBS_GetUSCensusCategory +SELECT cdb_observatory.OBS_GetUSCensusCategory( + cdb_observatory._testpoint(), 'SS Segment, 10 clusters'); + +-- Area-based OBS_GetUSCensusCategory +SELECT cdb_observatory.OBS_GetUSCensusCategory( + cdb_observatory._testarea(), 'SS Segment, 10 clusters'); + + \i test/sql/drop_fixtures.sql