blob: b6ce4741ac0fd3d30400b97ca824a48d7149b2e5 [file] [log] [blame]
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
-------------------------- TRIGGER FUNCTIONS --------------------------
-- Views that do not select from a single table or view are not
-- automatically updatable. These trigger functions are intended
-- to be run instead of INSERT into the complicated views.
-- LANGUAGE_IMPLEMENTATION_VERSION_VIEW_INSERT_ROW
CREATE OR REPLACE FUNCTION public.language_implementation_version_view_insert_row()
RETURNS trigger AS
$$
DECLARE
language_id integer;
result integer;
BEGIN
IF NEW.benchmark_language IS NULL THEN
RAISE EXCEPTION 'Column "benchmark_language" cannot be NULL.';
END IF;
IF NEW.language_implementation_version IS NULL THEN
RAISE EXCEPTION
'Column "language_implementation_version" cannot be NULL (use '''' instead).';
END IF;
SELECT public.get_benchmark_language_id(NEW.benchmark_language)
INTO language_id;
SELECT language_implementation_version_id INTO result FROM public.language_implementation_version AS lv
WHERE lv.benchmark_language_id = language_id
AND lv.language_implementation_version = NEW.language_implementation_version;
IF result IS NOT NULL THEN
-- row already exists
RETURN NULL;
ELSE
INSERT INTO
public.language_implementation_version(
benchmark_language_id
, language_implementation_version
)
VALUES (language_id, NEW.language_implementation_version)
RETURNING language_implementation_version_id INTO NEW.language_implementation_version_id;
END IF;
RETURN NEW;
END
$$
LANGUAGE plpgsql;
-- ENVIRONMENT_VIEW_INSERT_ROW
CREATE OR REPLACE FUNCTION public.environment_view_insert_row()
RETURNS trigger AS
$$
DECLARE
found_language_id integer;
found_version_id integer;
found_dependencies_id integer;
result integer;
BEGIN
IF NEW.benchmark_language IS NULL
THEN
RAISE EXCEPTION 'Column "benchmark_language" cannot be NULL.';
END IF;
IF NEW.language_implementation_version IS NULL THEN
RAISE EXCEPTION
'Column "language_implementation_version" cannot be NULL (use '''' instead).';
END IF;
SELECT public.get_benchmark_language_id(NEW.benchmark_language)
INTO found_language_id;
SELECT public.get_language_implementation_version_id(
found_language_id
, NEW.language_implementation_version
)
INTO found_version_id;
SELECT public.get_dependencies_id(NEW.dependencies)
INTO found_dependencies_id;
SELECT environment_id INTO result FROM public.environment AS e
WHERE e.benchmark_language_id = found_language_id
AND e.language_implementation_version_id = found_version_id
AND e.dependencies_id = found_dependencies_id;
IF result IS NOT NULL THEN
-- row already exists
RETURN NULL;
ELSE
INSERT INTO
public.environment(
benchmark_language_id
, language_implementation_version_id
, dependencies_id
)
VALUES (found_language_id, found_version_id, found_dependencies_id)
RETURNING environment_id INTO NEW.environment_id;
END IF;
RETURN NEW;
END
$$
LANGUAGE plpgsql;
-- MACHINE_VIEW_INSERT_ROW
CREATE OR REPLACE FUNCTION public.machine_view_insert_row()
RETURNS trigger AS
$$
DECLARE
found_cpu_id integer;
found_gpu_id integer;
found_os_id integer;
result integer;
BEGIN
IF (
NEW.machine_name IS NULL
OR NEW.memory_bytes IS NULL
OR NEW.cpu_model_name IS NULL
OR NEW.cpu_core_count IS NULL
OR NEW.cpu_thread_count IS NULL
OR NEW.cpu_frequency_max_Hz IS NULL
OR NEW.cpu_frequency_min_Hz IS NULL
OR NEW.cpu_L1d_cache_bytes IS NULL
OR NEW.cpu_L1i_cache_bytes IS NULL
OR NEW.cpu_L2_cache_bytes IS NULL
OR NEW.cpu_L3_cache_bytes IS NULL
OR NEW.os_name IS NULL
OR NEW.architecture_name IS NULL
)
THEN
RAISE EXCEPTION 'None of the columns in "machine_view" can be NULL. '
'all columns in table "gpu" will default to the empty string '''', '
'as will blank "os.kernel_name". This is to allow uniqueness '
'constraints to work. Thank you!.';
END IF;
SELECT public.get_cpu_id(
NEW.cpu_model_name
, NEW.cpu_core_count
, NEW.cpu_thread_count
, NEW.cpu_frequency_max_Hz
, NEW.cpu_frequency_min_Hz
, NEW.cpu_L1d_cache_bytes
, NEW.cpu_L1i_cache_bytes
, NEW.cpu_L2_cache_bytes
, NEW.cpu_L3_cache_bytes
) INTO found_cpu_id;
SELECT public.get_gpu_id(
NEW.gpu_information
, NEW.gpu_part_number
, NEW.gpu_product_name
) INTO found_gpu_id;
SELECT public.get_os_id(
NEW.os_name
, NEW.architecture_name
, NEW.kernel_name
) INTO found_os_id;
SELECT machine_id INTO result FROM public.machine AS m
WHERE m.os_id = found_os_id
AND m.cpu_id = found_cpu_id
AND m.gpu_id = found_gpu_id
AND m.machine_name = NEW.machine_name
AND m.memory_bytes = NEW.memory_bytes
AND m.cpu_actual_frequency_Hz = NEW.cpu_actual_frequency_Hz;
IF result IS NOT NULL THEN
-- row already exists
RETURN NULL;
ELSE
INSERT INTO public.machine(
os_id
, cpu_id
, gpu_id
, machine_name
, mac_address
, memory_bytes
, cpu_actual_frequency_Hz
, machine_other_attributes
)
VALUES (
found_os_id
, found_cpu_id
, found_gpu_id
, NEW.machine_name
, NEW.mac_address
, NEW.memory_bytes
, NEW.cpu_actual_frequency_Hz
, NEW.machine_other_attributes
)
RETURNING machine_id INTO NEW.machine_id;
END IF;
RETURN NEW;
END
$$
LANGUAGE plpgsql;
-- UNIT_VIEW_INSERT_ROW
CREATE OR REPLACE FUNCTION public.unit_view_insert_row()
RETURNS trigger AS
$$
DECLARE
found_benchmark_type_id integer;
result integer;
BEGIN
IF (NEW.benchmark_type IS NULL OR NEW.units IS NULL)
THEN
RAISE EXCEPTION E'"benchmark_type" and "units" cannot be NULL.\n'
'Further, if the "benchmark_type" has never been defined, '
'"lessisbetter" must be defined or there will be an error.';
END IF;
-- It's OK for "lessisbetter" = NULL if "benchmark_type" already exists.
SELECT public.get_benchmark_type_id(NEW.benchmark_type, NEW.lessisbetter)
INTO found_benchmark_type_id;
SELECT unit_id INTO result FROM public.unit AS u
WHERE u.benchmark_type_id = found_benchmark_type_id
AND u.units = NEW.units;
IF result IS NOT NULL THEN
-- row already exists
RETURN NULL;
ELSE
INSERT INTO public.unit (
benchmark_type_id
, units
)
VALUES (
found_benchmark_type_id
, NEW.units
)
RETURNING unit_id INTO NEW.unit_id;
END IF;
RETURN NEW;
END
$$
LANGUAGE plpgsql;
-- BENCHMARK_VIEW_INSERT_ROW
CREATE OR REPLACE FUNCTION public.benchmark_view_insert_row()
RETURNS trigger AS
$$
DECLARE
found_benchmark_language_id integer;
found_units_id integer;
result integer;
BEGIN
IF (
NEW.benchmark_name IS NULL
OR NEW.benchmark_version IS NULL
OR NEW.benchmark_language IS NULL
OR NEW.benchmark_type IS NULL
OR NEW.benchmark_description IS NULL
OR NEW.units IS NULL
)
THEN
RAISE EXCEPTION 'The only nullable column in this view is '
'"benchmark.parameter_names".';
END IF;
SELECT public.get_benchmark_language_id(
NEW.benchmark_language
) INTO found_benchmark_language_id;
SELECT public.get_unit_id(NEW.units) INTO found_units_id;
SELECT benchmark_id INTO result FROM public.benchmark AS b
WHERE b.benchmark_language_id = found_benchmark_language_id
AND b.benchmark_name = NEW.benchmark_name
-- handle nullable "parameter_names"
AND b.parameter_names IS NOT DISTINCT FROM NEW.parameter_names
AND b.benchmark_description = NEW.benchmark_description
AND b.benchmark_version = NEW.benchmark_version
AND b.unit_id = found_units_id;
IF result IS NOT NULL THEN
-- row already exists
RETURN NULL;
ELSE
INSERT INTO public.benchmark(
benchmark_language_id
, benchmark_name
, parameter_names
, benchmark_description
, benchmark_version
, unit_id
)
VALUES (
found_benchmark_language_id
, NEW.benchmark_name
, NEW.parameter_names
, NEW.benchmark_description
, NEW.benchmark_version
, found_units_id
)
RETURNING benchmark_id INTO NEW.benchmark_id;
END IF;
RETURN NEW;
END
$$
LANGUAGE plpgsql;
-- BENCHMARK_RUN_VIEW_INSERT_ROW
CREATE OR REPLACE FUNCTION public.benchmark_run_view_insert_row()
RETURNS trigger AS
$$
DECLARE
found_benchmark_id integer;
found_benchmark_language_id integer;
found_machine_id integer;
found_environment_id integer;
found_language_implementation_version_id integer;
BEGIN
IF (
NEW.benchmark_name IS NULL
OR NEW.benchmark_version IS NULL
OR NEW.benchmark_language IS NULL
OR NEW.value IS NULL
OR NEW.run_timestamp IS NULL
OR NEW.git_commit_timestamp IS NULL
OR NEW.git_hash IS NULL
OR NEW.language_implementation_version IS NULL
OR NEW.mac_address IS NULL
)
THEN
RAISE EXCEPTION 'Only the following columns can be NULL: '
'"parameter_names", "val_min", "val_q1", "val_q3", "val_max".';
END IF;
SELECT public.get_benchmark_id(
NEW.benchmark_language
, NEW.benchmark_name
, NEW.benchmark_version
) INTO found_benchmark_id;
SELECT public.get_benchmark_language_id(
NEW.benchmark_language
) INTO found_benchmark_language_id;
SELECT public.get_machine_id(
NEW.mac_address
) INTO found_machine_id;
SELECT public.get_environment_id(
NEW.benchmark_language
, NEW.language_implementation_version
, NEW.dependencies
) INTO found_environment_id;
SELECT public.get_language_implementation_version_id(
found_benchmark_language_id,
NEW.language_implementation_version
) INTO found_language_implementation_version_id;
INSERT INTO public.benchmark_run (
parameter_values
, value
, git_commit_timestamp
, git_hash
, val_min
, val_q1
, val_q3
, val_max
, std_dev
, n_obs
, run_timestamp
, run_metadata
, run_notes
, machine_id
, benchmark_language_id
, language_implementation_version_id
, environment_id
, benchmark_id
)
VALUES (
COALESCE(NEW.parameter_values, '{}'::jsonb)
, NEW.value
, NEW.git_commit_timestamp
, NEW.git_hash
, NEW.val_min
, NEW.val_q1
, NEW.val_q3
, NEW.val_max
, NEW.std_dev
, NEW.n_obs
, NEW.run_timestamp
, NEW.run_metadata
, NEW.run_notes
, found_machine_id
, found_benchmark_language_id
, found_language_implementation_version_id
, found_environment_id
, found_benchmark_id
) returning benchmark_run_id INTO NEW.benchmark_run_id;
RETURN NEW;
END
$$
LANGUAGE plpgsql;
-- FULL_BENCHMARK_RUN_VIEW_INSERT_ROW
CREATE OR REPLACE FUNCTION public.full_benchmark_run_view_insert_row()
RETURNS trigger AS
$$
DECLARE
found_benchmark_id integer;
found_benchmark_language_id integer;
found_machine_id integer;
found_environment_id integer;
found_language_implementation_version_id integer;
BEGIN
IF (
NEW.value IS NULL
OR NEW.git_hash IS NULL
OR NEW.git_commit_timestamp IS NULL
OR NEW.run_timestamp IS NULL
-- benchmark
OR NEW.benchmark_name IS NULL
OR NEW.benchmark_description IS NULL
OR NEW.benchmark_version IS NULL
OR NEW.benchmark_language IS NULL
-- unit
OR NEW.benchmark_type IS NULL
OR NEW.units IS NULL
OR NEW.lessisbetter IS NULL
-- machine
OR NEW.machine_name IS NULL
OR NEW.memory_bytes IS NULL
OR NEW.cpu_model_name IS NULL
OR NEW.cpu_core_count IS NULL
OR NEW.os_name IS NULL
OR NEW.architecture_name IS NULL
OR NEW.kernel_name IS NULL
OR NEW.cpu_model_name IS NULL
OR NEW.cpu_core_count IS NULL
OR NEW.cpu_thread_count IS NULL
OR NEW.cpu_frequency_max_Hz IS NULL
OR NEW.cpu_frequency_min_Hz IS NULL
OR NEW.cpu_L1d_cache_bytes IS NULL
OR NEW.cpu_L1i_cache_bytes IS NULL
OR NEW.cpu_L2_cache_bytes IS NULL
OR NEW.cpu_L3_cache_bytes IS NULL
)
THEN
RAISE EXCEPTION 'Only the following columns can be NULL: '
'"machine_other_attributes", "parameter_names", "val_min", '
'"val_q1", "val_q3", "val_max", "run_metadata", "run_notes". '
'If "gpu_information", "gpu_part_number", "gpu_product_name", or '
'"kernel_name" are null, they will be silently turned into an '
'empty string ('''').';
END IF;
SELECT public.get_benchmark_id(
NEW.benchmark_language
, NEW.benchmark_name
, NEW.parameter_names
, NEW.benchmark_description
, NEW.benchmark_version
, NEW.benchmark_type
, NEW.units
, NEW.lessisbetter
) INTO found_benchmark_id;
SELECT public.get_benchmark_language_id(
NEW.benchmark_language
) INTO found_benchmark_language_id;
SELECT public.get_machine_id(
NEW.mac_address
, NEW.machine_name
, NEW.memory_bytes
, NEW.cpu_actual_frequency_Hz
-- os
, NEW.os_name
, NEW.architecture_name
, NEW.kernel_name
-- cpu
, NEW.cpu_model_name
, NEW.cpu_core_count
, NEW.cpu_thread_count
, NEW.cpu_frequency_max_Hz
, NEW.cpu_frequency_min_Hz
, NEW.cpu_L1d_cache_bytes
, NEW.cpu_L1i_cache_bytes
, NEW.cpu_L2_cache_bytes
, NEW.cpu_L3_cache_bytes
-- gpu
, NEW.gpu_information
, NEW.gpu_part_number
, NEW.gpu_product_name
-- nullable machine attributes
, NEW.machine_other_attributes
) INTO found_machine_id;
SELECT public.get_environment_id(
NEW.benchmark_language
, NEW.language_implementation_version
, NEW.dependencies
) INTO found_environment_id;
SELECT public.get_language_implementation_version_id(
found_benchmark_language_id,
NEW.language_implementation_version
) INTO found_language_implementation_version_id;
INSERT INTO public.benchmark_run (
parameter_values
, value
, git_commit_timestamp
, git_hash
, val_min
, val_q1
, val_q3
, val_max
, std_dev
, n_obs
, run_timestamp
, run_metadata
, run_notes
, machine_id
, benchmark_language_id
, language_implementation_version_id
, environment_id
, benchmark_id
)
VALUES (
NEW.parameter_values
, NEW.value
, NEW.git_commit_timestamp
, NEW.git_hash
, NEW.val_min
, NEW.val_q1
, NEW.val_q3
, NEW.val_max
, NEW.std_dev
, NEW.n_obs
, NEW.run_timestamp
, NEW.run_metadata
, NEW.run_notes
, found_machine_id
, found_benchmark_language_id
, found_language_implementation_version_id
, found_environment_id
, found_benchmark_id
) returning benchmark_run_id INTO NEW.benchmark_run_id;
RETURN NEW;
END
$$
LANGUAGE plpgsql;