--- a
+++ b/eu.opensourceprojects.mondo.benchmarks.itmfactory/transformations/SpreadsheetMLSimplified2Trace.atl
@@ -0,0 +1,112 @@
+--@atlcompiler atl2006
+
+--@author Hugo Bruneliere (Hugo.Bruneliere <at> gmail.com)
+
+module Sheet2Trace; -- Module Template
+create OUT : Trace from IN : Sheet;
+
+
+-------------------------------------------------------------------------------
+-- HELPERS --------------------------------------------------------------------
+-------------------------------------------------------------------------------
+
+-- This helper indicates if a given row is the beginning of a trace level description
+-- CONTEXT: Sheet!Row
+-- RETURN: Boolean
+helper context Sheet!Row def: isALevelDescriptionBeginning : Boolean =
+ let data : Sheet!Data = self.r_cells->at(1).c_data in
+ if not data.oclIsUndefined()then
+ if data.value.oclIsTypeOf(Sheet!StringValue) then
+ if data.value.value = 'Index' then
+ true
+ else
+ false
+ endif
+ else
+ false
+ endif
+ else
+ false
+ endif;
+
+-- This helper returns the index of the last row before the next level
+-- CONTEXT: Sheet!Row
+-- RETURN: Integer
+helper context Sheet!Row def: getIndexOfLastRowBeforeNextLevel : Integer =
+ let rows : Sequence(Sheet!Row) =
+ self.r_table.t_rows->select(row | row.isALevelDescriptionBeginning) in
+ if rows->indexOf(self) <> rows->size() then
+ self.r_table.t_rows->indexOf(rows->at(rows->indexOf(self)+1))-1
+ else
+ self.r_table.t_rows->indexOf(self.r_table.t_rows->at(self.r_table.t_rows->size()))
+ endif;
+
+-- This global variable indicates the index of the current level
+helper def: currentLevelIndex : Integer = 1;
+
+
+-------------------------------------------------------------------------------
+-- RULES ----------------------------------------------------------------------
+-------------------------------------------------------------------------------
+
+rule Worksheet2Trace {
+ from
+ ew : Sheet!Worksheet
+ to
+ t : Trace!Trace (
+ name <- ew.name,
+ levels <- if (not ew.ws_table.oclIsUndefined()) then
+ if (ew.ws_table.t_rows.oclIsUndefined()) then
+ ew.ws_table.t_rows->select(row | row.isALevelDescriptionBeginning)
+ ->collect(row | thisModule.CreateLevel(row))
+ else Sequence{}
+ endif
+ else Sequence{}
+ endif
+ )
+}
+
+lazy rule CreateLevel {
+ from
+ er : Sheet!Row
+ to
+ l : Trace!Level (
+ calls <- er.r_table.t_rows
+ ->subSequence(er.r_table.t_rows->indexOf(er)+1,er.getIndexOfLastRowBeforeNextLevel)
+ ->collect(r | thisModule.CreateCall(r))
+ )
+ do {
+ thisModule.currentLevelIndex <- er.r_table.t_rows->select(row | row.isALevelDescriptionBeginning)
+ ->indexOf(er)+1;
+ }
+}
+
+lazy rule CreateCall {
+ from
+ er : Sheet!Row
+ using {
+ nodeName : String = er.r_cells->at(thisModule.currentLevelIndex+1).c_data.value.value;
+ }
+ to
+ c : Trace!Call (
+ indexes <- er.r_cells->subSequence(1,thisModule.currentLevelIndex)
+ ->collect(cell | thisModule.CreateIndex(cell)),
+ methodName <- nodeName,
+ DBAccessesNumber <- er.r_cells->at(thisModule.currentLevelIndex+2).c_data.value.value.round(),
+ DBRowsNumber <- er.r_cells->at(thisModule.currentLevelIndex+3).c_data.value.value.round(),
+ CPUTime <- if nodeName <> 'Total DB-Ops' then
+ er.r_cells->at(thisModule.currentLevelIndex+4).c_data.value.value.round()
+ else
+ OclUndefined
+ endif
+ )
+}
+
+lazy rule CreateIndex {
+ from
+ ec : Sheet!Cell
+ to
+ i : Trace!Index (
+ value <- ec.c_data.value.value.round()
+ )
+}