diff --git a/plpgsql/README.md b/plpgsql/README.md new file mode 100644 index 00000000..63d144d1 --- /dev/null +++ b/plpgsql/README.md @@ -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) + diff --git a/plpgsql/code/update_quality.sql b/plpgsql/code/update_quality.sql new file mode 100644 index 00000000..69c18516 --- /dev/null +++ b/plpgsql/code/update_quality.sql @@ -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; +$$ diff --git a/plpgsql/structure/create.sql b/plpgsql/structure/create.sql new file mode 100644 index 00000000..5ce4d245 --- /dev/null +++ b/plpgsql/structure/create.sql @@ -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 +); diff --git a/plpgsql/test/data/load.sql b/plpgsql/test/data/load.sql new file mode 100644 index 00000000..c03aa4ba --- /dev/null +++ b/plpgsql/test/data/load.sql @@ -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; diff --git a/sql/README.md b/sql/README.md new file mode 100644 index 00000000..b667e475 --- /dev/null +++ b/sql/README.md @@ -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//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 + diff --git a/sql/code/update_quality.sql b/sql/code/update_quality.sql new file mode 100644 index 00000000..9da22bd5 --- /dev/null +++ b/sql/code/update_quality.sql @@ -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; \ No newline at end of file diff --git a/sql/structure/postgreSQL/create.sql b/sql/structure/postgreSQL/create.sql new file mode 100644 index 00000000..5ce4d245 --- /dev/null +++ b/sql/structure/postgreSQL/create.sql @@ -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 +); diff --git a/sql/test/data/load.sql b/sql/test/data/load.sql new file mode 100644 index 00000000..7a142212 --- /dev/null +++ b/sql/test/data/load.sql @@ -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;