aboutsummaryrefslogtreecommitdiffstats
path: root/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend')
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend124
1 files changed, 112 insertions, 12 deletions
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend
index 8c064cd3..6e725086 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend
@@ -1,28 +1,128 @@
1package hu.bme.mit.inf.dslreasoner.application.execution 1package hu.bme.mit.inf.dslreasoner.application.execution
2 2
3import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.AllPatternEntry
4import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript
5import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternElement
6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternEntry
3import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternSpecification 7import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternSpecification
4import hu.bme.mit.inf.dslreasoner.application.execution.util.VQLParser 8import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport
5import java.util.LinkedHashMap 9import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor
6import org.eclipse.emf.ecore.resource.ResourceSet 10import java.util.HashMap
11import java.util.LinkedHashSet
12import java.util.List
13import java.util.Set
14import org.eclipse.emf.ecore.EClass
15import org.eclipse.emf.ecore.EPackage
16import org.eclipse.viatra.query.patternlanguage.emf.eMFPatternLanguage.PatternModel
17import org.eclipse.viatra.query.patternlanguage.emf.specification.SpecificationBuilder
18import org.eclipse.viatra.query.patternlanguage.patternLanguage.Pattern
19import org.eclipse.viatra.query.patternlanguage.patternLanguage.PatternCompositionConstraint
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification
21import org.eclipse.xtext.EcoreUtil2
7 22
8import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* 23import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
9 24
10class QueryLoader { 25class QueryLoader {
11 val parser = new VQLParser 26 //val parser = new VQLParser
27 val builder = new SpecificationBuilder
12 28
13 def loadQueries(PatternSpecification specification, ResourceSet rs, Context context) { 29 def loadQueries(PatternSpecification specification) {
14 val uris = specification.entries.map[path].toList 30 val patterns = new LinkedHashSet
15 val models = parser.parse(uris,rs,context)
16 31
17 val res = new LinkedHashMap 32 for(entry: specification.entries) {
18 for(entry : specification.entries) { 33 patterns += getPatterns(entry)
19 res.put(entry,entry.path.lookup(models))
20 } 34 }
21 35
22 return res 36 val allConcernedPatterns = patterns.allReferredPatterns
37 val pattern2Specification = allConcernedPatterns.translatePatterns()
38
39 val List<IQuerySpecification<?>> patternsToTranslate =
40 pattern2Specification.values.toList
41 val Set<IQuerySpecification<?>> validationPatterns =
42 patterns.filter[it.annotations.exists[it.name.equals("Constraint")]]
43 .map[lookup(pattern2Specification)]
44 .toSet
45 val derivedFeatures = calculateDerivedFeatures(patterns.referredEcoreModels,patterns.map[it.lookup(pattern2Specification)])
46
47 return new ViatraQuerySetDescriptor(
48 patternsToTranslate,
49 validationPatterns,
50 derivedFeatures
51 ) -> allConcernedPatterns
23 } 52 }
24 53
25 def pruneQueries(PatternSpecification specification, ResourceSet rs, Context context) { 54 def dispatch List<Pattern> getPatterns(AllPatternEntry entry) {
55 val excluded = entry.exclusuion.map[getPatterns]
56 val referredPatternModels = allPatternsWithSamePackage(entry,entry.package as PatternModel).toSet
57 val patterns = referredPatternModels.map[patterns].flatten
58 return patterns.filter[!excluded.contains(it)].toList
59 }
60
61 def dispatch List<Pattern> getPatterns(PatternElement entry) {
62 return #[entry.pattern]
63 }
64
65 def private allPatternsWithSamePackage(PatternEntry entry, PatternModel model) {
66 val packageURI = model.packageName
67 val document = EcoreUtil2.getContainerOfType(entry,ConfigurationScript)
68 val viatraImportsWithSamePackage = document.imports
69 .filter(ViatraImport)
70 .map[it.importedViatra]
71 .filterNull
72 .filter[packageName.equals(packageURI)]
73 return viatraImportsWithSamePackage
74 }
75
76 /**
77 * Adds all referred patterns to a given set of patterns.
78 */
79 def private Set<Pattern> allReferredPatterns(Set<Pattern> patterns) {
80 val res = new LinkedHashSet
81 res+=patterns
26 82
83 var boolean changed
84 do{
85 changed = false
86 val newElements = res.map[directlyReferredPatterns].flatten.filter[!res.contains(it)]
87 if(!newElements.empty) {
88 changed = true
89 res.addAll(newElements)
90 }
91 } while(changed)
92
93 return res
94 }
95
96 def private directlyReferredPatterns(Pattern pattern) {
97 return pattern
98 .bodies
99 .map[constraints]
100 .flatten
101 .filter(PatternCompositionConstraint)
102 .map[call.patternRef].toSet
103 }
104
105 def private referredEcoreModels(Set<Pattern> patterns) {
106 patterns.map[eContainer as PatternModel].map[it.importPackages.packageImport.map[it.EPackage].filterNull].flatten.toSet
107 }
108
109 def private translatePatterns(Set<Pattern> xtextPattern) {
110 xtextPattern.toInvertedMap[builder.getOrCreateSpecification(it) as IQuerySpecification<?>]
111 }
112
113 def private calculateDerivedFeatures(Set<EPackage> packages, Iterable<IQuerySpecification<?>> patterns) {
114 val features = packages.map[EClassifiers].flatten.filter(EClass).map[it.EStructuralFeatures].flatten
115 val res = new HashMap
116 for(feature : features) {
117 val QBFAnnotation = feature.EAnnotations.filter[it.source.equals("org.eclipse.viatra.query.querybasedfeature")].head
118 if(QBFAnnotation !== null) {
119 val targetFQN = QBFAnnotation.details.get("patternFQN")
120 val referredPattern = patterns.filter[it.fullyQualifiedName.equals(targetFQN)].head
121 if(referredPattern!== null) {
122 res.put(referredPattern, feature)
123 }
124 }
125 }
126 return res
27 } 127 }
28} \ No newline at end of file 128} \ No newline at end of file