2 Licensed to the Apache Software Foundation (ASF) under one
3 or more contributor license agreements. See the NOTICE file
4 distributed with this work for additional information
5 regarding copyright ownership. The ASF licenses this file
6 to you under the Apache License, Version 2.0 (the
7 "License"); you may not use this file except in compliance
8 with the License. You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing,
13 software distributed under the License is distributed on an
14 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 KIND, either express or implied. See the License for the
16 specific language governing permissions and limitations
22 CREATE TYPE public.type_project_details
AS (
28 CREATE OR REPLACE FUNCTION public.
project_details()
29 RETURNS public.type_project_details
AS
31 SELECT project_name
, project_url
, repo_url
33 ORDER BY last_changed
DESC
37 COMMENT ON FUNCTION public.
project_details()
38 IS 'Get the current project name, url, and repo url.';
41 -------------------------- GET-OR-SET FUNCTIONS --------------------------
42 -- The following functions have the naming convention "get_<tablename>_id".
43 -- All of them attempt to SELECT the desired row given the column
44 -- values, and if it does not exist will INSERT it.
46 -- When functions are overloaded with fewer columns, it is to allow
47 -- selection only, given columns that comprise a unique index.
50 CREATE OR REPLACE FUNCTION public.
get_cpu_id(
52 , cpu_core_count
integer
53 , cpu_thread_count
integer
54 , cpu_frequency_max_Hz
bigint
55 , cpu_frequency_min_Hz
bigint
56 , cpu_L1d_cache_bytes
integer
57 , cpu_L1i_cache_bytes
integer
58 , cpu_L2_cache_bytes
integer
59 , cpu_L3_cache_bytes
integer
66 SELECT cpu_id
INTO result FROM public.cpu
AS cpu
67 WHERE cpu.cpu_model_name
= $
1
68 AND cpu.cpu_core_count
= $
2
69 AND cpu.cpu_thread_count
= $
3
70 AND cpu.cpu_frequency_max_Hz
= $
4
71 AND cpu.cpu_frequency_min_Hz
= $
5
72 AND cpu.cpu_L1d_cache_bytes
= $
6
73 AND cpu.cpu_L1i_cache_bytes
= $
7
74 AND cpu.cpu_L2_cache_bytes
= $
8
75 AND cpu.cpu_L3_cache_bytes
= $
9;
77 IF result IS NULL THEN
78 INSERT INTO public.
cpu(
82 , cpu_frequency_max_Hz
83 , cpu_frequency_min_Hz
89 VALUES ($
1, $
2, $
3, $
4, $
5, $
6, $
7, $
8, $
9)
90 RETURNING cpu_id
INTO result;
97 COMMENT ON FUNCTION public.
get_cpu_id(
101 , bigint -- cpu_frequency_max_Hz
102 , bigint -- cpu_frequency_min_Hz
108 IS 'Insert or select CPU data, returning "cpu.cpu_id".';
111 CREATE OR REPLACE FUNCTION public.
get_gpu_id(
112 gpu_information citext
DEFAULT NULL
113 , gpu_part_number citext
DEFAULT NULL
114 , gpu_product_name citext
DEFAULT NULL
121 SELECT gpu_id
INTO result FROM public.gpu
AS gpu
123 gpu.gpu_information
= COALESCE($
1, '')
124 AND gpu.gpu_part_number
= COALESCE($
2, '')
125 AND gpu.gpu_product_name
= COALESCE($
3, '');
127 IF result IS NULL THEN
128 INSERT INTO public.
gpu(
133 VALUES (COALESCE($
1, ''), COALESCE($
2, ''), COALESCE($
3, ''))
134 RETURNING gpu_id
INTO result;
141 COMMENT ON FUNCTION public.
get_gpu_id(citext
, citext
, citext
)
142 IS 'Insert or select GPU data, returning "gpu.gpu_id".';
145 CREATE OR REPLACE FUNCTION public.
get_os_id(
147 , architecture_name citext
148 , kernel_name citext
DEFAULT ''
155 SELECT os_id
INTO result FROM public.os
AS os
156 WHERE os.os_name
= $
1
157 AND os.architecture_name
= $
2
158 AND os.kernel_name
= COALESCE($
3, '');
160 IF result is NULL THEN
161 INSERT INTO public.
os(os_name
, architecture_name
, kernel_name
)
162 VALUES ($
1, $
2, COALESCE($
3, ''))
163 RETURNING os_id
INTO result;
170 COMMENT ON FUNCTION public.
get_os_id(citext
, citext
, citext
)
171 IS 'Insert or select OS data, returning "os.os_id".';
173 -- GET_MACHINE_ID (full signature)
174 CREATE OR REPLACE FUNCTION public.
get_machine_id(
176 , machine_name citext
177 , memory_bytes
bigint
178 , cpu_actual_frequency_Hz
bigint
181 , architecture_name citext
184 , cpu_model_name citext
185 , cpu_core_count
integer
186 , cpu_thread_count
integer
187 , cpu_frequency_max_Hz
bigint
188 , cpu_frequency_min_Hz
bigint
189 , L1d_cache_bytes
integer
190 , L1i_cache_bytes
integer
191 , L2_cache_bytes
integer
192 , L3_cache_bytes
integer
194 , gpu_information citext
DEFAULT ''
195 , gpu_part_number citext
DEFAULT NULL
196 , gpu_product_name citext
DEFAULT NULL
197 -- nullable machine attributes
198 , machine_other_attributes jsonb
DEFAULT NULL
203 found_cpu_id
integer;
204 found_gpu_id
integer;
208 -- Can't bypass looking up all the values because of unique constraint.
209 SELECT public.
get_cpu_id(
213 , cpu_frequency_max_Hz
214 , cpu_frequency_min_Hz
221 SELECT public.
get_gpu_id(
227 SELECT public.
get_os_id(
233 SELECT machine_id
INTO result FROM public.machine
AS m
234 WHERE m.os_id
= found_os_id
235 AND m.cpu_id
= found_cpu_id
236 AND m.gpu_id
= found_gpu_id
237 AND m.mac_address
= $
1
238 AND m.machine_name
= $
2
239 AND m.memory_bytes
= $
3
240 AND m.cpu_actual_frequency_Hz
= $
4;
242 IF result IS NULL THEN
243 INSERT INTO public.
machine(
250 , cpu_actual_frequency_Hz
251 , machine_other_attributes
253 VALUES (found_os_id
, found_cpu_id
, found_gpu_id
, $
1, $
2, $
3, $
4, $
20)
254 RETURNING machine_id
INTO result;
261 COMMENT ON FUNCTION public.
get_machine_id(
264 , bigint -- memory_bytes
265 , bigint -- cpu_frequency_actual_Hz
274 , bigint -- cpu_frequency_max_Hz
275 , bigint -- cpu_frequency_min_Hz
284 -- nullable machine attributes
287 IS 'Insert or select machine data, returning "machine.machine_id".';
289 -- GET_MACHINE_ID (given unique mac_address)
290 CREATE OR REPLACE FUNCTION public.
get_machine_id(mac_address macaddr
)
293 SELECT machine_id
FROM public.machine
AS m
294 WHERE m.mac_address
= $
1;
297 COMMENT ON FUNCTION public.
get_machine_id(macaddr
)
298 IS 'Select machine_id given its mac address, returning "machine.machine_id".';
300 -- GET_BENCHMARK_LANGUAGE_ID
301 CREATE OR REPLACE FUNCTION public.
get_benchmark_language_id(language citext
)
307 SELECT benchmark_language_id
INTO result
308 FROM public.benchmark_language
AS bl
309 WHERE bl.benchmark_language
= language;
311 IF result IS NULL THEN
312 INSERT INTO public.
benchmark_language(benchmark_language
)
314 RETURNING benchmark_language_id
INTO result;
321 COMMENT ON FUNCTION public.
get_benchmark_language_id(citext
)
322 IS 'Insert or select benchmark_language returning '
323 '"benchmark_language.benchmark_language_id".';
325 -- GET_LANGUAGE_IMPLEMENTATION_VERSION_ID
326 CREATE OR REPLACE FUNCTION public.
get_language_implementation_version_id(
328 , language_implementation_version citext
DEFAULT ''
336 SELECT public.
get_benchmark_language_id($
1) INTO language_id
;
338 SELECT language_implementation_version_id
INTO result FROM public.language_implementation_version
AS lv
339 WHERE lv.benchmark_language_id
= language_id
340 AND lv.language_implementation_version
= COALESCE($
2, '');
342 IF result IS NULL THEN
344 public.
language_implementation_version(benchmark_language_id
, language_implementation_version
)
345 VALUES (language_id
, COALESCE($
2, ''))
346 RETURNING language_implementation_version_id
INTO result;
353 COMMENT ON FUNCTION public.
get_language_implementation_version_id(citext
, citext
)
354 IS 'Insert or select language and version data, '
355 'returning "language_implementation_version.language_implementation_version_id".';
357 CREATE OR REPLACE FUNCTION public.
get_language_implementation_version_id(
358 -- overload for when language_id is known
360 , language_implementation_version citext
DEFAULT ''
367 SELECT language_implementation_version_id
INTO result FROM public.language_implementation_version
AS lv
368 WHERE lv.benchmark_language_id
= language_id
369 AND lv.language_implementation_version
= COALESCE($
2, '');
371 IF result IS NULL THEN
373 public.
language_implementation_version(benchmark_language_id
, language_implementation_version
)
374 VALUES (language_id
, COALESCE($
2, ''))
375 RETURNING language_implementation_version_id
INTO result;
383 -- GET_LANGUAGE_DEPENDENCY_LOOKUP_ID
384 CREATE OR REPLACE FUNCTION public.
get_dependencies_id(
385 dependencies jsonb
DEFAULT '{}'::jsonb
392 SELECT dependencies_id
INTO result
393 FROM public.dependencies
AS ldl
394 WHERE ldl.dependencies
= COALESCE($
1, '{}'::jsonb);
396 IF result IS NULL THEN
398 public.
dependencies(dependencies
)
399 VALUES (COALESCE($
1, '{}'::jsonb))
400 RETURNING dependencies_id
INTO result;
407 COMMENT ON FUNCTION public.
get_dependencies_id(jsonb
)
408 IS 'Insert or select dependencies, returning "dependencies.dependencies_id".';
410 -- GET_ENVIRONMENT_ID
411 CREATE OR REPLACE FUNCTION public.
get_environment_id(
413 language_implementation_version citext
DEFAULT '',
414 dependencies jsonb
DEFAULT '{}'::jsonb
419 found_language_id
integer;
420 found_version_id
integer;
421 found_dependencies_id
integer;
424 SELECT public.
get_benchmark_language_id($
1) INTO found_language_id
;
426 public.
get_language_implementation_version_id(found_language_id
, $
2)
427 INTO found_version_id
;
429 public.
get_dependencies_id ($
3)
430 INTO found_dependencies_id
;
432 SELECT environment_id
INTO result FROM public.environment
AS e
433 WHERE e.benchmark_language_id
= found_language_id
434 AND e.language_implementation_version_id
= found_version_id
435 AND e.dependencies_id
= found_dependencies_id
;
437 IF result IS NULL THEN
440 benchmark_language_id
441 , language_implementation_version_id
444 VALUES (found_language_id
, found_version_id
, found_dependencies_id
)
445 RETURNING environment_id
INTO result;
452 COMMENT ON FUNCTION public.
get_environment_id(citext
, citext
, jsonb
)
453 IS 'Insert or select language, language version, and dependencies, '
454 'returning "environment.environment_id".';
456 -- GET_BENCHMARK_TYPE_ID (full signature)
457 CREATE OR REPLACE FUNCTION public.
get_benchmark_type_id(
458 benchmark_type citext
459 , lessisbetter
boolean
466 SELECT benchmark_type_id
INTO result FROM public.benchmark_type
AS bt
467 WHERE bt.benchmark_type
= $
1
468 AND bt.lessisbetter
= $
2;
470 IF result IS NULL THEN
471 INSERT INTO public.
benchmark_type(benchmark_type
, lessisbetter
)
473 RETURNING benchmark_type_id
INTO result;
480 COMMENT ON FUNCTION public.
get_benchmark_type_id(citext
, boolean)
481 IS 'Insert or select benchmark type and lessisbetter, '
482 'returning "benchmark_type.benchmark_type_id".';
484 -- GET_BENCHMARK_TYPE_ID (given unique benchmark_type string only)
485 CREATE OR REPLACE FUNCTION public.
get_benchmark_type_id(
486 benchmark_type citext
493 SELECT benchmark_type_id
INTO result FROM public.benchmark_type
AS bt
494 WHERE bt.benchmark_type
= $
1;
500 COMMENT ON FUNCTION public.
get_benchmark_type_id(citext
)
501 IS 'Select benchmark_type_id given benchmark type (e.g. ''time''), '
502 'returning "benchmark_type.benchmark_type_id".';
504 -- GET_UNIT_ID (full signature)
505 CREATE OR REPLACE FUNCTION public.
get_unit_id(
506 benchmark_type citext
508 , lessisbetter
boolean DEFAULT NULL
513 found_benchmark_type_id
integer;
517 IF ($
3 IS NOT NULL) -- if lessisbetter is not null
519 SELECT public.
get_benchmark_type_id($
1, $
3)
520 INTO found_benchmark_type_id
;
522 SELECT public.
get_benchmark_type_id($
1)
523 INTO found_benchmark_type_id
;
526 SELECT unit_id
INTO result FROM public.unit
AS u
527 WHERE u.benchmark_type_id
= found_benchmark_type_id
530 IF result IS NULL THEN
531 INSERT INTO public.
unit(benchmark_type_id
, units
)
532 VALUES(found_benchmark_type_id
, $
2)
533 RETURNING unit_id
INTO result;
540 COMMENT ON FUNCTION public.
get_unit_id(citext
, citext
, boolean)
541 IS 'Insert or select benchmark type (e.g. ''time''), '
542 'units string (e.g. ''miliseconds''), '
543 'and "lessisbetter" (true if smaller benchmark values are better), '
544 'returning "unit.unit_id".';
546 -- GET_UNIT_ID (given unique units string only)
547 CREATE OR REPLACE FUNCTION public.
get_unit_id(units citext
)
550 SELECT unit_id
FROM public.unit
AS u
551 WHERE u.units
= units
;
554 COMMENT ON FUNCTION public.
get_unit_id(citext
)
555 IS 'Select unit_id given unit name, returning "unit.unit_id".';
557 -- GET_BENCHMARK_ID (full signature)
558 CREATE OR REPLACE FUNCTION public.
get_benchmark_id(
559 benchmark_language citext
560 , benchmark_name citext
561 , parameter_names
text[]
562 , benchmark_description
text
563 , benchmark_version citext
564 , benchmark_type citext
566 , lessisbetter
boolean
571 found_benchmark_language_id
integer;
572 found_unit_id
integer;
575 SELECT public.
get_benchmark_language_id(
577 ) INTO found_benchmark_language_id
;
579 SELECT public.
get_unit_id(
583 ) INTO found_unit_id
;
585 SELECT benchmark_id
INTO result FROM public.benchmark
AS b
586 WHERE b.benchmark_language_id
= found_benchmark_language_id
587 AND b.benchmark_name
= $
2
588 -- handle nullable "parameter_names"
589 AND b.parameter_names
IS NOT DISTINCT FROM $
3
590 AND b.benchmark_description
= $
4
591 AND b.benchmark_version
= $
5
592 AND b.unit_id
= found_unit_id
;
594 IF result IS NULL THEN
595 INSERT INTO public.
benchmark(
596 benchmark_language_id
599 , benchmark_description
603 VALUES (found_benchmark_language_id
, $
2, $
3, $
4, $
5, found_unit_id
)
604 RETURNING benchmark_id
INTO result;
611 COMMENT ON FUNCTION public.
get_benchmark_id(
621 IS 'Insert/select benchmark given data, returning "benchmark.benchmark_id".';
623 -- GET_BENCHMARK_ID (by unique columns)
624 CREATE OR REPLACE FUNCTION public.
get_benchmark_id(
625 benchmark_language citext
626 , benchmark_name citext
627 , benchmark_version citext
632 SELECT public.
get_benchmark_language_id(benchmark_language
) AS id
634 SELECT b.benchmark_id
635 FROM public.benchmark
AS b
636 JOIN language ON b.benchmark_language_id
= language.
id
637 WHERE b.benchmark_name
= benchmark_name
638 AND benchmark_version
= benchmark_version
641 COMMENT ON FUNCTION public.
get_benchmark_id(citext
, citext
, citext
)
642 IS 'Select existing benchmark given unique columns, '
643 'returning "benchmark.benchmark_id".';