blob: 5c7d503ed9be6193a21b61396c43f3bf7ad0cebb [file] [log] [blame]
/**
********************************************************************************
* Copyright (c) 2020 Eclipse APP4MC contributors.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
********************************************************************************
*/
package org.eclipse.app4mc.atdb._import.btf;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import org.eclipse.app4mc.atdb.ATDBConnection;
import org.eclipse.app4mc.atdb._import.btf.model.BTFCombiState;
import org.eclipse.app4mc.atdb._import.btf.model.BTFCountMetric;
import org.eclipse.app4mc.atdb._import.btf.model.BTFEntityState;
import org.eclipse.app4mc.atdb._import.btf.model.BTFEntityType;
import org.eclipse.app4mc.atdb._import.btf.model.BTFInterInstanceMetric;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.jface.operation.IRunnableWithProgress;
public class ATDBMetricCalculator implements IRunnableWithProgress {
private final ATDBConnection con;
public ATDBMetricCalculator(final ATDBConnection con) {
this.con = con;
}
@Override
public void run(IProgressMonitor progressMonitor) throws InvocationTargetException {
progressMonitor.beginTask("Calculating metrics...", 5 + BTFEntityState.actStates.size());
try {
// for each state: add a '[state]Time' metric signifying how long the entity instance was in that state
for (final BTFEntityState state : BTFEntityState.actStates) {
con.executeBatchUpdate(atdbCon -> {
for (final Entry<BTFEntityType, Entry<List<Enum<?>>, List<Enum<?>>>> et2io:state.entityType2InOutEvents.entrySet()) {
final BTFEntityType entityType = et2io.getKey();
// map and collect events as SQL list
final List<String> incomingEvents = et2io.getValue().getKey().stream().map(e -> e.toString().toLowerCase())
.collect(Collectors.toList());
// map and collect events as string list
final List<String> outgoingEvents = et2io.getValue().getValue().stream().map(e -> e.toString().toLowerCase())
.collect(Collectors.toList());
atdbCon.insertEntityInstanceStateMetricValuesForEntityType(state + "Time", entityType, incomingEvents, outgoingEvents);
}
});
progressMonitor.worked(1);
}
con.executeBatchUpdate(atdbCon -> {
// consider combi states for processes
for (final BTFCombiState cState : BTFCombiState.values()) {
final List<String> relevantStates = cState.getStates().stream().map(s -> s + "Time").collect(Collectors.toList());
atdbCon.insertCombinedEntityInstanceStateMetricValuesForEntityType(cState + "Time", BTFEntityType.PROCESS, relevantStates);
}
});
progressMonitor.worked(1);
con.executeBatchUpdate(atdbCon -> {
// calculate inter-instance metrics
for (final BTFInterInstanceMetric metric : BTFInterInstanceMetric.values()) {
for (final Entry<BTFEntityType, Entry<Enumerator, Enumerator>> et2fs:metric.entityType2FirstAndSecond.entrySet()) {
final BTFEntityType entityType = et2fs.getKey();
final String firstInstanceEvent = et2fs.getValue().getKey().toString();
final String secondInstanceEvent = et2fs.getValue().getValue().toString();
atdbCon.insertInterEntityInstanceMetricValuesForEntityType(metric.toString(), entityType,
firstInstanceEvent, secondInstanceEvent);
}
}
});
progressMonitor.worked(1);
con.executeBatchUpdate(atdbCon -> {
// calculate stimuli activate2activate distances
final String activateEvent = BTFInterInstanceMetric.activateToActivate.entityType2FirstAndSecond
.entrySet().iterator().next().getValue().getKey().toString();
atdbCon.insertInterSourceEntityInstanceMetricValuesForEntityType(BTFInterInstanceMetric.activateToActivate.toString(),
BTFEntityType.PROCESS, activateEvent);
});
progressMonitor.worked(1);
con.executeBatchUpdate(atdbCon -> {
// calculate entity metrics min max avg for all time metric values
atdbCon.insertAggregatedEntityInstanceMetricsForDimension("time");
});
progressMonitor.worked(1);
con.executeBatchUpdate(atdbCon -> {
// insert entity specific count metrics
for (final BTFCountMetric cm : BTFCountMetric.values()) {
atdbCon.insertMetric(cm.toString(), "count");
atdbCon.insertCountsForEntityTypeAndEvent(cm.toString(), cm.entityType, cm.eventToCount.toString().toLowerCase());
}
});
progressMonitor.worked(1);
} catch (SQLException e) {
throw new InvocationTargetException(e);
} finally {
progressMonitor.done();
}
}
}