TaskManager.php.problems_sync_percent.sql 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `PROBLEMS__SYNC_PERCENT`()
  2. `proc_label`:BEGIN
  3. SET @updatedCnt = 1;
  4. INSERT IGNORE INTO _SYNC_TASK_PERCENT (`ID_TASK`, `ID_PARENT_TASK`) SELECT `ID`, `PARENT_ID` FROM PROBLEMS;
  5. -- update `_SYNC_TASK_PERCENT` set `A_LAST_SYNC` = NOW(); -- TODO test recurse up - RMME
  6. -- update `_SYNC_TASK_PERCENT` set `A_SYNCHRONIZED` = 1; -- TODO test recurse up - RMME
  7. -- update `_SYNC_TASK_PERCENT` set `A_SYNCHRONIZED` = 0 WHERE `ID_TASK`=1050; -- TODO test recurse up - RMME
  8. UPDATE `_SYNC_TASK_PERCENT` p, `PROBLEMS` t
  9. SET p.`A_PROBLEM_COMPLETE_PERCENT` = REPLACE(t.`A_PROBLEM_COMPLETE_PERCENT`, "%", "")
  10. , p.`L_APPOITMENT_PERIOD` = t.`L_APPOITMENT_PERIOD`
  11. , p.`ID_PARENT_TASK` = t.`PARENT_ID`
  12. WHERE p.`ID_TASK` = t.`ID`
  13. ;
  14. SET @updatedCnt = ROW_COUNT(); SELECT CONCAT("UPDATE 1 : updated ", @updatedCnt); -- DBG
  15. UPDATE `_SYNC_TASK_PERCENT` t
  16. LEFT JOIN `PROBLEMS` p ON t.`ID_TASK` = p.`ID`
  17. SET t.A_SYNCHRONIZED = 0
  18. WHERE t.`A_LAST_SYNC` < p.`A_RECORD_CREATE_DATE` OR t.`A_LAST_SYNC` < p.`A_RECORD_UPDATE_DATE`
  19. ;
  20. SET @updatedCnt = ROW_COUNT(); SELECT CONCAT("UPDATE 2 : updated ", @updatedCnt); -- DBG
  21. -- SELECT @c:=COUNT(*) FROM `_SYNC_TASK_PERCENT` WHERE `A_SYNCHRONIZED` = 0;
  22. -- SET @i = 0;
  23. -- WHILE @i < @c DO
  24. -- PREPARE stmt FROM "SELECT `ID_TASK` into @parent_id FROM `_SYNC_TASK_PERCENT` WHERE `A_SYNCHRONIZED` = 0 LIMIT ?,1";
  25. -- EXECUTE stmt USING @i;
  26. -- DEALLOCATE PREPARE stmt;
  27. -- select @parent_id;
  28. -- WHILE @parent_id <> 0 DO
  29. -- SELECT @parent_id := `PARENT_ID` FROM `PROBLEMS` WHERE `ID` = @parent_id;
  30. -- UPDATE `_SYNC_TASK_PERCENT` SET `A_SYNCHRONIZED` = 0 WHERE `ID_TASK` = @parent_id;
  31. -- END WHILE;
  32. -- SET @i = @i +1;
  33. -- END WHILE;
  34. -- set A_SYNCHRONIZED = 0 going up by recurse
  35. SET @i = 0;
  36. SET @loopLomit = 100;
  37. SET @updatedCnt = 1;
  38. WHILE @i < @loopLomit and @updatedCnt > 0 DO
  39. update `_SYNC_TASK_PERCENT` p
  40. join `_SYNC_TASK_PERCENT` pp on(pp.`ID_TASK`=p.`ID_PARENT_TASK`)
  41. set p.`A_SYNCHRONIZED`=0
  42. where pp.`A_SYNCHRONIZED`!=0
  43. ;
  44. SET @updatedCnt = ROW_COUNT();
  45. SELECT CONCAT("LOOP 2 (", @i, "): updated ", @updatedCnt); -- DBG
  46. SET @i = @i + 1;
  47. END WHILE;
  48. -- UPDATE `_SYNC_TASK_PERCENT` SET `SYNC_SORT_PRIO` = 0;
  49. -- SELECT @c:=COUNT(*) FROM `_SYNC_TASK_PERCENT` p1
  50. -- LEFT JOIN `PROBLEMS` t1 ON p1.`ID_TASK` = t1.`PARENT_ID`
  51. -- WHERE p1.`A_SYNCHRONIZED` = 0 AND t1.`ID` IS NULL
  52. -- ;
  53. -- SET @i = 0;
  54. -- WHILE @i < @c DO
  55. -- SET @sort_prio = 1000;
  56. -- SELECT @i;
  57. -- PREPARE stmt FROM "SELECT p1.`ID_TASK` into @parent_id FROM `_SYNC_TASK_PERCENT` p1
  58. -- LEFT JOIN `PROBLEMS` t1 ON p1.`ID_TASK` = t1.`PARENT_ID`
  59. -- WHERE p1.`A_SYNCHRONIZED` = 0 AND t1.`ID` IS NULL LIMIT ?, 1"
  60. -- ;
  61. -- EXECUTE stmt USING @i;
  62. -- DEALLOCATE PREPARE stmt;
  63. -- select @parent_id;
  64. -- UPDATE `_SYNC_TASK_PERCENT` SET `SYNC_SORT_PRIO` = @sort_prio WHERE `ID_TASK` = @parent_id;
  65. -- WHILE @parent_id <> 0 DO
  66. -- SET @sort_prio = @sort_prio - 1;
  67. -- SELECT @parent_id := `PARENT_ID` FROM `PROBLEMS` WHERE `ID` = @parent_id;
  68. -- UPDATE `_SYNC_TASK_PERCENT` SET `SYNC_SORT_PRIO` = @sort_prio WHERE `ID_TASK` = @parent_id;
  69. -- END WHILE;
  70. -- SET @i = @i + 1;
  71. -- END WHILE;
  72. -- set SYNC_SORT_PRIO - start from value 1000 for leaf and go up recurse and lover value
  73. -- select p.`ID_TASK`, p.`ID_PARENT_TASK`
  74. -- , IF((select count(1) as cnt from `_SYNC_TASK_PERCENT` sp where sp.`ID_PARENT_TASK` = p.`ID_TASK`) > 0, 0, 1000) as sort_prio
  75. -- from `_SYNC_TASK_PERCENT` p
  76. -- ;
  77. -- select p.`ID_TASK`, p.`ID_PARENT_TASK`
  78. -- , IF((select count(1) as cnt from `PROBLEMS` sp where sp.`PARENT_ID` = p.`ID_TASK`) > 0, 0, 1000) as sort_prio
  79. -- from `_SYNC_TASK_PERCENT` p
  80. -- ;
  81. -- set 1000 when is leaf - has no children
  82. SET @i = 0;
  83. SET @loopLomit = 100;
  84. SET @updatedCnt = 1;
  85. SET @sortPrio = 100;
  86. UPDATE `_SYNC_TASK_PERCENT` p
  87. SET p.`SYNC_SORT_PRIO` = IF((select count(1) as cnt from `PROBLEMS` sp where sp.`PARENT_ID` = p.`ID_TASK`) > 0, 0, @sortPrio)
  88. ;
  89. WHILE @i < @loopLomit and @updatedCnt > 0 DO
  90. update `_SYNC_TASK_PERCENT` p
  91. join `_SYNC_TASK_PERCENT` pp on(pp.`ID_TASK`=p.`ID_PARENT_TASK`)
  92. set pp.`SYNC_SORT_PRIO` = IF(@sortPrio > pp.`SYNC_SORT_PRIO` and pp.`SYNC_SORT_PRIO` > 0, pp.`SYNC_SORT_PRIO` - 1, @sortPrio - 1)
  93. where p.`SYNC_SORT_PRIO` = @sortPrio
  94. ;
  95. SET @updatedCnt = ROW_COUNT();
  96. SET @i = @i + 1;
  97. SET @sortPrio = @sortPrio - 1;
  98. SELECT CONCAT("LOOP 2 (", @i, "): updated ", @updatedCnt); -- DBG
  99. END WHILE;
  100. UPDATE `_SYNC_TASK_PERCENT` p
  101. SET p.`CHILDS_COUNT` = (select count(1) as cnt from `PROBLEMS` sp where sp.`PARENT_ID` = p.`ID_TASK`)
  102. ;
  103. SELECT @c:=COUNT(*) FROM `_SYNC_TASK_PERCENT` WHERE `A_SYNCHRONIZED` = 0;
  104. SET @i = 0;
  105. SET @id = 0;
  106. SET @childs = 0;
  107. SELECT CONCAT("LOOP 3 @i(", @i, ") @c(", @c, ")"); -- DBG
  108. WHILE @i < @c DO
  109. SET @i = @i + 1;
  110. SELECT CONCAT("LOOP 3 ..."); -- DBG
  111. SELECT `ID_TASK` into @id FROM `_SYNC_TASK_PERCENT` WHERE `A_SYNCHRONIZED` = 0 ORDER BY `SYNC_SORT_PRIO` DESC, `ID_TASK` DESC LIMIT 0,1;
  112. SELECT CONCAT("LOOP 3 (", @i, "): id ", @id); -- DBG
  113. SELECT p.`CHILDS_COUNT` into @childs FROM `_SYNC_TASK_PERCENT` p WHERE p.`ID_TASK` = @id;
  114. SELECT CONCAT("LOOP 3 (", @i, "): id (",@id,") childs(",@childs,")"); -- DBG
  115. IF @childs = 0 THEN
  116. SELECT CONCAT("LOOP 3 (", @i, "): LIF0"); -- DBG
  117. UPDATE `_SYNC_TASK_PERCENT` SET `A_SYNCHRONIZED` = 1, `A_LAST_SYNC` = NOW(), `CHILDS_COUNT` = @childs WHERE `ID_TASK` = @id;
  118. SELECT CONCAT("LOOP 3 (", @i, "): LIF1"); -- DBG
  119. ELSE
  120. SELECT CONCAT("LOOP 3 (", @i, "): LE0"); -- DBG
  121. SELECT @avg:=AVG(p2.`A_PROBLEM_COMPLETE_PERCENT`), @amount:=SUM(p2.`L_APPOITMENT_PERIOD`) FROM `_SYNC_TASK_PERCENT` p1
  122. LEFT JOIN `PROBLEMS` t1 ON p1.`ID_TASK` = t1.`PARENT_ID`
  123. LEFT JOIN `_SYNC_TASK_PERCENT` p2 ON p2.`ID_TASK` = t1.`ID`
  124. WHERE p1.`A_SYNCHRONIZED` = 0 AND t1.`PARENT_ID` = @id
  125. ;
  126. SELECT CONCAT("LOOP 3 (", @i, "): LE1"); -- DBG
  127. SET @avg = ROUND(@avg);
  128. UPDATE `_SYNC_TASK_PERCENT`
  129. SET `A_SYNCHRONIZED` = 1
  130. , `A_PROBLEM_COMPLETE_PERCENT` = @avg
  131. , `L_APPOITMENT_PERIOD` = @amount
  132. , `A_LAST_SYNC` = NOW()
  133. , `CHILDS_COUNT` = @childs
  134. WHERE `ID_TASK` = @id
  135. ;
  136. SELECT CONCAT("LOOP 3 (", @i, "): LE2"); -- DBG
  137. SET @avg = ROUND(@avg/10)*10;
  138. -- TODO UPDATE `PROBLEMS` SET `A_PROBLEM_COMPLETE_PERCENT` = CONCAT(@avg, "%"), `L_APPOITMENT_PERIOD` = @amount, `A_RECORD_UPDATE_DATE` = NOW() WHERE `ID` = @id;
  139. END IF;
  140. SELECT COUNT(*) into @childsdone FROM `_SYNC_TASK_PERCENT` p
  141. LEFT JOIN `PROBLEMS` t ON t.`ID` = p.`ID_TASK`
  142. WHERE p.`A_PROBLEM_COMPLETE_PERCENT` = 100 AND t.`PARENT_ID` = @id
  143. ;
  144. UPDATE `_SYNC_TASK_PERCENT` SET `CHILDS_DONE_COUNT` = @childsdone WHERE `ID_TASK` = @id;
  145. END WHILE;
  146. END