From c947d29d67060e52707e88ea10952b5001f50f55 Mon Sep 17 00:00:00 2001 From: FrederikBaerentsen Date: Sun, 18 Jan 2026 20:25:47 +0100 Subject: [PATCH] feat(parts): add SQL queries for individual parts and lot management --- bricktracker/sql/individual_part/delete.sql | 17 +++++++ bricktracker/sql/individual_part/insert.sql | 30 +++++++++++++ .../sql/individual_part/insert_with_lot.sql | 30 +++++++++++++ bricktracker/sql/individual_part/list/all.sql | 42 ++++++++++++++++++ .../sql/individual_part/list/by_color.sql | 31 +++++++++++++ .../sql/individual_part/list/by_part.sql | 31 +++++++++++++ .../list/by_part_and_color.sql | 34 ++++++++++++++ .../sql/individual_part/list/by_storage.sql | 31 +++++++++++++ .../sql/individual_part/list/problem.sql | 32 ++++++++++++++ .../list/using_purchase_location.sql | 32 ++++++++++++++ .../individual_part/list/using_storage.sql | 31 +++++++++++++ .../individual_part/list/without_storage.sql | 31 +++++++++++++ .../sql/individual_part/select/by_id.sql | 44 +++++++++++++++++++ .../sql/individual_part/update/checked.sql | 3 ++ .../sql/individual_part/update/damaged.sql | 3 ++ .../individual_part/update/description.sql | 4 ++ .../sql/individual_part/update/field.sql | 4 ++ .../sql/individual_part/update/missing.sql | 3 ++ .../sql/individual_part/update/quantity.sql | 4 ++ .../sql/individual_part/update_full.sql | 9 ++++ .../sql/individual_part_lot/delete.sql | 22 ++++++++++ .../sql/individual_part_lot/insert.sql | 19 ++++++++ .../sql/individual_part_lot/list/all.sql | 21 +++++++++ .../list/by_part_and_color.sql | 23 ++++++++++ .../individual_part_lot/list/by_storage.sql | 22 ++++++++++ .../sql/individual_part_lot/list/parts.sql | 26 +++++++++++ .../sql/individual_part_lot/list/problem.sql | 23 ++++++++++ .../list/using_purchase_location.sql | 22 ++++++++++ .../list/using_storage.sql | 22 ++++++++++ .../list/without_storage.sql | 22 ++++++++++ .../sql/individual_part_lot/select/by_id.sql | 28 ++++++++++++ .../update/description.sql | 4 ++ .../sql/individual_part_lot/update/name.sql | 4 ++ .../update/purchase_date.sql | 4 ++ .../update/purchase_location.sql | 4 ++ .../update/purchase_price.sql | 4 ++ .../individual_part_lot/update/storage.sql | 4 ++ .../sql/rebrickable_colors/insert.sql | 8 ++++ .../rebrickable_colors/select/by_color_id.sql | 5 +++ .../sql/rebrickable_parts/check_exists.sql | 3 ++ .../rebrickable_parts/insert_part_color.sql | 26 +++++++++++ .../insert_with_preloaded_data.sql | 20 +++++++++ .../select/image_by_part_color.sql | 3 ++ 43 files changed, 785 insertions(+) create mode 100644 bricktracker/sql/individual_part/delete.sql create mode 100644 bricktracker/sql/individual_part/insert.sql create mode 100644 bricktracker/sql/individual_part/insert_with_lot.sql create mode 100644 bricktracker/sql/individual_part/list/all.sql create mode 100644 bricktracker/sql/individual_part/list/by_color.sql create mode 100644 bricktracker/sql/individual_part/list/by_part.sql create mode 100644 bricktracker/sql/individual_part/list/by_part_and_color.sql create mode 100644 bricktracker/sql/individual_part/list/by_storage.sql create mode 100644 bricktracker/sql/individual_part/list/problem.sql create mode 100644 bricktracker/sql/individual_part/list/using_purchase_location.sql create mode 100644 bricktracker/sql/individual_part/list/using_storage.sql create mode 100644 bricktracker/sql/individual_part/list/without_storage.sql create mode 100644 bricktracker/sql/individual_part/select/by_id.sql create mode 100644 bricktracker/sql/individual_part/update/checked.sql create mode 100644 bricktracker/sql/individual_part/update/damaged.sql create mode 100644 bricktracker/sql/individual_part/update/description.sql create mode 100644 bricktracker/sql/individual_part/update/field.sql create mode 100644 bricktracker/sql/individual_part/update/missing.sql create mode 100644 bricktracker/sql/individual_part/update/quantity.sql create mode 100644 bricktracker/sql/individual_part/update_full.sql create mode 100644 bricktracker/sql/individual_part_lot/delete.sql create mode 100644 bricktracker/sql/individual_part_lot/insert.sql create mode 100644 bricktracker/sql/individual_part_lot/list/all.sql create mode 100644 bricktracker/sql/individual_part_lot/list/by_part_and_color.sql create mode 100644 bricktracker/sql/individual_part_lot/list/by_storage.sql create mode 100644 bricktracker/sql/individual_part_lot/list/parts.sql create mode 100644 bricktracker/sql/individual_part_lot/list/problem.sql create mode 100644 bricktracker/sql/individual_part_lot/list/using_purchase_location.sql create mode 100644 bricktracker/sql/individual_part_lot/list/using_storage.sql create mode 100644 bricktracker/sql/individual_part_lot/list/without_storage.sql create mode 100644 bricktracker/sql/individual_part_lot/select/by_id.sql create mode 100644 bricktracker/sql/individual_part_lot/update/description.sql create mode 100644 bricktracker/sql/individual_part_lot/update/name.sql create mode 100644 bricktracker/sql/individual_part_lot/update/purchase_date.sql create mode 100644 bricktracker/sql/individual_part_lot/update/purchase_location.sql create mode 100644 bricktracker/sql/individual_part_lot/update/purchase_price.sql create mode 100644 bricktracker/sql/individual_part_lot/update/storage.sql create mode 100644 bricktracker/sql/rebrickable_colors/insert.sql create mode 100644 bricktracker/sql/rebrickable_colors/select/by_color_id.sql create mode 100644 bricktracker/sql/rebrickable_parts/check_exists.sql create mode 100644 bricktracker/sql/rebrickable_parts/insert_part_color.sql create mode 100644 bricktracker/sql/rebrickable_parts/insert_with_preloaded_data.sql create mode 100644 bricktracker/sql/rebrickable_parts/select/image_by_part_color.sql diff --git a/bricktracker/sql/individual_part/delete.sql b/bricktracker/sql/individual_part/delete.sql new file mode 100644 index 0000000..a0ed756 --- /dev/null +++ b/bricktracker/sql/individual_part/delete.sql @@ -0,0 +1,17 @@ +-- A bit unsafe as it does not use a prepared statement but it +-- should not be possible to inject anything through the {{ id }} context + +BEGIN TRANSACTION; + +-- Delete metadata from consolidated tables +DELETE FROM "bricktracker_set_owners" +WHERE "id" IS NOT DISTINCT FROM '{{ id }}'; + +DELETE FROM "bricktracker_set_tags" +WHERE "id" IS NOT DISTINCT FROM '{{ id }}'; + +-- Delete the individual part itself +DELETE FROM "bricktracker_individual_parts" +WHERE "id" IS NOT DISTINCT FROM '{{ id }}'; + +COMMIT; diff --git a/bricktracker/sql/individual_part/insert.sql b/bricktracker/sql/individual_part/insert.sql new file mode 100644 index 0000000..f63bfc2 --- /dev/null +++ b/bricktracker/sql/individual_part/insert.sql @@ -0,0 +1,30 @@ +-- Insert a new individual part +INSERT INTO "bricktracker_individual_parts" ( + "id", + "part", + "color", + "quantity", + "missing", + "damaged", + "checked", + "description", + "lot_id", + "storage", + "purchase_location", + "purchase_date", + "purchase_price" +) VALUES ( + :id, + :part, + :color, + :quantity, + :missing, + :damaged, + :checked, + :description, + :lot_id, + :storage, + :purchase_location, + :purchase_date, + :purchase_price +) diff --git a/bricktracker/sql/individual_part/insert_with_lot.sql b/bricktracker/sql/individual_part/insert_with_lot.sql new file mode 100644 index 0000000..4a48c1d --- /dev/null +++ b/bricktracker/sql/individual_part/insert_with_lot.sql @@ -0,0 +1,30 @@ +-- Insert an individual part that belongs to a lot +INSERT INTO "bricktracker_individual_parts" ( + "id", + "part", + "color", + "quantity", + "missing", + "damaged", + "checked", + "description", + "storage", + "purchase_location", + "purchase_date", + "purchase_price", + "lot_id" +) VALUES ( + :id, + :part, + :color, + :quantity, + 0, + 0, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + :lot_id +) diff --git a/bricktracker/sql/individual_part/list/all.sql b/bricktracker/sql/individual_part/list/all.sql new file mode 100644 index 0000000..1fd2e01 --- /dev/null +++ b/bricktracker/sql/individual_part/list/all.sql @@ -0,0 +1,42 @@ +-- List all individual parts +SELECT + "bricktracker_individual_parts"."id", + "bricktracker_individual_parts"."part", + "bricktracker_individual_parts"."color", + "bricktracker_individual_parts"."quantity", + "bricktracker_individual_parts"."missing", + "bricktracker_individual_parts"."damaged", + "bricktracker_individual_parts"."checked", + "bricktracker_individual_parts"."description", + "bricktracker_individual_parts"."lot_id", + "bricktracker_individual_parts"."storage", + "bricktracker_individual_parts"."purchase_location", + "bricktracker_individual_parts"."purchase_date", + "bricktracker_individual_parts"."purchase_price", + "rebrickable_parts"."name" AS "part_name", + "rebrickable_parts"."color_name", + "rebrickable_parts"."color_rgb", + "rebrickable_parts"."color_transparent", + "rebrickable_parts"."category", + "rebrickable_parts"."image", + "rebrickable_parts"."image_id", + "rebrickable_parts"."url" AS "part_url", + "rebrickable_parts"."bricklink_part_num", + "rebrickable_parts"."bricklink_color_id", + "rebrickable_parts"."bricklink_color_name" +FROM "bricktracker_individual_parts" +INNER JOIN "rebrickable_parts" + ON "bricktracker_individual_parts"."part" = "rebrickable_parts"."part" + AND "bricktracker_individual_parts"."color" = "rebrickable_parts"."color_id" + +{% if order %} +ORDER BY {{ order }} +{% endif %} + +{% if limit %} +LIMIT {{ limit }} +{% endif %} + +{% if offset %} +OFFSET {{ offset }} +{% endif %} diff --git a/bricktracker/sql/individual_part/list/by_color.sql b/bricktracker/sql/individual_part/list/by_color.sql new file mode 100644 index 0000000..0d98fd5 --- /dev/null +++ b/bricktracker/sql/individual_part/list/by_color.sql @@ -0,0 +1,31 @@ +SELECT + "bricktracker_individual_parts"."id", + "bricktracker_individual_parts"."part", + "bricktracker_individual_parts"."color", + "bricktracker_individual_parts"."quantity", + "bricktracker_individual_parts"."missing", + "bricktracker_individual_parts"."damaged", + "bricktracker_individual_parts"."checked", + "bricktracker_individual_parts"."description", + "bricktracker_individual_parts"."storage", + "bricktracker_individual_parts"."purchase_location", + "bricktracker_individual_parts"."purchase_date", + "bricktracker_individual_parts"."purchase_price", + "rebrickable_parts"."name", + "rebrickable_parts"."color_name", + "rebrickable_parts"."color_rgb", + "rebrickable_parts"."color_transparent", + "rebrickable_parts"."image", + "rebrickable_parts"."url", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name" +FROM "bricktracker_individual_parts" +INNER JOIN "rebrickable_parts" + ON "bricktracker_individual_parts"."part" = "rebrickable_parts"."part" + AND "bricktracker_individual_parts"."color" = "rebrickable_parts"."color_id" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_parts"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_parts"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +WHERE "bricktracker_individual_parts"."color" = :color +ORDER BY "bricktracker_individual_parts"."part" diff --git a/bricktracker/sql/individual_part/list/by_part.sql b/bricktracker/sql/individual_part/list/by_part.sql new file mode 100644 index 0000000..9b95652 --- /dev/null +++ b/bricktracker/sql/individual_part/list/by_part.sql @@ -0,0 +1,31 @@ +SELECT + "bricktracker_individual_parts"."id", + "bricktracker_individual_parts"."part", + "bricktracker_individual_parts"."color", + "bricktracker_individual_parts"."quantity", + "bricktracker_individual_parts"."missing", + "bricktracker_individual_parts"."damaged", + "bricktracker_individual_parts"."checked", + "bricktracker_individual_parts"."description", + "bricktracker_individual_parts"."storage", + "bricktracker_individual_parts"."purchase_location", + "bricktracker_individual_parts"."purchase_date", + "bricktracker_individual_parts"."purchase_price", + "rebrickable_parts"."name", + "rebrickable_parts"."color_name", + "rebrickable_parts"."color_rgb", + "rebrickable_parts"."color_transparent", + "rebrickable_parts"."image", + "rebrickable_parts"."url", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name" +FROM "bricktracker_individual_parts" +INNER JOIN "rebrickable_parts" + ON "bricktracker_individual_parts"."part" = "rebrickable_parts"."part" + AND "bricktracker_individual_parts"."color" = "rebrickable_parts"."color_id" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_parts"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_parts"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +WHERE "bricktracker_individual_parts"."part" = :part +ORDER BY "bricktracker_individual_parts"."color" diff --git a/bricktracker/sql/individual_part/list/by_part_and_color.sql b/bricktracker/sql/individual_part/list/by_part_and_color.sql new file mode 100644 index 0000000..bb43aeb --- /dev/null +++ b/bricktracker/sql/individual_part/list/by_part_and_color.sql @@ -0,0 +1,34 @@ +SELECT + "bricktracker_individual_parts"."id", + "bricktracker_individual_parts"."part", + "bricktracker_individual_parts"."color", + "bricktracker_individual_parts"."quantity", + "bricktracker_individual_parts"."missing", + "bricktracker_individual_parts"."damaged", + "bricktracker_individual_parts"."checked", + "bricktracker_individual_parts"."description", + "bricktracker_individual_parts"."lot_id", + "bricktracker_individual_parts"."storage", + "bricktracker_individual_parts"."purchase_location", + "bricktracker_individual_parts"."purchase_date", + "bricktracker_individual_parts"."purchase_price", + "rebrickable_parts"."name", + "rebrickable_parts"."color_name", + "rebrickable_parts"."color_rgb", + "rebrickable_parts"."color_transparent", + "rebrickable_parts"."image", + "rebrickable_parts"."url", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name" +FROM "bricktracker_individual_parts" +INNER JOIN "rebrickable_parts" + ON "bricktracker_individual_parts"."part" = "rebrickable_parts"."part" + AND "bricktracker_individual_parts"."color" = "rebrickable_parts"."color_id" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_parts"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_parts"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +WHERE "bricktracker_individual_parts"."part" = :part + AND "bricktracker_individual_parts"."color" = :color + AND "bricktracker_individual_parts"."lot_id" IS NULL +ORDER BY "bricktracker_individual_parts"."id" diff --git a/bricktracker/sql/individual_part/list/by_storage.sql b/bricktracker/sql/individual_part/list/by_storage.sql new file mode 100644 index 0000000..9a07ab3 --- /dev/null +++ b/bricktracker/sql/individual_part/list/by_storage.sql @@ -0,0 +1,31 @@ +SELECT + "bricktracker_individual_parts"."id", + "bricktracker_individual_parts"."part", + "bricktracker_individual_parts"."color", + "bricktracker_individual_parts"."quantity", + "bricktracker_individual_parts"."missing", + "bricktracker_individual_parts"."damaged", + "bricktracker_individual_parts"."checked", + "bricktracker_individual_parts"."description", + "bricktracker_individual_parts"."storage", + "bricktracker_individual_parts"."purchase_location", + "bricktracker_individual_parts"."purchase_date", + "bricktracker_individual_parts"."purchase_price", + "rebrickable_parts"."name", + "rebrickable_parts"."color_name", + "rebrickable_parts"."color_rgb", + "rebrickable_parts"."color_transparent", + "rebrickable_parts"."image", + "rebrickable_parts"."url", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name" +FROM "bricktracker_individual_parts" +INNER JOIN "rebrickable_parts" + ON "bricktracker_individual_parts"."part" = "rebrickable_parts"."part" + AND "bricktracker_individual_parts"."color" = "rebrickable_parts"."color_id" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_parts"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_parts"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +WHERE "bricktracker_individual_parts"."storage" = :storage +ORDER BY "bricktracker_individual_parts"."part", "bricktracker_individual_parts"."color" diff --git a/bricktracker/sql/individual_part/list/problem.sql b/bricktracker/sql/individual_part/list/problem.sql new file mode 100644 index 0000000..b5ab2e3 --- /dev/null +++ b/bricktracker/sql/individual_part/list/problem.sql @@ -0,0 +1,32 @@ +SELECT + "bricktracker_individual_parts"."id", + "bricktracker_individual_parts"."part", + "bricktracker_individual_parts"."color", + "bricktracker_individual_parts"."quantity", + "bricktracker_individual_parts"."missing", + "bricktracker_individual_parts"."damaged", + "bricktracker_individual_parts"."checked", + "bricktracker_individual_parts"."description", + "bricktracker_individual_parts"."storage", + "bricktracker_individual_parts"."purchase_location", + "bricktracker_individual_parts"."purchase_date", + "bricktracker_individual_parts"."purchase_price", + "rebrickable_parts"."name", + "rebrickable_parts"."color_name", + "rebrickable_parts"."color_rgb", + "rebrickable_parts"."color_transparent", + "rebrickable_parts"."image", + "rebrickable_parts"."url", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name" +FROM "bricktracker_individual_parts" +INNER JOIN "rebrickable_parts" + ON "bricktracker_individual_parts"."part" = "rebrickable_parts"."part" + AND "bricktracker_individual_parts"."color" = "rebrickable_parts"."color_id" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_parts"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_parts"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +WHERE "bricktracker_individual_parts"."missing" > 0 + OR "bricktracker_individual_parts"."damaged" > 0 +ORDER BY "bricktracker_individual_parts"."part", "bricktracker_individual_parts"."color" diff --git a/bricktracker/sql/individual_part/list/using_purchase_location.sql b/bricktracker/sql/individual_part/list/using_purchase_location.sql new file mode 100644 index 0000000..29d0bb6 --- /dev/null +++ b/bricktracker/sql/individual_part/list/using_purchase_location.sql @@ -0,0 +1,32 @@ +SELECT + "bricktracker_individual_parts"."id", + "bricktracker_individual_parts"."part", + "bricktracker_individual_parts"."color", + "bricktracker_individual_parts"."quantity", + "bricktracker_individual_parts"."missing", + "bricktracker_individual_parts"."damaged", + "bricktracker_individual_parts"."checked", + "bricktracker_individual_parts"."description", + "bricktracker_individual_parts"."storage", + "bricktracker_individual_parts"."purchase_location", + "bricktracker_individual_parts"."purchase_date", + "bricktracker_individual_parts"."purchase_price", + "rebrickable_parts"."name", + "rebrickable_parts"."color_name", + "rebrickable_parts"."color_rgb", + "rebrickable_parts"."color_transparent", + "rebrickable_parts"."image", + "rebrickable_parts"."url", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name" +FROM "bricktracker_individual_parts" +INNER JOIN "rebrickable_parts" + ON "bricktracker_individual_parts"."part" = "rebrickable_parts"."part" + AND "bricktracker_individual_parts"."color" = "rebrickable_parts"."color_id" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_parts"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_parts"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +WHERE "bricktracker_individual_parts"."purchase_location" IS NOT DISTINCT FROM :purchase_location +AND "bricktracker_individual_parts"."lot_id" IS NULL +ORDER BY "bricktracker_individual_parts"."part", "bricktracker_individual_parts"."color" diff --git a/bricktracker/sql/individual_part/list/using_storage.sql b/bricktracker/sql/individual_part/list/using_storage.sql new file mode 100644 index 0000000..5040d8c --- /dev/null +++ b/bricktracker/sql/individual_part/list/using_storage.sql @@ -0,0 +1,31 @@ +SELECT + "bricktracker_individual_parts"."id", + "bricktracker_individual_parts"."part", + "bricktracker_individual_parts"."color", + "bricktracker_individual_parts"."quantity", + "bricktracker_individual_parts"."missing", + "bricktracker_individual_parts"."damaged", + "bricktracker_individual_parts"."checked", + "bricktracker_individual_parts"."description", + "bricktracker_individual_parts"."storage", + "bricktracker_individual_parts"."purchase_location", + "bricktracker_individual_parts"."purchase_date", + "bricktracker_individual_parts"."purchase_price", + "rebrickable_parts"."name", + "rebrickable_parts"."color_name", + "rebrickable_parts"."color_rgb", + "rebrickable_parts"."color_transparent", + "rebrickable_parts"."image", + "rebrickable_parts"."url", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name" +FROM "bricktracker_individual_parts" +INNER JOIN "rebrickable_parts" + ON "bricktracker_individual_parts"."part" = "rebrickable_parts"."part" + AND "bricktracker_individual_parts"."color" = "rebrickable_parts"."color_id" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_parts"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_parts"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +WHERE "bricktracker_individual_parts"."storage" IS NOT DISTINCT FROM :storage +ORDER BY "bricktracker_individual_parts"."part", "bricktracker_individual_parts"."color" diff --git a/bricktracker/sql/individual_part/list/without_storage.sql b/bricktracker/sql/individual_part/list/without_storage.sql new file mode 100644 index 0000000..8a5fef4 --- /dev/null +++ b/bricktracker/sql/individual_part/list/without_storage.sql @@ -0,0 +1,31 @@ +SELECT + "bricktracker_individual_parts"."id", + "bricktracker_individual_parts"."part", + "bricktracker_individual_parts"."color", + "bricktracker_individual_parts"."quantity", + "bricktracker_individual_parts"."missing", + "bricktracker_individual_parts"."damaged", + "bricktracker_individual_parts"."checked", + "bricktracker_individual_parts"."description", + "bricktracker_individual_parts"."storage", + "bricktracker_individual_parts"."purchase_location", + "bricktracker_individual_parts"."purchase_date", + "bricktracker_individual_parts"."purchase_price", + "rebrickable_parts"."name", + "rebrickable_parts"."color_name", + "rebrickable_parts"."color_rgb", + "rebrickable_parts"."color_transparent", + "rebrickable_parts"."image", + "rebrickable_parts"."url", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name" +FROM "bricktracker_individual_parts" +INNER JOIN "rebrickable_parts" + ON "bricktracker_individual_parts"."part" = "rebrickable_parts"."part" + AND "bricktracker_individual_parts"."color" = "rebrickable_parts"."color_id" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_parts"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_parts"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +WHERE "bricktracker_individual_parts"."storage" IS NULL +ORDER BY "bricktracker_individual_parts"."part", "bricktracker_individual_parts"."color" diff --git a/bricktracker/sql/individual_part/select/by_id.sql b/bricktracker/sql/individual_part/select/by_id.sql new file mode 100644 index 0000000..2513c61 --- /dev/null +++ b/bricktracker/sql/individual_part/select/by_id.sql @@ -0,0 +1,44 @@ +-- Select a specific individual part by UUID +SELECT + "bricktracker_individual_parts"."id", + "bricktracker_individual_parts"."part", + "bricktracker_individual_parts"."color", + "bricktracker_individual_parts"."quantity", + "bricktracker_individual_parts"."missing", + "bricktracker_individual_parts"."damaged", + "bricktracker_individual_parts"."checked", + "bricktracker_individual_parts"."description", + "bricktracker_individual_parts"."lot_id", + "bricktracker_individual_parts"."storage", + "bricktracker_individual_parts"."purchase_location", + "bricktracker_individual_parts"."purchase_date", + "bricktracker_individual_parts"."purchase_price", + "rebrickable_parts"."name" AS "part_name", + "rebrickable_parts"."color_name", + "rebrickable_parts"."color_rgb", + "rebrickable_parts"."color_transparent", + "rebrickable_parts"."category", + "rebrickable_parts"."image", + "rebrickable_parts"."image_id", + "rebrickable_parts"."url", + "rebrickable_parts"."bricklink_part_num", + "rebrickable_parts"."bricklink_color_id", + "rebrickable_parts"."bricklink_color_name" + {% if owners %},{{ owners }}{% endif %} + {% if statuses %},{{ statuses }}{% endif %} + {% if tags %},{{ tags }}{% endif %} +FROM "bricktracker_individual_parts" +INNER JOIN "rebrickable_parts" + ON "bricktracker_individual_parts"."part" = "rebrickable_parts"."part" + AND "bricktracker_individual_parts"."color" = "rebrickable_parts"."color_id" + +LEFT JOIN "bricktracker_set_owners" +ON "bricktracker_individual_parts"."id" IS NOT DISTINCT FROM "bricktracker_set_owners"."id" + +LEFT JOIN "bricktracker_set_statuses" +ON "bricktracker_individual_parts"."id" IS NOT DISTINCT FROM "bricktracker_set_statuses"."id" + +LEFT JOIN "bricktracker_set_tags" +ON "bricktracker_individual_parts"."id" IS NOT DISTINCT FROM "bricktracker_set_tags"."id" + +WHERE "bricktracker_individual_parts"."id" = :id; diff --git a/bricktracker/sql/individual_part/update/checked.sql b/bricktracker/sql/individual_part/update/checked.sql new file mode 100644 index 0000000..d7bd077 --- /dev/null +++ b/bricktracker/sql/individual_part/update/checked.sql @@ -0,0 +1,3 @@ +UPDATE "bricktracker_individual_parts" +SET "checked" = :checked +WHERE "id" = :id diff --git a/bricktracker/sql/individual_part/update/damaged.sql b/bricktracker/sql/individual_part/update/damaged.sql new file mode 100644 index 0000000..3016828 --- /dev/null +++ b/bricktracker/sql/individual_part/update/damaged.sql @@ -0,0 +1,3 @@ +UPDATE "bricktracker_individual_parts" +SET "damaged" = :damaged +WHERE "id" = :id diff --git a/bricktracker/sql/individual_part/update/description.sql b/bricktracker/sql/individual_part/update/description.sql new file mode 100644 index 0000000..b624398 --- /dev/null +++ b/bricktracker/sql/individual_part/update/description.sql @@ -0,0 +1,4 @@ +-- Update description for an individual part +UPDATE "bricktracker_individual_parts" +SET "description" = :description +WHERE "id" = :id; diff --git a/bricktracker/sql/individual_part/update/field.sql b/bricktracker/sql/individual_part/update/field.sql new file mode 100644 index 0000000..4906b22 --- /dev/null +++ b/bricktracker/sql/individual_part/update/field.sql @@ -0,0 +1,4 @@ +-- Update a specific field in bricktracker_individual_parts +UPDATE "bricktracker_individual_parts" +SET "{{ field }}" = :value +WHERE "id" = :id diff --git a/bricktracker/sql/individual_part/update/missing.sql b/bricktracker/sql/individual_part/update/missing.sql new file mode 100644 index 0000000..0583a38 --- /dev/null +++ b/bricktracker/sql/individual_part/update/missing.sql @@ -0,0 +1,3 @@ +UPDATE "bricktracker_individual_parts" +SET "missing" = :missing +WHERE "id" = :id diff --git a/bricktracker/sql/individual_part/update/quantity.sql b/bricktracker/sql/individual_part/update/quantity.sql new file mode 100644 index 0000000..dd28a4b --- /dev/null +++ b/bricktracker/sql/individual_part/update/quantity.sql @@ -0,0 +1,4 @@ +-- Update quantity for an individual part +UPDATE "bricktracker_individual_parts" +SET "quantity" = :quantity +WHERE "id" = :id; diff --git a/bricktracker/sql/individual_part/update_full.sql b/bricktracker/sql/individual_part/update_full.sql new file mode 100644 index 0000000..455238a --- /dev/null +++ b/bricktracker/sql/individual_part/update_full.sql @@ -0,0 +1,9 @@ +UPDATE "bricktracker_individual_parts" +SET + "quantity" = :quantity, + "description" = :description, + "storage" = :storage, + "purchase_location" = :purchase_location, + "purchase_date" = :purchase_date, + "purchase_price" = :purchase_price +WHERE "id" = :id diff --git a/bricktracker/sql/individual_part_lot/delete.sql b/bricktracker/sql/individual_part_lot/delete.sql new file mode 100644 index 0000000..083fe48 --- /dev/null +++ b/bricktracker/sql/individual_part_lot/delete.sql @@ -0,0 +1,22 @@ +-- A bit unsafe as it does not use a prepared statement but it +-- should not be possible to inject anything through the {{ id }} context + +BEGIN TRANSACTION; + +-- Delete all individual parts associated with this lot +DELETE FROM "bricktracker_individual_parts" +WHERE "lot_id" IS NOT DISTINCT FROM '{{ id }}'; + +-- Delete lot owners (using consolidated metadata table) +DELETE FROM "bricktracker_set_owners" +WHERE "id" IS NOT DISTINCT FROM '{{ id }}'; + +-- Delete lot tags (using consolidated metadata table) +DELETE FROM "bricktracker_set_tags" +WHERE "id" IS NOT DISTINCT FROM '{{ id }}'; + +-- Delete the lot itself +DELETE FROM "bricktracker_individual_part_lots" +WHERE "id" IS NOT DISTINCT FROM '{{ id }}'; + +COMMIT; diff --git a/bricktracker/sql/individual_part_lot/insert.sql b/bricktracker/sql/individual_part_lot/insert.sql new file mode 100644 index 0000000..54c428c --- /dev/null +++ b/bricktracker/sql/individual_part_lot/insert.sql @@ -0,0 +1,19 @@ +INSERT INTO "bricktracker_individual_part_lots" ( + "id", + "name", + "description", + "created_date", + "storage", + "purchase_location", + "purchase_date", + "purchase_price" +) VALUES ( + :id, + :name, + :description, + :created_date, + :storage, + :purchase_location, + :purchase_date, + :purchase_price +) diff --git a/bricktracker/sql/individual_part_lot/list/all.sql b/bricktracker/sql/individual_part_lot/list/all.sql new file mode 100644 index 0000000..da86dec --- /dev/null +++ b/bricktracker/sql/individual_part_lot/list/all.sql @@ -0,0 +1,21 @@ +SELECT + "bricktracker_individual_part_lots"."id", + "bricktracker_individual_part_lots"."name", + "bricktracker_individual_part_lots"."description", + "bricktracker_individual_part_lots"."created_date", + "bricktracker_individual_part_lots"."storage", + "bricktracker_individual_part_lots"."purchase_location", + "bricktracker_individual_part_lots"."purchase_date", + "bricktracker_individual_part_lots"."purchase_price", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name", + COUNT("bricktracker_individual_parts"."id") AS "part_count" +FROM "bricktracker_individual_part_lots" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_part_lots"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_part_lots"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +LEFT JOIN "bricktracker_individual_parts" + ON "bricktracker_individual_part_lots"."id" = "bricktracker_individual_parts"."lot_id" +GROUP BY "bricktracker_individual_part_lots"."id" +ORDER BY "bricktracker_individual_part_lots"."created_date" DESC diff --git a/bricktracker/sql/individual_part_lot/list/by_part_and_color.sql b/bricktracker/sql/individual_part_lot/list/by_part_and_color.sql new file mode 100644 index 0000000..77e6087 --- /dev/null +++ b/bricktracker/sql/individual_part_lot/list/by_part_and_color.sql @@ -0,0 +1,23 @@ +SELECT DISTINCT + "bricktracker_individual_part_lots"."id", + "bricktracker_individual_part_lots"."name", + "bricktracker_individual_part_lots"."description", + "bricktracker_individual_part_lots"."created_date", + "bricktracker_individual_part_lots"."storage", + "bricktracker_individual_part_lots"."purchase_location", + "bricktracker_individual_part_lots"."purchase_date", + "bricktracker_individual_part_lots"."purchase_price", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name", + COUNT("bricktracker_individual_parts"."id") AS "part_count" +FROM "bricktracker_individual_part_lots" +INNER JOIN "bricktracker_individual_parts" + ON "bricktracker_individual_part_lots"."id" = "bricktracker_individual_parts"."lot_id" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_part_lots"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_part_lots"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +WHERE "bricktracker_individual_parts"."part" = :part + AND "bricktracker_individual_parts"."color" = :color +GROUP BY "bricktracker_individual_part_lots"."id" +ORDER BY "bricktracker_individual_part_lots"."created_date" DESC diff --git a/bricktracker/sql/individual_part_lot/list/by_storage.sql b/bricktracker/sql/individual_part_lot/list/by_storage.sql new file mode 100644 index 0000000..f274edf --- /dev/null +++ b/bricktracker/sql/individual_part_lot/list/by_storage.sql @@ -0,0 +1,22 @@ +SELECT + "bricktracker_individual_part_lots"."id", + "bricktracker_individual_part_lots"."name", + "bricktracker_individual_part_lots"."description", + "bricktracker_individual_part_lots"."created_date", + "bricktracker_individual_part_lots"."storage", + "bricktracker_individual_part_lots"."purchase_location", + "bricktracker_individual_part_lots"."purchase_date", + "bricktracker_individual_part_lots"."purchase_price", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name", + COUNT("bricktracker_individual_parts"."id") AS "part_count" +FROM "bricktracker_individual_part_lots" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_part_lots"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_part_lots"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +LEFT JOIN "bricktracker_individual_parts" + ON "bricktracker_individual_part_lots"."id" = "bricktracker_individual_parts"."lot_id" +WHERE "bricktracker_individual_part_lots"."storage" = :storage +GROUP BY "bricktracker_individual_part_lots"."id" +ORDER BY "bricktracker_individual_part_lots"."created_date" DESC diff --git a/bricktracker/sql/individual_part_lot/list/parts.sql b/bricktracker/sql/individual_part_lot/list/parts.sql new file mode 100644 index 0000000..6c39db7 --- /dev/null +++ b/bricktracker/sql/individual_part_lot/list/parts.sql @@ -0,0 +1,26 @@ +SELECT + "bricktracker_individual_parts"."id", + "bricktracker_individual_parts"."part", + "bricktracker_individual_parts"."color", + "bricktracker_individual_parts"."quantity", + "bricktracker_individual_parts"."missing", + "bricktracker_individual_parts"."damaged", + "bricktracker_individual_parts"."checked", + "bricktracker_individual_parts"."description", + "bricktracker_individual_parts"."storage", + "bricktracker_individual_parts"."purchase_location", + "bricktracker_individual_parts"."purchase_date", + "bricktracker_individual_parts"."purchase_price", + "bricktracker_individual_parts"."lot_id", + "rebrickable_parts"."name", + "rebrickable_parts"."color_name", + "rebrickable_parts"."color_rgb", + "rebrickable_parts"."color_transparent", + "rebrickable_parts"."image", + "rebrickable_parts"."url" +FROM "bricktracker_individual_parts" +INNER JOIN "rebrickable_parts" + ON "bricktracker_individual_parts"."part" = "rebrickable_parts"."part" + AND "bricktracker_individual_parts"."color" = "rebrickable_parts"."color_id" +WHERE "bricktracker_individual_parts"."lot_id" = :lot_id +ORDER BY "rebrickable_parts"."name" ASC, "bricktracker_individual_parts"."color" ASC diff --git a/bricktracker/sql/individual_part_lot/list/problem.sql b/bricktracker/sql/individual_part_lot/list/problem.sql new file mode 100644 index 0000000..c3ac503 --- /dev/null +++ b/bricktracker/sql/individual_part_lot/list/problem.sql @@ -0,0 +1,23 @@ +SELECT + "bricktracker_individual_part_lots"."id", + "bricktracker_individual_part_lots"."name", + "bricktracker_individual_part_lots"."description", + "bricktracker_individual_part_lots"."created_date", + "bricktracker_individual_part_lots"."storage", + "bricktracker_individual_part_lots"."purchase_location", + "bricktracker_individual_part_lots"."purchase_date", + "bricktracker_individual_part_lots"."purchase_price", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name", + COUNT("bricktracker_individual_parts"."id") AS "part_count" +FROM "bricktracker_individual_part_lots" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_part_lots"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_part_lots"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +INNER JOIN "bricktracker_individual_parts" + ON "bricktracker_individual_part_lots"."id" = "bricktracker_individual_parts"."lot_id" +WHERE "bricktracker_individual_parts"."missing" > 0 + OR "bricktracker_individual_parts"."damaged" > 0 +GROUP BY "bricktracker_individual_part_lots"."id" +ORDER BY "bricktracker_individual_part_lots"."created_date" DESC diff --git a/bricktracker/sql/individual_part_lot/list/using_purchase_location.sql b/bricktracker/sql/individual_part_lot/list/using_purchase_location.sql new file mode 100644 index 0000000..f0c00bf --- /dev/null +++ b/bricktracker/sql/individual_part_lot/list/using_purchase_location.sql @@ -0,0 +1,22 @@ +SELECT + "bricktracker_individual_part_lots"."id", + "bricktracker_individual_part_lots"."name", + "bricktracker_individual_part_lots"."description", + "bricktracker_individual_part_lots"."created_date", + "bricktracker_individual_part_lots"."storage", + "bricktracker_individual_part_lots"."purchase_location", + "bricktracker_individual_part_lots"."purchase_date", + "bricktracker_individual_part_lots"."purchase_price", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name", + COUNT("bricktracker_individual_parts"."id") AS "part_count" +FROM "bricktracker_individual_part_lots" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_part_lots"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_part_lots"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +LEFT JOIN "bricktracker_individual_parts" + ON "bricktracker_individual_part_lots"."id" = "bricktracker_individual_parts"."lot_id" +WHERE "bricktracker_individual_part_lots"."purchase_location" IS NOT DISTINCT FROM :purchase_location +GROUP BY "bricktracker_individual_part_lots"."id" +ORDER BY "bricktracker_individual_part_lots"."created_date" DESC diff --git a/bricktracker/sql/individual_part_lot/list/using_storage.sql b/bricktracker/sql/individual_part_lot/list/using_storage.sql new file mode 100644 index 0000000..a656383 --- /dev/null +++ b/bricktracker/sql/individual_part_lot/list/using_storage.sql @@ -0,0 +1,22 @@ +SELECT + "bricktracker_individual_part_lots"."id", + "bricktracker_individual_part_lots"."name", + "bricktracker_individual_part_lots"."description", + "bricktracker_individual_part_lots"."created_date", + "bricktracker_individual_part_lots"."storage", + "bricktracker_individual_part_lots"."purchase_location", + "bricktracker_individual_part_lots"."purchase_date", + "bricktracker_individual_part_lots"."purchase_price", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name", + COUNT("bricktracker_individual_parts"."id") AS "part_count" +FROM "bricktracker_individual_part_lots" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_part_lots"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_part_lots"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +LEFT JOIN "bricktracker_individual_parts" + ON "bricktracker_individual_part_lots"."id" = "bricktracker_individual_parts"."lot_id" +WHERE "bricktracker_individual_part_lots"."storage" IS NOT DISTINCT FROM :storage +GROUP BY "bricktracker_individual_part_lots"."id" +ORDER BY "bricktracker_individual_part_lots"."created_date" DESC diff --git a/bricktracker/sql/individual_part_lot/list/without_storage.sql b/bricktracker/sql/individual_part_lot/list/without_storage.sql new file mode 100644 index 0000000..5bc0163 --- /dev/null +++ b/bricktracker/sql/individual_part_lot/list/without_storage.sql @@ -0,0 +1,22 @@ +SELECT + "bricktracker_individual_part_lots"."id", + "bricktracker_individual_part_lots"."name", + "bricktracker_individual_part_lots"."description", + "bricktracker_individual_part_lots"."created_date", + "bricktracker_individual_part_lots"."storage", + "bricktracker_individual_part_lots"."purchase_location", + "bricktracker_individual_part_lots"."purchase_date", + "bricktracker_individual_part_lots"."purchase_price", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name", + COUNT("bricktracker_individual_parts"."id") AS "part_count" +FROM "bricktracker_individual_part_lots" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_part_lots"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_part_lots"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" +LEFT JOIN "bricktracker_individual_parts" + ON "bricktracker_individual_part_lots"."id" = "bricktracker_individual_parts"."lot_id" +WHERE "bricktracker_individual_part_lots"."storage" IS NULL +GROUP BY "bricktracker_individual_part_lots"."id" +ORDER BY "bricktracker_individual_part_lots"."created_date" DESC diff --git a/bricktracker/sql/individual_part_lot/select/by_id.sql b/bricktracker/sql/individual_part_lot/select/by_id.sql new file mode 100644 index 0000000..a5980f8 --- /dev/null +++ b/bricktracker/sql/individual_part_lot/select/by_id.sql @@ -0,0 +1,28 @@ +SELECT + "bricktracker_individual_part_lots"."id", + "bricktracker_individual_part_lots"."name", + "bricktracker_individual_part_lots"."description", + "bricktracker_individual_part_lots"."created_date", + "bricktracker_individual_part_lots"."storage", + "bricktracker_individual_part_lots"."purchase_location", + "bricktracker_individual_part_lots"."purchase_date", + "bricktracker_individual_part_lots"."purchase_price", + "bricktracker_metadata_storages"."name" AS "storage_name", + "bricktracker_metadata_purchase_locations"."name" AS "purchase_location_name" + {% if owners %},{{ owners }}{% endif %} + {% if tags %},{{ tags }}{% endif %} +FROM "bricktracker_individual_part_lots" +LEFT JOIN "bricktracker_metadata_storages" + ON "bricktracker_individual_part_lots"."storage" IS NOT DISTINCT FROM "bricktracker_metadata_storages"."id" +LEFT JOIN "bricktracker_metadata_purchase_locations" + ON "bricktracker_individual_part_lots"."purchase_location" IS NOT DISTINCT FROM "bricktracker_metadata_purchase_locations"."id" + +LEFT JOIN "bricktracker_set_owners" +ON "bricktracker_individual_part_lots"."id" IS NOT DISTINCT FROM "bricktracker_set_owners"."id" + +-- Note: Part lots don't have statuses, only owners and tags + +LEFT JOIN "bricktracker_set_tags" +ON "bricktracker_individual_part_lots"."id" IS NOT DISTINCT FROM "bricktracker_set_tags"."id" + +WHERE "bricktracker_individual_part_lots"."id" = :id diff --git a/bricktracker/sql/individual_part_lot/update/description.sql b/bricktracker/sql/individual_part_lot/update/description.sql new file mode 100644 index 0000000..6d8c5ea --- /dev/null +++ b/bricktracker/sql/individual_part_lot/update/description.sql @@ -0,0 +1,4 @@ +-- Update individual part lot description +UPDATE "bricktracker_individual_part_lots" +SET "description" = :description +WHERE "id" = :id diff --git a/bricktracker/sql/individual_part_lot/update/name.sql b/bricktracker/sql/individual_part_lot/update/name.sql new file mode 100644 index 0000000..e817f8d --- /dev/null +++ b/bricktracker/sql/individual_part_lot/update/name.sql @@ -0,0 +1,4 @@ +-- Update individual part lot name +UPDATE "bricktracker_individual_part_lots" +SET "name" = :name +WHERE "id" = :id diff --git a/bricktracker/sql/individual_part_lot/update/purchase_date.sql b/bricktracker/sql/individual_part_lot/update/purchase_date.sql new file mode 100644 index 0000000..75f8af8 --- /dev/null +++ b/bricktracker/sql/individual_part_lot/update/purchase_date.sql @@ -0,0 +1,4 @@ +-- Update individual part lot purchase date +UPDATE "bricktracker_individual_part_lots" +SET "purchase_date" = :purchase_date +WHERE "id" = :id diff --git a/bricktracker/sql/individual_part_lot/update/purchase_location.sql b/bricktracker/sql/individual_part_lot/update/purchase_location.sql new file mode 100644 index 0000000..ae32272 --- /dev/null +++ b/bricktracker/sql/individual_part_lot/update/purchase_location.sql @@ -0,0 +1,4 @@ +-- Update individual part lot purchase location +UPDATE "bricktracker_individual_part_lots" +SET "purchase_location" = :purchase_location +WHERE "id" = :id diff --git a/bricktracker/sql/individual_part_lot/update/purchase_price.sql b/bricktracker/sql/individual_part_lot/update/purchase_price.sql new file mode 100644 index 0000000..873d92e --- /dev/null +++ b/bricktracker/sql/individual_part_lot/update/purchase_price.sql @@ -0,0 +1,4 @@ +-- Update individual part lot purchase price +UPDATE "bricktracker_individual_part_lots" +SET "purchase_price" = :purchase_price +WHERE "id" = :id diff --git a/bricktracker/sql/individual_part_lot/update/storage.sql b/bricktracker/sql/individual_part_lot/update/storage.sql new file mode 100644 index 0000000..4abc3f9 --- /dev/null +++ b/bricktracker/sql/individual_part_lot/update/storage.sql @@ -0,0 +1,4 @@ +-- Update individual part lot storage +UPDATE "bricktracker_individual_part_lots" +SET "storage" = :storage +WHERE "id" = :id diff --git a/bricktracker/sql/rebrickable_colors/insert.sql b/bricktracker/sql/rebrickable_colors/insert.sql new file mode 100644 index 0000000..ddbaa5d --- /dev/null +++ b/bricktracker/sql/rebrickable_colors/insert.sql @@ -0,0 +1,8 @@ +-- Insert or replace color information +INSERT OR REPLACE INTO "rebrickable_colors" ( + "color_id", "name", "rgb", "is_trans", + "bricklink_color_id", "bricklink_color_name" +) VALUES ( + :color_id, :name, :rgb, :is_trans, + :bricklink_color_id, :bricklink_color_name +) diff --git a/bricktracker/sql/rebrickable_colors/select/by_color_id.sql b/bricktracker/sql/rebrickable_colors/select/by_color_id.sql new file mode 100644 index 0000000..759bb9c --- /dev/null +++ b/bricktracker/sql/rebrickable_colors/select/by_color_id.sql @@ -0,0 +1,5 @@ +-- Select color information by color_id +SELECT "color_id", "name", "rgb", "is_trans", + "bricklink_color_id", "bricklink_color_name" +FROM "rebrickable_colors" +WHERE "color_id" = :color_id diff --git a/bricktracker/sql/rebrickable_parts/check_exists.sql b/bricktracker/sql/rebrickable_parts/check_exists.sql new file mode 100644 index 0000000..593c08b --- /dev/null +++ b/bricktracker/sql/rebrickable_parts/check_exists.sql @@ -0,0 +1,3 @@ +-- Check if a part/color combination exists in rebrickable_parts +SELECT COUNT(*) FROM "rebrickable_parts" +WHERE "part" = :part AND "color_id" = :color_id diff --git a/bricktracker/sql/rebrickable_parts/insert_part_color.sql b/bricktracker/sql/rebrickable_parts/insert_part_color.sql new file mode 100644 index 0000000..07cd7cb --- /dev/null +++ b/bricktracker/sql/rebrickable_parts/insert_part_color.sql @@ -0,0 +1,26 @@ +-- Insert a part/color combination into rebrickable_parts +INSERT OR IGNORE INTO "rebrickable_parts" ( + "part", + "name", + "color_id", + "color_name", + "color_rgb", + "color_transparent", + "image", + "image_id", + "url", + "bricklink_color_id", + "bricklink_color_name" +) VALUES ( + :part, + :name, + :color_id, + :color_name, + :color_rgb, + :color_transparent, + :image, + :image_id, + :url, + :bricklink_color_id, + :bricklink_color_name +) diff --git a/bricktracker/sql/rebrickable_parts/insert_with_preloaded_data.sql b/bricktracker/sql/rebrickable_parts/insert_with_preloaded_data.sql new file mode 100644 index 0000000..98c9e03 --- /dev/null +++ b/bricktracker/sql/rebrickable_parts/insert_with_preloaded_data.sql @@ -0,0 +1,20 @@ +-- Insert or update part into rebrickable_parts using pre-loaded color data +INSERT INTO "rebrickable_parts" ( + "part", "color_id", "color_name", "color_rgb", "color_transparent", + "bricklink_color_id", "bricklink_color_name", + "name", "image", "image_id", "url" +) VALUES ( + :part, :color_id, :color_name, :color_rgb, :color_transparent, + :bricklink_color_id, :bricklink_color_name, + :name, :image, :image_id, :url +) +ON CONFLICT("part", "color_id") DO UPDATE SET + "color_name" = COALESCE(excluded."color_name", "rebrickable_parts"."color_name"), + "color_rgb" = COALESCE(excluded."color_rgb", "rebrickable_parts"."color_rgb"), + "color_transparent" = COALESCE(excluded."color_transparent", "rebrickable_parts"."color_transparent"), + "bricklink_color_id" = COALESCE(excluded."bricklink_color_id", "rebrickable_parts"."bricklink_color_id"), + "bricklink_color_name" = COALESCE(excluded."bricklink_color_name", "rebrickable_parts"."bricklink_color_name"), + "name" = COALESCE(excluded."name", "rebrickable_parts"."name"), + "image" = COALESCE(excluded."image", "rebrickable_parts"."image"), + "image_id" = COALESCE(excluded."image_id", "rebrickable_parts"."image_id"), + "url" = COALESCE(excluded."url", "rebrickable_parts"."url") diff --git a/bricktracker/sql/rebrickable_parts/select/image_by_part_color.sql b/bricktracker/sql/rebrickable_parts/select/image_by_part_color.sql new file mode 100644 index 0000000..adc19c6 --- /dev/null +++ b/bricktracker/sql/rebrickable_parts/select/image_by_part_color.sql @@ -0,0 +1,3 @@ +-- Get image URL for a part/color combination +SELECT "image" FROM "rebrickable_parts" +WHERE "part" = :part AND "color_id" = :color_id