diff --git a/src/pg/sql/40_observatory_utility.sql b/src/pg/sql/40_observatory_utility.sql index d1b1f3b..22948a7 100644 --- a/src/pg/sql/40_observatory_utility.sql +++ b/src/pg/sql/40_observatory_utility.sql @@ -151,3 +151,25 @@ BEGIN END; $$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION cdb_observatory._GetRelatedColumn(columns_ids text[], reltype text ) +RETURNS TEXT[] +AS $$ +DECLARE + result TEXT[]; +BEGIN + EXECUTE ' + With ids as ( + select row_number() over() as no, id from (select unnest($1) as id) t + ) + select array_agg(target_id order by no) + FROM ids + LEFT JOIN observatory.obs_column_to_column + on source_id = id + where reltype = $2 or reltype is null + ' + INTO result + using columns_ids, reltype; + return result; +END; +$$ LANGUAGE plpgsql; diff --git a/src/pg/test/expected/40_observatory_utility_test.out b/src/pg/test/expected/40_observatory_utility_test.out index a0dca1f..9b54718 100644 --- a/src/pg/test/expected/40_observatory_utility_test.out +++ b/src/pg/test/expected/40_observatory_utility_test.out @@ -29,7 +29,7 @@ SELECT CDB_LatLng(40.7128,-74.0059), '"us.census.tiger".census_tract' ); - _obs_geomtable + _obs_geomtable ---------------------------------------------- obs_a92e1111ad3177676471d66bb8036e6d057f271b (1 row) @@ -41,9 +41,9 @@ SELECT CDB_LatLng(40.7128,-74.0059), '"us.census.tiger".nonexistant_id' -- not in catalog ); - _obs_geomtable + _obs_geomtable ---------------- - + (1 row) -- future test: give back nulls when geometry doesn't intersect @@ -65,11 +65,11 @@ SELECT '2009 - 2013' ))).* ORDER BY colname, tablename ASC; - colname | tablename | aggregate + colname | tablename | aggregate -----------+----------------------------------------------+----------- - geoid | obs_11ee8b82c877c073438bc935a91d3dfccef875d1 | - geoid | obs_ab038198aaab3f3cb055758638ee4de28ad70146 | - geoid | obs_d34555209878e8c4b37cf0b2b3d072ff129ec470 | + geoid | obs_11ee8b82c877c073438bc935a91d3dfccef875d1 | + geoid | obs_ab038198aaab3f3cb055758638ee4de28ad70146 | + geoid | obs_d34555209878e8c4b37cf0b2b3d072ff129ec470 | total_pop | obs_ab038198aaab3f3cb055758638ee4de28ad70146 | sum (4 rows) @@ -81,7 +81,7 @@ SELECT '2009 - 2013' ))).* ORDER BY 1 ASC; - colname | tablename | aggregate + colname | tablename | aggregate ---------+-----------+----------- (0 rows) @@ -91,7 +91,7 @@ SELECT cdb_observatory._OBS_LookupCensusHuman( Array['gini_index'] ); - _obs_lookupcensushuman + _obs_lookupcensushuman --------------------------------- {"\"us.census.acs\".B19083001"} (1 row) @@ -101,9 +101,9 @@ SELECT cdb_observatory._OBS_LookupCensusHuman( Array['cookies'] ); - _obs_lookupcensushuman + _obs_lookupcensushuman ------------------------ - + (1 row) -- OBS_BuildSnapshotQuery @@ -112,7 +112,7 @@ SELECT cdb_observatory._OBS_BuildSnapshotQuery( Array['total_pop','male_pop','female_pop','median_age'] ); - _obs_buildsnapshotquery + _obs_buildsnapshotquery ------------------------------------------------------------------------------------------------- SELECT vals[1] As total_pop, vals[2] As male_pop, vals[3] As female_pop, vals[4] As median_age (1 row) @@ -122,11 +122,26 @@ SELECT cdb_observatory._OBS_BuildSnapshotQuery( Array['mandarin_orange'] ); - _obs_buildsnapshotquery + _obs_buildsnapshotquery ------------------------------------ SELECT vals[1] As mandarin_orange (1 row) +-- should give back "\"es.ine\".total_pop",NULL,"\"us.census.acs\".B01001001"} +SELECT + select * from cdb_observatory._GetRelatedColumn( + Array[ + '"es.ine".pop_0_4', + '"us.census.acs".B01001001', + '"us.census.acs".B01001002' + ], + 'denominator' + ); + _getrelatedcolumn +------------------------------------------------------------- +{"\"es.ine\".total_pop",NULL,"\"us.census.acs\".B01001001"} +(1 row) + \i test/sql/drop_fixtures.sql SET client_min_messages TO NOTICE; \set ECHO none diff --git a/src/pg/test/sql/40_observatory_utility_test.sql b/src/pg/test/sql/40_observatory_utility_test.sql index 9067f8e..677c369 100644 --- a/src/pg/test/sql/40_observatory_utility_test.sql +++ b/src/pg/test/sql/40_observatory_utility_test.sql @@ -75,4 +75,14 @@ SELECT Array['mandarin_orange'] ); +SELECT + select * from cdb_observatory._GetRelatedColumn( + Array[ + '"es.ine".pop_0_4', + '"us.census.acs".B01001001', + '"us.census.acs".B01001002' + ], + 'denominator' + ); + \i test/sql/drop_fixtures.sql