mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-22 22:11:29 +08:00
remove dead code
This commit is contained in:
parent
e96509d4c0
commit
117e5ccd47
@ -1,97 +0,0 @@
|
|||||||
|
|
||||||
CREATE OR REPLACE FUNCTION initialize_field_from_system_connector(
|
|
||||||
project_id INT,
|
|
||||||
namespace TEXT,
|
|
||||||
replica_no SMALLINT,
|
|
||||||
partition_number SMALLINT,
|
|
||||||
total_partitions SMALLINT,
|
|
||||||
field_name TEXT
|
|
||||||
)
|
|
||||||
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
pfl project_field_local;
|
|
||||||
BEGIN
|
|
||||||
pfl = field_info_from_system_connector(project_id :: BIGINT, namespace, replica_no, field_name);
|
|
||||||
|
|
||||||
PERFORM create_field_from_definition(pfl.project_id, pfl.namespace, pfl.replica_no, pfl.field, pfl.is_distinct,
|
|
||||||
pfl.is_partition_key, pfl.value_type, pfl.idx_types);
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION register_field_from_system_connector(
|
|
||||||
project_id INT,
|
|
||||||
namespace TEXT,
|
|
||||||
replica_no SMALLINT,
|
|
||||||
partition_number SMALLINT,
|
|
||||||
total_partitions SMALLINT,
|
|
||||||
field_name TEXT
|
|
||||||
)
|
|
||||||
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
pfl project_field_local;
|
|
||||||
BEGIN
|
|
||||||
pfl = field_info_from_system_connector(project_id :: BIGINT, namespace, replica_no, field_name);
|
|
||||||
PERFORM register_project_field(
|
|
||||||
pfl.project_id, pfl.namespace, pfl.replica_no, pfl.field,
|
|
||||||
pfl.value_type, pfl.is_partition_key, pfl.is_distinct, pfl.idx_types);
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION field_info_from_system_connector(
|
|
||||||
project_id BIGINT,
|
|
||||||
namespace TEXT,
|
|
||||||
replica_no SMALLINT,
|
|
||||||
field TEXT
|
|
||||||
)
|
|
||||||
RETURNS project_field_local LANGUAGE PLPGSQL VOLATILE AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
field_name TEXT;
|
|
||||||
field_type TEXT;
|
|
||||||
field_type_oid REGTYPE;
|
|
||||||
field_is_distinct BOOLEAN;
|
|
||||||
field_is_partitioning BOOLEAN;
|
|
||||||
index_type_string TEXT;
|
|
||||||
index_types field_index_type [];
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
SELECT
|
|
||||||
nsf.field,
|
|
||||||
nsf.type,
|
|
||||||
(lower(nl_distinct.value) IS NOT DISTINCT FROM 'true'),
|
|
||||||
ns.partitioning_field = nsf.field,
|
|
||||||
upper(nl_idx_type.value) :: field_index_type
|
|
||||||
INTO STRICT field_name, field_type, field_is_distinct, field_is_partitioning, index_type_string
|
|
||||||
FROM system.namespaces AS ns
|
|
||||||
INNER JOIN system.namespace_fields AS nsf ON (ns.namespace_id = nsf.namespace_id)
|
|
||||||
LEFT JOIN system.namespace_labels AS nl_distinct
|
|
||||||
ON (nl_distinct.namespace_id = ns.namespace_id AND nl_distinct.name = nsf.field || ':distinct')
|
|
||||||
LEFT JOIN system.namespace_labels AS nl_idx_type
|
|
||||||
ON (nl_idx_type.namespace_id = ns.namespace_id AND nl_idx_type.name = nsf.field || ':index_type')
|
|
||||||
WHERE
|
|
||||||
ns.project_id = field_info_from_system_connector.project_id AND
|
|
||||||
ns.name = field_info_from_system_connector.namespace AND
|
|
||||||
nsf.field = field_info_from_system_connector.field;
|
|
||||||
|
|
||||||
SELECT t :: REGTYPE
|
|
||||||
INTO field_type_oid
|
|
||||||
FROM get_field_type_from_ns_type(field_type) AS t;
|
|
||||||
|
|
||||||
index_types = string_to_array(index_type_string, ',') :: field_index_type [];
|
|
||||||
|
|
||||||
IF index_types IS NULL
|
|
||||||
THEN
|
|
||||||
IF field_is_distinct OR field_type_oid :: REGTYPE = 'TEXT' :: REGTYPE THEN
|
|
||||||
index_types = '{VALUE-TIME}'; --'{VALUE-TIME,TIME-VALUE}'
|
|
||||||
ELSE
|
|
||||||
index_types = '{TIME-VALUE}';
|
|
||||||
END IF;
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
RETURN ROW (project_id, namespace, replica_no, field_name, field_type_oid, field_is_partitioning,
|
|
||||||
field_is_distinct, index_types, NULL :: TEXT);
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
@ -1,589 +0,0 @@
|
|||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_cluster_name(namespace_type)
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT format($$cluster."%s_%s_%s"$$, $1.project_id, $1.name, $1.replica_no)
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_cluster_table(namespace_type)
|
|
||||||
RETURNS REGCLASS LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT get_cluster_name($1) :: REGCLASS
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_distinct_table_local(ns namespace_type)
|
|
||||||
RETURNS REGCLASS LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT get_distinct_table_oid(ns.name)
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_distinct_table_cluster(ns namespace_type)
|
|
||||||
RETURNS REGCLASS LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT ('cluster.' || table_name :: TEXT) :: REGCLASS
|
|
||||||
FROM get_distinct_table(ns.project_id, ns.name, ns.replica_no)
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_distinct_values_local(ns namespace_type, field TEXT)
|
|
||||||
RETURNS SETOF TEXT LANGUAGE PLPGSQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
table_name REGCLASS;
|
|
||||||
BEGIN
|
|
||||||
SELECT dis.table_name
|
|
||||||
INTO table_name
|
|
||||||
FROM distinct_tables dis
|
|
||||||
WHERE project_id = ns.project_id AND namespace = ns.name AND replica_no = ns.replica_no;
|
|
||||||
RETURN QUERY EXECUTE format(
|
|
||||||
$$
|
|
||||||
SELECT DISTINCT value
|
|
||||||
FROM %s
|
|
||||||
WHERE field = %L
|
|
||||||
$$,
|
|
||||||
table_name, field);
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_distinct_values_cluster(ns namespace_type, field TEXT)
|
|
||||||
RETURNS SETOF TEXT LANGUAGE PLPGSQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
BEGIN
|
|
||||||
RETURN QUERY EXECUTE format(
|
|
||||||
$$
|
|
||||||
SELECT DISTINCT value
|
|
||||||
FROM %s
|
|
||||||
WHERE field = %L
|
|
||||||
$$,
|
|
||||||
get_distinct_table_cluster(ns), field);
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_field_is_distinct(ns namespace_type, field_name TEXT)
|
|
||||||
RETURNS BOOLEAN LANGUAGE PLPGSQL STABLE STRICT AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
field_is_distinct BOOLEAN;
|
|
||||||
BEGIN
|
|
||||||
SELECT DISTINCT is_distinct
|
|
||||||
INTO STRICT field_is_distinct
|
|
||||||
FROM cluster.project_field pf
|
|
||||||
WHERE
|
|
||||||
pf.project_id = ns.project_id AND
|
|
||||||
pf.namespace = ns.name AND
|
|
||||||
pf.field = field_name;
|
|
||||||
RETURN field_is_distinct;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN NO_DATA_FOUND THEN
|
|
||||||
RAISE EXCEPTION 'Field is_distinct not found. Field name: % namespace: %', field_name, ns;
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_field_type(ns namespace_type, field_name TEXT)
|
|
||||||
RETURNS REGTYPE LANGUAGE PLPGSQL STABLE STRICT AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
field_type REGTYPE;
|
|
||||||
BEGIN
|
|
||||||
SELECT DISTINCT value_type
|
|
||||||
INTO STRICT field_type
|
|
||||||
FROM cluster.project_field pf
|
|
||||||
WHERE
|
|
||||||
pf.project_id = ns.project_id AND
|
|
||||||
pf.namespace = ns.name AND
|
|
||||||
pf.field = field_name;
|
|
||||||
RETURN field_type;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN NO_DATA_FOUND THEN
|
|
||||||
RAISE EXCEPTION 'Field type not found. Field name: % namespace: %', field_name, ns;
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_field_value_specifier(field_name TEXT)
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE STRICT AS
|
|
||||||
$BODY$
|
|
||||||
SELECT format('%I', field_name);
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_field_value_specifier(ns namespace_type, field_name TEXT)
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE STRICT AS
|
|
||||||
$BODY$
|
|
||||||
SELECT get_field_value_specifier(field_name)
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION is_partition_key(ns namespace_type, field_name TEXT)
|
|
||||||
RETURNS BOOLEAN LANGUAGE PLPGSQL STABLE STRICT AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
ret BOOLEAN;
|
|
||||||
BEGIN
|
|
||||||
SELECT DISTINCT is_partition_key
|
|
||||||
INTO STRICT ret
|
|
||||||
FROM cluster.project_field pf
|
|
||||||
WHERE
|
|
||||||
pf.project_id = ns.project_id AND
|
|
||||||
pf.namespace = ns.name AND
|
|
||||||
pf.field = field_name;
|
|
||||||
RETURN ret;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN NO_DATA_FOUND THEN
|
|
||||||
RAISE EXCEPTION 'Field is_partition_key not found. Field name: % namespace: %', field_name, ns;
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_field_name_clause(select_field TEXT)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT CASE WHEN select_field IS NOT NULL AND select_field <> '*' THEN select_field END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_group_field_clause(ns namespace_type, group_field TEXT)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT CASE WHEN group_field IS NOT NULL THEN get_field_value_specifier(ns, group_field)
|
|
||||||
ELSE 'NULL' END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_value_clause(ns namespace_type, select_field TEXT, op TEXT)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT CASE WHEN op IS NULL THEN
|
|
||||||
CASE WHEN select_field = '*' THEN 'value'
|
|
||||||
ELSE format('jsonb_build_object(%L, %s)', select_field, get_field_value_specifier(ns, select_field))
|
|
||||||
END
|
|
||||||
ELSE
|
|
||||||
format('%s(%s)', op, get_field_value_specifier(ns, select_field))
|
|
||||||
END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_value_type(ns namespace_type, select_field TEXT, op TEXT)
|
|
||||||
RETURNS REGTYPE LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT CASE WHEN op IS NULL THEN
|
|
||||||
CASE WHEN select_field = '*' THEN 'jsonb' :: REGTYPE
|
|
||||||
ELSE get_field_type(ns, select_field)
|
|
||||||
END
|
|
||||||
ELSE
|
|
||||||
'double precision' :: REGTYPE
|
|
||||||
END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_value_type_clause(ns namespace_type, select_field TEXT, op TEXT)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT format('%L::regtype', get_value_type(ns, select_field, op) :: TEXT);
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_time_clause(group_time BIGINT)
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT CASE WHEN group_time IS NOT NULL THEN format('(time - (time %% %L::bigint))::bigint', group_time)
|
|
||||||
ELSE 'time' END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_group_field_clause(ns namespace_type, op TEXT, group_field TEXT)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS $BODY$
|
|
||||||
SELECT CASE WHEN op IS NOT NULL THEN get_field_value_specifier(ns, group_field)
|
|
||||||
ELSE 'NULL' END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_full_select_clause(ns namespace_type, query ioql_query)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT format('SELECT time, %s', get_field_list(query));
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_time_predicate(cond time_condition_type)
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT string_agg(clauses.val, ' AND ')
|
|
||||||
FROM (VALUES ('time>=' || cond.from_time), ('time<' || cond.to_time)) AS clauses(val);
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_select_field_required_field(select_field select_item [])
|
|
||||||
RETURNS SETOF TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT CASE WHEN select_field <> NULL THEN
|
|
||||||
(SELECT field
|
|
||||||
FROM unnest(select_field))
|
|
||||||
END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_field_condition_required_fields(cond field_condition_type)
|
|
||||||
RETURNS SETOF TEXT LANGUAGE SQL IMMUTABLE STRICT AS $BODY$
|
|
||||||
SELECT p.field
|
|
||||||
FROM unnest(cond.predicates) AS p
|
|
||||||
WHERE cond.conjunctive = 'AND'
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_required_fields(query ioql_query)
|
|
||||||
RETURNS SETOF TEXT LANGUAGE SQL IMMUTABLE STRICT AS
|
|
||||||
$BODY$
|
|
||||||
(
|
|
||||||
SELECT *
|
|
||||||
FROM get_field_condition_required_fields(query.field_condition)
|
|
||||||
)
|
|
||||||
UNION
|
|
||||||
(
|
|
||||||
SELECT *
|
|
||||||
FROM get_select_field_required_field(query.select_field) f
|
|
||||||
WHERE f IS NOT NULL
|
|
||||||
)
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_partitioning_predicate(ns namespace_type,
|
|
||||||
partitioning_field_value TEXT,
|
|
||||||
total_partitions INT)
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE STRICT AS
|
|
||||||
$BODY$
|
|
||||||
SELECT format('get_partition_for_key(%I, %L) = %L', get_partitioning_field(ns.project_id :: INT, ns.name),
|
|
||||||
total_partitions, get_partition_for_key(partitioning_field_value, total_partitions))
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_partitioning_field_value(ns namespace_type, cond field_condition_type)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE STRICT AS
|
|
||||||
$BODY$
|
|
||||||
SELECT p.constant
|
|
||||||
FROM unnest(cond.predicates) AS p
|
|
||||||
WHERE is_partition_key(ns, p.field) AND cond.conjunctive = 'AND' AND p.op = '='
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION combine_predicates(VARIADIC clauses TEXT [])
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT string_agg(clause.val, ' AND ')
|
|
||||||
FROM unnest(clauses) AS clause(val);
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_where_clause(VARIADIC clauses TEXT [])
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT coalesce('WHERE ' || combine_predicates(VARIADIC clauses), '');
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_json_aggregate_field_key(agg aggregate_type, select_i select_item)
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT format('%s(%s)', lower(select_i.func :: TEXT), select_i.field);
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
CREATE OR REPLACE FUNCTION get_groupby_clause(ns namespace_type, agg aggregate_type)
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT get_groupby_clause(agg);
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_limit_clause(limit_count INT)
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT 'LIMIT ' || limit_count
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_agg_orderby_clause(query ioql_query, time_col TEXT = 'group_time')
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT CASE
|
|
||||||
WHEN query.limit_rows IS NULL THEN
|
|
||||||
NULL --no need to order if not gonna limit
|
|
||||||
WHEN (query.aggregate).group_field IS NOT NULL THEN
|
|
||||||
format('ORDER BY %s DESC NULLS LAST, %s', time_col,
|
|
||||||
(query.aggregate).group_field) --group field needs to be included so that 5 aggregates across partitions overlap
|
|
||||||
ELSE
|
|
||||||
format('ORDER BY %s DESC NULLS LAST', time_col)
|
|
||||||
END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_orderby_clause(query ioql_query)
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT CASE
|
|
||||||
WHEN query.limit_by_field IS NOT NULL THEN
|
|
||||||
'ORDER BY time DESC NULLS LAST, ' || (query.limit_by_field).field
|
|
||||||
ELSE
|
|
||||||
'ORDER BY time DESC NULLS LAST'
|
|
||||||
END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION base_query_raw(select_clause TEXT, from_clause TEXT, where_clause TEXT,
|
|
||||||
group_by_clause TEXT, order_by_clause TEXT, limit_clause TEXT)
|
|
||||||
RETURNS TEXT LANGUAGE SQL IMMUTABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT format(
|
|
||||||
$$
|
|
||||||
%s
|
|
||||||
%s
|
|
||||||
%s
|
|
||||||
%s
|
|
||||||
%s
|
|
||||||
%s
|
|
||||||
$$,
|
|
||||||
select_clause,
|
|
||||||
from_clause,
|
|
||||||
where_clause,
|
|
||||||
group_by_clause,
|
|
||||||
order_by_clause,
|
|
||||||
limit_clause
|
|
||||||
);
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION base_query_builder(query ioql_query, data_table REGCLASS,
|
|
||||||
additional_constraints TEXT, select_clause TEXT, limit_clause TEXT,
|
|
||||||
total_partitions INT = NULL)
|
|
||||||
RETURNS TEXT LANGUAGE PLPGSQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
ns namespace_type;
|
|
||||||
from_clause TEXT;
|
|
||||||
BEGIN
|
|
||||||
ns := ROW (query.project_id, query.namespace_name, 1);
|
|
||||||
from_clause := format('FROM %s', data_table);
|
|
||||||
|
|
||||||
RETURN base_query_raw(
|
|
||||||
select_clause,
|
|
||||||
from_clause,
|
|
||||||
get_where_clause(
|
|
||||||
default_predicates(ns, query, total_partitions),
|
|
||||||
additional_constraints
|
|
||||||
--get_required_fields_predicate(data_table, query) --this may be run on parent tables
|
|
||||||
),
|
|
||||||
get_groupby_clause(ns, query.aggregate),
|
|
||||||
get_orderby_clause(query),
|
|
||||||
limit_clause);
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION base_query(query ioql_query, data_table REGCLASS, additional_constraints TEXT DEFAULT NULL)
|
|
||||||
RETURNS TEXT LANGUAGE PLPGSQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
ns namespace_type;
|
|
||||||
select_clause TEXT;
|
|
||||||
BEGIN
|
|
||||||
ns := ROW (query.project_id, query.namespace_name, 1);
|
|
||||||
RETURN base_query_builder(query, data_table, additional_constraints, get_full_select_clause(ns, query),
|
|
||||||
get_limit_clause(query.limit_rows));
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION limit_by_every_query_nonagg(query ioql_query, data_table REGCLASS)
|
|
||||||
RETURNS TEXT LANGUAGE PLPGSQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
ns namespace_type;
|
|
||||||
query_sql TEXT;
|
|
||||||
BEGIN
|
|
||||||
ns := ROW (query.project_id, query.namespace_name, 1);
|
|
||||||
query_sql = format(
|
|
||||||
$$
|
|
||||||
SELECT namespace, field_name, group_field, ret_time, ret_value, value_type
|
|
||||||
FROM
|
|
||||||
(
|
|
||||||
SELECT ROW_NUMBER() OVER (PARTITION BY group_field ORDER BY ret_time DESC NULLS LAST, ret_value) as rank, *
|
|
||||||
FROM
|
|
||||||
(
|
|
||||||
%1$s
|
|
||||||
) as res
|
|
||||||
) as o
|
|
||||||
WHERE rank <= %2$L and get_field_is_distinct(%4$L, %5$L)
|
|
||||||
ORDER BY ret_time DESC NULLS LAST, group_field
|
|
||||||
%3$s
|
|
||||||
$$,
|
|
||||||
base_query_builder(
|
|
||||||
query,
|
|
||||||
data_table,
|
|
||||||
NULL,
|
|
||||||
format(
|
|
||||||
$$
|
|
||||||
SELECT %L::text as namespace,
|
|
||||||
%L::text as field_name,
|
|
||||||
%s::text as group_field,
|
|
||||||
%s::bigint as ret_time,
|
|
||||||
%s::text as ret_value,
|
|
||||||
%s::regtype value_type
|
|
||||||
$$,
|
|
||||||
query.namespace_name,
|
|
||||||
get_field_name_clause(query.select_field),
|
|
||||||
get_field_value_specifier(ns, (query.limit_by_field).field),
|
|
||||||
get_time_clause((query.aggregate).group_time),
|
|
||||||
get_value_clause(ns, query.select_field, (query.aggregate).func),
|
|
||||||
get_value_type_clause(ns, query.select_field, (query.aggregate).func)
|
|
||||||
),
|
|
||||||
NULL
|
|
||||||
),
|
|
||||||
(query.limit_by_field).count,
|
|
||||||
get_limit_clause(query.limit_rows),
|
|
||||||
ns,
|
|
||||||
(query.limit_by_field).field
|
|
||||||
);
|
|
||||||
|
|
||||||
RETURN query_sql;
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION group_field_agg(query ioql_query,
|
|
||||||
data_table REGCLASS,
|
|
||||||
additional_constraints TEXT DEFAULT NULL)
|
|
||||||
RETURNS TEXT LANGUAGE PLPGSQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
ns namespace_type;
|
|
||||||
query_sql TEXT;
|
|
||||||
BEGIN
|
|
||||||
ns := ROW (query.project_id, query.namespace_name, 1);
|
|
||||||
query_sql = format(
|
|
||||||
$$
|
|
||||||
SELECT %6$L::text, %7$L::text, res.group_field as group_field, res.ret_time, res.ret_value, res.value_type
|
|
||||||
FROM
|
|
||||||
(
|
|
||||||
%3$s
|
|
||||||
) AS res
|
|
||||||
%5$s
|
|
||||||
$$,
|
|
||||||
data_table,
|
|
||||||
(query.aggregate).group_field,
|
|
||||||
base_query(query, data_table, additional_constraints),
|
|
||||||
ns,
|
|
||||||
get_limit_clause(query.limit_rows),
|
|
||||||
query.namespace_name,
|
|
||||||
get_field_name_clause(query.select_field)
|
|
||||||
);
|
|
||||||
RETURN query_sql;
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION agg_query_number_time_periods_agg(query ioql_query, data_table REGCLASS)
|
|
||||||
RETURNS TEXT LANGUAGE PLPGSQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
DECLARE
|
|
||||||
ns namespace_type;
|
|
||||||
query_sql TEXT;
|
|
||||||
BEGIN
|
|
||||||
ns := ROW (query.project_id, query.namespace_name, 1);
|
|
||||||
query_sql = format(
|
|
||||||
$$
|
|
||||||
SELECT res.*
|
|
||||||
FROM
|
|
||||||
(
|
|
||||||
SELECT periods.*
|
|
||||||
FROM %3$s as dt,
|
|
||||||
get_time_periods_limit_for_max(dt.time, %1$L, %2$L) as periods
|
|
||||||
%4$s
|
|
||||||
ORDER BY time DESC LIMIT 1
|
|
||||||
) as time_range,
|
|
||||||
LATERAL (%5$s) res
|
|
||||||
$$,
|
|
||||||
(query.aggregate).group_time,
|
|
||||||
query.limit_time_periods,
|
|
||||||
data_table,
|
|
||||||
get_where_clause(default_predicates(ns, query)),
|
|
||||||
agg_query_regular_limit(query, data_table,
|
|
||||||
format('time <= time_range.end_time AND time >= time_range.start_time'))
|
|
||||||
);
|
|
||||||
RETURN query_sql;
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION agg_query_regular_limit(query ioql_query, data_table REGCLASS,
|
|
||||||
additional_constraint TEXT DEFAULT NULL)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS $BODY$
|
|
||||||
SELECT CASE
|
|
||||||
WHEN (query.aggregate).group_field IS NOT NULL THEN group_field_agg(query, data_table, additional_constraint)
|
|
||||||
ELSE base_query(query, data_table, additional_constraint)
|
|
||||||
END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION agg_query(query ioql_query, data_table REGCLASS)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT CASE
|
|
||||||
WHEN query.limit_time_periods IS NOT NULL THEN
|
|
||||||
agg_query_number_time_periods_agg(query, data_table)
|
|
||||||
ELSE
|
|
||||||
agg_query_regular_limit(query, data_table)
|
|
||||||
END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_json_build_object_sql(query ioql_query)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT ' jsonb_build_object( ' ||
|
|
||||||
string_agg(
|
|
||||||
get_json_aggregate_field_key(query.aggregate, i) || ', ' || i.field,
|
|
||||||
', '
|
|
||||||
) || ')'
|
|
||||||
FROM unnest(query.select_field) AS i
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION full_query(query ioql_query, data_table REGCLASS)
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT CASE
|
|
||||||
WHEN NOT (query.aggregate IS NULL) THEN
|
|
||||||
CASE
|
|
||||||
WHEN (query.aggregate).group_field IS NOT NULL THEN
|
|
||||||
format(
|
|
||||||
$$
|
|
||||||
SELECT
|
|
||||||
namespace,
|
|
||||||
field_name,
|
|
||||||
group_field,
|
|
||||||
ret_time,
|
|
||||||
%s:text,
|
|
||||||
return_value_type
|
|
||||||
FROM (%s) as nj(namespace, field_name, group_field, ret_time, ret_value, return_value_type)
|
|
||||||
ORDER BY ret_time DESC NULLS LAST, group_field
|
|
||||||
$$,
|
|
||||||
(query.aggregate).group_field, get_json_build_object_sql(query), agg_query(query, data_table))
|
|
||||||
ELSE
|
|
||||||
format(
|
|
||||||
$$
|
|
||||||
SELECT namespace, field_name, group_field, ret_time, %s::text, return_value_type
|
|
||||||
FROM (%s) as nj(namespace, field_name, group_field, ret_time, ret_value, return_value_type)
|
|
||||||
ORDER BY ret_time DESC NULLS LAST, group_field
|
|
||||||
$$,
|
|
||||||
get_json_build_object_sql(query), agg_query(query, data_table))
|
|
||||||
END
|
|
||||||
WHEN query.limit_by_field IS NOT NULL THEN
|
|
||||||
limit_by_every_query_nonagg(query, data_table)
|
|
||||||
ELSE
|
|
||||||
base_query(query, data_table)
|
|
||||||
END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION ioql_exec_query_unoptimized(query ioql_query)
|
|
||||||
RETURNS TABLE(json TEXT) LANGUAGE PLPGSQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
BEGIN
|
|
||||||
IF to_regclass(get_cluster_name(get_namespace(query)) :: cstring) IS NULL THEN
|
|
||||||
RETURN QUERY SELECT *
|
|
||||||
FROM no_cluster_table(query);
|
|
||||||
RETURN;
|
|
||||||
END IF;
|
|
||||||
RAISE NOTICE 'Cross-node query %', full_query(query, get_cluster_table(get_namespace(query)));
|
|
||||||
RETURN QUERY EXECUTE full_query(query, get_cluster_table(get_namespace(query)));
|
|
||||||
END
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
|||||||
CREATE OR REPLACE FUNCTION get_hostname()
|
|
||||||
RETURNS TEXT LANGUAGE SQL STABLE AS
|
|
||||||
$BODY$
|
|
||||||
SELECT current_setting('iobeam.hostname');
|
|
||||||
$BODY$;
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user