| /* |
| 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. |
| */ |
| |
| |
| -- PROJECT_DETAILS |
| CREATE TYPE public.type_project_details AS ( |
| project_name text |
| , project_url text |
| , repo_url text |
| ); |
| |
| CREATE OR REPLACE FUNCTION public.project_details() |
| RETURNS public.type_project_details AS |
| $$ |
| SELECT project_name, project_url, repo_url |
| FROM public.project |
| ORDER BY last_changed DESC |
| LIMIT 1 |
| $$ |
| LANGUAGE sql STABLE; |
| COMMENT ON FUNCTION public.project_details() |
| IS 'Get the current project name, url, and repo url.'; |
| |
| |
| -------------------------- GET-OR-SET FUNCTIONS -------------------------- |
| -- The following functions have the naming convention "get_<tablename>_id". |
| -- All of them attempt to SELECT the desired row given the column |
| -- values, and if it does not exist will INSERT it. |
| -- |
| -- When functions are overloaded with fewer columns, it is to allow |
| -- selection only, given columns that comprise a unique index. |
| |
| -- GET_CPU_ID |
| CREATE OR REPLACE FUNCTION public.get_cpu_id( |
| cpu_model_name citext |
| , cpu_core_count integer |
| , cpu_thread_count integer |
| , cpu_frequency_max_Hz bigint |
| , cpu_frequency_min_Hz bigint |
| , cpu_L1d_cache_bytes integer |
| , cpu_L1i_cache_bytes integer |
| , cpu_L2_cache_bytes integer |
| , cpu_L3_cache_bytes integer |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| result integer; |
| BEGIN |
| SELECT cpu_id INTO result FROM public.cpu AS cpu |
| WHERE cpu.cpu_model_name = $1 |
| AND cpu.cpu_core_count = $2 |
| AND cpu.cpu_thread_count = $3 |
| AND cpu.cpu_frequency_max_Hz = $4 |
| AND cpu.cpu_frequency_min_Hz = $5 |
| AND cpu.cpu_L1d_cache_bytes = $6 |
| AND cpu.cpu_L1i_cache_bytes = $7 |
| AND cpu.cpu_L2_cache_bytes = $8 |
| AND cpu.cpu_L3_cache_bytes = $9; |
| |
| IF result IS NULL THEN |
| INSERT INTO public.cpu( |
| cpu_model_name |
| , cpu_core_count |
| , cpu_thread_count |
| , cpu_frequency_max_Hz |
| , cpu_frequency_min_Hz |
| , cpu_L1d_cache_bytes |
| , cpu_L1i_cache_bytes |
| , cpu_L2_cache_bytes |
| , cpu_L3_cache_bytes |
| ) |
| VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) |
| RETURNING cpu_id INTO result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_cpu_id( |
| citext |
| , integer |
| , integer |
| , bigint -- cpu_frequency_max_Hz |
| , bigint -- cpu_frequency_min_Hz |
| , integer |
| , integer |
| , integer |
| , integer |
| ) |
| IS 'Insert or select CPU data, returning "cpu.cpu_id".'; |
| |
| -- GET_GPU_ID |
| CREATE OR REPLACE FUNCTION public.get_gpu_id( |
| gpu_information citext DEFAULT NULL |
| , gpu_part_number citext DEFAULT NULL |
| , gpu_product_name citext DEFAULT NULL |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| result integer; |
| BEGIN |
| SELECT gpu_id INTO result FROM public.gpu AS gpu |
| WHERE |
| gpu.gpu_information = COALESCE($1, '') |
| AND gpu.gpu_part_number = COALESCE($2, '') |
| AND gpu.gpu_product_name = COALESCE($3, ''); |
| |
| IF result IS NULL THEN |
| INSERT INTO public.gpu( |
| gpu_information |
| , gpu_part_number |
| , gpu_product_name |
| ) |
| VALUES (COALESCE($1, ''), COALESCE($2, ''), COALESCE($3, '')) |
| RETURNING gpu_id INTO result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_gpu_id(citext, citext, citext) |
| IS 'Insert or select GPU data, returning "gpu.gpu_id".'; |
| |
| -- GET_OS_ID |
| CREATE OR REPLACE FUNCTION public.get_os_id( |
| os_name citext |
| , architecture_name citext |
| , kernel_name citext DEFAULT '' |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| result integer; |
| BEGIN |
| SELECT os_id INTO result FROM public.os AS os |
| WHERE os.os_name = $1 |
| AND os.architecture_name = $2 |
| AND os.kernel_name = COALESCE($3, ''); |
| |
| IF result is NULL THEN |
| INSERT INTO public.os(os_name, architecture_name, kernel_name) |
| VALUES ($1, $2, COALESCE($3, '')) |
| RETURNING os_id INTO result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_os_id(citext, citext, citext) |
| IS 'Insert or select OS data, returning "os.os_id".'; |
| |
| -- GET_MACHINE_ID (full signature) |
| CREATE OR REPLACE FUNCTION public.get_machine_id( |
| mac_address macaddr |
| , machine_name citext |
| , memory_bytes bigint |
| , cpu_actual_frequency_Hz bigint |
| -- os |
| , os_name citext |
| , architecture_name citext |
| , kernel_name citext |
| -- cpu |
| , cpu_model_name citext |
| , cpu_core_count integer |
| , cpu_thread_count integer |
| , cpu_frequency_max_Hz bigint |
| , cpu_frequency_min_Hz bigint |
| , L1d_cache_bytes integer |
| , L1i_cache_bytes integer |
| , L2_cache_bytes integer |
| , L3_cache_bytes integer |
| -- gpu |
| , gpu_information citext DEFAULT '' |
| , gpu_part_number citext DEFAULT NULL |
| , gpu_product_name citext DEFAULT NULL |
| -- nullable machine attributes |
| , machine_other_attributes jsonb DEFAULT NULL |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| found_cpu_id integer; |
| found_gpu_id integer; |
| found_os_id integer; |
| result integer; |
| BEGIN |
| -- Can't bypass looking up all the values because of unique constraint. |
| SELECT public.get_cpu_id( |
| cpu_model_name |
| , cpu_core_count |
| , cpu_thread_count |
| , cpu_frequency_max_Hz |
| , cpu_frequency_min_Hz |
| , L1d_cache_bytes |
| , L1i_cache_bytes |
| , L2_cache_bytes |
| , L3_cache_bytes |
| ) INTO found_cpu_id; |
| |
| SELECT public.get_gpu_id( |
| gpu_information |
| , gpu_part_number |
| , gpu_product_name |
| ) INTO found_gpu_id; |
| |
| SELECT public.get_os_id( |
| os_name |
| , architecture_name |
| , 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.mac_address = $1 |
| AND m.machine_name = $2 |
| AND m.memory_bytes = $3 |
| AND m.cpu_actual_frequency_Hz = $4; |
| |
| IF result IS NULL THEN |
| INSERT INTO public.machine( |
| os_id |
| , cpu_id |
| , gpu_id |
| , mac_address |
| , machine_name |
| , memory_bytes |
| , cpu_actual_frequency_Hz |
| , machine_other_attributes |
| ) |
| VALUES (found_os_id, found_cpu_id, found_gpu_id, $1, $2, $3, $4, $20) |
| RETURNING machine_id INTO result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_machine_id( |
| macaddr |
| , citext |
| , bigint -- memory_bytes |
| , bigint -- cpu_frequency_actual_Hz |
| -- os |
| , citext |
| , citext |
| , citext |
| -- cpu |
| , citext |
| , integer |
| , integer |
| , bigint -- cpu_frequency_max_Hz |
| , bigint -- cpu_frequency_min_Hz |
| , integer |
| , integer |
| , integer |
| , integer |
| -- gpu |
| , citext |
| , citext |
| , citext |
| -- nullable machine attributes |
| , jsonb |
| ) |
| IS 'Insert or select machine data, returning "machine.machine_id".'; |
| |
| -- GET_MACHINE_ID (given unique mac_address) |
| CREATE OR REPLACE FUNCTION public.get_machine_id(mac_address macaddr) |
| RETURNS integer AS |
| $$ |
| SELECT machine_id FROM public.machine AS m |
| WHERE m.mac_address = $1; |
| $$ |
| LANGUAGE sql STABLE; |
| COMMENT ON FUNCTION public.get_machine_id(macaddr) |
| IS 'Select machine_id given its mac address, returning "machine.machine_id".'; |
| |
| -- GET_BENCHMARK_LANGUAGE_ID |
| CREATE OR REPLACE FUNCTION public.get_benchmark_language_id(language citext) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| result integer; |
| BEGIN |
| SELECT benchmark_language_id INTO result |
| FROM public.benchmark_language AS bl |
| WHERE bl.benchmark_language = language; |
| |
| IF result IS NULL THEN |
| INSERT INTO public.benchmark_language(benchmark_language) |
| VALUES (language) |
| RETURNING benchmark_language_id INTO result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_benchmark_language_id(citext) |
| IS 'Insert or select benchmark_language returning ' |
| '"benchmark_language.benchmark_language_id".'; |
| |
| -- GET_LANGUAGE_IMPLEMENTATION_VERSION_ID |
| CREATE OR REPLACE FUNCTION public.get_language_implementation_version_id( |
| language citext |
| , language_implementation_version citext DEFAULT '' |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| language_id integer; |
| result integer; |
| BEGIN |
| SELECT public.get_benchmark_language_id($1) 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 = COALESCE($2, ''); |
| |
| IF result IS NULL THEN |
| INSERT INTO |
| public.language_implementation_version(benchmark_language_id, language_implementation_version) |
| VALUES (language_id, COALESCE($2, '')) |
| RETURNING language_implementation_version_id INTO result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_language_implementation_version_id(citext, citext) |
| IS 'Insert or select language and version data, ' |
| 'returning "language_implementation_version.language_implementation_version_id".'; |
| |
| CREATE OR REPLACE FUNCTION public.get_language_implementation_version_id( |
| -- overload for when language_id is known |
| language_id integer |
| , language_implementation_version citext DEFAULT '' |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| result integer; |
| BEGIN |
| 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 = COALESCE($2, ''); |
| |
| IF result IS NULL THEN |
| INSERT INTO |
| public.language_implementation_version(benchmark_language_id, language_implementation_version) |
| VALUES (language_id, COALESCE($2, '')) |
| RETURNING language_implementation_version_id INTO result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| |
| -- GET_LANGUAGE_DEPENDENCY_LOOKUP_ID |
| CREATE OR REPLACE FUNCTION public.get_dependencies_id( |
| dependencies jsonb DEFAULT '{}'::jsonb |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| result integer; |
| BEGIN |
| SELECT dependencies_id INTO result |
| FROM public.dependencies AS ldl |
| WHERE ldl.dependencies = COALESCE($1, '{}'::jsonb); |
| |
| IF result IS NULL THEN |
| INSERT INTO |
| public.dependencies(dependencies) |
| VALUES (COALESCE($1, '{}'::jsonb)) |
| RETURNING dependencies_id INTO result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_dependencies_id(jsonb) |
| IS 'Insert or select dependencies, returning "dependencies.dependencies_id".'; |
| |
| -- GET_ENVIRONMENT_ID |
| CREATE OR REPLACE FUNCTION public.get_environment_id( |
| language citext, |
| language_implementation_version citext DEFAULT '', |
| dependencies jsonb DEFAULT '{}'::jsonb |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| found_language_id integer; |
| found_version_id integer; |
| found_dependencies_id integer; |
| result integer; |
| BEGIN |
| SELECT public.get_benchmark_language_id($1) INTO found_language_id; |
| SELECT |
| public.get_language_implementation_version_id(found_language_id, $2) |
| INTO found_version_id; |
| SELECT |
| public.get_dependencies_id ($3) |
| 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 NULL THEN |
| 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 result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_environment_id(citext, citext, jsonb) |
| IS 'Insert or select language, language version, and dependencies, ' |
| 'returning "environment.environment_id".'; |
| |
| -- GET_BENCHMARK_TYPE_ID (full signature) |
| CREATE OR REPLACE FUNCTION public.get_benchmark_type_id( |
| benchmark_type citext |
| , lessisbetter boolean |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| result integer; |
| BEGIN |
| SELECT benchmark_type_id INTO result FROM public.benchmark_type AS bt |
| WHERE bt.benchmark_type = $1 |
| AND bt.lessisbetter = $2; |
| |
| IF result IS NULL THEN |
| INSERT INTO public.benchmark_type(benchmark_type, lessisbetter) |
| VALUES($1, $2) |
| RETURNING benchmark_type_id INTO result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_benchmark_type_id(citext, boolean) |
| IS 'Insert or select benchmark type and lessisbetter, ' |
| 'returning "benchmark_type.benchmark_type_id".'; |
| |
| -- GET_BENCHMARK_TYPE_ID (given unique benchmark_type string only) |
| CREATE OR REPLACE FUNCTION public.get_benchmark_type_id( |
| benchmark_type citext |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| result integer; |
| BEGIN |
| SELECT benchmark_type_id INTO result FROM public.benchmark_type AS bt |
| WHERE bt.benchmark_type = $1; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_benchmark_type_id(citext) |
| IS 'Select benchmark_type_id given benchmark type (e.g. ''time''), ' |
| 'returning "benchmark_type.benchmark_type_id".'; |
| |
| -- GET_UNIT_ID (full signature) |
| CREATE OR REPLACE FUNCTION public.get_unit_id( |
| benchmark_type citext |
| , units citext |
| , lessisbetter boolean DEFAULT NULL |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| found_benchmark_type_id integer; |
| result integer; |
| BEGIN |
| |
| IF ($3 IS NOT NULL) -- if lessisbetter is not null |
| THEN |
| SELECT public.get_benchmark_type_id($1, $3) |
| INTO found_benchmark_type_id; |
| ELSE |
| SELECT public.get_benchmark_type_id($1) |
| INTO found_benchmark_type_id; |
| END IF; |
| |
| SELECT unit_id INTO result FROM public.unit AS u |
| WHERE u.benchmark_type_id = found_benchmark_type_id |
| AND u.units = $2; |
| |
| IF result IS NULL THEN |
| INSERT INTO public.unit(benchmark_type_id, units) |
| VALUES(found_benchmark_type_id, $2) |
| RETURNING unit_id INTO result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_unit_id(citext, citext, boolean) |
| IS 'Insert or select benchmark type (e.g. ''time''), ' |
| 'units string (e.g. ''miliseconds''), ' |
| 'and "lessisbetter" (true if smaller benchmark values are better), ' |
| 'returning "unit.unit_id".'; |
| |
| -- GET_UNIT_ID (given unique units string only) |
| CREATE OR REPLACE FUNCTION public.get_unit_id(units citext) |
| RETURNS integer AS |
| $$ |
| SELECT unit_id FROM public.unit AS u |
| WHERE u.units = units; |
| $$ |
| LANGUAGE sql STABLE; |
| COMMENT ON FUNCTION public.get_unit_id(citext) |
| IS 'Select unit_id given unit name, returning "unit.unit_id".'; |
| |
| -- GET_BENCHMARK_ID (full signature) |
| CREATE OR REPLACE FUNCTION public.get_benchmark_id( |
| benchmark_language citext |
| , benchmark_name citext |
| , parameter_names text[] |
| , benchmark_description text |
| , benchmark_version citext |
| , benchmark_type citext |
| , units citext |
| , lessisbetter boolean |
| ) |
| RETURNS integer AS |
| $$ |
| DECLARE |
| found_benchmark_language_id integer; |
| found_unit_id integer; |
| result integer; |
| BEGIN |
| SELECT public.get_benchmark_language_id( |
| benchmark_language |
| ) INTO found_benchmark_language_id; |
| |
| SELECT public.get_unit_id( |
| benchmark_type |
| , units |
| , lessisbetter |
| ) INTO found_unit_id; |
| |
| SELECT benchmark_id INTO result FROM public.benchmark AS b |
| WHERE b.benchmark_language_id = found_benchmark_language_id |
| AND b.benchmark_name = $2 |
| -- handle nullable "parameter_names" |
| AND b.parameter_names IS NOT DISTINCT FROM $3 |
| AND b.benchmark_description = $4 |
| AND b.benchmark_version = $5 |
| AND b.unit_id = found_unit_id; |
| |
| IF result IS NULL THEN |
| INSERT INTO public.benchmark( |
| benchmark_language_id |
| , benchmark_name |
| , parameter_names |
| , benchmark_description |
| , benchmark_version |
| , unit_id |
| ) |
| VALUES (found_benchmark_language_id, $2, $3, $4, $5, found_unit_id) |
| RETURNING benchmark_id INTO result; |
| END IF; |
| |
| RETURN result; |
| END |
| $$ |
| LANGUAGE plpgsql; |
| COMMENT ON FUNCTION public.get_benchmark_id( |
| citext |
| , citext |
| , text[] |
| , text |
| , citext |
| , citext |
| , citext |
| , boolean |
| ) |
| IS 'Insert/select benchmark given data, returning "benchmark.benchmark_id".'; |
| |
| -- GET_BENCHMARK_ID (by unique columns) |
| CREATE OR REPLACE FUNCTION public.get_benchmark_id( |
| benchmark_language citext |
| , benchmark_name citext |
| , benchmark_version citext |
| ) |
| RETURNS integer AS |
| $$ |
| WITH language AS ( |
| SELECT public.get_benchmark_language_id(benchmark_language) AS id |
| ) |
| SELECT b.benchmark_id |
| FROM public.benchmark AS b |
| JOIN language ON b.benchmark_language_id = language.id |
| WHERE b.benchmark_name = benchmark_name |
| AND benchmark_version = benchmark_version |
| $$ |
| LANGUAGE sql STABLE; |
| COMMENT ON FUNCTION public.get_benchmark_id(citext, citext, citext) |
| IS 'Select existing benchmark given unique columns, ' |
| 'returning "benchmark.benchmark_id".'; |