argoroots
11/13/2017 - 11:50 AM

Entu - Rights

Entu - Rights

-- Delete exact duplicates
UPDATE relationship r1
RIGHT JOIN
(
SELECT max(id) AS rid
FROM relationship r
WHERE r.is_deleted = 0
AND relationship_definition_keyname IN ('viewer','expander','editor','owner')
GROUP BY r.entity_id, r.related_entity_id, r.relationship_definition_keyname
HAVING count(1) > 1
) r2 ON r2.rid = r1.id
SET r1.deleted = now(), is_deleted = 1, deleted_by = 'remove duplicates'
;


-- For every duplicate right
--   delete one lower level copy.
-- Might want to execute multiple times
-- On 1,6M relationships it takes
-- LIMIT 1000 - 84s
UPDATE relationship
SET deleted = now(), is_deleted = 1, deleted_by = 'remove duplicates'
WHERE id IN
(
    SELECT id
    FROM
    (
        SELECT min(id) AS id
        FROM
        (
            SELECT r1.id,
                CASE r1.relationship_definition_keyname
                    WHEN 'viewer' THEN 1
                    WHEN 'expander' THEN 2
                    WHEN 'editor' THEN 3
                    WHEN 'owner' THEN 4
                    ELSE r1.relationship_definition_keyname
                END AS 'rlev', r2.*
            FROM relationship r1
            RIGHT JOIN
            (
                SELECT r.entity_id, r.related_entity_id
                FROM relationship r
                WHERE r.is_deleted = 0
                AND r.relationship_definition_keyname IN ('viewer','expander','editor','owner')
                GROUP BY r.entity_id, r.related_entity_id
                HAVING count(1) > 1
                LIMIT 3000
            ) r2 ON r2.entity_id = r1.entity_id AND r1.related_entity_id = r2.related_entity_id
            WHERE r1.is_deleted = 0
            AND   r1.relationship_definition_keyname IN ('viewer', 'expander', 'editor', 'owner')
            ORDER BY rlev
        ) foo
        GROUP BY entity_id
    ) baz
)
;
TRUNCATE TABLE dag_entity
;

INSERT INTO dag_entity (entity_id, related_entity_id, distance)
SELECT r.entity_id, r.related_entity_id, 1
FROM relationship r
LEFT JOIN entity eleft ON eleft.id = r.entity_id
LEFT JOIN entity eright ON eright.id = r.related_entity_id
WHERE r.relationship_definition_keyname = 'child'
AND r.is_deleted = 0
AND eleft.is_deleted = 0
AND eright.is_deleted = 0
ON DUPLICATE KEY UPDATE dag_entity.distance = 1
;

INSERT ignore INTO dag_entity (entity_id, related_entity_id, distance)
SELECT dleft.entity_id, dright.related_entity_id, dleft.distance + dright.distance as sum_distance
from dag_entity as dleft
 join dag_entity as dright on dleft.related_entity_id = dright.entity_id
ON DUPLICATE KEY UPDATE dag_entity.distance = least(dag_entity.distance, dleft.distance + dright.distance)
;
--
-- Give recursive rights to person on entity
--
SELECT id INTO @mihkel FROM entity WHERE old_id = 'mihkel';
SET @person_id = 415167;
SET @root_entity_id = 4173;
SET @right = 'editor';
SET @edk = 'folder';

INSERT INTO relationship (relationship_definition_keyname, entity_id, related_entity_id, created, created_by)
SELECT @right, de.related_entity_id AS entity_id
     , @person_id
     , now(), @mihkel
FROM dag_entity de
LEFT JOIN entity e ON e.id = de.related_entity_id
WHERE de.entity_id = @root_entity_id
AND e.is_deleted = 0
AND e.entity_definition_keyname = @edk
;

INSERT INTO relationship (relationship_definition_keyname, entity_id, related_entity_id, created, created_by)
SELECT @right, @root_entity_id AS entity_id, @person_id, now(), @mihkel
;

-- Now run script
--   Delete duplicate rights.sql