import of rt 3.0.4
[freeside.git] / rt / docs / design_docs / recursive_group_membership_algorithm
1 Group A has members 1, 2, 3
2
3         Cached members  1 is a member of A via ""
4                         2 is a member of A via ""
5                         3 is a member of A via ""
6
7
8 Group B has members A, 4, 5
9
10         Cached members: 4 is a member of B via ""  $1
11                         5 is a member of B via ""  $2
12                         A is a member of B via ""  $3
13                                 1 is a member of B via "$3" $4
14                                 2 is a member of B via "$3" $5
15                                 3 is a member of B via "$3" $6
16
17 Group C has members A, B, 6
18                         6 is a member of C via "" $7
19                         A is a member of C via "" $8
20                                 1 is a member of C via $8 $9
21                                 2 is a member of C via $8 $10
22                                 3 is a member of C via $8 $11
23                         B is a member of C via "" $12
24                                 4 is a member of C via $12 $13
25                                 5 is a member of C via $12 $14
26                                 A is a member of C via $12 $15
27                                         1 is a member of C via $15 $16
28                                         2 is a member of C via $15 $17
29                                         3 is a member of C via $15 $18
30
31
32
33 Group D has members A, C
34
35                         A is a member of D via "" $19
36                                 1 is a member of D via $19 $20
37                                 2 is a member of D via $19 $21
38                                 3 is a member of D via $19 $22
39                         C is a member of D via "" $23
40                                 6 is a member of D via $23 $24
41                                 A is a member of D via $23 $25
42                                         1 is a member of D via $25 $26
43                                         2 is a member of D via $25 $27
44                                         3 is a member of D via $25 $28
45                                 B is a member of D via $23 $29
46                                         4 is a member of D via $29 $30
47                                         5 is a member of D via $29 $31
48                                         A is a member of D via $29 $32
49                                                 1 is a member of D via $32 $33
50                                                 2 is a member of D via $32 $34
51                                                 3 is a member of D via $32 $35
52
53                         
54
55 Adding a new user, 7,  to group A.
56
57
58         Add the user to group A in the groups table.
59
60         Find all entries for group A in the cache table.
61
62         For each entry in that list:
63                 Add "7 is a member of $entry->top  via $entry->id"
64
65 Deleting a user, 7, from group A:
66
67         Remove the user from group A in the groups table.
68         find all entries in the cache table where the principal id is user 7 and
69         the parent id is A. (requires a self join)
70                 nuke them
71
72         Alternatively:
73          find all entries for A in the cache table.
74                 For each one, find the child whose id is 7. 
75                         Nuke it
76
77
78 Adding a group, B to group D.
79
80         Add group B as a member of D in the groups table.
81         In the cache table:
82                 $id = Add group B as a member of D via ""
83                 
84                 For each member of group B (4, 5, A):
85
86                        $sid= 4 is a member of D via $id
87                        $sid=  5 is a member of D via $id
88                        $sid=  A is a member of D via $id
89
90                         if the member is a group itself, recurse down:
91                                 
92                                 1 is a member of D via $sid
93                                 2 is a member of D via $sid
94                                 3 is a member of D via $sid
95                                
96                 Find all places where D is a member of $foo.
97                         Repeat the above procedure, substituting $foo for D
98                         and making $id D's id.
99
100 Removing B as a member of D:
101
102         Remove B as a member of D in the groups table.
103         Find all references to D in the pseudogroups table.
104                 Find all children of D which are B:
105                         Recurse down with the following algorithm:
106                         If it's a user, delete it.
107                         If it's a group,  recurse through each member, 
108                                 deleting its children and then deleting the
109                                 group itself.