OBS_MetadataValidation
New function to check the metadata in order to search for errors like for example if we have the metadata for a median aggregation and the normalization is by are it'll fail.
This commit is contained in:
parent
50d975ce9b
commit
cef99c6343
@ -1076,3 +1076,46 @@ BEGIN
|
|||||||
RETURN result;
|
RETURN result;
|
||||||
END;
|
END;
|
||||||
$$ LANGUAGE plpgsql STABLE;
|
$$ LANGUAGE plpgsql STABLE;
|
||||||
|
|
||||||
|
-- MetadataValidation checks the metadata parameters and the geometry type
|
||||||
|
-- of the data in order to find possible wrong cases
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_observatory.obs_metadatavalidation(
|
||||||
|
geometry_extent geometry(Geometry, 4326),
|
||||||
|
geometry_type text,
|
||||||
|
params JSON,
|
||||||
|
target_geoms INTEGER DEFAULT NULL
|
||||||
|
)
|
||||||
|
RETURNS TABLE(valid boolean, errors text[]) AS $$
|
||||||
|
DECLARE
|
||||||
|
meta json;
|
||||||
|
errors text[];
|
||||||
|
BEGIN
|
||||||
|
errors := (ARRAY[])::TEXT[];
|
||||||
|
IF geometry_type IN ('ST_Polygon', 'ST_MultiPolygon') THEN
|
||||||
|
FOR meta IN EXECUTE 'SELECT json_array_elements(cdb_observatory.OBS_GetMeta($1, $2, 1, 1, $3))' USING geometry_extent, params, target_geoms
|
||||||
|
LOOP
|
||||||
|
IF (meta->>'normalization' = 'denominated' AND meta->>'denom_id' is NULL) THEN
|
||||||
|
errors := array_append(errors, 'Normalizated measure should have a numerator and a denominator. Please review the provided options.');
|
||||||
|
END IF;
|
||||||
|
IF (meta->>'numer_aggregate' IS NULL) THEN
|
||||||
|
errors := array_append(errors, 'For polygon geometries, aggregation is mandatory. Please review the provided options');
|
||||||
|
END IF;
|
||||||
|
IF (meta->>'numer_aggregate' IN ('median', 'average') AND meta->>'denom_id' IS NULL) THEN
|
||||||
|
errors := array_append(errors, 'Median or average aggregation for polygons requires a denominator to provide weights. Please review the provided options');
|
||||||
|
END IF;
|
||||||
|
IF (meta->>'numer_aggregate' IN ('median', 'average') AND meta->>'normalization' NOT LIKE 'pre%') THEN
|
||||||
|
errors := array_append(errors, format('Median or average aggregation only supports prenormalized normalization, %s passed. Please review the provided options', meta->>'normalization'));
|
||||||
|
END IF;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
IF CARDINALITY(errors) > 0 THEN
|
||||||
|
RETURN QUERY EXECUTE 'SELECT FALSE, $1' USING errors;
|
||||||
|
ELSE
|
||||||
|
RETURN QUERY SELECT TRUE, ARRAY[]::TEXT[];
|
||||||
|
END IF;
|
||||||
|
ELSE
|
||||||
|
RETURN QUERY SELECT TRUE, ARRAY[]::TEXT[];
|
||||||
|
END IF;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql STABLE;
|
||||||
|
@ -304,3 +304,12 @@ tract_sample|tract_max_error|tract_avg_error|tract_min_error
|
|||||||
no_bg_point_error
|
no_bg_point_error
|
||||||
t
|
t
|
||||||
(1 row)
|
(1 row)
|
||||||
|
valid|errors
|
||||||
|
t|{}
|
||||||
|
(1 row)
|
||||||
|
valid|errors
|
||||||
|
f|{"Median or average aggregation only supports prenormalized normalization, denominated passed. Please review the provided options"}
|
||||||
|
(1 row)
|
||||||
|
valid|errors
|
||||||
|
f|{"Normalizated measure should have a numerator and a denominator. Please review the provided options."}
|
||||||
|
(1 row)
|
||||||
|
@ -973,3 +973,9 @@ WITH _geoms AS (
|
|||||||
FROM geoms, results
|
FROM geoms, results
|
||||||
WHERE cartodb_id = id
|
WHERE cartodb_id = id
|
||||||
;
|
;
|
||||||
|
|
||||||
|
-- OBS_MetadataValidation
|
||||||
|
|
||||||
|
SELECT * FROM cdb_observatory.OBS_MetadataValidation(NULL, 'ST_Polygon', '[{"numer_id": "us.census.acs.B01003001","denom_id": null,"normalization": "prenormalized","geom_id": null,"numer_timespan": "2010 - 2014"}]'::json, 500);
|
||||||
|
SELECT * FROM cdb_observatory.OBS_MetadataValidation(NULL, 'ST_Polygon', '[{"numer_id": "us.census.acs.B25058001","denom_id": null,"normalization": "denominated","geom_id": null,"numer_timespan": "2010 - 2014"}]'::json, 500);
|
||||||
|
SELECT * FROM cdb_observatory.OBS_MetadataValidation(NULL, 'ST_Polygon', '[{"numer_id": "us.census.acs.B15003001","denom_id": null,"normalization": "denominated","geom_id": null,"numer_timespan": "2010 - 2014"}]'::json, 500);
|
||||||
|
Loading…
Reference in New Issue
Block a user