From 131da5e69ef215b2235f96085e63823e15a63e0b Mon Sep 17 00:00:00 2001 From: Rikard Bartholf Date: Thu, 11 Aug 2016 07:55:31 +0200 Subject: [PATCH] P5-801 Add specialized views for eSales export --- migrations/000.013.sql | 74 +++++++++++++ migrations/000.014.sql | 75 +++++++++++++ migrations/000.015.sql | 245 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 394 insertions(+) create mode 100644 migrations/000.013.sql create mode 100644 migrations/000.014.sql create mode 100644 migrations/000.015.sql diff --git a/migrations/000.013.sql b/migrations/000.013.sql new file mode 100644 index 0000000..d428c16 --- /dev/null +++ b/migrations/000.013.sql @@ -0,0 +1,74 @@ +DROP MATERIALIZED VIEW IF EXISTS v_esales_categorytree_i18n; +-- REFRESH MATERIALIZED VIEW v_esales_categorytree_i18n; + +CREATE MATERIALIZED VIEW v_esales_categorytree_i18n AS +SELECT *, + -- Remove diacritics and other stuff + REGEXP_REPLACE( + UNACCENT(REPLACE(REPLACE(path, ' ', '_'), '&', 'and')), + '[^\w/\-]', '', 'g' + ) AS path_translated + FROM ( + SELECT c.id, + ( + SELECT id + FROM categories s + WHERE s.lft < c.lft AND s.rgt > c.rgt + ORDER BY s.rgt-c.rgt ASC + LIMIT 1 + ) AS parent_id, + locale_id, + locale, + c.name, + ( + SELECT LOWER(array_to_string(array_agg(main.parent_name), '/')) AS path + FROM ( + SELECT node.id, + ( + SELECT name + FROM category_texts + WHERE locale_id = c.locale_id + AND category_id = parent.id + ) AS parent_name + FROM categories node, + categories parent + WHERE node.lft BETWEEN parent.lft AND parent.rgt + AND node.id = c.id + ORDER BY parent.lft + ) main + GROUP BY main.id + ) AS path, + CASE c.rgt - c.lft + WHEN 1 THEN 1 + ELSE 0 + END AS is_leaf, + ( + SELECT count(*) - 1 + FROM categories node, + categories parent + WHERE node.lft BETWEEN parent.lft AND parent.rgt AND node.id = c.id + ) AS depth, + ( + SELECT count(*) - 1 + FROM categories c1 + WHERE c1.lft BETWEEN c.lft AND c.rgt + ) AS child_count, + c.lft, + c.rgt + FROM ( + SELECT c.id, + s.id AS locale_id, + s.value AS locale, + LOWER(s_t.name) AS name, + rgt, + lft + FROM locales s + JOIN category_texts s_t ON s.id = s_t.locale_id + JOIN categories c ON s_t.category_id = c.id + ORDER BY s.id, c.lft + ) c +) main; + +-- DROP INDEX v_esales_categorytree_i18n_id_locale_id; +CREATE UNIQUE INDEX v_esales_categorytree_i18n_id_locale_id + ON v_esales_categorytree_i18n (id, locale_id); diff --git a/migrations/000.014.sql b/migrations/000.014.sql new file mode 100644 index 0000000..701219a --- /dev/null +++ b/migrations/000.014.sql @@ -0,0 +1,75 @@ +-- DROP MATERIALIZED VIEW v_esales_printproduct; +-- REFRESH MATERIALIZED VIEW v_esales_printproduct; +-- CREATE MATERIALIZED VIEW v_esales_printproduct +CREATE MATERIALIZED VIEW v_esales_printproduct AS +SELECT main.id, + main.product_id, + main.path, + main.article_number, + main.title, + main.group_id, + main.group_name, + main.type_id, + main.type_name, + main.price, + main.image, + main.thumbnail, + main.width, + main.height, + CASE + WHEN main.width::integer > main.height::integer THEN 'landscape'::text + WHEN main.width::integer < main.height::integer THEN 'portrait'::text + ELSE 'square'::text + END AS orientation + FROM ( + SELECT pp.printid AS id, + pp.productid AS product_id, + (SELECT path FROM "product-products" WHERE productid = pp.productid LIMIT 1) AS path, + ( + SELECT value FROM "product-products_fields" WHERE productid = pp.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'artNo' LIMIT 1) + ) AS article_number, + ( + SELECT value FROM "product-products_fields" WHERE productid = pp.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'name' LIMIT 1) + ) AS title, + pp.groupid AS group_id, + ( + SELECT "group" + FROM "product-groups" + WHERE groupid = pp.groupid + LIMIT 1 + ) AS group_name, + pp.typeid AS type_id, + ( + SELECT type + FROM "product-types" + WHERE typeid = pp.typeid + LIMIT 1 + ) AS type_name, + ( + ( + SELECT min(price) AS min + FROM "product-printprices" + WHERE groupid = pp.groupid + ) * COALESCE( + ( + SELECT 1 + designers.pricepremium / 100 + FROM designers + WHERE designers.designerid = ( + SELECT designerid FROM "product-products" WHERE productid = pp.productid LIMIT 1) + ), 1) + ) AS price, + ('//images.photowall.com/products/' || pp.productid) || '.jpg' AS image, + ('//images.photowall.com/products/' || pp.productid) || '.jpg?w=80' AS thumbnail, + (SELECT value FROM "product-products_fields" WHERE productid = pp.productid AND fieldid = 5 LIMIT 1) AS width, + (SELECT value FROM "product-products_fields" WHERE productid = pp.productid AND fieldid = 3 LIMIT 1) AS height + FROM "product-printproducts" pp + ) main; + +-- DROP INDEX v_categorytree_i18n_id_locale_id; +CREATE UNIQUE INDEX v_esales_printproduct_id + ON v_esales_printproduct (id); + +CREATE INDEX v_esales_printproduct_product_id + ON v_esales_printproduct (product_id); diff --git a/migrations/000.015.sql b/migrations/000.015.sql new file mode 100644 index 0000000..974e4c3 --- /dev/null +++ b/migrations/000.015.sql @@ -0,0 +1,245 @@ +-- DROP MATERIALIZED VIEW v_esales_product; +-- REFRESH MATERIALIZED VIEW v_esales_product; +CREATE MATERIALIZED VIEW v_esales_product AS +SELECT main.product_id AS id, + main."artNo", + stock.id AS stock_id, + stock.price AS stock_price, + main.path, + main.visible, + main.browsable, + main.designerid, + main.designercollection_id, + COALESCE(( + SELECT pricepremium / 100 + FROM designers + WHERE designerid = main.designerid + LIMIT 1 + ), 0) AS designer_margin, + ( + SELECT typeid + FROM "product-printproducts" + WHERE productid = main.product_id + LIMIT 1 + ) AS producttype_id, + main.name, + main.height, + main.original_article_number, + main.width, + main.widths, + main.min_height, + main.min_width, + main.max_height, + main.max_width, + main.photowall_resolution, + main.canvas_resolution, + main.wallpaper_resolution, + main.lock_height, + COALESCE(main.additionalprice, 0::double precision) AS additionalprice, + main.ref1, + main.ref2, + main.ref3, + main.copyright, + main.proportions_warning, + main.margin_width_max, + main.margin_width_min, + main.margin_height_max, + main.margin_height_min, + main.width::numeric / + CASE + WHEN main.height = 0 THEN (-1.0) + ELSE main.height::numeric + END AS width_height_ratio, + main.batch, + main.image_resolution, + main."focusXpoint", + main."focusYpoint", + main."focusXpoint2", + main."focusYpoint2", + main.repeating_pattern + FROM + ( + SELECT products.productid AS product_id, + products.path, + products.visible, + products.browsable, + products.designerid, + products.designercollectionid AS designercollection_id, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'artNo' LIMIT 1) + ) AS "artNo", + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'name' LIMIT 1) + ) AS name, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'height' LIMIT 1) + AND value ~ '^\d+$' + )::integer AS height, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'orgArtNo' LIMIT 1) + ) AS original_article_number, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'width' LIMIT 1) + AND value ~ '^\d+$' + )::integer AS width, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'widths' LIMIT 1) + ) AS widths, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'min-height' LIMIT 1) + AND value ~ '^\d+$' + )::integer AS min_height, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'min-width' LIMIT 1) + AND value ~ '^\d+$' + )::integer AS min_width, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'max-height' LIMIT 1) + AND value ~ '^\d+$' + )::integer AS max_height, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'max-width' LIMIT 1) + AND value ~ '^\d+$' + )::integer AS max_width, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'photowall_resolution' LIMIT 1) + AND value ~ '^\d+$' + )::integer AS photowall_resolution, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'canvas_resolution' LIMIT 1) + AND value ~ '^\d+$' + )::integer AS canvas_resolution, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'wallpaper_resolution' LIMIT 1) + AND value ~ '^\d+$' + )::integer AS wallpaper_resolution, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'lock_height' LIMIT 1) + ) AS lock_height, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'additionalprice' LIMIT 1) + )::double precision AS additionalprice, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'ref1' LIMIT 1) + ) AS ref1, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'ref2' LIMIT 1) + ) AS ref2, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'ref3' LIMIT 1) + ) AS ref3, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'copyright' LIMIT 1) + ) AS copyright, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'proportions_warning' LIMIT 1) + ) AS proportions_warning, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'margin_width_max' LIMIT 1) + ) AS margin_width_max, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'margin_width_min' LIMIT 1) + ) AS margin_width_min, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'margin_height_max' LIMIT 1) + ) AS margin_height_max, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'margin_height_min' LIMIT 1) + ) AS margin_height_min, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'batch' LIMIT 1) + ) AS batch, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'image_resolution' LIMIT 1) + AND value ~ '^\d+$' + )::integer AS image_resolution, + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'focusXpoint' LIMIT 1) + )::double precision AS "focusXpoint", + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'focusYpoint' LIMIT 1) + )::double precision AS "focusYpoint", + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'focusXpoint2' LIMIT 1) + )::double precision AS "focusXpoint2", + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'focusYpoint2' LIMIT 1) + )::double precision AS "focusYpoint2", + + ( + SELECT value FROM "product-products_fields" WHERE productid = products.productid + AND fieldid = (SELECT fieldid FROM "product-fields" WHERE field = 'repeating_pattern' LIMIT 1) + ) AS repeating_pattern + + FROM "product-products" products + ) main + LEFT JOIN ( + SELECT stockid AS id, + productid AS product_id, + (SELECT price FROM "product-stockprices" WHERE priceid = s.priceid LIMIT 1) AS price + FROM "product-stockproducts" s + ) stock ON main.product_id = stock.product_id; + +-- DROP INDEX v_product_id; +CREATE UNIQUE INDEX v_esales_product_id + ON v_esales_product (id);