1-- @path Project=/Project/Project.ecore
2-- @path Report=/Report/Report.ecore
3
4module ProjectTransform;
5create OUT: Report from IN: Project;
6
7-- Helper: calculate completion percentage
8helper context Project!Project def: completionPercentage(): Integer =
9 let completedCount : Integer = self.tasks->select(t | t.completed)->size() in
10 let totalCount : Integer = self.tasks->size() in
11 if totalCount > 0 then
12 (completedCount * 100) / totalCount
13 else
14 0
15 endif;
16
17-- Lazy rule: creates task summaries on demand
18lazy rule TaskSummary {
19 from
20 s: Project!Task
21 to
22 t: Report!Summary (
23 title <- s.name,
24 status <- if s.completed then 'Done' else 'Pending' endif,
25 priorityLevel <- s.priority
26 )
27}
28
29-- Lazy rule: creates resource listings
30lazy rule ResourceListing {
31 from
32 s: Project!Resource
33 to
34 t: Report!ResourceItem (
35 name <- s.name,
36 category <- s.type
37 )
38}
39
40-- Called rule: creates executive summaries
41rule CreateExecutiveSummary(proj : Project!Project) {
42 to
43 summary: Report!ExecutiveSummary (
44 projectName <- proj.name,
45 completion <- proj.completionPercentage(),
46 taskCount <- proj.tasks->size(),
47 resourceCount <- proj.resources->size()
48 )
49 do {
50 summary;
51 }
52}
53
54-- Main matched rule combining all patterns
55rule ProjectToReport {
56 from
57 s: Project!Project
58 to
59 t: Report!Document (
60 name <- s.name,
61 completionRate <- s.completionPercentage(),
62 taskSummaries <- s.tasks
63 ->select(task | task.priority >= 3)
64 ->collect(task | thisModule.TaskSummary(task)),
65 resources <- s.resources
66 ->collect(res | thisModule.ResourceListing(res))
67 )
68 do {
69 -- Create executive summary via called rule
70 thisModule.CreateExecutiveSummary(s);
71
72 -- Add completion status message
73 if s.completionPercentage() = 100 then
74 t.statusMessage <- 'Project complete!'
75 else
76 t.statusMessage <- 'Project in progress: ' +
77 s.completionPercentage().toString() + '% complete'
78 endif;
79 }
80}