aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen
diff options
context:
space:
mode:
authorLibravatar 20001LastOrder <boqi.chen@mail.mcgill.ca>2020-11-04 01:33:58 -0500
committerLibravatar 20001LastOrder <boqi.chen@mail.mcgill.ca>2020-11-04 01:33:58 -0500
commita20af4d0dbf5eab84ee271d426528aabb5a8ac3b (patch)
treea9ab772ee313125aaf3a941d66e131b408d949ba /Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen
parentchanges in settings of measurements (diff)
parentmerge with current master, comment numerical solver related logging (diff)
downloadVIATRA-Generator-a20af4d0dbf5eab84ee271d426528aabb5a8ac3b.tar.gz
VIATRA-Generator-a20af4d0dbf5eab84ee271d426528aabb5a8ac3b.tar.zst
VIATRA-Generator-a20af4d0dbf5eab84ee271d426528aabb5a8ac3b.zip
fix merging issue
Diffstat (limited to 'Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen')
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore78
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Adjacent.java719
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedTo.java704
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedToNotSymmetric.java724
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedToReflexive.java563
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_2.java564
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_3.java717
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_4.java847
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_5.java841
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/InputsOfTurnout.java570
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java405
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/MultipleConnectedTo.java565
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Output.java724
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/OutputReflexive.java559
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Reachable.java719
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooFewInputsOfTurnout.java559
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java583
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfTurnout.java600
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_2.java564
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_3.java713
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutConnectedToBothOutputs.java589
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutOutput.java727
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutOutputsAreSame.java572
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Unreachable.java714
24 files changed, 14920 insertions, 0 deletions
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore
new file mode 100644
index 00000000..a84c2906
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore
@@ -0,0 +1,78 @@
1/.ConnectedToReflexive.java._trace
2/.Modes3Queries.java._trace
3/.StraightReflexive.java._trace
4/.DivergentReflexive.java._trace
5/.TurnoutOutputsAreSame.java._trace
6/.Adjacent.java._trace
7/.Output.java._trace
8/.OutputReflexive.java._trace
9/.TooManyAdjacentSegmentsOfSegment.java._trace
10/.Turnout.java._trace
11/.ConnectedTo.java._trace
12/.TurnoutNotConnectedToOutput.java._trace
13/.DisjointNetwork.java._trace
14/.Reachable.java._trace
15/.Unreachable.java._trace
16/.TurnoutInSegments.java._trace
17/.ConnectedToNotSymmetric.java._trace
18/.TurnoutConnectedToBothOutputs.java._trace
19/.TooManyAdjacentTurnouts.java._trace
20/.NoAdjacentSegmentOfSegment.java._trace
21/.TurnoutOutput.java._trace
22/.NoInputOfSegment.java._trace
23/.TooManyInputsOfSegment.java._trace
24/.ExtraInputOfTurnout.java._trace
25/.NoExtraInputOfTurnout.java._trace
26/.TooManyExtraInputsOfTurnout.java._trace
27/.TooManyInputsOfTurnout.java._trace
28/.NonDivergentInputOfTurnout.java._trace
29/.NonStraightInputOfTurnout.java._trace
30/.TooManyNonDivergentInputsOfTurnout.java._trace
31/.TooManyNonStraightInputsOfTurnout.java._trace
32/.InputsOfTurnout.java._trace
33/.TooFewInputsOfTurnout.java._trace
34/.CloseTrains_step_2.java._trace
35/.CloseTrains_step_3.java._trace
36/.CloseTrains_step_4.java._trace
37/.CloseTrains_step_5.java._trace
38/.CloseTrains_step_6.java._trace
39/.CloseTrains_step_7.java._trace
40/.MisalignedTurnout_step_2.java._trace
41/.MisalignedTurnout_step_3.java._trace
42/.MisalignedTurnout_step_4.java._trace
43/.MisalignedTurnout_step_5.java._trace
44/.ConnectedSegmentsDirected.java._trace
45/Adjacent.java
46/CloseTrains_step_2.java
47/CloseTrains_step_3.java
48/CloseTrains_step_4.java
49/CloseTrains_step_5.java
50/CloseTrains_step_6.java
51/CloseTrains_step_7.java
52/ConnectedSegmentsDirected.java
53/ConnectedTo.java
54/ConnectedToNotSymmetric.java
55/ConnectedToReflexive.java
56/InputsOfTurnout.java
57/MisalignedTurnout_step_2.java
58/MisalignedTurnout_step_3.java
59/MisalignedTurnout_step_4.java
60/MisalignedTurnout_step_5.java
61/Modes3Queries.java
62/Output.java
63/OutputReflexive.java
64/Reachable.java
65/TooFewInputsOfTurnout.java
66/TooManyInputsOfSegment.java
67/TooManyInputsOfTurnout.java
68/TurnoutConnectedToBothOutputs.java
69/TurnoutOutput.java
70/TurnoutOutputsAreSame.java
71/Unreachable.java
72/.TrainLocations_step_2.java._trace
73/.TrainLocations_step_3.java._trace
74/.EndOfSiding_step_2.java._trace
75/.EndOfSiding_step_3.java._trace
76/.EndOfSiding_step_4.java._trace
77/.EndOfSiding_step_5.java._trace
78/.MultipleConnectedTo.java._trace
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Adjacent.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Adjacent.java
new file mode 100644
index 00000000..e87f9c18
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Adjacent.java
@@ -0,0 +1,719 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import modes3.queries.Output;
18import modes3.queries.TurnoutOutput;
19import org.apache.log4j.Logger;
20import org.eclipse.emf.ecore.EClass;
21import org.eclipse.viatra.query.runtime.api.IPatternMatch;
22import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
23import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
25import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
26import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
27import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
28import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
29import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
31import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
40import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
41
42/**
43 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
44 *
45 * <p>Original source:
46 * <code><pre>
47 * pattern adjacent(S1 : Segment, S2 : Segment) {
48 * find output(S1, S2);
49 * } or {
50 * find turnoutOutput(S2, S1);
51 * }
52 * </pre></code>
53 *
54 * @see Matcher
55 * @see Match
56 *
57 */
58@SuppressWarnings("all")
59public final class Adjacent extends BaseGeneratedEMFQuerySpecification<Adjacent.Matcher> {
60 /**
61 * Pattern-specific match representation of the modes3.queries.adjacent pattern,
62 * to be used in conjunction with {@link Matcher}.
63 *
64 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
65 * Each instance is a (possibly partial) substitution of pattern parameters,
66 * usable to represent a match of the pattern in the result of a query,
67 * or to specify the bound (fixed) input parameters when issuing a query.
68 *
69 * @see Matcher
70 *
71 */
72 public static abstract class Match extends BasePatternMatch {
73 private Segment fS1;
74
75 private Segment fS2;
76
77 private static List<String> parameterNames = makeImmutableList("S1", "S2");
78
79 private Match(final Segment pS1, final Segment pS2) {
80 this.fS1 = pS1;
81 this.fS2 = pS2;
82 }
83
84 @Override
85 public Object get(final String parameterName) {
86 switch(parameterName) {
87 case "S1": return this.fS1;
88 case "S2": return this.fS2;
89 default: return null;
90 }
91 }
92
93 @Override
94 public Object get(final int index) {
95 switch(index) {
96 case 0: return this.fS1;
97 case 1: return this.fS2;
98 default: return null;
99 }
100 }
101
102 public Segment getS1() {
103 return this.fS1;
104 }
105
106 public Segment getS2() {
107 return this.fS2;
108 }
109
110 @Override
111 public boolean set(final String parameterName, final Object newValue) {
112 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
113 if ("S1".equals(parameterName) ) {
114 this.fS1 = (Segment) newValue;
115 return true;
116 }
117 if ("S2".equals(parameterName) ) {
118 this.fS2 = (Segment) newValue;
119 return true;
120 }
121 return false;
122 }
123
124 public void setS1(final Segment pS1) {
125 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
126 this.fS1 = pS1;
127 }
128
129 public void setS2(final Segment pS2) {
130 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
131 this.fS2 = pS2;
132 }
133
134 @Override
135 public String patternName() {
136 return "modes3.queries.adjacent";
137 }
138
139 @Override
140 public List<String> parameterNames() {
141 return Adjacent.Match.parameterNames;
142 }
143
144 @Override
145 public Object[] toArray() {
146 return new Object[]{fS1, fS2};
147 }
148
149 @Override
150 public Adjacent.Match toImmutable() {
151 return isMutable() ? newMatch(fS1, fS2) : this;
152 }
153
154 @Override
155 public String prettyPrint() {
156 StringBuilder result = new StringBuilder();
157 result.append("\"S1\"=" + prettyPrintValue(fS1) + ", ");
158 result.append("\"S2\"=" + prettyPrintValue(fS2));
159 return result.toString();
160 }
161
162 @Override
163 public int hashCode() {
164 return Objects.hash(fS1, fS2);
165 }
166
167 @Override
168 public boolean equals(final Object obj) {
169 if (this == obj)
170 return true;
171 if (obj == null) {
172 return false;
173 }
174 if ((obj instanceof Adjacent.Match)) {
175 Adjacent.Match other = (Adjacent.Match) obj;
176 return Objects.equals(fS1, other.fS1) && Objects.equals(fS2, other.fS2);
177 } else {
178 // this should be infrequent
179 if (!(obj instanceof IPatternMatch)) {
180 return false;
181 }
182 IPatternMatch otherSig = (IPatternMatch) obj;
183 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
184 }
185 }
186
187 @Override
188 public Adjacent specification() {
189 return Adjacent.instance();
190 }
191
192 /**
193 * Returns an empty, mutable match.
194 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
195 *
196 * @return the empty match.
197 *
198 */
199 public static Adjacent.Match newEmptyMatch() {
200 return new Mutable(null, null);
201 }
202
203 /**
204 * Returns a mutable (partial) match.
205 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
206 *
207 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
208 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
209 * @return the new, mutable (partial) match object.
210 *
211 */
212 public static Adjacent.Match newMutableMatch(final Segment pS1, final Segment pS2) {
213 return new Mutable(pS1, pS2);
214 }
215
216 /**
217 * Returns a new (partial) match.
218 * This can be used e.g. to call the matcher with a partial match.
219 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
220 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
221 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
222 * @return the (partial) match object.
223 *
224 */
225 public static Adjacent.Match newMatch(final Segment pS1, final Segment pS2) {
226 return new Immutable(pS1, pS2);
227 }
228
229 private static final class Mutable extends Adjacent.Match {
230 Mutable(final Segment pS1, final Segment pS2) {
231 super(pS1, pS2);
232 }
233
234 @Override
235 public boolean isMutable() {
236 return true;
237 }
238 }
239
240 private static final class Immutable extends Adjacent.Match {
241 Immutable(final Segment pS1, final Segment pS2) {
242 super(pS1, pS2);
243 }
244
245 @Override
246 public boolean isMutable() {
247 return false;
248 }
249 }
250 }
251
252 /**
253 * Generated pattern matcher API of the modes3.queries.adjacent pattern,
254 * providing pattern-specific query methods.
255 *
256 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
257 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
258 *
259 * <p>Matches of the pattern will be represented as {@link Match}.
260 *
261 * <p>Original source:
262 * <code><pre>
263 * pattern adjacent(S1 : Segment, S2 : Segment) {
264 * find output(S1, S2);
265 * } or {
266 * find turnoutOutput(S2, S1);
267 * }
268 * </pre></code>
269 *
270 * @see Match
271 * @see Adjacent
272 *
273 */
274 public static class Matcher extends BaseMatcher<Adjacent.Match> {
275 /**
276 * Initializes the pattern matcher within an existing VIATRA Query engine.
277 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
278 *
279 * @param engine the existing VIATRA Query engine in which this matcher will be created.
280 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
281 *
282 */
283 public static Adjacent.Matcher on(final ViatraQueryEngine engine) {
284 // check if matcher already exists
285 Matcher matcher = engine.getExistingMatcher(querySpecification());
286 if (matcher == null) {
287 matcher = (Matcher)engine.getMatcher(querySpecification());
288 }
289 return matcher;
290 }
291
292 /**
293 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
294 * @return an initialized matcher
295 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
296 *
297 */
298 public static Adjacent.Matcher create() {
299 return new Matcher();
300 }
301
302 private static final int POSITION_S1 = 0;
303
304 private static final int POSITION_S2 = 1;
305
306 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Adjacent.Matcher.class);
307
308 /**
309 * Initializes the pattern matcher within an existing VIATRA Query engine.
310 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
311 *
312 * @param engine the existing VIATRA Query engine in which this matcher will be created.
313 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
314 *
315 */
316 private Matcher() {
317 super(querySpecification());
318 }
319
320 /**
321 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
322 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
323 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
324 * @return matches represented as a Match object.
325 *
326 */
327 public Collection<Adjacent.Match> getAllMatches(final Segment pS1, final Segment pS2) {
328 return rawStreamAllMatches(new Object[]{pS1, pS2}).collect(Collectors.toSet());
329 }
330
331 /**
332 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
333 * </p>
334 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
335 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
336 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
337 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
338 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
339 * @return a stream of matches represented as a Match object.
340 *
341 */
342 public Stream<Adjacent.Match> streamAllMatches(final Segment pS1, final Segment pS2) {
343 return rawStreamAllMatches(new Object[]{pS1, pS2});
344 }
345
346 /**
347 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
348 * Neither determinism nor randomness of selection is guaranteed.
349 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
350 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
351 * @return a match represented as a Match object, or null if no match is found.
352 *
353 */
354 public Optional<Adjacent.Match> getOneArbitraryMatch(final Segment pS1, final Segment pS2) {
355 return rawGetOneArbitraryMatch(new Object[]{pS1, pS2});
356 }
357
358 /**
359 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
360 * under any possible substitution of the unspecified parameters (if any).
361 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
362 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
363 * @return true if the input is a valid (partial) match of the pattern.
364 *
365 */
366 public boolean hasMatch(final Segment pS1, final Segment pS2) {
367 return rawHasMatch(new Object[]{pS1, pS2});
368 }
369
370 /**
371 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
372 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
373 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
374 * @return the number of pattern matches found.
375 *
376 */
377 public int countMatches(final Segment pS1, final Segment pS2) {
378 return rawCountMatches(new Object[]{pS1, pS2});
379 }
380
381 /**
382 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
383 * Neither determinism nor randomness of selection is guaranteed.
384 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
385 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
386 * @param processor the action that will process the selected match.
387 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
388 *
389 */
390 public boolean forOneArbitraryMatch(final Segment pS1, final Segment pS2, final Consumer<? super Adjacent.Match> processor) {
391 return rawForOneArbitraryMatch(new Object[]{pS1, pS2}, processor);
392 }
393
394 /**
395 * Returns a new (partial) match.
396 * This can be used e.g. to call the matcher with a partial match.
397 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
398 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
399 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
400 * @return the (partial) match object.
401 *
402 */
403 public Adjacent.Match newMatch(final Segment pS1, final Segment pS2) {
404 return Adjacent.Match.newMatch(pS1, pS2);
405 }
406
407 /**
408 * Retrieve the set of values that occur in matches for S1.
409 * @return the Set of all values or empty set if there are no matches
410 *
411 */
412 protected Stream<Segment> rawStreamAllValuesOfS1(final Object[] parameters) {
413 return rawStreamAllValues(POSITION_S1, parameters).map(Segment.class::cast);
414 }
415
416 /**
417 * Retrieve the set of values that occur in matches for S1.
418 * @return the Set of all values or empty set if there are no matches
419 *
420 */
421 public Set<Segment> getAllValuesOfS1() {
422 return rawStreamAllValuesOfS1(emptyArray()).collect(Collectors.toSet());
423 }
424
425 /**
426 * Retrieve the set of values that occur in matches for S1.
427 * @return the Set of all values or empty set if there are no matches
428 *
429 */
430 public Stream<Segment> streamAllValuesOfS1() {
431 return rawStreamAllValuesOfS1(emptyArray());
432 }
433
434 /**
435 * Retrieve the set of values that occur in matches for S1.
436 * </p>
437 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
438 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
439 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
440 *
441 * @return the Stream of all values or empty set if there are no matches
442 *
443 */
444 public Stream<Segment> streamAllValuesOfS1(final Adjacent.Match partialMatch) {
445 return rawStreamAllValuesOfS1(partialMatch.toArray());
446 }
447
448 /**
449 * Retrieve the set of values that occur in matches for S1.
450 * </p>
451 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
452 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
453 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
454 *
455 * @return the Stream of all values or empty set if there are no matches
456 *
457 */
458 public Stream<Segment> streamAllValuesOfS1(final Segment pS2) {
459 return rawStreamAllValuesOfS1(new Object[]{null, pS2});
460 }
461
462 /**
463 * Retrieve the set of values that occur in matches for S1.
464 * @return the Set of all values or empty set if there are no matches
465 *
466 */
467 public Set<Segment> getAllValuesOfS1(final Adjacent.Match partialMatch) {
468 return rawStreamAllValuesOfS1(partialMatch.toArray()).collect(Collectors.toSet());
469 }
470
471 /**
472 * Retrieve the set of values that occur in matches for S1.
473 * @return the Set of all values or empty set if there are no matches
474 *
475 */
476 public Set<Segment> getAllValuesOfS1(final Segment pS2) {
477 return rawStreamAllValuesOfS1(new Object[]{null, pS2}).collect(Collectors.toSet());
478 }
479
480 /**
481 * Retrieve the set of values that occur in matches for S2.
482 * @return the Set of all values or empty set if there are no matches
483 *
484 */
485 protected Stream<Segment> rawStreamAllValuesOfS2(final Object[] parameters) {
486 return rawStreamAllValues(POSITION_S2, parameters).map(Segment.class::cast);
487 }
488
489 /**
490 * Retrieve the set of values that occur in matches for S2.
491 * @return the Set of all values or empty set if there are no matches
492 *
493 */
494 public Set<Segment> getAllValuesOfS2() {
495 return rawStreamAllValuesOfS2(emptyArray()).collect(Collectors.toSet());
496 }
497
498 /**
499 * Retrieve the set of values that occur in matches for S2.
500 * @return the Set of all values or empty set if there are no matches
501 *
502 */
503 public Stream<Segment> streamAllValuesOfS2() {
504 return rawStreamAllValuesOfS2(emptyArray());
505 }
506
507 /**
508 * Retrieve the set of values that occur in matches for S2.
509 * </p>
510 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
511 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
512 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
513 *
514 * @return the Stream of all values or empty set if there are no matches
515 *
516 */
517 public Stream<Segment> streamAllValuesOfS2(final Adjacent.Match partialMatch) {
518 return rawStreamAllValuesOfS2(partialMatch.toArray());
519 }
520
521 /**
522 * Retrieve the set of values that occur in matches for S2.
523 * </p>
524 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
525 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
526 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
527 *
528 * @return the Stream of all values or empty set if there are no matches
529 *
530 */
531 public Stream<Segment> streamAllValuesOfS2(final Segment pS1) {
532 return rawStreamAllValuesOfS2(new Object[]{pS1, null});
533 }
534
535 /**
536 * Retrieve the set of values that occur in matches for S2.
537 * @return the Set of all values or empty set if there are no matches
538 *
539 */
540 public Set<Segment> getAllValuesOfS2(final Adjacent.Match partialMatch) {
541 return rawStreamAllValuesOfS2(partialMatch.toArray()).collect(Collectors.toSet());
542 }
543
544 /**
545 * Retrieve the set of values that occur in matches for S2.
546 * @return the Set of all values or empty set if there are no matches
547 *
548 */
549 public Set<Segment> getAllValuesOfS2(final Segment pS1) {
550 return rawStreamAllValuesOfS2(new Object[]{pS1, null}).collect(Collectors.toSet());
551 }
552
553 @Override
554 protected Adjacent.Match tupleToMatch(final Tuple t) {
555 try {
556 return Adjacent.Match.newMatch((Segment) t.get(POSITION_S1), (Segment) t.get(POSITION_S2));
557 } catch(ClassCastException e) {
558 LOGGER.error("Element(s) in tuple not properly typed!",e);
559 return null;
560 }
561 }
562
563 @Override
564 protected Adjacent.Match arrayToMatch(final Object[] match) {
565 try {
566 return Adjacent.Match.newMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
567 } catch(ClassCastException e) {
568 LOGGER.error("Element(s) in array not properly typed!",e);
569 return null;
570 }
571 }
572
573 @Override
574 protected Adjacent.Match arrayToMatchMutable(final Object[] match) {
575 try {
576 return Adjacent.Match.newMutableMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
577 } catch(ClassCastException e) {
578 LOGGER.error("Element(s) in array not properly typed!",e);
579 return null;
580 }
581 }
582
583 /**
584 * @return the singleton instance of the query specification of this pattern
585 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
586 *
587 */
588 public static IQuerySpecification<Adjacent.Matcher> querySpecification() {
589 return Adjacent.instance();
590 }
591 }
592
593 private Adjacent() {
594 super(GeneratedPQuery.INSTANCE);
595 }
596
597 /**
598 * @return the singleton instance of the query specification
599 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
600 *
601 */
602 public static Adjacent instance() {
603 try{
604 return LazyHolder.INSTANCE;
605 } catch (ExceptionInInitializerError err) {
606 throw processInitializerError(err);
607 }
608 }
609
610 @Override
611 protected Adjacent.Matcher instantiate(final ViatraQueryEngine engine) {
612 return Adjacent.Matcher.on(engine);
613 }
614
615 @Override
616 public Adjacent.Matcher instantiate() {
617 return Adjacent.Matcher.create();
618 }
619
620 @Override
621 public Adjacent.Match newEmptyMatch() {
622 return Adjacent.Match.newEmptyMatch();
623 }
624
625 @Override
626 public Adjacent.Match newMatch(final Object... parameters) {
627 return Adjacent.Match.newMatch((modes3.Segment) parameters[0], (modes3.Segment) parameters[1]);
628 }
629
630 /**
631 * Inner class allowing the singleton instance of {@link Adjacent} to be created
632 * <b>not</b> at the class load time of the outer class,
633 * but rather at the first call to {@link Adjacent#instance()}.
634 *
635 * <p> This workaround is required e.g. to support recursion.
636 *
637 */
638 private static class LazyHolder {
639 private static final Adjacent INSTANCE = new Adjacent();
640
641 /**
642 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
643 * This initialization order is required to support indirect recursion.
644 *
645 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
646 *
647 */
648 private static final Object STATIC_INITIALIZER = ensureInitialized();
649
650 public static Object ensureInitialized() {
651 INSTANCE.ensureInitializedInternal();
652 return null;
653 }
654 }
655
656 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
657 private static final Adjacent.GeneratedPQuery INSTANCE = new GeneratedPQuery();
658
659 private final PParameter parameter_S1 = new PParameter("S1", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
660
661 private final PParameter parameter_S2 = new PParameter("S2", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
662
663 private final List<PParameter> parameters = Arrays.asList(parameter_S1, parameter_S2);
664
665 private GeneratedPQuery() {
666 super(PVisibility.PUBLIC);
667 }
668
669 @Override
670 public String getFullyQualifiedName() {
671 return "modes3.queries.adjacent";
672 }
673
674 @Override
675 public List<String> getParameterNames() {
676 return Arrays.asList("S1","S2");
677 }
678
679 @Override
680 public List<PParameter> getParameters() {
681 return parameters;
682 }
683
684 @Override
685 public Set<PBody> doGetContainedBodies() {
686 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
687 Set<PBody> bodies = new LinkedHashSet<>();
688 {
689 PBody body = new PBody(this);
690 PVariable var_S1 = body.getOrCreateVariableByName("S1");
691 PVariable var_S2 = body.getOrCreateVariableByName("S2");
692 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
693 new TypeConstraint(body, Tuples.flatTupleOf(var_S2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
694 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
695 new ExportedParameter(body, var_S1, parameter_S1),
696 new ExportedParameter(body, var_S2, parameter_S2)
697 ));
698 // find output(S1, S2)
699 new PositivePatternCall(body, Tuples.flatTupleOf(var_S1, var_S2), Output.instance().getInternalQueryRepresentation());
700 bodies.add(body);
701 }
702 {
703 PBody body = new PBody(this);
704 PVariable var_S1 = body.getOrCreateVariableByName("S1");
705 PVariable var_S2 = body.getOrCreateVariableByName("S2");
706 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
707 new TypeConstraint(body, Tuples.flatTupleOf(var_S2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
708 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
709 new ExportedParameter(body, var_S1, parameter_S1),
710 new ExportedParameter(body, var_S2, parameter_S2)
711 ));
712 // find turnoutOutput(S2, S1)
713 new PositivePatternCall(body, Tuples.flatTupleOf(var_S2, var_S1), TurnoutOutput.instance().getInternalQueryRepresentation());
714 bodies.add(body);
715 }
716 return bodies;
717 }
718 }
719}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedTo.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedTo.java
new file mode 100644
index 00000000..a0f14958
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedTo.java
@@ -0,0 +1,704 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.viatra.query.runtime.api.IPatternMatch;
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
24import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
25import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
26import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
27import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
34import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
37import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
39import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
40
41/**
42 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
43 *
44 * <p>Original source:
45 * <code><pre>
46 * pattern connectedTo(S1 : Segment, S2 : Segment) {
47 * Segment.connectedTo(S1, S2);
48 * }
49 * </pre></code>
50 *
51 * @see Matcher
52 * @see Match
53 *
54 */
55@SuppressWarnings("all")
56public final class ConnectedTo extends BaseGeneratedEMFQuerySpecification<ConnectedTo.Matcher> {
57 /**
58 * Pattern-specific match representation of the modes3.queries.connectedTo pattern,
59 * to be used in conjunction with {@link Matcher}.
60 *
61 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
62 * Each instance is a (possibly partial) substitution of pattern parameters,
63 * usable to represent a match of the pattern in the result of a query,
64 * or to specify the bound (fixed) input parameters when issuing a query.
65 *
66 * @see Matcher
67 *
68 */
69 public static abstract class Match extends BasePatternMatch {
70 private Segment fS1;
71
72 private Segment fS2;
73
74 private static List<String> parameterNames = makeImmutableList("S1", "S2");
75
76 private Match(final Segment pS1, final Segment pS2) {
77 this.fS1 = pS1;
78 this.fS2 = pS2;
79 }
80
81 @Override
82 public Object get(final String parameterName) {
83 switch(parameterName) {
84 case "S1": return this.fS1;
85 case "S2": return this.fS2;
86 default: return null;
87 }
88 }
89
90 @Override
91 public Object get(final int index) {
92 switch(index) {
93 case 0: return this.fS1;
94 case 1: return this.fS2;
95 default: return null;
96 }
97 }
98
99 public Segment getS1() {
100 return this.fS1;
101 }
102
103 public Segment getS2() {
104 return this.fS2;
105 }
106
107 @Override
108 public boolean set(final String parameterName, final Object newValue) {
109 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
110 if ("S1".equals(parameterName) ) {
111 this.fS1 = (Segment) newValue;
112 return true;
113 }
114 if ("S2".equals(parameterName) ) {
115 this.fS2 = (Segment) newValue;
116 return true;
117 }
118 return false;
119 }
120
121 public void setS1(final Segment pS1) {
122 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
123 this.fS1 = pS1;
124 }
125
126 public void setS2(final Segment pS2) {
127 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
128 this.fS2 = pS2;
129 }
130
131 @Override
132 public String patternName() {
133 return "modes3.queries.connectedTo";
134 }
135
136 @Override
137 public List<String> parameterNames() {
138 return ConnectedTo.Match.parameterNames;
139 }
140
141 @Override
142 public Object[] toArray() {
143 return new Object[]{fS1, fS2};
144 }
145
146 @Override
147 public ConnectedTo.Match toImmutable() {
148 return isMutable() ? newMatch(fS1, fS2) : this;
149 }
150
151 @Override
152 public String prettyPrint() {
153 StringBuilder result = new StringBuilder();
154 result.append("\"S1\"=" + prettyPrintValue(fS1) + ", ");
155 result.append("\"S2\"=" + prettyPrintValue(fS2));
156 return result.toString();
157 }
158
159 @Override
160 public int hashCode() {
161 return Objects.hash(fS1, fS2);
162 }
163
164 @Override
165 public boolean equals(final Object obj) {
166 if (this == obj)
167 return true;
168 if (obj == null) {
169 return false;
170 }
171 if ((obj instanceof ConnectedTo.Match)) {
172 ConnectedTo.Match other = (ConnectedTo.Match) obj;
173 return Objects.equals(fS1, other.fS1) && Objects.equals(fS2, other.fS2);
174 } else {
175 // this should be infrequent
176 if (!(obj instanceof IPatternMatch)) {
177 return false;
178 }
179 IPatternMatch otherSig = (IPatternMatch) obj;
180 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
181 }
182 }
183
184 @Override
185 public ConnectedTo specification() {
186 return ConnectedTo.instance();
187 }
188
189 /**
190 * Returns an empty, mutable match.
191 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
192 *
193 * @return the empty match.
194 *
195 */
196 public static ConnectedTo.Match newEmptyMatch() {
197 return new Mutable(null, null);
198 }
199
200 /**
201 * Returns a mutable (partial) match.
202 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
203 *
204 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
205 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
206 * @return the new, mutable (partial) match object.
207 *
208 */
209 public static ConnectedTo.Match newMutableMatch(final Segment pS1, final Segment pS2) {
210 return new Mutable(pS1, pS2);
211 }
212
213 /**
214 * Returns a new (partial) match.
215 * This can be used e.g. to call the matcher with a partial match.
216 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
217 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
218 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
219 * @return the (partial) match object.
220 *
221 */
222 public static ConnectedTo.Match newMatch(final Segment pS1, final Segment pS2) {
223 return new Immutable(pS1, pS2);
224 }
225
226 private static final class Mutable extends ConnectedTo.Match {
227 Mutable(final Segment pS1, final Segment pS2) {
228 super(pS1, pS2);
229 }
230
231 @Override
232 public boolean isMutable() {
233 return true;
234 }
235 }
236
237 private static final class Immutable extends ConnectedTo.Match {
238 Immutable(final Segment pS1, final Segment pS2) {
239 super(pS1, pS2);
240 }
241
242 @Override
243 public boolean isMutable() {
244 return false;
245 }
246 }
247 }
248
249 /**
250 * Generated pattern matcher API of the modes3.queries.connectedTo pattern,
251 * providing pattern-specific query methods.
252 *
253 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
254 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
255 *
256 * <p>Matches of the pattern will be represented as {@link Match}.
257 *
258 * <p>Original source:
259 * <code><pre>
260 * pattern connectedTo(S1 : Segment, S2 : Segment) {
261 * Segment.connectedTo(S1, S2);
262 * }
263 * </pre></code>
264 *
265 * @see Match
266 * @see ConnectedTo
267 *
268 */
269 public static class Matcher extends BaseMatcher<ConnectedTo.Match> {
270 /**
271 * Initializes the pattern matcher within an existing VIATRA Query engine.
272 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
273 *
274 * @param engine the existing VIATRA Query engine in which this matcher will be created.
275 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
276 *
277 */
278 public static ConnectedTo.Matcher on(final ViatraQueryEngine engine) {
279 // check if matcher already exists
280 Matcher matcher = engine.getExistingMatcher(querySpecification());
281 if (matcher == null) {
282 matcher = (Matcher)engine.getMatcher(querySpecification());
283 }
284 return matcher;
285 }
286
287 /**
288 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
289 * @return an initialized matcher
290 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
291 *
292 */
293 public static ConnectedTo.Matcher create() {
294 return new Matcher();
295 }
296
297 private static final int POSITION_S1 = 0;
298
299 private static final int POSITION_S2 = 1;
300
301 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(ConnectedTo.Matcher.class);
302
303 /**
304 * Initializes the pattern matcher within an existing VIATRA Query engine.
305 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
306 *
307 * @param engine the existing VIATRA Query engine in which this matcher will be created.
308 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
309 *
310 */
311 private Matcher() {
312 super(querySpecification());
313 }
314
315 /**
316 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
317 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
318 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
319 * @return matches represented as a Match object.
320 *
321 */
322 public Collection<ConnectedTo.Match> getAllMatches(final Segment pS1, final Segment pS2) {
323 return rawStreamAllMatches(new Object[]{pS1, pS2}).collect(Collectors.toSet());
324 }
325
326 /**
327 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
328 * </p>
329 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
330 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
331 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
332 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
333 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
334 * @return a stream of matches represented as a Match object.
335 *
336 */
337 public Stream<ConnectedTo.Match> streamAllMatches(final Segment pS1, final Segment pS2) {
338 return rawStreamAllMatches(new Object[]{pS1, pS2});
339 }
340
341 /**
342 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
343 * Neither determinism nor randomness of selection is guaranteed.
344 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
345 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
346 * @return a match represented as a Match object, or null if no match is found.
347 *
348 */
349 public Optional<ConnectedTo.Match> getOneArbitraryMatch(final Segment pS1, final Segment pS2) {
350 return rawGetOneArbitraryMatch(new Object[]{pS1, pS2});
351 }
352
353 /**
354 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
355 * under any possible substitution of the unspecified parameters (if any).
356 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
357 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
358 * @return true if the input is a valid (partial) match of the pattern.
359 *
360 */
361 public boolean hasMatch(final Segment pS1, final Segment pS2) {
362 return rawHasMatch(new Object[]{pS1, pS2});
363 }
364
365 /**
366 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
367 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
368 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
369 * @return the number of pattern matches found.
370 *
371 */
372 public int countMatches(final Segment pS1, final Segment pS2) {
373 return rawCountMatches(new Object[]{pS1, pS2});
374 }
375
376 /**
377 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
378 * Neither determinism nor randomness of selection is guaranteed.
379 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
380 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
381 * @param processor the action that will process the selected match.
382 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
383 *
384 */
385 public boolean forOneArbitraryMatch(final Segment pS1, final Segment pS2, final Consumer<? super ConnectedTo.Match> processor) {
386 return rawForOneArbitraryMatch(new Object[]{pS1, pS2}, processor);
387 }
388
389 /**
390 * Returns a new (partial) match.
391 * This can be used e.g. to call the matcher with a partial match.
392 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
393 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
394 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
395 * @return the (partial) match object.
396 *
397 */
398 public ConnectedTo.Match newMatch(final Segment pS1, final Segment pS2) {
399 return ConnectedTo.Match.newMatch(pS1, pS2);
400 }
401
402 /**
403 * Retrieve the set of values that occur in matches for S1.
404 * @return the Set of all values or empty set if there are no matches
405 *
406 */
407 protected Stream<Segment> rawStreamAllValuesOfS1(final Object[] parameters) {
408 return rawStreamAllValues(POSITION_S1, parameters).map(Segment.class::cast);
409 }
410
411 /**
412 * Retrieve the set of values that occur in matches for S1.
413 * @return the Set of all values or empty set if there are no matches
414 *
415 */
416 public Set<Segment> getAllValuesOfS1() {
417 return rawStreamAllValuesOfS1(emptyArray()).collect(Collectors.toSet());
418 }
419
420 /**
421 * Retrieve the set of values that occur in matches for S1.
422 * @return the Set of all values or empty set if there are no matches
423 *
424 */
425 public Stream<Segment> streamAllValuesOfS1() {
426 return rawStreamAllValuesOfS1(emptyArray());
427 }
428
429 /**
430 * Retrieve the set of values that occur in matches for S1.
431 * </p>
432 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
433 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
434 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
435 *
436 * @return the Stream of all values or empty set if there are no matches
437 *
438 */
439 public Stream<Segment> streamAllValuesOfS1(final ConnectedTo.Match partialMatch) {
440 return rawStreamAllValuesOfS1(partialMatch.toArray());
441 }
442
443 /**
444 * Retrieve the set of values that occur in matches for S1.
445 * </p>
446 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
447 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
448 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
449 *
450 * @return the Stream of all values or empty set if there are no matches
451 *
452 */
453 public Stream<Segment> streamAllValuesOfS1(final Segment pS2) {
454 return rawStreamAllValuesOfS1(new Object[]{null, pS2});
455 }
456
457 /**
458 * Retrieve the set of values that occur in matches for S1.
459 * @return the Set of all values or empty set if there are no matches
460 *
461 */
462 public Set<Segment> getAllValuesOfS1(final ConnectedTo.Match partialMatch) {
463 return rawStreamAllValuesOfS1(partialMatch.toArray()).collect(Collectors.toSet());
464 }
465
466 /**
467 * Retrieve the set of values that occur in matches for S1.
468 * @return the Set of all values or empty set if there are no matches
469 *
470 */
471 public Set<Segment> getAllValuesOfS1(final Segment pS2) {
472 return rawStreamAllValuesOfS1(new Object[]{null, pS2}).collect(Collectors.toSet());
473 }
474
475 /**
476 * Retrieve the set of values that occur in matches for S2.
477 * @return the Set of all values or empty set if there are no matches
478 *
479 */
480 protected Stream<Segment> rawStreamAllValuesOfS2(final Object[] parameters) {
481 return rawStreamAllValues(POSITION_S2, parameters).map(Segment.class::cast);
482 }
483
484 /**
485 * Retrieve the set of values that occur in matches for S2.
486 * @return the Set of all values or empty set if there are no matches
487 *
488 */
489 public Set<Segment> getAllValuesOfS2() {
490 return rawStreamAllValuesOfS2(emptyArray()).collect(Collectors.toSet());
491 }
492
493 /**
494 * Retrieve the set of values that occur in matches for S2.
495 * @return the Set of all values or empty set if there are no matches
496 *
497 */
498 public Stream<Segment> streamAllValuesOfS2() {
499 return rawStreamAllValuesOfS2(emptyArray());
500 }
501
502 /**
503 * Retrieve the set of values that occur in matches for S2.
504 * </p>
505 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
506 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
507 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
508 *
509 * @return the Stream of all values or empty set if there are no matches
510 *
511 */
512 public Stream<Segment> streamAllValuesOfS2(final ConnectedTo.Match partialMatch) {
513 return rawStreamAllValuesOfS2(partialMatch.toArray());
514 }
515
516 /**
517 * Retrieve the set of values that occur in matches for S2.
518 * </p>
519 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
520 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
521 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
522 *
523 * @return the Stream of all values or empty set if there are no matches
524 *
525 */
526 public Stream<Segment> streamAllValuesOfS2(final Segment pS1) {
527 return rawStreamAllValuesOfS2(new Object[]{pS1, null});
528 }
529
530 /**
531 * Retrieve the set of values that occur in matches for S2.
532 * @return the Set of all values or empty set if there are no matches
533 *
534 */
535 public Set<Segment> getAllValuesOfS2(final ConnectedTo.Match partialMatch) {
536 return rawStreamAllValuesOfS2(partialMatch.toArray()).collect(Collectors.toSet());
537 }
538
539 /**
540 * Retrieve the set of values that occur in matches for S2.
541 * @return the Set of all values or empty set if there are no matches
542 *
543 */
544 public Set<Segment> getAllValuesOfS2(final Segment pS1) {
545 return rawStreamAllValuesOfS2(new Object[]{pS1, null}).collect(Collectors.toSet());
546 }
547
548 @Override
549 protected ConnectedTo.Match tupleToMatch(final Tuple t) {
550 try {
551 return ConnectedTo.Match.newMatch((Segment) t.get(POSITION_S1), (Segment) t.get(POSITION_S2));
552 } catch(ClassCastException e) {
553 LOGGER.error("Element(s) in tuple not properly typed!",e);
554 return null;
555 }
556 }
557
558 @Override
559 protected ConnectedTo.Match arrayToMatch(final Object[] match) {
560 try {
561 return ConnectedTo.Match.newMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
562 } catch(ClassCastException e) {
563 LOGGER.error("Element(s) in array not properly typed!",e);
564 return null;
565 }
566 }
567
568 @Override
569 protected ConnectedTo.Match arrayToMatchMutable(final Object[] match) {
570 try {
571 return ConnectedTo.Match.newMutableMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
572 } catch(ClassCastException e) {
573 LOGGER.error("Element(s) in array not properly typed!",e);
574 return null;
575 }
576 }
577
578 /**
579 * @return the singleton instance of the query specification of this pattern
580 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
581 *
582 */
583 public static IQuerySpecification<ConnectedTo.Matcher> querySpecification() {
584 return ConnectedTo.instance();
585 }
586 }
587
588 private ConnectedTo() {
589 super(GeneratedPQuery.INSTANCE);
590 }
591
592 /**
593 * @return the singleton instance of the query specification
594 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
595 *
596 */
597 public static ConnectedTo instance() {
598 try{
599 return LazyHolder.INSTANCE;
600 } catch (ExceptionInInitializerError err) {
601 throw processInitializerError(err);
602 }
603 }
604
605 @Override
606 protected ConnectedTo.Matcher instantiate(final ViatraQueryEngine engine) {
607 return ConnectedTo.Matcher.on(engine);
608 }
609
610 @Override
611 public ConnectedTo.Matcher instantiate() {
612 return ConnectedTo.Matcher.create();
613 }
614
615 @Override
616 public ConnectedTo.Match newEmptyMatch() {
617 return ConnectedTo.Match.newEmptyMatch();
618 }
619
620 @Override
621 public ConnectedTo.Match newMatch(final Object... parameters) {
622 return ConnectedTo.Match.newMatch((modes3.Segment) parameters[0], (modes3.Segment) parameters[1]);
623 }
624
625 /**
626 * Inner class allowing the singleton instance of {@link ConnectedTo} to be created
627 * <b>not</b> at the class load time of the outer class,
628 * but rather at the first call to {@link ConnectedTo#instance()}.
629 *
630 * <p> This workaround is required e.g. to support recursion.
631 *
632 */
633 private static class LazyHolder {
634 private static final ConnectedTo INSTANCE = new ConnectedTo();
635
636 /**
637 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
638 * This initialization order is required to support indirect recursion.
639 *
640 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
641 *
642 */
643 private static final Object STATIC_INITIALIZER = ensureInitialized();
644
645 public static Object ensureInitialized() {
646 INSTANCE.ensureInitializedInternal();
647 return null;
648 }
649 }
650
651 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
652 private static final ConnectedTo.GeneratedPQuery INSTANCE = new GeneratedPQuery();
653
654 private final PParameter parameter_S1 = new PParameter("S1", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
655
656 private final PParameter parameter_S2 = new PParameter("S2", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
657
658 private final List<PParameter> parameters = Arrays.asList(parameter_S1, parameter_S2);
659
660 private GeneratedPQuery() {
661 super(PVisibility.PUBLIC);
662 }
663
664 @Override
665 public String getFullyQualifiedName() {
666 return "modes3.queries.connectedTo";
667 }
668
669 @Override
670 public List<String> getParameterNames() {
671 return Arrays.asList("S1","S2");
672 }
673
674 @Override
675 public List<PParameter> getParameters() {
676 return parameters;
677 }
678
679 @Override
680 public Set<PBody> doGetContainedBodies() {
681 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
682 Set<PBody> bodies = new LinkedHashSet<>();
683 {
684 PBody body = new PBody(this);
685 PVariable var_S1 = body.getOrCreateVariableByName("S1");
686 PVariable var_S2 = body.getOrCreateVariableByName("S2");
687 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
688 new TypeConstraint(body, Tuples.flatTupleOf(var_S2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
689 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
690 new ExportedParameter(body, var_S1, parameter_S1),
691 new ExportedParameter(body, var_S2, parameter_S2)
692 ));
693 // Segment.connectedTo(S1, S2)
694 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
695 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
696 new TypeConstraint(body, Tuples.flatTupleOf(var_S1, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo")));
697 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
698 new Equality(body, var__virtual_0_, var_S2);
699 bodies.add(body);
700 }
701 return bodies;
702 }
703 }
704}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedToNotSymmetric.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedToNotSymmetric.java
new file mode 100644
index 00000000..91b74c7e
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedToNotSymmetric.java
@@ -0,0 +1,724 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import modes3.queries.ConnectedTo;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
29import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
31import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
32import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
33import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
40import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
41import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
42import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
43import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
44
45/**
46 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
47 *
48 * <p>Original source:
49 * <code><pre>
50 * {@literal @}Constraint(message = "connectedToNotSymmetric", severity = "error", key = { S1, S2 })
51 * pattern connectedToNotSymmetric(S1 : Segment, S2 : Segment) {
52 * Segment.connectedTo(S1, S2);
53 * neg find connectedTo(S2, S1);
54 * }
55 * </pre></code>
56 *
57 * @see Matcher
58 * @see Match
59 *
60 */
61@SuppressWarnings("all")
62public final class ConnectedToNotSymmetric extends BaseGeneratedEMFQuerySpecification<ConnectedToNotSymmetric.Matcher> {
63 /**
64 * Pattern-specific match representation of the modes3.queries.connectedToNotSymmetric pattern,
65 * to be used in conjunction with {@link Matcher}.
66 *
67 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
68 * Each instance is a (possibly partial) substitution of pattern parameters,
69 * usable to represent a match of the pattern in the result of a query,
70 * or to specify the bound (fixed) input parameters when issuing a query.
71 *
72 * @see Matcher
73 *
74 */
75 public static abstract class Match extends BasePatternMatch {
76 private Segment fS1;
77
78 private Segment fS2;
79
80 private static List<String> parameterNames = makeImmutableList("S1", "S2");
81
82 private Match(final Segment pS1, final Segment pS2) {
83 this.fS1 = pS1;
84 this.fS2 = pS2;
85 }
86
87 @Override
88 public Object get(final String parameterName) {
89 switch(parameterName) {
90 case "S1": return this.fS1;
91 case "S2": return this.fS2;
92 default: return null;
93 }
94 }
95
96 @Override
97 public Object get(final int index) {
98 switch(index) {
99 case 0: return this.fS1;
100 case 1: return this.fS2;
101 default: return null;
102 }
103 }
104
105 public Segment getS1() {
106 return this.fS1;
107 }
108
109 public Segment getS2() {
110 return this.fS2;
111 }
112
113 @Override
114 public boolean set(final String parameterName, final Object newValue) {
115 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
116 if ("S1".equals(parameterName) ) {
117 this.fS1 = (Segment) newValue;
118 return true;
119 }
120 if ("S2".equals(parameterName) ) {
121 this.fS2 = (Segment) newValue;
122 return true;
123 }
124 return false;
125 }
126
127 public void setS1(final Segment pS1) {
128 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
129 this.fS1 = pS1;
130 }
131
132 public void setS2(final Segment pS2) {
133 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
134 this.fS2 = pS2;
135 }
136
137 @Override
138 public String patternName() {
139 return "modes3.queries.connectedToNotSymmetric";
140 }
141
142 @Override
143 public List<String> parameterNames() {
144 return ConnectedToNotSymmetric.Match.parameterNames;
145 }
146
147 @Override
148 public Object[] toArray() {
149 return new Object[]{fS1, fS2};
150 }
151
152 @Override
153 public ConnectedToNotSymmetric.Match toImmutable() {
154 return isMutable() ? newMatch(fS1, fS2) : this;
155 }
156
157 @Override
158 public String prettyPrint() {
159 StringBuilder result = new StringBuilder();
160 result.append("\"S1\"=" + prettyPrintValue(fS1) + ", ");
161 result.append("\"S2\"=" + prettyPrintValue(fS2));
162 return result.toString();
163 }
164
165 @Override
166 public int hashCode() {
167 return Objects.hash(fS1, fS2);
168 }
169
170 @Override
171 public boolean equals(final Object obj) {
172 if (this == obj)
173 return true;
174 if (obj == null) {
175 return false;
176 }
177 if ((obj instanceof ConnectedToNotSymmetric.Match)) {
178 ConnectedToNotSymmetric.Match other = (ConnectedToNotSymmetric.Match) obj;
179 return Objects.equals(fS1, other.fS1) && Objects.equals(fS2, other.fS2);
180 } else {
181 // this should be infrequent
182 if (!(obj instanceof IPatternMatch)) {
183 return false;
184 }
185 IPatternMatch otherSig = (IPatternMatch) obj;
186 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
187 }
188 }
189
190 @Override
191 public ConnectedToNotSymmetric specification() {
192 return ConnectedToNotSymmetric.instance();
193 }
194
195 /**
196 * Returns an empty, mutable match.
197 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
198 *
199 * @return the empty match.
200 *
201 */
202 public static ConnectedToNotSymmetric.Match newEmptyMatch() {
203 return new Mutable(null, null);
204 }
205
206 /**
207 * Returns a mutable (partial) match.
208 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
209 *
210 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
211 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
212 * @return the new, mutable (partial) match object.
213 *
214 */
215 public static ConnectedToNotSymmetric.Match newMutableMatch(final Segment pS1, final Segment pS2) {
216 return new Mutable(pS1, pS2);
217 }
218
219 /**
220 * Returns a new (partial) match.
221 * This can be used e.g. to call the matcher with a partial match.
222 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
223 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
224 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
225 * @return the (partial) match object.
226 *
227 */
228 public static ConnectedToNotSymmetric.Match newMatch(final Segment pS1, final Segment pS2) {
229 return new Immutable(pS1, pS2);
230 }
231
232 private static final class Mutable extends ConnectedToNotSymmetric.Match {
233 Mutable(final Segment pS1, final Segment pS2) {
234 super(pS1, pS2);
235 }
236
237 @Override
238 public boolean isMutable() {
239 return true;
240 }
241 }
242
243 private static final class Immutable extends ConnectedToNotSymmetric.Match {
244 Immutable(final Segment pS1, final Segment pS2) {
245 super(pS1, pS2);
246 }
247
248 @Override
249 public boolean isMutable() {
250 return false;
251 }
252 }
253 }
254
255 /**
256 * Generated pattern matcher API of the modes3.queries.connectedToNotSymmetric pattern,
257 * providing pattern-specific query methods.
258 *
259 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
260 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
261 *
262 * <p>Matches of the pattern will be represented as {@link Match}.
263 *
264 * <p>Original source:
265 * <code><pre>
266 * {@literal @}Constraint(message = "connectedToNotSymmetric", severity = "error", key = { S1, S2 })
267 * pattern connectedToNotSymmetric(S1 : Segment, S2 : Segment) {
268 * Segment.connectedTo(S1, S2);
269 * neg find connectedTo(S2, S1);
270 * }
271 * </pre></code>
272 *
273 * @see Match
274 * @see ConnectedToNotSymmetric
275 *
276 */
277 public static class Matcher extends BaseMatcher<ConnectedToNotSymmetric.Match> {
278 /**
279 * Initializes the pattern matcher within an existing VIATRA Query engine.
280 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
281 *
282 * @param engine the existing VIATRA Query engine in which this matcher will be created.
283 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
284 *
285 */
286 public static ConnectedToNotSymmetric.Matcher on(final ViatraQueryEngine engine) {
287 // check if matcher already exists
288 Matcher matcher = engine.getExistingMatcher(querySpecification());
289 if (matcher == null) {
290 matcher = (Matcher)engine.getMatcher(querySpecification());
291 }
292 return matcher;
293 }
294
295 /**
296 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
297 * @return an initialized matcher
298 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
299 *
300 */
301 public static ConnectedToNotSymmetric.Matcher create() {
302 return new Matcher();
303 }
304
305 private static final int POSITION_S1 = 0;
306
307 private static final int POSITION_S2 = 1;
308
309 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(ConnectedToNotSymmetric.Matcher.class);
310
311 /**
312 * Initializes the pattern matcher within an existing VIATRA Query engine.
313 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
314 *
315 * @param engine the existing VIATRA Query engine in which this matcher will be created.
316 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
317 *
318 */
319 private Matcher() {
320 super(querySpecification());
321 }
322
323 /**
324 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
325 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
326 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
327 * @return matches represented as a Match object.
328 *
329 */
330 public Collection<ConnectedToNotSymmetric.Match> getAllMatches(final Segment pS1, final Segment pS2) {
331 return rawStreamAllMatches(new Object[]{pS1, pS2}).collect(Collectors.toSet());
332 }
333
334 /**
335 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
336 * </p>
337 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
338 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
339 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
340 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
341 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
342 * @return a stream of matches represented as a Match object.
343 *
344 */
345 public Stream<ConnectedToNotSymmetric.Match> streamAllMatches(final Segment pS1, final Segment pS2) {
346 return rawStreamAllMatches(new Object[]{pS1, pS2});
347 }
348
349 /**
350 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
351 * Neither determinism nor randomness of selection is guaranteed.
352 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
353 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
354 * @return a match represented as a Match object, or null if no match is found.
355 *
356 */
357 public Optional<ConnectedToNotSymmetric.Match> getOneArbitraryMatch(final Segment pS1, final Segment pS2) {
358 return rawGetOneArbitraryMatch(new Object[]{pS1, pS2});
359 }
360
361 /**
362 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
363 * under any possible substitution of the unspecified parameters (if any).
364 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
365 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
366 * @return true if the input is a valid (partial) match of the pattern.
367 *
368 */
369 public boolean hasMatch(final Segment pS1, final Segment pS2) {
370 return rawHasMatch(new Object[]{pS1, pS2});
371 }
372
373 /**
374 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
375 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
376 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
377 * @return the number of pattern matches found.
378 *
379 */
380 public int countMatches(final Segment pS1, final Segment pS2) {
381 return rawCountMatches(new Object[]{pS1, pS2});
382 }
383
384 /**
385 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
386 * Neither determinism nor randomness of selection is guaranteed.
387 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
388 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
389 * @param processor the action that will process the selected match.
390 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
391 *
392 */
393 public boolean forOneArbitraryMatch(final Segment pS1, final Segment pS2, final Consumer<? super ConnectedToNotSymmetric.Match> processor) {
394 return rawForOneArbitraryMatch(new Object[]{pS1, pS2}, processor);
395 }
396
397 /**
398 * Returns a new (partial) match.
399 * This can be used e.g. to call the matcher with a partial match.
400 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
401 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
402 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
403 * @return the (partial) match object.
404 *
405 */
406 public ConnectedToNotSymmetric.Match newMatch(final Segment pS1, final Segment pS2) {
407 return ConnectedToNotSymmetric.Match.newMatch(pS1, pS2);
408 }
409
410 /**
411 * Retrieve the set of values that occur in matches for S1.
412 * @return the Set of all values or empty set if there are no matches
413 *
414 */
415 protected Stream<Segment> rawStreamAllValuesOfS1(final Object[] parameters) {
416 return rawStreamAllValues(POSITION_S1, parameters).map(Segment.class::cast);
417 }
418
419 /**
420 * Retrieve the set of values that occur in matches for S1.
421 * @return the Set of all values or empty set if there are no matches
422 *
423 */
424 public Set<Segment> getAllValuesOfS1() {
425 return rawStreamAllValuesOfS1(emptyArray()).collect(Collectors.toSet());
426 }
427
428 /**
429 * Retrieve the set of values that occur in matches for S1.
430 * @return the Set of all values or empty set if there are no matches
431 *
432 */
433 public Stream<Segment> streamAllValuesOfS1() {
434 return rawStreamAllValuesOfS1(emptyArray());
435 }
436
437 /**
438 * Retrieve the set of values that occur in matches for S1.
439 * </p>
440 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
441 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
442 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
443 *
444 * @return the Stream of all values or empty set if there are no matches
445 *
446 */
447 public Stream<Segment> streamAllValuesOfS1(final ConnectedToNotSymmetric.Match partialMatch) {
448 return rawStreamAllValuesOfS1(partialMatch.toArray());
449 }
450
451 /**
452 * Retrieve the set of values that occur in matches for S1.
453 * </p>
454 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
455 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
456 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
457 *
458 * @return the Stream of all values or empty set if there are no matches
459 *
460 */
461 public Stream<Segment> streamAllValuesOfS1(final Segment pS2) {
462 return rawStreamAllValuesOfS1(new Object[]{null, pS2});
463 }
464
465 /**
466 * Retrieve the set of values that occur in matches for S1.
467 * @return the Set of all values or empty set if there are no matches
468 *
469 */
470 public Set<Segment> getAllValuesOfS1(final ConnectedToNotSymmetric.Match partialMatch) {
471 return rawStreamAllValuesOfS1(partialMatch.toArray()).collect(Collectors.toSet());
472 }
473
474 /**
475 * Retrieve the set of values that occur in matches for S1.
476 * @return the Set of all values or empty set if there are no matches
477 *
478 */
479 public Set<Segment> getAllValuesOfS1(final Segment pS2) {
480 return rawStreamAllValuesOfS1(new Object[]{null, pS2}).collect(Collectors.toSet());
481 }
482
483 /**
484 * Retrieve the set of values that occur in matches for S2.
485 * @return the Set of all values or empty set if there are no matches
486 *
487 */
488 protected Stream<Segment> rawStreamAllValuesOfS2(final Object[] parameters) {
489 return rawStreamAllValues(POSITION_S2, parameters).map(Segment.class::cast);
490 }
491
492 /**
493 * Retrieve the set of values that occur in matches for S2.
494 * @return the Set of all values or empty set if there are no matches
495 *
496 */
497 public Set<Segment> getAllValuesOfS2() {
498 return rawStreamAllValuesOfS2(emptyArray()).collect(Collectors.toSet());
499 }
500
501 /**
502 * Retrieve the set of values that occur in matches for S2.
503 * @return the Set of all values or empty set if there are no matches
504 *
505 */
506 public Stream<Segment> streamAllValuesOfS2() {
507 return rawStreamAllValuesOfS2(emptyArray());
508 }
509
510 /**
511 * Retrieve the set of values that occur in matches for S2.
512 * </p>
513 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
514 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
515 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
516 *
517 * @return the Stream of all values or empty set if there are no matches
518 *
519 */
520 public Stream<Segment> streamAllValuesOfS2(final ConnectedToNotSymmetric.Match partialMatch) {
521 return rawStreamAllValuesOfS2(partialMatch.toArray());
522 }
523
524 /**
525 * Retrieve the set of values that occur in matches for S2.
526 * </p>
527 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
528 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
529 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
530 *
531 * @return the Stream of all values or empty set if there are no matches
532 *
533 */
534 public Stream<Segment> streamAllValuesOfS2(final Segment pS1) {
535 return rawStreamAllValuesOfS2(new Object[]{pS1, null});
536 }
537
538 /**
539 * Retrieve the set of values that occur in matches for S2.
540 * @return the Set of all values or empty set if there are no matches
541 *
542 */
543 public Set<Segment> getAllValuesOfS2(final ConnectedToNotSymmetric.Match partialMatch) {
544 return rawStreamAllValuesOfS2(partialMatch.toArray()).collect(Collectors.toSet());
545 }
546
547 /**
548 * Retrieve the set of values that occur in matches for S2.
549 * @return the Set of all values or empty set if there are no matches
550 *
551 */
552 public Set<Segment> getAllValuesOfS2(final Segment pS1) {
553 return rawStreamAllValuesOfS2(new Object[]{pS1, null}).collect(Collectors.toSet());
554 }
555
556 @Override
557 protected ConnectedToNotSymmetric.Match tupleToMatch(final Tuple t) {
558 try {
559 return ConnectedToNotSymmetric.Match.newMatch((Segment) t.get(POSITION_S1), (Segment) t.get(POSITION_S2));
560 } catch(ClassCastException e) {
561 LOGGER.error("Element(s) in tuple not properly typed!",e);
562 return null;
563 }
564 }
565
566 @Override
567 protected ConnectedToNotSymmetric.Match arrayToMatch(final Object[] match) {
568 try {
569 return ConnectedToNotSymmetric.Match.newMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
570 } catch(ClassCastException e) {
571 LOGGER.error("Element(s) in array not properly typed!",e);
572 return null;
573 }
574 }
575
576 @Override
577 protected ConnectedToNotSymmetric.Match arrayToMatchMutable(final Object[] match) {
578 try {
579 return ConnectedToNotSymmetric.Match.newMutableMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
580 } catch(ClassCastException e) {
581 LOGGER.error("Element(s) in array not properly typed!",e);
582 return null;
583 }
584 }
585
586 /**
587 * @return the singleton instance of the query specification of this pattern
588 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
589 *
590 */
591 public static IQuerySpecification<ConnectedToNotSymmetric.Matcher> querySpecification() {
592 return ConnectedToNotSymmetric.instance();
593 }
594 }
595
596 private ConnectedToNotSymmetric() {
597 super(GeneratedPQuery.INSTANCE);
598 }
599
600 /**
601 * @return the singleton instance of the query specification
602 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
603 *
604 */
605 public static ConnectedToNotSymmetric instance() {
606 try{
607 return LazyHolder.INSTANCE;
608 } catch (ExceptionInInitializerError err) {
609 throw processInitializerError(err);
610 }
611 }
612
613 @Override
614 protected ConnectedToNotSymmetric.Matcher instantiate(final ViatraQueryEngine engine) {
615 return ConnectedToNotSymmetric.Matcher.on(engine);
616 }
617
618 @Override
619 public ConnectedToNotSymmetric.Matcher instantiate() {
620 return ConnectedToNotSymmetric.Matcher.create();
621 }
622
623 @Override
624 public ConnectedToNotSymmetric.Match newEmptyMatch() {
625 return ConnectedToNotSymmetric.Match.newEmptyMatch();
626 }
627
628 @Override
629 public ConnectedToNotSymmetric.Match newMatch(final Object... parameters) {
630 return ConnectedToNotSymmetric.Match.newMatch((modes3.Segment) parameters[0], (modes3.Segment) parameters[1]);
631 }
632
633 /**
634 * Inner class allowing the singleton instance of {@link ConnectedToNotSymmetric} to be created
635 * <b>not</b> at the class load time of the outer class,
636 * but rather at the first call to {@link ConnectedToNotSymmetric#instance()}.
637 *
638 * <p> This workaround is required e.g. to support recursion.
639 *
640 */
641 private static class LazyHolder {
642 private static final ConnectedToNotSymmetric INSTANCE = new ConnectedToNotSymmetric();
643
644 /**
645 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
646 * This initialization order is required to support indirect recursion.
647 *
648 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
649 *
650 */
651 private static final Object STATIC_INITIALIZER = ensureInitialized();
652
653 public static Object ensureInitialized() {
654 INSTANCE.ensureInitializedInternal();
655 return null;
656 }
657 }
658
659 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
660 private static final ConnectedToNotSymmetric.GeneratedPQuery INSTANCE = new GeneratedPQuery();
661
662 private final PParameter parameter_S1 = new PParameter("S1", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
663
664 private final PParameter parameter_S2 = new PParameter("S2", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
665
666 private final List<PParameter> parameters = Arrays.asList(parameter_S1, parameter_S2);
667
668 private GeneratedPQuery() {
669 super(PVisibility.PUBLIC);
670 }
671
672 @Override
673 public String getFullyQualifiedName() {
674 return "modes3.queries.connectedToNotSymmetric";
675 }
676
677 @Override
678 public List<String> getParameterNames() {
679 return Arrays.asList("S1","S2");
680 }
681
682 @Override
683 public List<PParameter> getParameters() {
684 return parameters;
685 }
686
687 @Override
688 public Set<PBody> doGetContainedBodies() {
689 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
690 Set<PBody> bodies = new LinkedHashSet<>();
691 {
692 PBody body = new PBody(this);
693 PVariable var_S1 = body.getOrCreateVariableByName("S1");
694 PVariable var_S2 = body.getOrCreateVariableByName("S2");
695 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
696 new TypeConstraint(body, Tuples.flatTupleOf(var_S2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
697 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
698 new ExportedParameter(body, var_S1, parameter_S1),
699 new ExportedParameter(body, var_S2, parameter_S2)
700 ));
701 // Segment.connectedTo(S1, S2)
702 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
703 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
704 new TypeConstraint(body, Tuples.flatTupleOf(var_S1, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo")));
705 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
706 new Equality(body, var__virtual_0_, var_S2);
707 // neg find connectedTo(S2, S1)
708 new NegativePatternCall(body, Tuples.flatTupleOf(var_S2, var_S1), ConnectedTo.instance().getInternalQueryRepresentation());
709 bodies.add(body);
710 }
711 {
712 PAnnotation annotation = new PAnnotation("Constraint");
713 annotation.addAttribute("message", "connectedToNotSymmetric");
714 annotation.addAttribute("severity", "error");
715 annotation.addAttribute("key", Arrays.asList(new Object[] {
716 new ParameterReference("S1"),
717 new ParameterReference("S2")
718 }));
719 addAnnotation(annotation);
720 }
721 return bodies;
722 }
723 }
724}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedToReflexive.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedToReflexive.java
new file mode 100644
index 00000000..948fec73
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ConnectedToReflexive.java
@@ -0,0 +1,563 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.viatra.query.runtime.api.IPatternMatch;
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
24import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
25import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
26import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
27import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
32import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
41import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
42
43/**
44 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
45 *
46 * <p>Original source:
47 * <code><pre>
48 * {@literal @}Constraint(message = "connectedToReflexive", severity = "error", key = { S })
49 * pattern connectedToReflexive(S : Segment) {
50 * Segment.connectedTo(S, S);
51 * }
52 * </pre></code>
53 *
54 * @see Matcher
55 * @see Match
56 *
57 */
58@SuppressWarnings("all")
59public final class ConnectedToReflexive extends BaseGeneratedEMFQuerySpecification<ConnectedToReflexive.Matcher> {
60 /**
61 * Pattern-specific match representation of the modes3.queries.connectedToReflexive pattern,
62 * to be used in conjunction with {@link Matcher}.
63 *
64 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
65 * Each instance is a (possibly partial) substitution of pattern parameters,
66 * usable to represent a match of the pattern in the result of a query,
67 * or to specify the bound (fixed) input parameters when issuing a query.
68 *
69 * @see Matcher
70 *
71 */
72 public static abstract class Match extends BasePatternMatch {
73 private Segment fS;
74
75 private static List<String> parameterNames = makeImmutableList("S");
76
77 private Match(final Segment pS) {
78 this.fS = pS;
79 }
80
81 @Override
82 public Object get(final String parameterName) {
83 switch(parameterName) {
84 case "S": return this.fS;
85 default: return null;
86 }
87 }
88
89 @Override
90 public Object get(final int index) {
91 switch(index) {
92 case 0: return this.fS;
93 default: return null;
94 }
95 }
96
97 public Segment getS() {
98 return this.fS;
99 }
100
101 @Override
102 public boolean set(final String parameterName, final Object newValue) {
103 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
104 if ("S".equals(parameterName) ) {
105 this.fS = (Segment) newValue;
106 return true;
107 }
108 return false;
109 }
110
111 public void setS(final Segment pS) {
112 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
113 this.fS = pS;
114 }
115
116 @Override
117 public String patternName() {
118 return "modes3.queries.connectedToReflexive";
119 }
120
121 @Override
122 public List<String> parameterNames() {
123 return ConnectedToReflexive.Match.parameterNames;
124 }
125
126 @Override
127 public Object[] toArray() {
128 return new Object[]{fS};
129 }
130
131 @Override
132 public ConnectedToReflexive.Match toImmutable() {
133 return isMutable() ? newMatch(fS) : this;
134 }
135
136 @Override
137 public String prettyPrint() {
138 StringBuilder result = new StringBuilder();
139 result.append("\"S\"=" + prettyPrintValue(fS));
140 return result.toString();
141 }
142
143 @Override
144 public int hashCode() {
145 return Objects.hash(fS);
146 }
147
148 @Override
149 public boolean equals(final Object obj) {
150 if (this == obj)
151 return true;
152 if (obj == null) {
153 return false;
154 }
155 if ((obj instanceof ConnectedToReflexive.Match)) {
156 ConnectedToReflexive.Match other = (ConnectedToReflexive.Match) obj;
157 return Objects.equals(fS, other.fS);
158 } else {
159 // this should be infrequent
160 if (!(obj instanceof IPatternMatch)) {
161 return false;
162 }
163 IPatternMatch otherSig = (IPatternMatch) obj;
164 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
165 }
166 }
167
168 @Override
169 public ConnectedToReflexive specification() {
170 return ConnectedToReflexive.instance();
171 }
172
173 /**
174 * Returns an empty, mutable match.
175 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
176 *
177 * @return the empty match.
178 *
179 */
180 public static ConnectedToReflexive.Match newEmptyMatch() {
181 return new Mutable(null);
182 }
183
184 /**
185 * Returns a mutable (partial) match.
186 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
187 *
188 * @param pS the fixed value of pattern parameter S, or null if not bound.
189 * @return the new, mutable (partial) match object.
190 *
191 */
192 public static ConnectedToReflexive.Match newMutableMatch(final Segment pS) {
193 return new Mutable(pS);
194 }
195
196 /**
197 * Returns a new (partial) match.
198 * This can be used e.g. to call the matcher with a partial match.
199 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
200 * @param pS the fixed value of pattern parameter S, or null if not bound.
201 * @return the (partial) match object.
202 *
203 */
204 public static ConnectedToReflexive.Match newMatch(final Segment pS) {
205 return new Immutable(pS);
206 }
207
208 private static final class Mutable extends ConnectedToReflexive.Match {
209 Mutable(final Segment pS) {
210 super(pS);
211 }
212
213 @Override
214 public boolean isMutable() {
215 return true;
216 }
217 }
218
219 private static final class Immutable extends ConnectedToReflexive.Match {
220 Immutable(final Segment pS) {
221 super(pS);
222 }
223
224 @Override
225 public boolean isMutable() {
226 return false;
227 }
228 }
229 }
230
231 /**
232 * Generated pattern matcher API of the modes3.queries.connectedToReflexive pattern,
233 * providing pattern-specific query methods.
234 *
235 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
236 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
237 *
238 * <p>Matches of the pattern will be represented as {@link Match}.
239 *
240 * <p>Original source:
241 * <code><pre>
242 * {@literal @}Constraint(message = "connectedToReflexive", severity = "error", key = { S })
243 * pattern connectedToReflexive(S : Segment) {
244 * Segment.connectedTo(S, S);
245 * }
246 * </pre></code>
247 *
248 * @see Match
249 * @see ConnectedToReflexive
250 *
251 */
252 public static class Matcher extends BaseMatcher<ConnectedToReflexive.Match> {
253 /**
254 * Initializes the pattern matcher within an existing VIATRA Query engine.
255 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
256 *
257 * @param engine the existing VIATRA Query engine in which this matcher will be created.
258 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
259 *
260 */
261 public static ConnectedToReflexive.Matcher on(final ViatraQueryEngine engine) {
262 // check if matcher already exists
263 Matcher matcher = engine.getExistingMatcher(querySpecification());
264 if (matcher == null) {
265 matcher = (Matcher)engine.getMatcher(querySpecification());
266 }
267 return matcher;
268 }
269
270 /**
271 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
272 * @return an initialized matcher
273 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
274 *
275 */
276 public static ConnectedToReflexive.Matcher create() {
277 return new Matcher();
278 }
279
280 private static final int POSITION_S = 0;
281
282 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(ConnectedToReflexive.Matcher.class);
283
284 /**
285 * Initializes the pattern matcher within an existing VIATRA Query engine.
286 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
287 *
288 * @param engine the existing VIATRA Query engine in which this matcher will be created.
289 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
290 *
291 */
292 private Matcher() {
293 super(querySpecification());
294 }
295
296 /**
297 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
298 * @param pS the fixed value of pattern parameter S, or null if not bound.
299 * @return matches represented as a Match object.
300 *
301 */
302 public Collection<ConnectedToReflexive.Match> getAllMatches(final Segment pS) {
303 return rawStreamAllMatches(new Object[]{pS}).collect(Collectors.toSet());
304 }
305
306 /**
307 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
308 * </p>
309 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
310 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
311 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
312 * @param pS the fixed value of pattern parameter S, or null if not bound.
313 * @return a stream of matches represented as a Match object.
314 *
315 */
316 public Stream<ConnectedToReflexive.Match> streamAllMatches(final Segment pS) {
317 return rawStreamAllMatches(new Object[]{pS});
318 }
319
320 /**
321 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
322 * Neither determinism nor randomness of selection is guaranteed.
323 * @param pS the fixed value of pattern parameter S, or null if not bound.
324 * @return a match represented as a Match object, or null if no match is found.
325 *
326 */
327 public Optional<ConnectedToReflexive.Match> getOneArbitraryMatch(final Segment pS) {
328 return rawGetOneArbitraryMatch(new Object[]{pS});
329 }
330
331 /**
332 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
333 * under any possible substitution of the unspecified parameters (if any).
334 * @param pS the fixed value of pattern parameter S, or null if not bound.
335 * @return true if the input is a valid (partial) match of the pattern.
336 *
337 */
338 public boolean hasMatch(final Segment pS) {
339 return rawHasMatch(new Object[]{pS});
340 }
341
342 /**
343 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
344 * @param pS the fixed value of pattern parameter S, or null if not bound.
345 * @return the number of pattern matches found.
346 *
347 */
348 public int countMatches(final Segment pS) {
349 return rawCountMatches(new Object[]{pS});
350 }
351
352 /**
353 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
354 * Neither determinism nor randomness of selection is guaranteed.
355 * @param pS the fixed value of pattern parameter S, or null if not bound.
356 * @param processor the action that will process the selected match.
357 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
358 *
359 */
360 public boolean forOneArbitraryMatch(final Segment pS, final Consumer<? super ConnectedToReflexive.Match> processor) {
361 return rawForOneArbitraryMatch(new Object[]{pS}, processor);
362 }
363
364 /**
365 * Returns a new (partial) match.
366 * This can be used e.g. to call the matcher with a partial match.
367 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
368 * @param pS the fixed value of pattern parameter S, or null if not bound.
369 * @return the (partial) match object.
370 *
371 */
372 public ConnectedToReflexive.Match newMatch(final Segment pS) {
373 return ConnectedToReflexive.Match.newMatch(pS);
374 }
375
376 /**
377 * Retrieve the set of values that occur in matches for S.
378 * @return the Set of all values or empty set if there are no matches
379 *
380 */
381 protected Stream<Segment> rawStreamAllValuesOfS(final Object[] parameters) {
382 return rawStreamAllValues(POSITION_S, parameters).map(Segment.class::cast);
383 }
384
385 /**
386 * Retrieve the set of values that occur in matches for S.
387 * @return the Set of all values or empty set if there are no matches
388 *
389 */
390 public Set<Segment> getAllValuesOfS() {
391 return rawStreamAllValuesOfS(emptyArray()).collect(Collectors.toSet());
392 }
393
394 /**
395 * Retrieve the set of values that occur in matches for S.
396 * @return the Set of all values or empty set if there are no matches
397 *
398 */
399 public Stream<Segment> streamAllValuesOfS() {
400 return rawStreamAllValuesOfS(emptyArray());
401 }
402
403 @Override
404 protected ConnectedToReflexive.Match tupleToMatch(final Tuple t) {
405 try {
406 return ConnectedToReflexive.Match.newMatch((Segment) t.get(POSITION_S));
407 } catch(ClassCastException e) {
408 LOGGER.error("Element(s) in tuple not properly typed!",e);
409 return null;
410 }
411 }
412
413 @Override
414 protected ConnectedToReflexive.Match arrayToMatch(final Object[] match) {
415 try {
416 return ConnectedToReflexive.Match.newMatch((Segment) match[POSITION_S]);
417 } catch(ClassCastException e) {
418 LOGGER.error("Element(s) in array not properly typed!",e);
419 return null;
420 }
421 }
422
423 @Override
424 protected ConnectedToReflexive.Match arrayToMatchMutable(final Object[] match) {
425 try {
426 return ConnectedToReflexive.Match.newMutableMatch((Segment) match[POSITION_S]);
427 } catch(ClassCastException e) {
428 LOGGER.error("Element(s) in array not properly typed!",e);
429 return null;
430 }
431 }
432
433 /**
434 * @return the singleton instance of the query specification of this pattern
435 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
436 *
437 */
438 public static IQuerySpecification<ConnectedToReflexive.Matcher> querySpecification() {
439 return ConnectedToReflexive.instance();
440 }
441 }
442
443 private ConnectedToReflexive() {
444 super(GeneratedPQuery.INSTANCE);
445 }
446
447 /**
448 * @return the singleton instance of the query specification
449 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
450 *
451 */
452 public static ConnectedToReflexive instance() {
453 try{
454 return LazyHolder.INSTANCE;
455 } catch (ExceptionInInitializerError err) {
456 throw processInitializerError(err);
457 }
458 }
459
460 @Override
461 protected ConnectedToReflexive.Matcher instantiate(final ViatraQueryEngine engine) {
462 return ConnectedToReflexive.Matcher.on(engine);
463 }
464
465 @Override
466 public ConnectedToReflexive.Matcher instantiate() {
467 return ConnectedToReflexive.Matcher.create();
468 }
469
470 @Override
471 public ConnectedToReflexive.Match newEmptyMatch() {
472 return ConnectedToReflexive.Match.newEmptyMatch();
473 }
474
475 @Override
476 public ConnectedToReflexive.Match newMatch(final Object... parameters) {
477 return ConnectedToReflexive.Match.newMatch((modes3.Segment) parameters[0]);
478 }
479
480 /**
481 * Inner class allowing the singleton instance of {@link ConnectedToReflexive} to be created
482 * <b>not</b> at the class load time of the outer class,
483 * but rather at the first call to {@link ConnectedToReflexive#instance()}.
484 *
485 * <p> This workaround is required e.g. to support recursion.
486 *
487 */
488 private static class LazyHolder {
489 private static final ConnectedToReflexive INSTANCE = new ConnectedToReflexive();
490
491 /**
492 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
493 * This initialization order is required to support indirect recursion.
494 *
495 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
496 *
497 */
498 private static final Object STATIC_INITIALIZER = ensureInitialized();
499
500 public static Object ensureInitialized() {
501 INSTANCE.ensureInitializedInternal();
502 return null;
503 }
504 }
505
506 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
507 private static final ConnectedToReflexive.GeneratedPQuery INSTANCE = new GeneratedPQuery();
508
509 private final PParameter parameter_S = new PParameter("S", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
510
511 private final List<PParameter> parameters = Arrays.asList(parameter_S);
512
513 private GeneratedPQuery() {
514 super(PVisibility.PUBLIC);
515 }
516
517 @Override
518 public String getFullyQualifiedName() {
519 return "modes3.queries.connectedToReflexive";
520 }
521
522 @Override
523 public List<String> getParameterNames() {
524 return Arrays.asList("S");
525 }
526
527 @Override
528 public List<PParameter> getParameters() {
529 return parameters;
530 }
531
532 @Override
533 public Set<PBody> doGetContainedBodies() {
534 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
535 Set<PBody> bodies = new LinkedHashSet<>();
536 {
537 PBody body = new PBody(this);
538 PVariable var_S = body.getOrCreateVariableByName("S");
539 new TypeConstraint(body, Tuples.flatTupleOf(var_S), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
540 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
541 new ExportedParameter(body, var_S, parameter_S)
542 ));
543 // Segment.connectedTo(S, S)
544 new TypeConstraint(body, Tuples.flatTupleOf(var_S), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
545 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
546 new TypeConstraint(body, Tuples.flatTupleOf(var_S, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo")));
547 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
548 new Equality(body, var__virtual_0_, var_S);
549 bodies.add(body);
550 }
551 {
552 PAnnotation annotation = new PAnnotation("Constraint");
553 annotation.addAttribute("message", "connectedToReflexive");
554 annotation.addAttribute("severity", "error");
555 annotation.addAttribute("key", Arrays.asList(new Object[] {
556 new ParameterReference("S")
557 }));
558 addAnnotation(annotation);
559 }
560 return bodies;
561 }
562 }
563}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_2.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_2.java
new file mode 100644
index 00000000..a8f68dca
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_2.java
@@ -0,0 +1,564 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Train;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.viatra.query.runtime.api.IPatternMatch;
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
24import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
25import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
26import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
27import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
28import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
30import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
31import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
32import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
33import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
34import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
35import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
36import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
37import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
38
39/**
40 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
41 *
42 * <p>Original source:
43 * <code><pre>
44 * //
45 * // endOfSiding
46 * //
47 *
48 * pattern endOfSiding_step_2(in train : Train) {
49 * // frame-{@literal >}train = model-{@literal >}trains[i0];
50 * // frame-{@literal >}location = frame-{@literal >}train-{@literal >}location;
51 * // if (frame-{@literal >}location != NULL) {
52 * // ...
53 * // }
54 *
55 * Train(train);
56 * }
57 * </pre></code>
58 *
59 * @see Matcher
60 * @see Match
61 *
62 */
63@SuppressWarnings("all")
64public final class EndOfSiding_step_2 extends BaseGeneratedEMFQuerySpecification<EndOfSiding_step_2.Matcher> {
65 /**
66 * Pattern-specific match representation of the modes3.queries.endOfSiding_step_2 pattern,
67 * to be used in conjunction with {@link Matcher}.
68 *
69 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
70 * Each instance is a (possibly partial) substitution of pattern parameters,
71 * usable to represent a match of the pattern in the result of a query,
72 * or to specify the bound (fixed) input parameters when issuing a query.
73 *
74 * @see Matcher
75 *
76 */
77 public static abstract class Match extends BasePatternMatch {
78 private Train fTrain;
79
80 private static List<String> parameterNames = makeImmutableList("train");
81
82 private Match(final Train pTrain) {
83 this.fTrain = pTrain;
84 }
85
86 @Override
87 public Object get(final String parameterName) {
88 switch(parameterName) {
89 case "train": return this.fTrain;
90 default: return null;
91 }
92 }
93
94 @Override
95 public Object get(final int index) {
96 switch(index) {
97 case 0: return this.fTrain;
98 default: return null;
99 }
100 }
101
102 public Train getTrain() {
103 return this.fTrain;
104 }
105
106 @Override
107 public boolean set(final String parameterName, final Object newValue) {
108 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
109 if ("train".equals(parameterName) ) {
110 this.fTrain = (Train) newValue;
111 return true;
112 }
113 return false;
114 }
115
116 public void setTrain(final Train pTrain) {
117 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
118 this.fTrain = pTrain;
119 }
120
121 @Override
122 public String patternName() {
123 return "modes3.queries.endOfSiding_step_2";
124 }
125
126 @Override
127 public List<String> parameterNames() {
128 return EndOfSiding_step_2.Match.parameterNames;
129 }
130
131 @Override
132 public Object[] toArray() {
133 return new Object[]{fTrain};
134 }
135
136 @Override
137 public EndOfSiding_step_2.Match toImmutable() {
138 return isMutable() ? newMatch(fTrain) : this;
139 }
140
141 @Override
142 public String prettyPrint() {
143 StringBuilder result = new StringBuilder();
144 result.append("\"train\"=" + prettyPrintValue(fTrain));
145 return result.toString();
146 }
147
148 @Override
149 public int hashCode() {
150 return Objects.hash(fTrain);
151 }
152
153 @Override
154 public boolean equals(final Object obj) {
155 if (this == obj)
156 return true;
157 if (obj == null) {
158 return false;
159 }
160 if ((obj instanceof EndOfSiding_step_2.Match)) {
161 EndOfSiding_step_2.Match other = (EndOfSiding_step_2.Match) obj;
162 return Objects.equals(fTrain, other.fTrain);
163 } else {
164 // this should be infrequent
165 if (!(obj instanceof IPatternMatch)) {
166 return false;
167 }
168 IPatternMatch otherSig = (IPatternMatch) obj;
169 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
170 }
171 }
172
173 @Override
174 public EndOfSiding_step_2 specification() {
175 return EndOfSiding_step_2.instance();
176 }
177
178 /**
179 * Returns an empty, mutable match.
180 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
181 *
182 * @return the empty match.
183 *
184 */
185 public static EndOfSiding_step_2.Match newEmptyMatch() {
186 return new Mutable(null);
187 }
188
189 /**
190 * Returns a mutable (partial) match.
191 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
192 *
193 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
194 * @return the new, mutable (partial) match object.
195 *
196 */
197 public static EndOfSiding_step_2.Match newMutableMatch(final Train pTrain) {
198 return new Mutable(pTrain);
199 }
200
201 /**
202 * Returns a new (partial) match.
203 * This can be used e.g. to call the matcher with a partial match.
204 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
205 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
206 * @return the (partial) match object.
207 *
208 */
209 public static EndOfSiding_step_2.Match newMatch(final Train pTrain) {
210 return new Immutable(pTrain);
211 }
212
213 private static final class Mutable extends EndOfSiding_step_2.Match {
214 Mutable(final Train pTrain) {
215 super(pTrain);
216 }
217
218 @Override
219 public boolean isMutable() {
220 return true;
221 }
222 }
223
224 private static final class Immutable extends EndOfSiding_step_2.Match {
225 Immutable(final Train pTrain) {
226 super(pTrain);
227 }
228
229 @Override
230 public boolean isMutable() {
231 return false;
232 }
233 }
234 }
235
236 /**
237 * Generated pattern matcher API of the modes3.queries.endOfSiding_step_2 pattern,
238 * providing pattern-specific query methods.
239 *
240 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
241 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
242 *
243 * <p>Matches of the pattern will be represented as {@link Match}.
244 *
245 * <p>Original source:
246 * <code><pre>
247 * //
248 * // endOfSiding
249 * //
250 *
251 * pattern endOfSiding_step_2(in train : Train) {
252 * // frame-{@literal >}train = model-{@literal >}trains[i0];
253 * // frame-{@literal >}location = frame-{@literal >}train-{@literal >}location;
254 * // if (frame-{@literal >}location != NULL) {
255 * // ...
256 * // }
257 *
258 * Train(train);
259 * }
260 * </pre></code>
261 *
262 * @see Match
263 * @see EndOfSiding_step_2
264 *
265 */
266 public static class Matcher extends BaseMatcher<EndOfSiding_step_2.Match> {
267 /**
268 * Initializes the pattern matcher within an existing VIATRA Query engine.
269 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
270 *
271 * @param engine the existing VIATRA Query engine in which this matcher will be created.
272 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
273 *
274 */
275 public static EndOfSiding_step_2.Matcher on(final ViatraQueryEngine engine) {
276 // check if matcher already exists
277 Matcher matcher = engine.getExistingMatcher(querySpecification());
278 if (matcher == null) {
279 matcher = (Matcher)engine.getMatcher(querySpecification());
280 }
281 return matcher;
282 }
283
284 /**
285 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
286 * @return an initialized matcher
287 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
288 *
289 */
290 public static EndOfSiding_step_2.Matcher create() {
291 return new Matcher();
292 }
293
294 private static final int POSITION_TRAIN = 0;
295
296 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(EndOfSiding_step_2.Matcher.class);
297
298 /**
299 * Initializes the pattern matcher within an existing VIATRA Query engine.
300 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
301 *
302 * @param engine the existing VIATRA Query engine in which this matcher will be created.
303 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
304 *
305 */
306 private Matcher() {
307 super(querySpecification());
308 }
309
310 /**
311 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
312 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
313 * @return matches represented as a Match object.
314 *
315 */
316 public Collection<EndOfSiding_step_2.Match> getAllMatches(final Train pTrain) {
317 return rawStreamAllMatches(new Object[]{pTrain}).collect(Collectors.toSet());
318 }
319
320 /**
321 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
322 * </p>
323 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
324 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
325 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
326 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
327 * @return a stream of matches represented as a Match object.
328 *
329 */
330 public Stream<EndOfSiding_step_2.Match> streamAllMatches(final Train pTrain) {
331 return rawStreamAllMatches(new Object[]{pTrain});
332 }
333
334 /**
335 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
336 * Neither determinism nor randomness of selection is guaranteed.
337 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
338 * @return a match represented as a Match object, or null if no match is found.
339 *
340 */
341 public Optional<EndOfSiding_step_2.Match> getOneArbitraryMatch(final Train pTrain) {
342 return rawGetOneArbitraryMatch(new Object[]{pTrain});
343 }
344
345 /**
346 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
347 * under any possible substitution of the unspecified parameters (if any).
348 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
349 * @return true if the input is a valid (partial) match of the pattern.
350 *
351 */
352 public boolean hasMatch(final Train pTrain) {
353 return rawHasMatch(new Object[]{pTrain});
354 }
355
356 /**
357 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
358 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
359 * @return the number of pattern matches found.
360 *
361 */
362 public int countMatches(final Train pTrain) {
363 return rawCountMatches(new Object[]{pTrain});
364 }
365
366 /**
367 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
368 * Neither determinism nor randomness of selection is guaranteed.
369 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
370 * @param processor the action that will process the selected match.
371 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
372 *
373 */
374 public boolean forOneArbitraryMatch(final Train pTrain, final Consumer<? super EndOfSiding_step_2.Match> processor) {
375 return rawForOneArbitraryMatch(new Object[]{pTrain}, processor);
376 }
377
378 /**
379 * Returns a new (partial) match.
380 * This can be used e.g. to call the matcher with a partial match.
381 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
382 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
383 * @return the (partial) match object.
384 *
385 */
386 public EndOfSiding_step_2.Match newMatch(final Train pTrain) {
387 return EndOfSiding_step_2.Match.newMatch(pTrain);
388 }
389
390 /**
391 * Retrieve the set of values that occur in matches for train.
392 * @return the Set of all values or empty set if there are no matches
393 *
394 */
395 protected Stream<Train> rawStreamAllValuesOftrain(final Object[] parameters) {
396 return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast);
397 }
398
399 /**
400 * Retrieve the set of values that occur in matches for train.
401 * @return the Set of all values or empty set if there are no matches
402 *
403 */
404 public Set<Train> getAllValuesOftrain() {
405 return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet());
406 }
407
408 /**
409 * Retrieve the set of values that occur in matches for train.
410 * @return the Set of all values or empty set if there are no matches
411 *
412 */
413 public Stream<Train> streamAllValuesOftrain() {
414 return rawStreamAllValuesOftrain(emptyArray());
415 }
416
417 @Override
418 protected EndOfSiding_step_2.Match tupleToMatch(final Tuple t) {
419 try {
420 return EndOfSiding_step_2.Match.newMatch((Train) t.get(POSITION_TRAIN));
421 } catch(ClassCastException e) {
422 LOGGER.error("Element(s) in tuple not properly typed!",e);
423 return null;
424 }
425 }
426
427 @Override
428 protected EndOfSiding_step_2.Match arrayToMatch(final Object[] match) {
429 try {
430 return EndOfSiding_step_2.Match.newMatch((Train) match[POSITION_TRAIN]);
431 } catch(ClassCastException e) {
432 LOGGER.error("Element(s) in array not properly typed!",e);
433 return null;
434 }
435 }
436
437 @Override
438 protected EndOfSiding_step_2.Match arrayToMatchMutable(final Object[] match) {
439 try {
440 return EndOfSiding_step_2.Match.newMutableMatch((Train) match[POSITION_TRAIN]);
441 } catch(ClassCastException e) {
442 LOGGER.error("Element(s) in array not properly typed!",e);
443 return null;
444 }
445 }
446
447 /**
448 * @return the singleton instance of the query specification of this pattern
449 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
450 *
451 */
452 public static IQuerySpecification<EndOfSiding_step_2.Matcher> querySpecification() {
453 return EndOfSiding_step_2.instance();
454 }
455 }
456
457 private EndOfSiding_step_2() {
458 super(GeneratedPQuery.INSTANCE);
459 }
460
461 /**
462 * @return the singleton instance of the query specification
463 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
464 *
465 */
466 public static EndOfSiding_step_2 instance() {
467 try{
468 return LazyHolder.INSTANCE;
469 } catch (ExceptionInInitializerError err) {
470 throw processInitializerError(err);
471 }
472 }
473
474 @Override
475 protected EndOfSiding_step_2.Matcher instantiate(final ViatraQueryEngine engine) {
476 return EndOfSiding_step_2.Matcher.on(engine);
477 }
478
479 @Override
480 public EndOfSiding_step_2.Matcher instantiate() {
481 return EndOfSiding_step_2.Matcher.create();
482 }
483
484 @Override
485 public EndOfSiding_step_2.Match newEmptyMatch() {
486 return EndOfSiding_step_2.Match.newEmptyMatch();
487 }
488
489 @Override
490 public EndOfSiding_step_2.Match newMatch(final Object... parameters) {
491 return EndOfSiding_step_2.Match.newMatch((modes3.Train) parameters[0]);
492 }
493
494 /**
495 * Inner class allowing the singleton instance of {@link EndOfSiding_step_2} to be created
496 * <b>not</b> at the class load time of the outer class,
497 * but rather at the first call to {@link EndOfSiding_step_2#instance()}.
498 *
499 * <p> This workaround is required e.g. to support recursion.
500 *
501 */
502 private static class LazyHolder {
503 private static final EndOfSiding_step_2 INSTANCE = new EndOfSiding_step_2();
504
505 /**
506 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
507 * This initialization order is required to support indirect recursion.
508 *
509 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
510 *
511 */
512 private static final Object STATIC_INITIALIZER = ensureInitialized();
513
514 public static Object ensureInitialized() {
515 INSTANCE.ensureInitializedInternal();
516 return null;
517 }
518 }
519
520 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
521 private static final EndOfSiding_step_2.GeneratedPQuery INSTANCE = new GeneratedPQuery();
522
523 private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT);
524
525 private final List<PParameter> parameters = Arrays.asList(parameter_train);
526
527 private GeneratedPQuery() {
528 super(PVisibility.PUBLIC);
529 }
530
531 @Override
532 public String getFullyQualifiedName() {
533 return "modes3.queries.endOfSiding_step_2";
534 }
535
536 @Override
537 public List<String> getParameterNames() {
538 return Arrays.asList("train");
539 }
540
541 @Override
542 public List<PParameter> getParameters() {
543 return parameters;
544 }
545
546 @Override
547 public Set<PBody> doGetContainedBodies() {
548 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
549 Set<PBody> bodies = new LinkedHashSet<>();
550 {
551 PBody body = new PBody(this);
552 PVariable var_train = body.getOrCreateVariableByName("train");
553 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
554 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
555 new ExportedParameter(body, var_train, parameter_train)
556 ));
557 // // frame->train = model->trains[i0];// frame->location = frame->train->location;// if (frame->location != NULL) {// ...// } Train(train)
558 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
559 bodies.add(body);
560 }
561 return bodies;
562 }
563 }
564}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_3.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_3.java
new file mode 100644
index 00000000..16b28a9f
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_3.java
@@ -0,0 +1,717 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import modes3.Train;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
29import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
31import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
40import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
41
42/**
43 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
44 *
45 * <p>Original source:
46 * <code><pre>
47 * pattern endOfSiding_step_3(in train : Train, in location : Segment) {
48 * // int loop_bound1 = frame-{@literal >}location-{@literal >}connected_to_count;
49 * // for (int i1 = 0; i1 {@literal <} loop_bound1; i1++) {
50 * // ...
51 * // }
52 * Train(train);
53 * Train.location(train, location);
54 * }
55 * </pre></code>
56 *
57 * @see Matcher
58 * @see Match
59 *
60 */
61@SuppressWarnings("all")
62public final class EndOfSiding_step_3 extends BaseGeneratedEMFQuerySpecification<EndOfSiding_step_3.Matcher> {
63 /**
64 * Pattern-specific match representation of the modes3.queries.endOfSiding_step_3 pattern,
65 * to be used in conjunction with {@link Matcher}.
66 *
67 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
68 * Each instance is a (possibly partial) substitution of pattern parameters,
69 * usable to represent a match of the pattern in the result of a query,
70 * or to specify the bound (fixed) input parameters when issuing a query.
71 *
72 * @see Matcher
73 *
74 */
75 public static abstract class Match extends BasePatternMatch {
76 private Train fTrain;
77
78 private Segment fLocation;
79
80 private static List<String> parameterNames = makeImmutableList("train", "location");
81
82 private Match(final Train pTrain, final Segment pLocation) {
83 this.fTrain = pTrain;
84 this.fLocation = pLocation;
85 }
86
87 @Override
88 public Object get(final String parameterName) {
89 switch(parameterName) {
90 case "train": return this.fTrain;
91 case "location": return this.fLocation;
92 default: return null;
93 }
94 }
95
96 @Override
97 public Object get(final int index) {
98 switch(index) {
99 case 0: return this.fTrain;
100 case 1: return this.fLocation;
101 default: return null;
102 }
103 }
104
105 public Train getTrain() {
106 return this.fTrain;
107 }
108
109 public Segment getLocation() {
110 return this.fLocation;
111 }
112
113 @Override
114 public boolean set(final String parameterName, final Object newValue) {
115 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
116 if ("train".equals(parameterName) ) {
117 this.fTrain = (Train) newValue;
118 return true;
119 }
120 if ("location".equals(parameterName) ) {
121 this.fLocation = (Segment) newValue;
122 return true;
123 }
124 return false;
125 }
126
127 public void setTrain(final Train pTrain) {
128 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
129 this.fTrain = pTrain;
130 }
131
132 public void setLocation(final Segment pLocation) {
133 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
134 this.fLocation = pLocation;
135 }
136
137 @Override
138 public String patternName() {
139 return "modes3.queries.endOfSiding_step_3";
140 }
141
142 @Override
143 public List<String> parameterNames() {
144 return EndOfSiding_step_3.Match.parameterNames;
145 }
146
147 @Override
148 public Object[] toArray() {
149 return new Object[]{fTrain, fLocation};
150 }
151
152 @Override
153 public EndOfSiding_step_3.Match toImmutable() {
154 return isMutable() ? newMatch(fTrain, fLocation) : this;
155 }
156
157 @Override
158 public String prettyPrint() {
159 StringBuilder result = new StringBuilder();
160 result.append("\"train\"=" + prettyPrintValue(fTrain) + ", ");
161 result.append("\"location\"=" + prettyPrintValue(fLocation));
162 return result.toString();
163 }
164
165 @Override
166 public int hashCode() {
167 return Objects.hash(fTrain, fLocation);
168 }
169
170 @Override
171 public boolean equals(final Object obj) {
172 if (this == obj)
173 return true;
174 if (obj == null) {
175 return false;
176 }
177 if ((obj instanceof EndOfSiding_step_3.Match)) {
178 EndOfSiding_step_3.Match other = (EndOfSiding_step_3.Match) obj;
179 return Objects.equals(fTrain, other.fTrain) && Objects.equals(fLocation, other.fLocation);
180 } else {
181 // this should be infrequent
182 if (!(obj instanceof IPatternMatch)) {
183 return false;
184 }
185 IPatternMatch otherSig = (IPatternMatch) obj;
186 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
187 }
188 }
189
190 @Override
191 public EndOfSiding_step_3 specification() {
192 return EndOfSiding_step_3.instance();
193 }
194
195 /**
196 * Returns an empty, mutable match.
197 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
198 *
199 * @return the empty match.
200 *
201 */
202 public static EndOfSiding_step_3.Match newEmptyMatch() {
203 return new Mutable(null, null);
204 }
205
206 /**
207 * Returns a mutable (partial) match.
208 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
209 *
210 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
211 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
212 * @return the new, mutable (partial) match object.
213 *
214 */
215 public static EndOfSiding_step_3.Match newMutableMatch(final Train pTrain, final Segment pLocation) {
216 return new Mutable(pTrain, pLocation);
217 }
218
219 /**
220 * Returns a new (partial) match.
221 * This can be used e.g. to call the matcher with a partial match.
222 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
223 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
224 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
225 * @return the (partial) match object.
226 *
227 */
228 public static EndOfSiding_step_3.Match newMatch(final Train pTrain, final Segment pLocation) {
229 return new Immutable(pTrain, pLocation);
230 }
231
232 private static final class Mutable extends EndOfSiding_step_3.Match {
233 Mutable(final Train pTrain, final Segment pLocation) {
234 super(pTrain, pLocation);
235 }
236
237 @Override
238 public boolean isMutable() {
239 return true;
240 }
241 }
242
243 private static final class Immutable extends EndOfSiding_step_3.Match {
244 Immutable(final Train pTrain, final Segment pLocation) {
245 super(pTrain, pLocation);
246 }
247
248 @Override
249 public boolean isMutable() {
250 return false;
251 }
252 }
253 }
254
255 /**
256 * Generated pattern matcher API of the modes3.queries.endOfSiding_step_3 pattern,
257 * providing pattern-specific query methods.
258 *
259 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
260 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
261 *
262 * <p>Matches of the pattern will be represented as {@link Match}.
263 *
264 * <p>Original source:
265 * <code><pre>
266 * pattern endOfSiding_step_3(in train : Train, in location : Segment) {
267 * // int loop_bound1 = frame-{@literal >}location-{@literal >}connected_to_count;
268 * // for (int i1 = 0; i1 {@literal <} loop_bound1; i1++) {
269 * // ...
270 * // }
271 * Train(train);
272 * Train.location(train, location);
273 * }
274 * </pre></code>
275 *
276 * @see Match
277 * @see EndOfSiding_step_3
278 *
279 */
280 public static class Matcher extends BaseMatcher<EndOfSiding_step_3.Match> {
281 /**
282 * Initializes the pattern matcher within an existing VIATRA Query engine.
283 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
284 *
285 * @param engine the existing VIATRA Query engine in which this matcher will be created.
286 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
287 *
288 */
289 public static EndOfSiding_step_3.Matcher on(final ViatraQueryEngine engine) {
290 // check if matcher already exists
291 Matcher matcher = engine.getExistingMatcher(querySpecification());
292 if (matcher == null) {
293 matcher = (Matcher)engine.getMatcher(querySpecification());
294 }
295 return matcher;
296 }
297
298 /**
299 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
300 * @return an initialized matcher
301 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
302 *
303 */
304 public static EndOfSiding_step_3.Matcher create() {
305 return new Matcher();
306 }
307
308 private static final int POSITION_TRAIN = 0;
309
310 private static final int POSITION_LOCATION = 1;
311
312 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(EndOfSiding_step_3.Matcher.class);
313
314 /**
315 * Initializes the pattern matcher within an existing VIATRA Query engine.
316 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
317 *
318 * @param engine the existing VIATRA Query engine in which this matcher will be created.
319 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
320 *
321 */
322 private Matcher() {
323 super(querySpecification());
324 }
325
326 /**
327 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
328 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
329 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
330 * @return matches represented as a Match object.
331 *
332 */
333 public Collection<EndOfSiding_step_3.Match> getAllMatches(final Train pTrain, final Segment pLocation) {
334 return rawStreamAllMatches(new Object[]{pTrain, pLocation}).collect(Collectors.toSet());
335 }
336
337 /**
338 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
339 * </p>
340 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
341 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
342 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
343 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
344 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
345 * @return a stream of matches represented as a Match object.
346 *
347 */
348 public Stream<EndOfSiding_step_3.Match> streamAllMatches(final Train pTrain, final Segment pLocation) {
349 return rawStreamAllMatches(new Object[]{pTrain, pLocation});
350 }
351
352 /**
353 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
354 * Neither determinism nor randomness of selection is guaranteed.
355 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
356 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
357 * @return a match represented as a Match object, or null if no match is found.
358 *
359 */
360 public Optional<EndOfSiding_step_3.Match> getOneArbitraryMatch(final Train pTrain, final Segment pLocation) {
361 return rawGetOneArbitraryMatch(new Object[]{pTrain, pLocation});
362 }
363
364 /**
365 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
366 * under any possible substitution of the unspecified parameters (if any).
367 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
368 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
369 * @return true if the input is a valid (partial) match of the pattern.
370 *
371 */
372 public boolean hasMatch(final Train pTrain, final Segment pLocation) {
373 return rawHasMatch(new Object[]{pTrain, pLocation});
374 }
375
376 /**
377 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
378 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
379 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
380 * @return the number of pattern matches found.
381 *
382 */
383 public int countMatches(final Train pTrain, final Segment pLocation) {
384 return rawCountMatches(new Object[]{pTrain, pLocation});
385 }
386
387 /**
388 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
389 * Neither determinism nor randomness of selection is guaranteed.
390 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
391 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
392 * @param processor the action that will process the selected match.
393 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
394 *
395 */
396 public boolean forOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Consumer<? super EndOfSiding_step_3.Match> processor) {
397 return rawForOneArbitraryMatch(new Object[]{pTrain, pLocation}, processor);
398 }
399
400 /**
401 * Returns a new (partial) match.
402 * This can be used e.g. to call the matcher with a partial match.
403 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
404 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
405 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
406 * @return the (partial) match object.
407 *
408 */
409 public EndOfSiding_step_3.Match newMatch(final Train pTrain, final Segment pLocation) {
410 return EndOfSiding_step_3.Match.newMatch(pTrain, pLocation);
411 }
412
413 /**
414 * Retrieve the set of values that occur in matches for train.
415 * @return the Set of all values or empty set if there are no matches
416 *
417 */
418 protected Stream<Train> rawStreamAllValuesOftrain(final Object[] parameters) {
419 return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast);
420 }
421
422 /**
423 * Retrieve the set of values that occur in matches for train.
424 * @return the Set of all values or empty set if there are no matches
425 *
426 */
427 public Set<Train> getAllValuesOftrain() {
428 return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet());
429 }
430
431 /**
432 * Retrieve the set of values that occur in matches for train.
433 * @return the Set of all values or empty set if there are no matches
434 *
435 */
436 public Stream<Train> streamAllValuesOftrain() {
437 return rawStreamAllValuesOftrain(emptyArray());
438 }
439
440 /**
441 * Retrieve the set of values that occur in matches for train.
442 * </p>
443 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
444 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
445 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
446 *
447 * @return the Stream of all values or empty set if there are no matches
448 *
449 */
450 public Stream<Train> streamAllValuesOftrain(final EndOfSiding_step_3.Match partialMatch) {
451 return rawStreamAllValuesOftrain(partialMatch.toArray());
452 }
453
454 /**
455 * Retrieve the set of values that occur in matches for train.
456 * </p>
457 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
458 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
459 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
460 *
461 * @return the Stream of all values or empty set if there are no matches
462 *
463 */
464 public Stream<Train> streamAllValuesOftrain(final Segment pLocation) {
465 return rawStreamAllValuesOftrain(new Object[]{null, pLocation});
466 }
467
468 /**
469 * Retrieve the set of values that occur in matches for train.
470 * @return the Set of all values or empty set if there are no matches
471 *
472 */
473 public Set<Train> getAllValuesOftrain(final EndOfSiding_step_3.Match partialMatch) {
474 return rawStreamAllValuesOftrain(partialMatch.toArray()).collect(Collectors.toSet());
475 }
476
477 /**
478 * Retrieve the set of values that occur in matches for train.
479 * @return the Set of all values or empty set if there are no matches
480 *
481 */
482 public Set<Train> getAllValuesOftrain(final Segment pLocation) {
483 return rawStreamAllValuesOftrain(new Object[]{null, pLocation}).collect(Collectors.toSet());
484 }
485
486 /**
487 * Retrieve the set of values that occur in matches for location.
488 * @return the Set of all values or empty set if there are no matches
489 *
490 */
491 protected Stream<Segment> rawStreamAllValuesOflocation(final Object[] parameters) {
492 return rawStreamAllValues(POSITION_LOCATION, parameters).map(Segment.class::cast);
493 }
494
495 /**
496 * Retrieve the set of values that occur in matches for location.
497 * @return the Set of all values or empty set if there are no matches
498 *
499 */
500 public Set<Segment> getAllValuesOflocation() {
501 return rawStreamAllValuesOflocation(emptyArray()).collect(Collectors.toSet());
502 }
503
504 /**
505 * Retrieve the set of values that occur in matches for location.
506 * @return the Set of all values or empty set if there are no matches
507 *
508 */
509 public Stream<Segment> streamAllValuesOflocation() {
510 return rawStreamAllValuesOflocation(emptyArray());
511 }
512
513 /**
514 * Retrieve the set of values that occur in matches for location.
515 * </p>
516 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
517 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
518 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
519 *
520 * @return the Stream of all values or empty set if there are no matches
521 *
522 */
523 public Stream<Segment> streamAllValuesOflocation(final EndOfSiding_step_3.Match partialMatch) {
524 return rawStreamAllValuesOflocation(partialMatch.toArray());
525 }
526
527 /**
528 * Retrieve the set of values that occur in matches for location.
529 * </p>
530 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
531 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
532 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
533 *
534 * @return the Stream of all values or empty set if there are no matches
535 *
536 */
537 public Stream<Segment> streamAllValuesOflocation(final Train pTrain) {
538 return rawStreamAllValuesOflocation(new Object[]{pTrain, null});
539 }
540
541 /**
542 * Retrieve the set of values that occur in matches for location.
543 * @return the Set of all values or empty set if there are no matches
544 *
545 */
546 public Set<Segment> getAllValuesOflocation(final EndOfSiding_step_3.Match partialMatch) {
547 return rawStreamAllValuesOflocation(partialMatch.toArray()).collect(Collectors.toSet());
548 }
549
550 /**
551 * Retrieve the set of values that occur in matches for location.
552 * @return the Set of all values or empty set if there are no matches
553 *
554 */
555 public Set<Segment> getAllValuesOflocation(final Train pTrain) {
556 return rawStreamAllValuesOflocation(new Object[]{pTrain, null}).collect(Collectors.toSet());
557 }
558
559 @Override
560 protected EndOfSiding_step_3.Match tupleToMatch(final Tuple t) {
561 try {
562 return EndOfSiding_step_3.Match.newMatch((Train) t.get(POSITION_TRAIN), (Segment) t.get(POSITION_LOCATION));
563 } catch(ClassCastException e) {
564 LOGGER.error("Element(s) in tuple not properly typed!",e);
565 return null;
566 }
567 }
568
569 @Override
570 protected EndOfSiding_step_3.Match arrayToMatch(final Object[] match) {
571 try {
572 return EndOfSiding_step_3.Match.newMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION]);
573 } catch(ClassCastException e) {
574 LOGGER.error("Element(s) in array not properly typed!",e);
575 return null;
576 }
577 }
578
579 @Override
580 protected EndOfSiding_step_3.Match arrayToMatchMutable(final Object[] match) {
581 try {
582 return EndOfSiding_step_3.Match.newMutableMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION]);
583 } catch(ClassCastException e) {
584 LOGGER.error("Element(s) in array not properly typed!",e);
585 return null;
586 }
587 }
588
589 /**
590 * @return the singleton instance of the query specification of this pattern
591 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
592 *
593 */
594 public static IQuerySpecification<EndOfSiding_step_3.Matcher> querySpecification() {
595 return EndOfSiding_step_3.instance();
596 }
597 }
598
599 private EndOfSiding_step_3() {
600 super(GeneratedPQuery.INSTANCE);
601 }
602
603 /**
604 * @return the singleton instance of the query specification
605 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
606 *
607 */
608 public static EndOfSiding_step_3 instance() {
609 try{
610 return LazyHolder.INSTANCE;
611 } catch (ExceptionInInitializerError err) {
612 throw processInitializerError(err);
613 }
614 }
615
616 @Override
617 protected EndOfSiding_step_3.Matcher instantiate(final ViatraQueryEngine engine) {
618 return EndOfSiding_step_3.Matcher.on(engine);
619 }
620
621 @Override
622 public EndOfSiding_step_3.Matcher instantiate() {
623 return EndOfSiding_step_3.Matcher.create();
624 }
625
626 @Override
627 public EndOfSiding_step_3.Match newEmptyMatch() {
628 return EndOfSiding_step_3.Match.newEmptyMatch();
629 }
630
631 @Override
632 public EndOfSiding_step_3.Match newMatch(final Object... parameters) {
633 return EndOfSiding_step_3.Match.newMatch((modes3.Train) parameters[0], (modes3.Segment) parameters[1]);
634 }
635
636 /**
637 * Inner class allowing the singleton instance of {@link EndOfSiding_step_3} to be created
638 * <b>not</b> at the class load time of the outer class,
639 * but rather at the first call to {@link EndOfSiding_step_3#instance()}.
640 *
641 * <p> This workaround is required e.g. to support recursion.
642 *
643 */
644 private static class LazyHolder {
645 private static final EndOfSiding_step_3 INSTANCE = new EndOfSiding_step_3();
646
647 /**
648 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
649 * This initialization order is required to support indirect recursion.
650 *
651 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
652 *
653 */
654 private static final Object STATIC_INITIALIZER = ensureInitialized();
655
656 public static Object ensureInitialized() {
657 INSTANCE.ensureInitializedInternal();
658 return null;
659 }
660 }
661
662 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
663 private static final EndOfSiding_step_3.GeneratedPQuery INSTANCE = new GeneratedPQuery();
664
665 private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT);
666
667 private final PParameter parameter_location = new PParameter("location", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
668
669 private final List<PParameter> parameters = Arrays.asList(parameter_train, parameter_location);
670
671 private GeneratedPQuery() {
672 super(PVisibility.PUBLIC);
673 }
674
675 @Override
676 public String getFullyQualifiedName() {
677 return "modes3.queries.endOfSiding_step_3";
678 }
679
680 @Override
681 public List<String> getParameterNames() {
682 return Arrays.asList("train","location");
683 }
684
685 @Override
686 public List<PParameter> getParameters() {
687 return parameters;
688 }
689
690 @Override
691 public Set<PBody> doGetContainedBodies() {
692 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
693 Set<PBody> bodies = new LinkedHashSet<>();
694 {
695 PBody body = new PBody(this);
696 PVariable var_train = body.getOrCreateVariableByName("train");
697 PVariable var_location = body.getOrCreateVariableByName("location");
698 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
699 new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
700 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
701 new ExportedParameter(body, var_train, parameter_train),
702 new ExportedParameter(body, var_location, parameter_location)
703 ));
704 // // int loop_bound1 = frame->location->connected_to_count;// for (int i1 = 0; i1 < loop_bound1; i1++) {// ...// } Train(train)
705 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
706 // Train.location(train, location)
707 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
708 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
709 new TypeConstraint(body, Tuples.flatTupleOf(var_train, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train", "location")));
710 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
711 new Equality(body, var__virtual_0_, var_location);
712 bodies.add(body);
713 }
714 return bodies;
715 }
716 }
717}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_4.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_4.java
new file mode 100644
index 00000000..73df8514
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_4.java
@@ -0,0 +1,847 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import modes3.Train;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
29import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
31import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
40import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
41
42/**
43 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
44 *
45 * <p>Original source:
46 * <code><pre>
47 * pattern endOfSiding_step_4(in train : Train, in location : Segment, in end : Segment) {
48 * // frame-{@literal >}end = frame-{@literal >}location-{@literal >}connected_to[i1];
49 * // if (frame-{@literal >}end != NULL &&
50 * // frame-{@literal >}end-{@literal >}connected_to[1] == frame-{@literal >}location &&
51 * // frame-{@literal >}end-{@literal >}connected_to[0] == NULL) {
52 * // ...
53 * // }
54 * // if (frame-{@literal >}end != NULL &&
55 * // frame-{@literal >}end-{@literal >}connected_to[0] == frame-{@literal >}location &&
56 * // frame-{@literal >}end-{@literal >}connected_to[1] == NULL) {
57 * // ...
58 * // }
59 * Train(train);
60 * Train.location(train, location);
61 * Segment.connectedTo(location, end);
62 * }
63 * </pre></code>
64 *
65 * @see Matcher
66 * @see Match
67 *
68 */
69@SuppressWarnings("all")
70public final class EndOfSiding_step_4 extends BaseGeneratedEMFQuerySpecification<EndOfSiding_step_4.Matcher> {
71 /**
72 * Pattern-specific match representation of the modes3.queries.endOfSiding_step_4 pattern,
73 * to be used in conjunction with {@link Matcher}.
74 *
75 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
76 * Each instance is a (possibly partial) substitution of pattern parameters,
77 * usable to represent a match of the pattern in the result of a query,
78 * or to specify the bound (fixed) input parameters when issuing a query.
79 *
80 * @see Matcher
81 *
82 */
83 public static abstract class Match extends BasePatternMatch {
84 private Train fTrain;
85
86 private Segment fLocation;
87
88 private Segment fEnd;
89
90 private static List<String> parameterNames = makeImmutableList("train", "location", "end");
91
92 private Match(final Train pTrain, final Segment pLocation, final Segment pEnd) {
93 this.fTrain = pTrain;
94 this.fLocation = pLocation;
95 this.fEnd = pEnd;
96 }
97
98 @Override
99 public Object get(final String parameterName) {
100 switch(parameterName) {
101 case "train": return this.fTrain;
102 case "location": return this.fLocation;
103 case "end": return this.fEnd;
104 default: return null;
105 }
106 }
107
108 @Override
109 public Object get(final int index) {
110 switch(index) {
111 case 0: return this.fTrain;
112 case 1: return this.fLocation;
113 case 2: return this.fEnd;
114 default: return null;
115 }
116 }
117
118 public Train getTrain() {
119 return this.fTrain;
120 }
121
122 public Segment getLocation() {
123 return this.fLocation;
124 }
125
126 public Segment getEnd() {
127 return this.fEnd;
128 }
129
130 @Override
131 public boolean set(final String parameterName, final Object newValue) {
132 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
133 if ("train".equals(parameterName) ) {
134 this.fTrain = (Train) newValue;
135 return true;
136 }
137 if ("location".equals(parameterName) ) {
138 this.fLocation = (Segment) newValue;
139 return true;
140 }
141 if ("end".equals(parameterName) ) {
142 this.fEnd = (Segment) newValue;
143 return true;
144 }
145 return false;
146 }
147
148 public void setTrain(final Train pTrain) {
149 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
150 this.fTrain = pTrain;
151 }
152
153 public void setLocation(final Segment pLocation) {
154 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
155 this.fLocation = pLocation;
156 }
157
158 public void setEnd(final Segment pEnd) {
159 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
160 this.fEnd = pEnd;
161 }
162
163 @Override
164 public String patternName() {
165 return "modes3.queries.endOfSiding_step_4";
166 }
167
168 @Override
169 public List<String> parameterNames() {
170 return EndOfSiding_step_4.Match.parameterNames;
171 }
172
173 @Override
174 public Object[] toArray() {
175 return new Object[]{fTrain, fLocation, fEnd};
176 }
177
178 @Override
179 public EndOfSiding_step_4.Match toImmutable() {
180 return isMutable() ? newMatch(fTrain, fLocation, fEnd) : this;
181 }
182
183 @Override
184 public String prettyPrint() {
185 StringBuilder result = new StringBuilder();
186 result.append("\"train\"=" + prettyPrintValue(fTrain) + ", ");
187 result.append("\"location\"=" + prettyPrintValue(fLocation) + ", ");
188 result.append("\"end\"=" + prettyPrintValue(fEnd));
189 return result.toString();
190 }
191
192 @Override
193 public int hashCode() {
194 return Objects.hash(fTrain, fLocation, fEnd);
195 }
196
197 @Override
198 public boolean equals(final Object obj) {
199 if (this == obj)
200 return true;
201 if (obj == null) {
202 return false;
203 }
204 if ((obj instanceof EndOfSiding_step_4.Match)) {
205 EndOfSiding_step_4.Match other = (EndOfSiding_step_4.Match) obj;
206 return Objects.equals(fTrain, other.fTrain) && Objects.equals(fLocation, other.fLocation) && Objects.equals(fEnd, other.fEnd);
207 } else {
208 // this should be infrequent
209 if (!(obj instanceof IPatternMatch)) {
210 return false;
211 }
212 IPatternMatch otherSig = (IPatternMatch) obj;
213 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
214 }
215 }
216
217 @Override
218 public EndOfSiding_step_4 specification() {
219 return EndOfSiding_step_4.instance();
220 }
221
222 /**
223 * Returns an empty, mutable match.
224 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
225 *
226 * @return the empty match.
227 *
228 */
229 public static EndOfSiding_step_4.Match newEmptyMatch() {
230 return new Mutable(null, null, null);
231 }
232
233 /**
234 * Returns a mutable (partial) match.
235 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
236 *
237 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
238 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
239 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
240 * @return the new, mutable (partial) match object.
241 *
242 */
243 public static EndOfSiding_step_4.Match newMutableMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) {
244 return new Mutable(pTrain, pLocation, pEnd);
245 }
246
247 /**
248 * Returns a new (partial) match.
249 * This can be used e.g. to call the matcher with a partial match.
250 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
251 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
252 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
253 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
254 * @return the (partial) match object.
255 *
256 */
257 public static EndOfSiding_step_4.Match newMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) {
258 return new Immutable(pTrain, pLocation, pEnd);
259 }
260
261 private static final class Mutable extends EndOfSiding_step_4.Match {
262 Mutable(final Train pTrain, final Segment pLocation, final Segment pEnd) {
263 super(pTrain, pLocation, pEnd);
264 }
265
266 @Override
267 public boolean isMutable() {
268 return true;
269 }
270 }
271
272 private static final class Immutable extends EndOfSiding_step_4.Match {
273 Immutable(final Train pTrain, final Segment pLocation, final Segment pEnd) {
274 super(pTrain, pLocation, pEnd);
275 }
276
277 @Override
278 public boolean isMutable() {
279 return false;
280 }
281 }
282 }
283
284 /**
285 * Generated pattern matcher API of the modes3.queries.endOfSiding_step_4 pattern,
286 * providing pattern-specific query methods.
287 *
288 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
289 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
290 *
291 * <p>Matches of the pattern will be represented as {@link Match}.
292 *
293 * <p>Original source:
294 * <code><pre>
295 * pattern endOfSiding_step_4(in train : Train, in location : Segment, in end : Segment) {
296 * // frame-{@literal >}end = frame-{@literal >}location-{@literal >}connected_to[i1];
297 * // if (frame-{@literal >}end != NULL &&
298 * // frame-{@literal >}end-{@literal >}connected_to[1] == frame-{@literal >}location &&
299 * // frame-{@literal >}end-{@literal >}connected_to[0] == NULL) {
300 * // ...
301 * // }
302 * // if (frame-{@literal >}end != NULL &&
303 * // frame-{@literal >}end-{@literal >}connected_to[0] == frame-{@literal >}location &&
304 * // frame-{@literal >}end-{@literal >}connected_to[1] == NULL) {
305 * // ...
306 * // }
307 * Train(train);
308 * Train.location(train, location);
309 * Segment.connectedTo(location, end);
310 * }
311 * </pre></code>
312 *
313 * @see Match
314 * @see EndOfSiding_step_4
315 *
316 */
317 public static class Matcher extends BaseMatcher<EndOfSiding_step_4.Match> {
318 /**
319 * Initializes the pattern matcher within an existing VIATRA Query engine.
320 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
321 *
322 * @param engine the existing VIATRA Query engine in which this matcher will be created.
323 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
324 *
325 */
326 public static EndOfSiding_step_4.Matcher on(final ViatraQueryEngine engine) {
327 // check if matcher already exists
328 Matcher matcher = engine.getExistingMatcher(querySpecification());
329 if (matcher == null) {
330 matcher = (Matcher)engine.getMatcher(querySpecification());
331 }
332 return matcher;
333 }
334
335 /**
336 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
337 * @return an initialized matcher
338 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
339 *
340 */
341 public static EndOfSiding_step_4.Matcher create() {
342 return new Matcher();
343 }
344
345 private static final int POSITION_TRAIN = 0;
346
347 private static final int POSITION_LOCATION = 1;
348
349 private static final int POSITION_END = 2;
350
351 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(EndOfSiding_step_4.Matcher.class);
352
353 /**
354 * Initializes the pattern matcher within an existing VIATRA Query engine.
355 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
356 *
357 * @param engine the existing VIATRA Query engine in which this matcher will be created.
358 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
359 *
360 */
361 private Matcher() {
362 super(querySpecification());
363 }
364
365 /**
366 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
367 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
368 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
369 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
370 * @return matches represented as a Match object.
371 *
372 */
373 public Collection<EndOfSiding_step_4.Match> getAllMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) {
374 return rawStreamAllMatches(new Object[]{pTrain, pLocation, pEnd}).collect(Collectors.toSet());
375 }
376
377 /**
378 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
379 * </p>
380 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
381 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
382 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
383 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
384 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
385 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
386 * @return a stream of matches represented as a Match object.
387 *
388 */
389 public Stream<EndOfSiding_step_4.Match> streamAllMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) {
390 return rawStreamAllMatches(new Object[]{pTrain, pLocation, pEnd});
391 }
392
393 /**
394 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
395 * Neither determinism nor randomness of selection is guaranteed.
396 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
397 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
398 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
399 * @return a match represented as a Match object, or null if no match is found.
400 *
401 */
402 public Optional<EndOfSiding_step_4.Match> getOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) {
403 return rawGetOneArbitraryMatch(new Object[]{pTrain, pLocation, pEnd});
404 }
405
406 /**
407 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
408 * under any possible substitution of the unspecified parameters (if any).
409 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
410 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
411 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
412 * @return true if the input is a valid (partial) match of the pattern.
413 *
414 */
415 public boolean hasMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) {
416 return rawHasMatch(new Object[]{pTrain, pLocation, pEnd});
417 }
418
419 /**
420 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
421 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
422 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
423 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
424 * @return the number of pattern matches found.
425 *
426 */
427 public int countMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) {
428 return rawCountMatches(new Object[]{pTrain, pLocation, pEnd});
429 }
430
431 /**
432 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
433 * Neither determinism nor randomness of selection is guaranteed.
434 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
435 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
436 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
437 * @param processor the action that will process the selected match.
438 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
439 *
440 */
441 public boolean forOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Segment pEnd, final Consumer<? super EndOfSiding_step_4.Match> processor) {
442 return rawForOneArbitraryMatch(new Object[]{pTrain, pLocation, pEnd}, processor);
443 }
444
445 /**
446 * Returns a new (partial) match.
447 * This can be used e.g. to call the matcher with a partial match.
448 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
449 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
450 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
451 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
452 * @return the (partial) match object.
453 *
454 */
455 public EndOfSiding_step_4.Match newMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) {
456 return EndOfSiding_step_4.Match.newMatch(pTrain, pLocation, pEnd);
457 }
458
459 /**
460 * Retrieve the set of values that occur in matches for train.
461 * @return the Set of all values or empty set if there are no matches
462 *
463 */
464 protected Stream<Train> rawStreamAllValuesOftrain(final Object[] parameters) {
465 return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast);
466 }
467
468 /**
469 * Retrieve the set of values that occur in matches for train.
470 * @return the Set of all values or empty set if there are no matches
471 *
472 */
473 public Set<Train> getAllValuesOftrain() {
474 return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet());
475 }
476
477 /**
478 * Retrieve the set of values that occur in matches for train.
479 * @return the Set of all values or empty set if there are no matches
480 *
481 */
482 public Stream<Train> streamAllValuesOftrain() {
483 return rawStreamAllValuesOftrain(emptyArray());
484 }
485
486 /**
487 * Retrieve the set of values that occur in matches for train.
488 * </p>
489 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
490 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
491 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
492 *
493 * @return the Stream of all values or empty set if there are no matches
494 *
495 */
496 public Stream<Train> streamAllValuesOftrain(final EndOfSiding_step_4.Match partialMatch) {
497 return rawStreamAllValuesOftrain(partialMatch.toArray());
498 }
499
500 /**
501 * Retrieve the set of values that occur in matches for train.
502 * </p>
503 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
504 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
505 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
506 *
507 * @return the Stream of all values or empty set if there are no matches
508 *
509 */
510 public Stream<Train> streamAllValuesOftrain(final Segment pLocation, final Segment pEnd) {
511 return rawStreamAllValuesOftrain(new Object[]{null, pLocation, pEnd});
512 }
513
514 /**
515 * Retrieve the set of values that occur in matches for train.
516 * @return the Set of all values or empty set if there are no matches
517 *
518 */
519 public Set<Train> getAllValuesOftrain(final EndOfSiding_step_4.Match partialMatch) {
520 return rawStreamAllValuesOftrain(partialMatch.toArray()).collect(Collectors.toSet());
521 }
522
523 /**
524 * Retrieve the set of values that occur in matches for train.
525 * @return the Set of all values or empty set if there are no matches
526 *
527 */
528 public Set<Train> getAllValuesOftrain(final Segment pLocation, final Segment pEnd) {
529 return rawStreamAllValuesOftrain(new Object[]{null, pLocation, pEnd}).collect(Collectors.toSet());
530 }
531
532 /**
533 * Retrieve the set of values that occur in matches for location.
534 * @return the Set of all values or empty set if there are no matches
535 *
536 */
537 protected Stream<Segment> rawStreamAllValuesOflocation(final Object[] parameters) {
538 return rawStreamAllValues(POSITION_LOCATION, parameters).map(Segment.class::cast);
539 }
540
541 /**
542 * Retrieve the set of values that occur in matches for location.
543 * @return the Set of all values or empty set if there are no matches
544 *
545 */
546 public Set<Segment> getAllValuesOflocation() {
547 return rawStreamAllValuesOflocation(emptyArray()).collect(Collectors.toSet());
548 }
549
550 /**
551 * Retrieve the set of values that occur in matches for location.
552 * @return the Set of all values or empty set if there are no matches
553 *
554 */
555 public Stream<Segment> streamAllValuesOflocation() {
556 return rawStreamAllValuesOflocation(emptyArray());
557 }
558
559 /**
560 * Retrieve the set of values that occur in matches for location.
561 * </p>
562 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
563 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
564 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
565 *
566 * @return the Stream of all values or empty set if there are no matches
567 *
568 */
569 public Stream<Segment> streamAllValuesOflocation(final EndOfSiding_step_4.Match partialMatch) {
570 return rawStreamAllValuesOflocation(partialMatch.toArray());
571 }
572
573 /**
574 * Retrieve the set of values that occur in matches for location.
575 * </p>
576 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
577 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
578 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
579 *
580 * @return the Stream of all values or empty set if there are no matches
581 *
582 */
583 public Stream<Segment> streamAllValuesOflocation(final Train pTrain, final Segment pEnd) {
584 return rawStreamAllValuesOflocation(new Object[]{pTrain, null, pEnd});
585 }
586
587 /**
588 * Retrieve the set of values that occur in matches for location.
589 * @return the Set of all values or empty set if there are no matches
590 *
591 */
592 public Set<Segment> getAllValuesOflocation(final EndOfSiding_step_4.Match partialMatch) {
593 return rawStreamAllValuesOflocation(partialMatch.toArray()).collect(Collectors.toSet());
594 }
595
596 /**
597 * Retrieve the set of values that occur in matches for location.
598 * @return the Set of all values or empty set if there are no matches
599 *
600 */
601 public Set<Segment> getAllValuesOflocation(final Train pTrain, final Segment pEnd) {
602 return rawStreamAllValuesOflocation(new Object[]{pTrain, null, pEnd}).collect(Collectors.toSet());
603 }
604
605 /**
606 * Retrieve the set of values that occur in matches for end.
607 * @return the Set of all values or empty set if there are no matches
608 *
609 */
610 protected Stream<Segment> rawStreamAllValuesOfend(final Object[] parameters) {
611 return rawStreamAllValues(POSITION_END, parameters).map(Segment.class::cast);
612 }
613
614 /**
615 * Retrieve the set of values that occur in matches for end.
616 * @return the Set of all values or empty set if there are no matches
617 *
618 */
619 public Set<Segment> getAllValuesOfend() {
620 return rawStreamAllValuesOfend(emptyArray()).collect(Collectors.toSet());
621 }
622
623 /**
624 * Retrieve the set of values that occur in matches for end.
625 * @return the Set of all values or empty set if there are no matches
626 *
627 */
628 public Stream<Segment> streamAllValuesOfend() {
629 return rawStreamAllValuesOfend(emptyArray());
630 }
631
632 /**
633 * Retrieve the set of values that occur in matches for end.
634 * </p>
635 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
636 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
637 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
638 *
639 * @return the Stream of all values or empty set if there are no matches
640 *
641 */
642 public Stream<Segment> streamAllValuesOfend(final EndOfSiding_step_4.Match partialMatch) {
643 return rawStreamAllValuesOfend(partialMatch.toArray());
644 }
645
646 /**
647 * Retrieve the set of values that occur in matches for end.
648 * </p>
649 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
650 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
651 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
652 *
653 * @return the Stream of all values or empty set if there are no matches
654 *
655 */
656 public Stream<Segment> streamAllValuesOfend(final Train pTrain, final Segment pLocation) {
657 return rawStreamAllValuesOfend(new Object[]{pTrain, pLocation, null});
658 }
659
660 /**
661 * Retrieve the set of values that occur in matches for end.
662 * @return the Set of all values or empty set if there are no matches
663 *
664 */
665 public Set<Segment> getAllValuesOfend(final EndOfSiding_step_4.Match partialMatch) {
666 return rawStreamAllValuesOfend(partialMatch.toArray()).collect(Collectors.toSet());
667 }
668
669 /**
670 * Retrieve the set of values that occur in matches for end.
671 * @return the Set of all values or empty set if there are no matches
672 *
673 */
674 public Set<Segment> getAllValuesOfend(final Train pTrain, final Segment pLocation) {
675 return rawStreamAllValuesOfend(new Object[]{pTrain, pLocation, null}).collect(Collectors.toSet());
676 }
677
678 @Override
679 protected EndOfSiding_step_4.Match tupleToMatch(final Tuple t) {
680 try {
681 return EndOfSiding_step_4.Match.newMatch((Train) t.get(POSITION_TRAIN), (Segment) t.get(POSITION_LOCATION), (Segment) t.get(POSITION_END));
682 } catch(ClassCastException e) {
683 LOGGER.error("Element(s) in tuple not properly typed!",e);
684 return null;
685 }
686 }
687
688 @Override
689 protected EndOfSiding_step_4.Match arrayToMatch(final Object[] match) {
690 try {
691 return EndOfSiding_step_4.Match.newMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION], (Segment) match[POSITION_END]);
692 } catch(ClassCastException e) {
693 LOGGER.error("Element(s) in array not properly typed!",e);
694 return null;
695 }
696 }
697
698 @Override
699 protected EndOfSiding_step_4.Match arrayToMatchMutable(final Object[] match) {
700 try {
701 return EndOfSiding_step_4.Match.newMutableMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION], (Segment) match[POSITION_END]);
702 } catch(ClassCastException e) {
703 LOGGER.error("Element(s) in array not properly typed!",e);
704 return null;
705 }
706 }
707
708 /**
709 * @return the singleton instance of the query specification of this pattern
710 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
711 *
712 */
713 public static IQuerySpecification<EndOfSiding_step_4.Matcher> querySpecification() {
714 return EndOfSiding_step_4.instance();
715 }
716 }
717
718 private EndOfSiding_step_4() {
719 super(GeneratedPQuery.INSTANCE);
720 }
721
722 /**
723 * @return the singleton instance of the query specification
724 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
725 *
726 */
727 public static EndOfSiding_step_4 instance() {
728 try{
729 return LazyHolder.INSTANCE;
730 } catch (ExceptionInInitializerError err) {
731 throw processInitializerError(err);
732 }
733 }
734
735 @Override
736 protected EndOfSiding_step_4.Matcher instantiate(final ViatraQueryEngine engine) {
737 return EndOfSiding_step_4.Matcher.on(engine);
738 }
739
740 @Override
741 public EndOfSiding_step_4.Matcher instantiate() {
742 return EndOfSiding_step_4.Matcher.create();
743 }
744
745 @Override
746 public EndOfSiding_step_4.Match newEmptyMatch() {
747 return EndOfSiding_step_4.Match.newEmptyMatch();
748 }
749
750 @Override
751 public EndOfSiding_step_4.Match newMatch(final Object... parameters) {
752 return EndOfSiding_step_4.Match.newMatch((modes3.Train) parameters[0], (modes3.Segment) parameters[1], (modes3.Segment) parameters[2]);
753 }
754
755 /**
756 * Inner class allowing the singleton instance of {@link EndOfSiding_step_4} to be created
757 * <b>not</b> at the class load time of the outer class,
758 * but rather at the first call to {@link EndOfSiding_step_4#instance()}.
759 *
760 * <p> This workaround is required e.g. to support recursion.
761 *
762 */
763 private static class LazyHolder {
764 private static final EndOfSiding_step_4 INSTANCE = new EndOfSiding_step_4();
765
766 /**
767 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
768 * This initialization order is required to support indirect recursion.
769 *
770 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
771 *
772 */
773 private static final Object STATIC_INITIALIZER = ensureInitialized();
774
775 public static Object ensureInitialized() {
776 INSTANCE.ensureInitializedInternal();
777 return null;
778 }
779 }
780
781 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
782 private static final EndOfSiding_step_4.GeneratedPQuery INSTANCE = new GeneratedPQuery();
783
784 private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT);
785
786 private final PParameter parameter_location = new PParameter("location", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
787
788 private final PParameter parameter_end = new PParameter("end", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
789
790 private final List<PParameter> parameters = Arrays.asList(parameter_train, parameter_location, parameter_end);
791
792 private GeneratedPQuery() {
793 super(PVisibility.PUBLIC);
794 }
795
796 @Override
797 public String getFullyQualifiedName() {
798 return "modes3.queries.endOfSiding_step_4";
799 }
800
801 @Override
802 public List<String> getParameterNames() {
803 return Arrays.asList("train","location","end");
804 }
805
806 @Override
807 public List<PParameter> getParameters() {
808 return parameters;
809 }
810
811 @Override
812 public Set<PBody> doGetContainedBodies() {
813 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
814 Set<PBody> bodies = new LinkedHashSet<>();
815 {
816 PBody body = new PBody(this);
817 PVariable var_train = body.getOrCreateVariableByName("train");
818 PVariable var_location = body.getOrCreateVariableByName("location");
819 PVariable var_end = body.getOrCreateVariableByName("end");
820 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
821 new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
822 new TypeConstraint(body, Tuples.flatTupleOf(var_end), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
823 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
824 new ExportedParameter(body, var_train, parameter_train),
825 new ExportedParameter(body, var_location, parameter_location),
826 new ExportedParameter(body, var_end, parameter_end)
827 ));
828 // // frame->end = frame->location->connected_to[i1];// if (frame->end != NULL &&// frame->end->connected_to[1] == frame->location &&// frame->end->connected_to[0] == NULL) {// ...// } // if (frame->end != NULL &&// frame->end->connected_to[0] == frame->location &&// frame->end->connected_to[1] == NULL) {// ...// } Train(train)
829 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
830 // Train.location(train, location)
831 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
832 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
833 new TypeConstraint(body, Tuples.flatTupleOf(var_train, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train", "location")));
834 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
835 new Equality(body, var__virtual_0_, var_location);
836 // Segment.connectedTo(location, end)
837 new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
838 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
839 new TypeConstraint(body, Tuples.flatTupleOf(var_location, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo")));
840 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
841 new Equality(body, var__virtual_1_, var_end);
842 bodies.add(body);
843 }
844 return bodies;
845 }
846 }
847}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_5.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_5.java
new file mode 100644
index 00000000..48a2697d
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/EndOfSiding_step_5.java
@@ -0,0 +1,841 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import modes3.Train;
18import modes3.queries.MultipleConnectedTo;
19import org.apache.log4j.Logger;
20import org.eclipse.emf.ecore.EClass;
21import org.eclipse.viatra.query.runtime.api.IPatternMatch;
22import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
23import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
25import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
26import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
27import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
28import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
29import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
30import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
31import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
32import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
39import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
41import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
42import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
43
44/**
45 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
46 *
47 * <p>Original source:
48 * <code><pre>
49 * pattern endOfSiding_step_5(in train : Train, in location : Segment, in end : Segment) {
50 * // results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
51 * // results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
52 * // ...OR...
53 * // results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
54 * // results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
55 * Train(train);
56 * Train.location(train, location);
57 * Segment.connectedTo(location, end);
58 * neg find multipleConnectedTo(end);
59 * }
60 * </pre></code>
61 *
62 * @see Matcher
63 * @see Match
64 *
65 */
66@SuppressWarnings("all")
67public final class EndOfSiding_step_5 extends BaseGeneratedEMFQuerySpecification<EndOfSiding_step_5.Matcher> {
68 /**
69 * Pattern-specific match representation of the modes3.queries.endOfSiding_step_5 pattern,
70 * to be used in conjunction with {@link Matcher}.
71 *
72 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
73 * Each instance is a (possibly partial) substitution of pattern parameters,
74 * usable to represent a match of the pattern in the result of a query,
75 * or to specify the bound (fixed) input parameters when issuing a query.
76 *
77 * @see Matcher
78 *
79 */
80 public static abstract class Match extends BasePatternMatch {
81 private Train fTrain;
82
83 private Segment fLocation;
84
85 private Segment fEnd;
86
87 private static List<String> parameterNames = makeImmutableList("train", "location", "end");
88
89 private Match(final Train pTrain, final Segment pLocation, final Segment pEnd) {
90 this.fTrain = pTrain;
91 this.fLocation = pLocation;
92 this.fEnd = pEnd;
93 }
94
95 @Override
96 public Object get(final String parameterName) {
97 switch(parameterName) {
98 case "train": return this.fTrain;
99 case "location": return this.fLocation;
100 case "end": return this.fEnd;
101 default: return null;
102 }
103 }
104
105 @Override
106 public Object get(final int index) {
107 switch(index) {
108 case 0: return this.fTrain;
109 case 1: return this.fLocation;
110 case 2: return this.fEnd;
111 default: return null;
112 }
113 }
114
115 public Train getTrain() {
116 return this.fTrain;
117 }
118
119 public Segment getLocation() {
120 return this.fLocation;
121 }
122
123 public Segment getEnd() {
124 return this.fEnd;
125 }
126
127 @Override
128 public boolean set(final String parameterName, final Object newValue) {
129 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
130 if ("train".equals(parameterName) ) {
131 this.fTrain = (Train) newValue;
132 return true;
133 }
134 if ("location".equals(parameterName) ) {
135 this.fLocation = (Segment) newValue;
136 return true;
137 }
138 if ("end".equals(parameterName) ) {
139 this.fEnd = (Segment) newValue;
140 return true;
141 }
142 return false;
143 }
144
145 public void setTrain(final Train pTrain) {
146 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
147 this.fTrain = pTrain;
148 }
149
150 public void setLocation(final Segment pLocation) {
151 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
152 this.fLocation = pLocation;
153 }
154
155 public void setEnd(final Segment pEnd) {
156 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
157 this.fEnd = pEnd;
158 }
159
160 @Override
161 public String patternName() {
162 return "modes3.queries.endOfSiding_step_5";
163 }
164
165 @Override
166 public List<String> parameterNames() {
167 return EndOfSiding_step_5.Match.parameterNames;
168 }
169
170 @Override
171 public Object[] toArray() {
172 return new Object[]{fTrain, fLocation, fEnd};
173 }
174
175 @Override
176 public EndOfSiding_step_5.Match toImmutable() {
177 return isMutable() ? newMatch(fTrain, fLocation, fEnd) : this;
178 }
179
180 @Override
181 public String prettyPrint() {
182 StringBuilder result = new StringBuilder();
183 result.append("\"train\"=" + prettyPrintValue(fTrain) + ", ");
184 result.append("\"location\"=" + prettyPrintValue(fLocation) + ", ");
185 result.append("\"end\"=" + prettyPrintValue(fEnd));
186 return result.toString();
187 }
188
189 @Override
190 public int hashCode() {
191 return Objects.hash(fTrain, fLocation, fEnd);
192 }
193
194 @Override
195 public boolean equals(final Object obj) {
196 if (this == obj)
197 return true;
198 if (obj == null) {
199 return false;
200 }
201 if ((obj instanceof EndOfSiding_step_5.Match)) {
202 EndOfSiding_step_5.Match other = (EndOfSiding_step_5.Match) obj;
203 return Objects.equals(fTrain, other.fTrain) && Objects.equals(fLocation, other.fLocation) && Objects.equals(fEnd, other.fEnd);
204 } else {
205 // this should be infrequent
206 if (!(obj instanceof IPatternMatch)) {
207 return false;
208 }
209 IPatternMatch otherSig = (IPatternMatch) obj;
210 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
211 }
212 }
213
214 @Override
215 public EndOfSiding_step_5 specification() {
216 return EndOfSiding_step_5.instance();
217 }
218
219 /**
220 * Returns an empty, mutable match.
221 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
222 *
223 * @return the empty match.
224 *
225 */
226 public static EndOfSiding_step_5.Match newEmptyMatch() {
227 return new Mutable(null, null, null);
228 }
229
230 /**
231 * Returns a mutable (partial) match.
232 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
233 *
234 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
235 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
236 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
237 * @return the new, mutable (partial) match object.
238 *
239 */
240 public static EndOfSiding_step_5.Match newMutableMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) {
241 return new Mutable(pTrain, pLocation, pEnd);
242 }
243
244 /**
245 * Returns a new (partial) match.
246 * This can be used e.g. to call the matcher with a partial match.
247 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
248 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
249 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
250 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
251 * @return the (partial) match object.
252 *
253 */
254 public static EndOfSiding_step_5.Match newMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) {
255 return new Immutable(pTrain, pLocation, pEnd);
256 }
257
258 private static final class Mutable extends EndOfSiding_step_5.Match {
259 Mutable(final Train pTrain, final Segment pLocation, final Segment pEnd) {
260 super(pTrain, pLocation, pEnd);
261 }
262
263 @Override
264 public boolean isMutable() {
265 return true;
266 }
267 }
268
269 private static final class Immutable extends EndOfSiding_step_5.Match {
270 Immutable(final Train pTrain, final Segment pLocation, final Segment pEnd) {
271 super(pTrain, pLocation, pEnd);
272 }
273
274 @Override
275 public boolean isMutable() {
276 return false;
277 }
278 }
279 }
280
281 /**
282 * Generated pattern matcher API of the modes3.queries.endOfSiding_step_5 pattern,
283 * providing pattern-specific query methods.
284 *
285 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
286 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
287 *
288 * <p>Matches of the pattern will be represented as {@link Match}.
289 *
290 * <p>Original source:
291 * <code><pre>
292 * pattern endOfSiding_step_5(in train : Train, in location : Segment, in end : Segment) {
293 * // results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
294 * // results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
295 * // ...OR...
296 * // results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
297 * // results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
298 * Train(train);
299 * Train.location(train, location);
300 * Segment.connectedTo(location, end);
301 * neg find multipleConnectedTo(end);
302 * }
303 * </pre></code>
304 *
305 * @see Match
306 * @see EndOfSiding_step_5
307 *
308 */
309 public static class Matcher extends BaseMatcher<EndOfSiding_step_5.Match> {
310 /**
311 * Initializes the pattern matcher within an existing VIATRA Query engine.
312 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
313 *
314 * @param engine the existing VIATRA Query engine in which this matcher will be created.
315 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
316 *
317 */
318 public static EndOfSiding_step_5.Matcher on(final ViatraQueryEngine engine) {
319 // check if matcher already exists
320 Matcher matcher = engine.getExistingMatcher(querySpecification());
321 if (matcher == null) {
322 matcher = (Matcher)engine.getMatcher(querySpecification());
323 }
324 return matcher;
325 }
326
327 /**
328 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
329 * @return an initialized matcher
330 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
331 *
332 */
333 public static EndOfSiding_step_5.Matcher create() {
334 return new Matcher();
335 }
336
337 private static final int POSITION_TRAIN = 0;
338
339 private static final int POSITION_LOCATION = 1;
340
341 private static final int POSITION_END = 2;
342
343 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(EndOfSiding_step_5.Matcher.class);
344
345 /**
346 * Initializes the pattern matcher within an existing VIATRA Query engine.
347 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
348 *
349 * @param engine the existing VIATRA Query engine in which this matcher will be created.
350 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
351 *
352 */
353 private Matcher() {
354 super(querySpecification());
355 }
356
357 /**
358 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
359 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
360 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
361 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
362 * @return matches represented as a Match object.
363 *
364 */
365 public Collection<EndOfSiding_step_5.Match> getAllMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) {
366 return rawStreamAllMatches(new Object[]{pTrain, pLocation, pEnd}).collect(Collectors.toSet());
367 }
368
369 /**
370 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
371 * </p>
372 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
373 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
374 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
375 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
376 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
377 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
378 * @return a stream of matches represented as a Match object.
379 *
380 */
381 public Stream<EndOfSiding_step_5.Match> streamAllMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) {
382 return rawStreamAllMatches(new Object[]{pTrain, pLocation, pEnd});
383 }
384
385 /**
386 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
387 * Neither determinism nor randomness of selection is guaranteed.
388 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
389 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
390 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
391 * @return a match represented as a Match object, or null if no match is found.
392 *
393 */
394 public Optional<EndOfSiding_step_5.Match> getOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) {
395 return rawGetOneArbitraryMatch(new Object[]{pTrain, pLocation, pEnd});
396 }
397
398 /**
399 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
400 * under any possible substitution of the unspecified parameters (if any).
401 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
402 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
403 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
404 * @return true if the input is a valid (partial) match of the pattern.
405 *
406 */
407 public boolean hasMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) {
408 return rawHasMatch(new Object[]{pTrain, pLocation, pEnd});
409 }
410
411 /**
412 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
413 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
414 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
415 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
416 * @return the number of pattern matches found.
417 *
418 */
419 public int countMatches(final Train pTrain, final Segment pLocation, final Segment pEnd) {
420 return rawCountMatches(new Object[]{pTrain, pLocation, pEnd});
421 }
422
423 /**
424 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
425 * Neither determinism nor randomness of selection is guaranteed.
426 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
427 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
428 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
429 * @param processor the action that will process the selected match.
430 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
431 *
432 */
433 public boolean forOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Segment pEnd, final Consumer<? super EndOfSiding_step_5.Match> processor) {
434 return rawForOneArbitraryMatch(new Object[]{pTrain, pLocation, pEnd}, processor);
435 }
436
437 /**
438 * Returns a new (partial) match.
439 * This can be used e.g. to call the matcher with a partial match.
440 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
441 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
442 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
443 * @param pEnd the fixed value of pattern parameter end, or null if not bound.
444 * @return the (partial) match object.
445 *
446 */
447 public EndOfSiding_step_5.Match newMatch(final Train pTrain, final Segment pLocation, final Segment pEnd) {
448 return EndOfSiding_step_5.Match.newMatch(pTrain, pLocation, pEnd);
449 }
450
451 /**
452 * Retrieve the set of values that occur in matches for train.
453 * @return the Set of all values or empty set if there are no matches
454 *
455 */
456 protected Stream<Train> rawStreamAllValuesOftrain(final Object[] parameters) {
457 return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast);
458 }
459
460 /**
461 * Retrieve the set of values that occur in matches for train.
462 * @return the Set of all values or empty set if there are no matches
463 *
464 */
465 public Set<Train> getAllValuesOftrain() {
466 return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet());
467 }
468
469 /**
470 * Retrieve the set of values that occur in matches for train.
471 * @return the Set of all values or empty set if there are no matches
472 *
473 */
474 public Stream<Train> streamAllValuesOftrain() {
475 return rawStreamAllValuesOftrain(emptyArray());
476 }
477
478 /**
479 * Retrieve the set of values that occur in matches for train.
480 * </p>
481 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
482 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
483 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
484 *
485 * @return the Stream of all values or empty set if there are no matches
486 *
487 */
488 public Stream<Train> streamAllValuesOftrain(final EndOfSiding_step_5.Match partialMatch) {
489 return rawStreamAllValuesOftrain(partialMatch.toArray());
490 }
491
492 /**
493 * Retrieve the set of values that occur in matches for train.
494 * </p>
495 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
496 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
497 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
498 *
499 * @return the Stream of all values or empty set if there are no matches
500 *
501 */
502 public Stream<Train> streamAllValuesOftrain(final Segment pLocation, final Segment pEnd) {
503 return rawStreamAllValuesOftrain(new Object[]{null, pLocation, pEnd});
504 }
505
506 /**
507 * Retrieve the set of values that occur in matches for train.
508 * @return the Set of all values or empty set if there are no matches
509 *
510 */
511 public Set<Train> getAllValuesOftrain(final EndOfSiding_step_5.Match partialMatch) {
512 return rawStreamAllValuesOftrain(partialMatch.toArray()).collect(Collectors.toSet());
513 }
514
515 /**
516 * Retrieve the set of values that occur in matches for train.
517 * @return the Set of all values or empty set if there are no matches
518 *
519 */
520 public Set<Train> getAllValuesOftrain(final Segment pLocation, final Segment pEnd) {
521 return rawStreamAllValuesOftrain(new Object[]{null, pLocation, pEnd}).collect(Collectors.toSet());
522 }
523
524 /**
525 * Retrieve the set of values that occur in matches for location.
526 * @return the Set of all values or empty set if there are no matches
527 *
528 */
529 protected Stream<Segment> rawStreamAllValuesOflocation(final Object[] parameters) {
530 return rawStreamAllValues(POSITION_LOCATION, parameters).map(Segment.class::cast);
531 }
532
533 /**
534 * Retrieve the set of values that occur in matches for location.
535 * @return the Set of all values or empty set if there are no matches
536 *
537 */
538 public Set<Segment> getAllValuesOflocation() {
539 return rawStreamAllValuesOflocation(emptyArray()).collect(Collectors.toSet());
540 }
541
542 /**
543 * Retrieve the set of values that occur in matches for location.
544 * @return the Set of all values or empty set if there are no matches
545 *
546 */
547 public Stream<Segment> streamAllValuesOflocation() {
548 return rawStreamAllValuesOflocation(emptyArray());
549 }
550
551 /**
552 * Retrieve the set of values that occur in matches for location.
553 * </p>
554 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
555 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
556 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
557 *
558 * @return the Stream of all values or empty set if there are no matches
559 *
560 */
561 public Stream<Segment> streamAllValuesOflocation(final EndOfSiding_step_5.Match partialMatch) {
562 return rawStreamAllValuesOflocation(partialMatch.toArray());
563 }
564
565 /**
566 * Retrieve the set of values that occur in matches for location.
567 * </p>
568 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
569 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
570 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
571 *
572 * @return the Stream of all values or empty set if there are no matches
573 *
574 */
575 public Stream<Segment> streamAllValuesOflocation(final Train pTrain, final Segment pEnd) {
576 return rawStreamAllValuesOflocation(new Object[]{pTrain, null, pEnd});
577 }
578
579 /**
580 * Retrieve the set of values that occur in matches for location.
581 * @return the Set of all values or empty set if there are no matches
582 *
583 */
584 public Set<Segment> getAllValuesOflocation(final EndOfSiding_step_5.Match partialMatch) {
585 return rawStreamAllValuesOflocation(partialMatch.toArray()).collect(Collectors.toSet());
586 }
587
588 /**
589 * Retrieve the set of values that occur in matches for location.
590 * @return the Set of all values or empty set if there are no matches
591 *
592 */
593 public Set<Segment> getAllValuesOflocation(final Train pTrain, final Segment pEnd) {
594 return rawStreamAllValuesOflocation(new Object[]{pTrain, null, pEnd}).collect(Collectors.toSet());
595 }
596
597 /**
598 * Retrieve the set of values that occur in matches for end.
599 * @return the Set of all values or empty set if there are no matches
600 *
601 */
602 protected Stream<Segment> rawStreamAllValuesOfend(final Object[] parameters) {
603 return rawStreamAllValues(POSITION_END, parameters).map(Segment.class::cast);
604 }
605
606 /**
607 * Retrieve the set of values that occur in matches for end.
608 * @return the Set of all values or empty set if there are no matches
609 *
610 */
611 public Set<Segment> getAllValuesOfend() {
612 return rawStreamAllValuesOfend(emptyArray()).collect(Collectors.toSet());
613 }
614
615 /**
616 * Retrieve the set of values that occur in matches for end.
617 * @return the Set of all values or empty set if there are no matches
618 *
619 */
620 public Stream<Segment> streamAllValuesOfend() {
621 return rawStreamAllValuesOfend(emptyArray());
622 }
623
624 /**
625 * Retrieve the set of values that occur in matches for end.
626 * </p>
627 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
628 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
629 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
630 *
631 * @return the Stream of all values or empty set if there are no matches
632 *
633 */
634 public Stream<Segment> streamAllValuesOfend(final EndOfSiding_step_5.Match partialMatch) {
635 return rawStreamAllValuesOfend(partialMatch.toArray());
636 }
637
638 /**
639 * Retrieve the set of values that occur in matches for end.
640 * </p>
641 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
642 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
643 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
644 *
645 * @return the Stream of all values or empty set if there are no matches
646 *
647 */
648 public Stream<Segment> streamAllValuesOfend(final Train pTrain, final Segment pLocation) {
649 return rawStreamAllValuesOfend(new Object[]{pTrain, pLocation, null});
650 }
651
652 /**
653 * Retrieve the set of values that occur in matches for end.
654 * @return the Set of all values or empty set if there are no matches
655 *
656 */
657 public Set<Segment> getAllValuesOfend(final EndOfSiding_step_5.Match partialMatch) {
658 return rawStreamAllValuesOfend(partialMatch.toArray()).collect(Collectors.toSet());
659 }
660
661 /**
662 * Retrieve the set of values that occur in matches for end.
663 * @return the Set of all values or empty set if there are no matches
664 *
665 */
666 public Set<Segment> getAllValuesOfend(final Train pTrain, final Segment pLocation) {
667 return rawStreamAllValuesOfend(new Object[]{pTrain, pLocation, null}).collect(Collectors.toSet());
668 }
669
670 @Override
671 protected EndOfSiding_step_5.Match tupleToMatch(final Tuple t) {
672 try {
673 return EndOfSiding_step_5.Match.newMatch((Train) t.get(POSITION_TRAIN), (Segment) t.get(POSITION_LOCATION), (Segment) t.get(POSITION_END));
674 } catch(ClassCastException e) {
675 LOGGER.error("Element(s) in tuple not properly typed!",e);
676 return null;
677 }
678 }
679
680 @Override
681 protected EndOfSiding_step_5.Match arrayToMatch(final Object[] match) {
682 try {
683 return EndOfSiding_step_5.Match.newMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION], (Segment) match[POSITION_END]);
684 } catch(ClassCastException e) {
685 LOGGER.error("Element(s) in array not properly typed!",e);
686 return null;
687 }
688 }
689
690 @Override
691 protected EndOfSiding_step_5.Match arrayToMatchMutable(final Object[] match) {
692 try {
693 return EndOfSiding_step_5.Match.newMutableMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION], (Segment) match[POSITION_END]);
694 } catch(ClassCastException e) {
695 LOGGER.error("Element(s) in array not properly typed!",e);
696 return null;
697 }
698 }
699
700 /**
701 * @return the singleton instance of the query specification of this pattern
702 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
703 *
704 */
705 public static IQuerySpecification<EndOfSiding_step_5.Matcher> querySpecification() {
706 return EndOfSiding_step_5.instance();
707 }
708 }
709
710 private EndOfSiding_step_5() {
711 super(GeneratedPQuery.INSTANCE);
712 }
713
714 /**
715 * @return the singleton instance of the query specification
716 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
717 *
718 */
719 public static EndOfSiding_step_5 instance() {
720 try{
721 return LazyHolder.INSTANCE;
722 } catch (ExceptionInInitializerError err) {
723 throw processInitializerError(err);
724 }
725 }
726
727 @Override
728 protected EndOfSiding_step_5.Matcher instantiate(final ViatraQueryEngine engine) {
729 return EndOfSiding_step_5.Matcher.on(engine);
730 }
731
732 @Override
733 public EndOfSiding_step_5.Matcher instantiate() {
734 return EndOfSiding_step_5.Matcher.create();
735 }
736
737 @Override
738 public EndOfSiding_step_5.Match newEmptyMatch() {
739 return EndOfSiding_step_5.Match.newEmptyMatch();
740 }
741
742 @Override
743 public EndOfSiding_step_5.Match newMatch(final Object... parameters) {
744 return EndOfSiding_step_5.Match.newMatch((modes3.Train) parameters[0], (modes3.Segment) parameters[1], (modes3.Segment) parameters[2]);
745 }
746
747 /**
748 * Inner class allowing the singleton instance of {@link EndOfSiding_step_5} to be created
749 * <b>not</b> at the class load time of the outer class,
750 * but rather at the first call to {@link EndOfSiding_step_5#instance()}.
751 *
752 * <p> This workaround is required e.g. to support recursion.
753 *
754 */
755 private static class LazyHolder {
756 private static final EndOfSiding_step_5 INSTANCE = new EndOfSiding_step_5();
757
758 /**
759 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
760 * This initialization order is required to support indirect recursion.
761 *
762 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
763 *
764 */
765 private static final Object STATIC_INITIALIZER = ensureInitialized();
766
767 public static Object ensureInitialized() {
768 INSTANCE.ensureInitializedInternal();
769 return null;
770 }
771 }
772
773 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
774 private static final EndOfSiding_step_5.GeneratedPQuery INSTANCE = new GeneratedPQuery();
775
776 private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT);
777
778 private final PParameter parameter_location = new PParameter("location", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
779
780 private final PParameter parameter_end = new PParameter("end", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
781
782 private final List<PParameter> parameters = Arrays.asList(parameter_train, parameter_location, parameter_end);
783
784 private GeneratedPQuery() {
785 super(PVisibility.PUBLIC);
786 }
787
788 @Override
789 public String getFullyQualifiedName() {
790 return "modes3.queries.endOfSiding_step_5";
791 }
792
793 @Override
794 public List<String> getParameterNames() {
795 return Arrays.asList("train","location","end");
796 }
797
798 @Override
799 public List<PParameter> getParameters() {
800 return parameters;
801 }
802
803 @Override
804 public Set<PBody> doGetContainedBodies() {
805 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
806 Set<PBody> bodies = new LinkedHashSet<>();
807 {
808 PBody body = new PBody(this);
809 PVariable var_train = body.getOrCreateVariableByName("train");
810 PVariable var_location = body.getOrCreateVariableByName("location");
811 PVariable var_end = body.getOrCreateVariableByName("end");
812 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
813 new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
814 new TypeConstraint(body, Tuples.flatTupleOf(var_end), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
815 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
816 new ExportedParameter(body, var_train, parameter_train),
817 new ExportedParameter(body, var_location, parameter_location),
818 new ExportedParameter(body, var_end, parameter_end)
819 ));
820 // // results->matches[match_cntr].location = frame->location;// results->matches[match_cntr++].train = frame->train;// ...OR...// results->matches[match_cntr].location = frame->location;// results->matches[match_cntr++].train = frame->train; Train(train)
821 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
822 // Train.location(train, location)
823 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
824 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
825 new TypeConstraint(body, Tuples.flatTupleOf(var_train, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train", "location")));
826 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
827 new Equality(body, var__virtual_0_, var_location);
828 // Segment.connectedTo(location, end)
829 new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
830 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
831 new TypeConstraint(body, Tuples.flatTupleOf(var_location, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo")));
832 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
833 new Equality(body, var__virtual_1_, var_end);
834 // neg find multipleConnectedTo(end)
835 new NegativePatternCall(body, Tuples.flatTupleOf(var_end), MultipleConnectedTo.instance().getInternalQueryRepresentation());
836 bodies.add(body);
837 }
838 return bodies;
839 }
840 }
841}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/InputsOfTurnout.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/InputsOfTurnout.java
new file mode 100644
index 00000000..2f2eea11
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/InputsOfTurnout.java
@@ -0,0 +1,570 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Turnout;
17import modes3.queries.Adjacent;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
40import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
41
42/**
43 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
44 *
45 * <p>Original source:
46 * <code><pre>
47 * pattern inputsOfTurnout(T : Turnout) {
48 * find adjacent(I1, T);
49 * find adjacent(I2, T);
50 * find adjacent(I3, T);
51 * I1 != I2;
52 * I1 != I3;
53 * I2 != I3;
54 * }
55 * </pre></code>
56 *
57 * @see Matcher
58 * @see Match
59 *
60 */
61@SuppressWarnings("all")
62public final class InputsOfTurnout extends BaseGeneratedEMFQuerySpecification<InputsOfTurnout.Matcher> {
63 /**
64 * Pattern-specific match representation of the modes3.queries.inputsOfTurnout pattern,
65 * to be used in conjunction with {@link Matcher}.
66 *
67 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
68 * Each instance is a (possibly partial) substitution of pattern parameters,
69 * usable to represent a match of the pattern in the result of a query,
70 * or to specify the bound (fixed) input parameters when issuing a query.
71 *
72 * @see Matcher
73 *
74 */
75 public static abstract class Match extends BasePatternMatch {
76 private Turnout fT;
77
78 private static List<String> parameterNames = makeImmutableList("T");
79
80 private Match(final Turnout pT) {
81 this.fT = pT;
82 }
83
84 @Override
85 public Object get(final String parameterName) {
86 switch(parameterName) {
87 case "T": return this.fT;
88 default: return null;
89 }
90 }
91
92 @Override
93 public Object get(final int index) {
94 switch(index) {
95 case 0: return this.fT;
96 default: return null;
97 }
98 }
99
100 public Turnout getT() {
101 return this.fT;
102 }
103
104 @Override
105 public boolean set(final String parameterName, final Object newValue) {
106 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
107 if ("T".equals(parameterName) ) {
108 this.fT = (Turnout) newValue;
109 return true;
110 }
111 return false;
112 }
113
114 public void setT(final Turnout pT) {
115 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
116 this.fT = pT;
117 }
118
119 @Override
120 public String patternName() {
121 return "modes3.queries.inputsOfTurnout";
122 }
123
124 @Override
125 public List<String> parameterNames() {
126 return InputsOfTurnout.Match.parameterNames;
127 }
128
129 @Override
130 public Object[] toArray() {
131 return new Object[]{fT};
132 }
133
134 @Override
135 public InputsOfTurnout.Match toImmutable() {
136 return isMutable() ? newMatch(fT) : this;
137 }
138
139 @Override
140 public String prettyPrint() {
141 StringBuilder result = new StringBuilder();
142 result.append("\"T\"=" + prettyPrintValue(fT));
143 return result.toString();
144 }
145
146 @Override
147 public int hashCode() {
148 return Objects.hash(fT);
149 }
150
151 @Override
152 public boolean equals(final Object obj) {
153 if (this == obj)
154 return true;
155 if (obj == null) {
156 return false;
157 }
158 if ((obj instanceof InputsOfTurnout.Match)) {
159 InputsOfTurnout.Match other = (InputsOfTurnout.Match) obj;
160 return Objects.equals(fT, other.fT);
161 } else {
162 // this should be infrequent
163 if (!(obj instanceof IPatternMatch)) {
164 return false;
165 }
166 IPatternMatch otherSig = (IPatternMatch) obj;
167 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
168 }
169 }
170
171 @Override
172 public InputsOfTurnout specification() {
173 return InputsOfTurnout.instance();
174 }
175
176 /**
177 * Returns an empty, mutable match.
178 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
179 *
180 * @return the empty match.
181 *
182 */
183 public static InputsOfTurnout.Match newEmptyMatch() {
184 return new Mutable(null);
185 }
186
187 /**
188 * Returns a mutable (partial) match.
189 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
190 *
191 * @param pT the fixed value of pattern parameter T, or null if not bound.
192 * @return the new, mutable (partial) match object.
193 *
194 */
195 public static InputsOfTurnout.Match newMutableMatch(final Turnout pT) {
196 return new Mutable(pT);
197 }
198
199 /**
200 * Returns a new (partial) match.
201 * This can be used e.g. to call the matcher with a partial match.
202 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
203 * @param pT the fixed value of pattern parameter T, or null if not bound.
204 * @return the (partial) match object.
205 *
206 */
207 public static InputsOfTurnout.Match newMatch(final Turnout pT) {
208 return new Immutable(pT);
209 }
210
211 private static final class Mutable extends InputsOfTurnout.Match {
212 Mutable(final Turnout pT) {
213 super(pT);
214 }
215
216 @Override
217 public boolean isMutable() {
218 return true;
219 }
220 }
221
222 private static final class Immutable extends InputsOfTurnout.Match {
223 Immutable(final Turnout pT) {
224 super(pT);
225 }
226
227 @Override
228 public boolean isMutable() {
229 return false;
230 }
231 }
232 }
233
234 /**
235 * Generated pattern matcher API of the modes3.queries.inputsOfTurnout pattern,
236 * providing pattern-specific query methods.
237 *
238 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
239 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
240 *
241 * <p>Matches of the pattern will be represented as {@link Match}.
242 *
243 * <p>Original source:
244 * <code><pre>
245 * pattern inputsOfTurnout(T : Turnout) {
246 * find adjacent(I1, T);
247 * find adjacent(I2, T);
248 * find adjacent(I3, T);
249 * I1 != I2;
250 * I1 != I3;
251 * I2 != I3;
252 * }
253 * </pre></code>
254 *
255 * @see Match
256 * @see InputsOfTurnout
257 *
258 */
259 public static class Matcher extends BaseMatcher<InputsOfTurnout.Match> {
260 /**
261 * Initializes the pattern matcher within an existing VIATRA Query engine.
262 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
263 *
264 * @param engine the existing VIATRA Query engine in which this matcher will be created.
265 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
266 *
267 */
268 public static InputsOfTurnout.Matcher on(final ViatraQueryEngine engine) {
269 // check if matcher already exists
270 Matcher matcher = engine.getExistingMatcher(querySpecification());
271 if (matcher == null) {
272 matcher = (Matcher)engine.getMatcher(querySpecification());
273 }
274 return matcher;
275 }
276
277 /**
278 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
279 * @return an initialized matcher
280 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
281 *
282 */
283 public static InputsOfTurnout.Matcher create() {
284 return new Matcher();
285 }
286
287 private static final int POSITION_T = 0;
288
289 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(InputsOfTurnout.Matcher.class);
290
291 /**
292 * Initializes the pattern matcher within an existing VIATRA Query engine.
293 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
294 *
295 * @param engine the existing VIATRA Query engine in which this matcher will be created.
296 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
297 *
298 */
299 private Matcher() {
300 super(querySpecification());
301 }
302
303 /**
304 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
305 * @param pT the fixed value of pattern parameter T, or null if not bound.
306 * @return matches represented as a Match object.
307 *
308 */
309 public Collection<InputsOfTurnout.Match> getAllMatches(final Turnout pT) {
310 return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet());
311 }
312
313 /**
314 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
315 * </p>
316 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
317 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
318 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
319 * @param pT the fixed value of pattern parameter T, or null if not bound.
320 * @return a stream of matches represented as a Match object.
321 *
322 */
323 public Stream<InputsOfTurnout.Match> streamAllMatches(final Turnout pT) {
324 return rawStreamAllMatches(new Object[]{pT});
325 }
326
327 /**
328 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
329 * Neither determinism nor randomness of selection is guaranteed.
330 * @param pT the fixed value of pattern parameter T, or null if not bound.
331 * @return a match represented as a Match object, or null if no match is found.
332 *
333 */
334 public Optional<InputsOfTurnout.Match> getOneArbitraryMatch(final Turnout pT) {
335 return rawGetOneArbitraryMatch(new Object[]{pT});
336 }
337
338 /**
339 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
340 * under any possible substitution of the unspecified parameters (if any).
341 * @param pT the fixed value of pattern parameter T, or null if not bound.
342 * @return true if the input is a valid (partial) match of the pattern.
343 *
344 */
345 public boolean hasMatch(final Turnout pT) {
346 return rawHasMatch(new Object[]{pT});
347 }
348
349 /**
350 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
351 * @param pT the fixed value of pattern parameter T, or null if not bound.
352 * @return the number of pattern matches found.
353 *
354 */
355 public int countMatches(final Turnout pT) {
356 return rawCountMatches(new Object[]{pT});
357 }
358
359 /**
360 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
361 * Neither determinism nor randomness of selection is guaranteed.
362 * @param pT the fixed value of pattern parameter T, or null if not bound.
363 * @param processor the action that will process the selected match.
364 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
365 *
366 */
367 public boolean forOneArbitraryMatch(final Turnout pT, final Consumer<? super InputsOfTurnout.Match> processor) {
368 return rawForOneArbitraryMatch(new Object[]{pT}, processor);
369 }
370
371 /**
372 * Returns a new (partial) match.
373 * This can be used e.g. to call the matcher with a partial match.
374 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
375 * @param pT the fixed value of pattern parameter T, or null if not bound.
376 * @return the (partial) match object.
377 *
378 */
379 public InputsOfTurnout.Match newMatch(final Turnout pT) {
380 return InputsOfTurnout.Match.newMatch(pT);
381 }
382
383 /**
384 * Retrieve the set of values that occur in matches for T.
385 * @return the Set of all values or empty set if there are no matches
386 *
387 */
388 protected Stream<Turnout> rawStreamAllValuesOfT(final Object[] parameters) {
389 return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast);
390 }
391
392 /**
393 * Retrieve the set of values that occur in matches for T.
394 * @return the Set of all values or empty set if there are no matches
395 *
396 */
397 public Set<Turnout> getAllValuesOfT() {
398 return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet());
399 }
400
401 /**
402 * Retrieve the set of values that occur in matches for T.
403 * @return the Set of all values or empty set if there are no matches
404 *
405 */
406 public Stream<Turnout> streamAllValuesOfT() {
407 return rawStreamAllValuesOfT(emptyArray());
408 }
409
410 @Override
411 protected InputsOfTurnout.Match tupleToMatch(final Tuple t) {
412 try {
413 return InputsOfTurnout.Match.newMatch((Turnout) t.get(POSITION_T));
414 } catch(ClassCastException e) {
415 LOGGER.error("Element(s) in tuple not properly typed!",e);
416 return null;
417 }
418 }
419
420 @Override
421 protected InputsOfTurnout.Match arrayToMatch(final Object[] match) {
422 try {
423 return InputsOfTurnout.Match.newMatch((Turnout) match[POSITION_T]);
424 } catch(ClassCastException e) {
425 LOGGER.error("Element(s) in array not properly typed!",e);
426 return null;
427 }
428 }
429
430 @Override
431 protected InputsOfTurnout.Match arrayToMatchMutable(final Object[] match) {
432 try {
433 return InputsOfTurnout.Match.newMutableMatch((Turnout) match[POSITION_T]);
434 } catch(ClassCastException e) {
435 LOGGER.error("Element(s) in array not properly typed!",e);
436 return null;
437 }
438 }
439
440 /**
441 * @return the singleton instance of the query specification of this pattern
442 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
443 *
444 */
445 public static IQuerySpecification<InputsOfTurnout.Matcher> querySpecification() {
446 return InputsOfTurnout.instance();
447 }
448 }
449
450 private InputsOfTurnout() {
451 super(GeneratedPQuery.INSTANCE);
452 }
453
454 /**
455 * @return the singleton instance of the query specification
456 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
457 *
458 */
459 public static InputsOfTurnout instance() {
460 try{
461 return LazyHolder.INSTANCE;
462 } catch (ExceptionInInitializerError err) {
463 throw processInitializerError(err);
464 }
465 }
466
467 @Override
468 protected InputsOfTurnout.Matcher instantiate(final ViatraQueryEngine engine) {
469 return InputsOfTurnout.Matcher.on(engine);
470 }
471
472 @Override
473 public InputsOfTurnout.Matcher instantiate() {
474 return InputsOfTurnout.Matcher.create();
475 }
476
477 @Override
478 public InputsOfTurnout.Match newEmptyMatch() {
479 return InputsOfTurnout.Match.newEmptyMatch();
480 }
481
482 @Override
483 public InputsOfTurnout.Match newMatch(final Object... parameters) {
484 return InputsOfTurnout.Match.newMatch((modes3.Turnout) parameters[0]);
485 }
486
487 /**
488 * Inner class allowing the singleton instance of {@link InputsOfTurnout} to be created
489 * <b>not</b> at the class load time of the outer class,
490 * but rather at the first call to {@link InputsOfTurnout#instance()}.
491 *
492 * <p> This workaround is required e.g. to support recursion.
493 *
494 */
495 private static class LazyHolder {
496 private static final InputsOfTurnout INSTANCE = new InputsOfTurnout();
497
498 /**
499 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
500 * This initialization order is required to support indirect recursion.
501 *
502 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
503 *
504 */
505 private static final Object STATIC_INITIALIZER = ensureInitialized();
506
507 public static Object ensureInitialized() {
508 INSTANCE.ensureInitializedInternal();
509 return null;
510 }
511 }
512
513 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
514 private static final InputsOfTurnout.GeneratedPQuery INSTANCE = new GeneratedPQuery();
515
516 private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT);
517
518 private final List<PParameter> parameters = Arrays.asList(parameter_T);
519
520 private GeneratedPQuery() {
521 super(PVisibility.PUBLIC);
522 }
523
524 @Override
525 public String getFullyQualifiedName() {
526 return "modes3.queries.inputsOfTurnout";
527 }
528
529 @Override
530 public List<String> getParameterNames() {
531 return Arrays.asList("T");
532 }
533
534 @Override
535 public List<PParameter> getParameters() {
536 return parameters;
537 }
538
539 @Override
540 public Set<PBody> doGetContainedBodies() {
541 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
542 Set<PBody> bodies = new LinkedHashSet<>();
543 {
544 PBody body = new PBody(this);
545 PVariable var_T = body.getOrCreateVariableByName("T");
546 PVariable var_I1 = body.getOrCreateVariableByName("I1");
547 PVariable var_I2 = body.getOrCreateVariableByName("I2");
548 PVariable var_I3 = body.getOrCreateVariableByName("I3");
549 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
550 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
551 new ExportedParameter(body, var_T, parameter_T)
552 ));
553 // find adjacent(I1, T)
554 new PositivePatternCall(body, Tuples.flatTupleOf(var_I1, var_T), Adjacent.instance().getInternalQueryRepresentation());
555 // find adjacent(I2, T)
556 new PositivePatternCall(body, Tuples.flatTupleOf(var_I2, var_T), Adjacent.instance().getInternalQueryRepresentation());
557 // find adjacent(I3, T)
558 new PositivePatternCall(body, Tuples.flatTupleOf(var_I3, var_T), Adjacent.instance().getInternalQueryRepresentation());
559 // I1 != I2
560 new Inequality(body, var_I1, var_I2);
561 // I1 != I3
562 new Inequality(body, var_I1, var_I3);
563 // I2 != I3
564 new Inequality(body, var_I2, var_I3);
565 bodies.add(body);
566 }
567 return bodies;
568 }
569 }
570}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java
new file mode 100644
index 00000000..d1238d61
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java
@@ -0,0 +1,405 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import modes3.queries.Adjacent;
7import modes3.queries.CloseTrains_step_2;
8import modes3.queries.CloseTrains_step_3;
9import modes3.queries.CloseTrains_step_4;
10import modes3.queries.CloseTrains_step_5;
11import modes3.queries.CloseTrains_step_6;
12import modes3.queries.CloseTrains_step_7;
13import modes3.queries.ConnectedSegmentsDirected;
14import modes3.queries.ConnectedTo;
15import modes3.queries.ConnectedToNotSymmetric;
16import modes3.queries.ConnectedToReflexive;
17import modes3.queries.EndOfSiding_step_2;
18import modes3.queries.EndOfSiding_step_3;
19import modes3.queries.EndOfSiding_step_4;
20import modes3.queries.EndOfSiding_step_5;
21import modes3.queries.InputsOfTurnout;
22import modes3.queries.MisalignedTurnout_step_2;
23import modes3.queries.MisalignedTurnout_step_3;
24import modes3.queries.MisalignedTurnout_step_4;
25import modes3.queries.MisalignedTurnout_step_5;
26import modes3.queries.MultipleConnectedTo;
27import modes3.queries.Output;
28import modes3.queries.OutputReflexive;
29import modes3.queries.Reachable;
30import modes3.queries.TooFewInputsOfTurnout;
31import modes3.queries.TooManyInputsOfSegment;
32import modes3.queries.TooManyInputsOfTurnout;
33import modes3.queries.TrainLocations_step_2;
34import modes3.queries.TrainLocations_step_3;
35import modes3.queries.TurnoutConnectedToBothOutputs;
36import modes3.queries.TurnoutOutput;
37import modes3.queries.TurnoutOutputsAreSame;
38import modes3.queries.Unreachable;
39import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
40import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup;
41
42/**
43 * A pattern group formed of all public patterns defined in Modes3Queries.vql.
44 *
45 * <p>Use the static instance as any {@link interface org.eclipse.viatra.query.runtime.api.IQueryGroup}, to conveniently prepare
46 * a VIATRA Query engine for matching all patterns originally defined in file Modes3Queries.vql,
47 * in order to achieve better performance than one-by-one on-demand matcher initialization.
48 *
49 * <p> From package modes3.queries, the group contains the definition of the following patterns: <ul>
50 * <li>connectedTo</li>
51 * <li>connectedToNotSymmetric</li>
52 * <li>connectedToReflexive</li>
53 * <li>turnoutOutput</li>
54 * <li>outputReflexive</li>
55 * <li>turnoutOutputsAreSame</li>
56 * <li>output</li>
57 * <li>tooManyInputsOfSegment</li>
58 * <li>turnoutConnectedToBothOutputs</li>
59 * <li>adjacent</li>
60 * <li>tooManyInputsOfTurnout</li>
61 * <li>inputsOfTurnout</li>
62 * <li>tooFewInputsOfTurnout</li>
63 * <li>reachable</li>
64 * <li>unreachable</li>
65 * <li>closeTrains_step_2</li>
66 * <li>closeTrains_step_3</li>
67 * <li>closeTrains_step_4</li>
68 * <li>closeTrains_step_5</li>
69 * <li>closeTrains_step_6</li>
70 * <li>closeTrains_step_7</li>
71 * <li>trainLocations_step_2</li>
72 * <li>trainLocations_step_3</li>
73 * <li>misalignedTurnout_step_2</li>
74 * <li>misalignedTurnout_step_3</li>
75 * <li>misalignedTurnout_step_4</li>
76 * <li>misalignedTurnout_step_5</li>
77 * <li>connectedSegmentsDirected</li>
78 * <li>endOfSiding_step_2</li>
79 * <li>endOfSiding_step_3</li>
80 * <li>endOfSiding_step_4</li>
81 * <li>endOfSiding_step_5</li>
82 * <li>multipleConnectedTo</li>
83 * </ul>
84 *
85 * @see IQueryGroup
86 *
87 */
88@SuppressWarnings("all")
89public final class Modes3Queries extends BaseGeneratedPatternGroup {
90 /**
91 * Access the pattern group.
92 *
93 * @return the singleton instance of the group
94 * @throws ViatraQueryRuntimeException if there was an error loading the generated code of pattern specifications
95 *
96 */
97 public static Modes3Queries instance() {
98 if (INSTANCE == null) {
99 INSTANCE = new Modes3Queries();
100 }
101 return INSTANCE;
102 }
103
104 private static Modes3Queries INSTANCE;
105
106 private Modes3Queries() {
107 querySpecifications.add(ConnectedTo.instance());
108 querySpecifications.add(ConnectedToNotSymmetric.instance());
109 querySpecifications.add(ConnectedToReflexive.instance());
110 querySpecifications.add(TurnoutOutput.instance());
111 querySpecifications.add(OutputReflexive.instance());
112 querySpecifications.add(TurnoutOutputsAreSame.instance());
113 querySpecifications.add(Output.instance());
114 querySpecifications.add(TooManyInputsOfSegment.instance());
115 querySpecifications.add(TurnoutConnectedToBothOutputs.instance());
116 querySpecifications.add(Adjacent.instance());
117 querySpecifications.add(TooManyInputsOfTurnout.instance());
118 querySpecifications.add(InputsOfTurnout.instance());
119 querySpecifications.add(TooFewInputsOfTurnout.instance());
120 querySpecifications.add(Reachable.instance());
121 querySpecifications.add(Unreachable.instance());
122 querySpecifications.add(CloseTrains_step_2.instance());
123 querySpecifications.add(CloseTrains_step_3.instance());
124 querySpecifications.add(CloseTrains_step_4.instance());
125 querySpecifications.add(CloseTrains_step_5.instance());
126 querySpecifications.add(CloseTrains_step_6.instance());
127 querySpecifications.add(CloseTrains_step_7.instance());
128 querySpecifications.add(TrainLocations_step_2.instance());
129 querySpecifications.add(TrainLocations_step_3.instance());
130 querySpecifications.add(MisalignedTurnout_step_2.instance());
131 querySpecifications.add(MisalignedTurnout_step_3.instance());
132 querySpecifications.add(MisalignedTurnout_step_4.instance());
133 querySpecifications.add(MisalignedTurnout_step_5.instance());
134 querySpecifications.add(ConnectedSegmentsDirected.instance());
135 querySpecifications.add(EndOfSiding_step_2.instance());
136 querySpecifications.add(EndOfSiding_step_3.instance());
137 querySpecifications.add(EndOfSiding_step_4.instance());
138 querySpecifications.add(EndOfSiding_step_5.instance());
139 querySpecifications.add(MultipleConnectedTo.instance());
140 }
141
142 public ConnectedTo getConnectedTo() {
143 return ConnectedTo.instance();
144 }
145
146 public ConnectedTo.Matcher getConnectedTo(final ViatraQueryEngine engine) {
147 return ConnectedTo.Matcher.on(engine);
148 }
149
150 public ConnectedToNotSymmetric getConnectedToNotSymmetric() {
151 return ConnectedToNotSymmetric.instance();
152 }
153
154 public ConnectedToNotSymmetric.Matcher getConnectedToNotSymmetric(final ViatraQueryEngine engine) {
155 return ConnectedToNotSymmetric.Matcher.on(engine);
156 }
157
158 public ConnectedToReflexive getConnectedToReflexive() {
159 return ConnectedToReflexive.instance();
160 }
161
162 public ConnectedToReflexive.Matcher getConnectedToReflexive(final ViatraQueryEngine engine) {
163 return ConnectedToReflexive.Matcher.on(engine);
164 }
165
166 public TurnoutOutput getTurnoutOutput() {
167 return TurnoutOutput.instance();
168 }
169
170 public TurnoutOutput.Matcher getTurnoutOutput(final ViatraQueryEngine engine) {
171 return TurnoutOutput.Matcher.on(engine);
172 }
173
174 public OutputReflexive getOutputReflexive() {
175 return OutputReflexive.instance();
176 }
177
178 public OutputReflexive.Matcher getOutputReflexive(final ViatraQueryEngine engine) {
179 return OutputReflexive.Matcher.on(engine);
180 }
181
182 public TurnoutOutputsAreSame getTurnoutOutputsAreSame() {
183 return TurnoutOutputsAreSame.instance();
184 }
185
186 public TurnoutOutputsAreSame.Matcher getTurnoutOutputsAreSame(final ViatraQueryEngine engine) {
187 return TurnoutOutputsAreSame.Matcher.on(engine);
188 }
189
190 public Output getOutput() {
191 return Output.instance();
192 }
193
194 public Output.Matcher getOutput(final ViatraQueryEngine engine) {
195 return Output.Matcher.on(engine);
196 }
197
198 public TooManyInputsOfSegment getTooManyInputsOfSegment() {
199 return TooManyInputsOfSegment.instance();
200 }
201
202 public TooManyInputsOfSegment.Matcher getTooManyInputsOfSegment(final ViatraQueryEngine engine) {
203 return TooManyInputsOfSegment.Matcher.on(engine);
204 }
205
206 public TurnoutConnectedToBothOutputs getTurnoutConnectedToBothOutputs() {
207 return TurnoutConnectedToBothOutputs.instance();
208 }
209
210 public TurnoutConnectedToBothOutputs.Matcher getTurnoutConnectedToBothOutputs(final ViatraQueryEngine engine) {
211 return TurnoutConnectedToBothOutputs.Matcher.on(engine);
212 }
213
214 public Adjacent getAdjacent() {
215 return Adjacent.instance();
216 }
217
218 public Adjacent.Matcher getAdjacent(final ViatraQueryEngine engine) {
219 return Adjacent.Matcher.on(engine);
220 }
221
222 public TooManyInputsOfTurnout getTooManyInputsOfTurnout() {
223 return TooManyInputsOfTurnout.instance();
224 }
225
226 public TooManyInputsOfTurnout.Matcher getTooManyInputsOfTurnout(final ViatraQueryEngine engine) {
227 return TooManyInputsOfTurnout.Matcher.on(engine);
228 }
229
230 public InputsOfTurnout getInputsOfTurnout() {
231 return InputsOfTurnout.instance();
232 }
233
234 public InputsOfTurnout.Matcher getInputsOfTurnout(final ViatraQueryEngine engine) {
235 return InputsOfTurnout.Matcher.on(engine);
236 }
237
238 public TooFewInputsOfTurnout getTooFewInputsOfTurnout() {
239 return TooFewInputsOfTurnout.instance();
240 }
241
242 public TooFewInputsOfTurnout.Matcher getTooFewInputsOfTurnout(final ViatraQueryEngine engine) {
243 return TooFewInputsOfTurnout.Matcher.on(engine);
244 }
245
246 public Reachable getReachable() {
247 return Reachable.instance();
248 }
249
250 public Reachable.Matcher getReachable(final ViatraQueryEngine engine) {
251 return Reachable.Matcher.on(engine);
252 }
253
254 public Unreachable getUnreachable() {
255 return Unreachable.instance();
256 }
257
258 public Unreachable.Matcher getUnreachable(final ViatraQueryEngine engine) {
259 return Unreachable.Matcher.on(engine);
260 }
261
262 public CloseTrains_step_2 getCloseTrains_step_2() {
263 return CloseTrains_step_2.instance();
264 }
265
266 public CloseTrains_step_2.Matcher getCloseTrains_step_2(final ViatraQueryEngine engine) {
267 return CloseTrains_step_2.Matcher.on(engine);
268 }
269
270 public CloseTrains_step_3 getCloseTrains_step_3() {
271 return CloseTrains_step_3.instance();
272 }
273
274 public CloseTrains_step_3.Matcher getCloseTrains_step_3(final ViatraQueryEngine engine) {
275 return CloseTrains_step_3.Matcher.on(engine);
276 }
277
278 public CloseTrains_step_4 getCloseTrains_step_4() {
279 return CloseTrains_step_4.instance();
280 }
281
282 public CloseTrains_step_4.Matcher getCloseTrains_step_4(final ViatraQueryEngine engine) {
283 return CloseTrains_step_4.Matcher.on(engine);
284 }
285
286 public CloseTrains_step_5 getCloseTrains_step_5() {
287 return CloseTrains_step_5.instance();
288 }
289
290 public CloseTrains_step_5.Matcher getCloseTrains_step_5(final ViatraQueryEngine engine) {
291 return CloseTrains_step_5.Matcher.on(engine);
292 }
293
294 public CloseTrains_step_6 getCloseTrains_step_6() {
295 return CloseTrains_step_6.instance();
296 }
297
298 public CloseTrains_step_6.Matcher getCloseTrains_step_6(final ViatraQueryEngine engine) {
299 return CloseTrains_step_6.Matcher.on(engine);
300 }
301
302 public CloseTrains_step_7 getCloseTrains_step_7() {
303 return CloseTrains_step_7.instance();
304 }
305
306 public CloseTrains_step_7.Matcher getCloseTrains_step_7(final ViatraQueryEngine engine) {
307 return CloseTrains_step_7.Matcher.on(engine);
308 }
309
310 public TrainLocations_step_2 getTrainLocations_step_2() {
311 return TrainLocations_step_2.instance();
312 }
313
314 public TrainLocations_step_2.Matcher getTrainLocations_step_2(final ViatraQueryEngine engine) {
315 return TrainLocations_step_2.Matcher.on(engine);
316 }
317
318 public TrainLocations_step_3 getTrainLocations_step_3() {
319 return TrainLocations_step_3.instance();
320 }
321
322 public TrainLocations_step_3.Matcher getTrainLocations_step_3(final ViatraQueryEngine engine) {
323 return TrainLocations_step_3.Matcher.on(engine);
324 }
325
326 public MisalignedTurnout_step_2 getMisalignedTurnout_step_2() {
327 return MisalignedTurnout_step_2.instance();
328 }
329
330 public MisalignedTurnout_step_2.Matcher getMisalignedTurnout_step_2(final ViatraQueryEngine engine) {
331 return MisalignedTurnout_step_2.Matcher.on(engine);
332 }
333
334 public MisalignedTurnout_step_3 getMisalignedTurnout_step_3() {
335 return MisalignedTurnout_step_3.instance();
336 }
337
338 public MisalignedTurnout_step_3.Matcher getMisalignedTurnout_step_3(final ViatraQueryEngine engine) {
339 return MisalignedTurnout_step_3.Matcher.on(engine);
340 }
341
342 public MisalignedTurnout_step_4 getMisalignedTurnout_step_4() {
343 return MisalignedTurnout_step_4.instance();
344 }
345
346 public MisalignedTurnout_step_4.Matcher getMisalignedTurnout_step_4(final ViatraQueryEngine engine) {
347 return MisalignedTurnout_step_4.Matcher.on(engine);
348 }
349
350 public MisalignedTurnout_step_5 getMisalignedTurnout_step_5() {
351 return MisalignedTurnout_step_5.instance();
352 }
353
354 public MisalignedTurnout_step_5.Matcher getMisalignedTurnout_step_5(final ViatraQueryEngine engine) {
355 return MisalignedTurnout_step_5.Matcher.on(engine);
356 }
357
358 public ConnectedSegmentsDirected getConnectedSegmentsDirected() {
359 return ConnectedSegmentsDirected.instance();
360 }
361
362 public ConnectedSegmentsDirected.Matcher getConnectedSegmentsDirected(final ViatraQueryEngine engine) {
363 return ConnectedSegmentsDirected.Matcher.on(engine);
364 }
365
366 public EndOfSiding_step_2 getEndOfSiding_step_2() {
367 return EndOfSiding_step_2.instance();
368 }
369
370 public EndOfSiding_step_2.Matcher getEndOfSiding_step_2(final ViatraQueryEngine engine) {
371 return EndOfSiding_step_2.Matcher.on(engine);
372 }
373
374 public EndOfSiding_step_3 getEndOfSiding_step_3() {
375 return EndOfSiding_step_3.instance();
376 }
377
378 public EndOfSiding_step_3.Matcher getEndOfSiding_step_3(final ViatraQueryEngine engine) {
379 return EndOfSiding_step_3.Matcher.on(engine);
380 }
381
382 public EndOfSiding_step_4 getEndOfSiding_step_4() {
383 return EndOfSiding_step_4.instance();
384 }
385
386 public EndOfSiding_step_4.Matcher getEndOfSiding_step_4(final ViatraQueryEngine engine) {
387 return EndOfSiding_step_4.Matcher.on(engine);
388 }
389
390 public EndOfSiding_step_5 getEndOfSiding_step_5() {
391 return EndOfSiding_step_5.instance();
392 }
393
394 public EndOfSiding_step_5.Matcher getEndOfSiding_step_5(final ViatraQueryEngine engine) {
395 return EndOfSiding_step_5.Matcher.on(engine);
396 }
397
398 public MultipleConnectedTo getMultipleConnectedTo() {
399 return MultipleConnectedTo.instance();
400 }
401
402 public MultipleConnectedTo.Matcher getMultipleConnectedTo(final ViatraQueryEngine engine) {
403 return MultipleConnectedTo.Matcher.on(engine);
404 }
405}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/MultipleConnectedTo.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/MultipleConnectedTo.java
new file mode 100644
index 00000000..277006c9
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/MultipleConnectedTo.java
@@ -0,0 +1,565 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.viatra.query.runtime.api.IPatternMatch;
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
24import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
25import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
26import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
27import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
40import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
41
42/**
43 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
44 *
45 * <p>Original source:
46 * <code><pre>
47 * pattern multipleConnectedTo(s : Segment) {
48 * Segment.connectedTo(s, n1);
49 * Segment.connectedTo(s, n2);
50 * n1 != n2;
51 * }
52 * </pre></code>
53 *
54 * @see Matcher
55 * @see Match
56 *
57 */
58@SuppressWarnings("all")
59public final class MultipleConnectedTo extends BaseGeneratedEMFQuerySpecification<MultipleConnectedTo.Matcher> {
60 /**
61 * Pattern-specific match representation of the modes3.queries.multipleConnectedTo pattern,
62 * to be used in conjunction with {@link Matcher}.
63 *
64 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
65 * Each instance is a (possibly partial) substitution of pattern parameters,
66 * usable to represent a match of the pattern in the result of a query,
67 * or to specify the bound (fixed) input parameters when issuing a query.
68 *
69 * @see Matcher
70 *
71 */
72 public static abstract class Match extends BasePatternMatch {
73 private Segment fS;
74
75 private static List<String> parameterNames = makeImmutableList("s");
76
77 private Match(final Segment pS) {
78 this.fS = pS;
79 }
80
81 @Override
82 public Object get(final String parameterName) {
83 switch(parameterName) {
84 case "s": return this.fS;
85 default: return null;
86 }
87 }
88
89 @Override
90 public Object get(final int index) {
91 switch(index) {
92 case 0: return this.fS;
93 default: return null;
94 }
95 }
96
97 public Segment getS() {
98 return this.fS;
99 }
100
101 @Override
102 public boolean set(final String parameterName, final Object newValue) {
103 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
104 if ("s".equals(parameterName) ) {
105 this.fS = (Segment) newValue;
106 return true;
107 }
108 return false;
109 }
110
111 public void setS(final Segment pS) {
112 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
113 this.fS = pS;
114 }
115
116 @Override
117 public String patternName() {
118 return "modes3.queries.multipleConnectedTo";
119 }
120
121 @Override
122 public List<String> parameterNames() {
123 return MultipleConnectedTo.Match.parameterNames;
124 }
125
126 @Override
127 public Object[] toArray() {
128 return new Object[]{fS};
129 }
130
131 @Override
132 public MultipleConnectedTo.Match toImmutable() {
133 return isMutable() ? newMatch(fS) : this;
134 }
135
136 @Override
137 public String prettyPrint() {
138 StringBuilder result = new StringBuilder();
139 result.append("\"s\"=" + prettyPrintValue(fS));
140 return result.toString();
141 }
142
143 @Override
144 public int hashCode() {
145 return Objects.hash(fS);
146 }
147
148 @Override
149 public boolean equals(final Object obj) {
150 if (this == obj)
151 return true;
152 if (obj == null) {
153 return false;
154 }
155 if ((obj instanceof MultipleConnectedTo.Match)) {
156 MultipleConnectedTo.Match other = (MultipleConnectedTo.Match) obj;
157 return Objects.equals(fS, other.fS);
158 } else {
159 // this should be infrequent
160 if (!(obj instanceof IPatternMatch)) {
161 return false;
162 }
163 IPatternMatch otherSig = (IPatternMatch) obj;
164 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
165 }
166 }
167
168 @Override
169 public MultipleConnectedTo specification() {
170 return MultipleConnectedTo.instance();
171 }
172
173 /**
174 * Returns an empty, mutable match.
175 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
176 *
177 * @return the empty match.
178 *
179 */
180 public static MultipleConnectedTo.Match newEmptyMatch() {
181 return new Mutable(null);
182 }
183
184 /**
185 * Returns a mutable (partial) match.
186 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
187 *
188 * @param pS the fixed value of pattern parameter s, or null if not bound.
189 * @return the new, mutable (partial) match object.
190 *
191 */
192 public static MultipleConnectedTo.Match newMutableMatch(final Segment pS) {
193 return new Mutable(pS);
194 }
195
196 /**
197 * Returns a new (partial) match.
198 * This can be used e.g. to call the matcher with a partial match.
199 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
200 * @param pS the fixed value of pattern parameter s, or null if not bound.
201 * @return the (partial) match object.
202 *
203 */
204 public static MultipleConnectedTo.Match newMatch(final Segment pS) {
205 return new Immutable(pS);
206 }
207
208 private static final class Mutable extends MultipleConnectedTo.Match {
209 Mutable(final Segment pS) {
210 super(pS);
211 }
212
213 @Override
214 public boolean isMutable() {
215 return true;
216 }
217 }
218
219 private static final class Immutable extends MultipleConnectedTo.Match {
220 Immutable(final Segment pS) {
221 super(pS);
222 }
223
224 @Override
225 public boolean isMutable() {
226 return false;
227 }
228 }
229 }
230
231 /**
232 * Generated pattern matcher API of the modes3.queries.multipleConnectedTo pattern,
233 * providing pattern-specific query methods.
234 *
235 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
236 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
237 *
238 * <p>Matches of the pattern will be represented as {@link Match}.
239 *
240 * <p>Original source:
241 * <code><pre>
242 * pattern multipleConnectedTo(s : Segment) {
243 * Segment.connectedTo(s, n1);
244 * Segment.connectedTo(s, n2);
245 * n1 != n2;
246 * }
247 * </pre></code>
248 *
249 * @see Match
250 * @see MultipleConnectedTo
251 *
252 */
253 public static class Matcher extends BaseMatcher<MultipleConnectedTo.Match> {
254 /**
255 * Initializes the pattern matcher within an existing VIATRA Query engine.
256 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
257 *
258 * @param engine the existing VIATRA Query engine in which this matcher will be created.
259 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
260 *
261 */
262 public static MultipleConnectedTo.Matcher on(final ViatraQueryEngine engine) {
263 // check if matcher already exists
264 Matcher matcher = engine.getExistingMatcher(querySpecification());
265 if (matcher == null) {
266 matcher = (Matcher)engine.getMatcher(querySpecification());
267 }
268 return matcher;
269 }
270
271 /**
272 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
273 * @return an initialized matcher
274 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
275 *
276 */
277 public static MultipleConnectedTo.Matcher create() {
278 return new Matcher();
279 }
280
281 private static final int POSITION_S = 0;
282
283 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(MultipleConnectedTo.Matcher.class);
284
285 /**
286 * Initializes the pattern matcher within an existing VIATRA Query engine.
287 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
288 *
289 * @param engine the existing VIATRA Query engine in which this matcher will be created.
290 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
291 *
292 */
293 private Matcher() {
294 super(querySpecification());
295 }
296
297 /**
298 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
299 * @param pS the fixed value of pattern parameter s, or null if not bound.
300 * @return matches represented as a Match object.
301 *
302 */
303 public Collection<MultipleConnectedTo.Match> getAllMatches(final Segment pS) {
304 return rawStreamAllMatches(new Object[]{pS}).collect(Collectors.toSet());
305 }
306
307 /**
308 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
309 * </p>
310 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
311 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
312 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
313 * @param pS the fixed value of pattern parameter s, or null if not bound.
314 * @return a stream of matches represented as a Match object.
315 *
316 */
317 public Stream<MultipleConnectedTo.Match> streamAllMatches(final Segment pS) {
318 return rawStreamAllMatches(new Object[]{pS});
319 }
320
321 /**
322 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
323 * Neither determinism nor randomness of selection is guaranteed.
324 * @param pS the fixed value of pattern parameter s, or null if not bound.
325 * @return a match represented as a Match object, or null if no match is found.
326 *
327 */
328 public Optional<MultipleConnectedTo.Match> getOneArbitraryMatch(final Segment pS) {
329 return rawGetOneArbitraryMatch(new Object[]{pS});
330 }
331
332 /**
333 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
334 * under any possible substitution of the unspecified parameters (if any).
335 * @param pS the fixed value of pattern parameter s, or null if not bound.
336 * @return true if the input is a valid (partial) match of the pattern.
337 *
338 */
339 public boolean hasMatch(final Segment pS) {
340 return rawHasMatch(new Object[]{pS});
341 }
342
343 /**
344 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
345 * @param pS the fixed value of pattern parameter s, or null if not bound.
346 * @return the number of pattern matches found.
347 *
348 */
349 public int countMatches(final Segment pS) {
350 return rawCountMatches(new Object[]{pS});
351 }
352
353 /**
354 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
355 * Neither determinism nor randomness of selection is guaranteed.
356 * @param pS the fixed value of pattern parameter s, or null if not bound.
357 * @param processor the action that will process the selected match.
358 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
359 *
360 */
361 public boolean forOneArbitraryMatch(final Segment pS, final Consumer<? super MultipleConnectedTo.Match> processor) {
362 return rawForOneArbitraryMatch(new Object[]{pS}, processor);
363 }
364
365 /**
366 * Returns a new (partial) match.
367 * This can be used e.g. to call the matcher with a partial match.
368 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
369 * @param pS the fixed value of pattern parameter s, or null if not bound.
370 * @return the (partial) match object.
371 *
372 */
373 public MultipleConnectedTo.Match newMatch(final Segment pS) {
374 return MultipleConnectedTo.Match.newMatch(pS);
375 }
376
377 /**
378 * Retrieve the set of values that occur in matches for s.
379 * @return the Set of all values or empty set if there are no matches
380 *
381 */
382 protected Stream<Segment> rawStreamAllValuesOfs(final Object[] parameters) {
383 return rawStreamAllValues(POSITION_S, parameters).map(Segment.class::cast);
384 }
385
386 /**
387 * Retrieve the set of values that occur in matches for s.
388 * @return the Set of all values or empty set if there are no matches
389 *
390 */
391 public Set<Segment> getAllValuesOfs() {
392 return rawStreamAllValuesOfs(emptyArray()).collect(Collectors.toSet());
393 }
394
395 /**
396 * Retrieve the set of values that occur in matches for s.
397 * @return the Set of all values or empty set if there are no matches
398 *
399 */
400 public Stream<Segment> streamAllValuesOfs() {
401 return rawStreamAllValuesOfs(emptyArray());
402 }
403
404 @Override
405 protected MultipleConnectedTo.Match tupleToMatch(final Tuple t) {
406 try {
407 return MultipleConnectedTo.Match.newMatch((Segment) t.get(POSITION_S));
408 } catch(ClassCastException e) {
409 LOGGER.error("Element(s) in tuple not properly typed!",e);
410 return null;
411 }
412 }
413
414 @Override
415 protected MultipleConnectedTo.Match arrayToMatch(final Object[] match) {
416 try {
417 return MultipleConnectedTo.Match.newMatch((Segment) match[POSITION_S]);
418 } catch(ClassCastException e) {
419 LOGGER.error("Element(s) in array not properly typed!",e);
420 return null;
421 }
422 }
423
424 @Override
425 protected MultipleConnectedTo.Match arrayToMatchMutable(final Object[] match) {
426 try {
427 return MultipleConnectedTo.Match.newMutableMatch((Segment) match[POSITION_S]);
428 } catch(ClassCastException e) {
429 LOGGER.error("Element(s) in array not properly typed!",e);
430 return null;
431 }
432 }
433
434 /**
435 * @return the singleton instance of the query specification of this pattern
436 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
437 *
438 */
439 public static IQuerySpecification<MultipleConnectedTo.Matcher> querySpecification() {
440 return MultipleConnectedTo.instance();
441 }
442 }
443
444 private MultipleConnectedTo() {
445 super(GeneratedPQuery.INSTANCE);
446 }
447
448 /**
449 * @return the singleton instance of the query specification
450 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
451 *
452 */
453 public static MultipleConnectedTo instance() {
454 try{
455 return LazyHolder.INSTANCE;
456 } catch (ExceptionInInitializerError err) {
457 throw processInitializerError(err);
458 }
459 }
460
461 @Override
462 protected MultipleConnectedTo.Matcher instantiate(final ViatraQueryEngine engine) {
463 return MultipleConnectedTo.Matcher.on(engine);
464 }
465
466 @Override
467 public MultipleConnectedTo.Matcher instantiate() {
468 return MultipleConnectedTo.Matcher.create();
469 }
470
471 @Override
472 public MultipleConnectedTo.Match newEmptyMatch() {
473 return MultipleConnectedTo.Match.newEmptyMatch();
474 }
475
476 @Override
477 public MultipleConnectedTo.Match newMatch(final Object... parameters) {
478 return MultipleConnectedTo.Match.newMatch((modes3.Segment) parameters[0]);
479 }
480
481 /**
482 * Inner class allowing the singleton instance of {@link MultipleConnectedTo} to be created
483 * <b>not</b> at the class load time of the outer class,
484 * but rather at the first call to {@link MultipleConnectedTo#instance()}.
485 *
486 * <p> This workaround is required e.g. to support recursion.
487 *
488 */
489 private static class LazyHolder {
490 private static final MultipleConnectedTo INSTANCE = new MultipleConnectedTo();
491
492 /**
493 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
494 * This initialization order is required to support indirect recursion.
495 *
496 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
497 *
498 */
499 private static final Object STATIC_INITIALIZER = ensureInitialized();
500
501 public static Object ensureInitialized() {
502 INSTANCE.ensureInitializedInternal();
503 return null;
504 }
505 }
506
507 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
508 private static final MultipleConnectedTo.GeneratedPQuery INSTANCE = new GeneratedPQuery();
509
510 private final PParameter parameter_s = new PParameter("s", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
511
512 private final List<PParameter> parameters = Arrays.asList(parameter_s);
513
514 private GeneratedPQuery() {
515 super(PVisibility.PUBLIC);
516 }
517
518 @Override
519 public String getFullyQualifiedName() {
520 return "modes3.queries.multipleConnectedTo";
521 }
522
523 @Override
524 public List<String> getParameterNames() {
525 return Arrays.asList("s");
526 }
527
528 @Override
529 public List<PParameter> getParameters() {
530 return parameters;
531 }
532
533 @Override
534 public Set<PBody> doGetContainedBodies() {
535 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
536 Set<PBody> bodies = new LinkedHashSet<>();
537 {
538 PBody body = new PBody(this);
539 PVariable var_s = body.getOrCreateVariableByName("s");
540 PVariable var_n1 = body.getOrCreateVariableByName("n1");
541 PVariable var_n2 = body.getOrCreateVariableByName("n2");
542 new TypeConstraint(body, Tuples.flatTupleOf(var_s), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
543 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
544 new ExportedParameter(body, var_s, parameter_s)
545 ));
546 // Segment.connectedTo(s, n1)
547 new TypeConstraint(body, Tuples.flatTupleOf(var_s), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
548 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
549 new TypeConstraint(body, Tuples.flatTupleOf(var_s, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo")));
550 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
551 new Equality(body, var__virtual_0_, var_n1);
552 // Segment.connectedTo(s, n2)
553 new TypeConstraint(body, Tuples.flatTupleOf(var_s), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
554 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
555 new TypeConstraint(body, Tuples.flatTupleOf(var_s, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo")));
556 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
557 new Equality(body, var__virtual_1_, var_n2);
558 // n1 != n2
559 new Inequality(body, var_n1, var_n2);
560 bodies.add(body);
561 }
562 return bodies;
563 }
564 }
565}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Output.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Output.java
new file mode 100644
index 00000000..615b33af
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Output.java
@@ -0,0 +1,724 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import modes3.queries.TurnoutOutput;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
29import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
31import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
41import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
42
43/**
44 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
45 *
46 * <p>Original source:
47 * <code><pre>
48 * pattern output(S1 : Segment, S2 : Segment) {
49 * Segment.connectedTo(S1, S2);
50 * } or {
51 * find turnoutOutput(S1, S2);
52 * }
53 * </pre></code>
54 *
55 * @see Matcher
56 * @see Match
57 *
58 */
59@SuppressWarnings("all")
60public final class Output extends BaseGeneratedEMFQuerySpecification<Output.Matcher> {
61 /**
62 * Pattern-specific match representation of the modes3.queries.output pattern,
63 * to be used in conjunction with {@link Matcher}.
64 *
65 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
66 * Each instance is a (possibly partial) substitution of pattern parameters,
67 * usable to represent a match of the pattern in the result of a query,
68 * or to specify the bound (fixed) input parameters when issuing a query.
69 *
70 * @see Matcher
71 *
72 */
73 public static abstract class Match extends BasePatternMatch {
74 private Segment fS1;
75
76 private Segment fS2;
77
78 private static List<String> parameterNames = makeImmutableList("S1", "S2");
79
80 private Match(final Segment pS1, final Segment pS2) {
81 this.fS1 = pS1;
82 this.fS2 = pS2;
83 }
84
85 @Override
86 public Object get(final String parameterName) {
87 switch(parameterName) {
88 case "S1": return this.fS1;
89 case "S2": return this.fS2;
90 default: return null;
91 }
92 }
93
94 @Override
95 public Object get(final int index) {
96 switch(index) {
97 case 0: return this.fS1;
98 case 1: return this.fS2;
99 default: return null;
100 }
101 }
102
103 public Segment getS1() {
104 return this.fS1;
105 }
106
107 public Segment getS2() {
108 return this.fS2;
109 }
110
111 @Override
112 public boolean set(final String parameterName, final Object newValue) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 if ("S1".equals(parameterName) ) {
115 this.fS1 = (Segment) newValue;
116 return true;
117 }
118 if ("S2".equals(parameterName) ) {
119 this.fS2 = (Segment) newValue;
120 return true;
121 }
122 return false;
123 }
124
125 public void setS1(final Segment pS1) {
126 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
127 this.fS1 = pS1;
128 }
129
130 public void setS2(final Segment pS2) {
131 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
132 this.fS2 = pS2;
133 }
134
135 @Override
136 public String patternName() {
137 return "modes3.queries.output";
138 }
139
140 @Override
141 public List<String> parameterNames() {
142 return Output.Match.parameterNames;
143 }
144
145 @Override
146 public Object[] toArray() {
147 return new Object[]{fS1, fS2};
148 }
149
150 @Override
151 public Output.Match toImmutable() {
152 return isMutable() ? newMatch(fS1, fS2) : this;
153 }
154
155 @Override
156 public String prettyPrint() {
157 StringBuilder result = new StringBuilder();
158 result.append("\"S1\"=" + prettyPrintValue(fS1) + ", ");
159 result.append("\"S2\"=" + prettyPrintValue(fS2));
160 return result.toString();
161 }
162
163 @Override
164 public int hashCode() {
165 return Objects.hash(fS1, fS2);
166 }
167
168 @Override
169 public boolean equals(final Object obj) {
170 if (this == obj)
171 return true;
172 if (obj == null) {
173 return false;
174 }
175 if ((obj instanceof Output.Match)) {
176 Output.Match other = (Output.Match) obj;
177 return Objects.equals(fS1, other.fS1) && Objects.equals(fS2, other.fS2);
178 } else {
179 // this should be infrequent
180 if (!(obj instanceof IPatternMatch)) {
181 return false;
182 }
183 IPatternMatch otherSig = (IPatternMatch) obj;
184 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
185 }
186 }
187
188 @Override
189 public Output specification() {
190 return Output.instance();
191 }
192
193 /**
194 * Returns an empty, mutable match.
195 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
196 *
197 * @return the empty match.
198 *
199 */
200 public static Output.Match newEmptyMatch() {
201 return new Mutable(null, null);
202 }
203
204 /**
205 * Returns a mutable (partial) match.
206 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
207 *
208 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
209 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
210 * @return the new, mutable (partial) match object.
211 *
212 */
213 public static Output.Match newMutableMatch(final Segment pS1, final Segment pS2) {
214 return new Mutable(pS1, pS2);
215 }
216
217 /**
218 * Returns a new (partial) match.
219 * This can be used e.g. to call the matcher with a partial match.
220 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
221 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
222 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
223 * @return the (partial) match object.
224 *
225 */
226 public static Output.Match newMatch(final Segment pS1, final Segment pS2) {
227 return new Immutable(pS1, pS2);
228 }
229
230 private static final class Mutable extends Output.Match {
231 Mutable(final Segment pS1, final Segment pS2) {
232 super(pS1, pS2);
233 }
234
235 @Override
236 public boolean isMutable() {
237 return true;
238 }
239 }
240
241 private static final class Immutable extends Output.Match {
242 Immutable(final Segment pS1, final Segment pS2) {
243 super(pS1, pS2);
244 }
245
246 @Override
247 public boolean isMutable() {
248 return false;
249 }
250 }
251 }
252
253 /**
254 * Generated pattern matcher API of the modes3.queries.output pattern,
255 * providing pattern-specific query methods.
256 *
257 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
258 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
259 *
260 * <p>Matches of the pattern will be represented as {@link Match}.
261 *
262 * <p>Original source:
263 * <code><pre>
264 * pattern output(S1 : Segment, S2 : Segment) {
265 * Segment.connectedTo(S1, S2);
266 * } or {
267 * find turnoutOutput(S1, S2);
268 * }
269 * </pre></code>
270 *
271 * @see Match
272 * @see Output
273 *
274 */
275 public static class Matcher extends BaseMatcher<Output.Match> {
276 /**
277 * Initializes the pattern matcher within an existing VIATRA Query engine.
278 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
279 *
280 * @param engine the existing VIATRA Query engine in which this matcher will be created.
281 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
282 *
283 */
284 public static Output.Matcher on(final ViatraQueryEngine engine) {
285 // check if matcher already exists
286 Matcher matcher = engine.getExistingMatcher(querySpecification());
287 if (matcher == null) {
288 matcher = (Matcher)engine.getMatcher(querySpecification());
289 }
290 return matcher;
291 }
292
293 /**
294 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
295 * @return an initialized matcher
296 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
297 *
298 */
299 public static Output.Matcher create() {
300 return new Matcher();
301 }
302
303 private static final int POSITION_S1 = 0;
304
305 private static final int POSITION_S2 = 1;
306
307 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Output.Matcher.class);
308
309 /**
310 * Initializes the pattern matcher within an existing VIATRA Query engine.
311 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
312 *
313 * @param engine the existing VIATRA Query engine in which this matcher will be created.
314 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
315 *
316 */
317 private Matcher() {
318 super(querySpecification());
319 }
320
321 /**
322 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
323 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
324 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
325 * @return matches represented as a Match object.
326 *
327 */
328 public Collection<Output.Match> getAllMatches(final Segment pS1, final Segment pS2) {
329 return rawStreamAllMatches(new Object[]{pS1, pS2}).collect(Collectors.toSet());
330 }
331
332 /**
333 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
334 * </p>
335 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
336 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
337 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
338 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
339 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
340 * @return a stream of matches represented as a Match object.
341 *
342 */
343 public Stream<Output.Match> streamAllMatches(final Segment pS1, final Segment pS2) {
344 return rawStreamAllMatches(new Object[]{pS1, pS2});
345 }
346
347 /**
348 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
349 * Neither determinism nor randomness of selection is guaranteed.
350 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
351 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
352 * @return a match represented as a Match object, or null if no match is found.
353 *
354 */
355 public Optional<Output.Match> getOneArbitraryMatch(final Segment pS1, final Segment pS2) {
356 return rawGetOneArbitraryMatch(new Object[]{pS1, pS2});
357 }
358
359 /**
360 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
361 * under any possible substitution of the unspecified parameters (if any).
362 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
363 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
364 * @return true if the input is a valid (partial) match of the pattern.
365 *
366 */
367 public boolean hasMatch(final Segment pS1, final Segment pS2) {
368 return rawHasMatch(new Object[]{pS1, pS2});
369 }
370
371 /**
372 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
373 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
374 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
375 * @return the number of pattern matches found.
376 *
377 */
378 public int countMatches(final Segment pS1, final Segment pS2) {
379 return rawCountMatches(new Object[]{pS1, pS2});
380 }
381
382 /**
383 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
384 * Neither determinism nor randomness of selection is guaranteed.
385 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
386 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
387 * @param processor the action that will process the selected match.
388 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
389 *
390 */
391 public boolean forOneArbitraryMatch(final Segment pS1, final Segment pS2, final Consumer<? super Output.Match> processor) {
392 return rawForOneArbitraryMatch(new Object[]{pS1, pS2}, processor);
393 }
394
395 /**
396 * Returns a new (partial) match.
397 * This can be used e.g. to call the matcher with a partial match.
398 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
399 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
400 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
401 * @return the (partial) match object.
402 *
403 */
404 public Output.Match newMatch(final Segment pS1, final Segment pS2) {
405 return Output.Match.newMatch(pS1, pS2);
406 }
407
408 /**
409 * Retrieve the set of values that occur in matches for S1.
410 * @return the Set of all values or empty set if there are no matches
411 *
412 */
413 protected Stream<Segment> rawStreamAllValuesOfS1(final Object[] parameters) {
414 return rawStreamAllValues(POSITION_S1, parameters).map(Segment.class::cast);
415 }
416
417 /**
418 * Retrieve the set of values that occur in matches for S1.
419 * @return the Set of all values or empty set if there are no matches
420 *
421 */
422 public Set<Segment> getAllValuesOfS1() {
423 return rawStreamAllValuesOfS1(emptyArray()).collect(Collectors.toSet());
424 }
425
426 /**
427 * Retrieve the set of values that occur in matches for S1.
428 * @return the Set of all values or empty set if there are no matches
429 *
430 */
431 public Stream<Segment> streamAllValuesOfS1() {
432 return rawStreamAllValuesOfS1(emptyArray());
433 }
434
435 /**
436 * Retrieve the set of values that occur in matches for S1.
437 * </p>
438 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
439 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
440 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
441 *
442 * @return the Stream of all values or empty set if there are no matches
443 *
444 */
445 public Stream<Segment> streamAllValuesOfS1(final Output.Match partialMatch) {
446 return rawStreamAllValuesOfS1(partialMatch.toArray());
447 }
448
449 /**
450 * Retrieve the set of values that occur in matches for S1.
451 * </p>
452 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
453 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
454 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
455 *
456 * @return the Stream of all values or empty set if there are no matches
457 *
458 */
459 public Stream<Segment> streamAllValuesOfS1(final Segment pS2) {
460 return rawStreamAllValuesOfS1(new Object[]{null, pS2});
461 }
462
463 /**
464 * Retrieve the set of values that occur in matches for S1.
465 * @return the Set of all values or empty set if there are no matches
466 *
467 */
468 public Set<Segment> getAllValuesOfS1(final Output.Match partialMatch) {
469 return rawStreamAllValuesOfS1(partialMatch.toArray()).collect(Collectors.toSet());
470 }
471
472 /**
473 * Retrieve the set of values that occur in matches for S1.
474 * @return the Set of all values or empty set if there are no matches
475 *
476 */
477 public Set<Segment> getAllValuesOfS1(final Segment pS2) {
478 return rawStreamAllValuesOfS1(new Object[]{null, pS2}).collect(Collectors.toSet());
479 }
480
481 /**
482 * Retrieve the set of values that occur in matches for S2.
483 * @return the Set of all values or empty set if there are no matches
484 *
485 */
486 protected Stream<Segment> rawStreamAllValuesOfS2(final Object[] parameters) {
487 return rawStreamAllValues(POSITION_S2, parameters).map(Segment.class::cast);
488 }
489
490 /**
491 * Retrieve the set of values that occur in matches for S2.
492 * @return the Set of all values or empty set if there are no matches
493 *
494 */
495 public Set<Segment> getAllValuesOfS2() {
496 return rawStreamAllValuesOfS2(emptyArray()).collect(Collectors.toSet());
497 }
498
499 /**
500 * Retrieve the set of values that occur in matches for S2.
501 * @return the Set of all values or empty set if there are no matches
502 *
503 */
504 public Stream<Segment> streamAllValuesOfS2() {
505 return rawStreamAllValuesOfS2(emptyArray());
506 }
507
508 /**
509 * Retrieve the set of values that occur in matches for S2.
510 * </p>
511 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
512 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
513 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
514 *
515 * @return the Stream of all values or empty set if there are no matches
516 *
517 */
518 public Stream<Segment> streamAllValuesOfS2(final Output.Match partialMatch) {
519 return rawStreamAllValuesOfS2(partialMatch.toArray());
520 }
521
522 /**
523 * Retrieve the set of values that occur in matches for S2.
524 * </p>
525 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
526 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
527 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
528 *
529 * @return the Stream of all values or empty set if there are no matches
530 *
531 */
532 public Stream<Segment> streamAllValuesOfS2(final Segment pS1) {
533 return rawStreamAllValuesOfS2(new Object[]{pS1, null});
534 }
535
536 /**
537 * Retrieve the set of values that occur in matches for S2.
538 * @return the Set of all values or empty set if there are no matches
539 *
540 */
541 public Set<Segment> getAllValuesOfS2(final Output.Match partialMatch) {
542 return rawStreamAllValuesOfS2(partialMatch.toArray()).collect(Collectors.toSet());
543 }
544
545 /**
546 * Retrieve the set of values that occur in matches for S2.
547 * @return the Set of all values or empty set if there are no matches
548 *
549 */
550 public Set<Segment> getAllValuesOfS2(final Segment pS1) {
551 return rawStreamAllValuesOfS2(new Object[]{pS1, null}).collect(Collectors.toSet());
552 }
553
554 @Override
555 protected Output.Match tupleToMatch(final Tuple t) {
556 try {
557 return Output.Match.newMatch((Segment) t.get(POSITION_S1), (Segment) t.get(POSITION_S2));
558 } catch(ClassCastException e) {
559 LOGGER.error("Element(s) in tuple not properly typed!",e);
560 return null;
561 }
562 }
563
564 @Override
565 protected Output.Match arrayToMatch(final Object[] match) {
566 try {
567 return Output.Match.newMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
568 } catch(ClassCastException e) {
569 LOGGER.error("Element(s) in array not properly typed!",e);
570 return null;
571 }
572 }
573
574 @Override
575 protected Output.Match arrayToMatchMutable(final Object[] match) {
576 try {
577 return Output.Match.newMutableMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
578 } catch(ClassCastException e) {
579 LOGGER.error("Element(s) in array not properly typed!",e);
580 return null;
581 }
582 }
583
584 /**
585 * @return the singleton instance of the query specification of this pattern
586 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
587 *
588 */
589 public static IQuerySpecification<Output.Matcher> querySpecification() {
590 return Output.instance();
591 }
592 }
593
594 private Output() {
595 super(GeneratedPQuery.INSTANCE);
596 }
597
598 /**
599 * @return the singleton instance of the query specification
600 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
601 *
602 */
603 public static Output instance() {
604 try{
605 return LazyHolder.INSTANCE;
606 } catch (ExceptionInInitializerError err) {
607 throw processInitializerError(err);
608 }
609 }
610
611 @Override
612 protected Output.Matcher instantiate(final ViatraQueryEngine engine) {
613 return Output.Matcher.on(engine);
614 }
615
616 @Override
617 public Output.Matcher instantiate() {
618 return Output.Matcher.create();
619 }
620
621 @Override
622 public Output.Match newEmptyMatch() {
623 return Output.Match.newEmptyMatch();
624 }
625
626 @Override
627 public Output.Match newMatch(final Object... parameters) {
628 return Output.Match.newMatch((modes3.Segment) parameters[0], (modes3.Segment) parameters[1]);
629 }
630
631 /**
632 * Inner class allowing the singleton instance of {@link Output} to be created
633 * <b>not</b> at the class load time of the outer class,
634 * but rather at the first call to {@link Output#instance()}.
635 *
636 * <p> This workaround is required e.g. to support recursion.
637 *
638 */
639 private static class LazyHolder {
640 private static final Output INSTANCE = new Output();
641
642 /**
643 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
644 * This initialization order is required to support indirect recursion.
645 *
646 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
647 *
648 */
649 private static final Object STATIC_INITIALIZER = ensureInitialized();
650
651 public static Object ensureInitialized() {
652 INSTANCE.ensureInitializedInternal();
653 return null;
654 }
655 }
656
657 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
658 private static final Output.GeneratedPQuery INSTANCE = new GeneratedPQuery();
659
660 private final PParameter parameter_S1 = new PParameter("S1", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
661
662 private final PParameter parameter_S2 = new PParameter("S2", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
663
664 private final List<PParameter> parameters = Arrays.asList(parameter_S1, parameter_S2);
665
666 private GeneratedPQuery() {
667 super(PVisibility.PUBLIC);
668 }
669
670 @Override
671 public String getFullyQualifiedName() {
672 return "modes3.queries.output";
673 }
674
675 @Override
676 public List<String> getParameterNames() {
677 return Arrays.asList("S1","S2");
678 }
679
680 @Override
681 public List<PParameter> getParameters() {
682 return parameters;
683 }
684
685 @Override
686 public Set<PBody> doGetContainedBodies() {
687 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
688 Set<PBody> bodies = new LinkedHashSet<>();
689 {
690 PBody body = new PBody(this);
691 PVariable var_S1 = body.getOrCreateVariableByName("S1");
692 PVariable var_S2 = body.getOrCreateVariableByName("S2");
693 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
694 new TypeConstraint(body, Tuples.flatTupleOf(var_S2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
695 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
696 new ExportedParameter(body, var_S1, parameter_S1),
697 new ExportedParameter(body, var_S2, parameter_S2)
698 ));
699 // Segment.connectedTo(S1, S2)
700 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
701 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
702 new TypeConstraint(body, Tuples.flatTupleOf(var_S1, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo")));
703 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
704 new Equality(body, var__virtual_0_, var_S2);
705 bodies.add(body);
706 }
707 {
708 PBody body = new PBody(this);
709 PVariable var_S1 = body.getOrCreateVariableByName("S1");
710 PVariable var_S2 = body.getOrCreateVariableByName("S2");
711 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
712 new TypeConstraint(body, Tuples.flatTupleOf(var_S2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
713 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
714 new ExportedParameter(body, var_S1, parameter_S1),
715 new ExportedParameter(body, var_S2, parameter_S2)
716 ));
717 // find turnoutOutput(S1, S2)
718 new PositivePatternCall(body, Tuples.flatTupleOf(var_S1, var_S2), TurnoutOutput.instance().getInternalQueryRepresentation());
719 bodies.add(body);
720 }
721 return bodies;
722 }
723 }
724}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/OutputReflexive.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/OutputReflexive.java
new file mode 100644
index 00000000..3d90ede5
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/OutputReflexive.java
@@ -0,0 +1,559 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Turnout;
17import modes3.queries.TurnoutOutput;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
32import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
41import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
42
43/**
44 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
45 *
46 * <p>Original source:
47 * <code><pre>
48 * {@literal @}Constraint(message = "outputReflexive", severity = "error", key = { T })
49 * pattern outputReflexive(T : Turnout) {
50 * find turnoutOutput(T, T);
51 * }
52 * </pre></code>
53 *
54 * @see Matcher
55 * @see Match
56 *
57 */
58@SuppressWarnings("all")
59public final class OutputReflexive extends BaseGeneratedEMFQuerySpecification<OutputReflexive.Matcher> {
60 /**
61 * Pattern-specific match representation of the modes3.queries.outputReflexive pattern,
62 * to be used in conjunction with {@link Matcher}.
63 *
64 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
65 * Each instance is a (possibly partial) substitution of pattern parameters,
66 * usable to represent a match of the pattern in the result of a query,
67 * or to specify the bound (fixed) input parameters when issuing a query.
68 *
69 * @see Matcher
70 *
71 */
72 public static abstract class Match extends BasePatternMatch {
73 private Turnout fT;
74
75 private static List<String> parameterNames = makeImmutableList("T");
76
77 private Match(final Turnout pT) {
78 this.fT = pT;
79 }
80
81 @Override
82 public Object get(final String parameterName) {
83 switch(parameterName) {
84 case "T": return this.fT;
85 default: return null;
86 }
87 }
88
89 @Override
90 public Object get(final int index) {
91 switch(index) {
92 case 0: return this.fT;
93 default: return null;
94 }
95 }
96
97 public Turnout getT() {
98 return this.fT;
99 }
100
101 @Override
102 public boolean set(final String parameterName, final Object newValue) {
103 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
104 if ("T".equals(parameterName) ) {
105 this.fT = (Turnout) newValue;
106 return true;
107 }
108 return false;
109 }
110
111 public void setT(final Turnout pT) {
112 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
113 this.fT = pT;
114 }
115
116 @Override
117 public String patternName() {
118 return "modes3.queries.outputReflexive";
119 }
120
121 @Override
122 public List<String> parameterNames() {
123 return OutputReflexive.Match.parameterNames;
124 }
125
126 @Override
127 public Object[] toArray() {
128 return new Object[]{fT};
129 }
130
131 @Override
132 public OutputReflexive.Match toImmutable() {
133 return isMutable() ? newMatch(fT) : this;
134 }
135
136 @Override
137 public String prettyPrint() {
138 StringBuilder result = new StringBuilder();
139 result.append("\"T\"=" + prettyPrintValue(fT));
140 return result.toString();
141 }
142
143 @Override
144 public int hashCode() {
145 return Objects.hash(fT);
146 }
147
148 @Override
149 public boolean equals(final Object obj) {
150 if (this == obj)
151 return true;
152 if (obj == null) {
153 return false;
154 }
155 if ((obj instanceof OutputReflexive.Match)) {
156 OutputReflexive.Match other = (OutputReflexive.Match) obj;
157 return Objects.equals(fT, other.fT);
158 } else {
159 // this should be infrequent
160 if (!(obj instanceof IPatternMatch)) {
161 return false;
162 }
163 IPatternMatch otherSig = (IPatternMatch) obj;
164 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
165 }
166 }
167
168 @Override
169 public OutputReflexive specification() {
170 return OutputReflexive.instance();
171 }
172
173 /**
174 * Returns an empty, mutable match.
175 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
176 *
177 * @return the empty match.
178 *
179 */
180 public static OutputReflexive.Match newEmptyMatch() {
181 return new Mutable(null);
182 }
183
184 /**
185 * Returns a mutable (partial) match.
186 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
187 *
188 * @param pT the fixed value of pattern parameter T, or null if not bound.
189 * @return the new, mutable (partial) match object.
190 *
191 */
192 public static OutputReflexive.Match newMutableMatch(final Turnout pT) {
193 return new Mutable(pT);
194 }
195
196 /**
197 * Returns a new (partial) match.
198 * This can be used e.g. to call the matcher with a partial match.
199 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
200 * @param pT the fixed value of pattern parameter T, or null if not bound.
201 * @return the (partial) match object.
202 *
203 */
204 public static OutputReflexive.Match newMatch(final Turnout pT) {
205 return new Immutable(pT);
206 }
207
208 private static final class Mutable extends OutputReflexive.Match {
209 Mutable(final Turnout pT) {
210 super(pT);
211 }
212
213 @Override
214 public boolean isMutable() {
215 return true;
216 }
217 }
218
219 private static final class Immutable extends OutputReflexive.Match {
220 Immutable(final Turnout pT) {
221 super(pT);
222 }
223
224 @Override
225 public boolean isMutable() {
226 return false;
227 }
228 }
229 }
230
231 /**
232 * Generated pattern matcher API of the modes3.queries.outputReflexive pattern,
233 * providing pattern-specific query methods.
234 *
235 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
236 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
237 *
238 * <p>Matches of the pattern will be represented as {@link Match}.
239 *
240 * <p>Original source:
241 * <code><pre>
242 * {@literal @}Constraint(message = "outputReflexive", severity = "error", key = { T })
243 * pattern outputReflexive(T : Turnout) {
244 * find turnoutOutput(T, T);
245 * }
246 * </pre></code>
247 *
248 * @see Match
249 * @see OutputReflexive
250 *
251 */
252 public static class Matcher extends BaseMatcher<OutputReflexive.Match> {
253 /**
254 * Initializes the pattern matcher within an existing VIATRA Query engine.
255 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
256 *
257 * @param engine the existing VIATRA Query engine in which this matcher will be created.
258 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
259 *
260 */
261 public static OutputReflexive.Matcher on(final ViatraQueryEngine engine) {
262 // check if matcher already exists
263 Matcher matcher = engine.getExistingMatcher(querySpecification());
264 if (matcher == null) {
265 matcher = (Matcher)engine.getMatcher(querySpecification());
266 }
267 return matcher;
268 }
269
270 /**
271 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
272 * @return an initialized matcher
273 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
274 *
275 */
276 public static OutputReflexive.Matcher create() {
277 return new Matcher();
278 }
279
280 private static final int POSITION_T = 0;
281
282 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(OutputReflexive.Matcher.class);
283
284 /**
285 * Initializes the pattern matcher within an existing VIATRA Query engine.
286 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
287 *
288 * @param engine the existing VIATRA Query engine in which this matcher will be created.
289 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
290 *
291 */
292 private Matcher() {
293 super(querySpecification());
294 }
295
296 /**
297 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
298 * @param pT the fixed value of pattern parameter T, or null if not bound.
299 * @return matches represented as a Match object.
300 *
301 */
302 public Collection<OutputReflexive.Match> getAllMatches(final Turnout pT) {
303 return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet());
304 }
305
306 /**
307 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
308 * </p>
309 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
310 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
311 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
312 * @param pT the fixed value of pattern parameter T, or null if not bound.
313 * @return a stream of matches represented as a Match object.
314 *
315 */
316 public Stream<OutputReflexive.Match> streamAllMatches(final Turnout pT) {
317 return rawStreamAllMatches(new Object[]{pT});
318 }
319
320 /**
321 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
322 * Neither determinism nor randomness of selection is guaranteed.
323 * @param pT the fixed value of pattern parameter T, or null if not bound.
324 * @return a match represented as a Match object, or null if no match is found.
325 *
326 */
327 public Optional<OutputReflexive.Match> getOneArbitraryMatch(final Turnout pT) {
328 return rawGetOneArbitraryMatch(new Object[]{pT});
329 }
330
331 /**
332 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
333 * under any possible substitution of the unspecified parameters (if any).
334 * @param pT the fixed value of pattern parameter T, or null if not bound.
335 * @return true if the input is a valid (partial) match of the pattern.
336 *
337 */
338 public boolean hasMatch(final Turnout pT) {
339 return rawHasMatch(new Object[]{pT});
340 }
341
342 /**
343 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
344 * @param pT the fixed value of pattern parameter T, or null if not bound.
345 * @return the number of pattern matches found.
346 *
347 */
348 public int countMatches(final Turnout pT) {
349 return rawCountMatches(new Object[]{pT});
350 }
351
352 /**
353 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
354 * Neither determinism nor randomness of selection is guaranteed.
355 * @param pT the fixed value of pattern parameter T, or null if not bound.
356 * @param processor the action that will process the selected match.
357 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
358 *
359 */
360 public boolean forOneArbitraryMatch(final Turnout pT, final Consumer<? super OutputReflexive.Match> processor) {
361 return rawForOneArbitraryMatch(new Object[]{pT}, processor);
362 }
363
364 /**
365 * Returns a new (partial) match.
366 * This can be used e.g. to call the matcher with a partial match.
367 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
368 * @param pT the fixed value of pattern parameter T, or null if not bound.
369 * @return the (partial) match object.
370 *
371 */
372 public OutputReflexive.Match newMatch(final Turnout pT) {
373 return OutputReflexive.Match.newMatch(pT);
374 }
375
376 /**
377 * Retrieve the set of values that occur in matches for T.
378 * @return the Set of all values or empty set if there are no matches
379 *
380 */
381 protected Stream<Turnout> rawStreamAllValuesOfT(final Object[] parameters) {
382 return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast);
383 }
384
385 /**
386 * Retrieve the set of values that occur in matches for T.
387 * @return the Set of all values or empty set if there are no matches
388 *
389 */
390 public Set<Turnout> getAllValuesOfT() {
391 return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet());
392 }
393
394 /**
395 * Retrieve the set of values that occur in matches for T.
396 * @return the Set of all values or empty set if there are no matches
397 *
398 */
399 public Stream<Turnout> streamAllValuesOfT() {
400 return rawStreamAllValuesOfT(emptyArray());
401 }
402
403 @Override
404 protected OutputReflexive.Match tupleToMatch(final Tuple t) {
405 try {
406 return OutputReflexive.Match.newMatch((Turnout) t.get(POSITION_T));
407 } catch(ClassCastException e) {
408 LOGGER.error("Element(s) in tuple not properly typed!",e);
409 return null;
410 }
411 }
412
413 @Override
414 protected OutputReflexive.Match arrayToMatch(final Object[] match) {
415 try {
416 return OutputReflexive.Match.newMatch((Turnout) match[POSITION_T]);
417 } catch(ClassCastException e) {
418 LOGGER.error("Element(s) in array not properly typed!",e);
419 return null;
420 }
421 }
422
423 @Override
424 protected OutputReflexive.Match arrayToMatchMutable(final Object[] match) {
425 try {
426 return OutputReflexive.Match.newMutableMatch((Turnout) match[POSITION_T]);
427 } catch(ClassCastException e) {
428 LOGGER.error("Element(s) in array not properly typed!",e);
429 return null;
430 }
431 }
432
433 /**
434 * @return the singleton instance of the query specification of this pattern
435 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
436 *
437 */
438 public static IQuerySpecification<OutputReflexive.Matcher> querySpecification() {
439 return OutputReflexive.instance();
440 }
441 }
442
443 private OutputReflexive() {
444 super(GeneratedPQuery.INSTANCE);
445 }
446
447 /**
448 * @return the singleton instance of the query specification
449 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
450 *
451 */
452 public static OutputReflexive instance() {
453 try{
454 return LazyHolder.INSTANCE;
455 } catch (ExceptionInInitializerError err) {
456 throw processInitializerError(err);
457 }
458 }
459
460 @Override
461 protected OutputReflexive.Matcher instantiate(final ViatraQueryEngine engine) {
462 return OutputReflexive.Matcher.on(engine);
463 }
464
465 @Override
466 public OutputReflexive.Matcher instantiate() {
467 return OutputReflexive.Matcher.create();
468 }
469
470 @Override
471 public OutputReflexive.Match newEmptyMatch() {
472 return OutputReflexive.Match.newEmptyMatch();
473 }
474
475 @Override
476 public OutputReflexive.Match newMatch(final Object... parameters) {
477 return OutputReflexive.Match.newMatch((modes3.Turnout) parameters[0]);
478 }
479
480 /**
481 * Inner class allowing the singleton instance of {@link OutputReflexive} to be created
482 * <b>not</b> at the class load time of the outer class,
483 * but rather at the first call to {@link OutputReflexive#instance()}.
484 *
485 * <p> This workaround is required e.g. to support recursion.
486 *
487 */
488 private static class LazyHolder {
489 private static final OutputReflexive INSTANCE = new OutputReflexive();
490
491 /**
492 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
493 * This initialization order is required to support indirect recursion.
494 *
495 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
496 *
497 */
498 private static final Object STATIC_INITIALIZER = ensureInitialized();
499
500 public static Object ensureInitialized() {
501 INSTANCE.ensureInitializedInternal();
502 return null;
503 }
504 }
505
506 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
507 private static final OutputReflexive.GeneratedPQuery INSTANCE = new GeneratedPQuery();
508
509 private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT);
510
511 private final List<PParameter> parameters = Arrays.asList(parameter_T);
512
513 private GeneratedPQuery() {
514 super(PVisibility.PUBLIC);
515 }
516
517 @Override
518 public String getFullyQualifiedName() {
519 return "modes3.queries.outputReflexive";
520 }
521
522 @Override
523 public List<String> getParameterNames() {
524 return Arrays.asList("T");
525 }
526
527 @Override
528 public List<PParameter> getParameters() {
529 return parameters;
530 }
531
532 @Override
533 public Set<PBody> doGetContainedBodies() {
534 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
535 Set<PBody> bodies = new LinkedHashSet<>();
536 {
537 PBody body = new PBody(this);
538 PVariable var_T = body.getOrCreateVariableByName("T");
539 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
540 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
541 new ExportedParameter(body, var_T, parameter_T)
542 ));
543 // find turnoutOutput(T, T)
544 new PositivePatternCall(body, Tuples.flatTupleOf(var_T, var_T), TurnoutOutput.instance().getInternalQueryRepresentation());
545 bodies.add(body);
546 }
547 {
548 PAnnotation annotation = new PAnnotation("Constraint");
549 annotation.addAttribute("message", "outputReflexive");
550 annotation.addAttribute("severity", "error");
551 annotation.addAttribute("key", Arrays.asList(new Object[] {
552 new ParameterReference("T")
553 }));
554 addAnnotation(annotation);
555 }
556 return bodies;
557 }
558 }
559}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Reachable.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Reachable.java
new file mode 100644
index 00000000..93d43c21
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Reachable.java
@@ -0,0 +1,719 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import modes3.queries.Adjacent;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.BinaryTransitiveClosure;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
40import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
41
42/**
43 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
44 *
45 * <p>Original source:
46 * <code><pre>
47 * pattern reachable(S1 : Segment, S2 : Segment) {
48 * S1 == S2;
49 * } or {
50 * find adjacent+(S1, S2);
51 * }
52 * </pre></code>
53 *
54 * @see Matcher
55 * @see Match
56 *
57 */
58@SuppressWarnings("all")
59public final class Reachable extends BaseGeneratedEMFQuerySpecification<Reachable.Matcher> {
60 /**
61 * Pattern-specific match representation of the modes3.queries.reachable pattern,
62 * to be used in conjunction with {@link Matcher}.
63 *
64 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
65 * Each instance is a (possibly partial) substitution of pattern parameters,
66 * usable to represent a match of the pattern in the result of a query,
67 * or to specify the bound (fixed) input parameters when issuing a query.
68 *
69 * @see Matcher
70 *
71 */
72 public static abstract class Match extends BasePatternMatch {
73 private Segment fS1;
74
75 private Segment fS2;
76
77 private static List<String> parameterNames = makeImmutableList("S1", "S2");
78
79 private Match(final Segment pS1, final Segment pS2) {
80 this.fS1 = pS1;
81 this.fS2 = pS2;
82 }
83
84 @Override
85 public Object get(final String parameterName) {
86 switch(parameterName) {
87 case "S1": return this.fS1;
88 case "S2": return this.fS2;
89 default: return null;
90 }
91 }
92
93 @Override
94 public Object get(final int index) {
95 switch(index) {
96 case 0: return this.fS1;
97 case 1: return this.fS2;
98 default: return null;
99 }
100 }
101
102 public Segment getS1() {
103 return this.fS1;
104 }
105
106 public Segment getS2() {
107 return this.fS2;
108 }
109
110 @Override
111 public boolean set(final String parameterName, final Object newValue) {
112 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
113 if ("S1".equals(parameterName) ) {
114 this.fS1 = (Segment) newValue;
115 return true;
116 }
117 if ("S2".equals(parameterName) ) {
118 this.fS2 = (Segment) newValue;
119 return true;
120 }
121 return false;
122 }
123
124 public void setS1(final Segment pS1) {
125 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
126 this.fS1 = pS1;
127 }
128
129 public void setS2(final Segment pS2) {
130 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
131 this.fS2 = pS2;
132 }
133
134 @Override
135 public String patternName() {
136 return "modes3.queries.reachable";
137 }
138
139 @Override
140 public List<String> parameterNames() {
141 return Reachable.Match.parameterNames;
142 }
143
144 @Override
145 public Object[] toArray() {
146 return new Object[]{fS1, fS2};
147 }
148
149 @Override
150 public Reachable.Match toImmutable() {
151 return isMutable() ? newMatch(fS1, fS2) : this;
152 }
153
154 @Override
155 public String prettyPrint() {
156 StringBuilder result = new StringBuilder();
157 result.append("\"S1\"=" + prettyPrintValue(fS1) + ", ");
158 result.append("\"S2\"=" + prettyPrintValue(fS2));
159 return result.toString();
160 }
161
162 @Override
163 public int hashCode() {
164 return Objects.hash(fS1, fS2);
165 }
166
167 @Override
168 public boolean equals(final Object obj) {
169 if (this == obj)
170 return true;
171 if (obj == null) {
172 return false;
173 }
174 if ((obj instanceof Reachable.Match)) {
175 Reachable.Match other = (Reachable.Match) obj;
176 return Objects.equals(fS1, other.fS1) && Objects.equals(fS2, other.fS2);
177 } else {
178 // this should be infrequent
179 if (!(obj instanceof IPatternMatch)) {
180 return false;
181 }
182 IPatternMatch otherSig = (IPatternMatch) obj;
183 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
184 }
185 }
186
187 @Override
188 public Reachable specification() {
189 return Reachable.instance();
190 }
191
192 /**
193 * Returns an empty, mutable match.
194 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
195 *
196 * @return the empty match.
197 *
198 */
199 public static Reachable.Match newEmptyMatch() {
200 return new Mutable(null, null);
201 }
202
203 /**
204 * Returns a mutable (partial) match.
205 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
206 *
207 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
208 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
209 * @return the new, mutable (partial) match object.
210 *
211 */
212 public static Reachable.Match newMutableMatch(final Segment pS1, final Segment pS2) {
213 return new Mutable(pS1, pS2);
214 }
215
216 /**
217 * Returns a new (partial) match.
218 * This can be used e.g. to call the matcher with a partial match.
219 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
220 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
221 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
222 * @return the (partial) match object.
223 *
224 */
225 public static Reachable.Match newMatch(final Segment pS1, final Segment pS2) {
226 return new Immutable(pS1, pS2);
227 }
228
229 private static final class Mutable extends Reachable.Match {
230 Mutable(final Segment pS1, final Segment pS2) {
231 super(pS1, pS2);
232 }
233
234 @Override
235 public boolean isMutable() {
236 return true;
237 }
238 }
239
240 private static final class Immutable extends Reachable.Match {
241 Immutable(final Segment pS1, final Segment pS2) {
242 super(pS1, pS2);
243 }
244
245 @Override
246 public boolean isMutable() {
247 return false;
248 }
249 }
250 }
251
252 /**
253 * Generated pattern matcher API of the modes3.queries.reachable pattern,
254 * providing pattern-specific query methods.
255 *
256 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
257 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
258 *
259 * <p>Matches of the pattern will be represented as {@link Match}.
260 *
261 * <p>Original source:
262 * <code><pre>
263 * pattern reachable(S1 : Segment, S2 : Segment) {
264 * S1 == S2;
265 * } or {
266 * find adjacent+(S1, S2);
267 * }
268 * </pre></code>
269 *
270 * @see Match
271 * @see Reachable
272 *
273 */
274 public static class Matcher extends BaseMatcher<Reachable.Match> {
275 /**
276 * Initializes the pattern matcher within an existing VIATRA Query engine.
277 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
278 *
279 * @param engine the existing VIATRA Query engine in which this matcher will be created.
280 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
281 *
282 */
283 public static Reachable.Matcher on(final ViatraQueryEngine engine) {
284 // check if matcher already exists
285 Matcher matcher = engine.getExistingMatcher(querySpecification());
286 if (matcher == null) {
287 matcher = (Matcher)engine.getMatcher(querySpecification());
288 }
289 return matcher;
290 }
291
292 /**
293 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
294 * @return an initialized matcher
295 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
296 *
297 */
298 public static Reachable.Matcher create() {
299 return new Matcher();
300 }
301
302 private static final int POSITION_S1 = 0;
303
304 private static final int POSITION_S2 = 1;
305
306 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Reachable.Matcher.class);
307
308 /**
309 * Initializes the pattern matcher within an existing VIATRA Query engine.
310 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
311 *
312 * @param engine the existing VIATRA Query engine in which this matcher will be created.
313 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
314 *
315 */
316 private Matcher() {
317 super(querySpecification());
318 }
319
320 /**
321 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
322 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
323 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
324 * @return matches represented as a Match object.
325 *
326 */
327 public Collection<Reachable.Match> getAllMatches(final Segment pS1, final Segment pS2) {
328 return rawStreamAllMatches(new Object[]{pS1, pS2}).collect(Collectors.toSet());
329 }
330
331 /**
332 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
333 * </p>
334 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
335 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
336 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
337 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
338 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
339 * @return a stream of matches represented as a Match object.
340 *
341 */
342 public Stream<Reachable.Match> streamAllMatches(final Segment pS1, final Segment pS2) {
343 return rawStreamAllMatches(new Object[]{pS1, pS2});
344 }
345
346 /**
347 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
348 * Neither determinism nor randomness of selection is guaranteed.
349 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
350 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
351 * @return a match represented as a Match object, or null if no match is found.
352 *
353 */
354 public Optional<Reachable.Match> getOneArbitraryMatch(final Segment pS1, final Segment pS2) {
355 return rawGetOneArbitraryMatch(new Object[]{pS1, pS2});
356 }
357
358 /**
359 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
360 * under any possible substitution of the unspecified parameters (if any).
361 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
362 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
363 * @return true if the input is a valid (partial) match of the pattern.
364 *
365 */
366 public boolean hasMatch(final Segment pS1, final Segment pS2) {
367 return rawHasMatch(new Object[]{pS1, pS2});
368 }
369
370 /**
371 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
372 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
373 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
374 * @return the number of pattern matches found.
375 *
376 */
377 public int countMatches(final Segment pS1, final Segment pS2) {
378 return rawCountMatches(new Object[]{pS1, pS2});
379 }
380
381 /**
382 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
383 * Neither determinism nor randomness of selection is guaranteed.
384 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
385 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
386 * @param processor the action that will process the selected match.
387 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
388 *
389 */
390 public boolean forOneArbitraryMatch(final Segment pS1, final Segment pS2, final Consumer<? super Reachable.Match> processor) {
391 return rawForOneArbitraryMatch(new Object[]{pS1, pS2}, processor);
392 }
393
394 /**
395 * Returns a new (partial) match.
396 * This can be used e.g. to call the matcher with a partial match.
397 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
398 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
399 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
400 * @return the (partial) match object.
401 *
402 */
403 public Reachable.Match newMatch(final Segment pS1, final Segment pS2) {
404 return Reachable.Match.newMatch(pS1, pS2);
405 }
406
407 /**
408 * Retrieve the set of values that occur in matches for S1.
409 * @return the Set of all values or empty set if there are no matches
410 *
411 */
412 protected Stream<Segment> rawStreamAllValuesOfS1(final Object[] parameters) {
413 return rawStreamAllValues(POSITION_S1, parameters).map(Segment.class::cast);
414 }
415
416 /**
417 * Retrieve the set of values that occur in matches for S1.
418 * @return the Set of all values or empty set if there are no matches
419 *
420 */
421 public Set<Segment> getAllValuesOfS1() {
422 return rawStreamAllValuesOfS1(emptyArray()).collect(Collectors.toSet());
423 }
424
425 /**
426 * Retrieve the set of values that occur in matches for S1.
427 * @return the Set of all values or empty set if there are no matches
428 *
429 */
430 public Stream<Segment> streamAllValuesOfS1() {
431 return rawStreamAllValuesOfS1(emptyArray());
432 }
433
434 /**
435 * Retrieve the set of values that occur in matches for S1.
436 * </p>
437 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
438 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
439 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
440 *
441 * @return the Stream of all values or empty set if there are no matches
442 *
443 */
444 public Stream<Segment> streamAllValuesOfS1(final Reachable.Match partialMatch) {
445 return rawStreamAllValuesOfS1(partialMatch.toArray());
446 }
447
448 /**
449 * Retrieve the set of values that occur in matches for S1.
450 * </p>
451 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
452 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
453 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
454 *
455 * @return the Stream of all values or empty set if there are no matches
456 *
457 */
458 public Stream<Segment> streamAllValuesOfS1(final Segment pS2) {
459 return rawStreamAllValuesOfS1(new Object[]{null, pS2});
460 }
461
462 /**
463 * Retrieve the set of values that occur in matches for S1.
464 * @return the Set of all values or empty set if there are no matches
465 *
466 */
467 public Set<Segment> getAllValuesOfS1(final Reachable.Match partialMatch) {
468 return rawStreamAllValuesOfS1(partialMatch.toArray()).collect(Collectors.toSet());
469 }
470
471 /**
472 * Retrieve the set of values that occur in matches for S1.
473 * @return the Set of all values or empty set if there are no matches
474 *
475 */
476 public Set<Segment> getAllValuesOfS1(final Segment pS2) {
477 return rawStreamAllValuesOfS1(new Object[]{null, pS2}).collect(Collectors.toSet());
478 }
479
480 /**
481 * Retrieve the set of values that occur in matches for S2.
482 * @return the Set of all values or empty set if there are no matches
483 *
484 */
485 protected Stream<Segment> rawStreamAllValuesOfS2(final Object[] parameters) {
486 return rawStreamAllValues(POSITION_S2, parameters).map(Segment.class::cast);
487 }
488
489 /**
490 * Retrieve the set of values that occur in matches for S2.
491 * @return the Set of all values or empty set if there are no matches
492 *
493 */
494 public Set<Segment> getAllValuesOfS2() {
495 return rawStreamAllValuesOfS2(emptyArray()).collect(Collectors.toSet());
496 }
497
498 /**
499 * Retrieve the set of values that occur in matches for S2.
500 * @return the Set of all values or empty set if there are no matches
501 *
502 */
503 public Stream<Segment> streamAllValuesOfS2() {
504 return rawStreamAllValuesOfS2(emptyArray());
505 }
506
507 /**
508 * Retrieve the set of values that occur in matches for S2.
509 * </p>
510 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
511 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
512 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
513 *
514 * @return the Stream of all values or empty set if there are no matches
515 *
516 */
517 public Stream<Segment> streamAllValuesOfS2(final Reachable.Match partialMatch) {
518 return rawStreamAllValuesOfS2(partialMatch.toArray());
519 }
520
521 /**
522 * Retrieve the set of values that occur in matches for S2.
523 * </p>
524 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
525 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
526 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
527 *
528 * @return the Stream of all values or empty set if there are no matches
529 *
530 */
531 public Stream<Segment> streamAllValuesOfS2(final Segment pS1) {
532 return rawStreamAllValuesOfS2(new Object[]{pS1, null});
533 }
534
535 /**
536 * Retrieve the set of values that occur in matches for S2.
537 * @return the Set of all values or empty set if there are no matches
538 *
539 */
540 public Set<Segment> getAllValuesOfS2(final Reachable.Match partialMatch) {
541 return rawStreamAllValuesOfS2(partialMatch.toArray()).collect(Collectors.toSet());
542 }
543
544 /**
545 * Retrieve the set of values that occur in matches for S2.
546 * @return the Set of all values or empty set if there are no matches
547 *
548 */
549 public Set<Segment> getAllValuesOfS2(final Segment pS1) {
550 return rawStreamAllValuesOfS2(new Object[]{pS1, null}).collect(Collectors.toSet());
551 }
552
553 @Override
554 protected Reachable.Match tupleToMatch(final Tuple t) {
555 try {
556 return Reachable.Match.newMatch((Segment) t.get(POSITION_S1), (Segment) t.get(POSITION_S2));
557 } catch(ClassCastException e) {
558 LOGGER.error("Element(s) in tuple not properly typed!",e);
559 return null;
560 }
561 }
562
563 @Override
564 protected Reachable.Match arrayToMatch(final Object[] match) {
565 try {
566 return Reachable.Match.newMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
567 } catch(ClassCastException e) {
568 LOGGER.error("Element(s) in array not properly typed!",e);
569 return null;
570 }
571 }
572
573 @Override
574 protected Reachable.Match arrayToMatchMutable(final Object[] match) {
575 try {
576 return Reachable.Match.newMutableMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
577 } catch(ClassCastException e) {
578 LOGGER.error("Element(s) in array not properly typed!",e);
579 return null;
580 }
581 }
582
583 /**
584 * @return the singleton instance of the query specification of this pattern
585 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
586 *
587 */
588 public static IQuerySpecification<Reachable.Matcher> querySpecification() {
589 return Reachable.instance();
590 }
591 }
592
593 private Reachable() {
594 super(GeneratedPQuery.INSTANCE);
595 }
596
597 /**
598 * @return the singleton instance of the query specification
599 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
600 *
601 */
602 public static Reachable instance() {
603 try{
604 return LazyHolder.INSTANCE;
605 } catch (ExceptionInInitializerError err) {
606 throw processInitializerError(err);
607 }
608 }
609
610 @Override
611 protected Reachable.Matcher instantiate(final ViatraQueryEngine engine) {
612 return Reachable.Matcher.on(engine);
613 }
614
615 @Override
616 public Reachable.Matcher instantiate() {
617 return Reachable.Matcher.create();
618 }
619
620 @Override
621 public Reachable.Match newEmptyMatch() {
622 return Reachable.Match.newEmptyMatch();
623 }
624
625 @Override
626 public Reachable.Match newMatch(final Object... parameters) {
627 return Reachable.Match.newMatch((modes3.Segment) parameters[0], (modes3.Segment) parameters[1]);
628 }
629
630 /**
631 * Inner class allowing the singleton instance of {@link Reachable} to be created
632 * <b>not</b> at the class load time of the outer class,
633 * but rather at the first call to {@link Reachable#instance()}.
634 *
635 * <p> This workaround is required e.g. to support recursion.
636 *
637 */
638 private static class LazyHolder {
639 private static final Reachable INSTANCE = new Reachable();
640
641 /**
642 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
643 * This initialization order is required to support indirect recursion.
644 *
645 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
646 *
647 */
648 private static final Object STATIC_INITIALIZER = ensureInitialized();
649
650 public static Object ensureInitialized() {
651 INSTANCE.ensureInitializedInternal();
652 return null;
653 }
654 }
655
656 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
657 private static final Reachable.GeneratedPQuery INSTANCE = new GeneratedPQuery();
658
659 private final PParameter parameter_S1 = new PParameter("S1", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
660
661 private final PParameter parameter_S2 = new PParameter("S2", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
662
663 private final List<PParameter> parameters = Arrays.asList(parameter_S1, parameter_S2);
664
665 private GeneratedPQuery() {
666 super(PVisibility.PUBLIC);
667 }
668
669 @Override
670 public String getFullyQualifiedName() {
671 return "modes3.queries.reachable";
672 }
673
674 @Override
675 public List<String> getParameterNames() {
676 return Arrays.asList("S1","S2");
677 }
678
679 @Override
680 public List<PParameter> getParameters() {
681 return parameters;
682 }
683
684 @Override
685 public Set<PBody> doGetContainedBodies() {
686 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
687 Set<PBody> bodies = new LinkedHashSet<>();
688 {
689 PBody body = new PBody(this);
690 PVariable var_S1 = body.getOrCreateVariableByName("S1");
691 PVariable var_S2 = body.getOrCreateVariableByName("S2");
692 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
693 new TypeConstraint(body, Tuples.flatTupleOf(var_S2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
694 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
695 new ExportedParameter(body, var_S1, parameter_S1),
696 new ExportedParameter(body, var_S2, parameter_S2)
697 ));
698 // S1 == S2
699 new Equality(body, var_S1, var_S2);
700 bodies.add(body);
701 }
702 {
703 PBody body = new PBody(this);
704 PVariable var_S1 = body.getOrCreateVariableByName("S1");
705 PVariable var_S2 = body.getOrCreateVariableByName("S2");
706 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
707 new TypeConstraint(body, Tuples.flatTupleOf(var_S2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
708 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
709 new ExportedParameter(body, var_S1, parameter_S1),
710 new ExportedParameter(body, var_S2, parameter_S2)
711 ));
712 // find adjacent+(S1, S2)
713 new BinaryTransitiveClosure(body, Tuples.flatTupleOf(var_S1, var_S2), Adjacent.instance().getInternalQueryRepresentation());
714 bodies.add(body);
715 }
716 return bodies;
717 }
718 }
719}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooFewInputsOfTurnout.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooFewInputsOfTurnout.java
new file mode 100644
index 00000000..088640ca
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooFewInputsOfTurnout.java
@@ -0,0 +1,559 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Turnout;
17import modes3.queries.InputsOfTurnout;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
32import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
41import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
42
43/**
44 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
45 *
46 * <p>Original source:
47 * <code><pre>
48 * {@literal @}Constraint(message = "tooFewInputsOfTurnout", severity = "error", key = { T })
49 * pattern tooFewInputsOfTurnout(T : Turnout) {
50 * neg find inputsOfTurnout(T);
51 * }
52 * </pre></code>
53 *
54 * @see Matcher
55 * @see Match
56 *
57 */
58@SuppressWarnings("all")
59public final class TooFewInputsOfTurnout extends BaseGeneratedEMFQuerySpecification<TooFewInputsOfTurnout.Matcher> {
60 /**
61 * Pattern-specific match representation of the modes3.queries.tooFewInputsOfTurnout pattern,
62 * to be used in conjunction with {@link Matcher}.
63 *
64 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
65 * Each instance is a (possibly partial) substitution of pattern parameters,
66 * usable to represent a match of the pattern in the result of a query,
67 * or to specify the bound (fixed) input parameters when issuing a query.
68 *
69 * @see Matcher
70 *
71 */
72 public static abstract class Match extends BasePatternMatch {
73 private Turnout fT;
74
75 private static List<String> parameterNames = makeImmutableList("T");
76
77 private Match(final Turnout pT) {
78 this.fT = pT;
79 }
80
81 @Override
82 public Object get(final String parameterName) {
83 switch(parameterName) {
84 case "T": return this.fT;
85 default: return null;
86 }
87 }
88
89 @Override
90 public Object get(final int index) {
91 switch(index) {
92 case 0: return this.fT;
93 default: return null;
94 }
95 }
96
97 public Turnout getT() {
98 return this.fT;
99 }
100
101 @Override
102 public boolean set(final String parameterName, final Object newValue) {
103 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
104 if ("T".equals(parameterName) ) {
105 this.fT = (Turnout) newValue;
106 return true;
107 }
108 return false;
109 }
110
111 public void setT(final Turnout pT) {
112 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
113 this.fT = pT;
114 }
115
116 @Override
117 public String patternName() {
118 return "modes3.queries.tooFewInputsOfTurnout";
119 }
120
121 @Override
122 public List<String> parameterNames() {
123 return TooFewInputsOfTurnout.Match.parameterNames;
124 }
125
126 @Override
127 public Object[] toArray() {
128 return new Object[]{fT};
129 }
130
131 @Override
132 public TooFewInputsOfTurnout.Match toImmutable() {
133 return isMutable() ? newMatch(fT) : this;
134 }
135
136 @Override
137 public String prettyPrint() {
138 StringBuilder result = new StringBuilder();
139 result.append("\"T\"=" + prettyPrintValue(fT));
140 return result.toString();
141 }
142
143 @Override
144 public int hashCode() {
145 return Objects.hash(fT);
146 }
147
148 @Override
149 public boolean equals(final Object obj) {
150 if (this == obj)
151 return true;
152 if (obj == null) {
153 return false;
154 }
155 if ((obj instanceof TooFewInputsOfTurnout.Match)) {
156 TooFewInputsOfTurnout.Match other = (TooFewInputsOfTurnout.Match) obj;
157 return Objects.equals(fT, other.fT);
158 } else {
159 // this should be infrequent
160 if (!(obj instanceof IPatternMatch)) {
161 return false;
162 }
163 IPatternMatch otherSig = (IPatternMatch) obj;
164 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
165 }
166 }
167
168 @Override
169 public TooFewInputsOfTurnout specification() {
170 return TooFewInputsOfTurnout.instance();
171 }
172
173 /**
174 * Returns an empty, mutable match.
175 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
176 *
177 * @return the empty match.
178 *
179 */
180 public static TooFewInputsOfTurnout.Match newEmptyMatch() {
181 return new Mutable(null);
182 }
183
184 /**
185 * Returns a mutable (partial) match.
186 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
187 *
188 * @param pT the fixed value of pattern parameter T, or null if not bound.
189 * @return the new, mutable (partial) match object.
190 *
191 */
192 public static TooFewInputsOfTurnout.Match newMutableMatch(final Turnout pT) {
193 return new Mutable(pT);
194 }
195
196 /**
197 * Returns a new (partial) match.
198 * This can be used e.g. to call the matcher with a partial match.
199 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
200 * @param pT the fixed value of pattern parameter T, or null if not bound.
201 * @return the (partial) match object.
202 *
203 */
204 public static TooFewInputsOfTurnout.Match newMatch(final Turnout pT) {
205 return new Immutable(pT);
206 }
207
208 private static final class Mutable extends TooFewInputsOfTurnout.Match {
209 Mutable(final Turnout pT) {
210 super(pT);
211 }
212
213 @Override
214 public boolean isMutable() {
215 return true;
216 }
217 }
218
219 private static final class Immutable extends TooFewInputsOfTurnout.Match {
220 Immutable(final Turnout pT) {
221 super(pT);
222 }
223
224 @Override
225 public boolean isMutable() {
226 return false;
227 }
228 }
229 }
230
231 /**
232 * Generated pattern matcher API of the modes3.queries.tooFewInputsOfTurnout pattern,
233 * providing pattern-specific query methods.
234 *
235 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
236 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
237 *
238 * <p>Matches of the pattern will be represented as {@link Match}.
239 *
240 * <p>Original source:
241 * <code><pre>
242 * {@literal @}Constraint(message = "tooFewInputsOfTurnout", severity = "error", key = { T })
243 * pattern tooFewInputsOfTurnout(T : Turnout) {
244 * neg find inputsOfTurnout(T);
245 * }
246 * </pre></code>
247 *
248 * @see Match
249 * @see TooFewInputsOfTurnout
250 *
251 */
252 public static class Matcher extends BaseMatcher<TooFewInputsOfTurnout.Match> {
253 /**
254 * Initializes the pattern matcher within an existing VIATRA Query engine.
255 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
256 *
257 * @param engine the existing VIATRA Query engine in which this matcher will be created.
258 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
259 *
260 */
261 public static TooFewInputsOfTurnout.Matcher on(final ViatraQueryEngine engine) {
262 // check if matcher already exists
263 Matcher matcher = engine.getExistingMatcher(querySpecification());
264 if (matcher == null) {
265 matcher = (Matcher)engine.getMatcher(querySpecification());
266 }
267 return matcher;
268 }
269
270 /**
271 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
272 * @return an initialized matcher
273 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
274 *
275 */
276 public static TooFewInputsOfTurnout.Matcher create() {
277 return new Matcher();
278 }
279
280 private static final int POSITION_T = 0;
281
282 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TooFewInputsOfTurnout.Matcher.class);
283
284 /**
285 * Initializes the pattern matcher within an existing VIATRA Query engine.
286 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
287 *
288 * @param engine the existing VIATRA Query engine in which this matcher will be created.
289 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
290 *
291 */
292 private Matcher() {
293 super(querySpecification());
294 }
295
296 /**
297 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
298 * @param pT the fixed value of pattern parameter T, or null if not bound.
299 * @return matches represented as a Match object.
300 *
301 */
302 public Collection<TooFewInputsOfTurnout.Match> getAllMatches(final Turnout pT) {
303 return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet());
304 }
305
306 /**
307 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
308 * </p>
309 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
310 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
311 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
312 * @param pT the fixed value of pattern parameter T, or null if not bound.
313 * @return a stream of matches represented as a Match object.
314 *
315 */
316 public Stream<TooFewInputsOfTurnout.Match> streamAllMatches(final Turnout pT) {
317 return rawStreamAllMatches(new Object[]{pT});
318 }
319
320 /**
321 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
322 * Neither determinism nor randomness of selection is guaranteed.
323 * @param pT the fixed value of pattern parameter T, or null if not bound.
324 * @return a match represented as a Match object, or null if no match is found.
325 *
326 */
327 public Optional<TooFewInputsOfTurnout.Match> getOneArbitraryMatch(final Turnout pT) {
328 return rawGetOneArbitraryMatch(new Object[]{pT});
329 }
330
331 /**
332 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
333 * under any possible substitution of the unspecified parameters (if any).
334 * @param pT the fixed value of pattern parameter T, or null if not bound.
335 * @return true if the input is a valid (partial) match of the pattern.
336 *
337 */
338 public boolean hasMatch(final Turnout pT) {
339 return rawHasMatch(new Object[]{pT});
340 }
341
342 /**
343 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
344 * @param pT the fixed value of pattern parameter T, or null if not bound.
345 * @return the number of pattern matches found.
346 *
347 */
348 public int countMatches(final Turnout pT) {
349 return rawCountMatches(new Object[]{pT});
350 }
351
352 /**
353 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
354 * Neither determinism nor randomness of selection is guaranteed.
355 * @param pT the fixed value of pattern parameter T, or null if not bound.
356 * @param processor the action that will process the selected match.
357 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
358 *
359 */
360 public boolean forOneArbitraryMatch(final Turnout pT, final Consumer<? super TooFewInputsOfTurnout.Match> processor) {
361 return rawForOneArbitraryMatch(new Object[]{pT}, processor);
362 }
363
364 /**
365 * Returns a new (partial) match.
366 * This can be used e.g. to call the matcher with a partial match.
367 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
368 * @param pT the fixed value of pattern parameter T, or null if not bound.
369 * @return the (partial) match object.
370 *
371 */
372 public TooFewInputsOfTurnout.Match newMatch(final Turnout pT) {
373 return TooFewInputsOfTurnout.Match.newMatch(pT);
374 }
375
376 /**
377 * Retrieve the set of values that occur in matches for T.
378 * @return the Set of all values or empty set if there are no matches
379 *
380 */
381 protected Stream<Turnout> rawStreamAllValuesOfT(final Object[] parameters) {
382 return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast);
383 }
384
385 /**
386 * Retrieve the set of values that occur in matches for T.
387 * @return the Set of all values or empty set if there are no matches
388 *
389 */
390 public Set<Turnout> getAllValuesOfT() {
391 return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet());
392 }
393
394 /**
395 * Retrieve the set of values that occur in matches for T.
396 * @return the Set of all values or empty set if there are no matches
397 *
398 */
399 public Stream<Turnout> streamAllValuesOfT() {
400 return rawStreamAllValuesOfT(emptyArray());
401 }
402
403 @Override
404 protected TooFewInputsOfTurnout.Match tupleToMatch(final Tuple t) {
405 try {
406 return TooFewInputsOfTurnout.Match.newMatch((Turnout) t.get(POSITION_T));
407 } catch(ClassCastException e) {
408 LOGGER.error("Element(s) in tuple not properly typed!",e);
409 return null;
410 }
411 }
412
413 @Override
414 protected TooFewInputsOfTurnout.Match arrayToMatch(final Object[] match) {
415 try {
416 return TooFewInputsOfTurnout.Match.newMatch((Turnout) match[POSITION_T]);
417 } catch(ClassCastException e) {
418 LOGGER.error("Element(s) in array not properly typed!",e);
419 return null;
420 }
421 }
422
423 @Override
424 protected TooFewInputsOfTurnout.Match arrayToMatchMutable(final Object[] match) {
425 try {
426 return TooFewInputsOfTurnout.Match.newMutableMatch((Turnout) match[POSITION_T]);
427 } catch(ClassCastException e) {
428 LOGGER.error("Element(s) in array not properly typed!",e);
429 return null;
430 }
431 }
432
433 /**
434 * @return the singleton instance of the query specification of this pattern
435 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
436 *
437 */
438 public static IQuerySpecification<TooFewInputsOfTurnout.Matcher> querySpecification() {
439 return TooFewInputsOfTurnout.instance();
440 }
441 }
442
443 private TooFewInputsOfTurnout() {
444 super(GeneratedPQuery.INSTANCE);
445 }
446
447 /**
448 * @return the singleton instance of the query specification
449 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
450 *
451 */
452 public static TooFewInputsOfTurnout instance() {
453 try{
454 return LazyHolder.INSTANCE;
455 } catch (ExceptionInInitializerError err) {
456 throw processInitializerError(err);
457 }
458 }
459
460 @Override
461 protected TooFewInputsOfTurnout.Matcher instantiate(final ViatraQueryEngine engine) {
462 return TooFewInputsOfTurnout.Matcher.on(engine);
463 }
464
465 @Override
466 public TooFewInputsOfTurnout.Matcher instantiate() {
467 return TooFewInputsOfTurnout.Matcher.create();
468 }
469
470 @Override
471 public TooFewInputsOfTurnout.Match newEmptyMatch() {
472 return TooFewInputsOfTurnout.Match.newEmptyMatch();
473 }
474
475 @Override
476 public TooFewInputsOfTurnout.Match newMatch(final Object... parameters) {
477 return TooFewInputsOfTurnout.Match.newMatch((modes3.Turnout) parameters[0]);
478 }
479
480 /**
481 * Inner class allowing the singleton instance of {@link TooFewInputsOfTurnout} to be created
482 * <b>not</b> at the class load time of the outer class,
483 * but rather at the first call to {@link TooFewInputsOfTurnout#instance()}.
484 *
485 * <p> This workaround is required e.g. to support recursion.
486 *
487 */
488 private static class LazyHolder {
489 private static final TooFewInputsOfTurnout INSTANCE = new TooFewInputsOfTurnout();
490
491 /**
492 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
493 * This initialization order is required to support indirect recursion.
494 *
495 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
496 *
497 */
498 private static final Object STATIC_INITIALIZER = ensureInitialized();
499
500 public static Object ensureInitialized() {
501 INSTANCE.ensureInitializedInternal();
502 return null;
503 }
504 }
505
506 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
507 private static final TooFewInputsOfTurnout.GeneratedPQuery INSTANCE = new GeneratedPQuery();
508
509 private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT);
510
511 private final List<PParameter> parameters = Arrays.asList(parameter_T);
512
513 private GeneratedPQuery() {
514 super(PVisibility.PUBLIC);
515 }
516
517 @Override
518 public String getFullyQualifiedName() {
519 return "modes3.queries.tooFewInputsOfTurnout";
520 }
521
522 @Override
523 public List<String> getParameterNames() {
524 return Arrays.asList("T");
525 }
526
527 @Override
528 public List<PParameter> getParameters() {
529 return parameters;
530 }
531
532 @Override
533 public Set<PBody> doGetContainedBodies() {
534 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
535 Set<PBody> bodies = new LinkedHashSet<>();
536 {
537 PBody body = new PBody(this);
538 PVariable var_T = body.getOrCreateVariableByName("T");
539 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
540 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
541 new ExportedParameter(body, var_T, parameter_T)
542 ));
543 // neg find inputsOfTurnout(T)
544 new NegativePatternCall(body, Tuples.flatTupleOf(var_T), InputsOfTurnout.instance().getInternalQueryRepresentation());
545 bodies.add(body);
546 }
547 {
548 PAnnotation annotation = new PAnnotation("Constraint");
549 annotation.addAttribute("message", "tooFewInputsOfTurnout");
550 annotation.addAttribute("severity", "error");
551 annotation.addAttribute("key", Arrays.asList(new Object[] {
552 new ParameterReference("T")
553 }));
554 addAnnotation(annotation);
555 }
556 return bodies;
557 }
558 }
559}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java
new file mode 100644
index 00000000..d12ec23e
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java
@@ -0,0 +1,583 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.SimpleSegment;
17import modes3.queries.Output;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
32import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
39import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
41import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
42import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
43
44/**
45 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
46 *
47 * <p>Original source:
48 * <code><pre>
49 * {@literal @}Constraint(message = "tooManyInputsOfSegment", severity = "error", key = { S })
50 * pattern tooManyInputsOfSegment(S : SimpleSegment) {
51 * find output(I1, S);
52 * find output(I2, S);
53 * find output(I3, S);
54 * I1 != I2;
55 * I1 != I3;
56 * I2 != I3;
57 * }
58 * </pre></code>
59 *
60 * @see Matcher
61 * @see Match
62 *
63 */
64@SuppressWarnings("all")
65public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecification<TooManyInputsOfSegment.Matcher> {
66 /**
67 * Pattern-specific match representation of the modes3.queries.tooManyInputsOfSegment pattern,
68 * to be used in conjunction with {@link Matcher}.
69 *
70 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
71 * Each instance is a (possibly partial) substitution of pattern parameters,
72 * usable to represent a match of the pattern in the result of a query,
73 * or to specify the bound (fixed) input parameters when issuing a query.
74 *
75 * @see Matcher
76 *
77 */
78 public static abstract class Match extends BasePatternMatch {
79 private SimpleSegment fS;
80
81 private static List<String> parameterNames = makeImmutableList("S");
82
83 private Match(final SimpleSegment pS) {
84 this.fS = pS;
85 }
86
87 @Override
88 public Object get(final String parameterName) {
89 switch(parameterName) {
90 case "S": return this.fS;
91 default: return null;
92 }
93 }
94
95 @Override
96 public Object get(final int index) {
97 switch(index) {
98 case 0: return this.fS;
99 default: return null;
100 }
101 }
102
103 public SimpleSegment getS() {
104 return this.fS;
105 }
106
107 @Override
108 public boolean set(final String parameterName, final Object newValue) {
109 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
110 if ("S".equals(parameterName) ) {
111 this.fS = (SimpleSegment) newValue;
112 return true;
113 }
114 return false;
115 }
116
117 public void setS(final SimpleSegment pS) {
118 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
119 this.fS = pS;
120 }
121
122 @Override
123 public String patternName() {
124 return "modes3.queries.tooManyInputsOfSegment";
125 }
126
127 @Override
128 public List<String> parameterNames() {
129 return TooManyInputsOfSegment.Match.parameterNames;
130 }
131
132 @Override
133 public Object[] toArray() {
134 return new Object[]{fS};
135 }
136
137 @Override
138 public TooManyInputsOfSegment.Match toImmutable() {
139 return isMutable() ? newMatch(fS) : this;
140 }
141
142 @Override
143 public String prettyPrint() {
144 StringBuilder result = new StringBuilder();
145 result.append("\"S\"=" + prettyPrintValue(fS));
146 return result.toString();
147 }
148
149 @Override
150 public int hashCode() {
151 return Objects.hash(fS);
152 }
153
154 @Override
155 public boolean equals(final Object obj) {
156 if (this == obj)
157 return true;
158 if (obj == null) {
159 return false;
160 }
161 if ((obj instanceof TooManyInputsOfSegment.Match)) {
162 TooManyInputsOfSegment.Match other = (TooManyInputsOfSegment.Match) obj;
163 return Objects.equals(fS, other.fS);
164 } else {
165 // this should be infrequent
166 if (!(obj instanceof IPatternMatch)) {
167 return false;
168 }
169 IPatternMatch otherSig = (IPatternMatch) obj;
170 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
171 }
172 }
173
174 @Override
175 public TooManyInputsOfSegment specification() {
176 return TooManyInputsOfSegment.instance();
177 }
178
179 /**
180 * Returns an empty, mutable match.
181 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
182 *
183 * @return the empty match.
184 *
185 */
186 public static TooManyInputsOfSegment.Match newEmptyMatch() {
187 return new Mutable(null);
188 }
189
190 /**
191 * Returns a mutable (partial) match.
192 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
193 *
194 * @param pS the fixed value of pattern parameter S, or null if not bound.
195 * @return the new, mutable (partial) match object.
196 *
197 */
198 public static TooManyInputsOfSegment.Match newMutableMatch(final SimpleSegment pS) {
199 return new Mutable(pS);
200 }
201
202 /**
203 * Returns a new (partial) match.
204 * This can be used e.g. to call the matcher with a partial match.
205 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
206 * @param pS the fixed value of pattern parameter S, or null if not bound.
207 * @return the (partial) match object.
208 *
209 */
210 public static TooManyInputsOfSegment.Match newMatch(final SimpleSegment pS) {
211 return new Immutable(pS);
212 }
213
214 private static final class Mutable extends TooManyInputsOfSegment.Match {
215 Mutable(final SimpleSegment pS) {
216 super(pS);
217 }
218
219 @Override
220 public boolean isMutable() {
221 return true;
222 }
223 }
224
225 private static final class Immutable extends TooManyInputsOfSegment.Match {
226 Immutable(final SimpleSegment pS) {
227 super(pS);
228 }
229
230 @Override
231 public boolean isMutable() {
232 return false;
233 }
234 }
235 }
236
237 /**
238 * Generated pattern matcher API of the modes3.queries.tooManyInputsOfSegment pattern,
239 * providing pattern-specific query methods.
240 *
241 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
242 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
243 *
244 * <p>Matches of the pattern will be represented as {@link Match}.
245 *
246 * <p>Original source:
247 * <code><pre>
248 * {@literal @}Constraint(message = "tooManyInputsOfSegment", severity = "error", key = { S })
249 * pattern tooManyInputsOfSegment(S : SimpleSegment) {
250 * find output(I1, S);
251 * find output(I2, S);
252 * find output(I3, S);
253 * I1 != I2;
254 * I1 != I3;
255 * I2 != I3;
256 * }
257 * </pre></code>
258 *
259 * @see Match
260 * @see TooManyInputsOfSegment
261 *
262 */
263 public static class Matcher extends BaseMatcher<TooManyInputsOfSegment.Match> {
264 /**
265 * Initializes the pattern matcher within an existing VIATRA Query engine.
266 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
267 *
268 * @param engine the existing VIATRA Query engine in which this matcher will be created.
269 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
270 *
271 */
272 public static TooManyInputsOfSegment.Matcher on(final ViatraQueryEngine engine) {
273 // check if matcher already exists
274 Matcher matcher = engine.getExistingMatcher(querySpecification());
275 if (matcher == null) {
276 matcher = (Matcher)engine.getMatcher(querySpecification());
277 }
278 return matcher;
279 }
280
281 /**
282 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
283 * @return an initialized matcher
284 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
285 *
286 */
287 public static TooManyInputsOfSegment.Matcher create() {
288 return new Matcher();
289 }
290
291 private static final int POSITION_S = 0;
292
293 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TooManyInputsOfSegment.Matcher.class);
294
295 /**
296 * Initializes the pattern matcher within an existing VIATRA Query engine.
297 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
298 *
299 * @param engine the existing VIATRA Query engine in which this matcher will be created.
300 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
301 *
302 */
303 private Matcher() {
304 super(querySpecification());
305 }
306
307 /**
308 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
309 * @param pS the fixed value of pattern parameter S, or null if not bound.
310 * @return matches represented as a Match object.
311 *
312 */
313 public Collection<TooManyInputsOfSegment.Match> getAllMatches(final SimpleSegment pS) {
314 return rawStreamAllMatches(new Object[]{pS}).collect(Collectors.toSet());
315 }
316
317 /**
318 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
319 * </p>
320 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
321 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
322 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
323 * @param pS the fixed value of pattern parameter S, or null if not bound.
324 * @return a stream of matches represented as a Match object.
325 *
326 */
327 public Stream<TooManyInputsOfSegment.Match> streamAllMatches(final SimpleSegment pS) {
328 return rawStreamAllMatches(new Object[]{pS});
329 }
330
331 /**
332 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
333 * Neither determinism nor randomness of selection is guaranteed.
334 * @param pS the fixed value of pattern parameter S, or null if not bound.
335 * @return a match represented as a Match object, or null if no match is found.
336 *
337 */
338 public Optional<TooManyInputsOfSegment.Match> getOneArbitraryMatch(final SimpleSegment pS) {
339 return rawGetOneArbitraryMatch(new Object[]{pS});
340 }
341
342 /**
343 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
344 * under any possible substitution of the unspecified parameters (if any).
345 * @param pS the fixed value of pattern parameter S, or null if not bound.
346 * @return true if the input is a valid (partial) match of the pattern.
347 *
348 */
349 public boolean hasMatch(final SimpleSegment pS) {
350 return rawHasMatch(new Object[]{pS});
351 }
352
353 /**
354 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
355 * @param pS the fixed value of pattern parameter S, or null if not bound.
356 * @return the number of pattern matches found.
357 *
358 */
359 public int countMatches(final SimpleSegment pS) {
360 return rawCountMatches(new Object[]{pS});
361 }
362
363 /**
364 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
365 * Neither determinism nor randomness of selection is guaranteed.
366 * @param pS the fixed value of pattern parameter S, or null if not bound.
367 * @param processor the action that will process the selected match.
368 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
369 *
370 */
371 public boolean forOneArbitraryMatch(final SimpleSegment pS, final Consumer<? super TooManyInputsOfSegment.Match> processor) {
372 return rawForOneArbitraryMatch(new Object[]{pS}, processor);
373 }
374
375 /**
376 * Returns a new (partial) match.
377 * This can be used e.g. to call the matcher with a partial match.
378 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
379 * @param pS the fixed value of pattern parameter S, or null if not bound.
380 * @return the (partial) match object.
381 *
382 */
383 public TooManyInputsOfSegment.Match newMatch(final SimpleSegment pS) {
384 return TooManyInputsOfSegment.Match.newMatch(pS);
385 }
386
387 /**
388 * Retrieve the set of values that occur in matches for S.
389 * @return the Set of all values or empty set if there are no matches
390 *
391 */
392 protected Stream<SimpleSegment> rawStreamAllValuesOfS(final Object[] parameters) {
393 return rawStreamAllValues(POSITION_S, parameters).map(SimpleSegment.class::cast);
394 }
395
396 /**
397 * Retrieve the set of values that occur in matches for S.
398 * @return the Set of all values or empty set if there are no matches
399 *
400 */
401 public Set<SimpleSegment> getAllValuesOfS() {
402 return rawStreamAllValuesOfS(emptyArray()).collect(Collectors.toSet());
403 }
404
405 /**
406 * Retrieve the set of values that occur in matches for S.
407 * @return the Set of all values or empty set if there are no matches
408 *
409 */
410 public Stream<SimpleSegment> streamAllValuesOfS() {
411 return rawStreamAllValuesOfS(emptyArray());
412 }
413
414 @Override
415 protected TooManyInputsOfSegment.Match tupleToMatch(final Tuple t) {
416 try {
417 return TooManyInputsOfSegment.Match.newMatch((SimpleSegment) t.get(POSITION_S));
418 } catch(ClassCastException e) {
419 LOGGER.error("Element(s) in tuple not properly typed!",e);
420 return null;
421 }
422 }
423
424 @Override
425 protected TooManyInputsOfSegment.Match arrayToMatch(final Object[] match) {
426 try {
427 return TooManyInputsOfSegment.Match.newMatch((SimpleSegment) match[POSITION_S]);
428 } catch(ClassCastException e) {
429 LOGGER.error("Element(s) in array not properly typed!",e);
430 return null;
431 }
432 }
433
434 @Override
435 protected TooManyInputsOfSegment.Match arrayToMatchMutable(final Object[] match) {
436 try {
437 return TooManyInputsOfSegment.Match.newMutableMatch((SimpleSegment) match[POSITION_S]);
438 } catch(ClassCastException e) {
439 LOGGER.error("Element(s) in array not properly typed!",e);
440 return null;
441 }
442 }
443
444 /**
445 * @return the singleton instance of the query specification of this pattern
446 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
447 *
448 */
449 public static IQuerySpecification<TooManyInputsOfSegment.Matcher> querySpecification() {
450 return TooManyInputsOfSegment.instance();
451 }
452 }
453
454 private TooManyInputsOfSegment() {
455 super(GeneratedPQuery.INSTANCE);
456 }
457
458 /**
459 * @return the singleton instance of the query specification
460 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
461 *
462 */
463 public static TooManyInputsOfSegment instance() {
464 try{
465 return LazyHolder.INSTANCE;
466 } catch (ExceptionInInitializerError err) {
467 throw processInitializerError(err);
468 }
469 }
470
471 @Override
472 protected TooManyInputsOfSegment.Matcher instantiate(final ViatraQueryEngine engine) {
473 return TooManyInputsOfSegment.Matcher.on(engine);
474 }
475
476 @Override
477 public TooManyInputsOfSegment.Matcher instantiate() {
478 return TooManyInputsOfSegment.Matcher.create();
479 }
480
481 @Override
482 public TooManyInputsOfSegment.Match newEmptyMatch() {
483 return TooManyInputsOfSegment.Match.newEmptyMatch();
484 }
485
486 @Override
487 public TooManyInputsOfSegment.Match newMatch(final Object... parameters) {
488 return TooManyInputsOfSegment.Match.newMatch((modes3.SimpleSegment) parameters[0]);
489 }
490
491 /**
492 * Inner class allowing the singleton instance of {@link TooManyInputsOfSegment} to be created
493 * <b>not</b> at the class load time of the outer class,
494 * but rather at the first call to {@link TooManyInputsOfSegment#instance()}.
495 *
496 * <p> This workaround is required e.g. to support recursion.
497 *
498 */
499 private static class LazyHolder {
500 private static final TooManyInputsOfSegment INSTANCE = new TooManyInputsOfSegment();
501
502 /**
503 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
504 * This initialization order is required to support indirect recursion.
505 *
506 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
507 *
508 */
509 private static final Object STATIC_INITIALIZER = ensureInitialized();
510
511 public static Object ensureInitialized() {
512 INSTANCE.ensureInitializedInternal();
513 return null;
514 }
515 }
516
517 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
518 private static final TooManyInputsOfSegment.GeneratedPQuery INSTANCE = new GeneratedPQuery();
519
520 private final PParameter parameter_S = new PParameter("S", "modes3.SimpleSegment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "SimpleSegment")), PParameterDirection.INOUT);
521
522 private final List<PParameter> parameters = Arrays.asList(parameter_S);
523
524 private GeneratedPQuery() {
525 super(PVisibility.PUBLIC);
526 }
527
528 @Override
529 public String getFullyQualifiedName() {
530 return "modes3.queries.tooManyInputsOfSegment";
531 }
532
533 @Override
534 public List<String> getParameterNames() {
535 return Arrays.asList("S");
536 }
537
538 @Override
539 public List<PParameter> getParameters() {
540 return parameters;
541 }
542
543 @Override
544 public Set<PBody> doGetContainedBodies() {
545 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
546 Set<PBody> bodies = new LinkedHashSet<>();
547 {
548 PBody body = new PBody(this);
549 PVariable var_S = body.getOrCreateVariableByName("S");
550 PVariable var_I1 = body.getOrCreateVariableByName("I1");
551 PVariable var_I2 = body.getOrCreateVariableByName("I2");
552 PVariable var_I3 = body.getOrCreateVariableByName("I3");
553 new TypeConstraint(body, Tuples.flatTupleOf(var_S), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "SimpleSegment")));
554 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
555 new ExportedParameter(body, var_S, parameter_S)
556 ));
557 // find output(I1, S)
558 new PositivePatternCall(body, Tuples.flatTupleOf(var_I1, var_S), Output.instance().getInternalQueryRepresentation());
559 // find output(I2, S)
560 new PositivePatternCall(body, Tuples.flatTupleOf(var_I2, var_S), Output.instance().getInternalQueryRepresentation());
561 // find output(I3, S)
562 new PositivePatternCall(body, Tuples.flatTupleOf(var_I3, var_S), Output.instance().getInternalQueryRepresentation());
563 // I1 != I2
564 new Inequality(body, var_I1, var_I2);
565 // I1 != I3
566 new Inequality(body, var_I1, var_I3);
567 // I2 != I3
568 new Inequality(body, var_I2, var_I3);
569 bodies.add(body);
570 }
571 {
572 PAnnotation annotation = new PAnnotation("Constraint");
573 annotation.addAttribute("message", "tooManyInputsOfSegment");
574 annotation.addAttribute("severity", "error");
575 annotation.addAttribute("key", Arrays.asList(new Object[] {
576 new ParameterReference("S")
577 }));
578 addAnnotation(annotation);
579 }
580 return bodies;
581 }
582 }
583}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfTurnout.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfTurnout.java
new file mode 100644
index 00000000..93076cbb
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfTurnout.java
@@ -0,0 +1,600 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Turnout;
17import modes3.queries.Adjacent;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
32import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
39import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
41import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
42import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
43
44/**
45 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
46 *
47 * <p>Original source:
48 * <code><pre>
49 * {@literal @}Constraint(message = "turnoutConnectedToBothOutputs", severity = "error", key = { T })
50 * pattern tooManyInputsOfTurnout(T : Turnout) {
51 * find adjacent(I1, T);
52 * find adjacent(I2, T);
53 * find adjacent(I3, T);
54 * find adjacent(I4, T);
55 * I1 != I2;
56 * I1 != I3;
57 * I1 != I4;
58 * I2 != I3;
59 * I2 != I4;
60 * I3 != I4;
61 * }
62 * </pre></code>
63 *
64 * @see Matcher
65 * @see Match
66 *
67 */
68@SuppressWarnings("all")
69public final class TooManyInputsOfTurnout extends BaseGeneratedEMFQuerySpecification<TooManyInputsOfTurnout.Matcher> {
70 /**
71 * Pattern-specific match representation of the modes3.queries.tooManyInputsOfTurnout pattern,
72 * to be used in conjunction with {@link Matcher}.
73 *
74 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
75 * Each instance is a (possibly partial) substitution of pattern parameters,
76 * usable to represent a match of the pattern in the result of a query,
77 * or to specify the bound (fixed) input parameters when issuing a query.
78 *
79 * @see Matcher
80 *
81 */
82 public static abstract class Match extends BasePatternMatch {
83 private Turnout fT;
84
85 private static List<String> parameterNames = makeImmutableList("T");
86
87 private Match(final Turnout pT) {
88 this.fT = pT;
89 }
90
91 @Override
92 public Object get(final String parameterName) {
93 switch(parameterName) {
94 case "T": return this.fT;
95 default: return null;
96 }
97 }
98
99 @Override
100 public Object get(final int index) {
101 switch(index) {
102 case 0: return this.fT;
103 default: return null;
104 }
105 }
106
107 public Turnout getT() {
108 return this.fT;
109 }
110
111 @Override
112 public boolean set(final String parameterName, final Object newValue) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 if ("T".equals(parameterName) ) {
115 this.fT = (Turnout) newValue;
116 return true;
117 }
118 return false;
119 }
120
121 public void setT(final Turnout pT) {
122 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
123 this.fT = pT;
124 }
125
126 @Override
127 public String patternName() {
128 return "modes3.queries.tooManyInputsOfTurnout";
129 }
130
131 @Override
132 public List<String> parameterNames() {
133 return TooManyInputsOfTurnout.Match.parameterNames;
134 }
135
136 @Override
137 public Object[] toArray() {
138 return new Object[]{fT};
139 }
140
141 @Override
142 public TooManyInputsOfTurnout.Match toImmutable() {
143 return isMutable() ? newMatch(fT) : this;
144 }
145
146 @Override
147 public String prettyPrint() {
148 StringBuilder result = new StringBuilder();
149 result.append("\"T\"=" + prettyPrintValue(fT));
150 return result.toString();
151 }
152
153 @Override
154 public int hashCode() {
155 return Objects.hash(fT);
156 }
157
158 @Override
159 public boolean equals(final Object obj) {
160 if (this == obj)
161 return true;
162 if (obj == null) {
163 return false;
164 }
165 if ((obj instanceof TooManyInputsOfTurnout.Match)) {
166 TooManyInputsOfTurnout.Match other = (TooManyInputsOfTurnout.Match) obj;
167 return Objects.equals(fT, other.fT);
168 } else {
169 // this should be infrequent
170 if (!(obj instanceof IPatternMatch)) {
171 return false;
172 }
173 IPatternMatch otherSig = (IPatternMatch) obj;
174 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
175 }
176 }
177
178 @Override
179 public TooManyInputsOfTurnout specification() {
180 return TooManyInputsOfTurnout.instance();
181 }
182
183 /**
184 * Returns an empty, mutable match.
185 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
186 *
187 * @return the empty match.
188 *
189 */
190 public static TooManyInputsOfTurnout.Match newEmptyMatch() {
191 return new Mutable(null);
192 }
193
194 /**
195 * Returns a mutable (partial) match.
196 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
197 *
198 * @param pT the fixed value of pattern parameter T, or null if not bound.
199 * @return the new, mutable (partial) match object.
200 *
201 */
202 public static TooManyInputsOfTurnout.Match newMutableMatch(final Turnout pT) {
203 return new Mutable(pT);
204 }
205
206 /**
207 * Returns a new (partial) match.
208 * This can be used e.g. to call the matcher with a partial match.
209 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
210 * @param pT the fixed value of pattern parameter T, or null if not bound.
211 * @return the (partial) match object.
212 *
213 */
214 public static TooManyInputsOfTurnout.Match newMatch(final Turnout pT) {
215 return new Immutable(pT);
216 }
217
218 private static final class Mutable extends TooManyInputsOfTurnout.Match {
219 Mutable(final Turnout pT) {
220 super(pT);
221 }
222
223 @Override
224 public boolean isMutable() {
225 return true;
226 }
227 }
228
229 private static final class Immutable extends TooManyInputsOfTurnout.Match {
230 Immutable(final Turnout pT) {
231 super(pT);
232 }
233
234 @Override
235 public boolean isMutable() {
236 return false;
237 }
238 }
239 }
240
241 /**
242 * Generated pattern matcher API of the modes3.queries.tooManyInputsOfTurnout pattern,
243 * providing pattern-specific query methods.
244 *
245 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
246 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
247 *
248 * <p>Matches of the pattern will be represented as {@link Match}.
249 *
250 * <p>Original source:
251 * <code><pre>
252 * {@literal @}Constraint(message = "turnoutConnectedToBothOutputs", severity = "error", key = { T })
253 * pattern tooManyInputsOfTurnout(T : Turnout) {
254 * find adjacent(I1, T);
255 * find adjacent(I2, T);
256 * find adjacent(I3, T);
257 * find adjacent(I4, T);
258 * I1 != I2;
259 * I1 != I3;
260 * I1 != I4;
261 * I2 != I3;
262 * I2 != I4;
263 * I3 != I4;
264 * }
265 * </pre></code>
266 *
267 * @see Match
268 * @see TooManyInputsOfTurnout
269 *
270 */
271 public static class Matcher extends BaseMatcher<TooManyInputsOfTurnout.Match> {
272 /**
273 * Initializes the pattern matcher within an existing VIATRA Query engine.
274 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
275 *
276 * @param engine the existing VIATRA Query engine in which this matcher will be created.
277 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
278 *
279 */
280 public static TooManyInputsOfTurnout.Matcher on(final ViatraQueryEngine engine) {
281 // check if matcher already exists
282 Matcher matcher = engine.getExistingMatcher(querySpecification());
283 if (matcher == null) {
284 matcher = (Matcher)engine.getMatcher(querySpecification());
285 }
286 return matcher;
287 }
288
289 /**
290 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
291 * @return an initialized matcher
292 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
293 *
294 */
295 public static TooManyInputsOfTurnout.Matcher create() {
296 return new Matcher();
297 }
298
299 private static final int POSITION_T = 0;
300
301 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TooManyInputsOfTurnout.Matcher.class);
302
303 /**
304 * Initializes the pattern matcher within an existing VIATRA Query engine.
305 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
306 *
307 * @param engine the existing VIATRA Query engine in which this matcher will be created.
308 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
309 *
310 */
311 private Matcher() {
312 super(querySpecification());
313 }
314
315 /**
316 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
317 * @param pT the fixed value of pattern parameter T, or null if not bound.
318 * @return matches represented as a Match object.
319 *
320 */
321 public Collection<TooManyInputsOfTurnout.Match> getAllMatches(final Turnout pT) {
322 return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet());
323 }
324
325 /**
326 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
327 * </p>
328 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
329 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
330 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
331 * @param pT the fixed value of pattern parameter T, or null if not bound.
332 * @return a stream of matches represented as a Match object.
333 *
334 */
335 public Stream<TooManyInputsOfTurnout.Match> streamAllMatches(final Turnout pT) {
336 return rawStreamAllMatches(new Object[]{pT});
337 }
338
339 /**
340 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
341 * Neither determinism nor randomness of selection is guaranteed.
342 * @param pT the fixed value of pattern parameter T, or null if not bound.
343 * @return a match represented as a Match object, or null if no match is found.
344 *
345 */
346 public Optional<TooManyInputsOfTurnout.Match> getOneArbitraryMatch(final Turnout pT) {
347 return rawGetOneArbitraryMatch(new Object[]{pT});
348 }
349
350 /**
351 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
352 * under any possible substitution of the unspecified parameters (if any).
353 * @param pT the fixed value of pattern parameter T, or null if not bound.
354 * @return true if the input is a valid (partial) match of the pattern.
355 *
356 */
357 public boolean hasMatch(final Turnout pT) {
358 return rawHasMatch(new Object[]{pT});
359 }
360
361 /**
362 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
363 * @param pT the fixed value of pattern parameter T, or null if not bound.
364 * @return the number of pattern matches found.
365 *
366 */
367 public int countMatches(final Turnout pT) {
368 return rawCountMatches(new Object[]{pT});
369 }
370
371 /**
372 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
373 * Neither determinism nor randomness of selection is guaranteed.
374 * @param pT the fixed value of pattern parameter T, or null if not bound.
375 * @param processor the action that will process the selected match.
376 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
377 *
378 */
379 public boolean forOneArbitraryMatch(final Turnout pT, final Consumer<? super TooManyInputsOfTurnout.Match> processor) {
380 return rawForOneArbitraryMatch(new Object[]{pT}, processor);
381 }
382
383 /**
384 * Returns a new (partial) match.
385 * This can be used e.g. to call the matcher with a partial match.
386 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
387 * @param pT the fixed value of pattern parameter T, or null if not bound.
388 * @return the (partial) match object.
389 *
390 */
391 public TooManyInputsOfTurnout.Match newMatch(final Turnout pT) {
392 return TooManyInputsOfTurnout.Match.newMatch(pT);
393 }
394
395 /**
396 * Retrieve the set of values that occur in matches for T.
397 * @return the Set of all values or empty set if there are no matches
398 *
399 */
400 protected Stream<Turnout> rawStreamAllValuesOfT(final Object[] parameters) {
401 return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast);
402 }
403
404 /**
405 * Retrieve the set of values that occur in matches for T.
406 * @return the Set of all values or empty set if there are no matches
407 *
408 */
409 public Set<Turnout> getAllValuesOfT() {
410 return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet());
411 }
412
413 /**
414 * Retrieve the set of values that occur in matches for T.
415 * @return the Set of all values or empty set if there are no matches
416 *
417 */
418 public Stream<Turnout> streamAllValuesOfT() {
419 return rawStreamAllValuesOfT(emptyArray());
420 }
421
422 @Override
423 protected TooManyInputsOfTurnout.Match tupleToMatch(final Tuple t) {
424 try {
425 return TooManyInputsOfTurnout.Match.newMatch((Turnout) t.get(POSITION_T));
426 } catch(ClassCastException e) {
427 LOGGER.error("Element(s) in tuple not properly typed!",e);
428 return null;
429 }
430 }
431
432 @Override
433 protected TooManyInputsOfTurnout.Match arrayToMatch(final Object[] match) {
434 try {
435 return TooManyInputsOfTurnout.Match.newMatch((Turnout) match[POSITION_T]);
436 } catch(ClassCastException e) {
437 LOGGER.error("Element(s) in array not properly typed!",e);
438 return null;
439 }
440 }
441
442 @Override
443 protected TooManyInputsOfTurnout.Match arrayToMatchMutable(final Object[] match) {
444 try {
445 return TooManyInputsOfTurnout.Match.newMutableMatch((Turnout) match[POSITION_T]);
446 } catch(ClassCastException e) {
447 LOGGER.error("Element(s) in array not properly typed!",e);
448 return null;
449 }
450 }
451
452 /**
453 * @return the singleton instance of the query specification of this pattern
454 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
455 *
456 */
457 public static IQuerySpecification<TooManyInputsOfTurnout.Matcher> querySpecification() {
458 return TooManyInputsOfTurnout.instance();
459 }
460 }
461
462 private TooManyInputsOfTurnout() {
463 super(GeneratedPQuery.INSTANCE);
464 }
465
466 /**
467 * @return the singleton instance of the query specification
468 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
469 *
470 */
471 public static TooManyInputsOfTurnout instance() {
472 try{
473 return LazyHolder.INSTANCE;
474 } catch (ExceptionInInitializerError err) {
475 throw processInitializerError(err);
476 }
477 }
478
479 @Override
480 protected TooManyInputsOfTurnout.Matcher instantiate(final ViatraQueryEngine engine) {
481 return TooManyInputsOfTurnout.Matcher.on(engine);
482 }
483
484 @Override
485 public TooManyInputsOfTurnout.Matcher instantiate() {
486 return TooManyInputsOfTurnout.Matcher.create();
487 }
488
489 @Override
490 public TooManyInputsOfTurnout.Match newEmptyMatch() {
491 return TooManyInputsOfTurnout.Match.newEmptyMatch();
492 }
493
494 @Override
495 public TooManyInputsOfTurnout.Match newMatch(final Object... parameters) {
496 return TooManyInputsOfTurnout.Match.newMatch((modes3.Turnout) parameters[0]);
497 }
498
499 /**
500 * Inner class allowing the singleton instance of {@link TooManyInputsOfTurnout} to be created
501 * <b>not</b> at the class load time of the outer class,
502 * but rather at the first call to {@link TooManyInputsOfTurnout#instance()}.
503 *
504 * <p> This workaround is required e.g. to support recursion.
505 *
506 */
507 private static class LazyHolder {
508 private static final TooManyInputsOfTurnout INSTANCE = new TooManyInputsOfTurnout();
509
510 /**
511 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
512 * This initialization order is required to support indirect recursion.
513 *
514 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
515 *
516 */
517 private static final Object STATIC_INITIALIZER = ensureInitialized();
518
519 public static Object ensureInitialized() {
520 INSTANCE.ensureInitializedInternal();
521 return null;
522 }
523 }
524
525 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
526 private static final TooManyInputsOfTurnout.GeneratedPQuery INSTANCE = new GeneratedPQuery();
527
528 private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT);
529
530 private final List<PParameter> parameters = Arrays.asList(parameter_T);
531
532 private GeneratedPQuery() {
533 super(PVisibility.PUBLIC);
534 }
535
536 @Override
537 public String getFullyQualifiedName() {
538 return "modes3.queries.tooManyInputsOfTurnout";
539 }
540
541 @Override
542 public List<String> getParameterNames() {
543 return Arrays.asList("T");
544 }
545
546 @Override
547 public List<PParameter> getParameters() {
548 return parameters;
549 }
550
551 @Override
552 public Set<PBody> doGetContainedBodies() {
553 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
554 Set<PBody> bodies = new LinkedHashSet<>();
555 {
556 PBody body = new PBody(this);
557 PVariable var_T = body.getOrCreateVariableByName("T");
558 PVariable var_I1 = body.getOrCreateVariableByName("I1");
559 PVariable var_I2 = body.getOrCreateVariableByName("I2");
560 PVariable var_I3 = body.getOrCreateVariableByName("I3");
561 PVariable var_I4 = body.getOrCreateVariableByName("I4");
562 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
563 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
564 new ExportedParameter(body, var_T, parameter_T)
565 ));
566 // find adjacent(I1, T)
567 new PositivePatternCall(body, Tuples.flatTupleOf(var_I1, var_T), Adjacent.instance().getInternalQueryRepresentation());
568 // find adjacent(I2, T)
569 new PositivePatternCall(body, Tuples.flatTupleOf(var_I2, var_T), Adjacent.instance().getInternalQueryRepresentation());
570 // find adjacent(I3, T)
571 new PositivePatternCall(body, Tuples.flatTupleOf(var_I3, var_T), Adjacent.instance().getInternalQueryRepresentation());
572 // find adjacent(I4, T)
573 new PositivePatternCall(body, Tuples.flatTupleOf(var_I4, var_T), Adjacent.instance().getInternalQueryRepresentation());
574 // I1 != I2
575 new Inequality(body, var_I1, var_I2);
576 // I1 != I3
577 new Inequality(body, var_I1, var_I3);
578 // I1 != I4
579 new Inequality(body, var_I1, var_I4);
580 // I2 != I3
581 new Inequality(body, var_I2, var_I3);
582 // I2 != I4
583 new Inequality(body, var_I2, var_I4);
584 // I3 != I4
585 new Inequality(body, var_I3, var_I4);
586 bodies.add(body);
587 }
588 {
589 PAnnotation annotation = new PAnnotation("Constraint");
590 annotation.addAttribute("message", "turnoutConnectedToBothOutputs");
591 annotation.addAttribute("severity", "error");
592 annotation.addAttribute("key", Arrays.asList(new Object[] {
593 new ParameterReference("T")
594 }));
595 addAnnotation(annotation);
596 }
597 return bodies;
598 }
599 }
600}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_2.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_2.java
new file mode 100644
index 00000000..5bf153c3
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_2.java
@@ -0,0 +1,564 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Train;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.viatra.query.runtime.api.IPatternMatch;
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
24import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
25import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
26import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
27import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
28import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
30import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
31import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
32import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
33import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
34import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
35import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
36import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
37import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
38
39/**
40 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
41 *
42 * <p>Original source:
43 * <code><pre>
44 * //
45 * // trainLocations
46 * //
47 *
48 * pattern trainLocations_step_2(in train : Train) {
49 * // frame-{@literal >}train = model-{@literal >}trains[i0];
50 * // frame-{@literal >}location = frame-{@literal >}train-{@literal >}location;
51 * // if (frame-{@literal >}location != NULL) {
52 * // ...
53 * // }
54 *
55 * Train(train);
56 * }
57 * </pre></code>
58 *
59 * @see Matcher
60 * @see Match
61 *
62 */
63@SuppressWarnings("all")
64public final class TrainLocations_step_2 extends BaseGeneratedEMFQuerySpecification<TrainLocations_step_2.Matcher> {
65 /**
66 * Pattern-specific match representation of the modes3.queries.trainLocations_step_2 pattern,
67 * to be used in conjunction with {@link Matcher}.
68 *
69 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
70 * Each instance is a (possibly partial) substitution of pattern parameters,
71 * usable to represent a match of the pattern in the result of a query,
72 * or to specify the bound (fixed) input parameters when issuing a query.
73 *
74 * @see Matcher
75 *
76 */
77 public static abstract class Match extends BasePatternMatch {
78 private Train fTrain;
79
80 private static List<String> parameterNames = makeImmutableList("train");
81
82 private Match(final Train pTrain) {
83 this.fTrain = pTrain;
84 }
85
86 @Override
87 public Object get(final String parameterName) {
88 switch(parameterName) {
89 case "train": return this.fTrain;
90 default: return null;
91 }
92 }
93
94 @Override
95 public Object get(final int index) {
96 switch(index) {
97 case 0: return this.fTrain;
98 default: return null;
99 }
100 }
101
102 public Train getTrain() {
103 return this.fTrain;
104 }
105
106 @Override
107 public boolean set(final String parameterName, final Object newValue) {
108 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
109 if ("train".equals(parameterName) ) {
110 this.fTrain = (Train) newValue;
111 return true;
112 }
113 return false;
114 }
115
116 public void setTrain(final Train pTrain) {
117 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
118 this.fTrain = pTrain;
119 }
120
121 @Override
122 public String patternName() {
123 return "modes3.queries.trainLocations_step_2";
124 }
125
126 @Override
127 public List<String> parameterNames() {
128 return TrainLocations_step_2.Match.parameterNames;
129 }
130
131 @Override
132 public Object[] toArray() {
133 return new Object[]{fTrain};
134 }
135
136 @Override
137 public TrainLocations_step_2.Match toImmutable() {
138 return isMutable() ? newMatch(fTrain) : this;
139 }
140
141 @Override
142 public String prettyPrint() {
143 StringBuilder result = new StringBuilder();
144 result.append("\"train\"=" + prettyPrintValue(fTrain));
145 return result.toString();
146 }
147
148 @Override
149 public int hashCode() {
150 return Objects.hash(fTrain);
151 }
152
153 @Override
154 public boolean equals(final Object obj) {
155 if (this == obj)
156 return true;
157 if (obj == null) {
158 return false;
159 }
160 if ((obj instanceof TrainLocations_step_2.Match)) {
161 TrainLocations_step_2.Match other = (TrainLocations_step_2.Match) obj;
162 return Objects.equals(fTrain, other.fTrain);
163 } else {
164 // this should be infrequent
165 if (!(obj instanceof IPatternMatch)) {
166 return false;
167 }
168 IPatternMatch otherSig = (IPatternMatch) obj;
169 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
170 }
171 }
172
173 @Override
174 public TrainLocations_step_2 specification() {
175 return TrainLocations_step_2.instance();
176 }
177
178 /**
179 * Returns an empty, mutable match.
180 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
181 *
182 * @return the empty match.
183 *
184 */
185 public static TrainLocations_step_2.Match newEmptyMatch() {
186 return new Mutable(null);
187 }
188
189 /**
190 * Returns a mutable (partial) match.
191 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
192 *
193 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
194 * @return the new, mutable (partial) match object.
195 *
196 */
197 public static TrainLocations_step_2.Match newMutableMatch(final Train pTrain) {
198 return new Mutable(pTrain);
199 }
200
201 /**
202 * Returns a new (partial) match.
203 * This can be used e.g. to call the matcher with a partial match.
204 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
205 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
206 * @return the (partial) match object.
207 *
208 */
209 public static TrainLocations_step_2.Match newMatch(final Train pTrain) {
210 return new Immutable(pTrain);
211 }
212
213 private static final class Mutable extends TrainLocations_step_2.Match {
214 Mutable(final Train pTrain) {
215 super(pTrain);
216 }
217
218 @Override
219 public boolean isMutable() {
220 return true;
221 }
222 }
223
224 private static final class Immutable extends TrainLocations_step_2.Match {
225 Immutable(final Train pTrain) {
226 super(pTrain);
227 }
228
229 @Override
230 public boolean isMutable() {
231 return false;
232 }
233 }
234 }
235
236 /**
237 * Generated pattern matcher API of the modes3.queries.trainLocations_step_2 pattern,
238 * providing pattern-specific query methods.
239 *
240 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
241 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
242 *
243 * <p>Matches of the pattern will be represented as {@link Match}.
244 *
245 * <p>Original source:
246 * <code><pre>
247 * //
248 * // trainLocations
249 * //
250 *
251 * pattern trainLocations_step_2(in train : Train) {
252 * // frame-{@literal >}train = model-{@literal >}trains[i0];
253 * // frame-{@literal >}location = frame-{@literal >}train-{@literal >}location;
254 * // if (frame-{@literal >}location != NULL) {
255 * // ...
256 * // }
257 *
258 * Train(train);
259 * }
260 * </pre></code>
261 *
262 * @see Match
263 * @see TrainLocations_step_2
264 *
265 */
266 public static class Matcher extends BaseMatcher<TrainLocations_step_2.Match> {
267 /**
268 * Initializes the pattern matcher within an existing VIATRA Query engine.
269 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
270 *
271 * @param engine the existing VIATRA Query engine in which this matcher will be created.
272 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
273 *
274 */
275 public static TrainLocations_step_2.Matcher on(final ViatraQueryEngine engine) {
276 // check if matcher already exists
277 Matcher matcher = engine.getExistingMatcher(querySpecification());
278 if (matcher == null) {
279 matcher = (Matcher)engine.getMatcher(querySpecification());
280 }
281 return matcher;
282 }
283
284 /**
285 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
286 * @return an initialized matcher
287 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
288 *
289 */
290 public static TrainLocations_step_2.Matcher create() {
291 return new Matcher();
292 }
293
294 private static final int POSITION_TRAIN = 0;
295
296 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TrainLocations_step_2.Matcher.class);
297
298 /**
299 * Initializes the pattern matcher within an existing VIATRA Query engine.
300 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
301 *
302 * @param engine the existing VIATRA Query engine in which this matcher will be created.
303 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
304 *
305 */
306 private Matcher() {
307 super(querySpecification());
308 }
309
310 /**
311 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
312 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
313 * @return matches represented as a Match object.
314 *
315 */
316 public Collection<TrainLocations_step_2.Match> getAllMatches(final Train pTrain) {
317 return rawStreamAllMatches(new Object[]{pTrain}).collect(Collectors.toSet());
318 }
319
320 /**
321 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
322 * </p>
323 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
324 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
325 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
326 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
327 * @return a stream of matches represented as a Match object.
328 *
329 */
330 public Stream<TrainLocations_step_2.Match> streamAllMatches(final Train pTrain) {
331 return rawStreamAllMatches(new Object[]{pTrain});
332 }
333
334 /**
335 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
336 * Neither determinism nor randomness of selection is guaranteed.
337 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
338 * @return a match represented as a Match object, or null if no match is found.
339 *
340 */
341 public Optional<TrainLocations_step_2.Match> getOneArbitraryMatch(final Train pTrain) {
342 return rawGetOneArbitraryMatch(new Object[]{pTrain});
343 }
344
345 /**
346 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
347 * under any possible substitution of the unspecified parameters (if any).
348 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
349 * @return true if the input is a valid (partial) match of the pattern.
350 *
351 */
352 public boolean hasMatch(final Train pTrain) {
353 return rawHasMatch(new Object[]{pTrain});
354 }
355
356 /**
357 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
358 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
359 * @return the number of pattern matches found.
360 *
361 */
362 public int countMatches(final Train pTrain) {
363 return rawCountMatches(new Object[]{pTrain});
364 }
365
366 /**
367 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
368 * Neither determinism nor randomness of selection is guaranteed.
369 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
370 * @param processor the action that will process the selected match.
371 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
372 *
373 */
374 public boolean forOneArbitraryMatch(final Train pTrain, final Consumer<? super TrainLocations_step_2.Match> processor) {
375 return rawForOneArbitraryMatch(new Object[]{pTrain}, processor);
376 }
377
378 /**
379 * Returns a new (partial) match.
380 * This can be used e.g. to call the matcher with a partial match.
381 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
382 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
383 * @return the (partial) match object.
384 *
385 */
386 public TrainLocations_step_2.Match newMatch(final Train pTrain) {
387 return TrainLocations_step_2.Match.newMatch(pTrain);
388 }
389
390 /**
391 * Retrieve the set of values that occur in matches for train.
392 * @return the Set of all values or empty set if there are no matches
393 *
394 */
395 protected Stream<Train> rawStreamAllValuesOftrain(final Object[] parameters) {
396 return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast);
397 }
398
399 /**
400 * Retrieve the set of values that occur in matches for train.
401 * @return the Set of all values or empty set if there are no matches
402 *
403 */
404 public Set<Train> getAllValuesOftrain() {
405 return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet());
406 }
407
408 /**
409 * Retrieve the set of values that occur in matches for train.
410 * @return the Set of all values or empty set if there are no matches
411 *
412 */
413 public Stream<Train> streamAllValuesOftrain() {
414 return rawStreamAllValuesOftrain(emptyArray());
415 }
416
417 @Override
418 protected TrainLocations_step_2.Match tupleToMatch(final Tuple t) {
419 try {
420 return TrainLocations_step_2.Match.newMatch((Train) t.get(POSITION_TRAIN));
421 } catch(ClassCastException e) {
422 LOGGER.error("Element(s) in tuple not properly typed!",e);
423 return null;
424 }
425 }
426
427 @Override
428 protected TrainLocations_step_2.Match arrayToMatch(final Object[] match) {
429 try {
430 return TrainLocations_step_2.Match.newMatch((Train) match[POSITION_TRAIN]);
431 } catch(ClassCastException e) {
432 LOGGER.error("Element(s) in array not properly typed!",e);
433 return null;
434 }
435 }
436
437 @Override
438 protected TrainLocations_step_2.Match arrayToMatchMutable(final Object[] match) {
439 try {
440 return TrainLocations_step_2.Match.newMutableMatch((Train) match[POSITION_TRAIN]);
441 } catch(ClassCastException e) {
442 LOGGER.error("Element(s) in array not properly typed!",e);
443 return null;
444 }
445 }
446
447 /**
448 * @return the singleton instance of the query specification of this pattern
449 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
450 *
451 */
452 public static IQuerySpecification<TrainLocations_step_2.Matcher> querySpecification() {
453 return TrainLocations_step_2.instance();
454 }
455 }
456
457 private TrainLocations_step_2() {
458 super(GeneratedPQuery.INSTANCE);
459 }
460
461 /**
462 * @return the singleton instance of the query specification
463 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
464 *
465 */
466 public static TrainLocations_step_2 instance() {
467 try{
468 return LazyHolder.INSTANCE;
469 } catch (ExceptionInInitializerError err) {
470 throw processInitializerError(err);
471 }
472 }
473
474 @Override
475 protected TrainLocations_step_2.Matcher instantiate(final ViatraQueryEngine engine) {
476 return TrainLocations_step_2.Matcher.on(engine);
477 }
478
479 @Override
480 public TrainLocations_step_2.Matcher instantiate() {
481 return TrainLocations_step_2.Matcher.create();
482 }
483
484 @Override
485 public TrainLocations_step_2.Match newEmptyMatch() {
486 return TrainLocations_step_2.Match.newEmptyMatch();
487 }
488
489 @Override
490 public TrainLocations_step_2.Match newMatch(final Object... parameters) {
491 return TrainLocations_step_2.Match.newMatch((modes3.Train) parameters[0]);
492 }
493
494 /**
495 * Inner class allowing the singleton instance of {@link TrainLocations_step_2} to be created
496 * <b>not</b> at the class load time of the outer class,
497 * but rather at the first call to {@link TrainLocations_step_2#instance()}.
498 *
499 * <p> This workaround is required e.g. to support recursion.
500 *
501 */
502 private static class LazyHolder {
503 private static final TrainLocations_step_2 INSTANCE = new TrainLocations_step_2();
504
505 /**
506 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
507 * This initialization order is required to support indirect recursion.
508 *
509 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
510 *
511 */
512 private static final Object STATIC_INITIALIZER = ensureInitialized();
513
514 public static Object ensureInitialized() {
515 INSTANCE.ensureInitializedInternal();
516 return null;
517 }
518 }
519
520 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
521 private static final TrainLocations_step_2.GeneratedPQuery INSTANCE = new GeneratedPQuery();
522
523 private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT);
524
525 private final List<PParameter> parameters = Arrays.asList(parameter_train);
526
527 private GeneratedPQuery() {
528 super(PVisibility.PUBLIC);
529 }
530
531 @Override
532 public String getFullyQualifiedName() {
533 return "modes3.queries.trainLocations_step_2";
534 }
535
536 @Override
537 public List<String> getParameterNames() {
538 return Arrays.asList("train");
539 }
540
541 @Override
542 public List<PParameter> getParameters() {
543 return parameters;
544 }
545
546 @Override
547 public Set<PBody> doGetContainedBodies() {
548 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
549 Set<PBody> bodies = new LinkedHashSet<>();
550 {
551 PBody body = new PBody(this);
552 PVariable var_train = body.getOrCreateVariableByName("train");
553 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
554 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
555 new ExportedParameter(body, var_train, parameter_train)
556 ));
557 // // frame->train = model->trains[i0];// frame->location = frame->train->location;// if (frame->location != NULL) {// ...// } Train(train)
558 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
559 bodies.add(body);
560 }
561 return bodies;
562 }
563 }
564}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_3.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_3.java
new file mode 100644
index 00000000..edbd4af3
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TrainLocations_step_3.java
@@ -0,0 +1,713 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import modes3.Train;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
29import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
31import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
40import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
41
42/**
43 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
44 *
45 * <p>Original source:
46 * <code><pre>
47 * pattern trainLocations_step_3(in train : Train, in location : Segment) {
48 * // results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
49 * // results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
50 * Train(train);
51 * Train.location(train, location);
52 * }
53 * </pre></code>
54 *
55 * @see Matcher
56 * @see Match
57 *
58 */
59@SuppressWarnings("all")
60public final class TrainLocations_step_3 extends BaseGeneratedEMFQuerySpecification<TrainLocations_step_3.Matcher> {
61 /**
62 * Pattern-specific match representation of the modes3.queries.trainLocations_step_3 pattern,
63 * to be used in conjunction with {@link Matcher}.
64 *
65 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
66 * Each instance is a (possibly partial) substitution of pattern parameters,
67 * usable to represent a match of the pattern in the result of a query,
68 * or to specify the bound (fixed) input parameters when issuing a query.
69 *
70 * @see Matcher
71 *
72 */
73 public static abstract class Match extends BasePatternMatch {
74 private Train fTrain;
75
76 private Segment fLocation;
77
78 private static List<String> parameterNames = makeImmutableList("train", "location");
79
80 private Match(final Train pTrain, final Segment pLocation) {
81 this.fTrain = pTrain;
82 this.fLocation = pLocation;
83 }
84
85 @Override
86 public Object get(final String parameterName) {
87 switch(parameterName) {
88 case "train": return this.fTrain;
89 case "location": return this.fLocation;
90 default: return null;
91 }
92 }
93
94 @Override
95 public Object get(final int index) {
96 switch(index) {
97 case 0: return this.fTrain;
98 case 1: return this.fLocation;
99 default: return null;
100 }
101 }
102
103 public Train getTrain() {
104 return this.fTrain;
105 }
106
107 public Segment getLocation() {
108 return this.fLocation;
109 }
110
111 @Override
112 public boolean set(final String parameterName, final Object newValue) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 if ("train".equals(parameterName) ) {
115 this.fTrain = (Train) newValue;
116 return true;
117 }
118 if ("location".equals(parameterName) ) {
119 this.fLocation = (Segment) newValue;
120 return true;
121 }
122 return false;
123 }
124
125 public void setTrain(final Train pTrain) {
126 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
127 this.fTrain = pTrain;
128 }
129
130 public void setLocation(final Segment pLocation) {
131 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
132 this.fLocation = pLocation;
133 }
134
135 @Override
136 public String patternName() {
137 return "modes3.queries.trainLocations_step_3";
138 }
139
140 @Override
141 public List<String> parameterNames() {
142 return TrainLocations_step_3.Match.parameterNames;
143 }
144
145 @Override
146 public Object[] toArray() {
147 return new Object[]{fTrain, fLocation};
148 }
149
150 @Override
151 public TrainLocations_step_3.Match toImmutable() {
152 return isMutable() ? newMatch(fTrain, fLocation) : this;
153 }
154
155 @Override
156 public String prettyPrint() {
157 StringBuilder result = new StringBuilder();
158 result.append("\"train\"=" + prettyPrintValue(fTrain) + ", ");
159 result.append("\"location\"=" + prettyPrintValue(fLocation));
160 return result.toString();
161 }
162
163 @Override
164 public int hashCode() {
165 return Objects.hash(fTrain, fLocation);
166 }
167
168 @Override
169 public boolean equals(final Object obj) {
170 if (this == obj)
171 return true;
172 if (obj == null) {
173 return false;
174 }
175 if ((obj instanceof TrainLocations_step_3.Match)) {
176 TrainLocations_step_3.Match other = (TrainLocations_step_3.Match) obj;
177 return Objects.equals(fTrain, other.fTrain) && Objects.equals(fLocation, other.fLocation);
178 } else {
179 // this should be infrequent
180 if (!(obj instanceof IPatternMatch)) {
181 return false;
182 }
183 IPatternMatch otherSig = (IPatternMatch) obj;
184 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
185 }
186 }
187
188 @Override
189 public TrainLocations_step_3 specification() {
190 return TrainLocations_step_3.instance();
191 }
192
193 /**
194 * Returns an empty, mutable match.
195 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
196 *
197 * @return the empty match.
198 *
199 */
200 public static TrainLocations_step_3.Match newEmptyMatch() {
201 return new Mutable(null, null);
202 }
203
204 /**
205 * Returns a mutable (partial) match.
206 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
207 *
208 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
209 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
210 * @return the new, mutable (partial) match object.
211 *
212 */
213 public static TrainLocations_step_3.Match newMutableMatch(final Train pTrain, final Segment pLocation) {
214 return new Mutable(pTrain, pLocation);
215 }
216
217 /**
218 * Returns a new (partial) match.
219 * This can be used e.g. to call the matcher with a partial match.
220 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
221 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
222 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
223 * @return the (partial) match object.
224 *
225 */
226 public static TrainLocations_step_3.Match newMatch(final Train pTrain, final Segment pLocation) {
227 return new Immutable(pTrain, pLocation);
228 }
229
230 private static final class Mutable extends TrainLocations_step_3.Match {
231 Mutable(final Train pTrain, final Segment pLocation) {
232 super(pTrain, pLocation);
233 }
234
235 @Override
236 public boolean isMutable() {
237 return true;
238 }
239 }
240
241 private static final class Immutable extends TrainLocations_step_3.Match {
242 Immutable(final Train pTrain, final Segment pLocation) {
243 super(pTrain, pLocation);
244 }
245
246 @Override
247 public boolean isMutable() {
248 return false;
249 }
250 }
251 }
252
253 /**
254 * Generated pattern matcher API of the modes3.queries.trainLocations_step_3 pattern,
255 * providing pattern-specific query methods.
256 *
257 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
258 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
259 *
260 * <p>Matches of the pattern will be represented as {@link Match}.
261 *
262 * <p>Original source:
263 * <code><pre>
264 * pattern trainLocations_step_3(in train : Train, in location : Segment) {
265 * // results-{@literal >}matches[match_cntr].location = frame-{@literal >}location;
266 * // results-{@literal >}matches[match_cntr++].train = frame-{@literal >}train;
267 * Train(train);
268 * Train.location(train, location);
269 * }
270 * </pre></code>
271 *
272 * @see Match
273 * @see TrainLocations_step_3
274 *
275 */
276 public static class Matcher extends BaseMatcher<TrainLocations_step_3.Match> {
277 /**
278 * Initializes the pattern matcher within an existing VIATRA Query engine.
279 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
280 *
281 * @param engine the existing VIATRA Query engine in which this matcher will be created.
282 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
283 *
284 */
285 public static TrainLocations_step_3.Matcher on(final ViatraQueryEngine engine) {
286 // check if matcher already exists
287 Matcher matcher = engine.getExistingMatcher(querySpecification());
288 if (matcher == null) {
289 matcher = (Matcher)engine.getMatcher(querySpecification());
290 }
291 return matcher;
292 }
293
294 /**
295 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
296 * @return an initialized matcher
297 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
298 *
299 */
300 public static TrainLocations_step_3.Matcher create() {
301 return new Matcher();
302 }
303
304 private static final int POSITION_TRAIN = 0;
305
306 private static final int POSITION_LOCATION = 1;
307
308 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TrainLocations_step_3.Matcher.class);
309
310 /**
311 * Initializes the pattern matcher within an existing VIATRA Query engine.
312 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
313 *
314 * @param engine the existing VIATRA Query engine in which this matcher will be created.
315 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
316 *
317 */
318 private Matcher() {
319 super(querySpecification());
320 }
321
322 /**
323 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
324 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
325 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
326 * @return matches represented as a Match object.
327 *
328 */
329 public Collection<TrainLocations_step_3.Match> getAllMatches(final Train pTrain, final Segment pLocation) {
330 return rawStreamAllMatches(new Object[]{pTrain, pLocation}).collect(Collectors.toSet());
331 }
332
333 /**
334 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
335 * </p>
336 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
337 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
338 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
339 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
340 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
341 * @return a stream of matches represented as a Match object.
342 *
343 */
344 public Stream<TrainLocations_step_3.Match> streamAllMatches(final Train pTrain, final Segment pLocation) {
345 return rawStreamAllMatches(new Object[]{pTrain, pLocation});
346 }
347
348 /**
349 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
350 * Neither determinism nor randomness of selection is guaranteed.
351 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
352 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
353 * @return a match represented as a Match object, or null if no match is found.
354 *
355 */
356 public Optional<TrainLocations_step_3.Match> getOneArbitraryMatch(final Train pTrain, final Segment pLocation) {
357 return rawGetOneArbitraryMatch(new Object[]{pTrain, pLocation});
358 }
359
360 /**
361 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
362 * under any possible substitution of the unspecified parameters (if any).
363 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
364 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
365 * @return true if the input is a valid (partial) match of the pattern.
366 *
367 */
368 public boolean hasMatch(final Train pTrain, final Segment pLocation) {
369 return rawHasMatch(new Object[]{pTrain, pLocation});
370 }
371
372 /**
373 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
374 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
375 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
376 * @return the number of pattern matches found.
377 *
378 */
379 public int countMatches(final Train pTrain, final Segment pLocation) {
380 return rawCountMatches(new Object[]{pTrain, pLocation});
381 }
382
383 /**
384 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
385 * Neither determinism nor randomness of selection is guaranteed.
386 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
387 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
388 * @param processor the action that will process the selected match.
389 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
390 *
391 */
392 public boolean forOneArbitraryMatch(final Train pTrain, final Segment pLocation, final Consumer<? super TrainLocations_step_3.Match> processor) {
393 return rawForOneArbitraryMatch(new Object[]{pTrain, pLocation}, processor);
394 }
395
396 /**
397 * Returns a new (partial) match.
398 * This can be used e.g. to call the matcher with a partial match.
399 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
400 * @param pTrain the fixed value of pattern parameter train, or null if not bound.
401 * @param pLocation the fixed value of pattern parameter location, or null if not bound.
402 * @return the (partial) match object.
403 *
404 */
405 public TrainLocations_step_3.Match newMatch(final Train pTrain, final Segment pLocation) {
406 return TrainLocations_step_3.Match.newMatch(pTrain, pLocation);
407 }
408
409 /**
410 * Retrieve the set of values that occur in matches for train.
411 * @return the Set of all values or empty set if there are no matches
412 *
413 */
414 protected Stream<Train> rawStreamAllValuesOftrain(final Object[] parameters) {
415 return rawStreamAllValues(POSITION_TRAIN, parameters).map(Train.class::cast);
416 }
417
418 /**
419 * Retrieve the set of values that occur in matches for train.
420 * @return the Set of all values or empty set if there are no matches
421 *
422 */
423 public Set<Train> getAllValuesOftrain() {
424 return rawStreamAllValuesOftrain(emptyArray()).collect(Collectors.toSet());
425 }
426
427 /**
428 * Retrieve the set of values that occur in matches for train.
429 * @return the Set of all values or empty set if there are no matches
430 *
431 */
432 public Stream<Train> streamAllValuesOftrain() {
433 return rawStreamAllValuesOftrain(emptyArray());
434 }
435
436 /**
437 * Retrieve the set of values that occur in matches for train.
438 * </p>
439 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
440 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
441 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
442 *
443 * @return the Stream of all values or empty set if there are no matches
444 *
445 */
446 public Stream<Train> streamAllValuesOftrain(final TrainLocations_step_3.Match partialMatch) {
447 return rawStreamAllValuesOftrain(partialMatch.toArray());
448 }
449
450 /**
451 * Retrieve the set of values that occur in matches for train.
452 * </p>
453 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
454 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
455 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
456 *
457 * @return the Stream of all values or empty set if there are no matches
458 *
459 */
460 public Stream<Train> streamAllValuesOftrain(final Segment pLocation) {
461 return rawStreamAllValuesOftrain(new Object[]{null, pLocation});
462 }
463
464 /**
465 * Retrieve the set of values that occur in matches for train.
466 * @return the Set of all values or empty set if there are no matches
467 *
468 */
469 public Set<Train> getAllValuesOftrain(final TrainLocations_step_3.Match partialMatch) {
470 return rawStreamAllValuesOftrain(partialMatch.toArray()).collect(Collectors.toSet());
471 }
472
473 /**
474 * Retrieve the set of values that occur in matches for train.
475 * @return the Set of all values or empty set if there are no matches
476 *
477 */
478 public Set<Train> getAllValuesOftrain(final Segment pLocation) {
479 return rawStreamAllValuesOftrain(new Object[]{null, pLocation}).collect(Collectors.toSet());
480 }
481
482 /**
483 * Retrieve the set of values that occur in matches for location.
484 * @return the Set of all values or empty set if there are no matches
485 *
486 */
487 protected Stream<Segment> rawStreamAllValuesOflocation(final Object[] parameters) {
488 return rawStreamAllValues(POSITION_LOCATION, parameters).map(Segment.class::cast);
489 }
490
491 /**
492 * Retrieve the set of values that occur in matches for location.
493 * @return the Set of all values or empty set if there are no matches
494 *
495 */
496 public Set<Segment> getAllValuesOflocation() {
497 return rawStreamAllValuesOflocation(emptyArray()).collect(Collectors.toSet());
498 }
499
500 /**
501 * Retrieve the set of values that occur in matches for location.
502 * @return the Set of all values or empty set if there are no matches
503 *
504 */
505 public Stream<Segment> streamAllValuesOflocation() {
506 return rawStreamAllValuesOflocation(emptyArray());
507 }
508
509 /**
510 * Retrieve the set of values that occur in matches for location.
511 * </p>
512 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
513 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
514 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
515 *
516 * @return the Stream of all values or empty set if there are no matches
517 *
518 */
519 public Stream<Segment> streamAllValuesOflocation(final TrainLocations_step_3.Match partialMatch) {
520 return rawStreamAllValuesOflocation(partialMatch.toArray());
521 }
522
523 /**
524 * Retrieve the set of values that occur in matches for location.
525 * </p>
526 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
527 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
528 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
529 *
530 * @return the Stream of all values or empty set if there are no matches
531 *
532 */
533 public Stream<Segment> streamAllValuesOflocation(final Train pTrain) {
534 return rawStreamAllValuesOflocation(new Object[]{pTrain, null});
535 }
536
537 /**
538 * Retrieve the set of values that occur in matches for location.
539 * @return the Set of all values or empty set if there are no matches
540 *
541 */
542 public Set<Segment> getAllValuesOflocation(final TrainLocations_step_3.Match partialMatch) {
543 return rawStreamAllValuesOflocation(partialMatch.toArray()).collect(Collectors.toSet());
544 }
545
546 /**
547 * Retrieve the set of values that occur in matches for location.
548 * @return the Set of all values or empty set if there are no matches
549 *
550 */
551 public Set<Segment> getAllValuesOflocation(final Train pTrain) {
552 return rawStreamAllValuesOflocation(new Object[]{pTrain, null}).collect(Collectors.toSet());
553 }
554
555 @Override
556 protected TrainLocations_step_3.Match tupleToMatch(final Tuple t) {
557 try {
558 return TrainLocations_step_3.Match.newMatch((Train) t.get(POSITION_TRAIN), (Segment) t.get(POSITION_LOCATION));
559 } catch(ClassCastException e) {
560 LOGGER.error("Element(s) in tuple not properly typed!",e);
561 return null;
562 }
563 }
564
565 @Override
566 protected TrainLocations_step_3.Match arrayToMatch(final Object[] match) {
567 try {
568 return TrainLocations_step_3.Match.newMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION]);
569 } catch(ClassCastException e) {
570 LOGGER.error("Element(s) in array not properly typed!",e);
571 return null;
572 }
573 }
574
575 @Override
576 protected TrainLocations_step_3.Match arrayToMatchMutable(final Object[] match) {
577 try {
578 return TrainLocations_step_3.Match.newMutableMatch((Train) match[POSITION_TRAIN], (Segment) match[POSITION_LOCATION]);
579 } catch(ClassCastException e) {
580 LOGGER.error("Element(s) in array not properly typed!",e);
581 return null;
582 }
583 }
584
585 /**
586 * @return the singleton instance of the query specification of this pattern
587 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
588 *
589 */
590 public static IQuerySpecification<TrainLocations_step_3.Matcher> querySpecification() {
591 return TrainLocations_step_3.instance();
592 }
593 }
594
595 private TrainLocations_step_3() {
596 super(GeneratedPQuery.INSTANCE);
597 }
598
599 /**
600 * @return the singleton instance of the query specification
601 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
602 *
603 */
604 public static TrainLocations_step_3 instance() {
605 try{
606 return LazyHolder.INSTANCE;
607 } catch (ExceptionInInitializerError err) {
608 throw processInitializerError(err);
609 }
610 }
611
612 @Override
613 protected TrainLocations_step_3.Matcher instantiate(final ViatraQueryEngine engine) {
614 return TrainLocations_step_3.Matcher.on(engine);
615 }
616
617 @Override
618 public TrainLocations_step_3.Matcher instantiate() {
619 return TrainLocations_step_3.Matcher.create();
620 }
621
622 @Override
623 public TrainLocations_step_3.Match newEmptyMatch() {
624 return TrainLocations_step_3.Match.newEmptyMatch();
625 }
626
627 @Override
628 public TrainLocations_step_3.Match newMatch(final Object... parameters) {
629 return TrainLocations_step_3.Match.newMatch((modes3.Train) parameters[0], (modes3.Segment) parameters[1]);
630 }
631
632 /**
633 * Inner class allowing the singleton instance of {@link TrainLocations_step_3} to be created
634 * <b>not</b> at the class load time of the outer class,
635 * but rather at the first call to {@link TrainLocations_step_3#instance()}.
636 *
637 * <p> This workaround is required e.g. to support recursion.
638 *
639 */
640 private static class LazyHolder {
641 private static final TrainLocations_step_3 INSTANCE = new TrainLocations_step_3();
642
643 /**
644 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
645 * This initialization order is required to support indirect recursion.
646 *
647 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
648 *
649 */
650 private static final Object STATIC_INITIALIZER = ensureInitialized();
651
652 public static Object ensureInitialized() {
653 INSTANCE.ensureInitializedInternal();
654 return null;
655 }
656 }
657
658 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
659 private static final TrainLocations_step_3.GeneratedPQuery INSTANCE = new GeneratedPQuery();
660
661 private final PParameter parameter_train = new PParameter("train", "modes3.Train", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Train")), PParameterDirection.INOUT);
662
663 private final PParameter parameter_location = new PParameter("location", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
664
665 private final List<PParameter> parameters = Arrays.asList(parameter_train, parameter_location);
666
667 private GeneratedPQuery() {
668 super(PVisibility.PUBLIC);
669 }
670
671 @Override
672 public String getFullyQualifiedName() {
673 return "modes3.queries.trainLocations_step_3";
674 }
675
676 @Override
677 public List<String> getParameterNames() {
678 return Arrays.asList("train","location");
679 }
680
681 @Override
682 public List<PParameter> getParameters() {
683 return parameters;
684 }
685
686 @Override
687 public Set<PBody> doGetContainedBodies() {
688 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
689 Set<PBody> bodies = new LinkedHashSet<>();
690 {
691 PBody body = new PBody(this);
692 PVariable var_train = body.getOrCreateVariableByName("train");
693 PVariable var_location = body.getOrCreateVariableByName("location");
694 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
695 new TypeConstraint(body, Tuples.flatTupleOf(var_location), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
696 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
697 new ExportedParameter(body, var_train, parameter_train),
698 new ExportedParameter(body, var_location, parameter_location)
699 ));
700 // // results->matches[match_cntr].location = frame->location;// results->matches[match_cntr++].train = frame->train; Train(train)
701 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
702 // Train.location(train, location)
703 new TypeConstraint(body, Tuples.flatTupleOf(var_train), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train")));
704 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
705 new TypeConstraint(body, Tuples.flatTupleOf(var_train, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Train", "location")));
706 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
707 new Equality(body, var__virtual_0_, var_location);
708 bodies.add(body);
709 }
710 return bodies;
711 }
712 }
713}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutConnectedToBothOutputs.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutConnectedToBothOutputs.java
new file mode 100644
index 00000000..674bb275
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutConnectedToBothOutputs.java
@@ -0,0 +1,589 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Turnout;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.viatra.query.runtime.api.IPatternMatch;
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
24import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
25import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
26import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
27import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
32import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
41import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
42
43/**
44 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
45 *
46 * <p>Original source:
47 * <code><pre>
48 * {@literal @}Constraint(message = "turnoutConnectedToBothOutputs", severity = "error", key = { T })
49 * pattern turnoutConnectedToBothOutputs(T : Turnout) {
50 * Turnout.straight(T, Straight);
51 * Turnout.divergent(T, Divergent);
52 * Segment.connectedTo(T, Straight);
53 * Segment.connectedTo(T, Divergent);
54 * }
55 * </pre></code>
56 *
57 * @see Matcher
58 * @see Match
59 *
60 */
61@SuppressWarnings("all")
62public final class TurnoutConnectedToBothOutputs extends BaseGeneratedEMFQuerySpecification<TurnoutConnectedToBothOutputs.Matcher> {
63 /**
64 * Pattern-specific match representation of the modes3.queries.turnoutConnectedToBothOutputs pattern,
65 * to be used in conjunction with {@link Matcher}.
66 *
67 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
68 * Each instance is a (possibly partial) substitution of pattern parameters,
69 * usable to represent a match of the pattern in the result of a query,
70 * or to specify the bound (fixed) input parameters when issuing a query.
71 *
72 * @see Matcher
73 *
74 */
75 public static abstract class Match extends BasePatternMatch {
76 private Turnout fT;
77
78 private static List<String> parameterNames = makeImmutableList("T");
79
80 private Match(final Turnout pT) {
81 this.fT = pT;
82 }
83
84 @Override
85 public Object get(final String parameterName) {
86 switch(parameterName) {
87 case "T": return this.fT;
88 default: return null;
89 }
90 }
91
92 @Override
93 public Object get(final int index) {
94 switch(index) {
95 case 0: return this.fT;
96 default: return null;
97 }
98 }
99
100 public Turnout getT() {
101 return this.fT;
102 }
103
104 @Override
105 public boolean set(final String parameterName, final Object newValue) {
106 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
107 if ("T".equals(parameterName) ) {
108 this.fT = (Turnout) newValue;
109 return true;
110 }
111 return false;
112 }
113
114 public void setT(final Turnout pT) {
115 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
116 this.fT = pT;
117 }
118
119 @Override
120 public String patternName() {
121 return "modes3.queries.turnoutConnectedToBothOutputs";
122 }
123
124 @Override
125 public List<String> parameterNames() {
126 return TurnoutConnectedToBothOutputs.Match.parameterNames;
127 }
128
129 @Override
130 public Object[] toArray() {
131 return new Object[]{fT};
132 }
133
134 @Override
135 public TurnoutConnectedToBothOutputs.Match toImmutable() {
136 return isMutable() ? newMatch(fT) : this;
137 }
138
139 @Override
140 public String prettyPrint() {
141 StringBuilder result = new StringBuilder();
142 result.append("\"T\"=" + prettyPrintValue(fT));
143 return result.toString();
144 }
145
146 @Override
147 public int hashCode() {
148 return Objects.hash(fT);
149 }
150
151 @Override
152 public boolean equals(final Object obj) {
153 if (this == obj)
154 return true;
155 if (obj == null) {
156 return false;
157 }
158 if ((obj instanceof TurnoutConnectedToBothOutputs.Match)) {
159 TurnoutConnectedToBothOutputs.Match other = (TurnoutConnectedToBothOutputs.Match) obj;
160 return Objects.equals(fT, other.fT);
161 } else {
162 // this should be infrequent
163 if (!(obj instanceof IPatternMatch)) {
164 return false;
165 }
166 IPatternMatch otherSig = (IPatternMatch) obj;
167 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
168 }
169 }
170
171 @Override
172 public TurnoutConnectedToBothOutputs specification() {
173 return TurnoutConnectedToBothOutputs.instance();
174 }
175
176 /**
177 * Returns an empty, mutable match.
178 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
179 *
180 * @return the empty match.
181 *
182 */
183 public static TurnoutConnectedToBothOutputs.Match newEmptyMatch() {
184 return new Mutable(null);
185 }
186
187 /**
188 * Returns a mutable (partial) match.
189 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
190 *
191 * @param pT the fixed value of pattern parameter T, or null if not bound.
192 * @return the new, mutable (partial) match object.
193 *
194 */
195 public static TurnoutConnectedToBothOutputs.Match newMutableMatch(final Turnout pT) {
196 return new Mutable(pT);
197 }
198
199 /**
200 * Returns a new (partial) match.
201 * This can be used e.g. to call the matcher with a partial match.
202 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
203 * @param pT the fixed value of pattern parameter T, or null if not bound.
204 * @return the (partial) match object.
205 *
206 */
207 public static TurnoutConnectedToBothOutputs.Match newMatch(final Turnout pT) {
208 return new Immutable(pT);
209 }
210
211 private static final class Mutable extends TurnoutConnectedToBothOutputs.Match {
212 Mutable(final Turnout pT) {
213 super(pT);
214 }
215
216 @Override
217 public boolean isMutable() {
218 return true;
219 }
220 }
221
222 private static final class Immutable extends TurnoutConnectedToBothOutputs.Match {
223 Immutable(final Turnout pT) {
224 super(pT);
225 }
226
227 @Override
228 public boolean isMutable() {
229 return false;
230 }
231 }
232 }
233
234 /**
235 * Generated pattern matcher API of the modes3.queries.turnoutConnectedToBothOutputs pattern,
236 * providing pattern-specific query methods.
237 *
238 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
239 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
240 *
241 * <p>Matches of the pattern will be represented as {@link Match}.
242 *
243 * <p>Original source:
244 * <code><pre>
245 * {@literal @}Constraint(message = "turnoutConnectedToBothOutputs", severity = "error", key = { T })
246 * pattern turnoutConnectedToBothOutputs(T : Turnout) {
247 * Turnout.straight(T, Straight);
248 * Turnout.divergent(T, Divergent);
249 * Segment.connectedTo(T, Straight);
250 * Segment.connectedTo(T, Divergent);
251 * }
252 * </pre></code>
253 *
254 * @see Match
255 * @see TurnoutConnectedToBothOutputs
256 *
257 */
258 public static class Matcher extends BaseMatcher<TurnoutConnectedToBothOutputs.Match> {
259 /**
260 * Initializes the pattern matcher within an existing VIATRA Query engine.
261 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
262 *
263 * @param engine the existing VIATRA Query engine in which this matcher will be created.
264 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
265 *
266 */
267 public static TurnoutConnectedToBothOutputs.Matcher on(final ViatraQueryEngine engine) {
268 // check if matcher already exists
269 Matcher matcher = engine.getExistingMatcher(querySpecification());
270 if (matcher == null) {
271 matcher = (Matcher)engine.getMatcher(querySpecification());
272 }
273 return matcher;
274 }
275
276 /**
277 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
278 * @return an initialized matcher
279 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
280 *
281 */
282 public static TurnoutConnectedToBothOutputs.Matcher create() {
283 return new Matcher();
284 }
285
286 private static final int POSITION_T = 0;
287
288 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TurnoutConnectedToBothOutputs.Matcher.class);
289
290 /**
291 * Initializes the pattern matcher within an existing VIATRA Query engine.
292 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
293 *
294 * @param engine the existing VIATRA Query engine in which this matcher will be created.
295 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
296 *
297 */
298 private Matcher() {
299 super(querySpecification());
300 }
301
302 /**
303 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
304 * @param pT the fixed value of pattern parameter T, or null if not bound.
305 * @return matches represented as a Match object.
306 *
307 */
308 public Collection<TurnoutConnectedToBothOutputs.Match> getAllMatches(final Turnout pT) {
309 return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet());
310 }
311
312 /**
313 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
314 * </p>
315 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
316 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
317 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
318 * @param pT the fixed value of pattern parameter T, or null if not bound.
319 * @return a stream of matches represented as a Match object.
320 *
321 */
322 public Stream<TurnoutConnectedToBothOutputs.Match> streamAllMatches(final Turnout pT) {
323 return rawStreamAllMatches(new Object[]{pT});
324 }
325
326 /**
327 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
328 * Neither determinism nor randomness of selection is guaranteed.
329 * @param pT the fixed value of pattern parameter T, or null if not bound.
330 * @return a match represented as a Match object, or null if no match is found.
331 *
332 */
333 public Optional<TurnoutConnectedToBothOutputs.Match> getOneArbitraryMatch(final Turnout pT) {
334 return rawGetOneArbitraryMatch(new Object[]{pT});
335 }
336
337 /**
338 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
339 * under any possible substitution of the unspecified parameters (if any).
340 * @param pT the fixed value of pattern parameter T, or null if not bound.
341 * @return true if the input is a valid (partial) match of the pattern.
342 *
343 */
344 public boolean hasMatch(final Turnout pT) {
345 return rawHasMatch(new Object[]{pT});
346 }
347
348 /**
349 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
350 * @param pT the fixed value of pattern parameter T, or null if not bound.
351 * @return the number of pattern matches found.
352 *
353 */
354 public int countMatches(final Turnout pT) {
355 return rawCountMatches(new Object[]{pT});
356 }
357
358 /**
359 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
360 * Neither determinism nor randomness of selection is guaranteed.
361 * @param pT the fixed value of pattern parameter T, or null if not bound.
362 * @param processor the action that will process the selected match.
363 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
364 *
365 */
366 public boolean forOneArbitraryMatch(final Turnout pT, final Consumer<? super TurnoutConnectedToBothOutputs.Match> processor) {
367 return rawForOneArbitraryMatch(new Object[]{pT}, processor);
368 }
369
370 /**
371 * Returns a new (partial) match.
372 * This can be used e.g. to call the matcher with a partial match.
373 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
374 * @param pT the fixed value of pattern parameter T, or null if not bound.
375 * @return the (partial) match object.
376 *
377 */
378 public TurnoutConnectedToBothOutputs.Match newMatch(final Turnout pT) {
379 return TurnoutConnectedToBothOutputs.Match.newMatch(pT);
380 }
381
382 /**
383 * Retrieve the set of values that occur in matches for T.
384 * @return the Set of all values or empty set if there are no matches
385 *
386 */
387 protected Stream<Turnout> rawStreamAllValuesOfT(final Object[] parameters) {
388 return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast);
389 }
390
391 /**
392 * Retrieve the set of values that occur in matches for T.
393 * @return the Set of all values or empty set if there are no matches
394 *
395 */
396 public Set<Turnout> getAllValuesOfT() {
397 return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet());
398 }
399
400 /**
401 * Retrieve the set of values that occur in matches for T.
402 * @return the Set of all values or empty set if there are no matches
403 *
404 */
405 public Stream<Turnout> streamAllValuesOfT() {
406 return rawStreamAllValuesOfT(emptyArray());
407 }
408
409 @Override
410 protected TurnoutConnectedToBothOutputs.Match tupleToMatch(final Tuple t) {
411 try {
412 return TurnoutConnectedToBothOutputs.Match.newMatch((Turnout) t.get(POSITION_T));
413 } catch(ClassCastException e) {
414 LOGGER.error("Element(s) in tuple not properly typed!",e);
415 return null;
416 }
417 }
418
419 @Override
420 protected TurnoutConnectedToBothOutputs.Match arrayToMatch(final Object[] match) {
421 try {
422 return TurnoutConnectedToBothOutputs.Match.newMatch((Turnout) match[POSITION_T]);
423 } catch(ClassCastException e) {
424 LOGGER.error("Element(s) in array not properly typed!",e);
425 return null;
426 }
427 }
428
429 @Override
430 protected TurnoutConnectedToBothOutputs.Match arrayToMatchMutable(final Object[] match) {
431 try {
432 return TurnoutConnectedToBothOutputs.Match.newMutableMatch((Turnout) match[POSITION_T]);
433 } catch(ClassCastException e) {
434 LOGGER.error("Element(s) in array not properly typed!",e);
435 return null;
436 }
437 }
438
439 /**
440 * @return the singleton instance of the query specification of this pattern
441 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
442 *
443 */
444 public static IQuerySpecification<TurnoutConnectedToBothOutputs.Matcher> querySpecification() {
445 return TurnoutConnectedToBothOutputs.instance();
446 }
447 }
448
449 private TurnoutConnectedToBothOutputs() {
450 super(GeneratedPQuery.INSTANCE);
451 }
452
453 /**
454 * @return the singleton instance of the query specification
455 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
456 *
457 */
458 public static TurnoutConnectedToBothOutputs instance() {
459 try{
460 return LazyHolder.INSTANCE;
461 } catch (ExceptionInInitializerError err) {
462 throw processInitializerError(err);
463 }
464 }
465
466 @Override
467 protected TurnoutConnectedToBothOutputs.Matcher instantiate(final ViatraQueryEngine engine) {
468 return TurnoutConnectedToBothOutputs.Matcher.on(engine);
469 }
470
471 @Override
472 public TurnoutConnectedToBothOutputs.Matcher instantiate() {
473 return TurnoutConnectedToBothOutputs.Matcher.create();
474 }
475
476 @Override
477 public TurnoutConnectedToBothOutputs.Match newEmptyMatch() {
478 return TurnoutConnectedToBothOutputs.Match.newEmptyMatch();
479 }
480
481 @Override
482 public TurnoutConnectedToBothOutputs.Match newMatch(final Object... parameters) {
483 return TurnoutConnectedToBothOutputs.Match.newMatch((modes3.Turnout) parameters[0]);
484 }
485
486 /**
487 * Inner class allowing the singleton instance of {@link TurnoutConnectedToBothOutputs} to be created
488 * <b>not</b> at the class load time of the outer class,
489 * but rather at the first call to {@link TurnoutConnectedToBothOutputs#instance()}.
490 *
491 * <p> This workaround is required e.g. to support recursion.
492 *
493 */
494 private static class LazyHolder {
495 private static final TurnoutConnectedToBothOutputs INSTANCE = new TurnoutConnectedToBothOutputs();
496
497 /**
498 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
499 * This initialization order is required to support indirect recursion.
500 *
501 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
502 *
503 */
504 private static final Object STATIC_INITIALIZER = ensureInitialized();
505
506 public static Object ensureInitialized() {
507 INSTANCE.ensureInitializedInternal();
508 return null;
509 }
510 }
511
512 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
513 private static final TurnoutConnectedToBothOutputs.GeneratedPQuery INSTANCE = new GeneratedPQuery();
514
515 private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT);
516
517 private final List<PParameter> parameters = Arrays.asList(parameter_T);
518
519 private GeneratedPQuery() {
520 super(PVisibility.PUBLIC);
521 }
522
523 @Override
524 public String getFullyQualifiedName() {
525 return "modes3.queries.turnoutConnectedToBothOutputs";
526 }
527
528 @Override
529 public List<String> getParameterNames() {
530 return Arrays.asList("T");
531 }
532
533 @Override
534 public List<PParameter> getParameters() {
535 return parameters;
536 }
537
538 @Override
539 public Set<PBody> doGetContainedBodies() {
540 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
541 Set<PBody> bodies = new LinkedHashSet<>();
542 {
543 PBody body = new PBody(this);
544 PVariable var_T = body.getOrCreateVariableByName("T");
545 PVariable var_Straight = body.getOrCreateVariableByName("Straight");
546 PVariable var_Divergent = body.getOrCreateVariableByName("Divergent");
547 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
548 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
549 new ExportedParameter(body, var_T, parameter_T)
550 ));
551 // Turnout.straight(T, Straight)
552 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
553 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
554 new TypeConstraint(body, Tuples.flatTupleOf(var_T, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout", "straight")));
555 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
556 new Equality(body, var__virtual_0_, var_Straight);
557 // Turnout.divergent(T, Divergent)
558 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
559 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
560 new TypeConstraint(body, Tuples.flatTupleOf(var_T, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout", "divergent")));
561 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
562 new Equality(body, var__virtual_1_, var_Divergent);
563 // Segment.connectedTo(T, Straight)
564 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
565 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
566 new TypeConstraint(body, Tuples.flatTupleOf(var_T, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo")));
567 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
568 new Equality(body, var__virtual_2_, var_Straight);
569 // Segment.connectedTo(T, Divergent)
570 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
571 PVariable var__virtual_3_ = body.getOrCreateVariableByName(".virtual{3}");
572 new TypeConstraint(body, Tuples.flatTupleOf(var_T, var__virtual_3_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment", "connectedTo")));
573 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_3_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
574 new Equality(body, var__virtual_3_, var_Divergent);
575 bodies.add(body);
576 }
577 {
578 PAnnotation annotation = new PAnnotation("Constraint");
579 annotation.addAttribute("message", "turnoutConnectedToBothOutputs");
580 annotation.addAttribute("severity", "error");
581 annotation.addAttribute("key", Arrays.asList(new Object[] {
582 new ParameterReference("T")
583 }));
584 addAnnotation(annotation);
585 }
586 return bodies;
587 }
588 }
589}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutOutput.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutOutput.java
new file mode 100644
index 00000000..87cccfde
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutOutput.java
@@ -0,0 +1,727 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import modes3.Turnout;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
29import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
31import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
40import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
41
42/**
43 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
44 *
45 * <p>Original source:
46 * <code><pre>
47 * pattern turnoutOutput(T : Turnout, S : Segment) {
48 * Turnout.straight(T, S);
49 * } or {
50 * Turnout.divergent(T, S);
51 * }
52 * </pre></code>
53 *
54 * @see Matcher
55 * @see Match
56 *
57 */
58@SuppressWarnings("all")
59public final class TurnoutOutput extends BaseGeneratedEMFQuerySpecification<TurnoutOutput.Matcher> {
60 /**
61 * Pattern-specific match representation of the modes3.queries.turnoutOutput pattern,
62 * to be used in conjunction with {@link Matcher}.
63 *
64 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
65 * Each instance is a (possibly partial) substitution of pattern parameters,
66 * usable to represent a match of the pattern in the result of a query,
67 * or to specify the bound (fixed) input parameters when issuing a query.
68 *
69 * @see Matcher
70 *
71 */
72 public static abstract class Match extends BasePatternMatch {
73 private Turnout fT;
74
75 private Segment fS;
76
77 private static List<String> parameterNames = makeImmutableList("T", "S");
78
79 private Match(final Turnout pT, final Segment pS) {
80 this.fT = pT;
81 this.fS = pS;
82 }
83
84 @Override
85 public Object get(final String parameterName) {
86 switch(parameterName) {
87 case "T": return this.fT;
88 case "S": return this.fS;
89 default: return null;
90 }
91 }
92
93 @Override
94 public Object get(final int index) {
95 switch(index) {
96 case 0: return this.fT;
97 case 1: return this.fS;
98 default: return null;
99 }
100 }
101
102 public Turnout getT() {
103 return this.fT;
104 }
105
106 public Segment getS() {
107 return this.fS;
108 }
109
110 @Override
111 public boolean set(final String parameterName, final Object newValue) {
112 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
113 if ("T".equals(parameterName) ) {
114 this.fT = (Turnout) newValue;
115 return true;
116 }
117 if ("S".equals(parameterName) ) {
118 this.fS = (Segment) newValue;
119 return true;
120 }
121 return false;
122 }
123
124 public void setT(final Turnout pT) {
125 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
126 this.fT = pT;
127 }
128
129 public void setS(final Segment pS) {
130 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
131 this.fS = pS;
132 }
133
134 @Override
135 public String patternName() {
136 return "modes3.queries.turnoutOutput";
137 }
138
139 @Override
140 public List<String> parameterNames() {
141 return TurnoutOutput.Match.parameterNames;
142 }
143
144 @Override
145 public Object[] toArray() {
146 return new Object[]{fT, fS};
147 }
148
149 @Override
150 public TurnoutOutput.Match toImmutable() {
151 return isMutable() ? newMatch(fT, fS) : this;
152 }
153
154 @Override
155 public String prettyPrint() {
156 StringBuilder result = new StringBuilder();
157 result.append("\"T\"=" + prettyPrintValue(fT) + ", ");
158 result.append("\"S\"=" + prettyPrintValue(fS));
159 return result.toString();
160 }
161
162 @Override
163 public int hashCode() {
164 return Objects.hash(fT, fS);
165 }
166
167 @Override
168 public boolean equals(final Object obj) {
169 if (this == obj)
170 return true;
171 if (obj == null) {
172 return false;
173 }
174 if ((obj instanceof TurnoutOutput.Match)) {
175 TurnoutOutput.Match other = (TurnoutOutput.Match) obj;
176 return Objects.equals(fT, other.fT) && Objects.equals(fS, other.fS);
177 } else {
178 // this should be infrequent
179 if (!(obj instanceof IPatternMatch)) {
180 return false;
181 }
182 IPatternMatch otherSig = (IPatternMatch) obj;
183 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
184 }
185 }
186
187 @Override
188 public TurnoutOutput specification() {
189 return TurnoutOutput.instance();
190 }
191
192 /**
193 * Returns an empty, mutable match.
194 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
195 *
196 * @return the empty match.
197 *
198 */
199 public static TurnoutOutput.Match newEmptyMatch() {
200 return new Mutable(null, null);
201 }
202
203 /**
204 * Returns a mutable (partial) match.
205 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
206 *
207 * @param pT the fixed value of pattern parameter T, or null if not bound.
208 * @param pS the fixed value of pattern parameter S, or null if not bound.
209 * @return the new, mutable (partial) match object.
210 *
211 */
212 public static TurnoutOutput.Match newMutableMatch(final Turnout pT, final Segment pS) {
213 return new Mutable(pT, pS);
214 }
215
216 /**
217 * Returns a new (partial) match.
218 * This can be used e.g. to call the matcher with a partial match.
219 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
220 * @param pT the fixed value of pattern parameter T, or null if not bound.
221 * @param pS the fixed value of pattern parameter S, or null if not bound.
222 * @return the (partial) match object.
223 *
224 */
225 public static TurnoutOutput.Match newMatch(final Turnout pT, final Segment pS) {
226 return new Immutable(pT, pS);
227 }
228
229 private static final class Mutable extends TurnoutOutput.Match {
230 Mutable(final Turnout pT, final Segment pS) {
231 super(pT, pS);
232 }
233
234 @Override
235 public boolean isMutable() {
236 return true;
237 }
238 }
239
240 private static final class Immutable extends TurnoutOutput.Match {
241 Immutable(final Turnout pT, final Segment pS) {
242 super(pT, pS);
243 }
244
245 @Override
246 public boolean isMutable() {
247 return false;
248 }
249 }
250 }
251
252 /**
253 * Generated pattern matcher API of the modes3.queries.turnoutOutput pattern,
254 * providing pattern-specific query methods.
255 *
256 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
257 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
258 *
259 * <p>Matches of the pattern will be represented as {@link Match}.
260 *
261 * <p>Original source:
262 * <code><pre>
263 * pattern turnoutOutput(T : Turnout, S : Segment) {
264 * Turnout.straight(T, S);
265 * } or {
266 * Turnout.divergent(T, S);
267 * }
268 * </pre></code>
269 *
270 * @see Match
271 * @see TurnoutOutput
272 *
273 */
274 public static class Matcher extends BaseMatcher<TurnoutOutput.Match> {
275 /**
276 * Initializes the pattern matcher within an existing VIATRA Query engine.
277 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
278 *
279 * @param engine the existing VIATRA Query engine in which this matcher will be created.
280 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
281 *
282 */
283 public static TurnoutOutput.Matcher on(final ViatraQueryEngine engine) {
284 // check if matcher already exists
285 Matcher matcher = engine.getExistingMatcher(querySpecification());
286 if (matcher == null) {
287 matcher = (Matcher)engine.getMatcher(querySpecification());
288 }
289 return matcher;
290 }
291
292 /**
293 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
294 * @return an initialized matcher
295 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
296 *
297 */
298 public static TurnoutOutput.Matcher create() {
299 return new Matcher();
300 }
301
302 private static final int POSITION_T = 0;
303
304 private static final int POSITION_S = 1;
305
306 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TurnoutOutput.Matcher.class);
307
308 /**
309 * Initializes the pattern matcher within an existing VIATRA Query engine.
310 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
311 *
312 * @param engine the existing VIATRA Query engine in which this matcher will be created.
313 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
314 *
315 */
316 private Matcher() {
317 super(querySpecification());
318 }
319
320 /**
321 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
322 * @param pT the fixed value of pattern parameter T, or null if not bound.
323 * @param pS the fixed value of pattern parameter S, or null if not bound.
324 * @return matches represented as a Match object.
325 *
326 */
327 public Collection<TurnoutOutput.Match> getAllMatches(final Turnout pT, final Segment pS) {
328 return rawStreamAllMatches(new Object[]{pT, pS}).collect(Collectors.toSet());
329 }
330
331 /**
332 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
333 * </p>
334 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
335 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
336 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
337 * @param pT the fixed value of pattern parameter T, or null if not bound.
338 * @param pS the fixed value of pattern parameter S, or null if not bound.
339 * @return a stream of matches represented as a Match object.
340 *
341 */
342 public Stream<TurnoutOutput.Match> streamAllMatches(final Turnout pT, final Segment pS) {
343 return rawStreamAllMatches(new Object[]{pT, pS});
344 }
345
346 /**
347 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
348 * Neither determinism nor randomness of selection is guaranteed.
349 * @param pT the fixed value of pattern parameter T, or null if not bound.
350 * @param pS the fixed value of pattern parameter S, or null if not bound.
351 * @return a match represented as a Match object, or null if no match is found.
352 *
353 */
354 public Optional<TurnoutOutput.Match> getOneArbitraryMatch(final Turnout pT, final Segment pS) {
355 return rawGetOneArbitraryMatch(new Object[]{pT, pS});
356 }
357
358 /**
359 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
360 * under any possible substitution of the unspecified parameters (if any).
361 * @param pT the fixed value of pattern parameter T, or null if not bound.
362 * @param pS the fixed value of pattern parameter S, or null if not bound.
363 * @return true if the input is a valid (partial) match of the pattern.
364 *
365 */
366 public boolean hasMatch(final Turnout pT, final Segment pS) {
367 return rawHasMatch(new Object[]{pT, pS});
368 }
369
370 /**
371 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
372 * @param pT the fixed value of pattern parameter T, or null if not bound.
373 * @param pS the fixed value of pattern parameter S, or null if not bound.
374 * @return the number of pattern matches found.
375 *
376 */
377 public int countMatches(final Turnout pT, final Segment pS) {
378 return rawCountMatches(new Object[]{pT, pS});
379 }
380
381 /**
382 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
383 * Neither determinism nor randomness of selection is guaranteed.
384 * @param pT the fixed value of pattern parameter T, or null if not bound.
385 * @param pS the fixed value of pattern parameter S, or null if not bound.
386 * @param processor the action that will process the selected match.
387 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
388 *
389 */
390 public boolean forOneArbitraryMatch(final Turnout pT, final Segment pS, final Consumer<? super TurnoutOutput.Match> processor) {
391 return rawForOneArbitraryMatch(new Object[]{pT, pS}, processor);
392 }
393
394 /**
395 * Returns a new (partial) match.
396 * This can be used e.g. to call the matcher with a partial match.
397 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
398 * @param pT the fixed value of pattern parameter T, or null if not bound.
399 * @param pS the fixed value of pattern parameter S, or null if not bound.
400 * @return the (partial) match object.
401 *
402 */
403 public TurnoutOutput.Match newMatch(final Turnout pT, final Segment pS) {
404 return TurnoutOutput.Match.newMatch(pT, pS);
405 }
406
407 /**
408 * Retrieve the set of values that occur in matches for T.
409 * @return the Set of all values or empty set if there are no matches
410 *
411 */
412 protected Stream<Turnout> rawStreamAllValuesOfT(final Object[] parameters) {
413 return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast);
414 }
415
416 /**
417 * Retrieve the set of values that occur in matches for T.
418 * @return the Set of all values or empty set if there are no matches
419 *
420 */
421 public Set<Turnout> getAllValuesOfT() {
422 return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet());
423 }
424
425 /**
426 * Retrieve the set of values that occur in matches for T.
427 * @return the Set of all values or empty set if there are no matches
428 *
429 */
430 public Stream<Turnout> streamAllValuesOfT() {
431 return rawStreamAllValuesOfT(emptyArray());
432 }
433
434 /**
435 * Retrieve the set of values that occur in matches for T.
436 * </p>
437 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
438 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
439 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
440 *
441 * @return the Stream of all values or empty set if there are no matches
442 *
443 */
444 public Stream<Turnout> streamAllValuesOfT(final TurnoutOutput.Match partialMatch) {
445 return rawStreamAllValuesOfT(partialMatch.toArray());
446 }
447
448 /**
449 * Retrieve the set of values that occur in matches for T.
450 * </p>
451 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
452 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
453 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
454 *
455 * @return the Stream of all values or empty set if there are no matches
456 *
457 */
458 public Stream<Turnout> streamAllValuesOfT(final Segment pS) {
459 return rawStreamAllValuesOfT(new Object[]{null, pS});
460 }
461
462 /**
463 * Retrieve the set of values that occur in matches for T.
464 * @return the Set of all values or empty set if there are no matches
465 *
466 */
467 public Set<Turnout> getAllValuesOfT(final TurnoutOutput.Match partialMatch) {
468 return rawStreamAllValuesOfT(partialMatch.toArray()).collect(Collectors.toSet());
469 }
470
471 /**
472 * Retrieve the set of values that occur in matches for T.
473 * @return the Set of all values or empty set if there are no matches
474 *
475 */
476 public Set<Turnout> getAllValuesOfT(final Segment pS) {
477 return rawStreamAllValuesOfT(new Object[]{null, pS}).collect(Collectors.toSet());
478 }
479
480 /**
481 * Retrieve the set of values that occur in matches for S.
482 * @return the Set of all values or empty set if there are no matches
483 *
484 */
485 protected Stream<Segment> rawStreamAllValuesOfS(final Object[] parameters) {
486 return rawStreamAllValues(POSITION_S, parameters).map(Segment.class::cast);
487 }
488
489 /**
490 * Retrieve the set of values that occur in matches for S.
491 * @return the Set of all values or empty set if there are no matches
492 *
493 */
494 public Set<Segment> getAllValuesOfS() {
495 return rawStreamAllValuesOfS(emptyArray()).collect(Collectors.toSet());
496 }
497
498 /**
499 * Retrieve the set of values that occur in matches for S.
500 * @return the Set of all values or empty set if there are no matches
501 *
502 */
503 public Stream<Segment> streamAllValuesOfS() {
504 return rawStreamAllValuesOfS(emptyArray());
505 }
506
507 /**
508 * Retrieve the set of values that occur in matches for S.
509 * </p>
510 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
511 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
512 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
513 *
514 * @return the Stream of all values or empty set if there are no matches
515 *
516 */
517 public Stream<Segment> streamAllValuesOfS(final TurnoutOutput.Match partialMatch) {
518 return rawStreamAllValuesOfS(partialMatch.toArray());
519 }
520
521 /**
522 * Retrieve the set of values that occur in matches for S.
523 * </p>
524 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
525 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
526 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
527 *
528 * @return the Stream of all values or empty set if there are no matches
529 *
530 */
531 public Stream<Segment> streamAllValuesOfS(final Turnout pT) {
532 return rawStreamAllValuesOfS(new Object[]{pT, null});
533 }
534
535 /**
536 * Retrieve the set of values that occur in matches for S.
537 * @return the Set of all values or empty set if there are no matches
538 *
539 */
540 public Set<Segment> getAllValuesOfS(final TurnoutOutput.Match partialMatch) {
541 return rawStreamAllValuesOfS(partialMatch.toArray()).collect(Collectors.toSet());
542 }
543
544 /**
545 * Retrieve the set of values that occur in matches for S.
546 * @return the Set of all values or empty set if there are no matches
547 *
548 */
549 public Set<Segment> getAllValuesOfS(final Turnout pT) {
550 return rawStreamAllValuesOfS(new Object[]{pT, null}).collect(Collectors.toSet());
551 }
552
553 @Override
554 protected TurnoutOutput.Match tupleToMatch(final Tuple t) {
555 try {
556 return TurnoutOutput.Match.newMatch((Turnout) t.get(POSITION_T), (Segment) t.get(POSITION_S));
557 } catch(ClassCastException e) {
558 LOGGER.error("Element(s) in tuple not properly typed!",e);
559 return null;
560 }
561 }
562
563 @Override
564 protected TurnoutOutput.Match arrayToMatch(final Object[] match) {
565 try {
566 return TurnoutOutput.Match.newMatch((Turnout) match[POSITION_T], (Segment) match[POSITION_S]);
567 } catch(ClassCastException e) {
568 LOGGER.error("Element(s) in array not properly typed!",e);
569 return null;
570 }
571 }
572
573 @Override
574 protected TurnoutOutput.Match arrayToMatchMutable(final Object[] match) {
575 try {
576 return TurnoutOutput.Match.newMutableMatch((Turnout) match[POSITION_T], (Segment) match[POSITION_S]);
577 } catch(ClassCastException e) {
578 LOGGER.error("Element(s) in array not properly typed!",e);
579 return null;
580 }
581 }
582
583 /**
584 * @return the singleton instance of the query specification of this pattern
585 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
586 *
587 */
588 public static IQuerySpecification<TurnoutOutput.Matcher> querySpecification() {
589 return TurnoutOutput.instance();
590 }
591 }
592
593 private TurnoutOutput() {
594 super(GeneratedPQuery.INSTANCE);
595 }
596
597 /**
598 * @return the singleton instance of the query specification
599 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
600 *
601 */
602 public static TurnoutOutput instance() {
603 try{
604 return LazyHolder.INSTANCE;
605 } catch (ExceptionInInitializerError err) {
606 throw processInitializerError(err);
607 }
608 }
609
610 @Override
611 protected TurnoutOutput.Matcher instantiate(final ViatraQueryEngine engine) {
612 return TurnoutOutput.Matcher.on(engine);
613 }
614
615 @Override
616 public TurnoutOutput.Matcher instantiate() {
617 return TurnoutOutput.Matcher.create();
618 }
619
620 @Override
621 public TurnoutOutput.Match newEmptyMatch() {
622 return TurnoutOutput.Match.newEmptyMatch();
623 }
624
625 @Override
626 public TurnoutOutput.Match newMatch(final Object... parameters) {
627 return TurnoutOutput.Match.newMatch((modes3.Turnout) parameters[0], (modes3.Segment) parameters[1]);
628 }
629
630 /**
631 * Inner class allowing the singleton instance of {@link TurnoutOutput} to be created
632 * <b>not</b> at the class load time of the outer class,
633 * but rather at the first call to {@link TurnoutOutput#instance()}.
634 *
635 * <p> This workaround is required e.g. to support recursion.
636 *
637 */
638 private static class LazyHolder {
639 private static final TurnoutOutput INSTANCE = new TurnoutOutput();
640
641 /**
642 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
643 * This initialization order is required to support indirect recursion.
644 *
645 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
646 *
647 */
648 private static final Object STATIC_INITIALIZER = ensureInitialized();
649
650 public static Object ensureInitialized() {
651 INSTANCE.ensureInitializedInternal();
652 return null;
653 }
654 }
655
656 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
657 private static final TurnoutOutput.GeneratedPQuery INSTANCE = new GeneratedPQuery();
658
659 private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT);
660
661 private final PParameter parameter_S = new PParameter("S", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
662
663 private final List<PParameter> parameters = Arrays.asList(parameter_T, parameter_S);
664
665 private GeneratedPQuery() {
666 super(PVisibility.PUBLIC);
667 }
668
669 @Override
670 public String getFullyQualifiedName() {
671 return "modes3.queries.turnoutOutput";
672 }
673
674 @Override
675 public List<String> getParameterNames() {
676 return Arrays.asList("T","S");
677 }
678
679 @Override
680 public List<PParameter> getParameters() {
681 return parameters;
682 }
683
684 @Override
685 public Set<PBody> doGetContainedBodies() {
686 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
687 Set<PBody> bodies = new LinkedHashSet<>();
688 {
689 PBody body = new PBody(this);
690 PVariable var_T = body.getOrCreateVariableByName("T");
691 PVariable var_S = body.getOrCreateVariableByName("S");
692 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
693 new TypeConstraint(body, Tuples.flatTupleOf(var_S), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
694 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
695 new ExportedParameter(body, var_T, parameter_T),
696 new ExportedParameter(body, var_S, parameter_S)
697 ));
698 // Turnout.straight(T, S)
699 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
700 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
701 new TypeConstraint(body, Tuples.flatTupleOf(var_T, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout", "straight")));
702 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
703 new Equality(body, var__virtual_0_, var_S);
704 bodies.add(body);
705 }
706 {
707 PBody body = new PBody(this);
708 PVariable var_T = body.getOrCreateVariableByName("T");
709 PVariable var_S = body.getOrCreateVariableByName("S");
710 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
711 new TypeConstraint(body, Tuples.flatTupleOf(var_S), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
712 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
713 new ExportedParameter(body, var_T, parameter_T),
714 new ExportedParameter(body, var_S, parameter_S)
715 ));
716 // Turnout.divergent(T, S)
717 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
718 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
719 new TypeConstraint(body, Tuples.flatTupleOf(var_T, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout", "divergent")));
720 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
721 new Equality(body, var__virtual_0_, var_S);
722 bodies.add(body);
723 }
724 return bodies;
725 }
726 }
727}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutOutputsAreSame.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutOutputsAreSame.java
new file mode 100644
index 00000000..ba59d45c
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutOutputsAreSame.java
@@ -0,0 +1,572 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Turnout;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.viatra.query.runtime.api.IPatternMatch;
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
24import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
25import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
26import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
27import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
32import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
41import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
42
43/**
44 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
45 *
46 * <p>Original source:
47 * <code><pre>
48 * {@literal @}Constraint(message = "turnoutOutputsAreSame", severity = "error", key = { T })
49 * pattern turnoutOutputsAreSame(T : Turnout) {
50 * Turnout.straight(T, S);
51 * Turnout.divergent(T, S);
52 * }
53 * </pre></code>
54 *
55 * @see Matcher
56 * @see Match
57 *
58 */
59@SuppressWarnings("all")
60public final class TurnoutOutputsAreSame extends BaseGeneratedEMFQuerySpecification<TurnoutOutputsAreSame.Matcher> {
61 /**
62 * Pattern-specific match representation of the modes3.queries.turnoutOutputsAreSame pattern,
63 * to be used in conjunction with {@link Matcher}.
64 *
65 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
66 * Each instance is a (possibly partial) substitution of pattern parameters,
67 * usable to represent a match of the pattern in the result of a query,
68 * or to specify the bound (fixed) input parameters when issuing a query.
69 *
70 * @see Matcher
71 *
72 */
73 public static abstract class Match extends BasePatternMatch {
74 private Turnout fT;
75
76 private static List<String> parameterNames = makeImmutableList("T");
77
78 private Match(final Turnout pT) {
79 this.fT = pT;
80 }
81
82 @Override
83 public Object get(final String parameterName) {
84 switch(parameterName) {
85 case "T": return this.fT;
86 default: return null;
87 }
88 }
89
90 @Override
91 public Object get(final int index) {
92 switch(index) {
93 case 0: return this.fT;
94 default: return null;
95 }
96 }
97
98 public Turnout getT() {
99 return this.fT;
100 }
101
102 @Override
103 public boolean set(final String parameterName, final Object newValue) {
104 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
105 if ("T".equals(parameterName) ) {
106 this.fT = (Turnout) newValue;
107 return true;
108 }
109 return false;
110 }
111
112 public void setT(final Turnout pT) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 this.fT = pT;
115 }
116
117 @Override
118 public String patternName() {
119 return "modes3.queries.turnoutOutputsAreSame";
120 }
121
122 @Override
123 public List<String> parameterNames() {
124 return TurnoutOutputsAreSame.Match.parameterNames;
125 }
126
127 @Override
128 public Object[] toArray() {
129 return new Object[]{fT};
130 }
131
132 @Override
133 public TurnoutOutputsAreSame.Match toImmutable() {
134 return isMutable() ? newMatch(fT) : this;
135 }
136
137 @Override
138 public String prettyPrint() {
139 StringBuilder result = new StringBuilder();
140 result.append("\"T\"=" + prettyPrintValue(fT));
141 return result.toString();
142 }
143
144 @Override
145 public int hashCode() {
146 return Objects.hash(fT);
147 }
148
149 @Override
150 public boolean equals(final Object obj) {
151 if (this == obj)
152 return true;
153 if (obj == null) {
154 return false;
155 }
156 if ((obj instanceof TurnoutOutputsAreSame.Match)) {
157 TurnoutOutputsAreSame.Match other = (TurnoutOutputsAreSame.Match) obj;
158 return Objects.equals(fT, other.fT);
159 } else {
160 // this should be infrequent
161 if (!(obj instanceof IPatternMatch)) {
162 return false;
163 }
164 IPatternMatch otherSig = (IPatternMatch) obj;
165 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
166 }
167 }
168
169 @Override
170 public TurnoutOutputsAreSame specification() {
171 return TurnoutOutputsAreSame.instance();
172 }
173
174 /**
175 * Returns an empty, mutable match.
176 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
177 *
178 * @return the empty match.
179 *
180 */
181 public static TurnoutOutputsAreSame.Match newEmptyMatch() {
182 return new Mutable(null);
183 }
184
185 /**
186 * Returns a mutable (partial) match.
187 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
188 *
189 * @param pT the fixed value of pattern parameter T, or null if not bound.
190 * @return the new, mutable (partial) match object.
191 *
192 */
193 public static TurnoutOutputsAreSame.Match newMutableMatch(final Turnout pT) {
194 return new Mutable(pT);
195 }
196
197 /**
198 * Returns a new (partial) match.
199 * This can be used e.g. to call the matcher with a partial match.
200 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
201 * @param pT the fixed value of pattern parameter T, or null if not bound.
202 * @return the (partial) match object.
203 *
204 */
205 public static TurnoutOutputsAreSame.Match newMatch(final Turnout pT) {
206 return new Immutable(pT);
207 }
208
209 private static final class Mutable extends TurnoutOutputsAreSame.Match {
210 Mutable(final Turnout pT) {
211 super(pT);
212 }
213
214 @Override
215 public boolean isMutable() {
216 return true;
217 }
218 }
219
220 private static final class Immutable extends TurnoutOutputsAreSame.Match {
221 Immutable(final Turnout pT) {
222 super(pT);
223 }
224
225 @Override
226 public boolean isMutable() {
227 return false;
228 }
229 }
230 }
231
232 /**
233 * Generated pattern matcher API of the modes3.queries.turnoutOutputsAreSame pattern,
234 * providing pattern-specific query methods.
235 *
236 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
237 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
238 *
239 * <p>Matches of the pattern will be represented as {@link Match}.
240 *
241 * <p>Original source:
242 * <code><pre>
243 * {@literal @}Constraint(message = "turnoutOutputsAreSame", severity = "error", key = { T })
244 * pattern turnoutOutputsAreSame(T : Turnout) {
245 * Turnout.straight(T, S);
246 * Turnout.divergent(T, S);
247 * }
248 * </pre></code>
249 *
250 * @see Match
251 * @see TurnoutOutputsAreSame
252 *
253 */
254 public static class Matcher extends BaseMatcher<TurnoutOutputsAreSame.Match> {
255 /**
256 * Initializes the pattern matcher within an existing VIATRA Query engine.
257 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
258 *
259 * @param engine the existing VIATRA Query engine in which this matcher will be created.
260 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
261 *
262 */
263 public static TurnoutOutputsAreSame.Matcher on(final ViatraQueryEngine engine) {
264 // check if matcher already exists
265 Matcher matcher = engine.getExistingMatcher(querySpecification());
266 if (matcher == null) {
267 matcher = (Matcher)engine.getMatcher(querySpecification());
268 }
269 return matcher;
270 }
271
272 /**
273 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
274 * @return an initialized matcher
275 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
276 *
277 */
278 public static TurnoutOutputsAreSame.Matcher create() {
279 return new Matcher();
280 }
281
282 private static final int POSITION_T = 0;
283
284 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TurnoutOutputsAreSame.Matcher.class);
285
286 /**
287 * Initializes the pattern matcher within an existing VIATRA Query engine.
288 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
289 *
290 * @param engine the existing VIATRA Query engine in which this matcher will be created.
291 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
292 *
293 */
294 private Matcher() {
295 super(querySpecification());
296 }
297
298 /**
299 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
300 * @param pT the fixed value of pattern parameter T, or null if not bound.
301 * @return matches represented as a Match object.
302 *
303 */
304 public Collection<TurnoutOutputsAreSame.Match> getAllMatches(final Turnout pT) {
305 return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet());
306 }
307
308 /**
309 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
310 * </p>
311 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
312 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
313 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
314 * @param pT the fixed value of pattern parameter T, or null if not bound.
315 * @return a stream of matches represented as a Match object.
316 *
317 */
318 public Stream<TurnoutOutputsAreSame.Match> streamAllMatches(final Turnout pT) {
319 return rawStreamAllMatches(new Object[]{pT});
320 }
321
322 /**
323 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
324 * Neither determinism nor randomness of selection is guaranteed.
325 * @param pT the fixed value of pattern parameter T, or null if not bound.
326 * @return a match represented as a Match object, or null if no match is found.
327 *
328 */
329 public Optional<TurnoutOutputsAreSame.Match> getOneArbitraryMatch(final Turnout pT) {
330 return rawGetOneArbitraryMatch(new Object[]{pT});
331 }
332
333 /**
334 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
335 * under any possible substitution of the unspecified parameters (if any).
336 * @param pT the fixed value of pattern parameter T, or null if not bound.
337 * @return true if the input is a valid (partial) match of the pattern.
338 *
339 */
340 public boolean hasMatch(final Turnout pT) {
341 return rawHasMatch(new Object[]{pT});
342 }
343
344 /**
345 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
346 * @param pT the fixed value of pattern parameter T, or null if not bound.
347 * @return the number of pattern matches found.
348 *
349 */
350 public int countMatches(final Turnout pT) {
351 return rawCountMatches(new Object[]{pT});
352 }
353
354 /**
355 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
356 * Neither determinism nor randomness of selection is guaranteed.
357 * @param pT the fixed value of pattern parameter T, or null if not bound.
358 * @param processor the action that will process the selected match.
359 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
360 *
361 */
362 public boolean forOneArbitraryMatch(final Turnout pT, final Consumer<? super TurnoutOutputsAreSame.Match> processor) {
363 return rawForOneArbitraryMatch(new Object[]{pT}, processor);
364 }
365
366 /**
367 * Returns a new (partial) match.
368 * This can be used e.g. to call the matcher with a partial match.
369 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
370 * @param pT the fixed value of pattern parameter T, or null if not bound.
371 * @return the (partial) match object.
372 *
373 */
374 public TurnoutOutputsAreSame.Match newMatch(final Turnout pT) {
375 return TurnoutOutputsAreSame.Match.newMatch(pT);
376 }
377
378 /**
379 * Retrieve the set of values that occur in matches for T.
380 * @return the Set of all values or empty set if there are no matches
381 *
382 */
383 protected Stream<Turnout> rawStreamAllValuesOfT(final Object[] parameters) {
384 return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast);
385 }
386
387 /**
388 * Retrieve the set of values that occur in matches for T.
389 * @return the Set of all values or empty set if there are no matches
390 *
391 */
392 public Set<Turnout> getAllValuesOfT() {
393 return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet());
394 }
395
396 /**
397 * Retrieve the set of values that occur in matches for T.
398 * @return the Set of all values or empty set if there are no matches
399 *
400 */
401 public Stream<Turnout> streamAllValuesOfT() {
402 return rawStreamAllValuesOfT(emptyArray());
403 }
404
405 @Override
406 protected TurnoutOutputsAreSame.Match tupleToMatch(final Tuple t) {
407 try {
408 return TurnoutOutputsAreSame.Match.newMatch((Turnout) t.get(POSITION_T));
409 } catch(ClassCastException e) {
410 LOGGER.error("Element(s) in tuple not properly typed!",e);
411 return null;
412 }
413 }
414
415 @Override
416 protected TurnoutOutputsAreSame.Match arrayToMatch(final Object[] match) {
417 try {
418 return TurnoutOutputsAreSame.Match.newMatch((Turnout) match[POSITION_T]);
419 } catch(ClassCastException e) {
420 LOGGER.error("Element(s) in array not properly typed!",e);
421 return null;
422 }
423 }
424
425 @Override
426 protected TurnoutOutputsAreSame.Match arrayToMatchMutable(final Object[] match) {
427 try {
428 return TurnoutOutputsAreSame.Match.newMutableMatch((Turnout) match[POSITION_T]);
429 } catch(ClassCastException e) {
430 LOGGER.error("Element(s) in array not properly typed!",e);
431 return null;
432 }
433 }
434
435 /**
436 * @return the singleton instance of the query specification of this pattern
437 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
438 *
439 */
440 public static IQuerySpecification<TurnoutOutputsAreSame.Matcher> querySpecification() {
441 return TurnoutOutputsAreSame.instance();
442 }
443 }
444
445 private TurnoutOutputsAreSame() {
446 super(GeneratedPQuery.INSTANCE);
447 }
448
449 /**
450 * @return the singleton instance of the query specification
451 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
452 *
453 */
454 public static TurnoutOutputsAreSame instance() {
455 try{
456 return LazyHolder.INSTANCE;
457 } catch (ExceptionInInitializerError err) {
458 throw processInitializerError(err);
459 }
460 }
461
462 @Override
463 protected TurnoutOutputsAreSame.Matcher instantiate(final ViatraQueryEngine engine) {
464 return TurnoutOutputsAreSame.Matcher.on(engine);
465 }
466
467 @Override
468 public TurnoutOutputsAreSame.Matcher instantiate() {
469 return TurnoutOutputsAreSame.Matcher.create();
470 }
471
472 @Override
473 public TurnoutOutputsAreSame.Match newEmptyMatch() {
474 return TurnoutOutputsAreSame.Match.newEmptyMatch();
475 }
476
477 @Override
478 public TurnoutOutputsAreSame.Match newMatch(final Object... parameters) {
479 return TurnoutOutputsAreSame.Match.newMatch((modes3.Turnout) parameters[0]);
480 }
481
482 /**
483 * Inner class allowing the singleton instance of {@link TurnoutOutputsAreSame} to be created
484 * <b>not</b> at the class load time of the outer class,
485 * but rather at the first call to {@link TurnoutOutputsAreSame#instance()}.
486 *
487 * <p> This workaround is required e.g. to support recursion.
488 *
489 */
490 private static class LazyHolder {
491 private static final TurnoutOutputsAreSame INSTANCE = new TurnoutOutputsAreSame();
492
493 /**
494 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
495 * This initialization order is required to support indirect recursion.
496 *
497 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
498 *
499 */
500 private static final Object STATIC_INITIALIZER = ensureInitialized();
501
502 public static Object ensureInitialized() {
503 INSTANCE.ensureInitializedInternal();
504 return null;
505 }
506 }
507
508 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
509 private static final TurnoutOutputsAreSame.GeneratedPQuery INSTANCE = new GeneratedPQuery();
510
511 private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT);
512
513 private final List<PParameter> parameters = Arrays.asList(parameter_T);
514
515 private GeneratedPQuery() {
516 super(PVisibility.PUBLIC);
517 }
518
519 @Override
520 public String getFullyQualifiedName() {
521 return "modes3.queries.turnoutOutputsAreSame";
522 }
523
524 @Override
525 public List<String> getParameterNames() {
526 return Arrays.asList("T");
527 }
528
529 @Override
530 public List<PParameter> getParameters() {
531 return parameters;
532 }
533
534 @Override
535 public Set<PBody> doGetContainedBodies() {
536 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
537 Set<PBody> bodies = new LinkedHashSet<>();
538 {
539 PBody body = new PBody(this);
540 PVariable var_T = body.getOrCreateVariableByName("T");
541 PVariable var_S = body.getOrCreateVariableByName("S");
542 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
543 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
544 new ExportedParameter(body, var_T, parameter_T)
545 ));
546 // Turnout.straight(T, S)
547 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
548 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
549 new TypeConstraint(body, Tuples.flatTupleOf(var_T, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout", "straight")));
550 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
551 new Equality(body, var__virtual_0_, var_S);
552 // Turnout.divergent(T, S)
553 new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")));
554 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
555 new TypeConstraint(body, Tuples.flatTupleOf(var_T, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout", "divergent")));
556 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
557 new Equality(body, var__virtual_1_, var_S);
558 bodies.add(body);
559 }
560 {
561 PAnnotation annotation = new PAnnotation("Constraint");
562 annotation.addAttribute("message", "turnoutOutputsAreSame");
563 annotation.addAttribute("severity", "error");
564 annotation.addAttribute("key", Arrays.asList(new Object[] {
565 new ParameterReference("T")
566 }));
567 addAnnotation(annotation);
568 }
569 return bodies;
570 }
571 }
572}
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Unreachable.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Unreachable.java
new file mode 100644
index 00000000..a1b76f83
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Unreachable.java
@@ -0,0 +1,714 @@
1/**
2 * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql
3 */
4package modes3.queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import modes3.Segment;
17import modes3.queries.Reachable;
18import org.apache.log4j.Logger;
19import org.eclipse.emf.ecore.EClass;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
32import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
41import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
42
43/**
44 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
45 *
46 * <p>Original source:
47 * <code><pre>
48 * {@literal @}Constraint(message = "unreachable", severity = "error", key = { S1, S2 })
49 * pattern unreachable(S1 : Segment, S2 : Segment) {
50 * neg find reachable(S1, S2);
51 * }
52 * </pre></code>
53 *
54 * @see Matcher
55 * @see Match
56 *
57 */
58@SuppressWarnings("all")
59public final class Unreachable extends BaseGeneratedEMFQuerySpecification<Unreachable.Matcher> {
60 /**
61 * Pattern-specific match representation of the modes3.queries.unreachable pattern,
62 * to be used in conjunction with {@link Matcher}.
63 *
64 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
65 * Each instance is a (possibly partial) substitution of pattern parameters,
66 * usable to represent a match of the pattern in the result of a query,
67 * or to specify the bound (fixed) input parameters when issuing a query.
68 *
69 * @see Matcher
70 *
71 */
72 public static abstract class Match extends BasePatternMatch {
73 private Segment fS1;
74
75 private Segment fS2;
76
77 private static List<String> parameterNames = makeImmutableList("S1", "S2");
78
79 private Match(final Segment pS1, final Segment pS2) {
80 this.fS1 = pS1;
81 this.fS2 = pS2;
82 }
83
84 @Override
85 public Object get(final String parameterName) {
86 switch(parameterName) {
87 case "S1": return this.fS1;
88 case "S2": return this.fS2;
89 default: return null;
90 }
91 }
92
93 @Override
94 public Object get(final int index) {
95 switch(index) {
96 case 0: return this.fS1;
97 case 1: return this.fS2;
98 default: return null;
99 }
100 }
101
102 public Segment getS1() {
103 return this.fS1;
104 }
105
106 public Segment getS2() {
107 return this.fS2;
108 }
109
110 @Override
111 public boolean set(final String parameterName, final Object newValue) {
112 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
113 if ("S1".equals(parameterName) ) {
114 this.fS1 = (Segment) newValue;
115 return true;
116 }
117 if ("S2".equals(parameterName) ) {
118 this.fS2 = (Segment) newValue;
119 return true;
120 }
121 return false;
122 }
123
124 public void setS1(final Segment pS1) {
125 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
126 this.fS1 = pS1;
127 }
128
129 public void setS2(final Segment pS2) {
130 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
131 this.fS2 = pS2;
132 }
133
134 @Override
135 public String patternName() {
136 return "modes3.queries.unreachable";
137 }
138
139 @Override
140 public List<String> parameterNames() {
141 return Unreachable.Match.parameterNames;
142 }
143
144 @Override
145 public Object[] toArray() {
146 return new Object[]{fS1, fS2};
147 }
148
149 @Override
150 public Unreachable.Match toImmutable() {
151 return isMutable() ? newMatch(fS1, fS2) : this;
152 }
153
154 @Override
155 public String prettyPrint() {
156 StringBuilder result = new StringBuilder();
157 result.append("\"S1\"=" + prettyPrintValue(fS1) + ", ");
158 result.append("\"S2\"=" + prettyPrintValue(fS2));
159 return result.toString();
160 }
161
162 @Override
163 public int hashCode() {
164 return Objects.hash(fS1, fS2);
165 }
166
167 @Override
168 public boolean equals(final Object obj) {
169 if (this == obj)
170 return true;
171 if (obj == null) {
172 return false;
173 }
174 if ((obj instanceof Unreachable.Match)) {
175 Unreachable.Match other = (Unreachable.Match) obj;
176 return Objects.equals(fS1, other.fS1) && Objects.equals(fS2, other.fS2);
177 } else {
178 // this should be infrequent
179 if (!(obj instanceof IPatternMatch)) {
180 return false;
181 }
182 IPatternMatch otherSig = (IPatternMatch) obj;
183 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
184 }
185 }
186
187 @Override
188 public Unreachable specification() {
189 return Unreachable.instance();
190 }
191
192 /**
193 * Returns an empty, mutable match.
194 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
195 *
196 * @return the empty match.
197 *
198 */
199 public static Unreachable.Match newEmptyMatch() {
200 return new Mutable(null, null);
201 }
202
203 /**
204 * Returns a mutable (partial) match.
205 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
206 *
207 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
208 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
209 * @return the new, mutable (partial) match object.
210 *
211 */
212 public static Unreachable.Match newMutableMatch(final Segment pS1, final Segment pS2) {
213 return new Mutable(pS1, pS2);
214 }
215
216 /**
217 * Returns a new (partial) match.
218 * This can be used e.g. to call the matcher with a partial match.
219 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
220 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
221 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
222 * @return the (partial) match object.
223 *
224 */
225 public static Unreachable.Match newMatch(final Segment pS1, final Segment pS2) {
226 return new Immutable(pS1, pS2);
227 }
228
229 private static final class Mutable extends Unreachable.Match {
230 Mutable(final Segment pS1, final Segment pS2) {
231 super(pS1, pS2);
232 }
233
234 @Override
235 public boolean isMutable() {
236 return true;
237 }
238 }
239
240 private static final class Immutable extends Unreachable.Match {
241 Immutable(final Segment pS1, final Segment pS2) {
242 super(pS1, pS2);
243 }
244
245 @Override
246 public boolean isMutable() {
247 return false;
248 }
249 }
250 }
251
252 /**
253 * Generated pattern matcher API of the modes3.queries.unreachable pattern,
254 * providing pattern-specific query methods.
255 *
256 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
257 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
258 *
259 * <p>Matches of the pattern will be represented as {@link Match}.
260 *
261 * <p>Original source:
262 * <code><pre>
263 * {@literal @}Constraint(message = "unreachable", severity = "error", key = { S1, S2 })
264 * pattern unreachable(S1 : Segment, S2 : Segment) {
265 * neg find reachable(S1, S2);
266 * }
267 * </pre></code>
268 *
269 * @see Match
270 * @see Unreachable
271 *
272 */
273 public static class Matcher extends BaseMatcher<Unreachable.Match> {
274 /**
275 * Initializes the pattern matcher within an existing VIATRA Query engine.
276 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
277 *
278 * @param engine the existing VIATRA Query engine in which this matcher will be created.
279 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
280 *
281 */
282 public static Unreachable.Matcher on(final ViatraQueryEngine engine) {
283 // check if matcher already exists
284 Matcher matcher = engine.getExistingMatcher(querySpecification());
285 if (matcher == null) {
286 matcher = (Matcher)engine.getMatcher(querySpecification());
287 }
288 return matcher;
289 }
290
291 /**
292 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
293 * @return an initialized matcher
294 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
295 *
296 */
297 public static Unreachable.Matcher create() {
298 return new Matcher();
299 }
300
301 private static final int POSITION_S1 = 0;
302
303 private static final int POSITION_S2 = 1;
304
305 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Unreachable.Matcher.class);
306
307 /**
308 * Initializes the pattern matcher within an existing VIATRA Query engine.
309 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
310 *
311 * @param engine the existing VIATRA Query engine in which this matcher will be created.
312 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
313 *
314 */
315 private Matcher() {
316 super(querySpecification());
317 }
318
319 /**
320 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
321 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
322 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
323 * @return matches represented as a Match object.
324 *
325 */
326 public Collection<Unreachable.Match> getAllMatches(final Segment pS1, final Segment pS2) {
327 return rawStreamAllMatches(new Object[]{pS1, pS2}).collect(Collectors.toSet());
328 }
329
330 /**
331 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
332 * </p>
333 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
334 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
335 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
336 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
337 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
338 * @return a stream of matches represented as a Match object.
339 *
340 */
341 public Stream<Unreachable.Match> streamAllMatches(final Segment pS1, final Segment pS2) {
342 return rawStreamAllMatches(new Object[]{pS1, pS2});
343 }
344
345 /**
346 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
347 * Neither determinism nor randomness of selection is guaranteed.
348 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
349 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
350 * @return a match represented as a Match object, or null if no match is found.
351 *
352 */
353 public Optional<Unreachable.Match> getOneArbitraryMatch(final Segment pS1, final Segment pS2) {
354 return rawGetOneArbitraryMatch(new Object[]{pS1, pS2});
355 }
356
357 /**
358 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
359 * under any possible substitution of the unspecified parameters (if any).
360 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
361 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
362 * @return true if the input is a valid (partial) match of the pattern.
363 *
364 */
365 public boolean hasMatch(final Segment pS1, final Segment pS2) {
366 return rawHasMatch(new Object[]{pS1, pS2});
367 }
368
369 /**
370 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
371 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
372 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
373 * @return the number of pattern matches found.
374 *
375 */
376 public int countMatches(final Segment pS1, final Segment pS2) {
377 return rawCountMatches(new Object[]{pS1, pS2});
378 }
379
380 /**
381 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
382 * Neither determinism nor randomness of selection is guaranteed.
383 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
384 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
385 * @param processor the action that will process the selected match.
386 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
387 *
388 */
389 public boolean forOneArbitraryMatch(final Segment pS1, final Segment pS2, final Consumer<? super Unreachable.Match> processor) {
390 return rawForOneArbitraryMatch(new Object[]{pS1, pS2}, processor);
391 }
392
393 /**
394 * Returns a new (partial) match.
395 * This can be used e.g. to call the matcher with a partial match.
396 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
397 * @param pS1 the fixed value of pattern parameter S1, or null if not bound.
398 * @param pS2 the fixed value of pattern parameter S2, or null if not bound.
399 * @return the (partial) match object.
400 *
401 */
402 public Unreachable.Match newMatch(final Segment pS1, final Segment pS2) {
403 return Unreachable.Match.newMatch(pS1, pS2);
404 }
405
406 /**
407 * Retrieve the set of values that occur in matches for S1.
408 * @return the Set of all values or empty set if there are no matches
409 *
410 */
411 protected Stream<Segment> rawStreamAllValuesOfS1(final Object[] parameters) {
412 return rawStreamAllValues(POSITION_S1, parameters).map(Segment.class::cast);
413 }
414
415 /**
416 * Retrieve the set of values that occur in matches for S1.
417 * @return the Set of all values or empty set if there are no matches
418 *
419 */
420 public Set<Segment> getAllValuesOfS1() {
421 return rawStreamAllValuesOfS1(emptyArray()).collect(Collectors.toSet());
422 }
423
424 /**
425 * Retrieve the set of values that occur in matches for S1.
426 * @return the Set of all values or empty set if there are no matches
427 *
428 */
429 public Stream<Segment> streamAllValuesOfS1() {
430 return rawStreamAllValuesOfS1(emptyArray());
431 }
432
433 /**
434 * Retrieve the set of values that occur in matches for S1.
435 * </p>
436 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
437 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
438 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
439 *
440 * @return the Stream of all values or empty set if there are no matches
441 *
442 */
443 public Stream<Segment> streamAllValuesOfS1(final Unreachable.Match partialMatch) {
444 return rawStreamAllValuesOfS1(partialMatch.toArray());
445 }
446
447 /**
448 * Retrieve the set of values that occur in matches for S1.
449 * </p>
450 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
451 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
452 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
453 *
454 * @return the Stream of all values or empty set if there are no matches
455 *
456 */
457 public Stream<Segment> streamAllValuesOfS1(final Segment pS2) {
458 return rawStreamAllValuesOfS1(new Object[]{null, pS2});
459 }
460
461 /**
462 * Retrieve the set of values that occur in matches for S1.
463 * @return the Set of all values or empty set if there are no matches
464 *
465 */
466 public Set<Segment> getAllValuesOfS1(final Unreachable.Match partialMatch) {
467 return rawStreamAllValuesOfS1(partialMatch.toArray()).collect(Collectors.toSet());
468 }
469
470 /**
471 * Retrieve the set of values that occur in matches for S1.
472 * @return the Set of all values or empty set if there are no matches
473 *
474 */
475 public Set<Segment> getAllValuesOfS1(final Segment pS2) {
476 return rawStreamAllValuesOfS1(new Object[]{null, pS2}).collect(Collectors.toSet());
477 }
478
479 /**
480 * Retrieve the set of values that occur in matches for S2.
481 * @return the Set of all values or empty set if there are no matches
482 *
483 */
484 protected Stream<Segment> rawStreamAllValuesOfS2(final Object[] parameters) {
485 return rawStreamAllValues(POSITION_S2, parameters).map(Segment.class::cast);
486 }
487
488 /**
489 * Retrieve the set of values that occur in matches for S2.
490 * @return the Set of all values or empty set if there are no matches
491 *
492 */
493 public Set<Segment> getAllValuesOfS2() {
494 return rawStreamAllValuesOfS2(emptyArray()).collect(Collectors.toSet());
495 }
496
497 /**
498 * Retrieve the set of values that occur in matches for S2.
499 * @return the Set of all values or empty set if there are no matches
500 *
501 */
502 public Stream<Segment> streamAllValuesOfS2() {
503 return rawStreamAllValuesOfS2(emptyArray());
504 }
505
506 /**
507 * Retrieve the set of values that occur in matches for S2.
508 * </p>
509 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
510 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
511 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
512 *
513 * @return the Stream of all values or empty set if there are no matches
514 *
515 */
516 public Stream<Segment> streamAllValuesOfS2(final Unreachable.Match partialMatch) {
517 return rawStreamAllValuesOfS2(partialMatch.toArray());
518 }
519
520 /**
521 * Retrieve the set of values that occur in matches for S2.
522 * </p>
523 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
524 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
525 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
526 *
527 * @return the Stream of all values or empty set if there are no matches
528 *
529 */
530 public Stream<Segment> streamAllValuesOfS2(final Segment pS1) {
531 return rawStreamAllValuesOfS2(new Object[]{pS1, null});
532 }
533
534 /**
535 * Retrieve the set of values that occur in matches for S2.
536 * @return the Set of all values or empty set if there are no matches
537 *
538 */
539 public Set<Segment> getAllValuesOfS2(final Unreachable.Match partialMatch) {
540 return rawStreamAllValuesOfS2(partialMatch.toArray()).collect(Collectors.toSet());
541 }
542
543 /**
544 * Retrieve the set of values that occur in matches for S2.
545 * @return the Set of all values or empty set if there are no matches
546 *
547 */
548 public Set<Segment> getAllValuesOfS2(final Segment pS1) {
549 return rawStreamAllValuesOfS2(new Object[]{pS1, null}).collect(Collectors.toSet());
550 }
551
552 @Override
553 protected Unreachable.Match tupleToMatch(final Tuple t) {
554 try {
555 return Unreachable.Match.newMatch((Segment) t.get(POSITION_S1), (Segment) t.get(POSITION_S2));
556 } catch(ClassCastException e) {
557 LOGGER.error("Element(s) in tuple not properly typed!",e);
558 return null;
559 }
560 }
561
562 @Override
563 protected Unreachable.Match arrayToMatch(final Object[] match) {
564 try {
565 return Unreachable.Match.newMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
566 } catch(ClassCastException e) {
567 LOGGER.error("Element(s) in array not properly typed!",e);
568 return null;
569 }
570 }
571
572 @Override
573 protected Unreachable.Match arrayToMatchMutable(final Object[] match) {
574 try {
575 return Unreachable.Match.newMutableMatch((Segment) match[POSITION_S1], (Segment) match[POSITION_S2]);
576 } catch(ClassCastException e) {
577 LOGGER.error("Element(s) in array not properly typed!",e);
578 return null;
579 }
580 }
581
582 /**
583 * @return the singleton instance of the query specification of this pattern
584 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
585 *
586 */
587 public static IQuerySpecification<Unreachable.Matcher> querySpecification() {
588 return Unreachable.instance();
589 }
590 }
591
592 private Unreachable() {
593 super(GeneratedPQuery.INSTANCE);
594 }
595
596 /**
597 * @return the singleton instance of the query specification
598 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
599 *
600 */
601 public static Unreachable instance() {
602 try{
603 return LazyHolder.INSTANCE;
604 } catch (ExceptionInInitializerError err) {
605 throw processInitializerError(err);
606 }
607 }
608
609 @Override
610 protected Unreachable.Matcher instantiate(final ViatraQueryEngine engine) {
611 return Unreachable.Matcher.on(engine);
612 }
613
614 @Override
615 public Unreachable.Matcher instantiate() {
616 return Unreachable.Matcher.create();
617 }
618
619 @Override
620 public Unreachable.Match newEmptyMatch() {
621 return Unreachable.Match.newEmptyMatch();
622 }
623
624 @Override
625 public Unreachable.Match newMatch(final Object... parameters) {
626 return Unreachable.Match.newMatch((modes3.Segment) parameters[0], (modes3.Segment) parameters[1]);
627 }
628
629 /**
630 * Inner class allowing the singleton instance of {@link Unreachable} to be created
631 * <b>not</b> at the class load time of the outer class,
632 * but rather at the first call to {@link Unreachable#instance()}.
633 *
634 * <p> This workaround is required e.g. to support recursion.
635 *
636 */
637 private static class LazyHolder {
638 private static final Unreachable INSTANCE = new Unreachable();
639
640 /**
641 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
642 * This initialization order is required to support indirect recursion.
643 *
644 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
645 *
646 */
647 private static final Object STATIC_INITIALIZER = ensureInitialized();
648
649 public static Object ensureInitialized() {
650 INSTANCE.ensureInitializedInternal();
651 return null;
652 }
653 }
654
655 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
656 private static final Unreachable.GeneratedPQuery INSTANCE = new GeneratedPQuery();
657
658 private final PParameter parameter_S1 = new PParameter("S1", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
659
660 private final PParameter parameter_S2 = new PParameter("S2", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT);
661
662 private final List<PParameter> parameters = Arrays.asList(parameter_S1, parameter_S2);
663
664 private GeneratedPQuery() {
665 super(PVisibility.PUBLIC);
666 }
667
668 @Override
669 public String getFullyQualifiedName() {
670 return "modes3.queries.unreachable";
671 }
672
673 @Override
674 public List<String> getParameterNames() {
675 return Arrays.asList("S1","S2");
676 }
677
678 @Override
679 public List<PParameter> getParameters() {
680 return parameters;
681 }
682
683 @Override
684 public Set<PBody> doGetContainedBodies() {
685 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
686 Set<PBody> bodies = new LinkedHashSet<>();
687 {
688 PBody body = new PBody(this);
689 PVariable var_S1 = body.getOrCreateVariableByName("S1");
690 PVariable var_S2 = body.getOrCreateVariableByName("S2");
691 new TypeConstraint(body, Tuples.flatTupleOf(var_S1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
692 new TypeConstraint(body, Tuples.flatTupleOf(var_S2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment")));
693 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
694 new ExportedParameter(body, var_S1, parameter_S1),
695 new ExportedParameter(body, var_S2, parameter_S2)
696 ));
697 // neg find reachable(S1, S2)
698 new NegativePatternCall(body, Tuples.flatTupleOf(var_S1, var_S2), Reachable.instance().getInternalQueryRepresentation());
699 bodies.add(body);
700 }
701 {
702 PAnnotation annotation = new PAnnotation("Constraint");
703 annotation.addAttribute("message", "unreachable");
704 annotation.addAttribute("severity", "error");
705 annotation.addAttribute("key", Arrays.asList(new Object[] {
706 new ParameterReference("S1"),
707 new ParameterReference("S2")
708 }));
709 addAnnotation(annotation);
710 }
711 return bodies;
712 }
713 }
714}