diff --git a/src/pg/sql/41_observatory_augmentation.sql b/src/pg/sql/41_observatory_augmentation.sql index 0369f70..48569d7 100644 --- a/src/pg/sql/41_observatory_augmentation.sql +++ b/src/pg/sql/41_observatory_augmentation.sql @@ -434,8 +434,8 @@ BEGIN 'JSON_Build_Object(' || CASE WHEN api_method IS NOT NULL THEN '''value'', ' || - 'cdb_observatory.FIRST( ' || - api_method || '.' || numer_colname || ')::' || numer_type + 'ARRAY_AGG( ' || + api_method || '.' || numer_colname || ')::' || numer_type || '[]' -- numeric internal values WHEN cdb_observatory.isnumeric(numer_type) THEN '''value'', ' || CASE @@ -600,8 +600,8 @@ BEGIN -- api-delivered values WHEN api_method IS NOT NULL THEN '''value'', ' || - 'cdb_observatory.FIRST( ' || - api_method || '.' || numer_colname || ')::' || numer_type + 'ARRAY_AGG( ' || + api_method || '.' || numer_colname || ')::' || numer_type || '[]' -- numeric internal values WHEN cdb_observatory.isnumeric(numer_type) THEN '''value'', ' || CASE @@ -753,6 +753,32 @@ BEGIN geomrefs_noalias, data_tables, obs_wheres, user_wheres USING (SELECT ARRAY(SELECT json_array_elements_text(params))::json[]), geomtype; + RAISE NOTICE '%', format($query$ + WITH _raw_geoms AS (SELECT + (UNNEST(%L)).val as id, + (UNNEST(%L)).geom AS geom), + _geoms AS (SELECT id, + CASE WHEN (ST_NPoints(geom) > 500) + THEN ST_CollectionExtract(ST_MakeValid(ST_SimplifyVW(geom, 0.0001)), 3) + ELSE geom END geom + FROM _raw_geoms), + _procgeoms AS (SELECT _geoms.id, _geoms.geom, %s %s + FROM _geoms %s + %s + ) + SELECT _procgeoms.id::INT, Array_to_JSON(ARRAY[%s]::JSON[]) + FROM _procgeoms %s + %s + GROUP BY _procgeoms.id %s + ORDER BY _procgeoms.id + $query$, geomvals, geomvals, geomrefs_alias, + ', ' || NullIf(geom_colspecs, ''), + ', ' || NullIf(geom_tables, ''), + 'WHERE ' || NullIf( user_wheres, ''), + data_colspecs, ', ' || NullIf(data_tables, ''), + 'WHERE ' || NULLIF(obs_wheres, ''), + CASE WHEN merge IS False THEN ', ' || geomrefs_noalias ELSE '' END); + RETURN QUERY EXECUTE format($query$ WITH _raw_geoms AS (SELECT (UNNEST($1)).val as id, diff --git a/src/pg/test/expected/41_observatory_augmentation_test.out b/src/pg/test/expected/41_observatory_augmentation_test.out index cae3233..145979f 100644 --- a/src/pg/test/expected/41_observatory_augmentation_test.out +++ b/src/pg/test/expected/41_observatory_augmentation_test.out @@ -249,15 +249,15 @@ t|t obs_getdata_api_geomvals_no_args t (1 row) -obs_getdata_api_geomvals_args_numer_return -t +ary_type|obs_getdata_api_geomvals_args_numer_return +t|t (1 row) -obs_getdata_api_geomvals_args_string_return -t +ary_type|obs_getdata_api_geomvals_args_string_return +t|t (1 row) -obs_getdata_api_geomrefs_args_numer_return -t +ary_type|obs_getdata_api_geomrefs_args_numer_return +t|t (1 row) -obs_getdata_api_geomrefs_args_string_return -t +ary_type|obs_getdata_api_geomrefs_args_string_return +t|t (1 row) diff --git a/src/pg/test/sql/41_observatory_augmentation_test.sql b/src/pg/test/sql/41_observatory_augmentation_test.sql index 9288b82..ee8e03b 100644 --- a/src/pg/test/sql/41_observatory_augmentation_test.sql +++ b/src/pg/test/sql/41_observatory_augmentation_test.sql @@ -765,26 +765,36 @@ SELECT id = '36047048500' AS id, FROM data; -- OBS_GetData with an API + geomvals, no args -SELECT ARRAY['us.census.tiger.census_tract'] <@ array_agg(data->0->>'value') AS OBS_GetData_API_geomvals_no_args +SELECT (SELECT array_agg(json_array_elements::text) @> array['"us.census.tiger.census_tract"'] + FROM json_array_elements(data->0->'value')) +AS OBS_GetData_API_geomvals_no_args FROM cdb_observatory.obs_getdata(array[(cdb_observatory._testarea(), 1)::geomval], '[{"numer_type": "text", "numer_colname": "boundary_id", "api_method": "obs_getavailableboundaries"}]'); -- OBS_GetData with an API + geomvals, args, numeric -SELECT json_typeof(data->0->'value') = 'number' AS OBS_GetData_API_geomvals_args_numer_return +SELECT json_typeof(data->0->'value') = 'array' ary_type, + json_typeof(data->0->'value'->0) = 'number' +AS OBS_GetData_API_geomvals_args_numer_return FROM cdb_observatory.obs_getdata(array[(cdb_observatory._testarea(), 1)::geomval], '[{"numer_type": "numeric", "numer_colname": "obs_getmeasure", "api_method": "obs_getmeasure", "api_args": ["us.census.acs.B01003001"]}]'); -- OBS_GetData with an API + geomvals, args, text -SELECT json_typeof(data->0->'value') = 'string' AS OBS_GetData_API_geomvals_args_string_return +SELECT json_typeof(data->0->'value') = 'array' ary_type, + json_typeof(data->0->'value'->0) = 'string' +AS OBS_GetData_API_geomvals_args_string_return FROM cdb_observatory.obs_getdata(array[(cdb_observatory._testarea(), 1)::geomval], '[{"numer_type": "text", "numer_colname": "obs_getcategory", "api_method": "obs_getcategory", "api_args": ["us.census.spielman_singleton_segments.X55"]}]'); -- OBS_GetData with an API + geomrefs, args, numeric -SELECT json_typeof(data->0->'value') = 'number' AS OBS_GetData_API_geomrefs_args_numer_return +SELECT json_typeof(data->0->'value') = 'array' ary_type, + json_typeof(data->0->'value'->0) = 'number' +AS OBS_GetData_API_geomrefs_args_numer_return FROM cdb_observatory.obs_getdata(array['36047076200'], '[{"numer_type": "numeric", "numer_colname": "obs_getmeasurebyid", "api_method": "obs_getmeasurebyid", "api_args": ["us.census.acs.B01003001", "us.census.tiger.census_tract"]}]'); -- OBS_GetData with an API + geomrefs, args, text -SELECT json_typeof(data->0->'value') = 'string' AS OBS_GetData_API_geomrefs_args_string_return +SELECT json_typeof(data->0->'value') = 'array' ary_type, + json_typeof(data->0->'value'->0) = 'string' +AS OBS_GetData_API_geomrefs_args_string_return FROM cdb_observatory.obs_getdata(array['36047'], '[{"numer_type": "text", "numer_colname": "obs_getboundarybyid", "api_method": "obs_getboundarybyid", "api_args": ["us.census.tiger.county"]}]');