/******************************************************************************* * Copyright (c) 2010-2013, Bergmann Gabor, Istvan Rath and Daniel Varro * 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: * Bergmann Gabor - initial API and implementation *******************************************************************************/ package hu.bme.mit.incquery.querymetrics; import java.util.ArrayDeque; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Queue; import java.util.Set; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EObject; import org.eclipse.incquery.patternlanguage.patternLanguage.CheckConstraint; import org.eclipse.incquery.patternlanguage.patternLanguage.Constraint; import org.eclipse.incquery.patternlanguage.patternLanguage.PathExpressionConstraint; import org.eclipse.incquery.patternlanguage.patternLanguage.Pattern; import org.eclipse.incquery.patternlanguage.patternLanguage.PatternBody; import org.eclipse.incquery.patternlanguage.patternLanguage.PatternCall; import org.eclipse.incquery.patternlanguage.patternLanguage.PatternCompositionConstraint; /** * @author Bergmann Gabor * */ public class QueryOnlyMetrics { /** * nested NAC depth */ public static int nestedNacDepth(Pattern pattern) { int result = 0; final EList<PatternBody> bodies = pattern.getBodies(); for (PatternBody body : bodies) { final EList<Constraint> constraints = body.getConstraints(); for (Constraint constraint : constraints) { if (constraint instanceof PatternCompositionConstraint) { final PatternCompositionConstraint compo = (PatternCompositionConstraint) constraint; final PatternCall call = compo.getCall(); final Pattern patternRef = call.getPatternRef(); final int auxResult = nestedNacDepth(patternRef) + (compo.isNegative() ? 1 : 0); if (auxResult > result) result = auxResult; } } } return result; } /** * Number of: ... */ public static int numberOfParameters(Pattern pattern) { return pattern.getParameters().size(); } /** * Number of: ... */ public static Map<PatternBody,Integer> numberOfLocalVariables(Pattern pattern) { Map<PatternBody, Integer> results = new HashMap<PatternBody, Integer>(); final EList<PatternBody> bodies = pattern.getBodies(); for (PatternBody patternBody : bodies) { results.put(patternBody, patternBody.getVariables().size()); } return results; } /** * Number of: ... */ public static Map<PatternBody,Integer> numberOfAttributeChecks(Pattern pattern) { Map<PatternBody, Integer> results = new HashMap<PatternBody, Integer>(); final EList<PatternBody> bodies = pattern.getBodies(); for (PatternBody patternBody : bodies) { int count = 0; final EList<Constraint> constraints = patternBody.getConstraints(); for (Constraint constraint : constraints) { if (constraint instanceof CheckConstraint) count++; } results.put(patternBody, count); } return results; } // /** // * Number of: ... // */ // public static Map<PatternBody,Integer> numberOfEnumerableConstraints(Pattern pattern) { // Map<PatternBody, Integer> results = new HashMap<PatternBody, Integer>(); // final EList<PatternBody> bodies = pattern.getBodies(); // for (PatternBody patternBody : bodies) { // int count = 0; // final EList<Constraint> constraints = patternBody.getConstraints(); // for (Constraint constraint : constraints) { // if (constraint instanceof EClassifierConstraint || // constraint instanceof PathExpressionConstraint || // constraint instanceof PatternCompositionConstraint) // count++; // } // results.put(patternBody, count); // } // return results; // } /** * Number of: ... */ public static Map<PatternBody,Integer> numberOfEdgeConstraints(Pattern pattern) { Map<PatternBody, Integer> results = new HashMap<PatternBody, Integer>(); final EList<PatternBody> bodies = pattern.getBodies(); for (PatternBody patternBody : bodies) { int count = 0; final EList<Constraint> constraints = patternBody.getConstraints(); for (Constraint constraint : constraints) { if (constraint instanceof PathExpressionConstraint) count++; } results.put(patternBody, count); } return results; } public static Set<Pattern> withAllDependencies(Set<Pattern> userQueries) { Set<Pattern> result = new HashSet<Pattern>(userQueries); Queue<Pattern> todo = new ArrayDeque<Pattern>(userQueries); while(!todo.isEmpty()) { final Pattern pattern = todo.poll(); final TreeIterator<EObject> eAllContents = pattern.eAllContents(); while (eAllContents.hasNext()) { final EObject next = eAllContents.next(); if (next instanceof PatternCall) { final Pattern called = ((PatternCall) next).getPatternRef(); if (result.add(called)) todo.add(called); } } } return result; } }