| --@atlcompiler atl2006 |
| |
| -- ****************************************************************************** |
| -- Copyright (c) 2007 INRIA. |
| -- All rights reserved. This program and the accompanying materials |
| -- are made available under the terms of the Eclipse Public License v1.0 |
| -- which accompanies this distribution, and is available at |
| -- http://www.eclipse.org/legal/epl-v10.html |
| -- |
| -- Contributors: |
| -- INRIA - Initial implementation |
| -- |
| -- ****************************************************************************** |
| |
| --@author Hugo Bruneliere (Hugo.Bruneliere <at> gmail.com) |
| |
| module SpreadsheetMLSimplified2Trace; -- Module Template |
| create OUT : Trace from IN : SpreadsheetMLSimplified; |
| |
| |
| ------------------------------------------------------------------------------- |
| -- HELPERS -------------------------------------------------------------------- |
| ------------------------------------------------------------------------------- |
| |
| -- This helper indicates if a given row is the beginning of a trace level description |
| -- CONTEXT: SpreadsheetMLSimplified!Row |
| -- RETURN: Boolean |
| helper context SpreadsheetMLSimplified!Row def: isALevelDescriptionBeginning : Boolean = |
| let data : SpreadsheetMLSimplified!Data = self.r_cells->at(1).c_data in |
| if not data.oclIsUndefined()then |
| if data.value.oclIsTypeOf(SpreadsheetMLSimplified!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: SpreadsheetMLSimplified!Row |
| -- RETURN: Integer |
| helper context SpreadsheetMLSimplified!Row def: getIndexOfLastRowBeforeNextLevel : Integer = |
| let rows : Sequence(SpreadsheetMLSimplified!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 : SpreadsheetMLSimplified!Worksheet |
| to |
| t : Trace!Trace ( |
| name <- ew.name, |
| levels <- ew.ws_table.t_rows->select(row | row.isALevelDescriptionBeginning) |
| ->collect(row | thisModule.CreateLevel(row)) |
| ) |
| } |
| |
| lazy rule CreateLevel { |
| from |
| er : SpreadsheetMLSimplified!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 : SpreadsheetMLSimplified!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 : SpreadsheetMLSimplified!Cell |
| to |
| i : Trace!Index ( |
| value <- ec.c_data.value.value.round() |
| ) |
| } |