VvebOIDC/admin/sql/pgsql/category.sql

750 lines
17 KiB
SQL

-- Categories
-- get all categories
CREATE PROCEDURE getCategories(
-- variables
IN language_id INT,
IN taxonomy_id INT,
IN site_id INT,
IN post_id INT,
IN product_id INT,
IN count INT,
IN search CHAR,
IN type CHAR,
IN post_type CHAR,
-- pagination
IN start INT,
IN limit INT,
-- return array of categories for categories query
OUT fetch_all,
-- return categories count for count query
OUT fetch_one
)
BEGIN
SELECT DISTINCT categories.taxonomy_item_id, categories.*, tc.language_id, tc.name, tc.content, tc.slug, tc.content, categories.taxonomy_item_id as array_key
@IF isset(:count) AND :count
THEN
,count(post_id) as count
END @IF
@IF isset(:post_id)
THEN
,pt.post_id as checked
END @IF
@IF isset(:product_id)
THEN
,pt.product_id as checked
END @IF
FROM taxonomy_item AS categories
INNER JOIN taxonomy_to_site t2s ON (categories.taxonomy_item_id = t2s.taxonomy_item_id AND t2s.site_id = :site_id)
INNER JOIN taxonomy_item_content tc ON (categories.taxonomy_item_id = tc.taxonomy_item_id AND tc.language_id = :language_id)
INNER JOIN taxonomy t ON (categories.taxonomy_id = t.taxonomy_id)
@IF isset(:count) AND :count
THEN
LEFT JOIN post_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id)
END @IF
@IF isset(:post_id) AND :type == "categories"
THEN
-- LEFT JOIN post_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id AND pt.post_id = :post_id)
END @IF
@IF isset(:post_id) THEN
@IF :type == "tags"
THEN
INNER JOIN post_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id AND pt.post_id = :post_id)
@ELSE
LEFT JOIN post_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id AND pt.post_id = :post_id)
END @IF
END @IF
@IF isset(:product_id) THEN
@IF :type == "tags"
THEN
INNER JOIN product_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id AND pt.product_id = :product_id)
@ELSE
LEFT JOIN product_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id AND pt.product_id = :product_id)
END @IF
END @IF
WHERE
tc.language_id = :language_id AND t2s.site_id = :site_id
@IF isset(:search) && :search
THEN
AND tc.name LIKE :search
END @IF
@IF isset(:type)
THEN
AND t.type = :type
END @IF
@IF isset(:post_type)
THEN
AND t.post_type = :post_type
END @IF
@IF isset(:parent_id)
THEN
AND categories.parent_id = :parent_id
END @IF
@IF isset(:taxonomy_id)
THEN
AND categories.taxonomy_id = :taxonomy_id
END @IF
@IF isset(:count) AND :count
THEN
GROUP BY categories.taxonomy_item_id, tc.language_id
END @IF
@IF isset(:count) AND :count
THEN
ORDER BY count
@ELSE
ORDER BY categories.parent_id, categories.sort_order, categories.taxonomy_item_id
END @IF
@IF isset(:limit) && !empty(:limit)
THEN
@SQL_LIMIT(:start, :limit)
END @IF
;
SELECT count(*) FROM (
@SQL_COUNT(categories.taxonomy_item_id, taxonomy_item) -- this takes previous query removes limit and replaces select columns with parameter taxonomy_item_id
) as count;
END-- get all categories
CREATE PROCEDURE getCategoriesPages(
-- variables
IN language_id INT,
IN taxonomy_id INT,
IN site_id INT,
IN post_id INT,
IN parent_id INT,
IN search CHAR,
IN type CHAR,
-- pagination
IN start INT,
IN limit INT,
IN posts_start INT,
IN posts_limit INT,
-- return array of categories for categories query
OUT affected_rows,
-- return array of categories for categories query
OUT fetch_all,
-- return categories count for count query
OUT fetch_one
)
BEGIN
SELECT DISTINCT categories.taxonomy_item_id, categories.*, tc.*, tc.content as content, categories.taxonomy_item_id as array_key
@IF isset(:post_id)
THEN
,pt.post_id as checked
END @IF
-- ,(SELECT CONCAT('[', GROUP_CONCAT('{"post_id":"', pc.post_id, '","slug":"' , pc.slug,'","sort_order":"' , p.sort_order, '","name":"' , pc.name, '"}'), ']')
,(SELECT json_agg(json_build_object('post_id',pc.post_id,'slug',pc.slug,'slug',pc.slug,'sort_order',p.sort_order,'name',pc.name))
FROM post_content pc
LEFT JOIN post p ON (pc.post_id = p.post_id)
LEFT JOIN post_to_taxonomy_item ptt ON (ptt.taxonomy_item_id = categories.taxonomy_item_id AND ptt.post_id = p.post_id)
WHERE ptt.taxonomy_item_id = categories.taxonomy_item_id ORDER BY p.sort_order
) AS post
FROM taxonomy_item AS categories
INNER JOIN taxonomy_to_site t2s ON (categories.taxonomy_item_id = t2s.taxonomy_item_id AND t2s.site_id = :site_id)
INNER JOIN taxonomy_item_content tc ON (categories.taxonomy_item_id = tc.taxonomy_item_id AND tc.language_id = :language_id)
INNER JOIN taxonomy t ON (categories.taxonomy_id = t.taxonomy_id)
@IF isset(:post_id) AND :type == "categories"
THEN
-- LEFT JOIN post_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id AND pt.post_id = :post_id)
END @IF
@IF isset(:post_id) AND :type == "tags"
THEN
INNER JOIN post_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id AND pt.post_id = :post_id)
@ELSE
LEFT JOIN post_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id)
END @IF
WHERE
tc.language_id = :language_id AND t2s.site_id = :site_id
@IF isset(:search)
THEN
AND tc.name LIKE :search
END @IF
@IF isset(:type)
THEN
AND t.type = :type
END @IF
@IF isset(:taxonomy_id)
THEN
AND categories.taxonomy_id = :taxonomy_id
END @IF
@IF isset(:parent_id)
THEN
AND categories.parent_id = :parent_id
END @IF
ORDER BY categories.parent_id, categories.sort_order, categories.taxonomy_item_id
@IF isset(:limit) && !empty(:limit)
THEN
@SQL_LIMIT(:start, :limit)
END @IF
;
SELECT count(*) FROM (
@SQL_COUNT(categories.taxonomy_item_id, taxonomy_item) -- this takes previous query removes limit and replaces select columns with parameter taxonomy_item_id
) as count;
END
-- get one taxonomy_item
CREATE PROCEDURE getCategory(
IN taxonomy_item_id INT,
IN post_id INT,
IN product_id INT,
IN post_type CHAR,
IN type CHAR,
IN slug CHAR,
OUT fetch_row
)
BEGIN
-- taxonomy_item
SELECT *
FROM taxonomy_item as _ -- (underscore) _ means that data will be kept in main array
@IF isset(:post_id) THEN
@IF :type == "tags"
THEN
INNER JOIN post_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id AND pt.post_id = :post_id)
@ELSE
LEFT JOIN post_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id AND pt.post_id = :post_id)
END @IF
END @IF
@IF isset(:product_id) THEN
@IF :type == "tags"
THEN
INNER JOIN product_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id AND pt.product_id = :product_id)
@ELSE
LEFT JOIN product_to_taxonomy_item pt ON (categories.taxonomy_item_id = pt.taxonomy_item_id AND pt.product_id = :product_id)
END @IF
END @IF
WHERE
1 = 1
@IF isset(:taxonomy_item_id)
THEN
AND _.taxonomy_item_id = :taxonomy_item_id
END @IF
@IF isset(:post_type)
THEN
AND _.post_type = :post_type
END @IF
@IF isset(:post_id)
THEN
,pt.post_id as checked
END @IF
@IF isset(:product_id)
THEN
,pt.product_id as checked
END @IF
LIMIT 1;
-- content
SELECT *, language_id as _ -- (underscore) _ column means that this column (language_id) value will be used as array key when adding row to result array
FROM taxonomy_item_content
WHERE taxonomy_item_id = :taxonomy_item_id;
-- SELECT *,taxonomy_item_option_id as _
-- FROM taxonomy_item_option WHERE taxonomy_item_id = :taxonomy_item_id;
--@EACH(taxonomy_item_option, taxonomy_item_option_value)
-- SELECT *, taxonomy_item_option_value_id as _ FROM taxonomy_item_option_value pov
-- WHERE taxonomy_item_option_id = :taxonomy_item_option[taxonomy_item_option_id];
END
CREATE PROCEDURE getCategoryBySlug(
IN taxonomy_item_id INT,
IN parent_id INT,
IN language_id INT,
IN site_id INT,
IN post_type CHAR,
IN slug CHAR,
OUT fetch_row
)
BEGIN
-- content
SELECT *, _.name as name -- (underscore) _ column means that this column (language_id) value will be used as array key when adding row to result array
FROM taxonomy_item_content AS _
LEFT JOIN taxonomy_item as ti ON (_.taxonomy_item_id = ti.taxonomy_item_id)
LEFT JOIN taxonomy t ON (ti.taxonomy_id = t.taxonomy_id)
@IF isset(:site_id)
THEN
LEFT JOIN taxonomy_to_site tt ON (tt.taxonomy_item_id = ti.taxonomy_item_id)
END @IF
WHERE 1 = 1
@IF isset(:taxonomy_item_id)
THEN
AND _.taxonomy_item_id = :taxonomy_item_id
END @IF
@IF isset(:slug)
THEN
AND slug = :slug
END @IF
@IF isset(:parent_id)
THEN
AND parent_id = :parent_id
END @IF
@IF isset(:language_id)
THEN
AND language_id = :language_id
END @IF
@IF isset(:post_type)
THEN
AND t.post_type = :post_type
END @IF
@IF isset(:site_id)
THEN
AND tt.site_id = :site_id
END @IF
LIMIT 1;
-- images
-- SELECT *, taxonomy_item_image_id as _
-- FROM taxonomy_item_image as images
-- WHERE taxonomy_item_id = :taxonomy_item_id;
-- SELECT *,taxonomy_item_option_id as _
-- FROM taxonomy_item_option WHERE taxonomy_item_id = :taxonomy_item_id;
-- @EACH(taxonomy_item_option, taxonomy_item_option_value)
-- SELECT *, taxonomy_item_option_value_id as _ FROM taxonomy_item_option_value pov
-- WHERE taxonomy_item_option_id = :taxonomy_item_option[taxonomy_item_option_id];
END
-- Edit taxonomy_item
CREATE PROCEDURE editCategory(
IN taxonomy_item ARRAY,
IN taxonomy_item_content ARRAY,
IN taxonomy_item_id INT,
OUT insert_id,
OUT affected_rows
)
BEGIN
DELETE FROM taxonomy_item_content WHERE taxonomy_item_id = :taxonomy_item_id;
@FILTER(:taxonomy_item_content, taxonomy_item_content)
@EACH(:taxonomy_item_content)
INSERT INTO taxonomy_item_content
( @KEYS(:each), taxonomy_item_id, meta_title, meta_description, meta_keywords )
VALUES ( :each, :taxonomy_item_id, '', '', '' );
-- SELECT * FROM taxonomy_item_option WHERE taxonomy_item_id = :taxonomy_item_id;
-- allow only table fields and set defaults for missing values
@FILTER(:taxonomy_item, taxonomy_item)
UPDATE taxonomy_item
SET @LIST(:taxonomy_item)
WHERE taxonomy_item_id = :taxonomy_item_id
END
-- Add new taxonomy_item
CREATE PROCEDURE addCategory(
IN taxonomy_item ARRAY,
IN taxonomy_item_content ARRAY,
IN site_id INT,
OUT fetch_one,
OUT insert_id,
OUT insert_id
)
BEGIN
-- allow only table fields and set defaults for missing values
:taxonomy_item = @FILTER(:taxonomy_item, taxonomy_item)
:taxonomy_item_content = @FILTER(:taxonomy_item_content, taxonomy_item_content)
INSERT INTO taxonomy_item
( @KEYS(:taxonomy_item) )
VALUES ( :taxonomy_item ) RETURNING taxonomy_item_id;
INSERT INTO taxonomy_item_content
( taxonomy_item_id, @KEYS(:taxonomy_item_content) )
VALUES ( @result.taxonomy_item, :taxonomy_item_content );
INSERT INTO taxonomy_to_site
( taxonomy_item_id, site_id )
VALUES ( @result.taxonomy_item, :site_id );
END
CREATE PROCEDURE getCategoriesAllLanguages(
-- variables
IN language_id INT,
IN user_group_id INT,
IN site_id INT,
IN taxonomy_id INT,
IN search CHAR,
IN type CHAR,
IN post_type CHAR,
-- pagination
IN start INT,
IN limit INT,
-- return array of categories for categories query
OUT fetch_all,
-- return categories count for count query
OUT fetch_one
)
BEGIN
SELECT *,
(
SELECT
json_agg(json_build_object(
'language_id', tc.language_id,
'name' , tc.name,
'slug' , tc.slug,
'content' , tc.content,
'meta_title' , tc.meta_title,
'meta_description' , tc.meta_description,
'meta_keywords' , tc.meta_keywords) )
FROM taxonomy_item_content as tc
WHERE
tc.taxonomy_item_id = categories.taxonomy_item_id GROUP BY tc.taxonomy_item_id
) as languages
FROM taxonomy_item AS categories
LEFT JOIN taxonomy_to_site t2s ON (categories.taxonomy_item_id = t2s.taxonomy_item_id)
LEFT JOIN taxonomy ON (categories.taxonomy_id = taxonomy.taxonomy_id)
WHERE
t2s.site_id = :site_id
@IF isset(:search) && :search
THEN
AND tc.name LIKE :search
END @IF
@IF isset(:taxonomy_id)
THEN
AND categories.taxonomy_id = :taxonomy_id
END @IF
@IF isset(:type) && :type
THEN
AND taxonomy.type = :type
END @IF
@IF isset(:post_type) && :post_type
THEN
AND taxonomy.post_type = :post_type
END @IF
ORDER BY categories.parent_id, categories.sort_order, categories.taxonomy_item_id
@IF isset(:limit) && !empty(:limit)
THEN
@SQL_LIMIT(:start, :limit)
END @IF
;
SELECT count(*) FROM (
@SQL_COUNT(categories.taxonomy_item_id, taxonomy_item) -- this takes previous query removes limit and replaces select columns with parameter product_id
) as count;
END
-- Edit menu
CREATE PROCEDURE editTaxonomyItem(
IN taxonomy_item ARRAY,
IN taxonomy_item_content ARRAY,
IN taxonomy_item_id INT,
OUT insert_id
)
BEGIN
-- allow only table fields and set defaults for missing values
:taxonomy_item_content_data = @FILTER(:taxonomy_item_content, taxonomy_item_content)
@EACH(:taxonomy_item_content_data)
INSERT INTO taxonomy_item_content
( @KEYS(:each), taxonomy_item_id)
VALUES ( :each, :taxonomy_item_id)
ON CONFLICT("taxonomy_item_id","language_id")
DO UPDATE SET @LIST(:each);
-- allow only table fields and set defaults for missing values
@FILTER(:taxonomy_item, taxonomy_item)
UPDATE taxonomy_item
SET @LIST(:taxonomy_item)
WHERE taxonomy_item_id = :taxonomy_item_id;
END
-- Add new menu
CREATE PROCEDURE addTaxonomyItem(
IN taxonomy_item ARRAY,
IN taxonomy_item_content ARRAY,
IN site_id INT,
OUT fetch_one,
OUT insert_id
)
BEGIN
-- allow only table fields and set defaults for missing values
:taxonomy_item_content_data = @FILTER(:taxonomy_item_content, taxonomy_item_content)
:taxonomy_item_data = @FILTER(:taxonomy_item, taxonomy_item)
INSERT INTO taxonomy_item
( @KEYS(:taxonomy_item_data) )
VALUES ( :taxonomy_item_data ) RETURNING taxonomy_item_id;
INSERT INTO taxonomy_to_site
( taxonomy_item_id , site_id )
VALUES ( @result.taxonomy_item, :site_id );
@EACH(:taxonomy_item_content_data)
INSERT INTO taxonomy_item_content
( taxonomy_item_id, @KEYS(:each) )
VALUES ( @result.taxonomy_item, :each );
END
-- Reorder menu items
CREATE PROCEDURE updateTaxonomyItems(
IN taxonomy_items ARRAY,
OUT insert_id
)
BEGIN
:taxonomy_item_data = @FILTER(:taxonomy_items, taxonomy_item)
@EACH(:taxonomy_item_data)
UPDATE taxonomy_item
SET @LIST(:each)
WHERE taxonomy_item_id = :each.taxonomy_item_id;
END
-- Delete menu item
CREATE PROCEDURE deleteTaxonomyItem(
IN taxonomy_item_id ARRAY,
OUT insert_id
)
BEGIN
-- delete taxonomy_item_content
DELETE FROM taxonomy_item_content WHERE taxonomy_item_id IN (
WITH RECURSIVE tree AS (
SELECT taxonomy_item_id,
parent_id
FROM taxonomy_item
WHERE taxonomy_item_id IN(:taxonomy_item_id)
UNION ALL
SELECT p.taxonomy_item_id,
p.parent_id
FROM taxonomy_item p
JOIN tree t ON t.taxonomy_item_id = p.parent_id
)
SELECT taxonomy_item_id FROM tree);
-- delete taxonomy_item
DELETE FROM taxonomy_item WHERE taxonomy_item_id IN (
WITH RECURSIVE tree AS (
SELECT taxonomy_item_id,
parent_id
FROM taxonomy_item
WHERE taxonomy_item_id IN(:taxonomy_item_id)
UNION ALL
SELECT p.taxonomy_item_id,
p.parent_id
FROM taxonomy_item p
JOIN tree t ON t.taxonomy_item_id = p.parent_id
)
SELECT taxonomy_item_id FROM tree);
END