Switch to side-by-side view

--- 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()
+		)
+}