From be20b052ce5edd6437321e50fec48552dc2f3721 Mon Sep 17 00:00:00 2001 From: John Krauss Date: Thu, 21 Apr 2016 13:54:09 -0400 Subject: [PATCH] first-pass working denominator for getmeasure --- src/pg/sql/41_observatory_augmentation.sql | 30 +++++++++++++++---- .../sql/41_observatory_augmentation_test.sql | 10 +++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/pg/sql/41_observatory_augmentation.sql b/src/pg/sql/41_observatory_augmentation.sql index ae3a2a3..23a2ad0 100644 --- a/src/pg/sql/41_observatory_augmentation.sql +++ b/src/pg/sql/41_observatory_augmentation.sql @@ -404,7 +404,7 @@ $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION cdb_observatory.OBS_GetMeasure( geom GEOMETRY, measure_id TEXT, - normalize TEXT DEFAULT 'area', -- TODO denominator, none + normalize TEXT DEFAULT 'area', -- TODO none/null boundary_id TEXT DEFAULT NULL, time_span TEXT DEFAULT NULL ) @@ -412,6 +412,8 @@ RETURNS JSON AS $$ DECLARE names TEXT[]; + measure_ids TEXT[]; + denominator_id TEXT; vals NUMERIC[]; BEGIN @@ -425,18 +427,36 @@ BEGIN time_span := '2009 - 2013'; END IF; + IF normalize ILIKE 'area' THEN + measure_ids := ARRAY[measure_id]; + ELSIF normalize ILIKE 'denominator' THEN + EXECUTE 'SELECT (cdb_observatory._OBS_GetRelatedColumn(ARRAY[$1], ''denominator''))[1] + ' INTO denominator_id + USING measure_id; + measure_ids := ARRAY[measure_id, denominator_id]; + ELSIF normalize IS NULL OR normalize ILIKE 'none' THEN + -- TODO we need a switch on obs_get to disable area normalization + RAISE EXCEPTION 'No normalization not yet supported.'; + ELSE + RAISE EXCEPTION 'Only valid inputs for "normalize" are "area" (default), "denominator", or "none".'; + END IF; + EXECUTE ' - SELECT names, vals FROM cdb_observatory._OBS_Get($1, ARRAY[$2], $3, $4) LIMIT 1 + SELECT names, vals FROM cdb_observatory._OBS_Get($1, $2, $3, $4) LIMIT 1 ' INTO names, vals - USING geom, measure_id, time_span, boundary_id; + USING geom, measure_ids, time_span, boundary_id; - RETURN json_build_object('name', (names)[1], 'value', (vals)[1]); + IF normalize ILIKE 'denominator' THEN + RETURN json_build_object('name', format('%I over %I', names[1], names[2]), + 'value', vals[1]/ vals[2]); + ELSE + RETURN json_build_object('name', (names)[1], 'value', (vals)[1]); + END IF; END; $$ LANGUAGE plpgsql; - CREATE OR REPLACE FUNCTION cdb_observatory.OBS_GetPopulation( geom geometry, normalize TEXT DEFAULT 'area', diff --git a/src/pg/test/sql/41_observatory_augmentation_test.sql b/src/pg/test/sql/41_observatory_augmentation_test.sql index 139e8e0..733b10c 100644 --- a/src/pg/test/sql/41_observatory_augmentation_test.sql +++ b/src/pg/test/sql/41_observatory_augmentation_test.sql @@ -139,6 +139,16 @@ SELECT * FROM '"us.census.acs".B01001001' ); +-- Point-based OBS_GetMeasure with denominator normalization +SELECT cdb_observatory.OBS_GetMeasure( + cdb_observatory._TestPoint(), + '"us.census.acs".B01001002', 'denominator'); + +-- Poly-based OBS_GetMeasure with denominator normalization +SELECT cdb_observatory.OBS_GetMeasure( + cdb_observatory._TestArea(), + '"us.census.acs".B01001002', 'denominator'); + -- Point-based OBS_GetPopulation, default normalization (area) SELECT * FROM cdb_observatory.OBS_GetPopulation(