Skip to content
Snippets Groups Projects
Commit 61342830 authored by Jürgen Walter's avatar Jürgen Walter
Browse files

refactoring (+improvement) of SLA evaluation + added SLA generation

parent a3e11117
No related branches found
No related tags found
No related merge requests found
package tools.descartes.dql.core.engine.interpreter;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Comparator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import tools.descartes.dql.connector.PerformanceMetricsQueryConnector;
import tools.descartes.dql.connector.QueryProgressListener;
import tools.descartes.dql.core.engine.util.EditorHelper;
import tools.descartes.dql.core.engine.util.QueryParserHelper;
import tools.descartes.dql.lang.descartesQL.ArithmeticClause;
import tools.descartes.dql.lang.descartesQL.DescartesQL;
import tools.descartes.dql.lang.descartesQL.EntityReference;
import tools.descartes.dql.lang.descartesQL.GenerateSLAConcern;
import tools.descartes.dql.lang.descartesQL.ModelFamily;
import tools.descartes.dql.lang.descartesQL.ModelReferenceClause;
import tools.descartes.dql.lang.descartesQL.MultipleArithmeticClause;
import tools.descartes.dql.lang.descartesQL.PerformanceMetricsQuery;
import tools.descartes.dql.lang.descartesQL.UsingClause;
import tools.descartes.dql.models.mapping.domain.DecimalResult;
import tools.descartes.dql.models.mapping.domain.DiscreteSeriesResult;
import tools.descartes.dql.models.mapping.domain.Entity;
import tools.descartes.dql.models.mapping.domain.Result;
import tools.descartes.dql.models.mapping.domain.SeriesResultElement;
import tools.descartes.dql.models.mapping.mapping.EntityMapping;
import tools.descartes.dql.models.mapping.mapping.MappingFactory;
public class SLAGeneratorInterpreter
extends AbstractQueryInterpreter<GenerateSLAConcern, PerformanceMetricsQueryConnector> {
private final MappingFactory mappingFactory = MappingFactory.eINSTANCE;
private DefaultProvider defaultProvider;
private MultipleArithmeticClause offsets;
private static String constraintClause;
private static String variationClause;
private double satisfactionLevel = 100.0;
public SLAGeneratorInterpreter(final GenerateSLAConcern query) {
super(query);
}
public SLAGeneratorInterpreter(final GenerateSLAConcern query, List<QueryProgressListener> listeners) {
super((GenerateSLAConcern) query, listeners);
}
@Override
public boolean interpretQuery() {
GenerateSLAConcern generateSLAConcern;
if (getQuery() instanceof GenerateSLAConcern) {
generateSLAConcern = (GenerateSLAConcern) getQuery();
final UsingClause usingClause = generateSLAConcern.getUsingClause();
final ModelReferenceClause modelReference = usingClause.getModelReference();
final ModelFamily family = modelReference.getFamily();
final String familyIdentifier = family.getFamily();
setModelFamily(familyIdentifier);
generateSLA(generateSLAConcern);
return true;
} else {
log.error("Query type not supported");
return false;
}
}
private void generateSLA(GenerateSLAConcern generateSLAConcern) {
this.defaultProvider = new DefaultProvider(generateSLAConcern.getUsingClause());
final UsingClause usingClause = generateSLAConcern.getUsingClause();
final ModelReferenceClause modelReference = usingClause.getModelReference();
final ModelFamily family = modelReference.getFamily();
final String familyIdentifier = family.getFamily();
constraintClause = "";
if (generateSLAConcern.getConstraintClause() != null) {
constraintClause = "\nCONSTRAINED AS '" + generateSLAConcern.getConstraintClause().getType().toString()
+ "'\n";
}
variationClause = SLAInterpreter.extractVariationString(generateSLAConcern.getDofClause());
try {
satisfactionLevel = generateSLAConcern.getPercentage();
} catch (NullPointerException e) {
}
setModelFamily(familyIdentifier);
if (!initQueryConnector()) {
String exception = "Could not load Connector for family " + getModelFamily() + ", aborting.";
log.error(exception);
throw new IllegalStateException(exception);
}
// Reset before work, allowing independent caching mechanisms in
// the DQL Connector
getQueryConnector().reset();
// ModelLocation model = modelReference.getModel();
// String location = model.getLocation();
// final EntityMapping request = mappingFactory.createEntityMapping();
// request.setQueryAsString(getQueryAsString());
// request.setModelLocation(location);
// TODO fix relative paths
// if (!new File(location).exists()) {
// location = QueryExecutionEngineImpl
// .resolveRelativePath((new
// File(model.getURI().path())).getParentFile().getAbsolutePath(), location);
// usingClause.getModelReference().getModel().setLocation(location);
// }
StringBuffer metricsQuerySB = new StringBuffer();
metricsQuerySB.append("SELECT\n");
for (EntityReference er : generateSLAConcern.getForClause().getEntityReferenceClause().getEntityReferences()) {
if (er.getType().equalsIgnoreCase("SERVICE")) {
metricsQuerySB.append("\t" + er.getAlias().getAlias() + "." + "responseTime" + ",\n");
// + "responseTime95thPerc" + ",\n");
// + "responseTime99thPerc" + ",\n");
}
}
metricsQuerySB.deleteCharAt(metricsQuerySB.length() - 2); // remove last comma
String queryString = getQueryAsString();
metricsQuerySB.append(constraintClause);
metricsQuerySB.append(variationClause);
String endString = "FOR" + queryString.split("FOR")[1] + ";";
endString = endString.replace("%20", " ");
endString = endString.replace(" @ ", "@");
endString = endString.replace(" @\r\n", "@");
endString = endString.replace(" ,", ",");
metricsQuerySB.append(endString);
String metricsQuery = metricsQuerySB.toString();
metricsQuery = metricsQuery.replace(" ,", ",");
log.info("-------------------\n" + "---metrics concern---\n" + metricsQuery + "\n-------------------");
EntityMapping result = runPerformanceMetricQuery(metricsQuery);
offsets = generateSLAConcern.getOffset();
String generatedSLA = generateSLA(result, endString);
String path = generateSLAConcern.getUsingClause().getModelReference().getModel().getLocation().toString();
path = (new File(path)).getParent().toString() + File.separator + "generated_sla.dql";
writeToFile(path, generatedSLA);
EditorHelper.openInEditor(path);
}
private void openEditor(IFile file) {
final IFile aFile = file;
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
IWorkbenchWindow dwindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = dwindow.getActivePage();
if (page != null) {
try {
IDE.openEditor(page, aFile, true);
} catch (PartInitException pie) {
log.error("Unable to open the Editor", pie);
}
}
}
});
}
private String generateSLA(EntityMapping result, String endString) {
StringBuffer slaString = new StringBuffer();
StringBuffer sloString = new StringBuffer();
slaString.append("MONITOR\n");
int sloCnt = 1;
double value = 0.0;
for (Entity ent : result.getEntities()) {
Result subresult = ent.getProbes().get(0).getStatTypes().get(0).getResult();
if (subresult instanceof DiscreteSeriesResult) {
value = 0.0;
for (SeriesResultElement elem : ((DiscreteSeriesResult) subresult).getElements()) {
value = Math.max(value, elem.getY().doubleValue());
}
value = getPercentile((DiscreteSeriesResult) subresult, satisfactionLevel);
} else if (subresult instanceof DecimalResult) {
value = (((DecimalResult) subresult).getValue()).doubleValue();
}
for (ArithmeticClause offset : offsets.getMultiClause()) {
double offsetValue = offset.getValue().getDoubleValue();
if (offset.getMode().equalsIgnoreCase("MULTIPLY")) {
value = value * offsetValue;
log.info("multiplied " + ent.getAlias() + " " + ent.getProbes().get(0).getMetricName()
+ " threshold by " + offsetValue);
} else if (offset.getMode().equalsIgnoreCase("ADD") | offset.getMode().equalsIgnoreCase("+")) {
value = value + offsetValue;
log.info("added " + offsetValue + " offset to " + ent.getAlias() + " "
+ ent.getProbes().get(0).getMetricName() + " threshold");
}
}
value = Math.floor(value * 1000d) / 1000d;
// Math.round(value * 10000.0) / 10000.0)
sloString.append("\t\tslo" + sloCnt++ + ": " + ent.getAlias() + "." + ent.getProbes().get(0).getMetricName()
+ "<" + value + " SATISFACTION-LEVEL " + satisfactionLevel + " PERCENT" + ",\n");
}
sloString.deleteCharAt(sloString.length() - 2);
slaString.append("\tAGREEMENTS\n\t\tsla1 CONTAINS (");
for (int i = 1; i < sloCnt; i++) {
slaString.append("slo" + i + ",");
}
slaString.deleteCharAt(slaString.length() - 1); // remove last comma
slaString.append(")");
slaString.append("\n\tGOALS\n");
slaString.append(sloString);
slaString.append(constraintClause);
slaString.append(variationClause);
slaString.append(endString);
return slaString.toString();
}
private double getPercentile(DiscreteSeriesResult subresult, double percent) {
EList<SeriesResultElement> list = subresult.getElements();
EList<SeriesResultElement> list2 = EcoreUtil.copy(subresult).getElements();
sort(list2);
int index = (int) (list2.size() * (percent / 100.0));
index = Math.min(index, list2.size() - 1);
double value = list2.get(index).getY().doubleValue();
// System.out.println(list2.get(0).getY().doubleValue() + " < " +
// list2.get(index).getY().doubleValue() + " < " + list2.get(list2.size() -
// 1).getY().doubleValue());
return value;
}
private static void sort(EList<SeriesResultElement> list) {
try {
// ); list.sort(
ECollections.sort(list, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
if ((((SeriesResultElement) o1).getY().doubleValue()
- ((SeriesResultElement) o2).getY().doubleValue()) > 0) {
return 1;
} else if ((((SeriesResultElement) o1).getY().doubleValue()
- ((SeriesResultElement) o2).getY().doubleValue()) < 0) {
return -1;
} else {
// if ((((SeriesResultElement)o1).getX().doubleValue() -
// ((SeriesResultElement)o2).getX().doubleValue()) > 0) {
// return 1;
// } else if ((((SeriesResultElement)o1).getX().doubleValue() -
// ((SeriesResultElement)o2).getX().doubleValue()) < 0) {
// return -1;
// }
if ((((SeriesResultElement) o1).getX().intValue()
- ((SeriesResultElement) o2).getX().intValue()) > 0) {
return 1;
} else if ((((SeriesResultElement) o1).getX().intValue()
- ((SeriesResultElement) o2).getX().intValue()) < 0) {
return -1;
}
}
return 1; // 0;
}
});
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
private EntityMapping runPerformanceMetricQuery(String queryString) {
final DescartesQL queryModel = QueryParserHelper.stringToModel(queryString);
EObject genQuery = queryModel.getQuery();
// Reuse of Performance Metrics connector
PerformanceMetricsQueryInterpreter interpreter = new PerformanceMetricsQueryInterpreter(
(PerformanceMetricsQuery) genQuery);
boolean validQuery = interpreter.interpretQuery();
if (!validQuery) {
log.error("query is not valid");
}
EntityMapping entityMapping = interpreter.getResult();
return entityMapping;
}
@Override
protected Class<PerformanceMetricsQueryConnector> getQueryConnectorClass() {
return PerformanceMetricsQueryConnector.class;
}
private void writeToFile(String file, String content) {
System.out.println("Saving SLA to " + file);
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(file));
writer.write(content);
System.out.println("-------------------");
System.out.println(content);
System.out.println("-------------------");
System.out.println("Done");
} catch (IOException e) {
log.error(e);
} finally {
try {
if (writer != null)
writer.close();
} catch (IOException e) {
log.error(e);
}
}
}
}
......@@ -26,9 +26,6 @@
*/
package tools.descartes.dql.core.engine.interpreter;
import static tools.descartes.dql.core.engine.util.QueryParserHelper.stringToModel;
import static tools.descartes.dql.core.engine.util.QueryParserHelper.toFlatConfigurationPropertiesClause;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
......@@ -40,9 +37,12 @@ import org.eclipse.emf.ecore.EObject;
import tools.descartes.dql.connector.PerformanceMetricsQueryConnector;
import tools.descartes.dql.connector.QueryProgressListener;
import tools.descartes.dql.core.engine.util.QueryParserHelper;
import tools.descartes.dql.core.engine.util.SLAReporter;
import tools.descartes.dql.core.engine.util.SLOEvaluationResult;
import tools.descartes.dql.lang.descartesQL.ConfigurationPropertiesClause;
import tools.descartes.dql.lang.descartesQL.DescartesQL;
import tools.descartes.dql.lang.descartesQL.DoFClause;
import tools.descartes.dql.lang.descartesQL.DoFReference;
import tools.descartes.dql.lang.descartesQL.DoFVariationClause;
import tools.descartes.dql.lang.descartesQL.DoubleValueVariationClause;
......@@ -82,6 +82,7 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
private HashMap<Slo, Double> sloPenaltiesMap;
private HashMap<Slo, Boolean> sloComplianceMap;
private HashMap<Sla, Boolean> slaComplianceMap;
private HashMap<Slo, SLOEvaluationResult> sloEvaluationMap;
private static String constraintClause;
private static String variationClause;
......@@ -111,7 +112,7 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
if (goal.getConstraintClause() != null) {
constraintClause = "\nCONSTRAINED AS '" + goal.getConstraintClause().getType().toString() + "'\n";
}
extractVariationString(goal);
variationClause = extractVariationString(goal.getDofClause());
setModelFamily(familyIdentifier);
......@@ -166,14 +167,14 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
Slo slo = slos.get(slos.size() - 1);
queryString += "\n" + getMetricClauseString((MetricClause) slo.getMetricClauseType()) + "\n";
queryString += constraintClause + variationClause + " FOR " + usingAndForStatement;
queryString += constraintClause + "\n" + variationClause + " FOR " + usingAndForStatement;
queryString = queryString.replace("%20", " ");
queryString = queryString.replace(" @ ", "@");
queryString += "\n";
System.out.println("-------------");
System.out.println(queryString);
System.out.println("-------------");
final DescartesQL queryModel = stringToModel(queryString);
final DescartesQL queryModel = QueryParserHelper.stringToModel(queryString);
EObject genQuery = queryModel.getQuery();
// Reuse of Performance Metrics connector
......@@ -260,6 +261,7 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
final ModelLocation model = modelReference.getModel();
final String location = model.getLocation();
sloEvaluationMap = new HashMap<Slo, SLOEvaluationResult>();
sloPenaltiesMap = new HashMap<Slo, Double>();
slaPenaltiesMap = new HashMap<Sla, Double>();
sloComplianceMap = new HashMap<Slo, Boolean>();
......@@ -271,7 +273,8 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
isSlaSatisfied(location, sla);
}
SLAReporter.printResults(slaPenaltiesMap, sloPenaltiesMap, sloComplianceMap, slaComplianceMap, slas,
SLAReporter.printResults(slaPenaltiesMap, sloPenaltiesMap, sloComplianceMap, slaComplianceMap, sloEvaluationMap,
slas,
goalQuery.getUsingClause().getModelReference().getModel().getLocation().toString());
return !slaComplianceMap.containsValue(false);
}
......@@ -287,11 +290,11 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
queryString = queryString.split("FOR")[1];
System.out.println(constraintClause);
queryString = "SELECT " + entity + "." + metric // + "." + statType
+ constraintClause + variationClause + " FOR" + queryString;
+ "\n" + constraintClause + "\n" + variationClause + " FOR" + queryString;
queryString = queryString.replace("%20", " ");
queryString = queryString.replace(" @ ", "@");
queryString += "\n";
final DescartesQL queryModel = stringToModel(queryString);
final DescartesQL queryModel = QueryParserHelper.stringToModel(queryString);
EObject genQuery = queryModel.getQuery();
// Reuse of Performance Metrics connector
......@@ -308,16 +311,9 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
}
private boolean isSlaSatisfied(final String location, Sla sla) {
log.info(sla.getName());
for (WeightedSlo wslo : sla.getWeightedSlo()) {
Slo slo = wslo.getSlo();
int weight = 1;
// try {
// weight = wslo.getWeight();
// } catch (Exception e) {
// log.info("could not parse weigth ==> set weight to 1");
// weight = 1;
// }
if (!sloComplianceMap.containsKey(slo)) {
boolean isSloSatisfied = isSloSatisfied(slo, location);
if (!isSloSatisfied) {
......@@ -345,7 +341,6 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
}
if (!slaComplianceMap.containsKey(sla)) {
slaComplianceMap.put(sla, true);
log.info(sla.getName() + " is satisfied");
}
return slaComplianceMap.get(sla);
}
......@@ -357,11 +352,10 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
for (Probe p : m.getProbes()) {
DecimalResult r = new DecimalResultImpl(threshold);
StatType s = new StatTypeImpl(r);
s.setTypeName("Threshold SLO " + slo.getName());
s.setTypeName("" + slo.getName());
p.getStatTypes().add(s);
}
}
// this.getResults().add(entityMapping);
this.setResult(entityMapping);
Result result = entityMapping.getEntities().get(0).getProbes().get(0).getStatTypes().get(0).getResult();
......@@ -373,51 +367,59 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
boolean isSatisfied = true;
double penalty = 0;
double violationThreshold = 0;
String comparator = slo.getComparator().getLiteral();
if (result instanceof DecimalResult) {
isSatisfied = isSatisfied((DecimalResult) result, comparator, threshold);
log.info(slo.getName() + ": " + ((DecimalResult) result).getValue().doubleValue() + " " + comparator + " "
+ threshold + " ==> " + isSatisfied);
// log.info(slo.getName() + ": " + ((DecimalResult)
// result).getValue().doubleValue() + " " + comparator + " "
// + threshold + " ==> " + isSatisfied);
if (isQuantitativeAnalysis && !isSatisfied) {
try {
penalty = slo.getPen().getViolation().getAmount();
violationThreshold = slo.getViolation().getAmount();
} catch (NullPointerException e) {
penalty = 0;
violationThreshold = 0;
}
}
} else if (result instanceof AbstractSeriesResult) {
EList<SeriesResultElement> elements = ((AbstractSeriesResult) result).getElements();
int violations = countViolations(elements, comparator, threshold);
double violationThreshold = 1;
boolean isPercentage = false;
try {
violationThreshold = slo.getPen().getViolation().getAmount();
violationThreshold = slo.getViolation().getAmount();
if (slo.getViolation().getPercentage() > 0) {
violationThreshold = slo.getViolation().getPercentage();
isPercentage = true;
}
} catch (NullPointerException e) {
}
String currency = "";
double violationValue = 0;
try {
currency = slo.getPen().getCurrency().toString();
violationValue = slo.getPen().getValue();
} catch (NullPointerException e) {
}
if (Math.floor(violations / violationThreshold) > 0) {
isSatisfied = false;
} else {
isSatisfied = true;
}
if (isQuantitativeAnalysis) {
double violationValue = 0;
try {
violationValue = slo.getPen().getValue();
} catch (NullPointerException e) {
if (isPercentage) {
double percentualViolations = (double) violations * 100 / elements.size();
isSatisfied = percentualViolations <= (100.0 - violationThreshold);
if (!isSatisfied) {
penalty = violationValue;
}
} else {
isSatisfied = (Math.floor(violations / violationThreshold) <= 0);
penalty = Math.floor(violations / violationThreshold) * violationValue;
log.info(slo.getName());
log.info("\tnumber of violations: " + violations);
log.info("\tpercentage of violations: " + (double) violations * 100 / elements.size() + "%");
log.info("\tnumber of violations units: " + Math.floor(violations / violationThreshold));
log.info("\tpenalty: " + penalty + " " + currency);
// log.info("\tnumber of violations units: " + Math.floor(violations /
// violationThreshold));
}
// log.info(slo.getName());
// log.info("\tnumber of violations: " + violations);
// log.info("\tpercentage of violations: " + (double) violations * 100 /
// elements.size() + "%");
SLOEvaluationResult res = new SLOEvaluationResult((double) violations * 100 / elements.size(), violations);
sloEvaluationMap.put(slo, res);
} else {
isSatisfied = false;
log.info("Could not evaluate slo" + slo.getName());
......@@ -482,18 +484,23 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
private void processExplorationStrategyClause(final PerformanceMetricsQueryConnector queryConnector,
final ExplorationStrategyClause explorationStrategyClause) {
final ConfigurationPropertiesClause configurationProperties = explorationStrategyClause.getParameterClause();
final Properties explorationStrategyProperties = toFlatConfigurationPropertiesClause(configurationProperties);
final Properties explorationStrategyProperties = QueryParserHelper
.toFlatConfigurationPropertiesClause(configurationProperties);
queryConnector.setDoFExplorationStrategy(explorationStrategyClause.getName(), explorationStrategyProperties);
}
private void extractVariationString(Goal goal) {
variationClause = "";
if (goal.getDofClause() != null) {
variationClause = "\nEVALUATE DOF VARYING '" + goal.getDofClause().getVaryingClause().getMode();
variationClause = goal.getDofClause().getMode().toString() + " " + "VARYING ";
for (DoFReference xy : goal.getDofClause().getVaryingClause().getDofReferences()) {
String dofStatement = "'" + xy.getDoFIdentifier().toString() + "'" + " AS "
public static String extractVariationString(DoFClause dofClause) {
StringBuffer variationClauseString = new StringBuffer();
if (dofClause != null) {
// variationClauseString.append("EVALUATE DOF VARYING '" +
// dofClause.getVaryingClause().getMode());
variationClauseString.append(dofClause.getMode().toString() + " " + "VARYING ");
for (DoFReference xy : dofClause.getVaryingClause().getDofReferences()) {
String dofStatement = "'" + xy.getDoFIdentifier().toString() + "'";
if (xy.getDoFAliasClause() != null) {
dofStatement += " AS "
+ xy.getDoFAliasClause().getAlias();
}
dofStatement += " <";
DoFVariationClause dofVariationClause = ((DoFVariationClause) (xy.getDoFVariationClause()));
......@@ -517,11 +524,13 @@ public class SLAInterpreter extends AbstractQueryInterpreter<Goal, PerformanceMe
}
dofStatement += ab.getValue().get(ab.getValue().size() - 1);
}
dofStatement += ">\n";
variationClause += dofStatement;
dofStatement += ">,\n";
variationClauseString.append(dofStatement);
}
variationClauseString.deleteCharAt(variationClauseString.length() - 2); // remove last comma
}
return variationClauseString.toString();
}
}
......@@ -41,10 +41,12 @@ import tools.descartes.dql.connector.QueryProgressListener;
import tools.descartes.dql.core.engine.interpreter.ModelStructureQueryInterpreter;
import tools.descartes.dql.core.engine.interpreter.PerformanceMetricsQueryInterpreter;
import tools.descartes.dql.core.engine.interpreter.QueryInterpreter;
import tools.descartes.dql.core.engine.interpreter.SLAGeneratorInterpreter;
import tools.descartes.dql.core.engine.interpreter.SLAInterpreter;
import tools.descartes.dql.core.engine.util.DQLLogger;
import tools.descartes.dql.core.engine.whatif.WhatIfQueryInterpreter;
import tools.descartes.dql.lang.descartesQL.DescartesQL;
import tools.descartes.dql.lang.descartesQL.GenerateSLAConcern;
import tools.descartes.dql.lang.descartesQL.Goal;
import tools.descartes.dql.lang.descartesQL.ListQuery;
import tools.descartes.dql.lang.descartesQL.ModelStructureQuery;
......@@ -100,6 +102,11 @@ public class QueryExecutionEngineImpl implements QueryExecutionEngine {
interpreter = new SLAInterpreter((Goal) query, listeners);
interpreter.interpretQuery();
new GraphicsEngine("Query Result Visualization", interpreter.getResults());
} else if (query instanceof GenerateSLAConcern) {
log.error("SLA generation, experimental.");
interpreter = new SLAGeneratorInterpreter((GenerateSLAConcern) query, listeners);
interpreter.interpretQuery();
// new GraphicsEngine("Query Result Visualization", interpreter.getResults());
} else {
log.error("No suitable QueryInterpreter found, aborting.");
return createEmptyResultList();
......
package tools.descartes.dql.core.engine.util;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
public class EditorHelper {
public static void openInEditor(String path) {
IPath iPath = new Path(path);
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
if (win == null) {
win = wb.getWorkbenchWindows()[0]; // quick fix if get active window fails
}
if (win != null) {
IWorkbenchPage page = win.getActivePage();
if (page != null) {
IFileStore fileStore = EFS.getLocalFileSystem().getStore(iPath);
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
IDE.openEditorOnFileStore(page, fileStore);
} catch (PartInitException pie) {
System.err.println("Unable to open the Editor");
System.err.println(pie.getStackTrace());
} catch (SWTException e) {
System.err.println(e.getStackTrace());
}
}
});
}
}
}
}
package tools.descartes.dql.core.engine.util;
public class SLOEvaluationResult {
private double percentageViolations;
private int numberOfViolations;
public SLOEvaluationResult(double percentageViolations, int numberOfViolations) {
this.percentageViolations = percentageViolations;
this.numberOfViolations = numberOfViolations;
}
public String getHTMLString() {
return percentageViolations + "% violations (" + numberOfViolations + " in total)";
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment