remove almost all %L formats, including all where geoms were dropped in

This commit is contained in:
John Krauss
2016-11-30 16:53:22 +00:00
parent 70f4807139
commit 81c8fc316b
+69 -84
View File
@@ -232,27 +232,25 @@ BEGIN
-- we *really* should pass in both geom_table_name and boundary_id -- we *really* should pass in both geom_table_name and boundary_id
-- TODO tablename should not be passed here (use boundary_id) -- TODO tablename should not be passed here (use boundary_id)
EXECUTE EXECUTE
format('SELECT ct.colname 'SELECT ct.colname
FROM observatory.obs_column_to_column c2c, FROM observatory.obs_column_to_column c2c,
observatory.obs_column_table ct, observatory.obs_column_table ct,
observatory.obs_table t observatory.obs_table t
WHERE c2c.reltype = ''geom_ref'' WHERE c2c.reltype = ''geom_ref''
AND ct.column_id = c2c.source_id AND ct.column_id = c2c.source_id
AND ct.table_id = t.id AND ct.table_id = t.id
AND t.tablename = %L' AND t.tablename = $1'
, (data_table_info)[1]->>'tablename') INTO data_geoid_colname USING (data_table_info)[1]->>'tablename';
INTO data_geoid_colname;
EXECUTE EXECUTE
format('SELECT ct.colname 'SELECT ct.colname
FROM observatory.obs_column_to_column c2c, FROM observatory.obs_column_to_column c2c,
observatory.obs_column_table ct, observatory.obs_column_table ct,
observatory.obs_table t observatory.obs_table t
WHERE c2c.reltype = ''geom_ref'' WHERE c2c.reltype = ''geom_ref''
AND ct.column_id = c2c.source_id AND ct.column_id = c2c.source_id
AND ct.table_id = t.id AND ct.table_id = t.id
AND t.tablename = %L' AND t.tablename = $1'
, geom_table_name) INTO geom_geoid_colname USING geom_table_name;
INTO geom_geoid_colname;
EXECUTE EXECUTE
format('SELECT %I format('SELECT %I
@@ -268,11 +266,10 @@ BEGIN
EXECUTE EXECUTE
format('SELECT ST_Area(the_geom::geography) / (1000 * 1000) format('SELECT ST_Area(the_geom::geography) / (1000 * 1000)
FROM observatory.%I FROM observatory.%I
WHERE %I = %L', WHERE %I = $1',
geom_table_name, geom_table_name,
geom_geoid_colname, geom_geoid_colname)
geoid) INTO area USING geoid;
INTO area;
IF area IS NULL IF area IS NULL
THEN THEN
@@ -435,55 +432,55 @@ BEGIN
IF map_type = 'areaNormalized' THEN IF map_type = 'areaNormalized' THEN
sql = format('WITH _geom AS (SELECT ST_Area(geom.%I::Geography) / 1000000 area, geom.%I geom_ref sql = format('WITH _geom AS (SELECT ST_Area(geom.%I::Geography) / 1000000 area, geom.%I geom_ref
FROM observatory.%I geom FROM observatory.%I geom
WHERE ST_Within(%L, geom.%I) WHERE ST_Within($1, geom.%I)
LIMIT 1) LIMIT 1)
SELECT numer.%I / (SELECT area FROM _geom) SELECT numer.%I / (SELECT area FROM _geom)
FROM observatory.%I numer FROM observatory.%I numer
WHERE numer.%I = (SELECT geom_ref FROM _geom)', WHERE numer.%I = (SELECT geom_ref FROM _geom)',
geom_colname, geom_geomref_colname, geom_tablename, geom_colname, geom_geomref_colname, geom_tablename,
geom, geom_colname, numer_colname, numer_tablename, geom_colname, numer_colname, numer_tablename,
numer_geomref_colname); numer_geomref_colname);
ELSIF map_type = 'denominated' THEN ELSIF map_type = 'denominated' THEN
sql = format('SELECT numer.%I / NULLIF((SELECT denom.%I FROM observatory.%I denom WHERE denom.%I = numer.%I LIMIT 1), 0) sql = format('SELECT numer.%I / NULLIF((SELECT denom.%I FROM observatory.%I denom WHERE denom.%I = numer.%I LIMIT 1), 0)
FROM observatory.%I numer FROM observatory.%I numer
WHERE numer.%I = (SELECT geom.%I FROM observatory.%I geom WHERE ST_Within(%L, geom.%I) LIMIT 1)', WHERE numer.%I =
(SELECT geom.%I
FROM observatory.%I geom
WHERE ST_Within($1, geom.%I) LIMIT 1)',
numer_colname, denom_colname, denom_tablename, numer_colname, denom_colname, denom_tablename,
denom_geomref_colname, numer_geomref_colname, denom_geomref_colname, numer_geomref_colname,
numer_tablename, numer_tablename, numer_geomref_colname,
numer_geomref_colname, geom_geomref_colname, geom_geomref_colname, geom_tablename, geom_colname);
geom_tablename, geom, geom_colname);
ELSIF map_type = 'predenominated' THEN ELSIF map_type = 'predenominated' THEN
sql = format('SELECT numer.%I sql = format('SELECT numer.%I
FROM observatory.%I numer FROM observatory.%I numer
WHERE numer.%I = (SELECT geom.%I FROM observatory.%I geom WHERE ST_Within(%L, geom.%I) LIMIT 1)', WHERE numer.%I =
numer_colname, numer_tablename, (SELECT geom.%I
numer_geomref_colname, geom_geomref_colname, geom_tablename, FROM observatory.%I geom
geom, geom_colname); WHERE ST_Within($1, geom.%I) LIMIT 1)',
numer_colname, numer_tablename, numer_geomref_colname,
geom_geomref_colname, geom_tablename, geom_colname);
END IF; END IF;
ELSIF geom_type = 'polygon' THEN ELSIF geom_type = 'polygon' THEN
IF map_type = 'areaNormalized' THEN IF map_type = 'areaNormalized' THEN
sql = format('WITH _geom AS (SELECT ST_Area(ST_Intersection(%L, geom.%I)) sql = format('WITH _geom AS (SELECT ST_Area(ST_Intersection($1, geom.%I))
/ ST_Area(geom.%I) overlap, geom.%I geom_ref / ST_Area(geom.%I) overlap, geom.%I geom_ref
FROM observatory.%I geom FROM observatory.%I geom
WHERE ST_Intersects(%L, geom.%I) WHERE ST_Intersects($1, geom.%I)
AND ST_Area(ST_Intersection(%L, geom.%I)) / ST_Area(geom.%I) > 0) AND ST_Area(ST_Intersection($1, geom.%I)) / ST_Area(geom.%I) > 0)
SELECT SUM(numer.%I * (SELECT _geom.overlap FROM _geom WHERE _geom.geom_ref = numer.%I)) / SELECT SUM(numer.%I * (SELECT _geom.overlap FROM _geom WHERE _geom.geom_ref = numer.%I)) /
(ST_Area(%L::Geography) / 1000000) (ST_Area($1::Geography) / 1000000)
FROM observatory.%I numer FROM observatory.%I numer
WHERE numer.%I = ANY ((SELECT ARRAY_AGG(geom_ref) FROM _geom)::TEXT[])', WHERE numer.%I = ANY ((SELECT ARRAY_AGG(geom_ref) FROM _geom)::TEXT[])',
geom, geom_colname, geom_colname, geom_colname, geom_colname, geom_geomref_colname, geom_tablename,
geom_geomref_colname, geom_tablename, geom_colname, geom_colname, geom_colname, numer_colname,
geom, geom_colname, numer_geomref_colname, numer_tablename, numer_geomref_colname);
geom, geom_colname, geom_colname,
numer_colname, numer_geomref_colname,
geom, numer_tablename,
numer_geomref_colname);
ELSIF map_type = 'denominated' THEN ELSIF map_type = 'denominated' THEN
sql = format('WITH _geom AS (SELECT ST_Area(ST_Intersection(%L, geom.%I)) sql = format('WITH _geom AS (SELECT ST_Area(ST_Intersection($1, geom.%I))
/ ST_Area(geom.%I) overlap, geom.%I geom_ref / ST_Area(geom.%I) overlap, geom.%I geom_ref
FROM observatory.%I geom FROM observatory.%I geom
WHERE ST_Intersects(%L, geom.%I) WHERE ST_Intersects($1, geom.%I)
AND ST_Area(ST_Intersection(%L, geom.%I)) / ST_Area(geom.%I) > 0), AND ST_Area(ST_Intersection($1, geom.%I)) / ST_Area(geom.%I) > 0),
_denom AS (SELECT denom.%I, denom.%I geom_ref _denom AS (SELECT denom.%I, denom.%I geom_ref
FROM observatory.%I denom FROM observatory.%I denom
WHERE denom.%I = ANY ((SELECT ARRAY_AGG(geom_ref) FROM _geom)::TEXT[])) WHERE denom.%I = ANY ((SELECT ARRAY_AGG(geom_ref) FROM _geom)::TEXT[]))
@@ -494,44 +491,34 @@ BEGIN
FROM _denom WHERE _denom.geom_ref = numer.%I)) FROM _denom WHERE _denom.geom_ref = numer.%I))
FROM observatory.%I numer FROM observatory.%I numer
WHERE numer.%I = ANY ((SELECT ARRAY_AGG(geom_ref) FROM _geom)::TEXT[])', WHERE numer.%I = ANY ((SELECT ARRAY_AGG(geom_ref) FROM _geom)::TEXT[])',
geom, geom_colname, geom_colname, geom_colname, geom_geomref_colname,
geom_colname, geom_geomref_colname, geom_tablename, geom_colname, geom_colname, geom_colname,
geom_tablename, denom_colname, denom_geomref_colname, denom_tablename,
geom, geom_colname, denom_geomref_colname, numer_colname, numer_geomref_colname,
geom, geom_colname, geom_colname, denom_colname, numer_geomref_colname,
denom_colname, denom_geomref_colname, numer_tablename, numer_geomref_colname);
denom_tablename,
denom_geomref_colname,
numer_colname, numer_geomref_colname,
denom_colname,
numer_geomref_colname,
numer_tablename,
numer_geomref_colname);
ELSIF map_type = 'predenominated' THEN ELSIF map_type = 'predenominated' THEN
IF numer_aggregate NOT ILIKE 'sum' THEN IF numer_aggregate NOT ILIKE 'sum' THEN
RAISE EXCEPTION 'Cannot calculate "%" (%) for custom area as it cannot be summed, use ST_PointOnSurface instead', RAISE EXCEPTION 'Cannot calculate "%" (%) for custom area as it cannot be summed, use ST_PointOnSurface instead',
numer_name, measure_id; numer_name, measure_id;
ELSE ELSE
sql = format('WITH _geom AS (SELECT ST_Area(ST_Intersection(%L, geom.%I)) sql = format('WITH _geom AS (SELECT ST_Area(ST_Intersection($1, geom.%I))
/ ST_Area(geom.%I) overlap, geom.%I geom_ref / ST_Area(geom.%I) overlap, geom.%I geom_ref
FROM observatory.%I geom FROM observatory.%I geom
WHERE ST_Intersects(%L, geom.%I) WHERE ST_Intersects($1, geom.%I)
AND ST_Area(ST_Intersection(%L, geom.%I)) / ST_Area(geom.%I) > 0) AND ST_Area(ST_Intersection($1, geom.%I)) / ST_Area(geom.%I) > 0)
SELECT SUM(numer.%I * (SELECT _geom.overlap FROM _geom WHERE _geom.geom_ref = numer.%I)) SELECT SUM(numer.%I * (SELECT _geom.overlap FROM _geom WHERE _geom.geom_ref = numer.%I))
FROM observatory.%I numer FROM observatory.%I numer
WHERE numer.%I = ANY ((SELECT ARRAY_AGG(geom_ref) FROM _geom)::TEXT[])', WHERE numer.%I = ANY ((SELECT ARRAY_AGG(geom_ref) FROM _geom)::TEXT[])',
geom, geom_colname, geom_colname, geom_colname, geom_colname, geom_geomref_colname,
geom_geomref_colname, geom_tablename, geom_tablename, geom_colname, geom_colname, geom_colname,
geom, geom_colname, numer_colname, numer_geomref_colname, numer_tablename,
geom, geom_colname, geom_colname,
numer_colname, numer_geomref_colname,
numer_tablename,
numer_geomref_colname); numer_geomref_colname);
END IF; END IF;
END IF; END IF;
END IF; END IF;
EXECUTE sql INTO result; EXECUTE sql INTO result USING geom;
RETURN result; RETURN result;
END; END;
@@ -574,11 +561,11 @@ BEGIN
EXECUTE format( EXECUTE format(
'SELECT %I 'SELECT %I
FROM observatory.%I data FROM observatory.%I data
WHERE data.%I = %L', WHERE data.%I = $1',
colname, colname,
target_table, target_table,
data_geoid_colname, geom_ref) data_geoid_colname)
INTO measure_val; INTO measure_val USING geom_ref;
RETURN measure_val; RETURN measure_val;
@@ -627,28 +614,27 @@ BEGIN
'SELECT data.%I 'SELECT data.%I
FROM observatory.%I data, observatory.%I geom FROM observatory.%I data, observatory.%I geom
WHERE data.%I = geom.%I WHERE data.%I = geom.%I
AND ST_WITHIN(%L, geom.%I) ', AND ST_WITHIN($1, geom.%I) ',
colname, data_table, geom_table, data_geomref_colname, colname, data_table, geom_table, data_geomref_colname,
geom_geomref_colname, geom, geom_colname) geom_geomref_colname, geom_colname)
INTO category_val; INTO category_val USING geom;
ELSE ELSE
-- favor the category with the most area -- favor the category with the most area
EXECUTE format( EXECUTE format(
'SELECT data.%I category, SUM(overlap_fraction) category_share 'SELECT data.%I category, SUM(overlap_fraction) category_share
FROM observatory.%I data, ( FROM observatory.%I data, (
SELECT ST_Area( SELECT ST_Area(
ST_Intersection(%L, a.%I) ST_Intersection($1, a.%I)
) / ST_Area(%L) AS overlap_fraction, a.%I geomref ) / ST_Area($1) AS overlap_fraction, a.%I geomref
FROM observatory.%I as a FROM observatory.%I as a
WHERE %L && a.%I) _overlaps WHERE $1 && a.%I) _overlaps
WHERE data.%I = _overlaps.geomref WHERE data.%I = _overlaps.geomref
GROUP BY category GROUP BY category
ORDER BY SUM(overlap_fraction) DESC ORDER BY SUM(overlap_fraction) DESC
LIMIT 1', LIMIT 1',
colname, data_table, colname, data_table, geom_colname, geom_geomref_colname,
geom, geom_colname, geom, geom_geomref_colname, geom_table, geom_colname, data_geomref_colname)
geom_table, geom, geom_colname, data_geomref_colname) INTO category_val, category_share USING geom;
INTO category_val, category_share;
END IF; END IF;
RETURN category_val; RETURN category_val;
@@ -738,10 +724,11 @@ BEGIN
-- TODO use a super-column for global pop -- TODO use a super-column for global pop
population_measure_id := 'us.census.acs.B01003001'; population_measure_id := 'us.census.acs.B01003001';
EXECUTE format('SELECT cdb_observatory.OBS_GetMeasure( EXECUTE 'SELECT cdb_observatory.OBS_GetMeasure(
%L, %L, %L, %L, %L $1, $2, $3, $4, $5
) LIMIT 1', geom, population_measure_id, normalize, boundary_id, time_span) ) LIMIT 1'
INTO result; INTO result
USING geom, population_measure_id, normalize, boundary_id, time_span;
return result; return result;
END; END;
@@ -770,27 +757,25 @@ BEGIN
-- we *really* should pass in both geom_table_name and boundary_id -- we *really* should pass in both geom_table_name and boundary_id
-- TODO tablename should not be passed here (use boundary_id) -- TODO tablename should not be passed here (use boundary_id)
EXECUTE EXECUTE
format('SELECT ct.colname 'SELECT ct.colname
FROM observatory.obs_column_to_column c2c, FROM observatory.obs_column_to_column c2c,
observatory.obs_column_table ct, observatory.obs_column_table ct,
observatory.obs_table t observatory.obs_table t
WHERE c2c.reltype = ''geom_ref'' WHERE c2c.reltype = ''geom_ref''
AND ct.column_id = c2c.source_id AND ct.column_id = c2c.source_id
AND ct.table_id = t.id AND ct.table_id = t.id
AND t.tablename = %L' AND t.tablename = $1'
, (data_table_info)[1]->>'tablename') INTO data_geoid_colname USING (data_table_info)[1]->>'tablename';
INTO data_geoid_colname;
EXECUTE EXECUTE
format('SELECT ct.colname 'SELECT ct.colname
FROM observatory.obs_column_to_column c2c, FROM observatory.obs_column_to_column c2c,
observatory.obs_column_table ct, observatory.obs_column_table ct,
observatory.obs_table t observatory.obs_table t
WHERE c2c.reltype = ''geom_ref'' WHERE c2c.reltype = ''geom_ref''
AND ct.column_id = c2c.source_id AND ct.column_id = c2c.source_id
AND ct.table_id = t.id AND ct.table_id = t.id
AND t.tablename = %L' AND t.tablename = $1'
, geom_table_name) INTO geom_geoid_colname USING geom_table_name;
INTO geom_geoid_colname;
q_select := format('SELECT %I, ', data_geoid_colname); q_select := format('SELECT %I, ', data_geoid_colname);
q_sum := 'SELECT Array['; q_sum := 'SELECT Array[';