aboutsummaryrefslogtreecommitdiff
path: root/challenge-247/luca-ferrari/postgresql/ch-1.sql
blob: 7a9954be8ebb9b5baddba8de3aad88dac0ea435f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
--
-- Perl Weekly Challenge 247
-- Task 1
--
-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-247/>
--

CREATE SCHEMA IF NOT EXISTS pwc247;

CREATE OR REPLACE FUNCTION
pwc247.task1_plpgsql( n text[] )
RETURNS TABLE( current_santa text, current_receiver text )
AS $CODE$

DECLARE
	remaining int;
BEGIN
	CREATE TEMPORARY TABLE IF NOT EXISTS santas( santa text );
	CREATE TEMPORARY TABLE IF NOT EXISTS receivers( receiver text );
	TRUNCATE santas;
	TRUNCATE receivers;

	INSERT INTO santas
	SELECT unnest( n );

	INSERT INTO receivers
	SELECT unnest( n );

	SELECT count(*)
	INTO remaining
	FROM santas;

	WHILE remaining > 0 LOOP

		SELECT santa
		INTO current_santa
		FROM santas
		ORDER BY random()
		LIMIT 1;


		SELECT	receiver
		INTO current_receiver
		FROM receivers
		ORDER BY random()
		LIMIT 1;


		IF current_receiver = current_santa THEN
		   CONTINUE;
		END IF;

		RETURN NEXT;

		DELETE FROM santas    WHERE santa = current_santa;
		DELETE FROM receivers WHERE receiver = current_receiver;

		SELECT count(*)
		INTO remaining
		FROM santas;

	END LOOP;

END
$CODE$
LANGUAGE plpgsql;