diff --git a/NEWS.md b/NEWS.md index 0b65c0a..38c8e46 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,14 @@ +1.0.7 (2016-09-20) + +__Bugfixes__ + +* `NULL` geometries or geometry IDs no longer result in an exception from any + augmentation functions ([#178](https://github.com/CartoDB/observatory-extension/issues/178)) + +__Improvements__ + +* Automatic tests work for Canada and Thailand + 1.0.6 (2016-09-08) __Improvements__ diff --git a/src/pg/sql/41_observatory_augmentation.sql b/src/pg/sql/41_observatory_augmentation.sql index cf6f910..5341945 100644 --- a/src/pg/sql/41_observatory_augmentation.sql +++ b/src/pg/sql/41_observatory_augmentation.sql @@ -179,7 +179,10 @@ BEGIN --raise notice 'Cannot find data table for boundary ID %, column_ids %, and time_span %', geometry_level, column_ids, time_span; END IF; - IF ST_GeometryType(geom) = 'ST_Point' + IF geom IS NULL + THEN + results := NULL; + ELSIF ST_GeometryType(geom) = 'ST_Point' THEN --raise notice 'geom_table_name %, data_table_info %', geom_table_name, data_table_info::json[]; results := cdb_observatory._OBS_GetPoints(geom, @@ -361,6 +364,10 @@ DECLARE sql TEXT; numer_name TEXT; BEGIN + IF geom IS NULL THEN + RETURN NULL; + END IF; + geom := ST_SnapToGrid(geom, 0.000001); EXECUTE @@ -525,6 +532,9 @@ DECLARE measure_val NUMERIC; data_geoid_colname TEXT; BEGIN + IF geom_ref IS NULL THEN + RETURN NULL; + END IF; EXECUTE $query$ @@ -573,6 +583,9 @@ DECLARE category_val TEXT; category_share NUMERIC; BEGIN + IF geom IS NULL THEN + RETURN NULL; + END IF; EXECUTE $query$ diff --git a/src/pg/test/expected/41_observatory_augmentation_test.out b/src/pg/test/expected/41_observatory_augmentation_test.out index 44764f7..621ade2 100644 --- a/src/pg/test/expected/41_observatory_augmentation_test.out +++ b/src/pg/test/expected/41_observatory_augmentation_test.out @@ -66,12 +66,18 @@ t obs_getmeasure_bad_geometry t (1 row) +obs_getmeasure_null +t +(1 row) obs_getcategory_point t (1 row) obs_getcategory_polygon t (1 row) +obs_getcategory_null +t +(1 row) obs_getpopulation t (1 row) @@ -81,6 +87,9 @@ t obs_getpopulation_polygon_null_test t (1 row) +obs_getpopulation_polygon_null_geom_test +t +(1 row) obs_getuscensusmeasure_point_male_pop t (1 row) @@ -90,12 +99,18 @@ t obs_getuscensusmeasure_null t (1 row) +obs_getuscensusmeasure_null_geom +t +(1 row) obs_getuscensuscategory_point t (1 row) obs_getuscensuscategory_polygon t (1 row) +obs_getuscensuscategory_null +t +(1 row) obs_getmeasurebyid_cartodb_census_tract t (1 row) @@ -108,3 +123,6 @@ t obs_getmeasurebyid_nulls t (1 row) +obs_getmeasurebyid_null_id +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 53d40d9..06f3370 100644 --- a/src/pg/test/sql/41_observatory_augmentation_test.sql +++ b/src/pg/test/sql/41_observatory_augmentation_test.sql @@ -203,6 +203,11 @@ SELECT abs(cdb_observatory.OBS_GetMeasure( cdb_observatory._ProblemTestArea(), 'us.census.acs.B01003001') - 96230.2929825897) / 96230.2929825897 < 0.001 As OBS_GetMeasure_bad_geometry; +-- OBS_GetMeasure with NULL Input +SELECT cdb_observatory.OBS_GetMeasure( + NULL, + 'us.census.acs.B01003001') IS NULL As OBS_GetMeasure_null; + -- Point-based OBS_GetCategory SELECT cdb_observatory.OBS_GetCategory( cdb_observatory._TestPoint(), 'us.census.spielman_singleton_segments.X10') = 'Wealthy, urban without Kids' As OBS_GetCategory_point; @@ -211,6 +216,10 @@ SELECT cdb_observatory.OBS_GetCategory( SELECT cdb_observatory.OBS_GetCategory( cdb_observatory._TestArea(), 'us.census.spielman_singleton_segments.X10') = 'Wealthy, urban without Kids' As obs_getcategory_polygon; +-- NULL Input OBS_GetCategory +SELECT cdb_observatory.OBS_GetCategory( + NULL, 'us.census.spielman_singleton_segments.X10') IS NULL As obs_getcategory_null; + -- Point-based OBS_GetPopulation, default normalization (area) SELECT (abs(OBS_GetPopulation - 10923.093200390833950) / 10923.093200390833950) < 0.001 As OBS_GetPopulation FROM cdb_observatory.OBS_GetPopulation( @@ -231,6 +240,13 @@ FROM cdb_observatory._TestArea(), NULL ) As m(obs_getpopulation_polygon_null); +-- Null input OBS_GetPopulation +SELECT obs_getpopulation_polygon_null_geom IS NULL As obs_getpopulation_polygon_null_geom_test +FROM + cdb_observatory.OBS_GetPopulation( + NULL, NULL + ) As m(obs_getpopulation_polygon_null_geom); + -- Point-based OBS_GetUSCensusMeasure, default normalization (area) SELECT (abs(cdb_observatory.obs_getuscensusmeasure( cdb_observatory._testpoint(), 'male population') - 6789.5647735060920500) / 6789.5647735060920500) < 0.001 As obs_getuscensusmeasure_point_male_pop; @@ -244,6 +260,11 @@ SELECT (abs(cdb_observatory.obs_getuscensusmeasure( SELECT (abs(cdb_observatory.obs_getuscensusmeasure( cdb_observatory._testarea(), 'male population', NULL) - 6043.63061042765) / 6043.63061042765) < 0.001 As obs_getuscensusmeasure_null; +-- Poly-based OBS_GetUSCensusMeasure, Null input geom +SELECT cdb_observatory.obs_getuscensusmeasure( + NULL, 'male population', NULL) IS NULL As obs_getuscensusmeasure_null_geom; + + -- Point-based OBS_GetUSCensusCategory SELECT cdb_observatory.OBS_GetUSCensusCategory( cdb_observatory._testpoint(), 'Spielman-Singleton Segments: 10 Clusters') = 'Wealthy, urban without Kids' As OBS_GetUSCensusCategory_point; @@ -252,6 +273,10 @@ SELECT cdb_observatory.OBS_GetUSCensusCategory( SELECT cdb_observatory.OBS_GetUSCensusCategory( cdb_observatory._testarea(), 'Spielman-Singleton Segments: 10 Clusters') = 'Wealthy, urban without Kids' As OBS_GetUSCensusCategory_polygon; +-- Null-input OBS_GetUSCensusCategory +SELECT cdb_observatory.OBS_GetUSCensusCategory( + NULL, 'Spielman-Singleton Segments: 10 Clusters') IS NULL As OBS_GetUSCensusCategory_null; + -- OBS_GetMeasureById tests -- typical query @@ -285,3 +310,11 @@ SELECT cdb_observatory.OBS_GetMeasureById( 'us.census.tiger.block_group', '2010 - 2014' ) IS NULL As OBS_GetMeasureById_nulls; + +-- NULL input id +SELECT cdb_observatory.OBS_GetMeasureById( + NULL, + 'us.census.acs.B01003001', + 'us.census.tiger.block_group', + '2010 - 2014' +) IS NULL As OBS_GetMeasureById_null_id; diff --git a/src/python/test/autotest.py b/src/python/test/autotest.py index effdf4a..356039d 100644 --- a/src/python/test/autotest.py +++ b/src/python/test/autotest.py @@ -60,27 +60,30 @@ SKIP_COLUMNS = set([ u'mx.inegi_columns.POB36', u'mx.inegi_columns.POB33', u'mx.inegi_columns.POB58', + u'mx.inegi_columns.DISC4', ]) -def default_geometry_id(column_id): - ''' - Returns default test point for the column_id. - ''' - if column_id == 'whosonfirst.wof_disputed_geom': - return 'ST_SetSRID(ST_MakePoint(76.57, 33.78), 4326)' - elif column_id == 'whosonfirst.wof_marinearea_geom': - return 'ST_SetSRID(ST_MakePoint(-68.47, 43.33), 4326)' - elif column_id in ('us.census.tiger.school_district_elementary', - 'us.census.tiger.school_district_secondary', - 'us.census.tiger.school_district_elementary_clipped', - 'us.census.tiger.school_district_secondary_clipped'): - return 'ST_SetSRID(ST_MakePoint(-73.7067, 40.7025), 4326)' - elif column_id.startswith('es.ine'): - return 'ST_SetSRID(ST_MakePoint(-2.51141249535454, 42.8226119029222), 4326)' - elif column_id.startswith('us.zillow'): - return 'ST_SetSRID(ST_MakePoint(-81.3544048197256, 28.3305906291771), 4326)' - else: - return 'ST_SetSRID(ST_MakePoint(-73.9, 40.7), 4326)' +#def default_geometry_id(column_id): +# ''' +# Returns default test point for the column_id. +# ''' +# if column_id == 'whosonfirst.wof_disputed_geom': +# return 'ST_SetSRID(ST_MakePoint(76.57, 33.78), 4326)' +# elif column_id == 'whosonfirst.wof_marinearea_geom': +# return 'ST_SetSRID(ST_MakePoint(-68.47, 43.33), 4326)' +# elif column_id in ('us.census.tiger.school_district_elementary', +# 'us.census.tiger.school_district_secondary', +# 'us.census.tiger.school_district_elementary_clipped', +# 'us.census.tiger.school_district_secondary_clipped'): +# return 'ST_SetSRID(ST_MakePoint(-73.7067, 40.7025), 4326)' +# elif column_id.startswith('es.ine'): +# return 'ST_SetSRID(ST_MakePoint(-2.51141249535454, 42.8226119029222), 4326)' +# elif column_id.startswith('us.zillow'): +# return 'ST_SetSRID(ST_MakePoint(-81.3544048197256, 28.3305906291771), 4326)' +# elif column_id.startswith('ca.'): +# return '' +# else: +# return 'ST_SetSRID(ST_MakePoint(-73.9, 40.7), 4326)' def default_point(column_id): @@ -107,6 +110,11 @@ def default_point(column_id): return 'ST_SetSRID(ST_MakePoint(-81.3544048197256, 28.3305906291771), 4326)' elif column_id.startswith('mx.'): return 'ST_SetSRID(ST_MakePoint(-99.17019367218018, 19.41347699386547), 4326)' + elif column_id.startswith('ca.'): + raise SkipTest('Skipping Canada until validation of data complete') + return 'ST_SetSRID(ST_MakePoint(-79.39716339111328, 43.65694347778308), 4326)' + elif column_id.startswith('th.'): + return 'ST_SetSRID(ST_MakePoint(100.49263000488281, 13.725377712079784), 4326)' else: return 'ST_SetSRID(ST_MakePoint(-73.9, 40.7), 4326)' @@ -116,7 +124,7 @@ def default_area(column_id): Returns default test area for the column_id ''' point = default_point(column_id) - area = 'ST_Transform(ST_Buffer(ST_Transform({point}, 3857), 1000), 4326)'.format( + area = 'ST_Transform(ST_Buffer(ST_Transform({point}, 3857), 250), 4326)'.format( point=point) return area