/** * */ package fr.inria.soctrace.framesoc.ui.piechart.loaders; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import fr.inria.soctrace.framesoc.ui.colors.FramesocColor; import fr.inria.soctrace.framesoc.ui.colors.FramesocColorManager; import fr.inria.soctrace.lib.model.EventType; import fr.inria.soctrace.lib.model.utils.SoCTraceException; import fr.inria.soctrace.lib.query.EventTypeQuery; import fr.inria.soctrace.lib.query.conditions.ConditionsConstants.ComparisonOperation; import fr.inria.soctrace.lib.storage.TraceDBObject; /** * Pie Chart loader for Event Type instances metric (i.e., how many event * instances for each event type). * * @author "Generoso Pagano <generoso.pagano@inria.fr>" */ public class EventTypePieChartLoader extends EventPieChartLoader { /** * Logger */ private final static Logger logger = LoggerFactory.getLogger(EventTypePieChartLoader.class); /** * Event type map. */ private Map<Integer, String> etMap; @Override public String getStatName() { return "Event Type Instances"; } @Override protected FramesocColor getBaseColor(String name) { FramesocColor color = FramesocColorManager.getInstance().getEventTypeColor(name); FramesocColorManager.getInstance().saveEventTypeColors(); return color; } @Override protected int doRequest(long t0, long t1, boolean first, boolean last, Map<String, Double> values, TraceDBObject traceDB, IProgressMonitor monitor) throws SoCTraceException { // lazily load the type map loadEventTypeMap(traceDB); // execute query ComparisonOperation lastComp = last ? ComparisonOperation.LE : ComparisonOperation.LT; StringBuilder sb = new StringBuilder(); sb.append("SELECT EVENT_TYPE_ID, COUNT(*) AS NUMBER FROM EVENT WHERE TIMESTAMP >= "); sb.append(t0); sb.append(" AND TIMESTAMP "); sb.append(lastComp); sb.append(" "); sb.append(t1); addFiltersToQuery(sb); sb.append(" GROUP BY EVENT_TYPE_ID "); String query = sb.toString(); logger.debug(query); int results = 0; try { Statement stm = traceDB.getConnection().createStatement(); ResultSet rs = stm.executeQuery(query); while (rs.next()) { if (monitor.isCanceled()) return results; int id = rs.getInt(1); double count = rs.getInt(2); String etName = etMap.get(id); if (!values.containsKey(etName)) values.put(etName, count); else values.put(etName, count + values.get(etName)); results++; } stm.close(); } catch (SQLException e) { throw new SoCTraceException(e); } return results; } private void loadEventTypeMap(TraceDBObject traceDB) throws SoCTraceException { // load all types (do it only once) if (etMap == null) { EventTypeQuery etq = new EventTypeQuery(traceDB); List<EventType> etl = etq.getList(); etMap = new HashMap<>(); for (EventType et : etl) { etMap.put(et.getId(), et.getName()); } } } @Override public NumberFormat getFormat() { return new DecimalFormat(); } }