Data flow

During exportation a graph of entities will be constructed inside the
database. For this three tables are required:
For each entity in the graph the primary-key and
the type (as table
name) is stored. The birthday of an entity is the day of the
insertion into the graph.
The graph will be constructed day after day (step-by-step) starting at
day 1:
The progression set of a day is the set of all
tables from
which entities are inserted at that day. The progession set of day 1 is
the subject set. The process stops if the progression set of a day is
empty.
Algorithm
1. insert subject
into graph
2.
progression-set := { subject }
3. while progression-set
!= {}
1. progression-of-today
:= {}
2. for all
(restricted) associations A
between tables T1 and T2, if
T1 or T2 in progression-set:
1. if T2 (T1) depends
on T1 (T2):
add
dependencies from T2(T 1)-entities born yesterday
to the entities
they are associated with according to A
2. insert
all entities of T1 (T2), which are associated according to A with an entity of T2 (T1) born yesterday
3. if at least one entity of T1 (T2) is
inserted then progression-of-today :=
progression-of-today + {
T1 (T2) }
3. progression-set
:= progression-of-today
Example
Subject = { A1, A2
}
| day |
progression
set |
entities |
dependencies |
| 1 |
A |
A1, A2 |
|
| 2 |
B, C |
+ B1, B2, C3, C4 |
A2->C3, A2->C4 |
| 3 |
B, C |
+ C1, C2, B3, B5 |
+ B1->C1, B1->C2 |
| 4 |
B |
+ B6 |
no change |
| 5 |
|
no change |
no change |
Line 1, insert subject
INSERT INTO Entity(PK, birthday, type)
SELECT
<subject>.PK, 1, '<subject>'
FROM
<subject>
WHERE (<condition> AND 103
NOT EXISTS (SELECT * FROM Entity WHERE <subject>.PK=Entity.PK)
[fetch first <limit> rows only]
Line 3.2.1, adding dependencies
INSERT INTO
Dependency(from_PK, to_PK)
SELECT
<T2>.PK, <T1>.PK
FROM Entity
E1, Entity E2,
<T2> JOIN <T1> ON <join-condition>
WHERE
E1.type='<T1>' AND E2.type='<T2>'
AND E1.PK=<T1>.PK
AND E2.PK=<T2>.PK
Line 3.2.2, adding referenced entities
INSERT INTO
Entity(PK, birthday, type)
SELECT
DISTINCT <T2>.PK, <today>, '<T2>'
FROM
<T1> JOIN <T2> ON <join-condition>,
Entity
WHERE
<T1>.PK=Entity.PK AND Entity.birthday = <yesterday>
AND NOT EXISTS
(SELECT * FROM Entity WHERE <T2>.PK=Entity.PK)
|