File indexing completed on 2024-04-21 06:00:36

0001 DROP PROCEDURE IF EXISTS `generate_stat_store_prod_count`;
0002 
0003 DELIMITER $$
0004 CREATE
0005     DEFINER = CURRENT_USER PROCEDURE `generate_stat_store_prod_count`()
0006 BEGIN
0007 
0008     DECLARE `v_finished` INTEGER DEFAULT 0;
0009     DECLARE `v_store_id` varchar(255) DEFAULT "";
0010     DECLARE `v_store_tag_ids` varchar(255) DEFAULT "";
0011 
0012     DECLARE `idx`,`prev_idx` int;
0013     DECLARE `v_id` varchar(10);
0014 
0015 -- declare cursor for employee email
0016     DECLARE `store_cursor` CURSOR FOR
0017         SELECT * FROM `tmp_stat_store_tagids`;
0018 
0019 -- declare NOT FOUND handler
0020     DECLARE CONTINUE HANDLER
0021         FOR NOT FOUND SET `v_finished` = 1;
0022 
0023 
0024     DROP TABLE IF EXISTS `tmp_stat_store_tagids`;
0025     CREATE TEMPORARY TABLE `tmp_stat_store_tagids`
0026     AS
0027     SELECT `cs`.`store_id`,
0028            GROUP_CONCAT(`ct`.`tag_id`
0029                         ORDER BY `ct`.`tag_id`) AS `tag_ids`
0030     FROM `config_store` `cs`
0031              LEFT JOIN
0032          `config_store_tag` `ct` ON `ct`.`store_id` = `cs`.`store_id`
0033              AND `ct`.`is_active` = 1
0034 #WHERE `cs`.`store_id` = 7
0035     GROUP BY `cs`.`store_id`;
0036 
0037 
0038     DROP TABLE IF EXISTS `tmp_stat_store_prod_count`;
0039     CREATE TABLE `tmp_stat_store_prod_count`
0040     (
0041         `project_category_id` INT(11)      NOT NULL,
0042         `tag_id`              VARCHAR(255) NULL,
0043         `count_product`       INT(11)      NULL,
0044         `stores`              VARCHAR(255) NULL,
0045         INDEX `idx_tag` (`project_category_id`, `tag_id`)
0046     )
0047         ENGINE MyISAM
0048     AS
0049     SELECT `sct2`.`project_category_id`,
0050            NULL                             AS `tag_id`,
0051            count(DISTINCT `p`.`project_id`) AS `count_product`
0052     FROM `stat_cat_tree` AS `sct1`
0053              JOIN `stat_cat_tree` AS `sct2` ON `sct1`.`lft` BETWEEN `sct2`.`lft` AND `sct2`.`rgt`
0054              LEFT JOIN `stat_projects` AS `p` ON `p`.`project_category_id` = `sct1`.`project_category_id`
0055     WHERE `p`.`amount_reports` IS NULL
0056     GROUP BY `sct2`.`project_category_id`;
0057 
0058 
0059     OPEN `store_cursor`;
0060 
0061     `get_store`:
0062         LOOP
0063 
0064             FETCH `store_cursor` INTO `v_store_id`, `v_store_tag_ids`;
0065 
0066             IF `v_finished` = 1 THEN
0067                 LEAVE `get_store`;
0068             END IF;
0069 
0070             -- build email list
0071 
0072 
0073             SET @`sql` = '
0074       INSERT INTO tmp_stat_store_prod_count
0075         SELECT
0076           sct2.project_category_id,
0077           tg.tag_ids as tag_id,
0078           count(distinct p.project_id) as count_product,
0079           tg.store_id
0080         FROM stat_cat_tree as sct1
0081           JOIN stat_cat_tree as sct2 ON sct1.lft between sct2.lft AND sct2.rgt
0082           JOIN stat_projects as p ON p.project_category_id = sct1.project_category_id
0083           JOIN tmp_stat_store_tagids tg
0084           
0085         WHERE p.amount_reports is null
0086         ';
0087             SET @`sql` = CONCAT(@`sql`, ' AND tg.store_id = ', `v_store_id`, ' ');
0088             SET @`sql` = CONCAT(@`sql`, ' AND (1=1 ');
0089 
0090             SET `idx` := locate(',', `v_store_tag_ids`, 1);
0091 
0092             IF LENGTH(`v_store_tag_ids`) > 0 THEN
0093 
0094                 IF `idx` > 0 THEN
0095                     SET `prev_idx` := 1;
0096                     WHILE `idx` > 0 DO
0097                     SET `v_id` := substr(`v_store_tag_ids`, `prev_idx`, `idx` - `prev_idx`);
0098                     SET @`sql` = CONCAT(@`sql`, ' AND FIND_IN_SET(', `v_id`, ', p.tag_ids) ');
0099                     SET `prev_idx` := `idx` + 1;
0100                     SET `idx` := locate(',', `v_store_tag_ids`, `prev_idx`);
0101 
0102                     IF `idx` = 0 THEN
0103                         SET `v_id` := substr(`v_store_tag_ids`, `prev_idx`);
0104                         SET @`sql` = CONCAT(@`sql`, ' AND FIND_IN_SET(', `v_id`, ', p.tag_ids) ');
0105                     END IF;
0106                     END WHILE;
0107                 ELSE
0108 
0109                     SET @`sql` = CONCAT(@`sql`, ' AND FIND_IN_SET(', `v_store_tag_ids`, ', p.tag_ids) ');
0110 
0111                 END IF;
0112             END IF;
0113 
0114             SET @`sql` = CONCAT(@`sql`, ') ');
0115             SET @`sql` = CONCAT(@`sql`, 'GROUP BY sct2.lft, tg.tag_ids,tg.store_id');
0116 
0117             SELECT @`sql`;
0118 
0119             PREPARE `stmt` FROM @`sql`;
0120             EXECUTE `stmt`;
0121             DEALLOCATE PREPARE `stmt`;
0122 
0123         END LOOP `get_store`;
0124 
0125     CLOSE `store_cursor`;
0126 
0127 
0128     IF EXISTS(SELECT `table_name`
0129               FROM `INFORMATION_SCHEMA`.`TABLES`
0130               WHERE `table_schema` = DATABASE()
0131                 AND `table_name` = 'stat_store_prod_count')
0132     THEN
0133         RENAME TABLE
0134             `stat_store_prod_count` TO `old_stat_store_prod_count`,
0135             `tmp_stat_store_prod_count` TO `stat_store_prod_count`;
0136 
0137     ELSE
0138         RENAME TABLE
0139             `tmp_stat_store_prod_count` TO `stat_store_prod_count`;
0140 
0141     END IF;
0142 
0143 
0144     DROP TABLE IF EXISTS `old_stat_store_prod_count`;
0145 
0146 END$$
0147 
0148 
0149 CREATE PROCEDURE `fetchCatTreeWithTagsForStore`(IN `STORE_ID` INT(11),
0150                                                 IN `TAGS` VARCHAR(255))
0151 BEGIN
0152     DROP TABLE IF EXISTS `tmp_store_cat_tags`;
0153     CREATE TEMPORARY TABLE `tmp_store_cat_tags`
0154     (
0155         INDEX `idx_cat_id` (`project_category_id`)
0156     )
0157         ENGINE MEMORY
0158     AS
0159     SELECT `csc`.`store_id`,
0160            `csc`.`project_category_id`,
0161            `csc`.`order`,
0162            `pc`.`title`,
0163            `pc`.`lft`,
0164            `pc`.`rgt`
0165     FROM `config_store_category` AS `csc`
0166              JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id`
0167     WHERE `csc`.`store_id` = `STORE_ID`
0168     GROUP BY `csc`.`store_category_id`
0169     ORDER BY `csc`.`order`, `pc`.`title`;
0170 
0171     SET @`NEW_ORDER` := 0;
0172 
0173     UPDATE `tmp_store_cat_tags`
0174     SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10);
0175 
0176     SELECT `sct`.`lft`,
0177            `sct`.`rgt`,
0178            `sct`.`project_category_id`             AS `id`,
0179            `sct`.`title`,
0180            `scpc`.`count_product`                  AS `product_count`,
0181            `sct`.`xdg_type`,
0182            `sct`.`name_legacy`,
0183            if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`,
0184            (SELECT `project_category_id`
0185             FROM `stat_cat_tree` AS `sct2`
0186             WHERE `sct2`.`lft` < `sct`.`lft`
0187               AND `sct2`.`rgt` > `sct`.`rgt`
0188             ORDER BY `sct2`.`rgt` - `sct`.`rgt`
0189             LIMIT 1)                               AS `parent_id`
0190     FROM `tmp_store_cat_tags` AS `cfc`
0191              JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`)
0192         #LEFT JOIN `stat_store_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` = TAGS
0193              JOIN `stat_store_prod_count` AS `scpc`
0194                   ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`stores` = `STORE_ID`
0195     WHERE `cfc`.`store_id` = `STORE_ID`
0196     ORDER BY `cfc`.`order`, `sct`.`lft`;
0197 END$$
0198 
0199 
0200 
0201 CREATE PROCEDURE `fetchCatTreeWithTags`(IN `STORE_ID` int(11),
0202                                         IN `TAGS` VARCHAR(255))
0203 BEGIN
0204     DROP TABLE IF EXISTS `tmp_store_cat_tags`;
0205     CREATE TEMPORARY TABLE `tmp_store_cat_tags`
0206     (
0207         INDEX `idx_cat_id` (`project_category_id`)
0208     )
0209         ENGINE MEMORY
0210     AS
0211     SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt`
0212     FROM `config_store_category` AS `csc`
0213              JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id`
0214     WHERE `csc`.`store_id` = `STORE_ID`
0215     GROUP BY `csc`.`store_category_id`
0216     ORDER BY `csc`.`order`, `pc`.`title`;
0217 
0218     SET @`NEW_ORDER` := 0;
0219 
0220     UPDATE `tmp_store_cat_tags` SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10);
0221 
0222     SELECT `sct`.`lft`,
0223            `sct`.`rgt`,
0224            `sct`.`project_category_id`             AS `id`,
0225            `sct`.`title`,
0226            `scpc`.`count_product`                  AS `product_count`,
0227            `sct`.`xdg_type`,
0228            `sct`.`name_legacy`,
0229            if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`,
0230            (SELECT `project_category_id`
0231             FROM `stat_cat_tree` AS `sct2`
0232             WHERE `sct2`.`lft` < `sct`.`lft`
0233               AND `sct2`.`rgt` > `sct`.`rgt`
0234             ORDER BY `sct2`.`rgt` - `sct`.`rgt`
0235             LIMIT 1)                               AS `parent_id`
0236     FROM `tmp_store_cat_tags` AS `cfc`
0237              JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`)
0238         #JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` = TAGS
0239              JOIN `stat_store_prod_count` AS `scpc`
0240                   ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`stores` = `STORE_ID`
0241     WHERE `cfc`.`store_id` = `STORE_ID`
0242     ORDER BY `cfc`.`order`, `sct`.`lft`;
0243 END$$
0244 
0245 
0246 
0247 CREATE
0248 `fetchCatTreeForStore`
0249 (
0250     IN `STORE_ID` INT (11)
0251 )
0252 BEGIN
0253 DROP TABLE IF EXISTS `tmp_store_cat`;
0254 CREATE TEMPORARY TABLE `tmp_store_cat`
0255 (
0256     INDEX `idx_cat_id` (`project_category_id`)
0257 )
0258     ENGINE MEMORY
0259 AS
0260 SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt`
0261 FROM `config_store_category` AS `csc`
0262          JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id`
0263 WHERE `csc`.`store_id` = `STORE_ID`
0264 GROUP BY `csc`.`store_category_id`
0265 ORDER BY `csc`.`order`, `pc`.`title`
0266 ;
0267 
0268 SET @`NEW_ORDER` := 0;
0269 
0270 UPDATE `tmp_store_cat`
0271 SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10);
0272 
0273 SELECT `sct`.`lft`,
0274        `sct`.`rgt`,
0275        `sct`.`project_category_id`             AS `id`,
0276        `sct`.`title`,
0277        `scpc`.`count_product`                  AS `product_count`,
0278        `sct`.`xdg_type`,
0279        `sct`.`name_legacy`,
0280        if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`,
0281        (SELECT `project_category_id`
0282         FROM `stat_cat_tree` AS `sct2`
0283         WHERE `sct2`.`lft` < `sct`.`lft`
0284           AND `sct2`.`rgt` > `sct`.`rgt`
0285         ORDER BY `sct2`.`rgt` - `sct`.`rgt`
0286         LIMIT 1)                               AS `parent_id`
0287 FROM `tmp_store_cat` AS `cfc`
0288          JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`)
0289     #JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` is null
0290          JOIN `stat_store_prod_count` AS `scpc`
0291               ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` IS NULL
0292 WHERE `cfc`.`store_id` = `STORE_ID`
0293 ORDER BY `cfc`.`order`, `sct`.`lft`;
0294 END$$
0295 
0296 
0297 DELIMITER ;