Skip to content

Commit 9df6767

Browse files
committed
NAC operation for both runtime and iterator based codegenerator
1 parent 56ec5ea commit 9df6767

12 files changed

+181
-315
lines changed

plugins/hu.bme.mit.incquery.localsearch.cpp/src/hu/bme/mit/incquery/localsearch/cpp/generator/internal/BaseGenerator.xtend

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class ViatraQueryHeaderGenerator extends BaseGenerator {
3232
@Accessors(PROTECTED_GETTER) val Set<Include> includes
3333
val GuardHelper guard
3434

35-
val NamespaceHelper implementationNamespace
35+
@Accessors(PROTECTED_GETTER) val NamespaceHelper implementationNamespace
3636
protected val String unitName
3737

3838

plugins/hu.bme.mit.incquery.localsearch.cpp/src/hu/bme/mit/incquery/localsearch/cpp/generator/internal/common/MatcherGenerator.xtend

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,30 +31,31 @@ abstract class MatcherGenerator extends ViatraQueryHeaderGenerator {
3131

3232
includes += new Include("Viatra/Query/QueryEngine.h")
3333
includes += new Include("unordered_set", true)
34+
// TODO: this is only required for the using statement, however this should be moved from here as it is not generally necessary
35+
includes += new Include("Viatra/Query/Plan/SearchPlanExecutor.h")
3436
}
3537

3638
override compileInner() '''
3739
template<class ModelRoot>
3840
class «unitName» {
3941
public:
40-
friend class ::Viatra::Query::QueryEngine<ModelRoot>;
42+
«unitName»(const ModelRoot* model, const ::Viatra::Query::Matcher::ISearchContext* context)
43+
: _model(model), _context(context) {
44+
}
4145

4246
«FOR pattern : patternGroup»
4347
«compileGetter(pattern)»
4448
«ENDFOR»
45-
49+
4650
private:
47-
«unitName»(const ModelRoot* model, const ::Viatra::Query::Matcher::ISearchContext* context)
48-
: _model(model), _context(context) {
49-
}
50-
5151
const ModelRoot* _model;
5252
const ::Viatra::Query::Matcher::ISearchContext* _context;
5353
};
5454
'''
5555
5656
private def compileGetter(PatternStub pattern) '''
5757
std::unordered_set<«name»Match> matches(«getParamList(pattern)») const {
58+
««« TODO: Move using statements
5859
using ::Viatra::Query::Matcher::ISearchContext;
5960
using ::Viatra::Query::Plan::SearchPlan;
6061
using ::Viatra::Query::Plan::SearchPlanExecutor;
@@ -87,19 +88,18 @@ abstract class MatcherGenerator extends ViatraQueryHeaderGenerator {
8788
pattern.boundParameters.map[
8889
val variable = it.toPVariable(matchingFrame);
8990
'''«variable.type(matchingFrame)» «it.name»'''
90-
].join(", ")
91+
].join(", ")
9192
}
9293
9394
private def toTypeName(EClassifier clazz) {
9495
NameUtils::toTypeName(clazz)
9596
}
9697
97-
private def type(PVariable variable, MatchingFrameStub matchingFrame) {
98+
protected def type(PVariable variable, MatchingFrameStub matchingFrame) {
9899
matchingFrame.getVariableStrictType(variable).toTypeName
99100
}
100101
101102
protected def toPVariable(PParameter pParameter, MatchingFrameStub matchingFrame) {
102-
// TODO: soooo slow....
103103
matchingFrame.getVariableFromParameter(pParameter)
104104
}
105105
}

plugins/hu.bme.mit.incquery.localsearch.cpp/src/hu/bme/mit/incquery/localsearch/cpp/generator/internal/iterator/IteratorMatcherGenerator.xtend

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import hu.bme.mit.incquery.localsearch.cpp.generator.model.PatternBodyStub
88
import hu.bme.mit.incquery.localsearch.cpp.generator.model.PatternStub
99
import java.util.Map
1010
import java.util.Set
11+
import hu.bme.mit.incquery.localsearch.cpp.generator.internal.common.NameUtils
12+
import hu.bme.mit.incquery.localsearch.cpp.generator.internal.common.Include
1113

1214
class IteratorMatcherGenerator extends MatcherGenerator {
1315

@@ -24,14 +26,39 @@ class IteratorMatcherGenerator extends MatcherGenerator {
2426
]
2527
}
2628

29+
override initialize() {
30+
super.initialize
31+
includes += new Include("Viatra/Query/Util/IsNull.h")
32+
}
33+
2734
override protected compilePlanExecution(PatternStub pattern, PatternBodyStub patternBody) '''
2835
auto _classHelper = &_context->get_class_helper();
36+
37+
«assignParamsToVariables(pattern)»
38+
2939
«val sog = searchOperations.get(pattern).get(patternBody)»
3040
«sog.matchFoundHandler = ['''matches.insert(«it»);'''
3141

32-
«sog.compile»
42+
«val setupCode = new StringBuilder»
43+
«val executionCode = sog.compile(setupCode)»
44+
45+
«setupCode.toString»
46+
47+
«executionCode»
3348
'''
3449
50+
def assignParamsToVariables(PatternStub pattern) {
51+
val matchingFrame = pattern.patternBodies.head.matchingFrame
52+
'''
53+
«FOR param : pattern.boundParameters»
54+
«val varName = NameUtils::getPurgedName(param.toPVariable(matchingFrame))»
55+
«IF varName != param.name»
56+
auto «NameUtils::getPurgedName(param.toPVariable(matchingFrame))» = «param.name»;
57+
«ENDIF»
58+
«ENDFOR»
59+
'''
60+
}
61+
3562
3663
3764
}

plugins/hu.bme.mit.incquery.localsearch.cpp/src/hu/bme/mit/incquery/localsearch/cpp/generator/internal/iterator/IteratorSearchOperationGenerator.xtend

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ package hu.bme.mit.incquery.localsearch.cpp.generator.internal.iterator
33
import hu.bme.mit.cpp.util.util.CppHelper
44
import hu.bme.mit.incquery.localsearch.cpp.generator.internal.BaseGenerator
55
import hu.bme.mit.incquery.localsearch.cpp.generator.internal.common.MatchGenerator
6+
import hu.bme.mit.incquery.localsearch.cpp.generator.internal.common.NameUtils
67
import hu.bme.mit.incquery.localsearch.cpp.generator.model.AbstractSearchOperationStub
78
import hu.bme.mit.incquery.localsearch.cpp.generator.model.CheckInstanceOfStub
89
import hu.bme.mit.incquery.localsearch.cpp.generator.model.CheckMultiNavigationStub
910
import hu.bme.mit.incquery.localsearch.cpp.generator.model.CheckSingleNavigationStub
1011
import hu.bme.mit.incquery.localsearch.cpp.generator.model.ExtendInstanceOfStub
1112
import hu.bme.mit.incquery.localsearch.cpp.generator.model.ExtendMultiNavigationStub
1213
import hu.bme.mit.incquery.localsearch.cpp.generator.model.ExtendSingleNavigationStub
14+
import hu.bme.mit.incquery.localsearch.cpp.generator.model.ISearchOperationStub
15+
import hu.bme.mit.incquery.localsearch.cpp.generator.model.NACOperationStub
1316
import java.util.Collection
1417
import java.util.LinkedList
1518
import java.util.Map
@@ -20,8 +23,6 @@ import org.eclipse.emf.ecore.EClassifier
2023
import org.eclipse.emf.ecore.EStructuralFeature
2124
import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable
2225
import org.eclipse.xtend.lib.annotations.Accessors
23-
import hu.bme.mit.incquery.localsearch.cpp.generator.internal.common.NameUtils
24-
import hu.bme.mit.incquery.localsearch.cpp.generator.model.ISearchOperationStub
2526

2627
class IteratorSearchOperationGenerator extends BaseGenerator {
2728

@@ -51,36 +52,44 @@ class IteratorSearchOperationGenerator extends BaseGenerator {
5152
operationsQueue.addAll(operations)
5253
}
5354

54-
override compile() {
55+
override compile(StringBuilder setupCode) {
5556
variableNameCache.clear
5657
variableNameCounter.clear
57-
compileNext
58+
compileNext(setupCode)
5859
}
5960

60-
def dispatch compileOperation(CheckInstanceOfStub operation) '''
61+
def dispatch compileOperation(CheckInstanceOfStub operation, StringBuilder setupCode) '''
6162
if(_classHelper->is_super_typeoperation.variable.cppName»->get_type_id(), «operation.key.type.typeName»::type_id)) {
6263
«val typedVar = operation.variable.typedVariable(operation, operation.key)»
63-
«operation.key.type.typeName»«IF operation.key.type instanceof EClass»*«ENDIF» «operation.variable.incrementName» = «typedVar»;
64-
«compileNext»
64+
auto «operation.variable.incrementName» = «typedVar»;
65+
«compileNext(setupCode)»
6566
}
6667
'''
6768
68-
def dispatch compileOperation(CheckSingleNavigationStub operation) '''
69+
def dispatch compileOperation(CheckSingleNavigationStub operation, StringBuilder setupCode) '''
6970
«val tarName = operation.target.cppName»
7071
«val srcName = operation.source.cppName»
7172
«val relName = operation.key.name»
7273
if(«srcName»->«relName» == «tarName») {
73-
«compileNext»
74+
«compileNext(setupCode)»
7475
}
7576
'''
7677
77-
def dispatch compileOperation(CheckMultiNavigationStub operation) '''
78+
def dispatch compileOperation(CheckMultiNavigationStub operation, StringBuilder setupCode) '''
7879
«val tarName = operation.target.cppName»
7980
«val srcName = operation.source.cppName»
8081
«val relName = operation.key.name»
8182
auto& data = «srcName»->«relName»;
8283
if(std::find(data.begin(), data.end(), «tarName») != data.end()) {
83-
«compileNext»
84+
«compileNext(setupCode)»
85+
}
86+
'''
87+
88+
def dispatch compileOperation(NACOperationStub operation, StringBuilder setupCode) '''
89+
«val matcherName = '''matcher_«Math.abs(operation.hashCode)»'''»
90+
«val youShallNotPrint = setupCode.append('''«operation.matcher»<ModelRoot> «matcherName»(_model, _context);'''
91+
if(«matcherName».matches(«operation.bindings.map[cppName].join(", ")»).size() == 0) {
92+
«compileNext(setupCode)»
8493
}
8594
'''
8695
@@ -95,35 +104,37 @@ class IteratorSearchOperationGenerator extends BaseGenerator {
95104
return expressionString
96105
}
97106
98-
def dispatch compileOperation(ExtendInstanceOfStub operation) '''
107+
def dispatch compileOperation(ExtendInstanceOfStub operation, StringBuilder setupCode) '''
99108
«val type = operation.matchingFrame.getVariableStrictType(operation.variable)»
100109
«val typeHelper = CppHelper::getTypeHelper(type)»
101110
«val varName = operation.variable.cppName»
102111
for(auto&& «varName» :typeHelper.FQN»::_instances)) {
103-
«compileNext»
112+
«compileNext(setupCode)»
104113
}
105114
'''
106115
107-
def dispatch compileOperation(ExtendSingleNavigationStub operation) '''
116+
def dispatch compileOperation(ExtendSingleNavigationStub operation, StringBuilder setupCode) '''
108117
«val tarName = operation.target.cppName»
109118
«val srcName = operation.source.cppName»
110119
«val relName = operation.key.name»
111-
auto «tarName» = «srcName»->«relName»;
112-
«compileNext»
120+
if(!::Viatra::Query::Util::IsNull<decltype(«srcName»->«relName»)>::check(«srcName»->«relName»)) {
121+
auto «tarName» = «srcName»->«relName»;
122+
«compileNext(setupCode)»
123+
}
113124
'''
114125
115-
def dispatch compileOperation(ExtendMultiNavigationStub operation) '''
126+
def dispatch compileOperation(ExtendMultiNavigationStub operation, StringBuilder setupCode) '''
116127
«val tarName = operation.target.cppName»
117128
«val srcName = operation.source.cppName»
118129
«val relName = operation.key.name»
119130
for(auto&& «tarName» : «srcName»->«relName») {
120-
«compileNext»
131+
«compileNext(setupCode)»
121132
}
122133
'''
123134
124-
def dispatch compileOperation(ISearchOperationStub operation) '''
135+
def dispatch compileOperation(ISearchOperationStub operation, StringBuilder setupCode) '''
125136
//NYI {
126-
«compileNext»
137+
«compileNext(setupCode)»
127138
}
128139
'''
129140
@@ -138,9 +149,9 @@ class IteratorSearchOperationGenerator extends BaseGenerator {
138149
«matchFoundHandler.apply("match"
139150
'''
140151
141-
def CharSequence compileNext() {
152+
def CharSequence compileNext(StringBuilder setupCode) {
142153
if (!operationsQueue.isEmpty)
143-
operationsQueue.poll.compileOperation
154+
operationsQueue.poll.compileOperation(setupCode)
144155
else
145156
createMatch
146157
}
@@ -158,6 +169,7 @@ class IteratorSearchOperationGenerator extends BaseGenerator {
158169
]
159170
val postfixedName = '''«name»_«count»'''
160171
variableNameCache.put(variable.name, postfixedName)
172+
variableNameCounter.put(variable.name, count + 1)
161173
return postfixedName
162174
}
163175

plugins/hu.bme.mit.incquery.localsearch.cpp/src/hu/bme/mit/incquery/localsearch/cpp/generator/internal/runtime/RuntimeMatcherGenerator.xtend

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class RuntimeMatcherGenerator extends MatcherGenerator {
5353
private def initializeFrame(MatchingFrameGenerator matchingFrameGen, Set<PVariable> boundVariables, int bodyNum) '''
5454
«name»Frame_«bodyNum» frame;
5555
«FOR boundVar : boundVariables»
56-
frame.«matchingFrameGen.getVariableName(boundVar)» = «boundVar.name»;
56+
frame.«matchingFrameGen.getVariableName(boundVar)» = «matchingFrameGen.matchingFrame.getParameterFromVariable(boundVar).get.name»;
5757
«ENDFOR»
5858
'''
5959
}

plugins/hu.bme.mit.incquery.localsearch.cpp/src/hu/bme/mit/incquery/localsearch/cpp/generator/internal/runtime/RuntimeQuerySpecificationGenerator.xtend

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import hu.bme.mit.incquery.localsearch.cpp.generator.model.PatternStub
88
import java.util.List
99
import java.util.Map
1010
import java.util.Set
11+
import hu.bme.mit.incquery.localsearch.cpp.generator.model.DependentSearchOperationStub
12+
import hu.bme.mit.incquery.localsearch.cpp.generator.internal.common.Include
1113

1214
class RuntimeQuerySpecificationGenerator extends QuerySpecificationGenerator {
1315

@@ -30,6 +32,19 @@ class RuntimeQuerySpecificationGenerator extends QuerySpecificationGenerator {
3032
override initialize() {
3133
super.initialize
3234
includes += frameGenerators.values.map[include]
35+
// TODO: this does not work with if there are multiple query files, somehow the related matcher generator needs to be accessed and its include path should be used
36+
searchOperations.keySet
37+
.map[it.patternBodies]
38+
.flatten
39+
.map[it.searchOperations]
40+
.flatten
41+
.filter(DependentSearchOperationStub)
42+
.map[it.dependencies]
43+
.flatten
44+
.forEach[
45+
val matcherName = '''«it.referredQuery.fullyQualifiedName.substring(it.referredQuery.fullyQualifiedName.lastIndexOf('.')+1).toFirstUpper»Matcher'''
46+
includes += new Include('''«implementationNamespace.toString("/")»/«matcherName».h''')
47+
]
3348
}
3449

3550
override generatePlan(PatternStub pattern, PatternBodyStub patternBody) '''

plugins/hu.bme.mit.incquery.localsearch.cpp/src/hu/bme/mit/incquery/localsearch/cpp/generator/internal/runtime/RuntimeSearchOperationGenerator.xtend

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ class RuntimeSearchOperationGenerator extends BaseGenerator {
5252
}
5353

5454
private dispatch def compileOperation(NACOperationStub operation, StringBuilder setupCode) {
55-
setupCode.append('''«operation.matcher» matcher_«operation.hashCode»(model, «queryName»QueryGroup::instance()->context())''')
56-
return '''create_«NACOperationStub::NAME»<«frameGenerator.frameName»>(matcher_«operation.hashCode», «operation.bindings.join(", ")»)'''
55+
val matcherName = '''matcher_«Math.abs(operation.hashCode)»'''
56+
setupCode.append('''«operation.matcher»<ModelRoot> «matcherName»(model, «queryName.toFirstUpper»QueryGroup::instance()->context());''')
57+
return '''create_«NACOperationStub::NAME»<«frameGenerator.frameName»>(«matcherName», «operation.bindings.map[toGetter].join(", ")»)'''
5758
}
5859

5960
private dispatch def compileOperation(ExtendInstanceOfStub operation, StringBuilder setupCode) {

plugins/hu.bme.mit.incquery.localsearch.cpp/src/hu/bme/mit/incquery/localsearch/cpp/generator/model/ISearchOperationStub.xtend

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package hu.bme.mit.incquery.localsearch.cpp.generator.model
22

3+
import hu.bme.mit.incquery.localsearch.cpp.generator.planner.MatcherReference
34
import java.util.Set
45
import org.eclipse.emf.ecore.EClassifier
56
import org.eclipse.emf.ecore.EStructuralFeature
67
import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable
8+
import org.eclipse.xtend.lib.annotations.Accessors
79
import org.eclipse.xtend.lib.annotations.Data
810

911
interface ISearchOperationStub {
@@ -62,13 +64,23 @@ abstract class AbstractSearchOperationStub implements ISearchOperationStub{
6264

6365
}
6466

65-
@Data class NACOperationStub extends AbstractSearchOperationStub {
67+
@Data abstract class DependentSearchOperationStub extends AbstractSearchOperationStub {
68+
69+
@Accessors(NONE) val Set<MatcherReference> dependencies
70+
71+
def getDependencies() {
72+
dependencies
73+
}
74+
75+
}
76+
77+
@Data class NACOperationStub extends DependentSearchOperationStub {
6678

6779
public static val String NAME = "NACOperation"
6880

6981
val CharSequence matcher
7082
val Set<PVariable> bindings
71-
83+
7284
}
7385

7486
@Data class ExtendInstanceOfStub extends InstanceOfStub {

plugins/hu.bme.mit.incquery.localsearch.cpp/src/hu/bme/mit/incquery/localsearch/cpp/generator/planner/CPPSearchOperationAcceptor.xtend

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,9 @@ class CPPSearchOperationAcceptor implements ISearchOperationAcceptor {
101101

102102
override acceptNACOperation(PQuery calledPQuery, Set<PVariable> boundVariables, Set<PParameter> boundParameters) {
103103
val matcherName = '''«calledPQuery.fullyQualifiedName.substring(calledPQuery.fullyQualifiedName.lastIndexOf('.')+1).toFirstUpper»Matcher'''
104-
searchOperations += new NACOperationStub(matchingFrame, matcherName, boundVariables)
105-
106-
107-
108-
dependencies += new MatcherReference(calledPQuery, boundParameters)
104+
val dependency = new MatcherReference(calledPQuery, boundParameters)
105+
dependencies += dependency
106+
searchOperations += new NACOperationStub(matchingFrame, #{dependency}, matcherName, boundVariables)
109107
}
110108

111109
def getPatternBodyStub() {

0 commit comments

Comments
 (0)