120 lines
3.1 KiB
PL/PgSQL
120 lines
3.1 KiB
PL/PgSQL
-- return a table that contains a string match based on input
|
|
-- TODO: implement search for timespan
|
|
|
|
CREATE OR REPLACE FUNCTION cdb_observatory._OBS_SearchTables(
|
|
search_term text,
|
|
time_span text DEFAULT NULL
|
|
)
|
|
RETURNS table(tablename text, timespan text)
|
|
As $$
|
|
DECLARE
|
|
out_var text[];
|
|
BEGIN
|
|
|
|
IF time_span IS NULL
|
|
THEN
|
|
RETURN QUERY
|
|
EXECUTE
|
|
'SELECT tablename, timespan
|
|
FROM observatory.obs_table t
|
|
JOIN observatory.obs_column_table ct
|
|
ON ct.table_id = t.id
|
|
JOIN observatory.obs_column c
|
|
ON ct.column_id = c.id
|
|
WHERE c.type ILIKE ''geometry''
|
|
AND c.id = $1'
|
|
USING search_term;
|
|
ELSE
|
|
RETURN QUERY
|
|
EXECUTE
|
|
'SELECT tablename, timespan
|
|
FROM observatory.obs_table t
|
|
JOIN observatory.obs_column_table ct
|
|
ON ct.table_id = t.id
|
|
JOIN observatory.obs_column c
|
|
ON ct.column_id = c.id
|
|
WHERE c.type ILIKE ''geometry''
|
|
AND c.id = $1
|
|
AND t.timespan = $2'
|
|
USING search_term, time_span;
|
|
END IF;
|
|
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
-- Functions used to search the observatory for measures
|
|
--------------------------------------------------------------------------------
|
|
-- TODO allow the user to specify the boundary to search for measures
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION cdb_observatory.OBS_Search(
|
|
search_term text,
|
|
relevant_boundary text DEFAULT null
|
|
)
|
|
RETURNS TABLE(id text, description text, name text, aggregate text, source text) as $$
|
|
DECLARE
|
|
boundary_term text;
|
|
BEGIN
|
|
IF relevant_boundary then
|
|
boundary_term = '';
|
|
else
|
|
boundary_term = '';
|
|
END IF;
|
|
|
|
RETURN QUERY
|
|
EXECUTE format($string$
|
|
SELECT id, description,
|
|
name,
|
|
aggregate,
|
|
replace(split_part(id,'".', 1),'"', '') source
|
|
FROM observatory.OBS_column
|
|
where name ilike '%%' || %L || '%%'
|
|
or description ilike '%%' || %L || '%%'
|
|
%s
|
|
$string$, search_term, search_term,boundary_term);
|
|
RETURN;
|
|
END
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
|
|
-- Functions to return the geometry levels that a point is part of
|
|
--------------------------------------------------------------------------------
|
|
-- TODO add test response
|
|
|
|
CREATE OR REPLACE FUNCTION OBS_GetAvailableBoundaries(
|
|
geom geometry,
|
|
timespan text DEFAULT null)
|
|
RETURNS TABLE(boundary_id text, description text, time_span text, tablename text) as $$
|
|
DECLARE
|
|
timespan_query TEXT DEFAULT '';
|
|
BEGIN
|
|
|
|
IF time_span != null THEN
|
|
timespan_query = format('AND timespan = %L', time_span);
|
|
END IF;
|
|
|
|
RETURN QUERY
|
|
EXECUTE
|
|
$string$
|
|
select
|
|
column_id,
|
|
obs_column.description,
|
|
timespan,
|
|
tablename
|
|
FROM
|
|
observatory.OBS_table,
|
|
observatory.OBS_column_table,
|
|
observatory.OBS_column
|
|
WHERE
|
|
observatory.OBS_column_table.column_id = observatory.obs_column.id AND
|
|
observatory.OBS_column_table.table_id = observatory.obs_table.id
|
|
AND
|
|
observatory.OBS_column.type='Geometry'
|
|
AND
|
|
$1 && bounds::box2d
|
|
$string$ || timespan_query
|
|
USING geom
|
|
RETURN;
|
|
END
|
|
$$ LANGUAGE plpgsql;
|