blob: 8fae6306abd582aacf3ffcf797bd0d41589a395d [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 java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ATDBConnection extends DBConnection {
private static final String METAINFORMATION_QUERY = "SELECT value FROM metaInformation WHERE name = ?;";
private static final String ENTITY_BY_TYPE_QUERY = "SELECT name FROM entity WHERE entityTypeId = (SELECT id FROM entityType WHERE entityType.name = ?);";
private static final String EVENT_BY_TYPE_QUERY = "SELECT name FROM event WHERE eventTypeId = (SELECT id FROM eventType WHERE eventType.name = ?);";
private static final String ENTITY_PROPERTY_ENTITYREF_QUERY = "SELECT (SELECT name FROM entity WHERE id = value) AS entities "
+ "FROM entity AS sourceEntity, propertyValue WHERE sourceEntity.name = ? "
+ "AND entityTypeId = (SELECT id FROM entityType WHERE entityType.name = ?) "
+ "AND propertyValue.entityId = sourceEntity.id "
+ "AND propertyValue.propertyId = (SELECT id FROM property WHERE name = ?);";
private static final String ENTITY_PROPERTY_VALUE_QUERY = "SELECT propertyValue.value "
+ "FROM entity AS sourceEntity, propertyValue WHERE sourceEntity.name = ? "
+ "AND entityTypeId = (SELECT id FROM entityType WHERE entityType.name = ?) "
+ "AND propertyValue.entityId = sourceEntity.id "
+ "AND propertyValue.propertyId = (SELECT id FROM property WHERE name = ?);";
private static final String EVENTCHAIN_EVENTREF_QUERY = "SELECT (SELECT GROUP_CONCAT((SELECT name FROM event WHERE id = value), ', ') "
+ "FROM propertyValue WHERE entityId = ecEntity.id AND propertyId = (SELECT id FROM property WHERE name = ?)) AS evName "
+ "FROM entity AS ecEntity WHERE ecEntity.name = ? AND entityTypeId = (SELECT id FROM entityType WHERE entityType.name = 'EC');";
private static final String METRICS_QUERY = "SELECT name FROM metric;";
private static final String METRICVALUE_QUERY = "SELECT value FROM entityMetricValue WHERE entityId = (SELECT id FROM entity WHERE name = ?) "
+ "AND metricId = (SELECT id FROM metric WHERE name = ?);";
public ATDBConnection(String dbFile) throws SQLException {
super(dbFile);
}
public ATDBConnection(String dbFile, boolean writeAccess) throws SQLException {
super(dbFile, writeAccess);
}
private String getFirstStringFromPreparedQuery(final String query, final List<String> parameters, final String defaultValue) throws SQLException {
return getStringStreamFromPreparedQuery(query, parameters).findFirst().orElse(defaultValue);
}
private Stream<String> getStringStreamFromPreparedQuery(final String query, final List<String> parameters) throws SQLException {
final PreparedStatement prepStmt = super.getPrepareQueryFor(query);
for(int i = 0; i < parameters.size(); i++) {
prepStmt.setString(i + 1, parameters.get(i));
}
return super.queryAndMapToStream(prepStmt, rs -> rs.getString(1)).filter(Objects::nonNull);
}
private List<String> getStringListFromPreparedQuery(final String query, final List<String> parameters) throws SQLException {
return getStringStreamFromPreparedQuery(query, parameters).collect(Collectors.toList());
}
private String getMetaInfo(final String metaInfoKey, final String defaultValue) throws SQLException {
return getFirstStringFromPreparedQuery(METAINFORMATION_QUERY, Arrays.asList(metaInfoKey), defaultValue);
}
/**
* Returns the time base of this ATDB.
*
* @return The time base unit. If not set, "?" will be returned.
* @throws SQLException
*/
public String getTimeBase() throws SQLException {
return getMetaInfo("timeBase", "?");
}
private List<String> getAllEntitiesByType(final String entityTypeName) throws SQLException {
return getStringListFromPreparedQuery(ENTITY_BY_TYPE_QUERY, Arrays.asList(entityTypeName));
}
/**
* Returns all ECU names of this ATDB.
* @return A list of all ECU names.
* @throws SQLException
*/
public List<String> getAllECUs() throws SQLException {
return getAllEntitiesByType("ECU");
}
/**
* Returns all processor names of this ATDB for the given ecu name.
* @param ecuName The ECU name of which we want to retrieve all processor names.
* @return A list of all processor names for the given ECU.
* @throws SQLException
*/
public List<String> getProcessorsOfECU(final String ecuName) throws SQLException {
return getStringListFromPreparedQuery(ENTITY_PROPERTY_ENTITYREF_QUERY, Arrays.asList(ecuName, "ECU", "processors"));
}
/**
* Returns all processor names of this ATDB.
* @return A list of all processor names.
* @throws SQLException
*/
public List<String> getAllProcessors() throws SQLException {
return getAllEntitiesByType("Processor");
}
/**
* Returns all core names of this ATDB for the given processor name.
* @param processorName The processor name of which we want to retrieve all core names.
* @return A list of all core names for the given processor.
* @throws SQLException
*/
public List<String> getCoresOfProcessor(final String processorName) throws SQLException {
return getStringListFromPreparedQuery(ENTITY_PROPERTY_ENTITYREF_QUERY, Arrays.asList(processorName, "Processor", "cores"));
}
/**
* Returns all core names of this ATDB.
* @return A list of all core names.
* @throws SQLException
*/
public List<String> getAllCores() throws SQLException {
return getAllEntitiesByType("C");
}
/**
* Returns the frequency in Hz for the given core name.
* @param coreName The core name of which we want to retrieve the frequency.
* @return The frequency in Hz as string (can be parsed into a long). Empty, if none was found.
* @throws SQLException
*/
public String getCoreFrequencyInHz(final String coreName) throws SQLException {
return getFirstStringFromPreparedQuery(ENTITY_PROPERTY_VALUE_QUERY, Arrays.asList(coreName, "C", "frequencyInHz"), "");
}
/**
* Returns all task names of this ATDB.
* @return A list of all task names.
* @throws SQLException
*/
public List<String> getAllTasks() throws SQLException {
return getAllEntitiesByType("T");
}
/**
* Returns all ISR (Interrupt Service Routine) names of this ATDB.
* @return A list of all ISR names.
* @throws SQLException
*/
public List<String> getAllISRs() throws SQLException {
return getAllEntitiesByType("I");
}
/**
* Returns the name of the core that executes the process specified by the process name.
* @param processName The process name of which we want to retrieve the executing core.
* @return The core name on which the process is executed. Empty, if none was found.
* @throws SQLException
*/
public String getExecutingCoreOfProcess(final String processName) throws SQLException {
final Optional<String> coreOfTask = getStringStreamFromPreparedQuery(ENTITY_PROPERTY_ENTITYREF_QUERY, Arrays.asList(processName,
"T", "executingCore")).findFirst();
if (!coreOfTask.isPresent()) {
return getFirstStringFromPreparedQuery(ENTITY_PROPERTY_ENTITYREF_QUERY, Arrays.asList(processName, "I", "executingCore"), "");
} else {
return coreOfTask.get();
}
}
/**
* Returns all runnable names of this ATDB that are called by the given process name.
* @param processName The process name of which we want to retrieve all runnable names.
* @return A list of all runnable names called by the given process.
* @throws SQLException
*/
public List<String> getRunnablesOfProcess(final String processName) throws SQLException {
return Stream.concat(
getStringStreamFromPreparedQuery(ENTITY_PROPERTY_ENTITYREF_QUERY, Arrays.asList(processName, "T", "runnables")),
getStringStreamFromPreparedQuery(ENTITY_PROPERTY_ENTITYREF_QUERY, Arrays.asList(processName, "I", "runnables"))
).collect(Collectors.toList());
}
/**
* Returns all runnable names of this ATDB.
* @return A list of all runnable names.
* @throws SQLException
*/
public List<String> getAllRunnables() throws SQLException {
return getAllEntitiesByType("R");
}
/**
* Returns all label names of this ATDB that are read by the given runnable name.
* @param runnableName The runnable name of which we want to retrieve all read labels.
* @return A list of all label names read by the given runnable.
* @throws SQLException
*/
public List<String> getLabelsReadByRunnable(final String runnableName) throws SQLException {
return getStringListFromPreparedQuery(ENTITY_PROPERTY_ENTITYREF_QUERY, Arrays.asList(runnableName, "R", "readSignals"));
}
/**
* Returns all label names of this ATDB that are written by the given runnable name.
* @param runnableName The runnable name of which we want to retrieve all written labels.
* @return A list of all label names written by the given runnable.
* @throws SQLException
*/
public List<String> getLabelsWrittenByRunnable(final String runnableName) throws SQLException {
return getStringListFromPreparedQuery(ENTITY_PROPERTY_ENTITYREF_QUERY, Arrays.asList(runnableName, "R", "writtenSignals"));
}
/**
* Returns all stimulus names of this ATDB.
* @return A list of all stimulus names.
* @throws SQLException
*/
public List<String> getAllStimuli() throws SQLException {
return getAllEntitiesByType("STI");
}
/**
* Returns all label names of this ATDB.
* @return A list of all label names.
* @throws SQLException
*/
public List<String> getAllLabels() throws SQLException {
return getAllEntitiesByType("SIG");
}
/**
* Returns the initial value for the given label name.
* @param labelName The label name of which we want to retrieve the initial value.
* @return The initial value as string. Empty, if none was found.
* @throws SQLException
*/
public String getLabelInitialValue(final String labelName) throws SQLException {
return getFirstStringFromPreparedQuery(ENTITY_PROPERTY_VALUE_QUERY, Arrays.asList(labelName, "SIG", "initialValue"), "");
}
/**
* Returns all event chain names of this ATDB.
* @return A list of all event chain names.
* @throws SQLException
*/
public List<String> getAllEventChains() throws SQLException {
return getAllEntitiesByType("EC");
}
/**
* Returns all event (specification, not from the actual trace!) names of this ATDB of the given event type.
* @param eventTypeName The event type name of which the returned event names shall be.
* @return A list of all event names.
* @throws SQLException
*/
public List<String> getAllEventsByType(final String eventTypeName) throws SQLException {
return getStringListFromPreparedQuery(EVENT_BY_TYPE_QUERY, Arrays.asList(eventTypeName));
}
/**
* Returns the stimulus event name for the given event chain name. If there are multiple stimulus events, they will be separated by a ', '.
* @param eventChainName The name of the event chain from which we want to know the stimulus event.
* @return The stimulus event name. Empty, if none was found.
* @throws SQLException
*/
public String getEventChainStimulus(final String eventChainName) throws SQLException {
return getFirstStringFromPreparedQuery(EVENTCHAIN_EVENTREF_QUERY, Arrays.asList("ecStimulus", eventChainName), "");
}
/**
* Returns the response event name for the given event chain name. If there are multiple response events, they will be separated by a ', '.
* @param eventChainName The name of the event chain from which we want to know the response event.
* @return The response event name. Empty, if none was found.
* @throws SQLException
*/
public String getEventChainResponse(final String eventChainName) throws SQLException {
return getFirstStringFromPreparedQuery(EVENTCHAIN_EVENTREF_QUERY, Arrays.asList("ecResponse", eventChainName), "");
}
/**
* Returns the names of the item event chains for the given event chain name.
* @param eventChainName The name of the event chain from which we want to know the item event chain names.
* @return The item event chain names.
* @throws SQLException
*/
public List<String> getEventChainItems(final String eventChainName) throws SQLException {
return getStringListFromPreparedQuery(ENTITY_PROPERTY_ENTITYREF_QUERY, Arrays.asList(eventChainName, "EC", "items"));
}
/**
* Returns all metric names contained in this ATDB, some of which are specific to certain entity types.
* @return All metric names.
* @throws SQLException
*/
public List<String> getAllMetrics() throws SQLException {
return getStringListFromPreparedQuery(METRICS_QUERY, Collections.emptyList());
}
/**
* Returns the value of the metric for the given entity and metric names.
* @param entityName The name of the entity from which we want to know the metric value.
* @param metricName The name of the metric from which we want to know the value for the specified entity.
* @return The value for the metric and entity. Empty, if none is found.
* @throws SQLException
*/
public String getValueForMetricAndEntity(final String entityName, final String metricName) throws SQLException {
return getFirstStringFromPreparedQuery(METRICVALUE_QUERY, Arrays.asList(entityName, metricName), "");
}
}