Merge pull request #135 from GradedJestRisk/master

Add PL/pg SQL (without test support)
This commit is contained in:
Emily Bache 2019-12-19 08:52:49 +01:00 committed by GitHub
commit 06e425cc2b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 222 additions and 0 deletions

11
plpgsql/README.md Normal file
View File

@ -0,0 +1,11 @@
# Setup
Create database structure: psql -f ./structure/create.sql
Load code into database psql -f ./code/update_quality.sql -d gilded_rose
Load test data into database: psql -f ./test/data/load.sql -d gilded_rose
Execute: CALL update_quality();
Check results: SELECT * FROM items;
# Test
No test code provided, only a sample of test data
TODO: [https://pgtap.org/](introduce TAP - xUnit for PL/pg SQL)

View File

@ -0,0 +1,80 @@
CREATE OR REPLACE PROCEDURE public.update_quality()
LANGUAGE plpgsql
AS $$
DECLARE
rec_item RECORD;
cur_items CURSOR FOR SELECT * FROM item;
BEGIN
OPEN cur_items;
LOOP
FETCH cur_items INTO rec_item;
EXIT WHEN NOT FOUND;
IF (rec_item.name <> 'Aged Brie' AND rec_item.name <> 'Backstage passes to a TAFKAL80ETC concert') THEN
IF (rec_item.quality > 0) THEN
IF (rec_item.name <> 'Sulfuras, Hand of Ragnaros') THEN
rec_item.quality = rec_item.quality - 1;
END IF;
END IF;
ELSE
IF (rec_item.quality < 50) THEN
rec_item.quality = rec_item.quality + 1;
IF (rec_item.name = 'Backstage passes to a TAFKAL80ETC concert') THEN
IF (rec_item.sellIn < 11) THEN
IF (rec_item.quality < 50) THEN
rec_item.quality = rec_item.quality + 1;
END IF;
END IF;
IF (rec_item.sellIn < 6) THEN
IF (rec_item.quality < 50) THEN
rec_item.quality = rec_item.quality + 1;
END IF;
END IF;
END IF;
END IF;
END IF;
IF (rec_item.name <> 'Sulfuras, Hand of Ragnaros') THEN
rec_item.sellIn = rec_item.sellIn - 1;
END IF;
IF (rec_item.sellIn < 0) THEN
IF (rec_item.name <> 'Aged Brie') THEN
IF (rec_item.name <> 'Backstage passes to a TAFKAL80ETC concert') THEN
IF (rec_item.quality > 0) THEN
IF (rec_item.name <> 'Sulfuras, Hand of Ragnaros') THEN
rec_item.quality = rec_item.quality - 1;
END IF;
END IF;
ELSE
rec_item.quality = rec_item.quality - rec_item.quality;
END IF;
ELSE
IF (rec_item.quality < 50) THEN
rec_item.quality = rec_item.quality + 1;
END IF;
END IF;
END IF;
UPDATE item
SET
quality = rec_item.quality,
sellIn = rec_item.sellIn
WHERE
name = rec_item.name;
END LOOP;
CLOSE cur_items;
COMMIT;
END;
$$

View File

@ -0,0 +1,9 @@
CREATE DATABASE gilded_rose;
\connect gilded_rose;
CREATE TABLE item (
name CHARACTER VARYING(100) NOT NULL,
sellIn INTEGER,
quality INTEGER NOT NULL
);

View File

@ -0,0 +1,17 @@
\set AUTOCOMMIT off
TRUNCATE TABLE item;
INSERT INTO item (name, sellIn, quality) VALUES ('+5 Dexterity Vest', 10, 20);
INSERT INTO item (name, sellIn, quality) VALUES ('Aged Brie', 2, 0);
INSERT INTO item (name, sellIn, quality) VALUES ('Elixir of the Mongoose', 5, 7);
INSERT INTO item (name, sellIn, quality) VALUES ('Sulfuras, Hand of Ragnaros', 0, 80);
INSERT INTO item (name, sellIn, quality) VALUES ('Sulfuras, Hand of Ragnaros', -1, 80);
INSERT INTO item (name, sellIn, quality) VALUES ('Backstage passes to a TAFKAL80ETC concert', 15, 20);
INSERT INTO item (name, sellIn, quality) VALUES ('Backstage passes to a TAFKAL80ETC concert', 10, 49);
INSERT INTO item (name, sellIn, quality) VALUES ('Backstage passes to a TAFKAL80ETC concert', 5, 49);
-- this conjured item does not work properly yet
INSERT INTO item (name, sellIn, quality) VALUES ('Conjured Mana Cake', 3, 6);
COMMIT;

12
sql/README.md Normal file
View File

@ -0,0 +1,12 @@
# Introduction
This code aims to be based on ISO-compliant, therefore database-agnostic.
However, Data Definition Language (DDL) usually involves vendor variants.
# Setup
Create database structure: see ./structure/<VARIANT>/create.sql
Load test data: see ./test/data/load.sql
# Execution
Execute SQL script: see /code/update_quality.sql
TODO: Introduce test framework - vendor specific

View File

@ -0,0 +1,69 @@
UPDATE item
SET
quality = quality - 1
WHERE 1=1
AND ( name <> 'Aged Brie' AND name <> 'Backstage passes to a TAFKAL80ETC concert')
AND quality > 0
AND name <> 'Sulfuras, Hand of Ragnaros'
;
UPDATE item
SET
quality = quality + 1
WHERE 1=1
AND NOT ( name <> 'Aged Brie' AND name <> 'Backstage passes to a TAFKAL80ETC concert')
AND quality < 50
AND name = 'Backstage passes to a TAFKAL80ETC concert'
AND sellIn < 11
AND quality < 50
;
UPDATE item
SET
quality = quality + 1
WHERE 1=1
AND NOT ( name <> 'Aged Brie' AND name <> 'Backstage passes to a TAFKAL80ETC concert')
AND quality < 50
AND name = 'Backstage passes to a TAFKAL80ETC concert'
AND sellIn < 6
AND quality < 50
;
UPDATE item
SET
sellIn = sellIn - 1
WHERE 1=1
AND name <> 'Sulfuras, Hand of Ragnaros'
;
UPDATE item
SET
quality = quality - 1
WHERE 1=1
AND sellIn < 0
AND name <> 'Aged Brie'
AND name <> 'Backstage passes to a TAFKAL80ETC concert'
AND quality > 0
AND name <> 'Sulfuras, Hand of Ragnaros'
;
UPDATE item
SET
quality = quality - quality
WHERE 1=1
AND sellIn < 0
AND name <> 'Aged Brie'
AND NOT (name <> 'Backstage passes to a TAFKAL80ETC concert')
;
UPDATE item
SET
quality = quality + 1
WHERE 1=1
AND sellIn < 0
AND NOT (name <> 'Aged Brie')
AND quality < 50
AND name <> 'Sulfuras, Hand of Ragnaros'
;
COMMIT;

View File

@ -0,0 +1,9 @@
CREATE DATABASE gilded_rose;
\connect gilded_rose;
CREATE TABLE item (
name CHARACTER VARYING(100) NOT NULL,
sellIn INTEGER,
quality INTEGER NOT NULL
);

15
sql/test/data/load.sql Normal file
View File

@ -0,0 +1,15 @@
DELETE FROM item;
INSERT INTO item (name, sellIn, quality) VALUES ('+5 Dexterity Vest', 10, 20);
INSERT INTO item (name, sellIn, quality) VALUES ('Aged Brie', 2, 0);
INSERT INTO item (name, sellIn, quality) VALUES ('Elixir of the Mongoose', 5, 7);
INSERT INTO item (name, sellIn, quality) VALUES ('Sulfuras, Hand of Ragnaros', 0, 80);
INSERT INTO item (name, sellIn, quality) VALUES ('Sulfuras, Hand of Ragnaros', -1, 80);
INSERT INTO item (name, sellIn, quality) VALUES ('Backstage passes to a TAFKAL80ETC concert', 15, 20);
INSERT INTO item (name, sellIn, quality) VALUES ('Backstage passes to a TAFKAL80ETC concert', 10, 49);
INSERT INTO item (name, sellIn, quality) VALUES ('Backstage passes to a TAFKAL80ETC concert', 5, 49);
-- this conjured item does not work properly yet
INSERT INTO item (name, sellIn, quality) VALUES ('Conjured Mana Cake', 3, 6);
COMMIT;