75 lines
1.9 KiB
SQL
75 lines
1.9 KiB
SQL
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);
|