aboutsummaryrefslogtreecommitdiffstats
path: root/Tests/MODELS2020-CaseStudies/case.study.pledge.queries
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/MODELS2020-CaseStudies/case.study.pledge.queries')
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.classpath9
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.project62
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.pde.core.prefs3
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/META-INF/MANIFEST.MF24
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/.gitignore2
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/.gitignore112
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/NewOCLFileX.ocl45
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/case_study_A.vql334
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/run/.RunGenerator.xtendbinbin8709 -> 0 bytes
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/run/.gitignore4
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/build.properties6
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/ocl/queries.ocl14
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/plugin.xml42
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/.gitignore112
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Case_study_A.java438
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv03.java652
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv05.java701
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv06.java669
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv07.java612
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv08.java705
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv10.java616
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv11.java566
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv12.java596
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv13.java591
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv15.java567
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv17.java643
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv20.java587
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv33.java665
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv34.java639
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv35.java639
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv47.java636
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv48.java566
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv49.java561
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv03_eligAll.java606
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv03_hasAll.java551
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv05_inRange.java630
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_inRange.java630
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_noType.java551
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_notEI.java544
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv11_incNotOver100.java684
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv11_incOver100.java629
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv12_notNonRes.java544
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv12_notZZ.java555
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv13.java544
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv15.java637
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv47.java569
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_3.java555
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_Dis.java610
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_notDis.java569
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv49_1.java579
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv49_2.java544
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/queries/NewOCLFileX.ocl45
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/queries/case_study_A.vql334
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/run/RunGenerator.xtend151
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/.RunGenerator.xtendbinbin8709 -> 0 bytes
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/.gitignore4
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/GenerateScenarios.java165
59 files changed, 0 insertions, 23657 deletions
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.classpath b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.classpath
deleted file mode 100644
index 29ba3981..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<classpath>
3 <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
4 <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
5 <classpathentry kind="src" path="src"/>
6 <classpathentry kind="src" path="xtend-gen"/>
7 <classpathentry kind="src" path="src-gen"/>
8 <classpathentry kind="output" path="bin"/>
9</classpath>
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.project b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.project
deleted file mode 100644
index 9080c4bb..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.project
+++ /dev/null
@@ -1,62 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<projectDescription>
3 <name>case.study.pledge.run</name>
4 <comment></comment>
5 <projects>
6 </projects>
7 <buildSpec>
8 <buildCommand>
9 <name>org.eclipse.ocl.pivot.ui.oclbuilder</name>
10 <arguments>
11 <dictionary>
12 <key>disabledExtensions</key>
13 <value>*,essentialocl</value>
14 </dictionary>
15 <dictionary>
16 <key>disabledPaths</key>
17 <value>bin/**,target/**</value>
18 </dictionary>
19 <dictionary>
20 <key>enabledExtensions</key>
21 <value>ecore,ocl,oclinecore,oclstdlib,uml</value>
22 </dictionary>
23 <dictionary>
24 <key>enabledPaths</key>
25 <value>**</value>
26 </dictionary>
27 </arguments>
28 </buildCommand>
29 <buildCommand>
30 <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
31 <arguments>
32 </arguments>
33 </buildCommand>
34 <buildCommand>
35 <name>org.eclipse.viatra.query.tooling.ui.projectbuilder</name>
36 <arguments>
37 </arguments>
38 </buildCommand>
39 <buildCommand>
40 <name>org.eclipse.jdt.core.javabuilder</name>
41 <arguments>
42 </arguments>
43 </buildCommand>
44 <buildCommand>
45 <name>org.eclipse.pde.ManifestBuilder</name>
46 <arguments>
47 </arguments>
48 </buildCommand>
49 <buildCommand>
50 <name>org.eclipse.pde.SchemaBuilder</name>
51 <arguments>
52 </arguments>
53 </buildCommand>
54 </buildSpec>
55 <natures>
56 <nature>org.eclipse.pde.PluginNature</nature>
57 <nature>org.eclipse.jdt.core.javanature</nature>
58 <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
59 <nature>org.eclipse.viatra.query.projectnature</nature>
60 <nature>org.eclipse.ocl.pivot.ui.oclnature</nature>
61 </natures>
62</projectDescription>
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.core.resources.prefs b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 4824b802..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
1eclipse.preferences.version=1
2encoding/<project>=UTF-8
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.jdt.core.prefs b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 295926d9..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
1eclipse.preferences.version=1
2org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
3org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
4org.eclipse.jdt.core.compiler.compliance=1.8
5org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
6org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
7org.eclipse.jdt.core.compiler.source=1.8
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.pde.core.prefs b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index 13325c95..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
1eclipse.preferences.version=1
2pluginProject.equinox=false
3resolve.requirebundle=false
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/META-INF/MANIFEST.MF b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/META-INF/MANIFEST.MF
deleted file mode 100644
index 1ab2d276..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,24 +0,0 @@
1Manifest-Version: 1.0
2Bundle-ManifestVersion: 2
3Bundle-Name: case.study.a.queries
4Bundle-SymbolicName: case.study.pledge.run;singleton:=true
5Bundle-Version: 0.0.1.qualifier
6Export-Package: queries
7Require-Bundle: org.eclipse.emf.ecore,
8 org.eclipse.viatra.query.runtime,
9 org.eclipse.viatra.query.runtime.rete,
10 org.eclipse.viatra.query.runtime.localsearch,
11 org.eclipse.viatra.addon.querybasedfeatures.runtime;bundle-version="2.3.0",
12 org.eclipse.xtext.xbase.lib,
13 case.study.pledge.model;bundle-version="1.0.0",
14 test;bundle-version="0.1.0",
15 hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0",
16 hu.bme.mit.inf.dslreasoner.logic.model;bundle-version="1.0.0",
17 hu.bme.mit.inf.dslreasoner.logic2ecore;bundle-version="1.0.0",
18 hu.bme.mit.inf.dslreasoner.viatra2logic;bundle-version="1.0.0",
19 hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatraquery;bundle-version="1.0.0",
20 hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage;bundle-version="1.0.0",
21 hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner;bundle-version="1.0.0",
22 hu.bme.mit.inf.dslreasoner.visualisation;bundle-version="1.0.0"
23Bundle-RequiredExecutionEnvironment: JavaSE-1.8
24Import-Package: org.apache.log4j
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/.gitignore b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/.gitignore
deleted file mode 100644
index 3d70f0da..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
1/queries/
2/run/
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/.gitignore b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/.gitignore
deleted file mode 100644
index 527f3a0e..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/.gitignore
+++ /dev/null
@@ -1,112 +0,0 @@
1/.Inv17.java._trace
2/.Inv20.java._trace
3/.Inv33_con.java._trace
4/.Inv34.java._trace
5/.Inv35.java._trace
6/.Inv47.java._trace
7/.Inv48.java._trace
8/.Inv48_helper.java._trace
9/.Case_study_A.java._trace
10/.Inv49.java._trace
11/.Inv49_con.java._trace
12/.Inv49_helper.java._trace
13/.H_inv49.java._trace
14/.Ocl_inv49.java._trace
15/.Vql_inv49.java._trace
16/.Vql_inv492.java._trace
17/.H1_inv48.java._trace
18/.H2_inv48.java._trace
19/.Vql_inv48.java._trace
20/.H3_inv48.java._trace
21/.H1_inv49.java._trace
22/.H2_inv49.java._trace
23/.H_inv47.java._trace
24/.Inv35test.java._trace
25/.Inv33.java._trace
26/.X.java._trace
27/.H_inv16_moreThan1.java._trace
28/.H_inv48_1.java._trace
29/.H_inv48_2.java._trace
30/.H_inv48_3.java._trace
31/.H_inv49_1.java._trace
32/.H_inv49_2.java._trace
33/.Inv16.java._trace
34/.Inv15.java._trace
35/.H_inv13.java._trace
36/.Inv13.java._trace
37/.Inv12.java._trace
38/.H_inv12_notNonRes.java._trace
39/.H_inv12_notZZ.java._trace
40/.H_inv11_incOver100.java._trace
41/.Inv11.java._trace
42/.H_inv11_incNotOver100.java._trace
43/.H_inv8_notEI.java._trace
44/.Inv8.java._trace
45/.H_inv08_notEI.java._trace
46/.Inv08.java._trace
47/.H_inv08_inRange.java._trace
48/.X_inv08_inRange.java._trace
49/.X_inv08_notEI.java._trace
50/.X_inv11_incNotOver100.java._trace
51/.X_inv11_incOver100.java._trace
52/.X_inv12_notNonRes.java._trace
53/.X_inv12_notZZ.java._trace
54/.X_inv13.java._trace
55/.X_inv47.java._trace
56/.X_inv48_1.java._trace
57/.X_inv48_2.java._trace
58/.X_inv48_3.java._trace
59/.X_inv49_1.java._trace
60/.X_inv49_2.java._trace
61/.X_inv48_Dis.java._trace
62/.X_inv48_notDis.java._trace
63/.X_inv08_noType.java._trace
64/.X_inv08_invalidType.java._trace
65/.Inv06.java._trace
66/.X_inv06_inRange.java._trace
67/.Inv05.java._trace
68/.X_inv05_inRange.java._trace
69/.Inv03.java._trace
70/.X_inv03_noAll.java._trace
71/.X_inv03_eligAll.java._trace
72/.X_inv03_hasAll.java._trace
73/.Inv07.java._trace
74/.Inv10.java._trace
75/.X_inv15.java._trace
76/Inv03.java
77/Inv05.java
78/Inv06.java
79/X_inv03_eligAll.java
80/X_inv03_hasAll.java
81/X_inv05_inRange.java
82/Case_study_A.java
83/Inv07.java
84/Inv08.java
85/Inv10.java
86/Inv11.java
87/Inv12.java
88/Inv13.java
89/Inv15.java
90/Inv17.java
91/Inv20.java
92/Inv33.java
93/Inv34.java
94/Inv35.java
95/Inv47.java
96/Inv48.java
97/Inv49.java
98/X_inv08_inRange.java
99/X_inv08_noType.java
100/X_inv08_notEI.java
101/X_inv11_incNotOver100.java
102/X_inv11_incOver100.java
103/X_inv12_notNonRes.java
104/X_inv12_notZZ.java
105/X_inv13.java
106/X_inv15.java
107/X_inv47.java
108/X_inv48_3.java
109/X_inv48_Dis.java
110/X_inv48_notDis.java
111/X_inv49_1.java
112/X_inv49_2.java
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/NewOCLFileX.ocl b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/NewOCLFileX.ocl
deleted file mode 100644
index 66ae728e..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/NewOCLFileX.ocl
+++ /dev/null
@@ -1,45 +0,0 @@
1import 'file:/Users/Aren Babikian/git/VIATRA-Attributes/case.study.a.model/model/Taxation.ecore'
2
3package Taxation
4
5--context Income inv inv8:
6--if(not self.income_type.oclIsTypeOf(Employment_Income)) then
7--self.details->forAll(d| d.distance = 0)
8--else
9--self.details->forAll(d| d.distance >= 0.0 and d.distance <= 100)
10--endif
11--
12--context Legal_Union_Record inv inv490:
13--self.individual_A.oclIsKindOf(Tax_Payer)
14--
15--context Legal_Union_Record inv inv491:
16--self.individual_B->forAll(i | i.oclIsKindOf(Physical_Person) )
17--
18--context Legal_Union_Record inv inv492:
19--self.individual_B->forAll(i | not i.oclIsTypeOf(Dependent) )
20--
21--context Legal_Union_Record inv inv493:
22--self.individual_A <> self.individual_B
23--
24--context Tax_Payer inv inv13:
25-- self.addresses->exists( hab_add:Address | hab_add.oclIsTypeOf(Habitual_Address) = true and hab_add.country=Country::ZZ)
26--implies
27-- self.oclIsTypeOf(Resident_Tax_Payer)
28
29 context Income inv inv7:
30let val:Real =self.details->asOrderedSet()->first().distance in
31self.details->forAll(d: Income_Detail|d.distance = val)
32
33--context External_Allowance inv inv15:
34--let child:Dependent = self.person in
35--let h:Household = Household.allInstances()->select(children->includes(child))->asOrderedSet()->first() in
36--let t1:Set(Physical_Person) = Set{h.parents.individual_A}->union(h.parents.individual_B)->select(oclIsKindOf(Tax_Payer)) in
37--if(t1->size()=1) then
38--self.reciver = t1->asOrderedSet()->first()
39--else
40--self.reciver = t1->asOrderedSet()->at(2) or self.reciver = t1->asOrderedSet()->at(1)
41--endif
42
43
44
45endpackage \ No newline at end of file
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/case_study_A.vql b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/case_study_A.vql
deleted file mode 100644
index 5d46bf42..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/queries/case_study_A.vql
+++ /dev/null
@@ -1,334 +0,0 @@
1package queries
2
3import "http:///TaxCard.ecore"
4
5//AttributeRemoved -> DF
6
7//inv1-External_Allowance.amount is a derived feature (TODOcheck)
8//inv2-Tax_Card.income.taxPayer.taxesDue is a derived feature (TODOcheck)
9
10//inv3-multiplicity adjusted
11@Constraint(message = "inv03", severity = "error", key = {dep})
12pattern inv03(dep : Dependent) {
13 find x_inv03_eligAll(dep);
14 neg find x_inv03_hasAll(dep);
15} or {
16 Dependent.birth_year(dep, by);
17 check(2018-by > 21);
18 Dependent.continued_studies(dep, false);
19 Dependent.allowances(dep, _);
20}
21pattern x_inv03_eligAll(dep : Dependent) {
22 Dependent.birth_year(dep, by);
23 check(2018-by <= 21);
24} or {
25 Dependent.continued_studies(dep, true);
26}
27pattern x_inv03_hasAll(dep : Dependent) {
28 Dependent.allowances(dep, _);
29}
30
31//inv5 - oclIsTypeOf - handled here
32@Constraint(message = "inv05", severity = "error", key = {inc})
33pattern inv05(inc : Income) {
34 //income_type: None
35 neg find x_inv08_noType(inc);
36 Income.details.worked_days(inc, wd);
37 check(wd != 0);
38} or {
39 //income_type: Not Employment_Income
40 Income.income_type(inc, type);
41 neg find x_inv08_notEI(type);
42 Income.details.worked_days(inc, wd);
43 check(wd != 0);
44} or {
45 //income_type: Employment Income
46 Income.income_type(inc, type);
47 Employment_Income(type);
48 find x_inv05_inRange(inc);
49}
50pattern x_inv05_inRange(inc : Income) {
51 Income.details.worked_days(inc, wd);
52 check(wd < 1);
53} or {
54 Income.details.worked_days(inc, wd);
55 check(wd > 25);
56}
57
58//inv6-Does not make sens, but directly from OCL
59//first part of or from definition of getAge()
60@Constraint(message = "inv06", severity = "error", key = {tp})
61pattern inv06(tp : Tax_Payer) {
62 Tax_Payer.dependents(tp, _);
63 Tax_Payer.birth_year(tp, TPBy);
64 check(2018 - TPBy > 2018-16);
65} or {
66 Tax_Payer.birth_year(tp, TPBy);
67 Tax_Payer.dependents(tp, dep);
68 Dependent.birth_year(dep, DepBy);
69 check(2018-DepBy <= 2018-TPBy-16);
70}
71
72//inv7-OrderedSet
73@Constraint(message = "inv07", severity = "error", key = {inc})
74pattern inv07(inc : Income) {
75 Income.details.distance(inc, d1);
76 Income.details.distance(inc, d2);
77 check(d1 != d2);//compare values
78}
79
80//user_complete_details-AttributeRemoved
81
82//inv8 - oclIsTypeOf - handled here
83@Constraint(message = "inv08", severity = "error", key = {inc})
84pattern inv08(inc : Income) {
85 //income_type: None
86 neg find x_inv08_noType(inc);
87 Income.details.distance(inc, dist);
88 check(dist != 0);
89} or {
90 //income_type: Not Employment_Income
91 Income.income_type(inc, type);
92 neg find x_inv08_notEI(type);
93 Income.details.distance(inc, dist);
94 check(dist != 0);
95} or {
96 //income_type: Employment Income
97 Income.income_type(inc, type);
98 Employment_Income(type);
99 find x_inv08_inRange(inc);
100}
101pattern x_inv08_notEI(type : Employment_Income) {
102 Employment_Income(type);
103}
104pattern x_inv08_noType(inc : Income) {
105 Income.income_type(inc, _);
106}
107pattern x_inv08_inRange(inc : Income) {
108 Income.details.distance(inc, dist);
109 check(dist < 0);
110} or {
111 Income.details.distance(inc, dist);
112 check(dist > 100);
113}
114//inv9-DerivedFeature
115
116//inv10-Ordered Sets
117@Constraint(message = "inv10", severity = "error", key = {inc})
118pattern inv10(inc : Income) {
119 Income.details.amount(inc, a1);
120 Income.details.amount(inc, a2);
121 check(a1 != a2);//compare values
122}
123
124//inv11-attributes-handled by multiplicity
125@Constraint(message = "inv11", severity = "error", key = {exp})
126pattern inv11(exp : Expense) {
127 find x_inv11_incOver100(exp);
128 find x_inv11_incNotOver100(exp);
129}
130pattern x_inv11_incOver100(exp : Expense) {
131 Expense.income.income_amount(exp, incVal);
132 check(incVal / 2 > 50);
133
134} or {
135 Expense.declared_amount(exp, decl);
136 check(decl != 50);
137}
138pattern x_inv11_incNotOver100(exp : Expense) {
139 Expense.income.income_amount(exp, incVal);
140 check(incVal / 2 <= 50);
141} or {
142 Expense.declared_amount(exp, decl);
143 check(decl < 50);
144} or {
145 Expense.income.income_amount(exp, incVal);
146 Expense.declared_amount(exp, decl);
147 check(decl > incVal/2);
148}
149
150//inv12
151//exists - handled logically
152@Constraint(message = "inv12", severity = "error", key = {tp})
153pattern inv12(tp : Tax_Payer) {
154 Tax_Payer.addresses(tp, hab_add);
155 Habitual_Address(hab_add);
156 neg find x_inv12_notZZ(hab_add);
157 Tax_Payer.incomes(tp, inc);
158 Local_Income(inc);
159 neg find x_inv12_notNonRes(tp);
160}
161pattern x_inv12_notNonRes(tp : Non_Resident_Tax_Payer) {
162 Non_Resident_Tax_Payer(tp);
163}
164pattern x_inv12_notZZ(hab_add : Habitual_Address) {
165 Address.country(hab_add, ::ZZ);
166}
167
168//inv13 - Added new containment rel Phys_Pers->Address
169//exists - handled logically
170@Constraint(message = "inv13", severity = "error", key = {tp})
171pattern inv13(tp : Tax_Payer) {
172 Tax_Payer.addresses(tp, hab_add);
173 Habitual_Address(hab_add);
174 Address.country(hab_add, ::ZZ);
175 neg find x_inv13(tp);
176}
177pattern x_inv13(tp : Resident_Tax_Payer) {
178 Resident_Tax_Payer(tp);
179}
180
181//inv14-MultiplicityChanged
182
183//inv15-Ordered Sets in assignment if block
184//ERROR if no household object
185@Constraint(message = "inv15", severity = "error", key = {ea})
186pattern inv15(ea : External_Allowance) {
187 neg find x_inv15(ea);
188}
189pattern x_inv15(ea : External_Allowance) {
190 External_Allowance.person(ea, child);
191 Household.children(h, child);//only one due to multiplicity
192 Household.parents.individual_A(h, iA);
193 Tax_Payer(iA);
194 External_Allowance.reciver(ea, iA);
195} or {
196 External_Allowance.person(ea, child);
197 Household.children(h, child);//only one due to multiplicity
198 Household.parents.individual_B(h, iB);
199 Tax_Payer(iB);
200 External_Allowance.reciver(ea, iB);
201}
202
203//inv16-Tax_Card.tax_card_type is a derived feature
204
205//inv17-attribute-handled by multiplicity
206@Constraint(message = "inv17", severity = "error", key = {lur})
207pattern inv17(lur : Legal_Union_Record) {
208 Legal_Union_Record.start_year(lur, sy);
209 check(sy < 1950);
210} or {
211 Legal_Union_Record.start_year(lur, sy);
212 check(sy > 2018);
213}
214
215//inv18-MultiplicityChecked
216//inv19-MultiplicityChecked
217
218//inv20-Useless constraint since both edges are containment (TODOCheck)
219//OclIsUndefined-Handled by multiplicity
220@Constraint(message = "inv20", severity = "error", key = {lur})
221pattern inv20(lur : Legal_Union_Record) {
222 Legal_Union_Record.individual_A(lur, iA);
223 Legal_Union_Record.individual_B(lur, iB);
224 iA == iB;
225}
226//inv21-MultiplicityChecked
227//inv22-MultiplicityChecked
228//inv23-MultiplicityChecked
229//inv24-MultiplicityChecked
230//inv25-MultiplicityChecked
231//inv26-MultiplicityChanged
232//inv27-dupOfInv24
233//inv28-dubOfInv23
234//inv29-MultiplicityChanged
235//inv30-AttributeRemoved
236//inv31-AttributeRemoved
237//inv32-AttributeRemoved
238
239//inv33-attribute-handled by multiplicity
240@Constraint(message = "inv33", severity = "error", key = {p})
241pattern inv33(p : Physical_Person) {
242 Physical_Person.birth_year(p, by);
243 check(2018-by < 0);
244} or {
245 Physical_Person.birth_year(p, by);
246 check(2018-by > 100);
247}
248
249//inv34-attribute-handled by multiplicity
250@Constraint(message = "inv34", severity = "error", key = {p})
251pattern inv34(p : Physical_Person) {
252 Physical_Person.birth_month(p, birthMonth);
253 check(birthMonth < 1);
254} or {
255 Physical_Person.birth_month(p, birthMonth);
256 check(birthMonth > 12);
257}
258
259//inv35-attribute-handled by multiplicity
260@Constraint(message = "inv35", severity = "error", key = {p})
261pattern inv35(p : Physical_Person) {
262 Physical_Person.birth_day(p, birthDay);
263 check(birthDay < 1);
264} or {
265 Physical_Person.birth_day(p, birthDay);
266 check(birthDay > 28);
267}
268
269//inv36-AttributeRemoved
270//inv37-AttributeRemoved
271//inv38-AttributeRemoved
272//inv39-AttributeRemoved
273//inv40-AttributeRemoved
274//inv41-AttributeRemoved
275//inv42-AttributeRemoved
276//inv43-AttributeRemoved
277//inv44-AttributeRemoved
278//inv45-AttributeRemoved
279//inv46-AttributeRemoved
280
281//inv47-attributes-handled by multiplicity
282@Constraint(message = "inv47", severity = "error", key = {lur})
283pattern inv47(lur : Legal_Union_Record) {
284 Legal_Union_Record.end_year(lur, endY);
285 Legal_Union_Record.start_year(lur, startY);
286 neg find x_inv47(lur);
287 check(startY >= endY);
288}
289pattern x_inv47(lur : Legal_Union_Record) {
290 Legal_Union_Record.separation_cause(lur, ::NONE);
291 Legal_Union_Record.end_year(lur, -1);
292}
293
294//inv48-attributes-handled by multiplicity
295@Constraint(message = "inv48", severity = "error", key = {p})
296pattern inv48(p : Physical_Person) {
297 neg find x_inv48_notDis(p);
298 neg find x_inv48_Dis(p);
299}
300pattern x_inv48_notDis(p : Physical_Person) {
301 Physical_Person.disability_type(p, ::NONE);
302 Physical_Person.disability_percentage(p, 0.0);
303}
304pattern x_inv48_Dis(p : Physical_Person) {
305 neg find x_inv48_3(p);
306 Physical_Person.disability_percentage(p, disPer);
307 check(disPer > 0.0);
308 check(disPer <= 1.0);
309}
310pattern x_inv48_3(p : Physical_Person) {
311 Physical_Person.disability_type(p, ::NONE);
312}
313
314//inv49-OclKindOf-handled by multiplicity
315@Constraint(message = "inv49", severity = "error", key = {lur})
316pattern inv49(lur : Legal_Union_Record) {
317 neg find x_inv49_1(lur);
318}
319pattern x_inv49_1(lur : Legal_Union_Record) {
320 Legal_Union_Record.individual_A(lur, iA);
321 Legal_Union_Record.individual_B(lur, iB);
322 Tax_Payer(iA);
323 Physical_Person(iB);
324 neg find x_inv49_2(iB);
325 iA != iB;
326}
327pattern x_inv49_2(iB: Dependent) {
328 Dependent(iB);
329}
330
331//inv50-MultiplicityChecked
332//inv51-MultiplicityChecked
333//inv52-MultiplicityChecked
334//inv53-MultiplicityChecked \ No newline at end of file
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/run/.RunGenerator.xtendbin b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/run/.RunGenerator.xtendbin
deleted file mode 100644
index e2021169..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/run/.RunGenerator.xtendbin
+++ /dev/null
Binary files differ
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/run/.gitignore b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/run/.gitignore
deleted file mode 100644
index 8e503b4a..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/bin/run/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
1/.GenerateScenarios.java._trace
2/.checkQueries.java._trace
3/.RunGenerator.xtendbin
4/GenerateScenarios.java
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/build.properties b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/build.properties
deleted file mode 100644
index 88d3713e..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
1bin.includes = META-INF/,\
2 .,\
3 plugin.xml
4source.. = src/,\
5 src-gen/
6output.. = bin/
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/ocl/queries.ocl b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/ocl/queries.ocl
deleted file mode 100644
index de770240..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/ocl/queries.ocl
+++ /dev/null
@@ -1,14 +0,0 @@
1import 'file:/Users/Aren Babikian/git/VIATRA-Attributes/original.PLEDGE.case.studies/model/CD_Case_A.uml'
2--e.g., import 'file:/Users/User_X/CD_Case_A.uml'
3
4package Taxation
5
6context Income inv x:
7 let involved_details:Set(Income_Detail)=self.details->select(i:Income_Detail| i.is_worked=true) in
8 involved_details.amount->sum()
9
10context Expense inv inv11:
11let max:Real = if((self.income.income_amount / 2)>50) then self.income.income_amount / 2 else 50 endif in
12self.declared_amount >= 50 and self.declared_amount <= max
13
14endpackage \ No newline at end of file
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/plugin.xml b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/plugin.xml
deleted file mode 100644
index 63aa0b02..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/plugin.xml
+++ /dev/null
@@ -1,42 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?><plugin>
2 <extension id="queries.Case_study_A" point="org.eclipse.viatra.query.runtime.queryspecification">
3 <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Case_study_A" id="queries.Case_study_A">
4 <query-specification fqn="queries.inv03"/>
5 <query-specification fqn="queries.x_inv03_eligAll"/>
6 <query-specification fqn="queries.x_inv03_hasAll"/>
7 <query-specification fqn="queries.inv05"/>
8 <query-specification fqn="queries.x_inv05_inRange"/>
9 <query-specification fqn="queries.inv06"/>
10 <query-specification fqn="queries.inv07"/>
11 <query-specification fqn="queries.inv08"/>
12 <query-specification fqn="queries.x_inv08_notEI"/>
13 <query-specification fqn="queries.x_inv08_noType"/>
14 <query-specification fqn="queries.x_inv08_inRange"/>
15 <query-specification fqn="queries.inv10"/>
16 <query-specification fqn="queries.inv11"/>
17 <query-specification fqn="queries.x_inv11_incOver100"/>
18 <query-specification fqn="queries.x_inv11_incNotOver100"/>
19 <query-specification fqn="queries.inv12"/>
20 <query-specification fqn="queries.x_inv12_notNonRes"/>
21 <query-specification fqn="queries.x_inv12_notZZ"/>
22 <query-specification fqn="queries.inv13"/>
23 <query-specification fqn="queries.x_inv13"/>
24 <query-specification fqn="queries.inv15"/>
25 <query-specification fqn="queries.x_inv15"/>
26 <query-specification fqn="queries.inv17"/>
27 <query-specification fqn="queries.inv20"/>
28 <query-specification fqn="queries.inv33"/>
29 <query-specification fqn="queries.inv34"/>
30 <query-specification fqn="queries.inv35"/>
31 <query-specification fqn="queries.inv47"/>
32 <query-specification fqn="queries.x_inv47"/>
33 <query-specification fqn="queries.inv48"/>
34 <query-specification fqn="queries.x_inv48_notDis"/>
35 <query-specification fqn="queries.x_inv48_Dis"/>
36 <query-specification fqn="queries.x_inv48_3"/>
37 <query-specification fqn="queries.inv49"/>
38 <query-specification fqn="queries.x_inv49_1"/>
39 <query-specification fqn="queries.x_inv49_2"/>
40 </group>
41 </extension>
42</plugin>
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/.gitignore b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/.gitignore
deleted file mode 100644
index 527f3a0e..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/.gitignore
+++ /dev/null
@@ -1,112 +0,0 @@
1/.Inv17.java._trace
2/.Inv20.java._trace
3/.Inv33_con.java._trace
4/.Inv34.java._trace
5/.Inv35.java._trace
6/.Inv47.java._trace
7/.Inv48.java._trace
8/.Inv48_helper.java._trace
9/.Case_study_A.java._trace
10/.Inv49.java._trace
11/.Inv49_con.java._trace
12/.Inv49_helper.java._trace
13/.H_inv49.java._trace
14/.Ocl_inv49.java._trace
15/.Vql_inv49.java._trace
16/.Vql_inv492.java._trace
17/.H1_inv48.java._trace
18/.H2_inv48.java._trace
19/.Vql_inv48.java._trace
20/.H3_inv48.java._trace
21/.H1_inv49.java._trace
22/.H2_inv49.java._trace
23/.H_inv47.java._trace
24/.Inv35test.java._trace
25/.Inv33.java._trace
26/.X.java._trace
27/.H_inv16_moreThan1.java._trace
28/.H_inv48_1.java._trace
29/.H_inv48_2.java._trace
30/.H_inv48_3.java._trace
31/.H_inv49_1.java._trace
32/.H_inv49_2.java._trace
33/.Inv16.java._trace
34/.Inv15.java._trace
35/.H_inv13.java._trace
36/.Inv13.java._trace
37/.Inv12.java._trace
38/.H_inv12_notNonRes.java._trace
39/.H_inv12_notZZ.java._trace
40/.H_inv11_incOver100.java._trace
41/.Inv11.java._trace
42/.H_inv11_incNotOver100.java._trace
43/.H_inv8_notEI.java._trace
44/.Inv8.java._trace
45/.H_inv08_notEI.java._trace
46/.Inv08.java._trace
47/.H_inv08_inRange.java._trace
48/.X_inv08_inRange.java._trace
49/.X_inv08_notEI.java._trace
50/.X_inv11_incNotOver100.java._trace
51/.X_inv11_incOver100.java._trace
52/.X_inv12_notNonRes.java._trace
53/.X_inv12_notZZ.java._trace
54/.X_inv13.java._trace
55/.X_inv47.java._trace
56/.X_inv48_1.java._trace
57/.X_inv48_2.java._trace
58/.X_inv48_3.java._trace
59/.X_inv49_1.java._trace
60/.X_inv49_2.java._trace
61/.X_inv48_Dis.java._trace
62/.X_inv48_notDis.java._trace
63/.X_inv08_noType.java._trace
64/.X_inv08_invalidType.java._trace
65/.Inv06.java._trace
66/.X_inv06_inRange.java._trace
67/.Inv05.java._trace
68/.X_inv05_inRange.java._trace
69/.Inv03.java._trace
70/.X_inv03_noAll.java._trace
71/.X_inv03_eligAll.java._trace
72/.X_inv03_hasAll.java._trace
73/.Inv07.java._trace
74/.Inv10.java._trace
75/.X_inv15.java._trace
76/Inv03.java
77/Inv05.java
78/Inv06.java
79/X_inv03_eligAll.java
80/X_inv03_hasAll.java
81/X_inv05_inRange.java
82/Case_study_A.java
83/Inv07.java
84/Inv08.java
85/Inv10.java
86/Inv11.java
87/Inv12.java
88/Inv13.java
89/Inv15.java
90/Inv17.java
91/Inv20.java
92/Inv33.java
93/Inv34.java
94/Inv35.java
95/Inv47.java
96/Inv48.java
97/Inv49.java
98/X_inv08_inRange.java
99/X_inv08_noType.java
100/X_inv08_notEI.java
101/X_inv11_incNotOver100.java
102/X_inv11_incOver100.java
103/X_inv12_notNonRes.java
104/X_inv12_notZZ.java
105/X_inv13.java
106/X_inv15.java
107/X_inv47.java
108/X_inv48_3.java
109/X_inv48_Dis.java
110/X_inv48_notDis.java
111/X_inv49_1.java
112/X_inv49_2.java
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Case_study_A.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Case_study_A.java
deleted file mode 100644
index 11c60d6f..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Case_study_A.java
+++ /dev/null
@@ -1,438 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
7import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup;
8import queries.Inv03;
9import queries.Inv05;
10import queries.Inv06;
11import queries.Inv07;
12import queries.Inv08;
13import queries.Inv10;
14import queries.Inv11;
15import queries.Inv12;
16import queries.Inv13;
17import queries.Inv15;
18import queries.Inv17;
19import queries.Inv20;
20import queries.Inv33;
21import queries.Inv34;
22import queries.Inv35;
23import queries.Inv47;
24import queries.Inv48;
25import queries.Inv49;
26import queries.X_inv03_eligAll;
27import queries.X_inv03_hasAll;
28import queries.X_inv05_inRange;
29import queries.X_inv08_inRange;
30import queries.X_inv08_noType;
31import queries.X_inv08_notEI;
32import queries.X_inv11_incNotOver100;
33import queries.X_inv11_incOver100;
34import queries.X_inv12_notNonRes;
35import queries.X_inv12_notZZ;
36import queries.X_inv13;
37import queries.X_inv15;
38import queries.X_inv47;
39import queries.X_inv48_3;
40import queries.X_inv48_Dis;
41import queries.X_inv48_notDis;
42import queries.X_inv49_1;
43import queries.X_inv49_2;
44
45/**
46 * A pattern group formed of all public patterns defined in case_study_A.vql.
47 *
48 * <p>Use the static instance as any {@link interface org.eclipse.viatra.query.runtime.api.IQueryGroup}, to conveniently prepare
49 * a VIATRA Query engine for matching all patterns originally defined in file case_study_A.vql,
50 * in order to achieve better performance than one-by-one on-demand matcher initialization.
51 *
52 * <p> From package queries, the group contains the definition of the following patterns: <ul>
53 * <li>inv03</li>
54 * <li>x_inv03_eligAll</li>
55 * <li>x_inv03_hasAll</li>
56 * <li>inv05</li>
57 * <li>x_inv05_inRange</li>
58 * <li>inv06</li>
59 * <li>inv07</li>
60 * <li>inv08</li>
61 * <li>x_inv08_notEI</li>
62 * <li>x_inv08_noType</li>
63 * <li>x_inv08_inRange</li>
64 * <li>inv10</li>
65 * <li>inv11</li>
66 * <li>x_inv11_incOver100</li>
67 * <li>x_inv11_incNotOver100</li>
68 * <li>inv12</li>
69 * <li>x_inv12_notNonRes</li>
70 * <li>x_inv12_notZZ</li>
71 * <li>inv13</li>
72 * <li>x_inv13</li>
73 * <li>inv15</li>
74 * <li>x_inv15</li>
75 * <li>inv17</li>
76 * <li>inv20</li>
77 * <li>inv33</li>
78 * <li>inv34</li>
79 * <li>inv35</li>
80 * <li>inv47</li>
81 * <li>x_inv47</li>
82 * <li>inv48</li>
83 * <li>x_inv48_notDis</li>
84 * <li>x_inv48_Dis</li>
85 * <li>x_inv48_3</li>
86 * <li>inv49</li>
87 * <li>x_inv49_1</li>
88 * <li>x_inv49_2</li>
89 * </ul>
90 *
91 * @see IQueryGroup
92 *
93 */
94@SuppressWarnings("all")
95public final class Case_study_A extends BaseGeneratedPatternGroup {
96 /**
97 * Access the pattern group.
98 *
99 * @return the singleton instance of the group
100 * @throws ViatraQueryRuntimeException if there was an error loading the generated code of pattern specifications
101 *
102 */
103 public static Case_study_A instance() {
104 if (INSTANCE == null) {
105 INSTANCE = new Case_study_A();
106 }
107 return INSTANCE;
108 }
109
110 private static Case_study_A INSTANCE;
111
112 private Case_study_A() {
113 querySpecifications.add(Inv03.instance());
114 querySpecifications.add(X_inv03_eligAll.instance());
115 querySpecifications.add(X_inv03_hasAll.instance());
116 querySpecifications.add(Inv05.instance());
117 querySpecifications.add(X_inv05_inRange.instance());
118 querySpecifications.add(Inv06.instance());
119 querySpecifications.add(Inv07.instance());
120 querySpecifications.add(Inv08.instance());
121 querySpecifications.add(X_inv08_notEI.instance());
122 querySpecifications.add(X_inv08_noType.instance());
123 querySpecifications.add(X_inv08_inRange.instance());
124 querySpecifications.add(Inv10.instance());
125 querySpecifications.add(Inv11.instance());
126 querySpecifications.add(X_inv11_incOver100.instance());
127 querySpecifications.add(X_inv11_incNotOver100.instance());
128 querySpecifications.add(Inv12.instance());
129 querySpecifications.add(X_inv12_notNonRes.instance());
130 querySpecifications.add(X_inv12_notZZ.instance());
131 querySpecifications.add(Inv13.instance());
132 querySpecifications.add(X_inv13.instance());
133 querySpecifications.add(Inv15.instance());
134 querySpecifications.add(X_inv15.instance());
135 querySpecifications.add(Inv17.instance());
136 querySpecifications.add(Inv20.instance());
137 querySpecifications.add(Inv33.instance());
138 querySpecifications.add(Inv34.instance());
139 querySpecifications.add(Inv35.instance());
140 querySpecifications.add(Inv47.instance());
141 querySpecifications.add(X_inv47.instance());
142 querySpecifications.add(Inv48.instance());
143 querySpecifications.add(X_inv48_notDis.instance());
144 querySpecifications.add(X_inv48_Dis.instance());
145 querySpecifications.add(X_inv48_3.instance());
146 querySpecifications.add(Inv49.instance());
147 querySpecifications.add(X_inv49_1.instance());
148 querySpecifications.add(X_inv49_2.instance());
149 }
150
151 public Inv03 getInv03() {
152 return Inv03.instance();
153 }
154
155 public Inv03.Matcher getInv03(final ViatraQueryEngine engine) {
156 return Inv03.Matcher.on(engine);
157 }
158
159 public X_inv03_eligAll getX_inv03_eligAll() {
160 return X_inv03_eligAll.instance();
161 }
162
163 public X_inv03_eligAll.Matcher getX_inv03_eligAll(final ViatraQueryEngine engine) {
164 return X_inv03_eligAll.Matcher.on(engine);
165 }
166
167 public X_inv03_hasAll getX_inv03_hasAll() {
168 return X_inv03_hasAll.instance();
169 }
170
171 public X_inv03_hasAll.Matcher getX_inv03_hasAll(final ViatraQueryEngine engine) {
172 return X_inv03_hasAll.Matcher.on(engine);
173 }
174
175 public Inv05 getInv05() {
176 return Inv05.instance();
177 }
178
179 public Inv05.Matcher getInv05(final ViatraQueryEngine engine) {
180 return Inv05.Matcher.on(engine);
181 }
182
183 public X_inv05_inRange getX_inv05_inRange() {
184 return X_inv05_inRange.instance();
185 }
186
187 public X_inv05_inRange.Matcher getX_inv05_inRange(final ViatraQueryEngine engine) {
188 return X_inv05_inRange.Matcher.on(engine);
189 }
190
191 public Inv06 getInv06() {
192 return Inv06.instance();
193 }
194
195 public Inv06.Matcher getInv06(final ViatraQueryEngine engine) {
196 return Inv06.Matcher.on(engine);
197 }
198
199 public Inv07 getInv07() {
200 return Inv07.instance();
201 }
202
203 public Inv07.Matcher getInv07(final ViatraQueryEngine engine) {
204 return Inv07.Matcher.on(engine);
205 }
206
207 public Inv08 getInv08() {
208 return Inv08.instance();
209 }
210
211 public Inv08.Matcher getInv08(final ViatraQueryEngine engine) {
212 return Inv08.Matcher.on(engine);
213 }
214
215 public X_inv08_notEI getX_inv08_notEI() {
216 return X_inv08_notEI.instance();
217 }
218
219 public X_inv08_notEI.Matcher getX_inv08_notEI(final ViatraQueryEngine engine) {
220 return X_inv08_notEI.Matcher.on(engine);
221 }
222
223 public X_inv08_noType getX_inv08_noType() {
224 return X_inv08_noType.instance();
225 }
226
227 public X_inv08_noType.Matcher getX_inv08_noType(final ViatraQueryEngine engine) {
228 return X_inv08_noType.Matcher.on(engine);
229 }
230
231 public X_inv08_inRange getX_inv08_inRange() {
232 return X_inv08_inRange.instance();
233 }
234
235 public X_inv08_inRange.Matcher getX_inv08_inRange(final ViatraQueryEngine engine) {
236 return X_inv08_inRange.Matcher.on(engine);
237 }
238
239 public Inv10 getInv10() {
240 return Inv10.instance();
241 }
242
243 public Inv10.Matcher getInv10(final ViatraQueryEngine engine) {
244 return Inv10.Matcher.on(engine);
245 }
246
247 public Inv11 getInv11() {
248 return Inv11.instance();
249 }
250
251 public Inv11.Matcher getInv11(final ViatraQueryEngine engine) {
252 return Inv11.Matcher.on(engine);
253 }
254
255 public X_inv11_incOver100 getX_inv11_incOver100() {
256 return X_inv11_incOver100.instance();
257 }
258
259 public X_inv11_incOver100.Matcher getX_inv11_incOver100(final ViatraQueryEngine engine) {
260 return X_inv11_incOver100.Matcher.on(engine);
261 }
262
263 public X_inv11_incNotOver100 getX_inv11_incNotOver100() {
264 return X_inv11_incNotOver100.instance();
265 }
266
267 public X_inv11_incNotOver100.Matcher getX_inv11_incNotOver100(final ViatraQueryEngine engine) {
268 return X_inv11_incNotOver100.Matcher.on(engine);
269 }
270
271 public Inv12 getInv12() {
272 return Inv12.instance();
273 }
274
275 public Inv12.Matcher getInv12(final ViatraQueryEngine engine) {
276 return Inv12.Matcher.on(engine);
277 }
278
279 public X_inv12_notNonRes getX_inv12_notNonRes() {
280 return X_inv12_notNonRes.instance();
281 }
282
283 public X_inv12_notNonRes.Matcher getX_inv12_notNonRes(final ViatraQueryEngine engine) {
284 return X_inv12_notNonRes.Matcher.on(engine);
285 }
286
287 public X_inv12_notZZ getX_inv12_notZZ() {
288 return X_inv12_notZZ.instance();
289 }
290
291 public X_inv12_notZZ.Matcher getX_inv12_notZZ(final ViatraQueryEngine engine) {
292 return X_inv12_notZZ.Matcher.on(engine);
293 }
294
295 public Inv13 getInv13() {
296 return Inv13.instance();
297 }
298
299 public Inv13.Matcher getInv13(final ViatraQueryEngine engine) {
300 return Inv13.Matcher.on(engine);
301 }
302
303 public X_inv13 getX_inv13() {
304 return X_inv13.instance();
305 }
306
307 public X_inv13.Matcher getX_inv13(final ViatraQueryEngine engine) {
308 return X_inv13.Matcher.on(engine);
309 }
310
311 public Inv15 getInv15() {
312 return Inv15.instance();
313 }
314
315 public Inv15.Matcher getInv15(final ViatraQueryEngine engine) {
316 return Inv15.Matcher.on(engine);
317 }
318
319 public X_inv15 getX_inv15() {
320 return X_inv15.instance();
321 }
322
323 public X_inv15.Matcher getX_inv15(final ViatraQueryEngine engine) {
324 return X_inv15.Matcher.on(engine);
325 }
326
327 public Inv17 getInv17() {
328 return Inv17.instance();
329 }
330
331 public Inv17.Matcher getInv17(final ViatraQueryEngine engine) {
332 return Inv17.Matcher.on(engine);
333 }
334
335 public Inv20 getInv20() {
336 return Inv20.instance();
337 }
338
339 public Inv20.Matcher getInv20(final ViatraQueryEngine engine) {
340 return Inv20.Matcher.on(engine);
341 }
342
343 public Inv33 getInv33() {
344 return Inv33.instance();
345 }
346
347 public Inv33.Matcher getInv33(final ViatraQueryEngine engine) {
348 return Inv33.Matcher.on(engine);
349 }
350
351 public Inv34 getInv34() {
352 return Inv34.instance();
353 }
354
355 public Inv34.Matcher getInv34(final ViatraQueryEngine engine) {
356 return Inv34.Matcher.on(engine);
357 }
358
359 public Inv35 getInv35() {
360 return Inv35.instance();
361 }
362
363 public Inv35.Matcher getInv35(final ViatraQueryEngine engine) {
364 return Inv35.Matcher.on(engine);
365 }
366
367 public Inv47 getInv47() {
368 return Inv47.instance();
369 }
370
371 public Inv47.Matcher getInv47(final ViatraQueryEngine engine) {
372 return Inv47.Matcher.on(engine);
373 }
374
375 public X_inv47 getX_inv47() {
376 return X_inv47.instance();
377 }
378
379 public X_inv47.Matcher getX_inv47(final ViatraQueryEngine engine) {
380 return X_inv47.Matcher.on(engine);
381 }
382
383 public Inv48 getInv48() {
384 return Inv48.instance();
385 }
386
387 public Inv48.Matcher getInv48(final ViatraQueryEngine engine) {
388 return Inv48.Matcher.on(engine);
389 }
390
391 public X_inv48_notDis getX_inv48_notDis() {
392 return X_inv48_notDis.instance();
393 }
394
395 public X_inv48_notDis.Matcher getX_inv48_notDis(final ViatraQueryEngine engine) {
396 return X_inv48_notDis.Matcher.on(engine);
397 }
398
399 public X_inv48_Dis getX_inv48_Dis() {
400 return X_inv48_Dis.instance();
401 }
402
403 public X_inv48_Dis.Matcher getX_inv48_Dis(final ViatraQueryEngine engine) {
404 return X_inv48_Dis.Matcher.on(engine);
405 }
406
407 public X_inv48_3 getX_inv48_3() {
408 return X_inv48_3.instance();
409 }
410
411 public X_inv48_3.Matcher getX_inv48_3(final ViatraQueryEngine engine) {
412 return X_inv48_3.Matcher.on(engine);
413 }
414
415 public Inv49 getInv49() {
416 return Inv49.instance();
417 }
418
419 public Inv49.Matcher getInv49(final ViatraQueryEngine engine) {
420 return Inv49.Matcher.on(engine);
421 }
422
423 public X_inv49_1 getX_inv49_1() {
424 return X_inv49_1.instance();
425 }
426
427 public X_inv49_1.Matcher getX_inv49_1(final ViatraQueryEngine engine) {
428 return X_inv49_1.Matcher.on(engine);
429 }
430
431 public X_inv49_2 getX_inv49_2() {
432 return X_inv49_2.instance();
433 }
434
435 public X_inv49_2.Matcher getX_inv49_2(final ViatraQueryEngine engine) {
436 return X_inv49_2.Matcher.on(engine);
437 }
438}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv03.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv03.java
deleted file mode 100644
index 9038ec4d..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv03.java
+++ /dev/null
@@ -1,652 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Dependent;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
36import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
41import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.ConstantValue;
42import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
43import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
44import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
45import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
46import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
47import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
48import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
49import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
50import queries.X_inv03_eligAll;
51import queries.X_inv03_hasAll;
52
53/**
54 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
55 *
56 * <p>Original source:
57 * <code><pre>
58 * //AttributeRemoved -{@literal >} DF
59 *
60 * //inv1-External_Allowance.amount is a derived feature (TODOcheck)
61 * //inv2-Tax_Card.income.taxPayer.taxesDue is a derived feature (TODOcheck)
62 *
63 * //inv3-multiplicity adjusted
64 * {@literal @}Constraint(message = "inv03", severity = "error", key = {dep})
65 * pattern inv03(dep : Dependent) {
66 * find x_inv03_eligAll(dep);
67 * neg find x_inv03_hasAll(dep);
68 * } or {
69 * Dependent.birth_year(dep, by);
70 * check(2018-by {@literal >} 21);
71 * Dependent.continued_studies(dep, false);
72 * Dependent.allowances(dep, _);
73 * }
74 * </pre></code>
75 *
76 * @see Matcher
77 * @see Match
78 *
79 */
80@SuppressWarnings("all")
81public final class Inv03 extends BaseGeneratedEMFQuerySpecification<Inv03.Matcher> {
82 /**
83 * Pattern-specific match representation of the queries.inv03 pattern,
84 * to be used in conjunction with {@link Matcher}.
85 *
86 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
87 * Each instance is a (possibly partial) substitution of pattern parameters,
88 * usable to represent a match of the pattern in the result of a query,
89 * or to specify the bound (fixed) input parameters when issuing a query.
90 *
91 * @see Matcher
92 *
93 */
94 public static abstract class Match extends BasePatternMatch {
95 private Dependent fDep;
96
97 private static List<String> parameterNames = makeImmutableList("dep");
98
99 private Match(final Dependent pDep) {
100 this.fDep = pDep;
101 }
102
103 @Override
104 public Object get(final String parameterName) {
105 switch(parameterName) {
106 case "dep": return this.fDep;
107 default: return null;
108 }
109 }
110
111 @Override
112 public Object get(final int index) {
113 switch(index) {
114 case 0: return this.fDep;
115 default: return null;
116 }
117 }
118
119 public Dependent getDep() {
120 return this.fDep;
121 }
122
123 @Override
124 public boolean set(final String parameterName, final Object newValue) {
125 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
126 if ("dep".equals(parameterName) ) {
127 this.fDep = (Dependent) newValue;
128 return true;
129 }
130 return false;
131 }
132
133 public void setDep(final Dependent pDep) {
134 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
135 this.fDep = pDep;
136 }
137
138 @Override
139 public String patternName() {
140 return "queries.inv03";
141 }
142
143 @Override
144 public List<String> parameterNames() {
145 return Inv03.Match.parameterNames;
146 }
147
148 @Override
149 public Object[] toArray() {
150 return new Object[]{fDep};
151 }
152
153 @Override
154 public Inv03.Match toImmutable() {
155 return isMutable() ? newMatch(fDep) : this;
156 }
157
158 @Override
159 public String prettyPrint() {
160 StringBuilder result = new StringBuilder();
161 result.append("\"dep\"=" + prettyPrintValue(fDep));
162 return result.toString();
163 }
164
165 @Override
166 public int hashCode() {
167 return Objects.hash(fDep);
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 Inv03.Match)) {
178 Inv03.Match other = (Inv03.Match) obj;
179 return Objects.equals(fDep, other.fDep);
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 Inv03 specification() {
192 return Inv03.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 Inv03.Match newEmptyMatch() {
203 return new Mutable(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 pDep the fixed value of pattern parameter dep, or null if not bound.
211 * @return the new, mutable (partial) match object.
212 *
213 */
214 public static Inv03.Match newMutableMatch(final Dependent pDep) {
215 return new Mutable(pDep);
216 }
217
218 /**
219 * Returns a new (partial) match.
220 * This can be used e.g. to call the matcher with a partial match.
221 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
222 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
223 * @return the (partial) match object.
224 *
225 */
226 public static Inv03.Match newMatch(final Dependent pDep) {
227 return new Immutable(pDep);
228 }
229
230 private static final class Mutable extends Inv03.Match {
231 Mutable(final Dependent pDep) {
232 super(pDep);
233 }
234
235 @Override
236 public boolean isMutable() {
237 return true;
238 }
239 }
240
241 private static final class Immutable extends Inv03.Match {
242 Immutable(final Dependent pDep) {
243 super(pDep);
244 }
245
246 @Override
247 public boolean isMutable() {
248 return false;
249 }
250 }
251 }
252
253 /**
254 * Generated pattern matcher API of the queries.inv03 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 * //AttributeRemoved -{@literal >} DF
265 *
266 * //inv1-External_Allowance.amount is a derived feature (TODOcheck)
267 * //inv2-Tax_Card.income.taxPayer.taxesDue is a derived feature (TODOcheck)
268 *
269 * //inv3-multiplicity adjusted
270 * {@literal @}Constraint(message = "inv03", severity = "error", key = {dep})
271 * pattern inv03(dep : Dependent) {
272 * find x_inv03_eligAll(dep);
273 * neg find x_inv03_hasAll(dep);
274 * } or {
275 * Dependent.birth_year(dep, by);
276 * check(2018-by {@literal >} 21);
277 * Dependent.continued_studies(dep, false);
278 * Dependent.allowances(dep, _);
279 * }
280 * </pre></code>
281 *
282 * @see Match
283 * @see Inv03
284 *
285 */
286 public static class Matcher extends BaseMatcher<Inv03.Match> {
287 /**
288 * Initializes the pattern matcher within an existing VIATRA Query engine.
289 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
290 *
291 * @param engine the existing VIATRA Query engine in which this matcher will be created.
292 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
293 *
294 */
295 public static Inv03.Matcher on(final ViatraQueryEngine engine) {
296 // check if matcher already exists
297 Matcher matcher = engine.getExistingMatcher(querySpecification());
298 if (matcher == null) {
299 matcher = (Matcher)engine.getMatcher(querySpecification());
300 }
301 return matcher;
302 }
303
304 /**
305 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
306 * @return an initialized matcher
307 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
308 *
309 */
310 public static Inv03.Matcher create() {
311 return new Matcher();
312 }
313
314 private static final int POSITION_DEP = 0;
315
316 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv03.Matcher.class);
317
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 private Matcher() {
327 super(querySpecification());
328 }
329
330 /**
331 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
332 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
333 * @return matches represented as a Match object.
334 *
335 */
336 public Collection<Inv03.Match> getAllMatches(final Dependent pDep) {
337 return rawStreamAllMatches(new Object[]{pDep}).collect(Collectors.toSet());
338 }
339
340 /**
341 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
342 * </p>
343 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
344 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
345 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
346 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
347 * @return a stream of matches represented as a Match object.
348 *
349 */
350 public Stream<Inv03.Match> streamAllMatches(final Dependent pDep) {
351 return rawStreamAllMatches(new Object[]{pDep});
352 }
353
354 /**
355 * Returns 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 pDep the fixed value of pattern parameter dep, or null if not bound.
358 * @return a match represented as a Match object, or null if no match is found.
359 *
360 */
361 public Optional<Inv03.Match> getOneArbitraryMatch(final Dependent pDep) {
362 return rawGetOneArbitraryMatch(new Object[]{pDep});
363 }
364
365 /**
366 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
367 * under any possible substitution of the unspecified parameters (if any).
368 * @param pDep the fixed value of pattern parameter dep, 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 Dependent pDep) {
373 return rawHasMatch(new Object[]{pDep});
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 pDep the fixed value of pattern parameter dep, or null if not bound.
379 * @return the number of pattern matches found.
380 *
381 */
382 public int countMatches(final Dependent pDep) {
383 return rawCountMatches(new Object[]{pDep});
384 }
385
386 /**
387 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
388 * Neither determinism nor randomness of selection is guaranteed.
389 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
390 * @param processor the action that will process the selected match.
391 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
392 *
393 */
394 public boolean forOneArbitraryMatch(final Dependent pDep, final Consumer<? super Inv03.Match> processor) {
395 return rawForOneArbitraryMatch(new Object[]{pDep}, processor);
396 }
397
398 /**
399 * Returns a new (partial) match.
400 * This can be used e.g. to call the matcher with a partial match.
401 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
402 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
403 * @return the (partial) match object.
404 *
405 */
406 public Inv03.Match newMatch(final Dependent pDep) {
407 return Inv03.Match.newMatch(pDep);
408 }
409
410 /**
411 * Retrieve the set of values that occur in matches for dep.
412 * @return the Set of all values or empty set if there are no matches
413 *
414 */
415 protected Stream<Dependent> rawStreamAllValuesOfdep(final Object[] parameters) {
416 return rawStreamAllValues(POSITION_DEP, parameters).map(Dependent.class::cast);
417 }
418
419 /**
420 * Retrieve the set of values that occur in matches for dep.
421 * @return the Set of all values or empty set if there are no matches
422 *
423 */
424 public Set<Dependent> getAllValuesOfdep() {
425 return rawStreamAllValuesOfdep(emptyArray()).collect(Collectors.toSet());
426 }
427
428 /**
429 * Retrieve the set of values that occur in matches for dep.
430 * @return the Set of all values or empty set if there are no matches
431 *
432 */
433 public Stream<Dependent> streamAllValuesOfdep() {
434 return rawStreamAllValuesOfdep(emptyArray());
435 }
436
437 @Override
438 protected Inv03.Match tupleToMatch(final Tuple t) {
439 try {
440 return Inv03.Match.newMatch((Dependent) t.get(POSITION_DEP));
441 } catch(ClassCastException e) {
442 LOGGER.error("Element(s) in tuple not properly typed!",e);
443 return null;
444 }
445 }
446
447 @Override
448 protected Inv03.Match arrayToMatch(final Object[] match) {
449 try {
450 return Inv03.Match.newMatch((Dependent) match[POSITION_DEP]);
451 } catch(ClassCastException e) {
452 LOGGER.error("Element(s) in array not properly typed!",e);
453 return null;
454 }
455 }
456
457 @Override
458 protected Inv03.Match arrayToMatchMutable(final Object[] match) {
459 try {
460 return Inv03.Match.newMutableMatch((Dependent) match[POSITION_DEP]);
461 } catch(ClassCastException e) {
462 LOGGER.error("Element(s) in array not properly typed!",e);
463 return null;
464 }
465 }
466
467 /**
468 * @return the singleton instance of the query specification of this pattern
469 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
470 *
471 */
472 public static IQuerySpecification<Inv03.Matcher> querySpecification() {
473 return Inv03.instance();
474 }
475 }
476
477 private Inv03() {
478 super(GeneratedPQuery.INSTANCE);
479 }
480
481 /**
482 * @return the singleton instance of the query specification
483 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
484 *
485 */
486 public static Inv03 instance() {
487 try{
488 return LazyHolder.INSTANCE;
489 } catch (ExceptionInInitializerError err) {
490 throw processInitializerError(err);
491 }
492 }
493
494 @Override
495 protected Inv03.Matcher instantiate(final ViatraQueryEngine engine) {
496 return Inv03.Matcher.on(engine);
497 }
498
499 @Override
500 public Inv03.Matcher instantiate() {
501 return Inv03.Matcher.create();
502 }
503
504 @Override
505 public Inv03.Match newEmptyMatch() {
506 return Inv03.Match.newEmptyMatch();
507 }
508
509 @Override
510 public Inv03.Match newMatch(final Object... parameters) {
511 return Inv03.Match.newMatch((Taxation.Dependent) parameters[0]);
512 }
513
514 /**
515 * Inner class allowing the singleton instance of {@link Inv03} to be created
516 * <b>not</b> at the class load time of the outer class,
517 * but rather at the first call to {@link Inv03#instance()}.
518 *
519 * <p> This workaround is required e.g. to support recursion.
520 *
521 */
522 private static class LazyHolder {
523 private static final Inv03 INSTANCE = new Inv03();
524
525 /**
526 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
527 * This initialization order is required to support indirect recursion.
528 *
529 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
530 *
531 */
532 private static final Object STATIC_INITIALIZER = ensureInitialized();
533
534 public static Object ensureInitialized() {
535 INSTANCE.ensureInitializedInternal();
536 return null;
537 }
538 }
539
540 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
541 private static final Inv03.GeneratedPQuery INSTANCE = new GeneratedPQuery();
542
543 private final PParameter parameter_dep = new PParameter("dep", "Taxation.Dependent", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Dependent")), PParameterDirection.INOUT);
544
545 private final List<PParameter> parameters = Arrays.asList(parameter_dep);
546
547 private GeneratedPQuery() {
548 super(PVisibility.PUBLIC);
549 }
550
551 @Override
552 public String getFullyQualifiedName() {
553 return "queries.inv03";
554 }
555
556 @Override
557 public List<String> getParameterNames() {
558 return Arrays.asList("dep");
559 }
560
561 @Override
562 public List<PParameter> getParameters() {
563 return parameters;
564 }
565
566 @Override
567 public Set<PBody> doGetContainedBodies() {
568 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
569 Set<PBody> bodies = new LinkedHashSet<>();
570 {
571 PBody body = new PBody(this);
572 PVariable var_dep = body.getOrCreateVariableByName("dep");
573 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
574 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
575 new ExportedParameter(body, var_dep, parameter_dep)
576 ));
577 // find x_inv03_eligAll(dep)
578 new PositivePatternCall(body, Tuples.flatTupleOf(var_dep), X_inv03_eligAll.instance().getInternalQueryRepresentation());
579 // neg find x_inv03_hasAll(dep)
580 new NegativePatternCall(body, Tuples.flatTupleOf(var_dep), X_inv03_hasAll.instance().getInternalQueryRepresentation());
581 bodies.add(body);
582 }
583 {
584 PBody body = new PBody(this);
585 PVariable var_dep = body.getOrCreateVariableByName("dep");
586 PVariable var_by = body.getOrCreateVariableByName("by");
587 PVariable var___0_ = body.getOrCreateVariableByName("_<0>");
588 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
589 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
590 new ExportedParameter(body, var_dep, parameter_dep)
591 ));
592 // Dependent.birth_year(dep, by)
593 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
594 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
595 new TypeConstraint(body, Tuples.flatTupleOf(var_dep, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "birth_year")));
596 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
597 new Equality(body, var__virtual_0_, var_by);
598 // check(2018-by > 21)
599 new ExpressionEvaluation(body, new IExpressionEvaluator() {
600
601 @Override
602 public String getShortDescription() {
603 return "Expression evaluation from pattern inv03";
604 }
605
606 @Override
607 public Iterable<String> getInputParameterNames() {
608 return Arrays.asList("by");}
609
610 @Override
611 public Object evaluateExpression(IValueProvider provider) throws Exception {
612 Integer by = (Integer) provider.getValue("by");
613 return evaluateExpression_2_1(by);
614 }
615 }, null);
616 // Dependent.continued_studies(dep, false)
617 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
618 new ConstantValue(body, var__virtual_1_, false);
619 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
620 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
621 new TypeConstraint(body, Tuples.flatTupleOf(var_dep, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Dependent", "continued_studies")));
622 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EBoolean")));
623 new Equality(body, var__virtual_2_, var__virtual_1_);
624 // Dependent.allowances(dep, _)
625 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
626 PVariable var__virtual_3_ = body.getOrCreateVariableByName(".virtual{3}");
627 new TypeConstraint(body, Tuples.flatTupleOf(var_dep, var__virtual_3_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Dependent", "allowances")));
628 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_3_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "External_Allowance")));
629 new Equality(body, var__virtual_3_, var___0_);
630 bodies.add(body);
631 }
632 {
633 PAnnotation annotation = new PAnnotation("Constraint");
634 annotation.addAttribute("message", "inv03");
635 annotation.addAttribute("severity", "error");
636 annotation.addAttribute("key", Arrays.asList(new Object[] {
637 new ParameterReference("dep")
638 }));
639 addAnnotation(annotation);
640 }
641 return bodies;
642 }
643 }
644
645 private static boolean evaluateExpression_2_1(final Integer by) {
646 return ((2018 - (by).intValue()) > 21);
647 }
648
649 private static boolean evaluateExpression_2_2() {
650 return false;
651 }
652}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv05.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv05.java
deleted file mode 100644
index 2dee094d..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv05.java
+++ /dev/null
@@ -1,701 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Income;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
36import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
41import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
42import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
43import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
44import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
45import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
46import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
47import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
48import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
49import queries.X_inv05_inRange;
50import queries.X_inv08_noType;
51import queries.X_inv08_notEI;
52
53/**
54 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
55 *
56 * <p>Original source:
57 * <code><pre>
58 * //inv5 - oclIsTypeOf - handled here
59 * {@literal @}Constraint(message = "inv05", severity = "error", key = {inc})
60 * pattern inv05(inc : Income) {
61 * //income_type: None
62 * neg find x_inv08_noType(inc);
63 * Income.details.worked_days(inc, wd);
64 * check(wd != 0);
65 * } or {
66 * //income_type: Not Employment_Income
67 * Income.income_type(inc, type);
68 * neg find x_inv08_notEI(type);
69 * Income.details.worked_days(inc, wd);
70 * check(wd != 0);
71 * } or {
72 * //income_type: Employment Income
73 * Income.income_type(inc, type);
74 * Employment_Income(type);
75 * find x_inv05_inRange(inc);
76 * }
77 * </pre></code>
78 *
79 * @see Matcher
80 * @see Match
81 *
82 */
83@SuppressWarnings("all")
84public final class Inv05 extends BaseGeneratedEMFQuerySpecification<Inv05.Matcher> {
85 /**
86 * Pattern-specific match representation of the queries.inv05 pattern,
87 * to be used in conjunction with {@link Matcher}.
88 *
89 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
90 * Each instance is a (possibly partial) substitution of pattern parameters,
91 * usable to represent a match of the pattern in the result of a query,
92 * or to specify the bound (fixed) input parameters when issuing a query.
93 *
94 * @see Matcher
95 *
96 */
97 public static abstract class Match extends BasePatternMatch {
98 private Income fInc;
99
100 private static List<String> parameterNames = makeImmutableList("inc");
101
102 private Match(final Income pInc) {
103 this.fInc = pInc;
104 }
105
106 @Override
107 public Object get(final String parameterName) {
108 switch(parameterName) {
109 case "inc": return this.fInc;
110 default: return null;
111 }
112 }
113
114 @Override
115 public Object get(final int index) {
116 switch(index) {
117 case 0: return this.fInc;
118 default: return null;
119 }
120 }
121
122 public Income getInc() {
123 return this.fInc;
124 }
125
126 @Override
127 public boolean set(final String parameterName, final Object newValue) {
128 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
129 if ("inc".equals(parameterName) ) {
130 this.fInc = (Income) newValue;
131 return true;
132 }
133 return false;
134 }
135
136 public void setInc(final Income pInc) {
137 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
138 this.fInc = pInc;
139 }
140
141 @Override
142 public String patternName() {
143 return "queries.inv05";
144 }
145
146 @Override
147 public List<String> parameterNames() {
148 return Inv05.Match.parameterNames;
149 }
150
151 @Override
152 public Object[] toArray() {
153 return new Object[]{fInc};
154 }
155
156 @Override
157 public Inv05.Match toImmutable() {
158 return isMutable() ? newMatch(fInc) : this;
159 }
160
161 @Override
162 public String prettyPrint() {
163 StringBuilder result = new StringBuilder();
164 result.append("\"inc\"=" + prettyPrintValue(fInc));
165 return result.toString();
166 }
167
168 @Override
169 public int hashCode() {
170 return Objects.hash(fInc);
171 }
172
173 @Override
174 public boolean equals(final Object obj) {
175 if (this == obj)
176 return true;
177 if (obj == null) {
178 return false;
179 }
180 if ((obj instanceof Inv05.Match)) {
181 Inv05.Match other = (Inv05.Match) obj;
182 return Objects.equals(fInc, other.fInc);
183 } else {
184 // this should be infrequent
185 if (!(obj instanceof IPatternMatch)) {
186 return false;
187 }
188 IPatternMatch otherSig = (IPatternMatch) obj;
189 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
190 }
191 }
192
193 @Override
194 public Inv05 specification() {
195 return Inv05.instance();
196 }
197
198 /**
199 * Returns an empty, mutable match.
200 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
201 *
202 * @return the empty match.
203 *
204 */
205 public static Inv05.Match newEmptyMatch() {
206 return new Mutable(null);
207 }
208
209 /**
210 * Returns a mutable (partial) match.
211 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
212 *
213 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
214 * @return the new, mutable (partial) match object.
215 *
216 */
217 public static Inv05.Match newMutableMatch(final Income pInc) {
218 return new Mutable(pInc);
219 }
220
221 /**
222 * Returns a new (partial) match.
223 * This can be used e.g. to call the matcher with a partial match.
224 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
225 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
226 * @return the (partial) match object.
227 *
228 */
229 public static Inv05.Match newMatch(final Income pInc) {
230 return new Immutable(pInc);
231 }
232
233 private static final class Mutable extends Inv05.Match {
234 Mutable(final Income pInc) {
235 super(pInc);
236 }
237
238 @Override
239 public boolean isMutable() {
240 return true;
241 }
242 }
243
244 private static final class Immutable extends Inv05.Match {
245 Immutable(final Income pInc) {
246 super(pInc);
247 }
248
249 @Override
250 public boolean isMutable() {
251 return false;
252 }
253 }
254 }
255
256 /**
257 * Generated pattern matcher API of the queries.inv05 pattern,
258 * providing pattern-specific query methods.
259 *
260 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
261 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
262 *
263 * <p>Matches of the pattern will be represented as {@link Match}.
264 *
265 * <p>Original source:
266 * <code><pre>
267 * //inv5 - oclIsTypeOf - handled here
268 * {@literal @}Constraint(message = "inv05", severity = "error", key = {inc})
269 * pattern inv05(inc : Income) {
270 * //income_type: None
271 * neg find x_inv08_noType(inc);
272 * Income.details.worked_days(inc, wd);
273 * check(wd != 0);
274 * } or {
275 * //income_type: Not Employment_Income
276 * Income.income_type(inc, type);
277 * neg find x_inv08_notEI(type);
278 * Income.details.worked_days(inc, wd);
279 * check(wd != 0);
280 * } or {
281 * //income_type: Employment Income
282 * Income.income_type(inc, type);
283 * Employment_Income(type);
284 * find x_inv05_inRange(inc);
285 * }
286 * </pre></code>
287 *
288 * @see Match
289 * @see Inv05
290 *
291 */
292 public static class Matcher extends BaseMatcher<Inv05.Match> {
293 /**
294 * Initializes the pattern matcher within an existing VIATRA Query engine.
295 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
296 *
297 * @param engine the existing VIATRA Query engine in which this matcher will be created.
298 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
299 *
300 */
301 public static Inv05.Matcher on(final ViatraQueryEngine engine) {
302 // check if matcher already exists
303 Matcher matcher = engine.getExistingMatcher(querySpecification());
304 if (matcher == null) {
305 matcher = (Matcher)engine.getMatcher(querySpecification());
306 }
307 return matcher;
308 }
309
310 /**
311 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
312 * @return an initialized matcher
313 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
314 *
315 */
316 public static Inv05.Matcher create() {
317 return new Matcher();
318 }
319
320 private static final int POSITION_INC = 0;
321
322 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv05.Matcher.class);
323
324 /**
325 * Initializes the pattern matcher within an existing VIATRA Query engine.
326 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
327 *
328 * @param engine the existing VIATRA Query engine in which this matcher will be created.
329 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
330 *
331 */
332 private Matcher() {
333 super(querySpecification());
334 }
335
336 /**
337 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
338 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
339 * @return matches represented as a Match object.
340 *
341 */
342 public Collection<Inv05.Match> getAllMatches(final Income pInc) {
343 return rawStreamAllMatches(new Object[]{pInc}).collect(Collectors.toSet());
344 }
345
346 /**
347 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
348 * </p>
349 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
350 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
351 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
352 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
353 * @return a stream of matches represented as a Match object.
354 *
355 */
356 public Stream<Inv05.Match> streamAllMatches(final Income pInc) {
357 return rawStreamAllMatches(new Object[]{pInc});
358 }
359
360 /**
361 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
362 * Neither determinism nor randomness of selection is guaranteed.
363 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
364 * @return a match represented as a Match object, or null if no match is found.
365 *
366 */
367 public Optional<Inv05.Match> getOneArbitraryMatch(final Income pInc) {
368 return rawGetOneArbitraryMatch(new Object[]{pInc});
369 }
370
371 /**
372 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
373 * under any possible substitution of the unspecified parameters (if any).
374 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
375 * @return true if the input is a valid (partial) match of the pattern.
376 *
377 */
378 public boolean hasMatch(final Income pInc) {
379 return rawHasMatch(new Object[]{pInc});
380 }
381
382 /**
383 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
384 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
385 * @return the number of pattern matches found.
386 *
387 */
388 public int countMatches(final Income pInc) {
389 return rawCountMatches(new Object[]{pInc});
390 }
391
392 /**
393 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
394 * Neither determinism nor randomness of selection is guaranteed.
395 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
396 * @param processor the action that will process the selected match.
397 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
398 *
399 */
400 public boolean forOneArbitraryMatch(final Income pInc, final Consumer<? super Inv05.Match> processor) {
401 return rawForOneArbitraryMatch(new Object[]{pInc}, processor);
402 }
403
404 /**
405 * Returns a new (partial) match.
406 * This can be used e.g. to call the matcher with a partial match.
407 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
408 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
409 * @return the (partial) match object.
410 *
411 */
412 public Inv05.Match newMatch(final Income pInc) {
413 return Inv05.Match.newMatch(pInc);
414 }
415
416 /**
417 * Retrieve the set of values that occur in matches for inc.
418 * @return the Set of all values or empty set if there are no matches
419 *
420 */
421 protected Stream<Income> rawStreamAllValuesOfinc(final Object[] parameters) {
422 return rawStreamAllValues(POSITION_INC, parameters).map(Income.class::cast);
423 }
424
425 /**
426 * Retrieve the set of values that occur in matches for inc.
427 * @return the Set of all values or empty set if there are no matches
428 *
429 */
430 public Set<Income> getAllValuesOfinc() {
431 return rawStreamAllValuesOfinc(emptyArray()).collect(Collectors.toSet());
432 }
433
434 /**
435 * Retrieve the set of values that occur in matches for inc.
436 * @return the Set of all values or empty set if there are no matches
437 *
438 */
439 public Stream<Income> streamAllValuesOfinc() {
440 return rawStreamAllValuesOfinc(emptyArray());
441 }
442
443 @Override
444 protected Inv05.Match tupleToMatch(final Tuple t) {
445 try {
446 return Inv05.Match.newMatch((Income) t.get(POSITION_INC));
447 } catch(ClassCastException e) {
448 LOGGER.error("Element(s) in tuple not properly typed!",e);
449 return null;
450 }
451 }
452
453 @Override
454 protected Inv05.Match arrayToMatch(final Object[] match) {
455 try {
456 return Inv05.Match.newMatch((Income) match[POSITION_INC]);
457 } catch(ClassCastException e) {
458 LOGGER.error("Element(s) in array not properly typed!",e);
459 return null;
460 }
461 }
462
463 @Override
464 protected Inv05.Match arrayToMatchMutable(final Object[] match) {
465 try {
466 return Inv05.Match.newMutableMatch((Income) match[POSITION_INC]);
467 } catch(ClassCastException e) {
468 LOGGER.error("Element(s) in array not properly typed!",e);
469 return null;
470 }
471 }
472
473 /**
474 * @return the singleton instance of the query specification of this pattern
475 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
476 *
477 */
478 public static IQuerySpecification<Inv05.Matcher> querySpecification() {
479 return Inv05.instance();
480 }
481 }
482
483 private Inv05() {
484 super(GeneratedPQuery.INSTANCE);
485 }
486
487 /**
488 * @return the singleton instance of the query specification
489 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
490 *
491 */
492 public static Inv05 instance() {
493 try{
494 return LazyHolder.INSTANCE;
495 } catch (ExceptionInInitializerError err) {
496 throw processInitializerError(err);
497 }
498 }
499
500 @Override
501 protected Inv05.Matcher instantiate(final ViatraQueryEngine engine) {
502 return Inv05.Matcher.on(engine);
503 }
504
505 @Override
506 public Inv05.Matcher instantiate() {
507 return Inv05.Matcher.create();
508 }
509
510 @Override
511 public Inv05.Match newEmptyMatch() {
512 return Inv05.Match.newEmptyMatch();
513 }
514
515 @Override
516 public Inv05.Match newMatch(final Object... parameters) {
517 return Inv05.Match.newMatch((Taxation.Income) parameters[0]);
518 }
519
520 /**
521 * Inner class allowing the singleton instance of {@link Inv05} to be created
522 * <b>not</b> at the class load time of the outer class,
523 * but rather at the first call to {@link Inv05#instance()}.
524 *
525 * <p> This workaround is required e.g. to support recursion.
526 *
527 */
528 private static class LazyHolder {
529 private static final Inv05 INSTANCE = new Inv05();
530
531 /**
532 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
533 * This initialization order is required to support indirect recursion.
534 *
535 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
536 *
537 */
538 private static final Object STATIC_INITIALIZER = ensureInitialized();
539
540 public static Object ensureInitialized() {
541 INSTANCE.ensureInitializedInternal();
542 return null;
543 }
544 }
545
546 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
547 private static final Inv05.GeneratedPQuery INSTANCE = new GeneratedPQuery();
548
549 private final PParameter parameter_inc = new PParameter("inc", "Taxation.Income", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Income")), PParameterDirection.INOUT);
550
551 private final List<PParameter> parameters = Arrays.asList(parameter_inc);
552
553 private GeneratedPQuery() {
554 super(PVisibility.PUBLIC);
555 }
556
557 @Override
558 public String getFullyQualifiedName() {
559 return "queries.inv05";
560 }
561
562 @Override
563 public List<String> getParameterNames() {
564 return Arrays.asList("inc");
565 }
566
567 @Override
568 public List<PParameter> getParameters() {
569 return parameters;
570 }
571
572 @Override
573 public Set<PBody> doGetContainedBodies() {
574 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
575 Set<PBody> bodies = new LinkedHashSet<>();
576 {
577 PBody body = new PBody(this);
578 PVariable var_inc = body.getOrCreateVariableByName("inc");
579 PVariable var_wd = body.getOrCreateVariableByName("wd");
580 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
581 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
582 new ExportedParameter(body, var_inc, parameter_inc)
583 ));
584 // //income_type: None neg find x_inv08_noType(inc)
585 new NegativePatternCall(body, Tuples.flatTupleOf(var_inc), X_inv08_noType.instance().getInternalQueryRepresentation());
586 // Income.details.worked_days(inc, wd)
587 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
588 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
589 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
590 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
591 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
592 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "worked_days")));
593 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
594 new Equality(body, var__virtual_1_, var_wd);
595 // check(wd != 0)
596 new ExpressionEvaluation(body, new IExpressionEvaluator() {
597
598 @Override
599 public String getShortDescription() {
600 return "Expression evaluation from pattern inv05";
601 }
602
603 @Override
604 public Iterable<String> getInputParameterNames() {
605 return Arrays.asList("wd");}
606
607 @Override
608 public Object evaluateExpression(IValueProvider provider) throws Exception {
609 Integer wd = (Integer) provider.getValue("wd");
610 return evaluateExpression_1_1(wd);
611 }
612 }, null);
613 bodies.add(body);
614 }
615 {
616 PBody body = new PBody(this);
617 PVariable var_inc = body.getOrCreateVariableByName("inc");
618 PVariable var_type = body.getOrCreateVariableByName("type");
619 PVariable var_wd = body.getOrCreateVariableByName("wd");
620 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
621 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
622 new ExportedParameter(body, var_inc, parameter_inc)
623 ));
624 // //income_type: Not Employment_Income Income.income_type(inc, type)
625 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
626 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
627 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "income_type")));
628 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Type")));
629 new Equality(body, var__virtual_0_, var_type);
630 // neg find x_inv08_notEI(type)
631 new NegativePatternCall(body, Tuples.flatTupleOf(var_type), X_inv08_notEI.instance().getInternalQueryRepresentation());
632 // Income.details.worked_days(inc, wd)
633 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
634 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
635 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
636 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
637 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
638 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "worked_days")));
639 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
640 new Equality(body, var__virtual_2_, var_wd);
641 // check(wd != 0)
642 new ExpressionEvaluation(body, new IExpressionEvaluator() {
643
644 @Override
645 public String getShortDescription() {
646 return "Expression evaluation from pattern inv05";
647 }
648
649 @Override
650 public Iterable<String> getInputParameterNames() {
651 return Arrays.asList("wd");}
652
653 @Override
654 public Object evaluateExpression(IValueProvider provider) throws Exception {
655 Integer wd = (Integer) provider.getValue("wd");
656 return evaluateExpression_2_1(wd);
657 }
658 }, null);
659 bodies.add(body);
660 }
661 {
662 PBody body = new PBody(this);
663 PVariable var_inc = body.getOrCreateVariableByName("inc");
664 PVariable var_type = body.getOrCreateVariableByName("type");
665 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
666 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
667 new ExportedParameter(body, var_inc, parameter_inc)
668 ));
669 // //income_type: Employment Income Income.income_type(inc, type)
670 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
671 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
672 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "income_type")));
673 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Type")));
674 new Equality(body, var__virtual_0_, var_type);
675 // Employment_Income(type)
676 new TypeConstraint(body, Tuples.flatTupleOf(var_type), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Employment_Income")));
677 // find x_inv05_inRange(inc)
678 new PositivePatternCall(body, Tuples.flatTupleOf(var_inc), X_inv05_inRange.instance().getInternalQueryRepresentation());
679 bodies.add(body);
680 }
681 {
682 PAnnotation annotation = new PAnnotation("Constraint");
683 annotation.addAttribute("message", "inv05");
684 annotation.addAttribute("severity", "error");
685 annotation.addAttribute("key", Arrays.asList(new Object[] {
686 new ParameterReference("inc")
687 }));
688 addAnnotation(annotation);
689 }
690 return bodies;
691 }
692 }
693
694 private static boolean evaluateExpression_1_1(final Integer wd) {
695 return ((wd).intValue() != 0);
696 }
697
698 private static boolean evaluateExpression_2_1(final Integer wd) {
699 return ((wd).intValue() != 0);
700 }
701}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv06.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv06.java
deleted file mode 100644
index aafdbe41..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv06.java
+++ /dev/null
@@ -1,669 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Tax_Payer;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
36import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
43import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
44import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
45import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
46import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
47
48/**
49 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
50 *
51 * <p>Original source:
52 * <code><pre>
53 * //inv6-Does not make sens, but directly from OCL
54 * //first part of or from definition of getAge()
55 * {@literal @}Constraint(message = "inv06", severity = "error", key = {tp})
56 * pattern inv06(tp : Tax_Payer) {
57 * Tax_Payer.dependents(tp, _);
58 * Tax_Payer.birth_year(tp, TPBy);
59 * check(2018 - TPBy {@literal >} 2018-16);
60 * } or {
61 * Tax_Payer.birth_year(tp, TPBy);
62 * Tax_Payer.dependents(tp, dep);
63 * Dependent.birth_year(dep, DepBy);
64 * check(2018-DepBy {@literal <}= 2018-TPBy-16);
65 * }
66 * </pre></code>
67 *
68 * @see Matcher
69 * @see Match
70 *
71 */
72@SuppressWarnings("all")
73public final class Inv06 extends BaseGeneratedEMFQuerySpecification<Inv06.Matcher> {
74 /**
75 * Pattern-specific match representation of the queries.inv06 pattern,
76 * to be used in conjunction with {@link Matcher}.
77 *
78 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
79 * Each instance is a (possibly partial) substitution of pattern parameters,
80 * usable to represent a match of the pattern in the result of a query,
81 * or to specify the bound (fixed) input parameters when issuing a query.
82 *
83 * @see Matcher
84 *
85 */
86 public static abstract class Match extends BasePatternMatch {
87 private Tax_Payer fTp;
88
89 private static List<String> parameterNames = makeImmutableList("tp");
90
91 private Match(final Tax_Payer pTp) {
92 this.fTp = pTp;
93 }
94
95 @Override
96 public Object get(final String parameterName) {
97 switch(parameterName) {
98 case "tp": return this.fTp;
99 default: return null;
100 }
101 }
102
103 @Override
104 public Object get(final int index) {
105 switch(index) {
106 case 0: return this.fTp;
107 default: return null;
108 }
109 }
110
111 public Tax_Payer getTp() {
112 return this.fTp;
113 }
114
115 @Override
116 public boolean set(final String parameterName, final Object newValue) {
117 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
118 if ("tp".equals(parameterName) ) {
119 this.fTp = (Tax_Payer) newValue;
120 return true;
121 }
122 return false;
123 }
124
125 public void setTp(final Tax_Payer pTp) {
126 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
127 this.fTp = pTp;
128 }
129
130 @Override
131 public String patternName() {
132 return "queries.inv06";
133 }
134
135 @Override
136 public List<String> parameterNames() {
137 return Inv06.Match.parameterNames;
138 }
139
140 @Override
141 public Object[] toArray() {
142 return new Object[]{fTp};
143 }
144
145 @Override
146 public Inv06.Match toImmutable() {
147 return isMutable() ? newMatch(fTp) : this;
148 }
149
150 @Override
151 public String prettyPrint() {
152 StringBuilder result = new StringBuilder();
153 result.append("\"tp\"=" + prettyPrintValue(fTp));
154 return result.toString();
155 }
156
157 @Override
158 public int hashCode() {
159 return Objects.hash(fTp);
160 }
161
162 @Override
163 public boolean equals(final Object obj) {
164 if (this == obj)
165 return true;
166 if (obj == null) {
167 return false;
168 }
169 if ((obj instanceof Inv06.Match)) {
170 Inv06.Match other = (Inv06.Match) obj;
171 return Objects.equals(fTp, other.fTp);
172 } else {
173 // this should be infrequent
174 if (!(obj instanceof IPatternMatch)) {
175 return false;
176 }
177 IPatternMatch otherSig = (IPatternMatch) obj;
178 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
179 }
180 }
181
182 @Override
183 public Inv06 specification() {
184 return Inv06.instance();
185 }
186
187 /**
188 * Returns an empty, mutable match.
189 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
190 *
191 * @return the empty match.
192 *
193 */
194 public static Inv06.Match newEmptyMatch() {
195 return new Mutable(null);
196 }
197
198 /**
199 * Returns a mutable (partial) match.
200 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
201 *
202 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
203 * @return the new, mutable (partial) match object.
204 *
205 */
206 public static Inv06.Match newMutableMatch(final Tax_Payer pTp) {
207 return new Mutable(pTp);
208 }
209
210 /**
211 * Returns a new (partial) match.
212 * This can be used e.g. to call the matcher with a partial match.
213 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
214 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
215 * @return the (partial) match object.
216 *
217 */
218 public static Inv06.Match newMatch(final Tax_Payer pTp) {
219 return new Immutable(pTp);
220 }
221
222 private static final class Mutable extends Inv06.Match {
223 Mutable(final Tax_Payer pTp) {
224 super(pTp);
225 }
226
227 @Override
228 public boolean isMutable() {
229 return true;
230 }
231 }
232
233 private static final class Immutable extends Inv06.Match {
234 Immutable(final Tax_Payer pTp) {
235 super(pTp);
236 }
237
238 @Override
239 public boolean isMutable() {
240 return false;
241 }
242 }
243 }
244
245 /**
246 * Generated pattern matcher API of the queries.inv06 pattern,
247 * providing pattern-specific query methods.
248 *
249 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
250 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
251 *
252 * <p>Matches of the pattern will be represented as {@link Match}.
253 *
254 * <p>Original source:
255 * <code><pre>
256 * //inv6-Does not make sens, but directly from OCL
257 * //first part of or from definition of getAge()
258 * {@literal @}Constraint(message = "inv06", severity = "error", key = {tp})
259 * pattern inv06(tp : Tax_Payer) {
260 * Tax_Payer.dependents(tp, _);
261 * Tax_Payer.birth_year(tp, TPBy);
262 * check(2018 - TPBy {@literal >} 2018-16);
263 * } or {
264 * Tax_Payer.birth_year(tp, TPBy);
265 * Tax_Payer.dependents(tp, dep);
266 * Dependent.birth_year(dep, DepBy);
267 * check(2018-DepBy {@literal <}= 2018-TPBy-16);
268 * }
269 * </pre></code>
270 *
271 * @see Match
272 * @see Inv06
273 *
274 */
275 public static class Matcher extends BaseMatcher<Inv06.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 Inv06.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 Inv06.Matcher create() {
300 return new Matcher();
301 }
302
303 private static final int POSITION_TP = 0;
304
305 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv06.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 pTp the fixed value of pattern parameter tp, or null if not bound.
322 * @return matches represented as a Match object.
323 *
324 */
325 public Collection<Inv06.Match> getAllMatches(final Tax_Payer pTp) {
326 return rawStreamAllMatches(new Object[]{pTp}).collect(Collectors.toSet());
327 }
328
329 /**
330 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
331 * </p>
332 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
333 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
334 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
335 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
336 * @return a stream of matches represented as a Match object.
337 *
338 */
339 public Stream<Inv06.Match> streamAllMatches(final Tax_Payer pTp) {
340 return rawStreamAllMatches(new Object[]{pTp});
341 }
342
343 /**
344 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
345 * Neither determinism nor randomness of selection is guaranteed.
346 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
347 * @return a match represented as a Match object, or null if no match is found.
348 *
349 */
350 public Optional<Inv06.Match> getOneArbitraryMatch(final Tax_Payer pTp) {
351 return rawGetOneArbitraryMatch(new Object[]{pTp});
352 }
353
354 /**
355 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
356 * under any possible substitution of the unspecified parameters (if any).
357 * @param pTp the fixed value of pattern parameter tp, 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 Tax_Payer pTp) {
362 return rawHasMatch(new Object[]{pTp});
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 pTp the fixed value of pattern parameter tp, or null if not bound.
368 * @return the number of pattern matches found.
369 *
370 */
371 public int countMatches(final Tax_Payer pTp) {
372 return rawCountMatches(new Object[]{pTp});
373 }
374
375 /**
376 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
377 * Neither determinism nor randomness of selection is guaranteed.
378 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
379 * @param processor the action that will process the selected match.
380 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
381 *
382 */
383 public boolean forOneArbitraryMatch(final Tax_Payer pTp, final Consumer<? super Inv06.Match> processor) {
384 return rawForOneArbitraryMatch(new Object[]{pTp}, processor);
385 }
386
387 /**
388 * Returns a new (partial) match.
389 * This can be used e.g. to call the matcher with a partial match.
390 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
391 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
392 * @return the (partial) match object.
393 *
394 */
395 public Inv06.Match newMatch(final Tax_Payer pTp) {
396 return Inv06.Match.newMatch(pTp);
397 }
398
399 /**
400 * Retrieve the set of values that occur in matches for tp.
401 * @return the Set of all values or empty set if there are no matches
402 *
403 */
404 protected Stream<Tax_Payer> rawStreamAllValuesOftp(final Object[] parameters) {
405 return rawStreamAllValues(POSITION_TP, parameters).map(Tax_Payer.class::cast);
406 }
407
408 /**
409 * Retrieve the set of values that occur in matches for tp.
410 * @return the Set of all values or empty set if there are no matches
411 *
412 */
413 public Set<Tax_Payer> getAllValuesOftp() {
414 return rawStreamAllValuesOftp(emptyArray()).collect(Collectors.toSet());
415 }
416
417 /**
418 * Retrieve the set of values that occur in matches for tp.
419 * @return the Set of all values or empty set if there are no matches
420 *
421 */
422 public Stream<Tax_Payer> streamAllValuesOftp() {
423 return rawStreamAllValuesOftp(emptyArray());
424 }
425
426 @Override
427 protected Inv06.Match tupleToMatch(final Tuple t) {
428 try {
429 return Inv06.Match.newMatch((Tax_Payer) t.get(POSITION_TP));
430 } catch(ClassCastException e) {
431 LOGGER.error("Element(s) in tuple not properly typed!",e);
432 return null;
433 }
434 }
435
436 @Override
437 protected Inv06.Match arrayToMatch(final Object[] match) {
438 try {
439 return Inv06.Match.newMatch((Tax_Payer) match[POSITION_TP]);
440 } catch(ClassCastException e) {
441 LOGGER.error("Element(s) in array not properly typed!",e);
442 return null;
443 }
444 }
445
446 @Override
447 protected Inv06.Match arrayToMatchMutable(final Object[] match) {
448 try {
449 return Inv06.Match.newMutableMatch((Tax_Payer) match[POSITION_TP]);
450 } catch(ClassCastException e) {
451 LOGGER.error("Element(s) in array not properly typed!",e);
452 return null;
453 }
454 }
455
456 /**
457 * @return the singleton instance of the query specification of this pattern
458 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
459 *
460 */
461 public static IQuerySpecification<Inv06.Matcher> querySpecification() {
462 return Inv06.instance();
463 }
464 }
465
466 private Inv06() {
467 super(GeneratedPQuery.INSTANCE);
468 }
469
470 /**
471 * @return the singleton instance of the query specification
472 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
473 *
474 */
475 public static Inv06 instance() {
476 try{
477 return LazyHolder.INSTANCE;
478 } catch (ExceptionInInitializerError err) {
479 throw processInitializerError(err);
480 }
481 }
482
483 @Override
484 protected Inv06.Matcher instantiate(final ViatraQueryEngine engine) {
485 return Inv06.Matcher.on(engine);
486 }
487
488 @Override
489 public Inv06.Matcher instantiate() {
490 return Inv06.Matcher.create();
491 }
492
493 @Override
494 public Inv06.Match newEmptyMatch() {
495 return Inv06.Match.newEmptyMatch();
496 }
497
498 @Override
499 public Inv06.Match newMatch(final Object... parameters) {
500 return Inv06.Match.newMatch((Taxation.Tax_Payer) parameters[0]);
501 }
502
503 /**
504 * Inner class allowing the singleton instance of {@link Inv06} to be created
505 * <b>not</b> at the class load time of the outer class,
506 * but rather at the first call to {@link Inv06#instance()}.
507 *
508 * <p> This workaround is required e.g. to support recursion.
509 *
510 */
511 private static class LazyHolder {
512 private static final Inv06 INSTANCE = new Inv06();
513
514 /**
515 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
516 * This initialization order is required to support indirect recursion.
517 *
518 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
519 *
520 */
521 private static final Object STATIC_INITIALIZER = ensureInitialized();
522
523 public static Object ensureInitialized() {
524 INSTANCE.ensureInitializedInternal();
525 return null;
526 }
527 }
528
529 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
530 private static final Inv06.GeneratedPQuery INSTANCE = new GeneratedPQuery();
531
532 private final PParameter parameter_tp = new PParameter("tp", "Taxation.Tax_Payer", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Tax_Payer")), PParameterDirection.INOUT);
533
534 private final List<PParameter> parameters = Arrays.asList(parameter_tp);
535
536 private GeneratedPQuery() {
537 super(PVisibility.PUBLIC);
538 }
539
540 @Override
541 public String getFullyQualifiedName() {
542 return "queries.inv06";
543 }
544
545 @Override
546 public List<String> getParameterNames() {
547 return Arrays.asList("tp");
548 }
549
550 @Override
551 public List<PParameter> getParameters() {
552 return parameters;
553 }
554
555 @Override
556 public Set<PBody> doGetContainedBodies() {
557 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
558 Set<PBody> bodies = new LinkedHashSet<>();
559 {
560 PBody body = new PBody(this);
561 PVariable var_tp = body.getOrCreateVariableByName("tp");
562 PVariable var___0_ = body.getOrCreateVariableByName("_<0>");
563 PVariable var_TPBy = body.getOrCreateVariableByName("TPBy");
564 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
565 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
566 new ExportedParameter(body, var_tp, parameter_tp)
567 ));
568 // Tax_Payer.dependents(tp, _)
569 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
570 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
571 new TypeConstraint(body, Tuples.flatTupleOf(var_tp, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Tax_Payer", "dependents")));
572 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
573 new Equality(body, var__virtual_0_, var___0_);
574 // Tax_Payer.birth_year(tp, TPBy)
575 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
576 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
577 new TypeConstraint(body, Tuples.flatTupleOf(var_tp, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "birth_year")));
578 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
579 new Equality(body, var__virtual_1_, var_TPBy);
580 // check(2018 - TPBy > 2018-16)
581 new ExpressionEvaluation(body, new IExpressionEvaluator() {
582
583 @Override
584 public String getShortDescription() {
585 return "Expression evaluation from pattern inv06";
586 }
587
588 @Override
589 public Iterable<String> getInputParameterNames() {
590 return Arrays.asList("TPBy");}
591
592 @Override
593 public Object evaluateExpression(IValueProvider provider) throws Exception {
594 Integer TPBy = (Integer) provider.getValue("TPBy");
595 return evaluateExpression_1_1(TPBy);
596 }
597 }, null);
598 bodies.add(body);
599 }
600 {
601 PBody body = new PBody(this);
602 PVariable var_tp = body.getOrCreateVariableByName("tp");
603 PVariable var_TPBy = body.getOrCreateVariableByName("TPBy");
604 PVariable var_dep = body.getOrCreateVariableByName("dep");
605 PVariable var_DepBy = body.getOrCreateVariableByName("DepBy");
606 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
607 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
608 new ExportedParameter(body, var_tp, parameter_tp)
609 ));
610 // Tax_Payer.birth_year(tp, TPBy)
611 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
612 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
613 new TypeConstraint(body, Tuples.flatTupleOf(var_tp, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "birth_year")));
614 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
615 new Equality(body, var__virtual_0_, var_TPBy);
616 // Tax_Payer.dependents(tp, dep)
617 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
618 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
619 new TypeConstraint(body, Tuples.flatTupleOf(var_tp, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Tax_Payer", "dependents")));
620 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
621 new Equality(body, var__virtual_1_, var_dep);
622 // Dependent.birth_year(dep, DepBy)
623 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
624 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
625 new TypeConstraint(body, Tuples.flatTupleOf(var_dep, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "birth_year")));
626 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
627 new Equality(body, var__virtual_2_, var_DepBy);
628 // check(2018-DepBy <= 2018-TPBy-16)
629 new ExpressionEvaluation(body, new IExpressionEvaluator() {
630
631 @Override
632 public String getShortDescription() {
633 return "Expression evaluation from pattern inv06";
634 }
635
636 @Override
637 public Iterable<String> getInputParameterNames() {
638 return Arrays.asList("DepBy", "TPBy");}
639
640 @Override
641 public Object evaluateExpression(IValueProvider provider) throws Exception {
642 Integer DepBy = (Integer) provider.getValue("DepBy");
643 Integer TPBy = (Integer) provider.getValue("TPBy");
644 return evaluateExpression_2_1(DepBy, TPBy);
645 }
646 }, null);
647 bodies.add(body);
648 }
649 {
650 PAnnotation annotation = new PAnnotation("Constraint");
651 annotation.addAttribute("message", "inv06");
652 annotation.addAttribute("severity", "error");
653 annotation.addAttribute("key", Arrays.asList(new Object[] {
654 new ParameterReference("tp")
655 }));
656 addAnnotation(annotation);
657 }
658 return bodies;
659 }
660 }
661
662 private static boolean evaluateExpression_1_1(final Integer TPBy) {
663 return ((2018 - (TPBy).intValue()) > (2018 - 16));
664 }
665
666 private static boolean evaluateExpression_2_1(final Integer DepBy, final Integer TPBy) {
667 return ((2018 - (DepBy).intValue()) <= ((2018 - (TPBy).intValue()) - 16));
668 }
669}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv07.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv07.java
deleted file mode 100644
index 81665825..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv07.java
+++ /dev/null
@@ -1,612 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Income;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
36import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
43import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
44import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
45import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
46import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
47
48/**
49 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
50 *
51 * <p>Original source:
52 * <code><pre>
53 * //inv7-OrderedSet
54 * {@literal @}Constraint(message = "inv07", severity = "error", key = {inc})
55 * pattern inv07(inc : Income) {
56 * Income.details.distance(inc, d1);
57 * Income.details.distance(inc, d2);
58 * check(d1 != d2);//compare values
59 * }
60 * </pre></code>
61 *
62 * @see Matcher
63 * @see Match
64 *
65 */
66@SuppressWarnings("all")
67public final class Inv07 extends BaseGeneratedEMFQuerySpecification<Inv07.Matcher> {
68 /**
69 * Pattern-specific match representation of the queries.inv07 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 Income fInc;
82
83 private static List<String> parameterNames = makeImmutableList("inc");
84
85 private Match(final Income pInc) {
86 this.fInc = pInc;
87 }
88
89 @Override
90 public Object get(final String parameterName) {
91 switch(parameterName) {
92 case "inc": return this.fInc;
93 default: return null;
94 }
95 }
96
97 @Override
98 public Object get(final int index) {
99 switch(index) {
100 case 0: return this.fInc;
101 default: return null;
102 }
103 }
104
105 public Income getInc() {
106 return this.fInc;
107 }
108
109 @Override
110 public boolean set(final String parameterName, final Object newValue) {
111 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
112 if ("inc".equals(parameterName) ) {
113 this.fInc = (Income) newValue;
114 return true;
115 }
116 return false;
117 }
118
119 public void setInc(final Income pInc) {
120 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
121 this.fInc = pInc;
122 }
123
124 @Override
125 public String patternName() {
126 return "queries.inv07";
127 }
128
129 @Override
130 public List<String> parameterNames() {
131 return Inv07.Match.parameterNames;
132 }
133
134 @Override
135 public Object[] toArray() {
136 return new Object[]{fInc};
137 }
138
139 @Override
140 public Inv07.Match toImmutable() {
141 return isMutable() ? newMatch(fInc) : this;
142 }
143
144 @Override
145 public String prettyPrint() {
146 StringBuilder result = new StringBuilder();
147 result.append("\"inc\"=" + prettyPrintValue(fInc));
148 return result.toString();
149 }
150
151 @Override
152 public int hashCode() {
153 return Objects.hash(fInc);
154 }
155
156 @Override
157 public boolean equals(final Object obj) {
158 if (this == obj)
159 return true;
160 if (obj == null) {
161 return false;
162 }
163 if ((obj instanceof Inv07.Match)) {
164 Inv07.Match other = (Inv07.Match) obj;
165 return Objects.equals(fInc, other.fInc);
166 } else {
167 // this should be infrequent
168 if (!(obj instanceof IPatternMatch)) {
169 return false;
170 }
171 IPatternMatch otherSig = (IPatternMatch) obj;
172 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
173 }
174 }
175
176 @Override
177 public Inv07 specification() {
178 return Inv07.instance();
179 }
180
181 /**
182 * Returns an empty, mutable match.
183 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
184 *
185 * @return the empty match.
186 *
187 */
188 public static Inv07.Match newEmptyMatch() {
189 return new Mutable(null);
190 }
191
192 /**
193 * Returns a mutable (partial) match.
194 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
195 *
196 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
197 * @return the new, mutable (partial) match object.
198 *
199 */
200 public static Inv07.Match newMutableMatch(final Income pInc) {
201 return new Mutable(pInc);
202 }
203
204 /**
205 * Returns a new (partial) match.
206 * This can be used e.g. to call the matcher with a partial match.
207 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
208 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
209 * @return the (partial) match object.
210 *
211 */
212 public static Inv07.Match newMatch(final Income pInc) {
213 return new Immutable(pInc);
214 }
215
216 private static final class Mutable extends Inv07.Match {
217 Mutable(final Income pInc) {
218 super(pInc);
219 }
220
221 @Override
222 public boolean isMutable() {
223 return true;
224 }
225 }
226
227 private static final class Immutable extends Inv07.Match {
228 Immutable(final Income pInc) {
229 super(pInc);
230 }
231
232 @Override
233 public boolean isMutable() {
234 return false;
235 }
236 }
237 }
238
239 /**
240 * Generated pattern matcher API of the queries.inv07 pattern,
241 * providing pattern-specific query methods.
242 *
243 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
244 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
245 *
246 * <p>Matches of the pattern will be represented as {@link Match}.
247 *
248 * <p>Original source:
249 * <code><pre>
250 * //inv7-OrderedSet
251 * {@literal @}Constraint(message = "inv07", severity = "error", key = {inc})
252 * pattern inv07(inc : Income) {
253 * Income.details.distance(inc, d1);
254 * Income.details.distance(inc, d2);
255 * check(d1 != d2);//compare values
256 * }
257 * </pre></code>
258 *
259 * @see Match
260 * @see Inv07
261 *
262 */
263 public static class Matcher extends BaseMatcher<Inv07.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 Inv07.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 Inv07.Matcher create() {
288 return new Matcher();
289 }
290
291 private static final int POSITION_INC = 0;
292
293 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv07.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 pInc the fixed value of pattern parameter inc, or null if not bound.
310 * @return matches represented as a Match object.
311 *
312 */
313 public Collection<Inv07.Match> getAllMatches(final Income pInc) {
314 return rawStreamAllMatches(new Object[]{pInc}).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 pInc the fixed value of pattern parameter inc, or null if not bound.
324 * @return a stream of matches represented as a Match object.
325 *
326 */
327 public Stream<Inv07.Match> streamAllMatches(final Income pInc) {
328 return rawStreamAllMatches(new Object[]{pInc});
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 pInc the fixed value of pattern parameter inc, 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<Inv07.Match> getOneArbitraryMatch(final Income pInc) {
339 return rawGetOneArbitraryMatch(new Object[]{pInc});
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 pInc the fixed value of pattern parameter inc, 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 Income pInc) {
350 return rawHasMatch(new Object[]{pInc});
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 pInc the fixed value of pattern parameter inc, or null if not bound.
356 * @return the number of pattern matches found.
357 *
358 */
359 public int countMatches(final Income pInc) {
360 return rawCountMatches(new Object[]{pInc});
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 pInc the fixed value of pattern parameter inc, 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 Income pInc, final Consumer<? super Inv07.Match> processor) {
372 return rawForOneArbitraryMatch(new Object[]{pInc}, 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 pInc the fixed value of pattern parameter inc, or null if not bound.
380 * @return the (partial) match object.
381 *
382 */
383 public Inv07.Match newMatch(final Income pInc) {
384 return Inv07.Match.newMatch(pInc);
385 }
386
387 /**
388 * Retrieve the set of values that occur in matches for inc.
389 * @return the Set of all values or empty set if there are no matches
390 *
391 */
392 protected Stream<Income> rawStreamAllValuesOfinc(final Object[] parameters) {
393 return rawStreamAllValues(POSITION_INC, parameters).map(Income.class::cast);
394 }
395
396 /**
397 * Retrieve the set of values that occur in matches for inc.
398 * @return the Set of all values or empty set if there are no matches
399 *
400 */
401 public Set<Income> getAllValuesOfinc() {
402 return rawStreamAllValuesOfinc(emptyArray()).collect(Collectors.toSet());
403 }
404
405 /**
406 * Retrieve the set of values that occur in matches for inc.
407 * @return the Set of all values or empty set if there are no matches
408 *
409 */
410 public Stream<Income> streamAllValuesOfinc() {
411 return rawStreamAllValuesOfinc(emptyArray());
412 }
413
414 @Override
415 protected Inv07.Match tupleToMatch(final Tuple t) {
416 try {
417 return Inv07.Match.newMatch((Income) t.get(POSITION_INC));
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 Inv07.Match arrayToMatch(final Object[] match) {
426 try {
427 return Inv07.Match.newMatch((Income) match[POSITION_INC]);
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 Inv07.Match arrayToMatchMutable(final Object[] match) {
436 try {
437 return Inv07.Match.newMutableMatch((Income) match[POSITION_INC]);
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<Inv07.Matcher> querySpecification() {
450 return Inv07.instance();
451 }
452 }
453
454 private Inv07() {
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 Inv07 instance() {
464 try{
465 return LazyHolder.INSTANCE;
466 } catch (ExceptionInInitializerError err) {
467 throw processInitializerError(err);
468 }
469 }
470
471 @Override
472 protected Inv07.Matcher instantiate(final ViatraQueryEngine engine) {
473 return Inv07.Matcher.on(engine);
474 }
475
476 @Override
477 public Inv07.Matcher instantiate() {
478 return Inv07.Matcher.create();
479 }
480
481 @Override
482 public Inv07.Match newEmptyMatch() {
483 return Inv07.Match.newEmptyMatch();
484 }
485
486 @Override
487 public Inv07.Match newMatch(final Object... parameters) {
488 return Inv07.Match.newMatch((Taxation.Income) parameters[0]);
489 }
490
491 /**
492 * Inner class allowing the singleton instance of {@link Inv07} 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 Inv07#instance()}.
495 *
496 * <p> This workaround is required e.g. to support recursion.
497 *
498 */
499 private static class LazyHolder {
500 private static final Inv07 INSTANCE = new Inv07();
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 Inv07.GeneratedPQuery INSTANCE = new GeneratedPQuery();
519
520 private final PParameter parameter_inc = new PParameter("inc", "Taxation.Income", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Income")), PParameterDirection.INOUT);
521
522 private final List<PParameter> parameters = Arrays.asList(parameter_inc);
523
524 private GeneratedPQuery() {
525 super(PVisibility.PUBLIC);
526 }
527
528 @Override
529 public String getFullyQualifiedName() {
530 return "queries.inv07";
531 }
532
533 @Override
534 public List<String> getParameterNames() {
535 return Arrays.asList("inc");
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_inc = body.getOrCreateVariableByName("inc");
550 PVariable var_d1 = body.getOrCreateVariableByName("d1");
551 PVariable var_d2 = body.getOrCreateVariableByName("d2");
552 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
553 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
554 new ExportedParameter(body, var_inc, parameter_inc)
555 ));
556 // Income.details.distance(inc, d1)
557 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
558 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
559 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
560 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
561 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
562 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "distance")));
563 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
564 new Equality(body, var__virtual_1_, var_d1);
565 // Income.details.distance(inc, d2)
566 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
567 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
568 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
569 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
570 PVariable var__virtual_3_ = body.getOrCreateVariableByName(".virtual{3}");
571 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_, var__virtual_3_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "distance")));
572 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_3_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
573 new Equality(body, var__virtual_3_, var_d2);
574 // check(d1 != d2)
575 new ExpressionEvaluation(body, new IExpressionEvaluator() {
576
577 @Override
578 public String getShortDescription() {
579 return "Expression evaluation from pattern inv07";
580 }
581
582 @Override
583 public Iterable<String> getInputParameterNames() {
584 return Arrays.asList("d1", "d2");}
585
586 @Override
587 public Object evaluateExpression(IValueProvider provider) throws Exception {
588 Double d1 = (Double) provider.getValue("d1");
589 Double d2 = (Double) provider.getValue("d2");
590 return evaluateExpression_1_1(d1, d2);
591 }
592 }, null);
593 bodies.add(body);
594 }
595 {
596 PAnnotation annotation = new PAnnotation("Constraint");
597 annotation.addAttribute("message", "inv07");
598 annotation.addAttribute("severity", "error");
599 annotation.addAttribute("key", Arrays.asList(new Object[] {
600 new ParameterReference("inc")
601 }));
602 addAnnotation(annotation);
603 }
604 return bodies;
605 }
606 }
607
608 private static boolean evaluateExpression_1_1(final Double d1, final Double d2) {
609 boolean _notEquals = (!com.google.common.base.Objects.equal(d1, d2));
610 return _notEquals;
611 }
612}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv08.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv08.java
deleted file mode 100644
index 9ecadd34..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv08.java
+++ /dev/null
@@ -1,705 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Income;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
36import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
41import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
42import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
43import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
44import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
45import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
46import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
47import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
48import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
49import queries.X_inv08_inRange;
50import queries.X_inv08_noType;
51import queries.X_inv08_notEI;
52
53/**
54 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
55 *
56 * <p>Original source:
57 * <code><pre>
58 * //user_complete_details-AttributeRemoved
59 *
60 * //inv8 - oclIsTypeOf - handled here
61 * {@literal @}Constraint(message = "inv08", severity = "error", key = {inc})
62 * pattern inv08(inc : Income) {
63 * //income_type: None
64 * neg find x_inv08_noType(inc);
65 * Income.details.distance(inc, dist);
66 * check(dist != 0);
67 * } or {
68 * //income_type: Not Employment_Income
69 * Income.income_type(inc, type);
70 * neg find x_inv08_notEI(type);
71 * Income.details.distance(inc, dist);
72 * check(dist != 0);
73 * } or {
74 * //income_type: Employment Income
75 * Income.income_type(inc, type);
76 * Employment_Income(type);
77 * find x_inv08_inRange(inc);
78 * }
79 * </pre></code>
80 *
81 * @see Matcher
82 * @see Match
83 *
84 */
85@SuppressWarnings("all")
86public final class Inv08 extends BaseGeneratedEMFQuerySpecification<Inv08.Matcher> {
87 /**
88 * Pattern-specific match representation of the queries.inv08 pattern,
89 * to be used in conjunction with {@link Matcher}.
90 *
91 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
92 * Each instance is a (possibly partial) substitution of pattern parameters,
93 * usable to represent a match of the pattern in the result of a query,
94 * or to specify the bound (fixed) input parameters when issuing a query.
95 *
96 * @see Matcher
97 *
98 */
99 public static abstract class Match extends BasePatternMatch {
100 private Income fInc;
101
102 private static List<String> parameterNames = makeImmutableList("inc");
103
104 private Match(final Income pInc) {
105 this.fInc = pInc;
106 }
107
108 @Override
109 public Object get(final String parameterName) {
110 switch(parameterName) {
111 case "inc": return this.fInc;
112 default: return null;
113 }
114 }
115
116 @Override
117 public Object get(final int index) {
118 switch(index) {
119 case 0: return this.fInc;
120 default: return null;
121 }
122 }
123
124 public Income getInc() {
125 return this.fInc;
126 }
127
128 @Override
129 public boolean set(final String parameterName, final Object newValue) {
130 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
131 if ("inc".equals(parameterName) ) {
132 this.fInc = (Income) newValue;
133 return true;
134 }
135 return false;
136 }
137
138 public void setInc(final Income pInc) {
139 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
140 this.fInc = pInc;
141 }
142
143 @Override
144 public String patternName() {
145 return "queries.inv08";
146 }
147
148 @Override
149 public List<String> parameterNames() {
150 return Inv08.Match.parameterNames;
151 }
152
153 @Override
154 public Object[] toArray() {
155 return new Object[]{fInc};
156 }
157
158 @Override
159 public Inv08.Match toImmutable() {
160 return isMutable() ? newMatch(fInc) : this;
161 }
162
163 @Override
164 public String prettyPrint() {
165 StringBuilder result = new StringBuilder();
166 result.append("\"inc\"=" + prettyPrintValue(fInc));
167 return result.toString();
168 }
169
170 @Override
171 public int hashCode() {
172 return Objects.hash(fInc);
173 }
174
175 @Override
176 public boolean equals(final Object obj) {
177 if (this == obj)
178 return true;
179 if (obj == null) {
180 return false;
181 }
182 if ((obj instanceof Inv08.Match)) {
183 Inv08.Match other = (Inv08.Match) obj;
184 return Objects.equals(fInc, other.fInc);
185 } else {
186 // this should be infrequent
187 if (!(obj instanceof IPatternMatch)) {
188 return false;
189 }
190 IPatternMatch otherSig = (IPatternMatch) obj;
191 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
192 }
193 }
194
195 @Override
196 public Inv08 specification() {
197 return Inv08.instance();
198 }
199
200 /**
201 * Returns an empty, mutable match.
202 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
203 *
204 * @return the empty match.
205 *
206 */
207 public static Inv08.Match newEmptyMatch() {
208 return new Mutable(null);
209 }
210
211 /**
212 * Returns a mutable (partial) match.
213 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
214 *
215 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
216 * @return the new, mutable (partial) match object.
217 *
218 */
219 public static Inv08.Match newMutableMatch(final Income pInc) {
220 return new Mutable(pInc);
221 }
222
223 /**
224 * Returns a new (partial) match.
225 * This can be used e.g. to call the matcher with a partial match.
226 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
227 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
228 * @return the (partial) match object.
229 *
230 */
231 public static Inv08.Match newMatch(final Income pInc) {
232 return new Immutable(pInc);
233 }
234
235 private static final class Mutable extends Inv08.Match {
236 Mutable(final Income pInc) {
237 super(pInc);
238 }
239
240 @Override
241 public boolean isMutable() {
242 return true;
243 }
244 }
245
246 private static final class Immutable extends Inv08.Match {
247 Immutable(final Income pInc) {
248 super(pInc);
249 }
250
251 @Override
252 public boolean isMutable() {
253 return false;
254 }
255 }
256 }
257
258 /**
259 * Generated pattern matcher API of the queries.inv08 pattern,
260 * providing pattern-specific query methods.
261 *
262 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
263 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
264 *
265 * <p>Matches of the pattern will be represented as {@link Match}.
266 *
267 * <p>Original source:
268 * <code><pre>
269 * //user_complete_details-AttributeRemoved
270 *
271 * //inv8 - oclIsTypeOf - handled here
272 * {@literal @}Constraint(message = "inv08", severity = "error", key = {inc})
273 * pattern inv08(inc : Income) {
274 * //income_type: None
275 * neg find x_inv08_noType(inc);
276 * Income.details.distance(inc, dist);
277 * check(dist != 0);
278 * } or {
279 * //income_type: Not Employment_Income
280 * Income.income_type(inc, type);
281 * neg find x_inv08_notEI(type);
282 * Income.details.distance(inc, dist);
283 * check(dist != 0);
284 * } or {
285 * //income_type: Employment Income
286 * Income.income_type(inc, type);
287 * Employment_Income(type);
288 * find x_inv08_inRange(inc);
289 * }
290 * </pre></code>
291 *
292 * @see Match
293 * @see Inv08
294 *
295 */
296 public static class Matcher extends BaseMatcher<Inv08.Match> {
297 /**
298 * Initializes the pattern matcher within an existing VIATRA Query engine.
299 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
300 *
301 * @param engine the existing VIATRA Query engine in which this matcher will be created.
302 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
303 *
304 */
305 public static Inv08.Matcher on(final ViatraQueryEngine engine) {
306 // check if matcher already exists
307 Matcher matcher = engine.getExistingMatcher(querySpecification());
308 if (matcher == null) {
309 matcher = (Matcher)engine.getMatcher(querySpecification());
310 }
311 return matcher;
312 }
313
314 /**
315 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
316 * @return an initialized matcher
317 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
318 *
319 */
320 public static Inv08.Matcher create() {
321 return new Matcher();
322 }
323
324 private static final int POSITION_INC = 0;
325
326 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv08.Matcher.class);
327
328 /**
329 * Initializes the pattern matcher within an existing VIATRA Query engine.
330 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
331 *
332 * @param engine the existing VIATRA Query engine in which this matcher will be created.
333 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
334 *
335 */
336 private Matcher() {
337 super(querySpecification());
338 }
339
340 /**
341 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
342 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
343 * @return matches represented as a Match object.
344 *
345 */
346 public Collection<Inv08.Match> getAllMatches(final Income pInc) {
347 return rawStreamAllMatches(new Object[]{pInc}).collect(Collectors.toSet());
348 }
349
350 /**
351 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
352 * </p>
353 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
354 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
355 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
356 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
357 * @return a stream of matches represented as a Match object.
358 *
359 */
360 public Stream<Inv08.Match> streamAllMatches(final Income pInc) {
361 return rawStreamAllMatches(new Object[]{pInc});
362 }
363
364 /**
365 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
366 * Neither determinism nor randomness of selection is guaranteed.
367 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
368 * @return a match represented as a Match object, or null if no match is found.
369 *
370 */
371 public Optional<Inv08.Match> getOneArbitraryMatch(final Income pInc) {
372 return rawGetOneArbitraryMatch(new Object[]{pInc});
373 }
374
375 /**
376 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
377 * under any possible substitution of the unspecified parameters (if any).
378 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
379 * @return true if the input is a valid (partial) match of the pattern.
380 *
381 */
382 public boolean hasMatch(final Income pInc) {
383 return rawHasMatch(new Object[]{pInc});
384 }
385
386 /**
387 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
388 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
389 * @return the number of pattern matches found.
390 *
391 */
392 public int countMatches(final Income pInc) {
393 return rawCountMatches(new Object[]{pInc});
394 }
395
396 /**
397 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
398 * Neither determinism nor randomness of selection is guaranteed.
399 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
400 * @param processor the action that will process the selected match.
401 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
402 *
403 */
404 public boolean forOneArbitraryMatch(final Income pInc, final Consumer<? super Inv08.Match> processor) {
405 return rawForOneArbitraryMatch(new Object[]{pInc}, processor);
406 }
407
408 /**
409 * Returns a new (partial) match.
410 * This can be used e.g. to call the matcher with a partial match.
411 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
412 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
413 * @return the (partial) match object.
414 *
415 */
416 public Inv08.Match newMatch(final Income pInc) {
417 return Inv08.Match.newMatch(pInc);
418 }
419
420 /**
421 * Retrieve the set of values that occur in matches for inc.
422 * @return the Set of all values or empty set if there are no matches
423 *
424 */
425 protected Stream<Income> rawStreamAllValuesOfinc(final Object[] parameters) {
426 return rawStreamAllValues(POSITION_INC, parameters).map(Income.class::cast);
427 }
428
429 /**
430 * Retrieve the set of values that occur in matches for inc.
431 * @return the Set of all values or empty set if there are no matches
432 *
433 */
434 public Set<Income> getAllValuesOfinc() {
435 return rawStreamAllValuesOfinc(emptyArray()).collect(Collectors.toSet());
436 }
437
438 /**
439 * Retrieve the set of values that occur in matches for inc.
440 * @return the Set of all values or empty set if there are no matches
441 *
442 */
443 public Stream<Income> streamAllValuesOfinc() {
444 return rawStreamAllValuesOfinc(emptyArray());
445 }
446
447 @Override
448 protected Inv08.Match tupleToMatch(final Tuple t) {
449 try {
450 return Inv08.Match.newMatch((Income) t.get(POSITION_INC));
451 } catch(ClassCastException e) {
452 LOGGER.error("Element(s) in tuple not properly typed!",e);
453 return null;
454 }
455 }
456
457 @Override
458 protected Inv08.Match arrayToMatch(final Object[] match) {
459 try {
460 return Inv08.Match.newMatch((Income) match[POSITION_INC]);
461 } catch(ClassCastException e) {
462 LOGGER.error("Element(s) in array not properly typed!",e);
463 return null;
464 }
465 }
466
467 @Override
468 protected Inv08.Match arrayToMatchMutable(final Object[] match) {
469 try {
470 return Inv08.Match.newMutableMatch((Income) match[POSITION_INC]);
471 } catch(ClassCastException e) {
472 LOGGER.error("Element(s) in array not properly typed!",e);
473 return null;
474 }
475 }
476
477 /**
478 * @return the singleton instance of the query specification of this pattern
479 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
480 *
481 */
482 public static IQuerySpecification<Inv08.Matcher> querySpecification() {
483 return Inv08.instance();
484 }
485 }
486
487 private Inv08() {
488 super(GeneratedPQuery.INSTANCE);
489 }
490
491 /**
492 * @return the singleton instance of the query specification
493 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
494 *
495 */
496 public static Inv08 instance() {
497 try{
498 return LazyHolder.INSTANCE;
499 } catch (ExceptionInInitializerError err) {
500 throw processInitializerError(err);
501 }
502 }
503
504 @Override
505 protected Inv08.Matcher instantiate(final ViatraQueryEngine engine) {
506 return Inv08.Matcher.on(engine);
507 }
508
509 @Override
510 public Inv08.Matcher instantiate() {
511 return Inv08.Matcher.create();
512 }
513
514 @Override
515 public Inv08.Match newEmptyMatch() {
516 return Inv08.Match.newEmptyMatch();
517 }
518
519 @Override
520 public Inv08.Match newMatch(final Object... parameters) {
521 return Inv08.Match.newMatch((Taxation.Income) parameters[0]);
522 }
523
524 /**
525 * Inner class allowing the singleton instance of {@link Inv08} to be created
526 * <b>not</b> at the class load time of the outer class,
527 * but rather at the first call to {@link Inv08#instance()}.
528 *
529 * <p> This workaround is required e.g. to support recursion.
530 *
531 */
532 private static class LazyHolder {
533 private static final Inv08 INSTANCE = new Inv08();
534
535 /**
536 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
537 * This initialization order is required to support indirect recursion.
538 *
539 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
540 *
541 */
542 private static final Object STATIC_INITIALIZER = ensureInitialized();
543
544 public static Object ensureInitialized() {
545 INSTANCE.ensureInitializedInternal();
546 return null;
547 }
548 }
549
550 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
551 private static final Inv08.GeneratedPQuery INSTANCE = new GeneratedPQuery();
552
553 private final PParameter parameter_inc = new PParameter("inc", "Taxation.Income", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Income")), PParameterDirection.INOUT);
554
555 private final List<PParameter> parameters = Arrays.asList(parameter_inc);
556
557 private GeneratedPQuery() {
558 super(PVisibility.PUBLIC);
559 }
560
561 @Override
562 public String getFullyQualifiedName() {
563 return "queries.inv08";
564 }
565
566 @Override
567 public List<String> getParameterNames() {
568 return Arrays.asList("inc");
569 }
570
571 @Override
572 public List<PParameter> getParameters() {
573 return parameters;
574 }
575
576 @Override
577 public Set<PBody> doGetContainedBodies() {
578 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
579 Set<PBody> bodies = new LinkedHashSet<>();
580 {
581 PBody body = new PBody(this);
582 PVariable var_inc = body.getOrCreateVariableByName("inc");
583 PVariable var_dist = body.getOrCreateVariableByName("dist");
584 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
585 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
586 new ExportedParameter(body, var_inc, parameter_inc)
587 ));
588 // //income_type: None neg find x_inv08_noType(inc)
589 new NegativePatternCall(body, Tuples.flatTupleOf(var_inc), X_inv08_noType.instance().getInternalQueryRepresentation());
590 // Income.details.distance(inc, dist)
591 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
592 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
593 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
594 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
595 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
596 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "distance")));
597 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
598 new Equality(body, var__virtual_1_, var_dist);
599 // check(dist != 0)
600 new ExpressionEvaluation(body, new IExpressionEvaluator() {
601
602 @Override
603 public String getShortDescription() {
604 return "Expression evaluation from pattern inv08";
605 }
606
607 @Override
608 public Iterable<String> getInputParameterNames() {
609 return Arrays.asList("dist");}
610
611 @Override
612 public Object evaluateExpression(IValueProvider provider) throws Exception {
613 Double dist = (Double) provider.getValue("dist");
614 return evaluateExpression_1_1(dist);
615 }
616 }, null);
617 bodies.add(body);
618 }
619 {
620 PBody body = new PBody(this);
621 PVariable var_inc = body.getOrCreateVariableByName("inc");
622 PVariable var_type = body.getOrCreateVariableByName("type");
623 PVariable var_dist = body.getOrCreateVariableByName("dist");
624 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
625 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
626 new ExportedParameter(body, var_inc, parameter_inc)
627 ));
628 // //income_type: Not Employment_Income Income.income_type(inc, type)
629 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
630 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
631 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "income_type")));
632 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Type")));
633 new Equality(body, var__virtual_0_, var_type);
634 // neg find x_inv08_notEI(type)
635 new NegativePatternCall(body, Tuples.flatTupleOf(var_type), X_inv08_notEI.instance().getInternalQueryRepresentation());
636 // Income.details.distance(inc, dist)
637 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
638 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
639 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
640 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
641 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
642 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "distance")));
643 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
644 new Equality(body, var__virtual_2_, var_dist);
645 // check(dist != 0)
646 new ExpressionEvaluation(body, new IExpressionEvaluator() {
647
648 @Override
649 public String getShortDescription() {
650 return "Expression evaluation from pattern inv08";
651 }
652
653 @Override
654 public Iterable<String> getInputParameterNames() {
655 return Arrays.asList("dist");}
656
657 @Override
658 public Object evaluateExpression(IValueProvider provider) throws Exception {
659 Double dist = (Double) provider.getValue("dist");
660 return evaluateExpression_2_1(dist);
661 }
662 }, null);
663 bodies.add(body);
664 }
665 {
666 PBody body = new PBody(this);
667 PVariable var_inc = body.getOrCreateVariableByName("inc");
668 PVariable var_type = body.getOrCreateVariableByName("type");
669 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
670 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
671 new ExportedParameter(body, var_inc, parameter_inc)
672 ));
673 // //income_type: Employment Income Income.income_type(inc, type)
674 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
675 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
676 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "income_type")));
677 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Type")));
678 new Equality(body, var__virtual_0_, var_type);
679 // Employment_Income(type)
680 new TypeConstraint(body, Tuples.flatTupleOf(var_type), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Employment_Income")));
681 // find x_inv08_inRange(inc)
682 new PositivePatternCall(body, Tuples.flatTupleOf(var_inc), X_inv08_inRange.instance().getInternalQueryRepresentation());
683 bodies.add(body);
684 }
685 {
686 PAnnotation annotation = new PAnnotation("Constraint");
687 annotation.addAttribute("message", "inv08");
688 annotation.addAttribute("severity", "error");
689 annotation.addAttribute("key", Arrays.asList(new Object[] {
690 new ParameterReference("inc")
691 }));
692 addAnnotation(annotation);
693 }
694 return bodies;
695 }
696 }
697
698 private static boolean evaluateExpression_1_1(final Double dist) {
699 return ((dist).doubleValue() != 0);
700 }
701
702 private static boolean evaluateExpression_2_1(final Double dist) {
703 return ((dist).doubleValue() != 0);
704 }
705}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv10.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv10.java
deleted file mode 100644
index 6ee0111e..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv10.java
+++ /dev/null
@@ -1,616 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Income;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
36import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
43import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
44import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
45import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
46import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
47
48/**
49 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
50 *
51 * <p>Original source:
52 * <code><pre>
53 * //inv9-DerivedFeature
54 *
55 * //inv10-Ordered Sets
56 * {@literal @}Constraint(message = "inv10", severity = "error", key = {inc})
57 * pattern inv10(inc : Income) {
58 * Income.details.amount(inc, a1);
59 * Income.details.amount(inc, a2);
60 * check(a1 != a2);//compare values
61 * }
62 * </pre></code>
63 *
64 * @see Matcher
65 * @see Match
66 *
67 */
68@SuppressWarnings("all")
69public final class Inv10 extends BaseGeneratedEMFQuerySpecification<Inv10.Matcher> {
70 /**
71 * Pattern-specific match representation of the queries.inv10 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 Income fInc;
84
85 private static List<String> parameterNames = makeImmutableList("inc");
86
87 private Match(final Income pInc) {
88 this.fInc = pInc;
89 }
90
91 @Override
92 public Object get(final String parameterName) {
93 switch(parameterName) {
94 case "inc": return this.fInc;
95 default: return null;
96 }
97 }
98
99 @Override
100 public Object get(final int index) {
101 switch(index) {
102 case 0: return this.fInc;
103 default: return null;
104 }
105 }
106
107 public Income getInc() {
108 return this.fInc;
109 }
110
111 @Override
112 public boolean set(final String parameterName, final Object newValue) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 if ("inc".equals(parameterName) ) {
115 this.fInc = (Income) newValue;
116 return true;
117 }
118 return false;
119 }
120
121 public void setInc(final Income pInc) {
122 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
123 this.fInc = pInc;
124 }
125
126 @Override
127 public String patternName() {
128 return "queries.inv10";
129 }
130
131 @Override
132 public List<String> parameterNames() {
133 return Inv10.Match.parameterNames;
134 }
135
136 @Override
137 public Object[] toArray() {
138 return new Object[]{fInc};
139 }
140
141 @Override
142 public Inv10.Match toImmutable() {
143 return isMutable() ? newMatch(fInc) : this;
144 }
145
146 @Override
147 public String prettyPrint() {
148 StringBuilder result = new StringBuilder();
149 result.append("\"inc\"=" + prettyPrintValue(fInc));
150 return result.toString();
151 }
152
153 @Override
154 public int hashCode() {
155 return Objects.hash(fInc);
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 Inv10.Match)) {
166 Inv10.Match other = (Inv10.Match) obj;
167 return Objects.equals(fInc, other.fInc);
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 Inv10 specification() {
180 return Inv10.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 Inv10.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 pInc the fixed value of pattern parameter inc, or null if not bound.
199 * @return the new, mutable (partial) match object.
200 *
201 */
202 public static Inv10.Match newMutableMatch(final Income pInc) {
203 return new Mutable(pInc);
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 pInc the fixed value of pattern parameter inc, or null if not bound.
211 * @return the (partial) match object.
212 *
213 */
214 public static Inv10.Match newMatch(final Income pInc) {
215 return new Immutable(pInc);
216 }
217
218 private static final class Mutable extends Inv10.Match {
219 Mutable(final Income pInc) {
220 super(pInc);
221 }
222
223 @Override
224 public boolean isMutable() {
225 return true;
226 }
227 }
228
229 private static final class Immutable extends Inv10.Match {
230 Immutable(final Income pInc) {
231 super(pInc);
232 }
233
234 @Override
235 public boolean isMutable() {
236 return false;
237 }
238 }
239 }
240
241 /**
242 * Generated pattern matcher API of the queries.inv10 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 * //inv9-DerivedFeature
253 *
254 * //inv10-Ordered Sets
255 * {@literal @}Constraint(message = "inv10", severity = "error", key = {inc})
256 * pattern inv10(inc : Income) {
257 * Income.details.amount(inc, a1);
258 * Income.details.amount(inc, a2);
259 * check(a1 != a2);//compare values
260 * }
261 * </pre></code>
262 *
263 * @see Match
264 * @see Inv10
265 *
266 */
267 public static class Matcher extends BaseMatcher<Inv10.Match> {
268 /**
269 * Initializes the pattern matcher within an existing VIATRA Query engine.
270 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
271 *
272 * @param engine the existing VIATRA Query engine in which this matcher will be created.
273 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
274 *
275 */
276 public static Inv10.Matcher on(final ViatraQueryEngine engine) {
277 // check if matcher already exists
278 Matcher matcher = engine.getExistingMatcher(querySpecification());
279 if (matcher == null) {
280 matcher = (Matcher)engine.getMatcher(querySpecification());
281 }
282 return matcher;
283 }
284
285 /**
286 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
287 * @return an initialized matcher
288 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
289 *
290 */
291 public static Inv10.Matcher create() {
292 return new Matcher();
293 }
294
295 private static final int POSITION_INC = 0;
296
297 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv10.Matcher.class);
298
299 /**
300 * Initializes the pattern matcher within an existing VIATRA Query engine.
301 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
302 *
303 * @param engine the existing VIATRA Query engine in which this matcher will be created.
304 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
305 *
306 */
307 private Matcher() {
308 super(querySpecification());
309 }
310
311 /**
312 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
313 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
314 * @return matches represented as a Match object.
315 *
316 */
317 public Collection<Inv10.Match> getAllMatches(final Income pInc) {
318 return rawStreamAllMatches(new Object[]{pInc}).collect(Collectors.toSet());
319 }
320
321 /**
322 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
323 * </p>
324 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
325 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
326 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
327 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
328 * @return a stream of matches represented as a Match object.
329 *
330 */
331 public Stream<Inv10.Match> streamAllMatches(final Income pInc) {
332 return rawStreamAllMatches(new Object[]{pInc});
333 }
334
335 /**
336 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
337 * Neither determinism nor randomness of selection is guaranteed.
338 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
339 * @return a match represented as a Match object, or null if no match is found.
340 *
341 */
342 public Optional<Inv10.Match> getOneArbitraryMatch(final Income pInc) {
343 return rawGetOneArbitraryMatch(new Object[]{pInc});
344 }
345
346 /**
347 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
348 * under any possible substitution of the unspecified parameters (if any).
349 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
350 * @return true if the input is a valid (partial) match of the pattern.
351 *
352 */
353 public boolean hasMatch(final Income pInc) {
354 return rawHasMatch(new Object[]{pInc});
355 }
356
357 /**
358 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
359 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
360 * @return the number of pattern matches found.
361 *
362 */
363 public int countMatches(final Income pInc) {
364 return rawCountMatches(new Object[]{pInc});
365 }
366
367 /**
368 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
369 * Neither determinism nor randomness of selection is guaranteed.
370 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
371 * @param processor the action that will process the selected match.
372 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
373 *
374 */
375 public boolean forOneArbitraryMatch(final Income pInc, final Consumer<? super Inv10.Match> processor) {
376 return rawForOneArbitraryMatch(new Object[]{pInc}, processor);
377 }
378
379 /**
380 * Returns a new (partial) match.
381 * This can be used e.g. to call the matcher with a partial match.
382 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
383 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
384 * @return the (partial) match object.
385 *
386 */
387 public Inv10.Match newMatch(final Income pInc) {
388 return Inv10.Match.newMatch(pInc);
389 }
390
391 /**
392 * Retrieve the set of values that occur in matches for inc.
393 * @return the Set of all values or empty set if there are no matches
394 *
395 */
396 protected Stream<Income> rawStreamAllValuesOfinc(final Object[] parameters) {
397 return rawStreamAllValues(POSITION_INC, parameters).map(Income.class::cast);
398 }
399
400 /**
401 * Retrieve the set of values that occur in matches for inc.
402 * @return the Set of all values or empty set if there are no matches
403 *
404 */
405 public Set<Income> getAllValuesOfinc() {
406 return rawStreamAllValuesOfinc(emptyArray()).collect(Collectors.toSet());
407 }
408
409 /**
410 * Retrieve the set of values that occur in matches for inc.
411 * @return the Set of all values or empty set if there are no matches
412 *
413 */
414 public Stream<Income> streamAllValuesOfinc() {
415 return rawStreamAllValuesOfinc(emptyArray());
416 }
417
418 @Override
419 protected Inv10.Match tupleToMatch(final Tuple t) {
420 try {
421 return Inv10.Match.newMatch((Income) t.get(POSITION_INC));
422 } catch(ClassCastException e) {
423 LOGGER.error("Element(s) in tuple not properly typed!",e);
424 return null;
425 }
426 }
427
428 @Override
429 protected Inv10.Match arrayToMatch(final Object[] match) {
430 try {
431 return Inv10.Match.newMatch((Income) match[POSITION_INC]);
432 } catch(ClassCastException e) {
433 LOGGER.error("Element(s) in array not properly typed!",e);
434 return null;
435 }
436 }
437
438 @Override
439 protected Inv10.Match arrayToMatchMutable(final Object[] match) {
440 try {
441 return Inv10.Match.newMutableMatch((Income) match[POSITION_INC]);
442 } catch(ClassCastException e) {
443 LOGGER.error("Element(s) in array not properly typed!",e);
444 return null;
445 }
446 }
447
448 /**
449 * @return the singleton instance of the query specification of this pattern
450 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
451 *
452 */
453 public static IQuerySpecification<Inv10.Matcher> querySpecification() {
454 return Inv10.instance();
455 }
456 }
457
458 private Inv10() {
459 super(GeneratedPQuery.INSTANCE);
460 }
461
462 /**
463 * @return the singleton instance of the query specification
464 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
465 *
466 */
467 public static Inv10 instance() {
468 try{
469 return LazyHolder.INSTANCE;
470 } catch (ExceptionInInitializerError err) {
471 throw processInitializerError(err);
472 }
473 }
474
475 @Override
476 protected Inv10.Matcher instantiate(final ViatraQueryEngine engine) {
477 return Inv10.Matcher.on(engine);
478 }
479
480 @Override
481 public Inv10.Matcher instantiate() {
482 return Inv10.Matcher.create();
483 }
484
485 @Override
486 public Inv10.Match newEmptyMatch() {
487 return Inv10.Match.newEmptyMatch();
488 }
489
490 @Override
491 public Inv10.Match newMatch(final Object... parameters) {
492 return Inv10.Match.newMatch((Taxation.Income) parameters[0]);
493 }
494
495 /**
496 * Inner class allowing the singleton instance of {@link Inv10} to be created
497 * <b>not</b> at the class load time of the outer class,
498 * but rather at the first call to {@link Inv10#instance()}.
499 *
500 * <p> This workaround is required e.g. to support recursion.
501 *
502 */
503 private static class LazyHolder {
504 private static final Inv10 INSTANCE = new Inv10();
505
506 /**
507 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
508 * This initialization order is required to support indirect recursion.
509 *
510 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
511 *
512 */
513 private static final Object STATIC_INITIALIZER = ensureInitialized();
514
515 public static Object ensureInitialized() {
516 INSTANCE.ensureInitializedInternal();
517 return null;
518 }
519 }
520
521 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
522 private static final Inv10.GeneratedPQuery INSTANCE = new GeneratedPQuery();
523
524 private final PParameter parameter_inc = new PParameter("inc", "Taxation.Income", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Income")), PParameterDirection.INOUT);
525
526 private final List<PParameter> parameters = Arrays.asList(parameter_inc);
527
528 private GeneratedPQuery() {
529 super(PVisibility.PUBLIC);
530 }
531
532 @Override
533 public String getFullyQualifiedName() {
534 return "queries.inv10";
535 }
536
537 @Override
538 public List<String> getParameterNames() {
539 return Arrays.asList("inc");
540 }
541
542 @Override
543 public List<PParameter> getParameters() {
544 return parameters;
545 }
546
547 @Override
548 public Set<PBody> doGetContainedBodies() {
549 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
550 Set<PBody> bodies = new LinkedHashSet<>();
551 {
552 PBody body = new PBody(this);
553 PVariable var_inc = body.getOrCreateVariableByName("inc");
554 PVariable var_a1 = body.getOrCreateVariableByName("a1");
555 PVariable var_a2 = body.getOrCreateVariableByName("a2");
556 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
557 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
558 new ExportedParameter(body, var_inc, parameter_inc)
559 ));
560 // Income.details.amount(inc, a1)
561 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
562 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
563 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
564 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
565 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
566 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "amount")));
567 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
568 new Equality(body, var__virtual_1_, var_a1);
569 // Income.details.amount(inc, a2)
570 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
571 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
572 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
573 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
574 PVariable var__virtual_3_ = body.getOrCreateVariableByName(".virtual{3}");
575 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_, var__virtual_3_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "amount")));
576 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_3_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
577 new Equality(body, var__virtual_3_, var_a2);
578 // check(a1 != a2)
579 new ExpressionEvaluation(body, new IExpressionEvaluator() {
580
581 @Override
582 public String getShortDescription() {
583 return "Expression evaluation from pattern inv10";
584 }
585
586 @Override
587 public Iterable<String> getInputParameterNames() {
588 return Arrays.asList("a1", "a2");}
589
590 @Override
591 public Object evaluateExpression(IValueProvider provider) throws Exception {
592 Double a1 = (Double) provider.getValue("a1");
593 Double a2 = (Double) provider.getValue("a2");
594 return evaluateExpression_1_1(a1, a2);
595 }
596 }, null);
597 bodies.add(body);
598 }
599 {
600 PAnnotation annotation = new PAnnotation("Constraint");
601 annotation.addAttribute("message", "inv10");
602 annotation.addAttribute("severity", "error");
603 annotation.addAttribute("key", Arrays.asList(new Object[] {
604 new ParameterReference("inc")
605 }));
606 addAnnotation(annotation);
607 }
608 return bodies;
609 }
610 }
611
612 private static boolean evaluateExpression_1_1(final Double a1, final Double a2) {
613 boolean _notEquals = (!com.google.common.base.Objects.equal(a1, a2));
614 return _notEquals;
615 }
616}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv11.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv11.java
deleted file mode 100644
index 5dc82fc9..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv11.java
+++ /dev/null
@@ -1,566 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Expense;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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.annotations.PAnnotation;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
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;
41import queries.X_inv11_incNotOver100;
42import queries.X_inv11_incOver100;
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 * //inv11-attributes-handled by multiplicity
50 * {@literal @}Constraint(message = "inv11", severity = "error", key = {exp})
51 * pattern inv11(exp : Expense) {
52 * find x_inv11_incOver100(exp);
53 * find x_inv11_incNotOver100(exp);
54 * }
55 * </pre></code>
56 *
57 * @see Matcher
58 * @see Match
59 *
60 */
61@SuppressWarnings("all")
62public final class Inv11 extends BaseGeneratedEMFQuerySpecification<Inv11.Matcher> {
63 /**
64 * Pattern-specific match representation of the queries.inv11 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 Expense fExp;
77
78 private static List<String> parameterNames = makeImmutableList("exp");
79
80 private Match(final Expense pExp) {
81 this.fExp = pExp;
82 }
83
84 @Override
85 public Object get(final String parameterName) {
86 switch(parameterName) {
87 case "exp": return this.fExp;
88 default: return null;
89 }
90 }
91
92 @Override
93 public Object get(final int index) {
94 switch(index) {
95 case 0: return this.fExp;
96 default: return null;
97 }
98 }
99
100 public Expense getExp() {
101 return this.fExp;
102 }
103
104 @Override
105 public boolean set(final String parameterName, final Object newValue) {
106 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
107 if ("exp".equals(parameterName) ) {
108 this.fExp = (Expense) newValue;
109 return true;
110 }
111 return false;
112 }
113
114 public void setExp(final Expense pExp) {
115 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
116 this.fExp = pExp;
117 }
118
119 @Override
120 public String patternName() {
121 return "queries.inv11";
122 }
123
124 @Override
125 public List<String> parameterNames() {
126 return Inv11.Match.parameterNames;
127 }
128
129 @Override
130 public Object[] toArray() {
131 return new Object[]{fExp};
132 }
133
134 @Override
135 public Inv11.Match toImmutable() {
136 return isMutable() ? newMatch(fExp) : this;
137 }
138
139 @Override
140 public String prettyPrint() {
141 StringBuilder result = new StringBuilder();
142 result.append("\"exp\"=" + prettyPrintValue(fExp));
143 return result.toString();
144 }
145
146 @Override
147 public int hashCode() {
148 return Objects.hash(fExp);
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 Inv11.Match)) {
159 Inv11.Match other = (Inv11.Match) obj;
160 return Objects.equals(fExp, other.fExp);
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 Inv11 specification() {
173 return Inv11.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 Inv11.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 pExp the fixed value of pattern parameter exp, or null if not bound.
192 * @return the new, mutable (partial) match object.
193 *
194 */
195 public static Inv11.Match newMutableMatch(final Expense pExp) {
196 return new Mutable(pExp);
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 pExp the fixed value of pattern parameter exp, or null if not bound.
204 * @return the (partial) match object.
205 *
206 */
207 public static Inv11.Match newMatch(final Expense pExp) {
208 return new Immutable(pExp);
209 }
210
211 private static final class Mutable extends Inv11.Match {
212 Mutable(final Expense pExp) {
213 super(pExp);
214 }
215
216 @Override
217 public boolean isMutable() {
218 return true;
219 }
220 }
221
222 private static final class Immutable extends Inv11.Match {
223 Immutable(final Expense pExp) {
224 super(pExp);
225 }
226
227 @Override
228 public boolean isMutable() {
229 return false;
230 }
231 }
232 }
233
234 /**
235 * Generated pattern matcher API of the queries.inv11 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 * //inv11-attributes-handled by multiplicity
246 * {@literal @}Constraint(message = "inv11", severity = "error", key = {exp})
247 * pattern inv11(exp : Expense) {
248 * find x_inv11_incOver100(exp);
249 * find x_inv11_incNotOver100(exp);
250 * }
251 * </pre></code>
252 *
253 * @see Match
254 * @see Inv11
255 *
256 */
257 public static class Matcher extends BaseMatcher<Inv11.Match> {
258 /**
259 * Initializes the pattern matcher within an existing VIATRA Query engine.
260 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
261 *
262 * @param engine the existing VIATRA Query engine in which this matcher will be created.
263 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
264 *
265 */
266 public static Inv11.Matcher on(final ViatraQueryEngine engine) {
267 // check if matcher already exists
268 Matcher matcher = engine.getExistingMatcher(querySpecification());
269 if (matcher == null) {
270 matcher = (Matcher)engine.getMatcher(querySpecification());
271 }
272 return matcher;
273 }
274
275 /**
276 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
277 * @return an initialized matcher
278 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
279 *
280 */
281 public static Inv11.Matcher create() {
282 return new Matcher();
283 }
284
285 private static final int POSITION_EXP = 0;
286
287 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv11.Matcher.class);
288
289 /**
290 * Initializes the pattern matcher within an existing VIATRA Query engine.
291 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
292 *
293 * @param engine the existing VIATRA Query engine in which this matcher will be created.
294 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
295 *
296 */
297 private Matcher() {
298 super(querySpecification());
299 }
300
301 /**
302 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
303 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
304 * @return matches represented as a Match object.
305 *
306 */
307 public Collection<Inv11.Match> getAllMatches(final Expense pExp) {
308 return rawStreamAllMatches(new Object[]{pExp}).collect(Collectors.toSet());
309 }
310
311 /**
312 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
313 * </p>
314 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
315 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
316 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
317 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
318 * @return a stream of matches represented as a Match object.
319 *
320 */
321 public Stream<Inv11.Match> streamAllMatches(final Expense pExp) {
322 return rawStreamAllMatches(new Object[]{pExp});
323 }
324
325 /**
326 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
327 * Neither determinism nor randomness of selection is guaranteed.
328 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
329 * @return a match represented as a Match object, or null if no match is found.
330 *
331 */
332 public Optional<Inv11.Match> getOneArbitraryMatch(final Expense pExp) {
333 return rawGetOneArbitraryMatch(new Object[]{pExp});
334 }
335
336 /**
337 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
338 * under any possible substitution of the unspecified parameters (if any).
339 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
340 * @return true if the input is a valid (partial) match of the pattern.
341 *
342 */
343 public boolean hasMatch(final Expense pExp) {
344 return rawHasMatch(new Object[]{pExp});
345 }
346
347 /**
348 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
349 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
350 * @return the number of pattern matches found.
351 *
352 */
353 public int countMatches(final Expense pExp) {
354 return rawCountMatches(new Object[]{pExp});
355 }
356
357 /**
358 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
359 * Neither determinism nor randomness of selection is guaranteed.
360 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
361 * @param processor the action that will process the selected match.
362 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
363 *
364 */
365 public boolean forOneArbitraryMatch(final Expense pExp, final Consumer<? super Inv11.Match> processor) {
366 return rawForOneArbitraryMatch(new Object[]{pExp}, processor);
367 }
368
369 /**
370 * Returns a new (partial) match.
371 * This can be used e.g. to call the matcher with a partial match.
372 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
373 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
374 * @return the (partial) match object.
375 *
376 */
377 public Inv11.Match newMatch(final Expense pExp) {
378 return Inv11.Match.newMatch(pExp);
379 }
380
381 /**
382 * Retrieve the set of values that occur in matches for exp.
383 * @return the Set of all values or empty set if there are no matches
384 *
385 */
386 protected Stream<Expense> rawStreamAllValuesOfexp(final Object[] parameters) {
387 return rawStreamAllValues(POSITION_EXP, parameters).map(Expense.class::cast);
388 }
389
390 /**
391 * Retrieve the set of values that occur in matches for exp.
392 * @return the Set of all values or empty set if there are no matches
393 *
394 */
395 public Set<Expense> getAllValuesOfexp() {
396 return rawStreamAllValuesOfexp(emptyArray()).collect(Collectors.toSet());
397 }
398
399 /**
400 * Retrieve the set of values that occur in matches for exp.
401 * @return the Set of all values or empty set if there are no matches
402 *
403 */
404 public Stream<Expense> streamAllValuesOfexp() {
405 return rawStreamAllValuesOfexp(emptyArray());
406 }
407
408 @Override
409 protected Inv11.Match tupleToMatch(final Tuple t) {
410 try {
411 return Inv11.Match.newMatch((Expense) t.get(POSITION_EXP));
412 } catch(ClassCastException e) {
413 LOGGER.error("Element(s) in tuple not properly typed!",e);
414 return null;
415 }
416 }
417
418 @Override
419 protected Inv11.Match arrayToMatch(final Object[] match) {
420 try {
421 return Inv11.Match.newMatch((Expense) match[POSITION_EXP]);
422 } catch(ClassCastException e) {
423 LOGGER.error("Element(s) in array not properly typed!",e);
424 return null;
425 }
426 }
427
428 @Override
429 protected Inv11.Match arrayToMatchMutable(final Object[] match) {
430 try {
431 return Inv11.Match.newMutableMatch((Expense) match[POSITION_EXP]);
432 } catch(ClassCastException e) {
433 LOGGER.error("Element(s) in array not properly typed!",e);
434 return null;
435 }
436 }
437
438 /**
439 * @return the singleton instance of the query specification of this pattern
440 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
441 *
442 */
443 public static IQuerySpecification<Inv11.Matcher> querySpecification() {
444 return Inv11.instance();
445 }
446 }
447
448 private Inv11() {
449 super(GeneratedPQuery.INSTANCE);
450 }
451
452 /**
453 * @return the singleton instance of the query specification
454 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
455 *
456 */
457 public static Inv11 instance() {
458 try{
459 return LazyHolder.INSTANCE;
460 } catch (ExceptionInInitializerError err) {
461 throw processInitializerError(err);
462 }
463 }
464
465 @Override
466 protected Inv11.Matcher instantiate(final ViatraQueryEngine engine) {
467 return Inv11.Matcher.on(engine);
468 }
469
470 @Override
471 public Inv11.Matcher instantiate() {
472 return Inv11.Matcher.create();
473 }
474
475 @Override
476 public Inv11.Match newEmptyMatch() {
477 return Inv11.Match.newEmptyMatch();
478 }
479
480 @Override
481 public Inv11.Match newMatch(final Object... parameters) {
482 return Inv11.Match.newMatch((Taxation.Expense) parameters[0]);
483 }
484
485 /**
486 * Inner class allowing the singleton instance of {@link Inv11} to be created
487 * <b>not</b> at the class load time of the outer class,
488 * but rather at the first call to {@link Inv11#instance()}.
489 *
490 * <p> This workaround is required e.g. to support recursion.
491 *
492 */
493 private static class LazyHolder {
494 private static final Inv11 INSTANCE = new Inv11();
495
496 /**
497 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
498 * This initialization order is required to support indirect recursion.
499 *
500 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
501 *
502 */
503 private static final Object STATIC_INITIALIZER = ensureInitialized();
504
505 public static Object ensureInitialized() {
506 INSTANCE.ensureInitializedInternal();
507 return null;
508 }
509 }
510
511 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
512 private static final Inv11.GeneratedPQuery INSTANCE = new GeneratedPQuery();
513
514 private final PParameter parameter_exp = new PParameter("exp", "Taxation.Expense", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Expense")), PParameterDirection.INOUT);
515
516 private final List<PParameter> parameters = Arrays.asList(parameter_exp);
517
518 private GeneratedPQuery() {
519 super(PVisibility.PUBLIC);
520 }
521
522 @Override
523 public String getFullyQualifiedName() {
524 return "queries.inv11";
525 }
526
527 @Override
528 public List<String> getParameterNames() {
529 return Arrays.asList("exp");
530 }
531
532 @Override
533 public List<PParameter> getParameters() {
534 return parameters;
535 }
536
537 @Override
538 public Set<PBody> doGetContainedBodies() {
539 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
540 Set<PBody> bodies = new LinkedHashSet<>();
541 {
542 PBody body = new PBody(this);
543 PVariable var_exp = body.getOrCreateVariableByName("exp");
544 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
545 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
546 new ExportedParameter(body, var_exp, parameter_exp)
547 ));
548 // find x_inv11_incOver100(exp)
549 new PositivePatternCall(body, Tuples.flatTupleOf(var_exp), X_inv11_incOver100.instance().getInternalQueryRepresentation());
550 // find x_inv11_incNotOver100(exp)
551 new PositivePatternCall(body, Tuples.flatTupleOf(var_exp), X_inv11_incNotOver100.instance().getInternalQueryRepresentation());
552 bodies.add(body);
553 }
554 {
555 PAnnotation annotation = new PAnnotation("Constraint");
556 annotation.addAttribute("message", "inv11");
557 annotation.addAttribute("severity", "error");
558 annotation.addAttribute("key", Arrays.asList(new Object[] {
559 new ParameterReference("exp")
560 }));
561 addAnnotation(annotation);
562 }
563 return bodies;
564 }
565 }
566}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv12.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv12.java
deleted file mode 100644
index fc1b0c62..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv12.java
+++ /dev/null
@@ -1,596 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Tax_Payer;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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.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;
43import queries.X_inv12_notNonRes;
44import queries.X_inv12_notZZ;
45
46/**
47 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
48 *
49 * <p>Original source:
50 * <code><pre>
51 * //inv12
52 * //exists - handled logically
53 * {@literal @}Constraint(message = "inv12", severity = "error", key = {tp})
54 * pattern inv12(tp : Tax_Payer) {
55 * Tax_Payer.addresses(tp, hab_add);
56 * Habitual_Address(hab_add);
57 * neg find x_inv12_notZZ(hab_add);
58 * Tax_Payer.incomes(tp, inc);
59 * Local_Income(inc);
60 * neg find x_inv12_notNonRes(tp);
61 * }
62 * </pre></code>
63 *
64 * @see Matcher
65 * @see Match
66 *
67 */
68@SuppressWarnings("all")
69public final class Inv12 extends BaseGeneratedEMFQuerySpecification<Inv12.Matcher> {
70 /**
71 * Pattern-specific match representation of the queries.inv12 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 Tax_Payer fTp;
84
85 private static List<String> parameterNames = makeImmutableList("tp");
86
87 private Match(final Tax_Payer pTp) {
88 this.fTp = pTp;
89 }
90
91 @Override
92 public Object get(final String parameterName) {
93 switch(parameterName) {
94 case "tp": return this.fTp;
95 default: return null;
96 }
97 }
98
99 @Override
100 public Object get(final int index) {
101 switch(index) {
102 case 0: return this.fTp;
103 default: return null;
104 }
105 }
106
107 public Tax_Payer getTp() {
108 return this.fTp;
109 }
110
111 @Override
112 public boolean set(final String parameterName, final Object newValue) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 if ("tp".equals(parameterName) ) {
115 this.fTp = (Tax_Payer) newValue;
116 return true;
117 }
118 return false;
119 }
120
121 public void setTp(final Tax_Payer pTp) {
122 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
123 this.fTp = pTp;
124 }
125
126 @Override
127 public String patternName() {
128 return "queries.inv12";
129 }
130
131 @Override
132 public List<String> parameterNames() {
133 return Inv12.Match.parameterNames;
134 }
135
136 @Override
137 public Object[] toArray() {
138 return new Object[]{fTp};
139 }
140
141 @Override
142 public Inv12.Match toImmutable() {
143 return isMutable() ? newMatch(fTp) : this;
144 }
145
146 @Override
147 public String prettyPrint() {
148 StringBuilder result = new StringBuilder();
149 result.append("\"tp\"=" + prettyPrintValue(fTp));
150 return result.toString();
151 }
152
153 @Override
154 public int hashCode() {
155 return Objects.hash(fTp);
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 Inv12.Match)) {
166 Inv12.Match other = (Inv12.Match) obj;
167 return Objects.equals(fTp, other.fTp);
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 Inv12 specification() {
180 return Inv12.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 Inv12.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 pTp the fixed value of pattern parameter tp, or null if not bound.
199 * @return the new, mutable (partial) match object.
200 *
201 */
202 public static Inv12.Match newMutableMatch(final Tax_Payer pTp) {
203 return new Mutable(pTp);
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 pTp the fixed value of pattern parameter tp, or null if not bound.
211 * @return the (partial) match object.
212 *
213 */
214 public static Inv12.Match newMatch(final Tax_Payer pTp) {
215 return new Immutable(pTp);
216 }
217
218 private static final class Mutable extends Inv12.Match {
219 Mutable(final Tax_Payer pTp) {
220 super(pTp);
221 }
222
223 @Override
224 public boolean isMutable() {
225 return true;
226 }
227 }
228
229 private static final class Immutable extends Inv12.Match {
230 Immutable(final Tax_Payer pTp) {
231 super(pTp);
232 }
233
234 @Override
235 public boolean isMutable() {
236 return false;
237 }
238 }
239 }
240
241 /**
242 * Generated pattern matcher API of the queries.inv12 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 * //inv12
253 * //exists - handled logically
254 * {@literal @}Constraint(message = "inv12", severity = "error", key = {tp})
255 * pattern inv12(tp : Tax_Payer) {
256 * Tax_Payer.addresses(tp, hab_add);
257 * Habitual_Address(hab_add);
258 * neg find x_inv12_notZZ(hab_add);
259 * Tax_Payer.incomes(tp, inc);
260 * Local_Income(inc);
261 * neg find x_inv12_notNonRes(tp);
262 * }
263 * </pre></code>
264 *
265 * @see Match
266 * @see Inv12
267 *
268 */
269 public static class Matcher extends BaseMatcher<Inv12.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 Inv12.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 Inv12.Matcher create() {
294 return new Matcher();
295 }
296
297 private static final int POSITION_TP = 0;
298
299 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv12.Matcher.class);
300
301 /**
302 * Initializes the pattern matcher within an existing VIATRA Query engine.
303 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
304 *
305 * @param engine the existing VIATRA Query engine in which this matcher will be created.
306 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
307 *
308 */
309 private Matcher() {
310 super(querySpecification());
311 }
312
313 /**
314 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
315 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
316 * @return matches represented as a Match object.
317 *
318 */
319 public Collection<Inv12.Match> getAllMatches(final Tax_Payer pTp) {
320 return rawStreamAllMatches(new Object[]{pTp}).collect(Collectors.toSet());
321 }
322
323 /**
324 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
325 * </p>
326 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
327 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
328 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
329 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
330 * @return a stream of matches represented as a Match object.
331 *
332 */
333 public Stream<Inv12.Match> streamAllMatches(final Tax_Payer pTp) {
334 return rawStreamAllMatches(new Object[]{pTp});
335 }
336
337 /**
338 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
339 * Neither determinism nor randomness of selection is guaranteed.
340 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
341 * @return a match represented as a Match object, or null if no match is found.
342 *
343 */
344 public Optional<Inv12.Match> getOneArbitraryMatch(final Tax_Payer pTp) {
345 return rawGetOneArbitraryMatch(new Object[]{pTp});
346 }
347
348 /**
349 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
350 * under any possible substitution of the unspecified parameters (if any).
351 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
352 * @return true if the input is a valid (partial) match of the pattern.
353 *
354 */
355 public boolean hasMatch(final Tax_Payer pTp) {
356 return rawHasMatch(new Object[]{pTp});
357 }
358
359 /**
360 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
361 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
362 * @return the number of pattern matches found.
363 *
364 */
365 public int countMatches(final Tax_Payer pTp) {
366 return rawCountMatches(new Object[]{pTp});
367 }
368
369 /**
370 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
371 * Neither determinism nor randomness of selection is guaranteed.
372 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
373 * @param processor the action that will process the selected match.
374 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
375 *
376 */
377 public boolean forOneArbitraryMatch(final Tax_Payer pTp, final Consumer<? super Inv12.Match> processor) {
378 return rawForOneArbitraryMatch(new Object[]{pTp}, processor);
379 }
380
381 /**
382 * Returns a new (partial) match.
383 * This can be used e.g. to call the matcher with a partial match.
384 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
385 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
386 * @return the (partial) match object.
387 *
388 */
389 public Inv12.Match newMatch(final Tax_Payer pTp) {
390 return Inv12.Match.newMatch(pTp);
391 }
392
393 /**
394 * Retrieve the set of values that occur in matches for tp.
395 * @return the Set of all values or empty set if there are no matches
396 *
397 */
398 protected Stream<Tax_Payer> rawStreamAllValuesOftp(final Object[] parameters) {
399 return rawStreamAllValues(POSITION_TP, parameters).map(Tax_Payer.class::cast);
400 }
401
402 /**
403 * Retrieve the set of values that occur in matches for tp.
404 * @return the Set of all values or empty set if there are no matches
405 *
406 */
407 public Set<Tax_Payer> getAllValuesOftp() {
408 return rawStreamAllValuesOftp(emptyArray()).collect(Collectors.toSet());
409 }
410
411 /**
412 * Retrieve the set of values that occur in matches for tp.
413 * @return the Set of all values or empty set if there are no matches
414 *
415 */
416 public Stream<Tax_Payer> streamAllValuesOftp() {
417 return rawStreamAllValuesOftp(emptyArray());
418 }
419
420 @Override
421 protected Inv12.Match tupleToMatch(final Tuple t) {
422 try {
423 return Inv12.Match.newMatch((Tax_Payer) t.get(POSITION_TP));
424 } catch(ClassCastException e) {
425 LOGGER.error("Element(s) in tuple not properly typed!",e);
426 return null;
427 }
428 }
429
430 @Override
431 protected Inv12.Match arrayToMatch(final Object[] match) {
432 try {
433 return Inv12.Match.newMatch((Tax_Payer) match[POSITION_TP]);
434 } catch(ClassCastException e) {
435 LOGGER.error("Element(s) in array not properly typed!",e);
436 return null;
437 }
438 }
439
440 @Override
441 protected Inv12.Match arrayToMatchMutable(final Object[] match) {
442 try {
443 return Inv12.Match.newMutableMatch((Tax_Payer) match[POSITION_TP]);
444 } catch(ClassCastException e) {
445 LOGGER.error("Element(s) in array not properly typed!",e);
446 return null;
447 }
448 }
449
450 /**
451 * @return the singleton instance of the query specification of this pattern
452 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
453 *
454 */
455 public static IQuerySpecification<Inv12.Matcher> querySpecification() {
456 return Inv12.instance();
457 }
458 }
459
460 private Inv12() {
461 super(GeneratedPQuery.INSTANCE);
462 }
463
464 /**
465 * @return the singleton instance of the query specification
466 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
467 *
468 */
469 public static Inv12 instance() {
470 try{
471 return LazyHolder.INSTANCE;
472 } catch (ExceptionInInitializerError err) {
473 throw processInitializerError(err);
474 }
475 }
476
477 @Override
478 protected Inv12.Matcher instantiate(final ViatraQueryEngine engine) {
479 return Inv12.Matcher.on(engine);
480 }
481
482 @Override
483 public Inv12.Matcher instantiate() {
484 return Inv12.Matcher.create();
485 }
486
487 @Override
488 public Inv12.Match newEmptyMatch() {
489 return Inv12.Match.newEmptyMatch();
490 }
491
492 @Override
493 public Inv12.Match newMatch(final Object... parameters) {
494 return Inv12.Match.newMatch((Taxation.Tax_Payer) parameters[0]);
495 }
496
497 /**
498 * Inner class allowing the singleton instance of {@link Inv12} to be created
499 * <b>not</b> at the class load time of the outer class,
500 * but rather at the first call to {@link Inv12#instance()}.
501 *
502 * <p> This workaround is required e.g. to support recursion.
503 *
504 */
505 private static class LazyHolder {
506 private static final Inv12 INSTANCE = new Inv12();
507
508 /**
509 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
510 * This initialization order is required to support indirect recursion.
511 *
512 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
513 *
514 */
515 private static final Object STATIC_INITIALIZER = ensureInitialized();
516
517 public static Object ensureInitialized() {
518 INSTANCE.ensureInitializedInternal();
519 return null;
520 }
521 }
522
523 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
524 private static final Inv12.GeneratedPQuery INSTANCE = new GeneratedPQuery();
525
526 private final PParameter parameter_tp = new PParameter("tp", "Taxation.Tax_Payer", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Tax_Payer")), PParameterDirection.INOUT);
527
528 private final List<PParameter> parameters = Arrays.asList(parameter_tp);
529
530 private GeneratedPQuery() {
531 super(PVisibility.PUBLIC);
532 }
533
534 @Override
535 public String getFullyQualifiedName() {
536 return "queries.inv12";
537 }
538
539 @Override
540 public List<String> getParameterNames() {
541 return Arrays.asList("tp");
542 }
543
544 @Override
545 public List<PParameter> getParameters() {
546 return parameters;
547 }
548
549 @Override
550 public Set<PBody> doGetContainedBodies() {
551 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
552 Set<PBody> bodies = new LinkedHashSet<>();
553 {
554 PBody body = new PBody(this);
555 PVariable var_tp = body.getOrCreateVariableByName("tp");
556 PVariable var_hab_add = body.getOrCreateVariableByName("hab_add");
557 PVariable var_inc = body.getOrCreateVariableByName("inc");
558 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
559 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
560 new ExportedParameter(body, var_tp, parameter_tp)
561 ));
562 // Tax_Payer.addresses(tp, hab_add)
563 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
564 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
565 new TypeConstraint(body, Tuples.flatTupleOf(var_tp, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "addresses")));
566 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Address")));
567 new Equality(body, var__virtual_0_, var_hab_add);
568 // Habitual_Address(hab_add)
569 new TypeConstraint(body, Tuples.flatTupleOf(var_hab_add), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Habitual_Address")));
570 // neg find x_inv12_notZZ(hab_add)
571 new NegativePatternCall(body, Tuples.flatTupleOf(var_hab_add), X_inv12_notZZ.instance().getInternalQueryRepresentation());
572 // Tax_Payer.incomes(tp, inc)
573 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
574 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
575 new TypeConstraint(body, Tuples.flatTupleOf(var_tp, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Tax_Payer", "incomes")));
576 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
577 new Equality(body, var__virtual_1_, var_inc);
578 // Local_Income(inc)
579 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Local_Income")));
580 // neg find x_inv12_notNonRes(tp)
581 new NegativePatternCall(body, Tuples.flatTupleOf(var_tp), X_inv12_notNonRes.instance().getInternalQueryRepresentation());
582 bodies.add(body);
583 }
584 {
585 PAnnotation annotation = new PAnnotation("Constraint");
586 annotation.addAttribute("message", "inv12");
587 annotation.addAttribute("severity", "error");
588 annotation.addAttribute("key", Arrays.asList(new Object[] {
589 new ParameterReference("tp")
590 }));
591 addAnnotation(annotation);
592 }
593 return bodies;
594 }
595 }
596}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv13.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv13.java
deleted file mode 100644
index a4aea47c..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv13.java
+++ /dev/null
@@ -1,591 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Tax_Payer;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.annotations.PAnnotation;
34import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.ConstantValue;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
40import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
43import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
44import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
45import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
46import queries.X_inv13;
47
48/**
49 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
50 *
51 * <p>Original source:
52 * <code><pre>
53 * //inv13 - Added new containment rel Phys_Pers-{@literal >}Address
54 * //exists - handled logically
55 * {@literal @}Constraint(message = "inv13", severity = "error", key = {tp})
56 * pattern inv13(tp : Tax_Payer) {
57 * Tax_Payer.addresses(tp, hab_add);
58 * Habitual_Address(hab_add);
59 * Address.country(hab_add, ::ZZ);
60 * neg find x_inv13(tp);
61 * }
62 * </pre></code>
63 *
64 * @see Matcher
65 * @see Match
66 *
67 */
68@SuppressWarnings("all")
69public final class Inv13 extends BaseGeneratedEMFQuerySpecification<Inv13.Matcher> {
70 /**
71 * Pattern-specific match representation of the queries.inv13 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 Tax_Payer fTp;
84
85 private static List<String> parameterNames = makeImmutableList("tp");
86
87 private Match(final Tax_Payer pTp) {
88 this.fTp = pTp;
89 }
90
91 @Override
92 public Object get(final String parameterName) {
93 switch(parameterName) {
94 case "tp": return this.fTp;
95 default: return null;
96 }
97 }
98
99 @Override
100 public Object get(final int index) {
101 switch(index) {
102 case 0: return this.fTp;
103 default: return null;
104 }
105 }
106
107 public Tax_Payer getTp() {
108 return this.fTp;
109 }
110
111 @Override
112 public boolean set(final String parameterName, final Object newValue) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 if ("tp".equals(parameterName) ) {
115 this.fTp = (Tax_Payer) newValue;
116 return true;
117 }
118 return false;
119 }
120
121 public void setTp(final Tax_Payer pTp) {
122 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
123 this.fTp = pTp;
124 }
125
126 @Override
127 public String patternName() {
128 return "queries.inv13";
129 }
130
131 @Override
132 public List<String> parameterNames() {
133 return Inv13.Match.parameterNames;
134 }
135
136 @Override
137 public Object[] toArray() {
138 return new Object[]{fTp};
139 }
140
141 @Override
142 public Inv13.Match toImmutable() {
143 return isMutable() ? newMatch(fTp) : this;
144 }
145
146 @Override
147 public String prettyPrint() {
148 StringBuilder result = new StringBuilder();
149 result.append("\"tp\"=" + prettyPrintValue(fTp));
150 return result.toString();
151 }
152
153 @Override
154 public int hashCode() {
155 return Objects.hash(fTp);
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 Inv13.Match)) {
166 Inv13.Match other = (Inv13.Match) obj;
167 return Objects.equals(fTp, other.fTp);
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 Inv13 specification() {
180 return Inv13.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 Inv13.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 pTp the fixed value of pattern parameter tp, or null if not bound.
199 * @return the new, mutable (partial) match object.
200 *
201 */
202 public static Inv13.Match newMutableMatch(final Tax_Payer pTp) {
203 return new Mutable(pTp);
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 pTp the fixed value of pattern parameter tp, or null if not bound.
211 * @return the (partial) match object.
212 *
213 */
214 public static Inv13.Match newMatch(final Tax_Payer pTp) {
215 return new Immutable(pTp);
216 }
217
218 private static final class Mutable extends Inv13.Match {
219 Mutable(final Tax_Payer pTp) {
220 super(pTp);
221 }
222
223 @Override
224 public boolean isMutable() {
225 return true;
226 }
227 }
228
229 private static final class Immutable extends Inv13.Match {
230 Immutable(final Tax_Payer pTp) {
231 super(pTp);
232 }
233
234 @Override
235 public boolean isMutable() {
236 return false;
237 }
238 }
239 }
240
241 /**
242 * Generated pattern matcher API of the queries.inv13 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 * //inv13 - Added new containment rel Phys_Pers-{@literal >}Address
253 * //exists - handled logically
254 * {@literal @}Constraint(message = "inv13", severity = "error", key = {tp})
255 * pattern inv13(tp : Tax_Payer) {
256 * Tax_Payer.addresses(tp, hab_add);
257 * Habitual_Address(hab_add);
258 * Address.country(hab_add, ::ZZ);
259 * neg find x_inv13(tp);
260 * }
261 * </pre></code>
262 *
263 * @see Match
264 * @see Inv13
265 *
266 */
267 public static class Matcher extends BaseMatcher<Inv13.Match> {
268 /**
269 * Initializes the pattern matcher within an existing VIATRA Query engine.
270 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
271 *
272 * @param engine the existing VIATRA Query engine in which this matcher will be created.
273 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
274 *
275 */
276 public static Inv13.Matcher on(final ViatraQueryEngine engine) {
277 // check if matcher already exists
278 Matcher matcher = engine.getExistingMatcher(querySpecification());
279 if (matcher == null) {
280 matcher = (Matcher)engine.getMatcher(querySpecification());
281 }
282 return matcher;
283 }
284
285 /**
286 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
287 * @return an initialized matcher
288 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
289 *
290 */
291 public static Inv13.Matcher create() {
292 return new Matcher();
293 }
294
295 private static final int POSITION_TP = 0;
296
297 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv13.Matcher.class);
298
299 /**
300 * Initializes the pattern matcher within an existing VIATRA Query engine.
301 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
302 *
303 * @param engine the existing VIATRA Query engine in which this matcher will be created.
304 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
305 *
306 */
307 private Matcher() {
308 super(querySpecification());
309 }
310
311 /**
312 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
313 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
314 * @return matches represented as a Match object.
315 *
316 */
317 public Collection<Inv13.Match> getAllMatches(final Tax_Payer pTp) {
318 return rawStreamAllMatches(new Object[]{pTp}).collect(Collectors.toSet());
319 }
320
321 /**
322 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
323 * </p>
324 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
325 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
326 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
327 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
328 * @return a stream of matches represented as a Match object.
329 *
330 */
331 public Stream<Inv13.Match> streamAllMatches(final Tax_Payer pTp) {
332 return rawStreamAllMatches(new Object[]{pTp});
333 }
334
335 /**
336 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
337 * Neither determinism nor randomness of selection is guaranteed.
338 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
339 * @return a match represented as a Match object, or null if no match is found.
340 *
341 */
342 public Optional<Inv13.Match> getOneArbitraryMatch(final Tax_Payer pTp) {
343 return rawGetOneArbitraryMatch(new Object[]{pTp});
344 }
345
346 /**
347 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
348 * under any possible substitution of the unspecified parameters (if any).
349 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
350 * @return true if the input is a valid (partial) match of the pattern.
351 *
352 */
353 public boolean hasMatch(final Tax_Payer pTp) {
354 return rawHasMatch(new Object[]{pTp});
355 }
356
357 /**
358 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
359 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
360 * @return the number of pattern matches found.
361 *
362 */
363 public int countMatches(final Tax_Payer pTp) {
364 return rawCountMatches(new Object[]{pTp});
365 }
366
367 /**
368 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
369 * Neither determinism nor randomness of selection is guaranteed.
370 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
371 * @param processor the action that will process the selected match.
372 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
373 *
374 */
375 public boolean forOneArbitraryMatch(final Tax_Payer pTp, final Consumer<? super Inv13.Match> processor) {
376 return rawForOneArbitraryMatch(new Object[]{pTp}, processor);
377 }
378
379 /**
380 * Returns a new (partial) match.
381 * This can be used e.g. to call the matcher with a partial match.
382 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
383 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
384 * @return the (partial) match object.
385 *
386 */
387 public Inv13.Match newMatch(final Tax_Payer pTp) {
388 return Inv13.Match.newMatch(pTp);
389 }
390
391 /**
392 * Retrieve the set of values that occur in matches for tp.
393 * @return the Set of all values or empty set if there are no matches
394 *
395 */
396 protected Stream<Tax_Payer> rawStreamAllValuesOftp(final Object[] parameters) {
397 return rawStreamAllValues(POSITION_TP, parameters).map(Tax_Payer.class::cast);
398 }
399
400 /**
401 * Retrieve the set of values that occur in matches for tp.
402 * @return the Set of all values or empty set if there are no matches
403 *
404 */
405 public Set<Tax_Payer> getAllValuesOftp() {
406 return rawStreamAllValuesOftp(emptyArray()).collect(Collectors.toSet());
407 }
408
409 /**
410 * Retrieve the set of values that occur in matches for tp.
411 * @return the Set of all values or empty set if there are no matches
412 *
413 */
414 public Stream<Tax_Payer> streamAllValuesOftp() {
415 return rawStreamAllValuesOftp(emptyArray());
416 }
417
418 @Override
419 protected Inv13.Match tupleToMatch(final Tuple t) {
420 try {
421 return Inv13.Match.newMatch((Tax_Payer) t.get(POSITION_TP));
422 } catch(ClassCastException e) {
423 LOGGER.error("Element(s) in tuple not properly typed!",e);
424 return null;
425 }
426 }
427
428 @Override
429 protected Inv13.Match arrayToMatch(final Object[] match) {
430 try {
431 return Inv13.Match.newMatch((Tax_Payer) match[POSITION_TP]);
432 } catch(ClassCastException e) {
433 LOGGER.error("Element(s) in array not properly typed!",e);
434 return null;
435 }
436 }
437
438 @Override
439 protected Inv13.Match arrayToMatchMutable(final Object[] match) {
440 try {
441 return Inv13.Match.newMutableMatch((Tax_Payer) match[POSITION_TP]);
442 } catch(ClassCastException e) {
443 LOGGER.error("Element(s) in array not properly typed!",e);
444 return null;
445 }
446 }
447
448 /**
449 * @return the singleton instance of the query specification of this pattern
450 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
451 *
452 */
453 public static IQuerySpecification<Inv13.Matcher> querySpecification() {
454 return Inv13.instance();
455 }
456 }
457
458 private Inv13() {
459 super(GeneratedPQuery.INSTANCE);
460 }
461
462 /**
463 * @return the singleton instance of the query specification
464 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
465 *
466 */
467 public static Inv13 instance() {
468 try{
469 return LazyHolder.INSTANCE;
470 } catch (ExceptionInInitializerError err) {
471 throw processInitializerError(err);
472 }
473 }
474
475 @Override
476 protected Inv13.Matcher instantiate(final ViatraQueryEngine engine) {
477 return Inv13.Matcher.on(engine);
478 }
479
480 @Override
481 public Inv13.Matcher instantiate() {
482 return Inv13.Matcher.create();
483 }
484
485 @Override
486 public Inv13.Match newEmptyMatch() {
487 return Inv13.Match.newEmptyMatch();
488 }
489
490 @Override
491 public Inv13.Match newMatch(final Object... parameters) {
492 return Inv13.Match.newMatch((Taxation.Tax_Payer) parameters[0]);
493 }
494
495 /**
496 * Inner class allowing the singleton instance of {@link Inv13} to be created
497 * <b>not</b> at the class load time of the outer class,
498 * but rather at the first call to {@link Inv13#instance()}.
499 *
500 * <p> This workaround is required e.g. to support recursion.
501 *
502 */
503 private static class LazyHolder {
504 private static final Inv13 INSTANCE = new Inv13();
505
506 /**
507 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
508 * This initialization order is required to support indirect recursion.
509 *
510 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
511 *
512 */
513 private static final Object STATIC_INITIALIZER = ensureInitialized();
514
515 public static Object ensureInitialized() {
516 INSTANCE.ensureInitializedInternal();
517 return null;
518 }
519 }
520
521 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
522 private static final Inv13.GeneratedPQuery INSTANCE = new GeneratedPQuery();
523
524 private final PParameter parameter_tp = new PParameter("tp", "Taxation.Tax_Payer", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Tax_Payer")), PParameterDirection.INOUT);
525
526 private final List<PParameter> parameters = Arrays.asList(parameter_tp);
527
528 private GeneratedPQuery() {
529 super(PVisibility.PUBLIC);
530 }
531
532 @Override
533 public String getFullyQualifiedName() {
534 return "queries.inv13";
535 }
536
537 @Override
538 public List<String> getParameterNames() {
539 return Arrays.asList("tp");
540 }
541
542 @Override
543 public List<PParameter> getParameters() {
544 return parameters;
545 }
546
547 @Override
548 public Set<PBody> doGetContainedBodies() {
549 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
550 Set<PBody> bodies = new LinkedHashSet<>();
551 {
552 PBody body = new PBody(this);
553 PVariable var_tp = body.getOrCreateVariableByName("tp");
554 PVariable var_hab_add = body.getOrCreateVariableByName("hab_add");
555 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
556 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
557 new ExportedParameter(body, var_tp, parameter_tp)
558 ));
559 // Tax_Payer.addresses(tp, hab_add)
560 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
561 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
562 new TypeConstraint(body, Tuples.flatTupleOf(var_tp, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "addresses")));
563 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Address")));
564 new Equality(body, var__virtual_0_, var_hab_add);
565 // Habitual_Address(hab_add)
566 new TypeConstraint(body, Tuples.flatTupleOf(var_hab_add), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Habitual_Address")));
567 // Address.country(hab_add, ::ZZ)
568 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
569 new ConstantValue(body, var__virtual_1_, getEnumLiteral("http:///TaxCard.ecore", "Country", "ZZ").getInstance());
570 new TypeConstraint(body, Tuples.flatTupleOf(var_hab_add), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Address")));
571 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
572 new TypeConstraint(body, Tuples.flatTupleOf(var_hab_add, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Address", "country")));
573 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http:///TaxCard.ecore", "Country")));
574 new Equality(body, var__virtual_2_, var__virtual_1_);
575 // neg find x_inv13(tp)
576 new NegativePatternCall(body, Tuples.flatTupleOf(var_tp), X_inv13.instance().getInternalQueryRepresentation());
577 bodies.add(body);
578 }
579 {
580 PAnnotation annotation = new PAnnotation("Constraint");
581 annotation.addAttribute("message", "inv13");
582 annotation.addAttribute("severity", "error");
583 annotation.addAttribute("key", Arrays.asList(new Object[] {
584 new ParameterReference("tp")
585 }));
586 addAnnotation(annotation);
587 }
588 return bodies;
589 }
590 }
591}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv15.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv15.java
deleted file mode 100644
index 3bfab503..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv15.java
+++ /dev/null
@@ -1,567 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.External_Allowance;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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.annotations.PAnnotation;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
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;
41import queries.X_inv15;
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 * //inv14-MultiplicityChanged
49 *
50 * //inv15-Ordered Sets in assignment if block
51 * //ERROR if no household object
52 * {@literal @}Constraint(message = "inv15", severity = "error", key = {ea})
53 * pattern inv15(ea : External_Allowance) {
54 * neg find x_inv15(ea);
55 * }
56 * </pre></code>
57 *
58 * @see Matcher
59 * @see Match
60 *
61 */
62@SuppressWarnings("all")
63public final class Inv15 extends BaseGeneratedEMFQuerySpecification<Inv15.Matcher> {
64 /**
65 * Pattern-specific match representation of the queries.inv15 pattern,
66 * to be used in conjunction with {@link Matcher}.
67 *
68 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
69 * Each instance is a (possibly partial) substitution of pattern parameters,
70 * usable to represent a match of the pattern in the result of a query,
71 * or to specify the bound (fixed) input parameters when issuing a query.
72 *
73 * @see Matcher
74 *
75 */
76 public static abstract class Match extends BasePatternMatch {
77 private External_Allowance fEa;
78
79 private static List<String> parameterNames = makeImmutableList("ea");
80
81 private Match(final External_Allowance pEa) {
82 this.fEa = pEa;
83 }
84
85 @Override
86 public Object get(final String parameterName) {
87 switch(parameterName) {
88 case "ea": return this.fEa;
89 default: return null;
90 }
91 }
92
93 @Override
94 public Object get(final int index) {
95 switch(index) {
96 case 0: return this.fEa;
97 default: return null;
98 }
99 }
100
101 public External_Allowance getEa() {
102 return this.fEa;
103 }
104
105 @Override
106 public boolean set(final String parameterName, final Object newValue) {
107 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
108 if ("ea".equals(parameterName) ) {
109 this.fEa = (External_Allowance) newValue;
110 return true;
111 }
112 return false;
113 }
114
115 public void setEa(final External_Allowance pEa) {
116 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
117 this.fEa = pEa;
118 }
119
120 @Override
121 public String patternName() {
122 return "queries.inv15";
123 }
124
125 @Override
126 public List<String> parameterNames() {
127 return Inv15.Match.parameterNames;
128 }
129
130 @Override
131 public Object[] toArray() {
132 return new Object[]{fEa};
133 }
134
135 @Override
136 public Inv15.Match toImmutable() {
137 return isMutable() ? newMatch(fEa) : this;
138 }
139
140 @Override
141 public String prettyPrint() {
142 StringBuilder result = new StringBuilder();
143 result.append("\"ea\"=" + prettyPrintValue(fEa));
144 return result.toString();
145 }
146
147 @Override
148 public int hashCode() {
149 return Objects.hash(fEa);
150 }
151
152 @Override
153 public boolean equals(final Object obj) {
154 if (this == obj)
155 return true;
156 if (obj == null) {
157 return false;
158 }
159 if ((obj instanceof Inv15.Match)) {
160 Inv15.Match other = (Inv15.Match) obj;
161 return Objects.equals(fEa, other.fEa);
162 } else {
163 // this should be infrequent
164 if (!(obj instanceof IPatternMatch)) {
165 return false;
166 }
167 IPatternMatch otherSig = (IPatternMatch) obj;
168 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
169 }
170 }
171
172 @Override
173 public Inv15 specification() {
174 return Inv15.instance();
175 }
176
177 /**
178 * Returns an empty, mutable match.
179 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
180 *
181 * @return the empty match.
182 *
183 */
184 public static Inv15.Match newEmptyMatch() {
185 return new Mutable(null);
186 }
187
188 /**
189 * Returns a mutable (partial) match.
190 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
191 *
192 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
193 * @return the new, mutable (partial) match object.
194 *
195 */
196 public static Inv15.Match newMutableMatch(final External_Allowance pEa) {
197 return new Mutable(pEa);
198 }
199
200 /**
201 * Returns a new (partial) match.
202 * This can be used e.g. to call the matcher with a partial match.
203 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
204 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
205 * @return the (partial) match object.
206 *
207 */
208 public static Inv15.Match newMatch(final External_Allowance pEa) {
209 return new Immutable(pEa);
210 }
211
212 private static final class Mutable extends Inv15.Match {
213 Mutable(final External_Allowance pEa) {
214 super(pEa);
215 }
216
217 @Override
218 public boolean isMutable() {
219 return true;
220 }
221 }
222
223 private static final class Immutable extends Inv15.Match {
224 Immutable(final External_Allowance pEa) {
225 super(pEa);
226 }
227
228 @Override
229 public boolean isMutable() {
230 return false;
231 }
232 }
233 }
234
235 /**
236 * Generated pattern matcher API of the queries.inv15 pattern,
237 * providing pattern-specific query methods.
238 *
239 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
240 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
241 *
242 * <p>Matches of the pattern will be represented as {@link Match}.
243 *
244 * <p>Original source:
245 * <code><pre>
246 * //inv14-MultiplicityChanged
247 *
248 * //inv15-Ordered Sets in assignment if block
249 * //ERROR if no household object
250 * {@literal @}Constraint(message = "inv15", severity = "error", key = {ea})
251 * pattern inv15(ea : External_Allowance) {
252 * neg find x_inv15(ea);
253 * }
254 * </pre></code>
255 *
256 * @see Match
257 * @see Inv15
258 *
259 */
260 public static class Matcher extends BaseMatcher<Inv15.Match> {
261 /**
262 * Initializes the pattern matcher within an existing VIATRA Query engine.
263 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
264 *
265 * @param engine the existing VIATRA Query engine in which this matcher will be created.
266 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
267 *
268 */
269 public static Inv15.Matcher on(final ViatraQueryEngine engine) {
270 // check if matcher already exists
271 Matcher matcher = engine.getExistingMatcher(querySpecification());
272 if (matcher == null) {
273 matcher = (Matcher)engine.getMatcher(querySpecification());
274 }
275 return matcher;
276 }
277
278 /**
279 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
280 * @return an initialized matcher
281 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
282 *
283 */
284 public static Inv15.Matcher create() {
285 return new Matcher();
286 }
287
288 private static final int POSITION_EA = 0;
289
290 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv15.Matcher.class);
291
292 /**
293 * Initializes the pattern matcher within an existing VIATRA Query engine.
294 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
295 *
296 * @param engine the existing VIATRA Query engine in which this matcher will be created.
297 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
298 *
299 */
300 private Matcher() {
301 super(querySpecification());
302 }
303
304 /**
305 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
306 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
307 * @return matches represented as a Match object.
308 *
309 */
310 public Collection<Inv15.Match> getAllMatches(final External_Allowance pEa) {
311 return rawStreamAllMatches(new Object[]{pEa}).collect(Collectors.toSet());
312 }
313
314 /**
315 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
316 * </p>
317 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
318 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
319 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
320 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
321 * @return a stream of matches represented as a Match object.
322 *
323 */
324 public Stream<Inv15.Match> streamAllMatches(final External_Allowance pEa) {
325 return rawStreamAllMatches(new Object[]{pEa});
326 }
327
328 /**
329 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
330 * Neither determinism nor randomness of selection is guaranteed.
331 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
332 * @return a match represented as a Match object, or null if no match is found.
333 *
334 */
335 public Optional<Inv15.Match> getOneArbitraryMatch(final External_Allowance pEa) {
336 return rawGetOneArbitraryMatch(new Object[]{pEa});
337 }
338
339 /**
340 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
341 * under any possible substitution of the unspecified parameters (if any).
342 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
343 * @return true if the input is a valid (partial) match of the pattern.
344 *
345 */
346 public boolean hasMatch(final External_Allowance pEa) {
347 return rawHasMatch(new Object[]{pEa});
348 }
349
350 /**
351 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
352 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
353 * @return the number of pattern matches found.
354 *
355 */
356 public int countMatches(final External_Allowance pEa) {
357 return rawCountMatches(new Object[]{pEa});
358 }
359
360 /**
361 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
362 * Neither determinism nor randomness of selection is guaranteed.
363 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
364 * @param processor the action that will process the selected match.
365 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
366 *
367 */
368 public boolean forOneArbitraryMatch(final External_Allowance pEa, final Consumer<? super Inv15.Match> processor) {
369 return rawForOneArbitraryMatch(new Object[]{pEa}, processor);
370 }
371
372 /**
373 * Returns a new (partial) match.
374 * This can be used e.g. to call the matcher with a partial match.
375 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
376 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
377 * @return the (partial) match object.
378 *
379 */
380 public Inv15.Match newMatch(final External_Allowance pEa) {
381 return Inv15.Match.newMatch(pEa);
382 }
383
384 /**
385 * Retrieve the set of values that occur in matches for ea.
386 * @return the Set of all values or empty set if there are no matches
387 *
388 */
389 protected Stream<External_Allowance> rawStreamAllValuesOfea(final Object[] parameters) {
390 return rawStreamAllValues(POSITION_EA, parameters).map(External_Allowance.class::cast);
391 }
392
393 /**
394 * Retrieve the set of values that occur in matches for ea.
395 * @return the Set of all values or empty set if there are no matches
396 *
397 */
398 public Set<External_Allowance> getAllValuesOfea() {
399 return rawStreamAllValuesOfea(emptyArray()).collect(Collectors.toSet());
400 }
401
402 /**
403 * Retrieve the set of values that occur in matches for ea.
404 * @return the Set of all values or empty set if there are no matches
405 *
406 */
407 public Stream<External_Allowance> streamAllValuesOfea() {
408 return rawStreamAllValuesOfea(emptyArray());
409 }
410
411 @Override
412 protected Inv15.Match tupleToMatch(final Tuple t) {
413 try {
414 return Inv15.Match.newMatch((External_Allowance) t.get(POSITION_EA));
415 } catch(ClassCastException e) {
416 LOGGER.error("Element(s) in tuple not properly typed!",e);
417 return null;
418 }
419 }
420
421 @Override
422 protected Inv15.Match arrayToMatch(final Object[] match) {
423 try {
424 return Inv15.Match.newMatch((External_Allowance) match[POSITION_EA]);
425 } catch(ClassCastException e) {
426 LOGGER.error("Element(s) in array not properly typed!",e);
427 return null;
428 }
429 }
430
431 @Override
432 protected Inv15.Match arrayToMatchMutable(final Object[] match) {
433 try {
434 return Inv15.Match.newMutableMatch((External_Allowance) match[POSITION_EA]);
435 } catch(ClassCastException e) {
436 LOGGER.error("Element(s) in array not properly typed!",e);
437 return null;
438 }
439 }
440
441 /**
442 * @return the singleton instance of the query specification of this pattern
443 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
444 *
445 */
446 public static IQuerySpecification<Inv15.Matcher> querySpecification() {
447 return Inv15.instance();
448 }
449 }
450
451 private Inv15() {
452 super(GeneratedPQuery.INSTANCE);
453 }
454
455 /**
456 * @return the singleton instance of the query specification
457 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
458 *
459 */
460 public static Inv15 instance() {
461 try{
462 return LazyHolder.INSTANCE;
463 } catch (ExceptionInInitializerError err) {
464 throw processInitializerError(err);
465 }
466 }
467
468 @Override
469 protected Inv15.Matcher instantiate(final ViatraQueryEngine engine) {
470 return Inv15.Matcher.on(engine);
471 }
472
473 @Override
474 public Inv15.Matcher instantiate() {
475 return Inv15.Matcher.create();
476 }
477
478 @Override
479 public Inv15.Match newEmptyMatch() {
480 return Inv15.Match.newEmptyMatch();
481 }
482
483 @Override
484 public Inv15.Match newMatch(final Object... parameters) {
485 return Inv15.Match.newMatch((Taxation.External_Allowance) parameters[0]);
486 }
487
488 /**
489 * Inner class allowing the singleton instance of {@link Inv15} to be created
490 * <b>not</b> at the class load time of the outer class,
491 * but rather at the first call to {@link Inv15#instance()}.
492 *
493 * <p> This workaround is required e.g. to support recursion.
494 *
495 */
496 private static class LazyHolder {
497 private static final Inv15 INSTANCE = new Inv15();
498
499 /**
500 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
501 * This initialization order is required to support indirect recursion.
502 *
503 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
504 *
505 */
506 private static final Object STATIC_INITIALIZER = ensureInitialized();
507
508 public static Object ensureInitialized() {
509 INSTANCE.ensureInitializedInternal();
510 return null;
511 }
512 }
513
514 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
515 private static final Inv15.GeneratedPQuery INSTANCE = new GeneratedPQuery();
516
517 private final PParameter parameter_ea = new PParameter("ea", "Taxation.External_Allowance", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "External_Allowance")), PParameterDirection.INOUT);
518
519 private final List<PParameter> parameters = Arrays.asList(parameter_ea);
520
521 private GeneratedPQuery() {
522 super(PVisibility.PUBLIC);
523 }
524
525 @Override
526 public String getFullyQualifiedName() {
527 return "queries.inv15";
528 }
529
530 @Override
531 public List<String> getParameterNames() {
532 return Arrays.asList("ea");
533 }
534
535 @Override
536 public List<PParameter> getParameters() {
537 return parameters;
538 }
539
540 @Override
541 public Set<PBody> doGetContainedBodies() {
542 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
543 Set<PBody> bodies = new LinkedHashSet<>();
544 {
545 PBody body = new PBody(this);
546 PVariable var_ea = body.getOrCreateVariableByName("ea");
547 new TypeConstraint(body, Tuples.flatTupleOf(var_ea), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "External_Allowance")));
548 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
549 new ExportedParameter(body, var_ea, parameter_ea)
550 ));
551 // neg find x_inv15(ea)
552 new NegativePatternCall(body, Tuples.flatTupleOf(var_ea), X_inv15.instance().getInternalQueryRepresentation());
553 bodies.add(body);
554 }
555 {
556 PAnnotation annotation = new PAnnotation("Constraint");
557 annotation.addAttribute("message", "inv15");
558 annotation.addAttribute("severity", "error");
559 annotation.addAttribute("key", Arrays.asList(new Object[] {
560 new ParameterReference("ea")
561 }));
562 addAnnotation(annotation);
563 }
564 return bodies;
565 }
566 }
567}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv17.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv17.java
deleted file mode 100644
index 4a10d4f4..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv17.java
+++ /dev/null
@@ -1,643 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Legal_Union_Record;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
36import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
43import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
44import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
45import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
46import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
47
48/**
49 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
50 *
51 * <p>Original source:
52 * <code><pre>
53 * //inv16-Tax_Card.tax_card_type is a derived feature
54 *
55 * //inv17-attribute-handled by multiplicity
56 * {@literal @}Constraint(message = "inv17", severity = "error", key = {lur})
57 * pattern inv17(lur : Legal_Union_Record) {
58 * Legal_Union_Record.start_year(lur, sy);
59 * check(sy {@literal <} 1950);
60 * } or {
61 * Legal_Union_Record.start_year(lur, sy);
62 * check(sy {@literal >} 2018);
63 * }
64 * </pre></code>
65 *
66 * @see Matcher
67 * @see Match
68 *
69 */
70@SuppressWarnings("all")
71public final class Inv17 extends BaseGeneratedEMFQuerySpecification<Inv17.Matcher> {
72 /**
73 * Pattern-specific match representation of the queries.inv17 pattern,
74 * to be used in conjunction with {@link Matcher}.
75 *
76 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
77 * Each instance is a (possibly partial) substitution of pattern parameters,
78 * usable to represent a match of the pattern in the result of a query,
79 * or to specify the bound (fixed) input parameters when issuing a query.
80 *
81 * @see Matcher
82 *
83 */
84 public static abstract class Match extends BasePatternMatch {
85 private Legal_Union_Record fLur;
86
87 private static List<String> parameterNames = makeImmutableList("lur");
88
89 private Match(final Legal_Union_Record pLur) {
90 this.fLur = pLur;
91 }
92
93 @Override
94 public Object get(final String parameterName) {
95 switch(parameterName) {
96 case "lur": return this.fLur;
97 default: return null;
98 }
99 }
100
101 @Override
102 public Object get(final int index) {
103 switch(index) {
104 case 0: return this.fLur;
105 default: return null;
106 }
107 }
108
109 public Legal_Union_Record getLur() {
110 return this.fLur;
111 }
112
113 @Override
114 public boolean set(final String parameterName, final Object newValue) {
115 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
116 if ("lur".equals(parameterName) ) {
117 this.fLur = (Legal_Union_Record) newValue;
118 return true;
119 }
120 return false;
121 }
122
123 public void setLur(final Legal_Union_Record pLur) {
124 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
125 this.fLur = pLur;
126 }
127
128 @Override
129 public String patternName() {
130 return "queries.inv17";
131 }
132
133 @Override
134 public List<String> parameterNames() {
135 return Inv17.Match.parameterNames;
136 }
137
138 @Override
139 public Object[] toArray() {
140 return new Object[]{fLur};
141 }
142
143 @Override
144 public Inv17.Match toImmutable() {
145 return isMutable() ? newMatch(fLur) : this;
146 }
147
148 @Override
149 public String prettyPrint() {
150 StringBuilder result = new StringBuilder();
151 result.append("\"lur\"=" + prettyPrintValue(fLur));
152 return result.toString();
153 }
154
155 @Override
156 public int hashCode() {
157 return Objects.hash(fLur);
158 }
159
160 @Override
161 public boolean equals(final Object obj) {
162 if (this == obj)
163 return true;
164 if (obj == null) {
165 return false;
166 }
167 if ((obj instanceof Inv17.Match)) {
168 Inv17.Match other = (Inv17.Match) obj;
169 return Objects.equals(fLur, other.fLur);
170 } else {
171 // this should be infrequent
172 if (!(obj instanceof IPatternMatch)) {
173 return false;
174 }
175 IPatternMatch otherSig = (IPatternMatch) obj;
176 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
177 }
178 }
179
180 @Override
181 public Inv17 specification() {
182 return Inv17.instance();
183 }
184
185 /**
186 * Returns an empty, mutable match.
187 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
188 *
189 * @return the empty match.
190 *
191 */
192 public static Inv17.Match newEmptyMatch() {
193 return new Mutable(null);
194 }
195
196 /**
197 * Returns a mutable (partial) match.
198 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
199 *
200 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
201 * @return the new, mutable (partial) match object.
202 *
203 */
204 public static Inv17.Match newMutableMatch(final Legal_Union_Record pLur) {
205 return new Mutable(pLur);
206 }
207
208 /**
209 * Returns a new (partial) match.
210 * This can be used e.g. to call the matcher with a partial match.
211 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
212 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
213 * @return the (partial) match object.
214 *
215 */
216 public static Inv17.Match newMatch(final Legal_Union_Record pLur) {
217 return new Immutable(pLur);
218 }
219
220 private static final class Mutable extends Inv17.Match {
221 Mutable(final Legal_Union_Record pLur) {
222 super(pLur);
223 }
224
225 @Override
226 public boolean isMutable() {
227 return true;
228 }
229 }
230
231 private static final class Immutable extends Inv17.Match {
232 Immutable(final Legal_Union_Record pLur) {
233 super(pLur);
234 }
235
236 @Override
237 public boolean isMutable() {
238 return false;
239 }
240 }
241 }
242
243 /**
244 * Generated pattern matcher API of the queries.inv17 pattern,
245 * providing pattern-specific query methods.
246 *
247 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
248 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
249 *
250 * <p>Matches of the pattern will be represented as {@link Match}.
251 *
252 * <p>Original source:
253 * <code><pre>
254 * //inv16-Tax_Card.tax_card_type is a derived feature
255 *
256 * //inv17-attribute-handled by multiplicity
257 * {@literal @}Constraint(message = "inv17", severity = "error", key = {lur})
258 * pattern inv17(lur : Legal_Union_Record) {
259 * Legal_Union_Record.start_year(lur, sy);
260 * check(sy {@literal <} 1950);
261 * } or {
262 * Legal_Union_Record.start_year(lur, sy);
263 * check(sy {@literal >} 2018);
264 * }
265 * </pre></code>
266 *
267 * @see Match
268 * @see Inv17
269 *
270 */
271 public static class Matcher extends BaseMatcher<Inv17.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 Inv17.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 Inv17.Matcher create() {
296 return new Matcher();
297 }
298
299 private static final int POSITION_LUR = 0;
300
301 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv17.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 pLur the fixed value of pattern parameter lur, or null if not bound.
318 * @return matches represented as a Match object.
319 *
320 */
321 public Collection<Inv17.Match> getAllMatches(final Legal_Union_Record pLur) {
322 return rawStreamAllMatches(new Object[]{pLur}).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 pLur the fixed value of pattern parameter lur, or null if not bound.
332 * @return a stream of matches represented as a Match object.
333 *
334 */
335 public Stream<Inv17.Match> streamAllMatches(final Legal_Union_Record pLur) {
336 return rawStreamAllMatches(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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<Inv17.Match> getOneArbitraryMatch(final Legal_Union_Record pLur) {
347 return rawGetOneArbitraryMatch(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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 Legal_Union_Record pLur) {
358 return rawHasMatch(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, or null if not bound.
364 * @return the number of pattern matches found.
365 *
366 */
367 public int countMatches(final Legal_Union_Record pLur) {
368 return rawCountMatches(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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 Legal_Union_Record pLur, final Consumer<? super Inv17.Match> processor) {
380 return rawForOneArbitraryMatch(new Object[]{pLur}, 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 pLur the fixed value of pattern parameter lur, or null if not bound.
388 * @return the (partial) match object.
389 *
390 */
391 public Inv17.Match newMatch(final Legal_Union_Record pLur) {
392 return Inv17.Match.newMatch(pLur);
393 }
394
395 /**
396 * Retrieve the set of values that occur in matches for lur.
397 * @return the Set of all values or empty set if there are no matches
398 *
399 */
400 protected Stream<Legal_Union_Record> rawStreamAllValuesOflur(final Object[] parameters) {
401 return rawStreamAllValues(POSITION_LUR, parameters).map(Legal_Union_Record.class::cast);
402 }
403
404 /**
405 * Retrieve the set of values that occur in matches for lur.
406 * @return the Set of all values or empty set if there are no matches
407 *
408 */
409 public Set<Legal_Union_Record> getAllValuesOflur() {
410 return rawStreamAllValuesOflur(emptyArray()).collect(Collectors.toSet());
411 }
412
413 /**
414 * Retrieve the set of values that occur in matches for lur.
415 * @return the Set of all values or empty set if there are no matches
416 *
417 */
418 public Stream<Legal_Union_Record> streamAllValuesOflur() {
419 return rawStreamAllValuesOflur(emptyArray());
420 }
421
422 @Override
423 protected Inv17.Match tupleToMatch(final Tuple t) {
424 try {
425 return Inv17.Match.newMatch((Legal_Union_Record) t.get(POSITION_LUR));
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 Inv17.Match arrayToMatch(final Object[] match) {
434 try {
435 return Inv17.Match.newMatch((Legal_Union_Record) match[POSITION_LUR]);
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 Inv17.Match arrayToMatchMutable(final Object[] match) {
444 try {
445 return Inv17.Match.newMutableMatch((Legal_Union_Record) match[POSITION_LUR]);
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<Inv17.Matcher> querySpecification() {
458 return Inv17.instance();
459 }
460 }
461
462 private Inv17() {
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 Inv17 instance() {
472 try{
473 return LazyHolder.INSTANCE;
474 } catch (ExceptionInInitializerError err) {
475 throw processInitializerError(err);
476 }
477 }
478
479 @Override
480 protected Inv17.Matcher instantiate(final ViatraQueryEngine engine) {
481 return Inv17.Matcher.on(engine);
482 }
483
484 @Override
485 public Inv17.Matcher instantiate() {
486 return Inv17.Matcher.create();
487 }
488
489 @Override
490 public Inv17.Match newEmptyMatch() {
491 return Inv17.Match.newEmptyMatch();
492 }
493
494 @Override
495 public Inv17.Match newMatch(final Object... parameters) {
496 return Inv17.Match.newMatch((Taxation.Legal_Union_Record) parameters[0]);
497 }
498
499 /**
500 * Inner class allowing the singleton instance of {@link Inv17} 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 Inv17#instance()}.
503 *
504 * <p> This workaround is required e.g. to support recursion.
505 *
506 */
507 private static class LazyHolder {
508 private static final Inv17 INSTANCE = new Inv17();
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 Inv17.GeneratedPQuery INSTANCE = new GeneratedPQuery();
527
528 private final PParameter parameter_lur = new PParameter("lur", "Taxation.Legal_Union_Record", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Legal_Union_Record")), PParameterDirection.INOUT);
529
530 private final List<PParameter> parameters = Arrays.asList(parameter_lur);
531
532 private GeneratedPQuery() {
533 super(PVisibility.PUBLIC);
534 }
535
536 @Override
537 public String getFullyQualifiedName() {
538 return "queries.inv17";
539 }
540
541 @Override
542 public List<String> getParameterNames() {
543 return Arrays.asList("lur");
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_lur = body.getOrCreateVariableByName("lur");
558 PVariable var_sy = body.getOrCreateVariableByName("sy");
559 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
560 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
561 new ExportedParameter(body, var_lur, parameter_lur)
562 ));
563 // Legal_Union_Record.start_year(lur, sy)
564 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
565 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
566 new TypeConstraint(body, Tuples.flatTupleOf(var_lur, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "start_year")));
567 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
568 new Equality(body, var__virtual_0_, var_sy);
569 // check(sy < 1950)
570 new ExpressionEvaluation(body, new IExpressionEvaluator() {
571
572 @Override
573 public String getShortDescription() {
574 return "Expression evaluation from pattern inv17";
575 }
576
577 @Override
578 public Iterable<String> getInputParameterNames() {
579 return Arrays.asList("sy");}
580
581 @Override
582 public Object evaluateExpression(IValueProvider provider) throws Exception {
583 Integer sy = (Integer) provider.getValue("sy");
584 return evaluateExpression_1_1(sy);
585 }
586 }, null);
587 bodies.add(body);
588 }
589 {
590 PBody body = new PBody(this);
591 PVariable var_lur = body.getOrCreateVariableByName("lur");
592 PVariable var_sy = body.getOrCreateVariableByName("sy");
593 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
594 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
595 new ExportedParameter(body, var_lur, parameter_lur)
596 ));
597 // Legal_Union_Record.start_year(lur, sy)
598 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
599 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
600 new TypeConstraint(body, Tuples.flatTupleOf(var_lur, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "start_year")));
601 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
602 new Equality(body, var__virtual_0_, var_sy);
603 // check(sy > 2018)
604 new ExpressionEvaluation(body, new IExpressionEvaluator() {
605
606 @Override
607 public String getShortDescription() {
608 return "Expression evaluation from pattern inv17";
609 }
610
611 @Override
612 public Iterable<String> getInputParameterNames() {
613 return Arrays.asList("sy");}
614
615 @Override
616 public Object evaluateExpression(IValueProvider provider) throws Exception {
617 Integer sy = (Integer) provider.getValue("sy");
618 return evaluateExpression_2_1(sy);
619 }
620 }, null);
621 bodies.add(body);
622 }
623 {
624 PAnnotation annotation = new PAnnotation("Constraint");
625 annotation.addAttribute("message", "inv17");
626 annotation.addAttribute("severity", "error");
627 annotation.addAttribute("key", Arrays.asList(new Object[] {
628 new ParameterReference("lur")
629 }));
630 addAnnotation(annotation);
631 }
632 return bodies;
633 }
634 }
635
636 private static boolean evaluateExpression_1_1(final Integer sy) {
637 return ((sy).intValue() < 1950);
638 }
639
640 private static boolean evaluateExpression_2_1(final Integer sy) {
641 return ((sy).intValue() > 2018);
642 }
643}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv20.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv20.java
deleted file mode 100644
index 6fcc3b7d..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv20.java
+++ /dev/null
@@ -1,587 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Legal_Union_Record;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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 * //inv18-MultiplicityChecked
49 * //inv19-MultiplicityChecked
50 *
51 * //inv20-Useless constraint since both edges are containment (TODOCheck)
52 * //OclIsUndefined-Handled by multiplicity
53 * {@literal @}Constraint(message = "inv20", severity = "error", key = {lur})
54 * pattern inv20(lur : Legal_Union_Record) {
55 * Legal_Union_Record.individual_A(lur, iA);
56 * Legal_Union_Record.individual_B(lur, iB);
57 * iA == iB;
58 * }
59 * </pre></code>
60 *
61 * @see Matcher
62 * @see Match
63 *
64 */
65@SuppressWarnings("all")
66public final class Inv20 extends BaseGeneratedEMFQuerySpecification<Inv20.Matcher> {
67 /**
68 * Pattern-specific match representation of the queries.inv20 pattern,
69 * to be used in conjunction with {@link Matcher}.
70 *
71 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
72 * Each instance is a (possibly partial) substitution of pattern parameters,
73 * usable to represent a match of the pattern in the result of a query,
74 * or to specify the bound (fixed) input parameters when issuing a query.
75 *
76 * @see Matcher
77 *
78 */
79 public static abstract class Match extends BasePatternMatch {
80 private Legal_Union_Record fLur;
81
82 private static List<String> parameterNames = makeImmutableList("lur");
83
84 private Match(final Legal_Union_Record pLur) {
85 this.fLur = pLur;
86 }
87
88 @Override
89 public Object get(final String parameterName) {
90 switch(parameterName) {
91 case "lur": return this.fLur;
92 default: return null;
93 }
94 }
95
96 @Override
97 public Object get(final int index) {
98 switch(index) {
99 case 0: return this.fLur;
100 default: return null;
101 }
102 }
103
104 public Legal_Union_Record getLur() {
105 return this.fLur;
106 }
107
108 @Override
109 public boolean set(final String parameterName, final Object newValue) {
110 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
111 if ("lur".equals(parameterName) ) {
112 this.fLur = (Legal_Union_Record) newValue;
113 return true;
114 }
115 return false;
116 }
117
118 public void setLur(final Legal_Union_Record pLur) {
119 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
120 this.fLur = pLur;
121 }
122
123 @Override
124 public String patternName() {
125 return "queries.inv20";
126 }
127
128 @Override
129 public List<String> parameterNames() {
130 return Inv20.Match.parameterNames;
131 }
132
133 @Override
134 public Object[] toArray() {
135 return new Object[]{fLur};
136 }
137
138 @Override
139 public Inv20.Match toImmutable() {
140 return isMutable() ? newMatch(fLur) : this;
141 }
142
143 @Override
144 public String prettyPrint() {
145 StringBuilder result = new StringBuilder();
146 result.append("\"lur\"=" + prettyPrintValue(fLur));
147 return result.toString();
148 }
149
150 @Override
151 public int hashCode() {
152 return Objects.hash(fLur);
153 }
154
155 @Override
156 public boolean equals(final Object obj) {
157 if (this == obj)
158 return true;
159 if (obj == null) {
160 return false;
161 }
162 if ((obj instanceof Inv20.Match)) {
163 Inv20.Match other = (Inv20.Match) obj;
164 return Objects.equals(fLur, other.fLur);
165 } else {
166 // this should be infrequent
167 if (!(obj instanceof IPatternMatch)) {
168 return false;
169 }
170 IPatternMatch otherSig = (IPatternMatch) obj;
171 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
172 }
173 }
174
175 @Override
176 public Inv20 specification() {
177 return Inv20.instance();
178 }
179
180 /**
181 * Returns an empty, mutable match.
182 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
183 *
184 * @return the empty match.
185 *
186 */
187 public static Inv20.Match newEmptyMatch() {
188 return new Mutable(null);
189 }
190
191 /**
192 * Returns a mutable (partial) match.
193 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
194 *
195 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
196 * @return the new, mutable (partial) match object.
197 *
198 */
199 public static Inv20.Match newMutableMatch(final Legal_Union_Record pLur) {
200 return new Mutable(pLur);
201 }
202
203 /**
204 * Returns a new (partial) match.
205 * This can be used e.g. to call the matcher with a partial match.
206 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
207 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
208 * @return the (partial) match object.
209 *
210 */
211 public static Inv20.Match newMatch(final Legal_Union_Record pLur) {
212 return new Immutable(pLur);
213 }
214
215 private static final class Mutable extends Inv20.Match {
216 Mutable(final Legal_Union_Record pLur) {
217 super(pLur);
218 }
219
220 @Override
221 public boolean isMutable() {
222 return true;
223 }
224 }
225
226 private static final class Immutable extends Inv20.Match {
227 Immutable(final Legal_Union_Record pLur) {
228 super(pLur);
229 }
230
231 @Override
232 public boolean isMutable() {
233 return false;
234 }
235 }
236 }
237
238 /**
239 * Generated pattern matcher API of the queries.inv20 pattern,
240 * providing pattern-specific query methods.
241 *
242 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
243 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
244 *
245 * <p>Matches of the pattern will be represented as {@link Match}.
246 *
247 * <p>Original source:
248 * <code><pre>
249 * //inv18-MultiplicityChecked
250 * //inv19-MultiplicityChecked
251 *
252 * //inv20-Useless constraint since both edges are containment (TODOCheck)
253 * //OclIsUndefined-Handled by multiplicity
254 * {@literal @}Constraint(message = "inv20", severity = "error", key = {lur})
255 * pattern inv20(lur : Legal_Union_Record) {
256 * Legal_Union_Record.individual_A(lur, iA);
257 * Legal_Union_Record.individual_B(lur, iB);
258 * iA == iB;
259 * }
260 * </pre></code>
261 *
262 * @see Match
263 * @see Inv20
264 *
265 */
266 public static class Matcher extends BaseMatcher<Inv20.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 Inv20.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 Inv20.Matcher create() {
291 return new Matcher();
292 }
293
294 private static final int POSITION_LUR = 0;
295
296 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv20.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 pLur the fixed value of pattern parameter lur, or null if not bound.
313 * @return matches represented as a Match object.
314 *
315 */
316 public Collection<Inv20.Match> getAllMatches(final Legal_Union_Record pLur) {
317 return rawStreamAllMatches(new Object[]{pLur}).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 pLur the fixed value of pattern parameter lur, or null if not bound.
327 * @return a stream of matches represented as a Match object.
328 *
329 */
330 public Stream<Inv20.Match> streamAllMatches(final Legal_Union_Record pLur) {
331 return rawStreamAllMatches(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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<Inv20.Match> getOneArbitraryMatch(final Legal_Union_Record pLur) {
342 return rawGetOneArbitraryMatch(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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 Legal_Union_Record pLur) {
353 return rawHasMatch(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, or null if not bound.
359 * @return the number of pattern matches found.
360 *
361 */
362 public int countMatches(final Legal_Union_Record pLur) {
363 return rawCountMatches(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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 Legal_Union_Record pLur, final Consumer<? super Inv20.Match> processor) {
375 return rawForOneArbitraryMatch(new Object[]{pLur}, 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 pLur the fixed value of pattern parameter lur, or null if not bound.
383 * @return the (partial) match object.
384 *
385 */
386 public Inv20.Match newMatch(final Legal_Union_Record pLur) {
387 return Inv20.Match.newMatch(pLur);
388 }
389
390 /**
391 * Retrieve the set of values that occur in matches for lur.
392 * @return the Set of all values or empty set if there are no matches
393 *
394 */
395 protected Stream<Legal_Union_Record> rawStreamAllValuesOflur(final Object[] parameters) {
396 return rawStreamAllValues(POSITION_LUR, parameters).map(Legal_Union_Record.class::cast);
397 }
398
399 /**
400 * Retrieve the set of values that occur in matches for lur.
401 * @return the Set of all values or empty set if there are no matches
402 *
403 */
404 public Set<Legal_Union_Record> getAllValuesOflur() {
405 return rawStreamAllValuesOflur(emptyArray()).collect(Collectors.toSet());
406 }
407
408 /**
409 * Retrieve the set of values that occur in matches for lur.
410 * @return the Set of all values or empty set if there are no matches
411 *
412 */
413 public Stream<Legal_Union_Record> streamAllValuesOflur() {
414 return rawStreamAllValuesOflur(emptyArray());
415 }
416
417 @Override
418 protected Inv20.Match tupleToMatch(final Tuple t) {
419 try {
420 return Inv20.Match.newMatch((Legal_Union_Record) t.get(POSITION_LUR));
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 Inv20.Match arrayToMatch(final Object[] match) {
429 try {
430 return Inv20.Match.newMatch((Legal_Union_Record) match[POSITION_LUR]);
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 Inv20.Match arrayToMatchMutable(final Object[] match) {
439 try {
440 return Inv20.Match.newMutableMatch((Legal_Union_Record) match[POSITION_LUR]);
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<Inv20.Matcher> querySpecification() {
453 return Inv20.instance();
454 }
455 }
456
457 private Inv20() {
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 Inv20 instance() {
467 try{
468 return LazyHolder.INSTANCE;
469 } catch (ExceptionInInitializerError err) {
470 throw processInitializerError(err);
471 }
472 }
473
474 @Override
475 protected Inv20.Matcher instantiate(final ViatraQueryEngine engine) {
476 return Inv20.Matcher.on(engine);
477 }
478
479 @Override
480 public Inv20.Matcher instantiate() {
481 return Inv20.Matcher.create();
482 }
483
484 @Override
485 public Inv20.Match newEmptyMatch() {
486 return Inv20.Match.newEmptyMatch();
487 }
488
489 @Override
490 public Inv20.Match newMatch(final Object... parameters) {
491 return Inv20.Match.newMatch((Taxation.Legal_Union_Record) parameters[0]);
492 }
493
494 /**
495 * Inner class allowing the singleton instance of {@link Inv20} 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 Inv20#instance()}.
498 *
499 * <p> This workaround is required e.g. to support recursion.
500 *
501 */
502 private static class LazyHolder {
503 private static final Inv20 INSTANCE = new Inv20();
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 Inv20.GeneratedPQuery INSTANCE = new GeneratedPQuery();
522
523 private final PParameter parameter_lur = new PParameter("lur", "Taxation.Legal_Union_Record", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Legal_Union_Record")), PParameterDirection.INOUT);
524
525 private final List<PParameter> parameters = Arrays.asList(parameter_lur);
526
527 private GeneratedPQuery() {
528 super(PVisibility.PUBLIC);
529 }
530
531 @Override
532 public String getFullyQualifiedName() {
533 return "queries.inv20";
534 }
535
536 @Override
537 public List<String> getParameterNames() {
538 return Arrays.asList("lur");
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_lur = body.getOrCreateVariableByName("lur");
553 PVariable var_iA = body.getOrCreateVariableByName("iA");
554 PVariable var_iB = body.getOrCreateVariableByName("iB");
555 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
556 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
557 new ExportedParameter(body, var_lur, parameter_lur)
558 ));
559 // Legal_Union_Record.individual_A(lur, iA)
560 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
561 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
562 new TypeConstraint(body, Tuples.flatTupleOf(var_lur, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "individual_A")));
563 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
564 new Equality(body, var__virtual_0_, var_iA);
565 // Legal_Union_Record.individual_B(lur, iB)
566 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
567 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
568 new TypeConstraint(body, Tuples.flatTupleOf(var_lur, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "individual_B")));
569 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
570 new Equality(body, var__virtual_1_, var_iB);
571 // iA == iB
572 new Equality(body, var_iA, var_iB);
573 bodies.add(body);
574 }
575 {
576 PAnnotation annotation = new PAnnotation("Constraint");
577 annotation.addAttribute("message", "inv20");
578 annotation.addAttribute("severity", "error");
579 annotation.addAttribute("key", Arrays.asList(new Object[] {
580 new ParameterReference("lur")
581 }));
582 addAnnotation(annotation);
583 }
584 return bodies;
585 }
586 }
587}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv33.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv33.java
deleted file mode 100644
index 1672290c..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv33.java
+++ /dev/null
@@ -1,665 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Physical_Person;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
36import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
43import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
44import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
45import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
46import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
47
48/**
49 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
50 *
51 * <p>Original source:
52 * <code><pre>
53 * //inv21-MultiplicityChecked
54 * //inv22-MultiplicityChecked
55 * //inv23-MultiplicityChecked
56 * //inv24-MultiplicityChecked
57 * //inv25-MultiplicityChecked
58 * //inv26-MultiplicityChanged
59 * //inv27-dupOfInv24
60 * //inv28-dubOfInv23
61 * //inv29-MultiplicityChanged
62 * //inv30-AttributeRemoved
63 * //inv31-AttributeRemoved
64 * //inv32-AttributeRemoved
65 *
66 * //inv33-attribute-handled by multiplicity
67 * {@literal @}Constraint(message = "inv33", severity = "error", key = {p})
68 * pattern inv33(p : Physical_Person) {
69 * Physical_Person.birth_year(p, by);
70 * check(2018-by {@literal <} 0);
71 * } or {
72 * Physical_Person.birth_year(p, by);
73 * check(2018-by {@literal >} 100);
74 * }
75 * </pre></code>
76 *
77 * @see Matcher
78 * @see Match
79 *
80 */
81@SuppressWarnings("all")
82public final class Inv33 extends BaseGeneratedEMFQuerySpecification<Inv33.Matcher> {
83 /**
84 * Pattern-specific match representation of the queries.inv33 pattern,
85 * to be used in conjunction with {@link Matcher}.
86 *
87 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
88 * Each instance is a (possibly partial) substitution of pattern parameters,
89 * usable to represent a match of the pattern in the result of a query,
90 * or to specify the bound (fixed) input parameters when issuing a query.
91 *
92 * @see Matcher
93 *
94 */
95 public static abstract class Match extends BasePatternMatch {
96 private Physical_Person fP;
97
98 private static List<String> parameterNames = makeImmutableList("p");
99
100 private Match(final Physical_Person pP) {
101 this.fP = pP;
102 }
103
104 @Override
105 public Object get(final String parameterName) {
106 switch(parameterName) {
107 case "p": return this.fP;
108 default: return null;
109 }
110 }
111
112 @Override
113 public Object get(final int index) {
114 switch(index) {
115 case 0: return this.fP;
116 default: return null;
117 }
118 }
119
120 public Physical_Person getP() {
121 return this.fP;
122 }
123
124 @Override
125 public boolean set(final String parameterName, final Object newValue) {
126 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
127 if ("p".equals(parameterName) ) {
128 this.fP = (Physical_Person) newValue;
129 return true;
130 }
131 return false;
132 }
133
134 public void setP(final Physical_Person pP) {
135 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
136 this.fP = pP;
137 }
138
139 @Override
140 public String patternName() {
141 return "queries.inv33";
142 }
143
144 @Override
145 public List<String> parameterNames() {
146 return Inv33.Match.parameterNames;
147 }
148
149 @Override
150 public Object[] toArray() {
151 return new Object[]{fP};
152 }
153
154 @Override
155 public Inv33.Match toImmutable() {
156 return isMutable() ? newMatch(fP) : this;
157 }
158
159 @Override
160 public String prettyPrint() {
161 StringBuilder result = new StringBuilder();
162 result.append("\"p\"=" + prettyPrintValue(fP));
163 return result.toString();
164 }
165
166 @Override
167 public int hashCode() {
168 return Objects.hash(fP);
169 }
170
171 @Override
172 public boolean equals(final Object obj) {
173 if (this == obj)
174 return true;
175 if (obj == null) {
176 return false;
177 }
178 if ((obj instanceof Inv33.Match)) {
179 Inv33.Match other = (Inv33.Match) obj;
180 return Objects.equals(fP, other.fP);
181 } else {
182 // this should be infrequent
183 if (!(obj instanceof IPatternMatch)) {
184 return false;
185 }
186 IPatternMatch otherSig = (IPatternMatch) obj;
187 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
188 }
189 }
190
191 @Override
192 public Inv33 specification() {
193 return Inv33.instance();
194 }
195
196 /**
197 * Returns an empty, mutable match.
198 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
199 *
200 * @return the empty match.
201 *
202 */
203 public static Inv33.Match newEmptyMatch() {
204 return new Mutable(null);
205 }
206
207 /**
208 * Returns a mutable (partial) match.
209 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
210 *
211 * @param pP the fixed value of pattern parameter p, or null if not bound.
212 * @return the new, mutable (partial) match object.
213 *
214 */
215 public static Inv33.Match newMutableMatch(final Physical_Person pP) {
216 return new Mutable(pP);
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 pP the fixed value of pattern parameter p, or null if not bound.
224 * @return the (partial) match object.
225 *
226 */
227 public static Inv33.Match newMatch(final Physical_Person pP) {
228 return new Immutable(pP);
229 }
230
231 private static final class Mutable extends Inv33.Match {
232 Mutable(final Physical_Person pP) {
233 super(pP);
234 }
235
236 @Override
237 public boolean isMutable() {
238 return true;
239 }
240 }
241
242 private static final class Immutable extends Inv33.Match {
243 Immutable(final Physical_Person pP) {
244 super(pP);
245 }
246
247 @Override
248 public boolean isMutable() {
249 return false;
250 }
251 }
252 }
253
254 /**
255 * Generated pattern matcher API of the queries.inv33 pattern,
256 * providing pattern-specific query methods.
257 *
258 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
259 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
260 *
261 * <p>Matches of the pattern will be represented as {@link Match}.
262 *
263 * <p>Original source:
264 * <code><pre>
265 * //inv21-MultiplicityChecked
266 * //inv22-MultiplicityChecked
267 * //inv23-MultiplicityChecked
268 * //inv24-MultiplicityChecked
269 * //inv25-MultiplicityChecked
270 * //inv26-MultiplicityChanged
271 * //inv27-dupOfInv24
272 * //inv28-dubOfInv23
273 * //inv29-MultiplicityChanged
274 * //inv30-AttributeRemoved
275 * //inv31-AttributeRemoved
276 * //inv32-AttributeRemoved
277 *
278 * //inv33-attribute-handled by multiplicity
279 * {@literal @}Constraint(message = "inv33", severity = "error", key = {p})
280 * pattern inv33(p : Physical_Person) {
281 * Physical_Person.birth_year(p, by);
282 * check(2018-by {@literal <} 0);
283 * } or {
284 * Physical_Person.birth_year(p, by);
285 * check(2018-by {@literal >} 100);
286 * }
287 * </pre></code>
288 *
289 * @see Match
290 * @see Inv33
291 *
292 */
293 public static class Matcher extends BaseMatcher<Inv33.Match> {
294 /**
295 * Initializes the pattern matcher within an existing VIATRA Query engine.
296 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
297 *
298 * @param engine the existing VIATRA Query engine in which this matcher will be created.
299 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
300 *
301 */
302 public static Inv33.Matcher on(final ViatraQueryEngine engine) {
303 // check if matcher already exists
304 Matcher matcher = engine.getExistingMatcher(querySpecification());
305 if (matcher == null) {
306 matcher = (Matcher)engine.getMatcher(querySpecification());
307 }
308 return matcher;
309 }
310
311 /**
312 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
313 * @return an initialized matcher
314 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
315 *
316 */
317 public static Inv33.Matcher create() {
318 return new Matcher();
319 }
320
321 private static final int POSITION_P = 0;
322
323 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv33.Matcher.class);
324
325 /**
326 * Initializes the pattern matcher within an existing VIATRA Query engine.
327 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
328 *
329 * @param engine the existing VIATRA Query engine in which this matcher will be created.
330 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
331 *
332 */
333 private Matcher() {
334 super(querySpecification());
335 }
336
337 /**
338 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
339 * @param pP the fixed value of pattern parameter p, or null if not bound.
340 * @return matches represented as a Match object.
341 *
342 */
343 public Collection<Inv33.Match> getAllMatches(final Physical_Person pP) {
344 return rawStreamAllMatches(new Object[]{pP}).collect(Collectors.toSet());
345 }
346
347 /**
348 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
349 * </p>
350 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
351 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
352 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
353 * @param pP the fixed value of pattern parameter p, or null if not bound.
354 * @return a stream of matches represented as a Match object.
355 *
356 */
357 public Stream<Inv33.Match> streamAllMatches(final Physical_Person pP) {
358 return rawStreamAllMatches(new Object[]{pP});
359 }
360
361 /**
362 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
363 * Neither determinism nor randomness of selection is guaranteed.
364 * @param pP the fixed value of pattern parameter p, or null if not bound.
365 * @return a match represented as a Match object, or null if no match is found.
366 *
367 */
368 public Optional<Inv33.Match> getOneArbitraryMatch(final Physical_Person pP) {
369 return rawGetOneArbitraryMatch(new Object[]{pP});
370 }
371
372 /**
373 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
374 * under any possible substitution of the unspecified parameters (if any).
375 * @param pP the fixed value of pattern parameter p, or null if not bound.
376 * @return true if the input is a valid (partial) match of the pattern.
377 *
378 */
379 public boolean hasMatch(final Physical_Person pP) {
380 return rawHasMatch(new Object[]{pP});
381 }
382
383 /**
384 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
385 * @param pP the fixed value of pattern parameter p, or null if not bound.
386 * @return the number of pattern matches found.
387 *
388 */
389 public int countMatches(final Physical_Person pP) {
390 return rawCountMatches(new Object[]{pP});
391 }
392
393 /**
394 * Executes the given processor on 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 pP the fixed value of pattern parameter p, or null if not bound.
397 * @param processor the action that will process the selected match.
398 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
399 *
400 */
401 public boolean forOneArbitraryMatch(final Physical_Person pP, final Consumer<? super Inv33.Match> processor) {
402 return rawForOneArbitraryMatch(new Object[]{pP}, processor);
403 }
404
405 /**
406 * Returns a new (partial) match.
407 * This can be used e.g. to call the matcher with a partial match.
408 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
409 * @param pP the fixed value of pattern parameter p, or null if not bound.
410 * @return the (partial) match object.
411 *
412 */
413 public Inv33.Match newMatch(final Physical_Person pP) {
414 return Inv33.Match.newMatch(pP);
415 }
416
417 /**
418 * Retrieve the set of values that occur in matches for p.
419 * @return the Set of all values or empty set if there are no matches
420 *
421 */
422 protected Stream<Physical_Person> rawStreamAllValuesOfp(final Object[] parameters) {
423 return rawStreamAllValues(POSITION_P, parameters).map(Physical_Person.class::cast);
424 }
425
426 /**
427 * Retrieve the set of values that occur in matches for p.
428 * @return the Set of all values or empty set if there are no matches
429 *
430 */
431 public Set<Physical_Person> getAllValuesOfp() {
432 return rawStreamAllValuesOfp(emptyArray()).collect(Collectors.toSet());
433 }
434
435 /**
436 * Retrieve the set of values that occur in matches for p.
437 * @return the Set of all values or empty set if there are no matches
438 *
439 */
440 public Stream<Physical_Person> streamAllValuesOfp() {
441 return rawStreamAllValuesOfp(emptyArray());
442 }
443
444 @Override
445 protected Inv33.Match tupleToMatch(final Tuple t) {
446 try {
447 return Inv33.Match.newMatch((Physical_Person) t.get(POSITION_P));
448 } catch(ClassCastException e) {
449 LOGGER.error("Element(s) in tuple not properly typed!",e);
450 return null;
451 }
452 }
453
454 @Override
455 protected Inv33.Match arrayToMatch(final Object[] match) {
456 try {
457 return Inv33.Match.newMatch((Physical_Person) match[POSITION_P]);
458 } catch(ClassCastException e) {
459 LOGGER.error("Element(s) in array not properly typed!",e);
460 return null;
461 }
462 }
463
464 @Override
465 protected Inv33.Match arrayToMatchMutable(final Object[] match) {
466 try {
467 return Inv33.Match.newMutableMatch((Physical_Person) match[POSITION_P]);
468 } catch(ClassCastException e) {
469 LOGGER.error("Element(s) in array not properly typed!",e);
470 return null;
471 }
472 }
473
474 /**
475 * @return the singleton instance of the query specification of this pattern
476 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
477 *
478 */
479 public static IQuerySpecification<Inv33.Matcher> querySpecification() {
480 return Inv33.instance();
481 }
482 }
483
484 private Inv33() {
485 super(GeneratedPQuery.INSTANCE);
486 }
487
488 /**
489 * @return the singleton instance of the query specification
490 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
491 *
492 */
493 public static Inv33 instance() {
494 try{
495 return LazyHolder.INSTANCE;
496 } catch (ExceptionInInitializerError err) {
497 throw processInitializerError(err);
498 }
499 }
500
501 @Override
502 protected Inv33.Matcher instantiate(final ViatraQueryEngine engine) {
503 return Inv33.Matcher.on(engine);
504 }
505
506 @Override
507 public Inv33.Matcher instantiate() {
508 return Inv33.Matcher.create();
509 }
510
511 @Override
512 public Inv33.Match newEmptyMatch() {
513 return Inv33.Match.newEmptyMatch();
514 }
515
516 @Override
517 public Inv33.Match newMatch(final Object... parameters) {
518 return Inv33.Match.newMatch((Taxation.Physical_Person) parameters[0]);
519 }
520
521 /**
522 * Inner class allowing the singleton instance of {@link Inv33} to be created
523 * <b>not</b> at the class load time of the outer class,
524 * but rather at the first call to {@link Inv33#instance()}.
525 *
526 * <p> This workaround is required e.g. to support recursion.
527 *
528 */
529 private static class LazyHolder {
530 private static final Inv33 INSTANCE = new Inv33();
531
532 /**
533 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
534 * This initialization order is required to support indirect recursion.
535 *
536 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
537 *
538 */
539 private static final Object STATIC_INITIALIZER = ensureInitialized();
540
541 public static Object ensureInitialized() {
542 INSTANCE.ensureInitializedInternal();
543 return null;
544 }
545 }
546
547 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
548 private static final Inv33.GeneratedPQuery INSTANCE = new GeneratedPQuery();
549
550 private final PParameter parameter_p = new PParameter("p", "Taxation.Physical_Person", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Physical_Person")), PParameterDirection.INOUT);
551
552 private final List<PParameter> parameters = Arrays.asList(parameter_p);
553
554 private GeneratedPQuery() {
555 super(PVisibility.PUBLIC);
556 }
557
558 @Override
559 public String getFullyQualifiedName() {
560 return "queries.inv33";
561 }
562
563 @Override
564 public List<String> getParameterNames() {
565 return Arrays.asList("p");
566 }
567
568 @Override
569 public List<PParameter> getParameters() {
570 return parameters;
571 }
572
573 @Override
574 public Set<PBody> doGetContainedBodies() {
575 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
576 Set<PBody> bodies = new LinkedHashSet<>();
577 {
578 PBody body = new PBody(this);
579 PVariable var_p = body.getOrCreateVariableByName("p");
580 PVariable var_by = body.getOrCreateVariableByName("by");
581 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
582 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
583 new ExportedParameter(body, var_p, parameter_p)
584 ));
585 // Physical_Person.birth_year(p, by)
586 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
587 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
588 new TypeConstraint(body, Tuples.flatTupleOf(var_p, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "birth_year")));
589 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
590 new Equality(body, var__virtual_0_, var_by);
591 // check(2018-by < 0)
592 new ExpressionEvaluation(body, new IExpressionEvaluator() {
593
594 @Override
595 public String getShortDescription() {
596 return "Expression evaluation from pattern inv33";
597 }
598
599 @Override
600 public Iterable<String> getInputParameterNames() {
601 return Arrays.asList("by");}
602
603 @Override
604 public Object evaluateExpression(IValueProvider provider) throws Exception {
605 Integer by = (Integer) provider.getValue("by");
606 return evaluateExpression_1_1(by);
607 }
608 }, null);
609 bodies.add(body);
610 }
611 {
612 PBody body = new PBody(this);
613 PVariable var_p = body.getOrCreateVariableByName("p");
614 PVariable var_by = body.getOrCreateVariableByName("by");
615 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
616 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
617 new ExportedParameter(body, var_p, parameter_p)
618 ));
619 // Physical_Person.birth_year(p, by)
620 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
621 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
622 new TypeConstraint(body, Tuples.flatTupleOf(var_p, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "birth_year")));
623 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
624 new Equality(body, var__virtual_0_, var_by);
625 // check(2018-by > 100)
626 new ExpressionEvaluation(body, new IExpressionEvaluator() {
627
628 @Override
629 public String getShortDescription() {
630 return "Expression evaluation from pattern inv33";
631 }
632
633 @Override
634 public Iterable<String> getInputParameterNames() {
635 return Arrays.asList("by");}
636
637 @Override
638 public Object evaluateExpression(IValueProvider provider) throws Exception {
639 Integer by = (Integer) provider.getValue("by");
640 return evaluateExpression_2_1(by);
641 }
642 }, null);
643 bodies.add(body);
644 }
645 {
646 PAnnotation annotation = new PAnnotation("Constraint");
647 annotation.addAttribute("message", "inv33");
648 annotation.addAttribute("severity", "error");
649 annotation.addAttribute("key", Arrays.asList(new Object[] {
650 new ParameterReference("p")
651 }));
652 addAnnotation(annotation);
653 }
654 return bodies;
655 }
656 }
657
658 private static boolean evaluateExpression_1_1(final Integer by) {
659 return ((2018 - (by).intValue()) < 0);
660 }
661
662 private static boolean evaluateExpression_2_1(final Integer by) {
663 return ((2018 - (by).intValue()) > 100);
664 }
665}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv34.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv34.java
deleted file mode 100644
index b9b28986..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv34.java
+++ /dev/null
@@ -1,639 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Physical_Person;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
36import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
43import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
44import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
45import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
46import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
47
48/**
49 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
50 *
51 * <p>Original source:
52 * <code><pre>
53 * //inv34-attribute-handled by multiplicity
54 * {@literal @}Constraint(message = "inv34", severity = "error", key = {p})
55 * pattern inv34(p : Physical_Person) {
56 * Physical_Person.birth_month(p, birthMonth);
57 * check(birthMonth {@literal <} 1);
58 * } or {
59 * Physical_Person.birth_month(p, birthMonth);
60 * check(birthMonth {@literal >} 12);
61 * }
62 * </pre></code>
63 *
64 * @see Matcher
65 * @see Match
66 *
67 */
68@SuppressWarnings("all")
69public final class Inv34 extends BaseGeneratedEMFQuerySpecification<Inv34.Matcher> {
70 /**
71 * Pattern-specific match representation of the queries.inv34 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 Physical_Person fP;
84
85 private static List<String> parameterNames = makeImmutableList("p");
86
87 private Match(final Physical_Person pP) {
88 this.fP = pP;
89 }
90
91 @Override
92 public Object get(final String parameterName) {
93 switch(parameterName) {
94 case "p": return this.fP;
95 default: return null;
96 }
97 }
98
99 @Override
100 public Object get(final int index) {
101 switch(index) {
102 case 0: return this.fP;
103 default: return null;
104 }
105 }
106
107 public Physical_Person getP() {
108 return this.fP;
109 }
110
111 @Override
112 public boolean set(final String parameterName, final Object newValue) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 if ("p".equals(parameterName) ) {
115 this.fP = (Physical_Person) newValue;
116 return true;
117 }
118 return false;
119 }
120
121 public void setP(final Physical_Person pP) {
122 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
123 this.fP = pP;
124 }
125
126 @Override
127 public String patternName() {
128 return "queries.inv34";
129 }
130
131 @Override
132 public List<String> parameterNames() {
133 return Inv34.Match.parameterNames;
134 }
135
136 @Override
137 public Object[] toArray() {
138 return new Object[]{fP};
139 }
140
141 @Override
142 public Inv34.Match toImmutable() {
143 return isMutable() ? newMatch(fP) : this;
144 }
145
146 @Override
147 public String prettyPrint() {
148 StringBuilder result = new StringBuilder();
149 result.append("\"p\"=" + prettyPrintValue(fP));
150 return result.toString();
151 }
152
153 @Override
154 public int hashCode() {
155 return Objects.hash(fP);
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 Inv34.Match)) {
166 Inv34.Match other = (Inv34.Match) obj;
167 return Objects.equals(fP, other.fP);
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 Inv34 specification() {
180 return Inv34.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 Inv34.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 pP the fixed value of pattern parameter p, or null if not bound.
199 * @return the new, mutable (partial) match object.
200 *
201 */
202 public static Inv34.Match newMutableMatch(final Physical_Person pP) {
203 return new Mutable(pP);
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 pP the fixed value of pattern parameter p, or null if not bound.
211 * @return the (partial) match object.
212 *
213 */
214 public static Inv34.Match newMatch(final Physical_Person pP) {
215 return new Immutable(pP);
216 }
217
218 private static final class Mutable extends Inv34.Match {
219 Mutable(final Physical_Person pP) {
220 super(pP);
221 }
222
223 @Override
224 public boolean isMutable() {
225 return true;
226 }
227 }
228
229 private static final class Immutable extends Inv34.Match {
230 Immutable(final Physical_Person pP) {
231 super(pP);
232 }
233
234 @Override
235 public boolean isMutable() {
236 return false;
237 }
238 }
239 }
240
241 /**
242 * Generated pattern matcher API of the queries.inv34 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 * //inv34-attribute-handled by multiplicity
253 * {@literal @}Constraint(message = "inv34", severity = "error", key = {p})
254 * pattern inv34(p : Physical_Person) {
255 * Physical_Person.birth_month(p, birthMonth);
256 * check(birthMonth {@literal <} 1);
257 * } or {
258 * Physical_Person.birth_month(p, birthMonth);
259 * check(birthMonth {@literal >} 12);
260 * }
261 * </pre></code>
262 *
263 * @see Match
264 * @see Inv34
265 *
266 */
267 public static class Matcher extends BaseMatcher<Inv34.Match> {
268 /**
269 * Initializes the pattern matcher within an existing VIATRA Query engine.
270 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
271 *
272 * @param engine the existing VIATRA Query engine in which this matcher will be created.
273 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
274 *
275 */
276 public static Inv34.Matcher on(final ViatraQueryEngine engine) {
277 // check if matcher already exists
278 Matcher matcher = engine.getExistingMatcher(querySpecification());
279 if (matcher == null) {
280 matcher = (Matcher)engine.getMatcher(querySpecification());
281 }
282 return matcher;
283 }
284
285 /**
286 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
287 * @return an initialized matcher
288 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
289 *
290 */
291 public static Inv34.Matcher create() {
292 return new Matcher();
293 }
294
295 private static final int POSITION_P = 0;
296
297 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv34.Matcher.class);
298
299 /**
300 * Initializes the pattern matcher within an existing VIATRA Query engine.
301 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
302 *
303 * @param engine the existing VIATRA Query engine in which this matcher will be created.
304 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
305 *
306 */
307 private Matcher() {
308 super(querySpecification());
309 }
310
311 /**
312 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
313 * @param pP the fixed value of pattern parameter p, or null if not bound.
314 * @return matches represented as a Match object.
315 *
316 */
317 public Collection<Inv34.Match> getAllMatches(final Physical_Person pP) {
318 return rawStreamAllMatches(new Object[]{pP}).collect(Collectors.toSet());
319 }
320
321 /**
322 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
323 * </p>
324 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
325 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
326 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
327 * @param pP the fixed value of pattern parameter p, or null if not bound.
328 * @return a stream of matches represented as a Match object.
329 *
330 */
331 public Stream<Inv34.Match> streamAllMatches(final Physical_Person pP) {
332 return rawStreamAllMatches(new Object[]{pP});
333 }
334
335 /**
336 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
337 * Neither determinism nor randomness of selection is guaranteed.
338 * @param pP the fixed value of pattern parameter p, or null if not bound.
339 * @return a match represented as a Match object, or null if no match is found.
340 *
341 */
342 public Optional<Inv34.Match> getOneArbitraryMatch(final Physical_Person pP) {
343 return rawGetOneArbitraryMatch(new Object[]{pP});
344 }
345
346 /**
347 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
348 * under any possible substitution of the unspecified parameters (if any).
349 * @param pP the fixed value of pattern parameter p, or null if not bound.
350 * @return true if the input is a valid (partial) match of the pattern.
351 *
352 */
353 public boolean hasMatch(final Physical_Person pP) {
354 return rawHasMatch(new Object[]{pP});
355 }
356
357 /**
358 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
359 * @param pP the fixed value of pattern parameter p, or null if not bound.
360 * @return the number of pattern matches found.
361 *
362 */
363 public int countMatches(final Physical_Person pP) {
364 return rawCountMatches(new Object[]{pP});
365 }
366
367 /**
368 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
369 * Neither determinism nor randomness of selection is guaranteed.
370 * @param pP the fixed value of pattern parameter p, or null if not bound.
371 * @param processor the action that will process the selected match.
372 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
373 *
374 */
375 public boolean forOneArbitraryMatch(final Physical_Person pP, final Consumer<? super Inv34.Match> processor) {
376 return rawForOneArbitraryMatch(new Object[]{pP}, processor);
377 }
378
379 /**
380 * Returns a new (partial) match.
381 * This can be used e.g. to call the matcher with a partial match.
382 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
383 * @param pP the fixed value of pattern parameter p, or null if not bound.
384 * @return the (partial) match object.
385 *
386 */
387 public Inv34.Match newMatch(final Physical_Person pP) {
388 return Inv34.Match.newMatch(pP);
389 }
390
391 /**
392 * Retrieve the set of values that occur in matches for p.
393 * @return the Set of all values or empty set if there are no matches
394 *
395 */
396 protected Stream<Physical_Person> rawStreamAllValuesOfp(final Object[] parameters) {
397 return rawStreamAllValues(POSITION_P, parameters).map(Physical_Person.class::cast);
398 }
399
400 /**
401 * Retrieve the set of values that occur in matches for p.
402 * @return the Set of all values or empty set if there are no matches
403 *
404 */
405 public Set<Physical_Person> getAllValuesOfp() {
406 return rawStreamAllValuesOfp(emptyArray()).collect(Collectors.toSet());
407 }
408
409 /**
410 * Retrieve the set of values that occur in matches for p.
411 * @return the Set of all values or empty set if there are no matches
412 *
413 */
414 public Stream<Physical_Person> streamAllValuesOfp() {
415 return rawStreamAllValuesOfp(emptyArray());
416 }
417
418 @Override
419 protected Inv34.Match tupleToMatch(final Tuple t) {
420 try {
421 return Inv34.Match.newMatch((Physical_Person) t.get(POSITION_P));
422 } catch(ClassCastException e) {
423 LOGGER.error("Element(s) in tuple not properly typed!",e);
424 return null;
425 }
426 }
427
428 @Override
429 protected Inv34.Match arrayToMatch(final Object[] match) {
430 try {
431 return Inv34.Match.newMatch((Physical_Person) match[POSITION_P]);
432 } catch(ClassCastException e) {
433 LOGGER.error("Element(s) in array not properly typed!",e);
434 return null;
435 }
436 }
437
438 @Override
439 protected Inv34.Match arrayToMatchMutable(final Object[] match) {
440 try {
441 return Inv34.Match.newMutableMatch((Physical_Person) match[POSITION_P]);
442 } catch(ClassCastException e) {
443 LOGGER.error("Element(s) in array not properly typed!",e);
444 return null;
445 }
446 }
447
448 /**
449 * @return the singleton instance of the query specification of this pattern
450 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
451 *
452 */
453 public static IQuerySpecification<Inv34.Matcher> querySpecification() {
454 return Inv34.instance();
455 }
456 }
457
458 private Inv34() {
459 super(GeneratedPQuery.INSTANCE);
460 }
461
462 /**
463 * @return the singleton instance of the query specification
464 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
465 *
466 */
467 public static Inv34 instance() {
468 try{
469 return LazyHolder.INSTANCE;
470 } catch (ExceptionInInitializerError err) {
471 throw processInitializerError(err);
472 }
473 }
474
475 @Override
476 protected Inv34.Matcher instantiate(final ViatraQueryEngine engine) {
477 return Inv34.Matcher.on(engine);
478 }
479
480 @Override
481 public Inv34.Matcher instantiate() {
482 return Inv34.Matcher.create();
483 }
484
485 @Override
486 public Inv34.Match newEmptyMatch() {
487 return Inv34.Match.newEmptyMatch();
488 }
489
490 @Override
491 public Inv34.Match newMatch(final Object... parameters) {
492 return Inv34.Match.newMatch((Taxation.Physical_Person) parameters[0]);
493 }
494
495 /**
496 * Inner class allowing the singleton instance of {@link Inv34} to be created
497 * <b>not</b> at the class load time of the outer class,
498 * but rather at the first call to {@link Inv34#instance()}.
499 *
500 * <p> This workaround is required e.g. to support recursion.
501 *
502 */
503 private static class LazyHolder {
504 private static final Inv34 INSTANCE = new Inv34();
505
506 /**
507 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
508 * This initialization order is required to support indirect recursion.
509 *
510 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
511 *
512 */
513 private static final Object STATIC_INITIALIZER = ensureInitialized();
514
515 public static Object ensureInitialized() {
516 INSTANCE.ensureInitializedInternal();
517 return null;
518 }
519 }
520
521 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
522 private static final Inv34.GeneratedPQuery INSTANCE = new GeneratedPQuery();
523
524 private final PParameter parameter_p = new PParameter("p", "Taxation.Physical_Person", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Physical_Person")), PParameterDirection.INOUT);
525
526 private final List<PParameter> parameters = Arrays.asList(parameter_p);
527
528 private GeneratedPQuery() {
529 super(PVisibility.PUBLIC);
530 }
531
532 @Override
533 public String getFullyQualifiedName() {
534 return "queries.inv34";
535 }
536
537 @Override
538 public List<String> getParameterNames() {
539 return Arrays.asList("p");
540 }
541
542 @Override
543 public List<PParameter> getParameters() {
544 return parameters;
545 }
546
547 @Override
548 public Set<PBody> doGetContainedBodies() {
549 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
550 Set<PBody> bodies = new LinkedHashSet<>();
551 {
552 PBody body = new PBody(this);
553 PVariable var_p = body.getOrCreateVariableByName("p");
554 PVariable var_birthMonth = body.getOrCreateVariableByName("birthMonth");
555 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
556 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
557 new ExportedParameter(body, var_p, parameter_p)
558 ));
559 // Physical_Person.birth_month(p, birthMonth)
560 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
561 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
562 new TypeConstraint(body, Tuples.flatTupleOf(var_p, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "birth_month")));
563 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
564 new Equality(body, var__virtual_0_, var_birthMonth);
565 // check(birthMonth < 1)
566 new ExpressionEvaluation(body, new IExpressionEvaluator() {
567
568 @Override
569 public String getShortDescription() {
570 return "Expression evaluation from pattern inv34";
571 }
572
573 @Override
574 public Iterable<String> getInputParameterNames() {
575 return Arrays.asList("birthMonth");}
576
577 @Override
578 public Object evaluateExpression(IValueProvider provider) throws Exception {
579 Integer birthMonth = (Integer) provider.getValue("birthMonth");
580 return evaluateExpression_1_1(birthMonth);
581 }
582 }, null);
583 bodies.add(body);
584 }
585 {
586 PBody body = new PBody(this);
587 PVariable var_p = body.getOrCreateVariableByName("p");
588 PVariable var_birthMonth = body.getOrCreateVariableByName("birthMonth");
589 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
590 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
591 new ExportedParameter(body, var_p, parameter_p)
592 ));
593 // Physical_Person.birth_month(p, birthMonth)
594 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
595 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
596 new TypeConstraint(body, Tuples.flatTupleOf(var_p, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "birth_month")));
597 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
598 new Equality(body, var__virtual_0_, var_birthMonth);
599 // check(birthMonth > 12)
600 new ExpressionEvaluation(body, new IExpressionEvaluator() {
601
602 @Override
603 public String getShortDescription() {
604 return "Expression evaluation from pattern inv34";
605 }
606
607 @Override
608 public Iterable<String> getInputParameterNames() {
609 return Arrays.asList("birthMonth");}
610
611 @Override
612 public Object evaluateExpression(IValueProvider provider) throws Exception {
613 Integer birthMonth = (Integer) provider.getValue("birthMonth");
614 return evaluateExpression_2_1(birthMonth);
615 }
616 }, null);
617 bodies.add(body);
618 }
619 {
620 PAnnotation annotation = new PAnnotation("Constraint");
621 annotation.addAttribute("message", "inv34");
622 annotation.addAttribute("severity", "error");
623 annotation.addAttribute("key", Arrays.asList(new Object[] {
624 new ParameterReference("p")
625 }));
626 addAnnotation(annotation);
627 }
628 return bodies;
629 }
630 }
631
632 private static boolean evaluateExpression_1_1(final Integer birthMonth) {
633 return ((birthMonth).intValue() < 1);
634 }
635
636 private static boolean evaluateExpression_2_1(final Integer birthMonth) {
637 return ((birthMonth).intValue() > 12);
638 }
639}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv35.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv35.java
deleted file mode 100644
index c67325ac..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv35.java
+++ /dev/null
@@ -1,639 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Physical_Person;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
36import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
43import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
44import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
45import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
46import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
47
48/**
49 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
50 *
51 * <p>Original source:
52 * <code><pre>
53 * //inv35-attribute-handled by multiplicity
54 * {@literal @}Constraint(message = "inv35", severity = "error", key = {p})
55 * pattern inv35(p : Physical_Person) {
56 * Physical_Person.birth_day(p, birthDay);
57 * check(birthDay {@literal <} 1);
58 * } or {
59 * Physical_Person.birth_day(p, birthDay);
60 * check(birthDay {@literal >} 28);
61 * }
62 * </pre></code>
63 *
64 * @see Matcher
65 * @see Match
66 *
67 */
68@SuppressWarnings("all")
69public final class Inv35 extends BaseGeneratedEMFQuerySpecification<Inv35.Matcher> {
70 /**
71 * Pattern-specific match representation of the queries.inv35 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 Physical_Person fP;
84
85 private static List<String> parameterNames = makeImmutableList("p");
86
87 private Match(final Physical_Person pP) {
88 this.fP = pP;
89 }
90
91 @Override
92 public Object get(final String parameterName) {
93 switch(parameterName) {
94 case "p": return this.fP;
95 default: return null;
96 }
97 }
98
99 @Override
100 public Object get(final int index) {
101 switch(index) {
102 case 0: return this.fP;
103 default: return null;
104 }
105 }
106
107 public Physical_Person getP() {
108 return this.fP;
109 }
110
111 @Override
112 public boolean set(final String parameterName, final Object newValue) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 if ("p".equals(parameterName) ) {
115 this.fP = (Physical_Person) newValue;
116 return true;
117 }
118 return false;
119 }
120
121 public void setP(final Physical_Person pP) {
122 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
123 this.fP = pP;
124 }
125
126 @Override
127 public String patternName() {
128 return "queries.inv35";
129 }
130
131 @Override
132 public List<String> parameterNames() {
133 return Inv35.Match.parameterNames;
134 }
135
136 @Override
137 public Object[] toArray() {
138 return new Object[]{fP};
139 }
140
141 @Override
142 public Inv35.Match toImmutable() {
143 return isMutable() ? newMatch(fP) : this;
144 }
145
146 @Override
147 public String prettyPrint() {
148 StringBuilder result = new StringBuilder();
149 result.append("\"p\"=" + prettyPrintValue(fP));
150 return result.toString();
151 }
152
153 @Override
154 public int hashCode() {
155 return Objects.hash(fP);
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 Inv35.Match)) {
166 Inv35.Match other = (Inv35.Match) obj;
167 return Objects.equals(fP, other.fP);
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 Inv35 specification() {
180 return Inv35.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 Inv35.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 pP the fixed value of pattern parameter p, or null if not bound.
199 * @return the new, mutable (partial) match object.
200 *
201 */
202 public static Inv35.Match newMutableMatch(final Physical_Person pP) {
203 return new Mutable(pP);
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 pP the fixed value of pattern parameter p, or null if not bound.
211 * @return the (partial) match object.
212 *
213 */
214 public static Inv35.Match newMatch(final Physical_Person pP) {
215 return new Immutable(pP);
216 }
217
218 private static final class Mutable extends Inv35.Match {
219 Mutable(final Physical_Person pP) {
220 super(pP);
221 }
222
223 @Override
224 public boolean isMutable() {
225 return true;
226 }
227 }
228
229 private static final class Immutable extends Inv35.Match {
230 Immutable(final Physical_Person pP) {
231 super(pP);
232 }
233
234 @Override
235 public boolean isMutable() {
236 return false;
237 }
238 }
239 }
240
241 /**
242 * Generated pattern matcher API of the queries.inv35 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 * //inv35-attribute-handled by multiplicity
253 * {@literal @}Constraint(message = "inv35", severity = "error", key = {p})
254 * pattern inv35(p : Physical_Person) {
255 * Physical_Person.birth_day(p, birthDay);
256 * check(birthDay {@literal <} 1);
257 * } or {
258 * Physical_Person.birth_day(p, birthDay);
259 * check(birthDay {@literal >} 28);
260 * }
261 * </pre></code>
262 *
263 * @see Match
264 * @see Inv35
265 *
266 */
267 public static class Matcher extends BaseMatcher<Inv35.Match> {
268 /**
269 * Initializes the pattern matcher within an existing VIATRA Query engine.
270 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
271 *
272 * @param engine the existing VIATRA Query engine in which this matcher will be created.
273 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
274 *
275 */
276 public static Inv35.Matcher on(final ViatraQueryEngine engine) {
277 // check if matcher already exists
278 Matcher matcher = engine.getExistingMatcher(querySpecification());
279 if (matcher == null) {
280 matcher = (Matcher)engine.getMatcher(querySpecification());
281 }
282 return matcher;
283 }
284
285 /**
286 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
287 * @return an initialized matcher
288 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
289 *
290 */
291 public static Inv35.Matcher create() {
292 return new Matcher();
293 }
294
295 private static final int POSITION_P = 0;
296
297 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv35.Matcher.class);
298
299 /**
300 * Initializes the pattern matcher within an existing VIATRA Query engine.
301 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
302 *
303 * @param engine the existing VIATRA Query engine in which this matcher will be created.
304 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
305 *
306 */
307 private Matcher() {
308 super(querySpecification());
309 }
310
311 /**
312 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
313 * @param pP the fixed value of pattern parameter p, or null if not bound.
314 * @return matches represented as a Match object.
315 *
316 */
317 public Collection<Inv35.Match> getAllMatches(final Physical_Person pP) {
318 return rawStreamAllMatches(new Object[]{pP}).collect(Collectors.toSet());
319 }
320
321 /**
322 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
323 * </p>
324 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
325 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
326 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
327 * @param pP the fixed value of pattern parameter p, or null if not bound.
328 * @return a stream of matches represented as a Match object.
329 *
330 */
331 public Stream<Inv35.Match> streamAllMatches(final Physical_Person pP) {
332 return rawStreamAllMatches(new Object[]{pP});
333 }
334
335 /**
336 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
337 * Neither determinism nor randomness of selection is guaranteed.
338 * @param pP the fixed value of pattern parameter p, or null if not bound.
339 * @return a match represented as a Match object, or null if no match is found.
340 *
341 */
342 public Optional<Inv35.Match> getOneArbitraryMatch(final Physical_Person pP) {
343 return rawGetOneArbitraryMatch(new Object[]{pP});
344 }
345
346 /**
347 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
348 * under any possible substitution of the unspecified parameters (if any).
349 * @param pP the fixed value of pattern parameter p, or null if not bound.
350 * @return true if the input is a valid (partial) match of the pattern.
351 *
352 */
353 public boolean hasMatch(final Physical_Person pP) {
354 return rawHasMatch(new Object[]{pP});
355 }
356
357 /**
358 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
359 * @param pP the fixed value of pattern parameter p, or null if not bound.
360 * @return the number of pattern matches found.
361 *
362 */
363 public int countMatches(final Physical_Person pP) {
364 return rawCountMatches(new Object[]{pP});
365 }
366
367 /**
368 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
369 * Neither determinism nor randomness of selection is guaranteed.
370 * @param pP the fixed value of pattern parameter p, or null if not bound.
371 * @param processor the action that will process the selected match.
372 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
373 *
374 */
375 public boolean forOneArbitraryMatch(final Physical_Person pP, final Consumer<? super Inv35.Match> processor) {
376 return rawForOneArbitraryMatch(new Object[]{pP}, processor);
377 }
378
379 /**
380 * Returns a new (partial) match.
381 * This can be used e.g. to call the matcher with a partial match.
382 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
383 * @param pP the fixed value of pattern parameter p, or null if not bound.
384 * @return the (partial) match object.
385 *
386 */
387 public Inv35.Match newMatch(final Physical_Person pP) {
388 return Inv35.Match.newMatch(pP);
389 }
390
391 /**
392 * Retrieve the set of values that occur in matches for p.
393 * @return the Set of all values or empty set if there are no matches
394 *
395 */
396 protected Stream<Physical_Person> rawStreamAllValuesOfp(final Object[] parameters) {
397 return rawStreamAllValues(POSITION_P, parameters).map(Physical_Person.class::cast);
398 }
399
400 /**
401 * Retrieve the set of values that occur in matches for p.
402 * @return the Set of all values or empty set if there are no matches
403 *
404 */
405 public Set<Physical_Person> getAllValuesOfp() {
406 return rawStreamAllValuesOfp(emptyArray()).collect(Collectors.toSet());
407 }
408
409 /**
410 * Retrieve the set of values that occur in matches for p.
411 * @return the Set of all values or empty set if there are no matches
412 *
413 */
414 public Stream<Physical_Person> streamAllValuesOfp() {
415 return rawStreamAllValuesOfp(emptyArray());
416 }
417
418 @Override
419 protected Inv35.Match tupleToMatch(final Tuple t) {
420 try {
421 return Inv35.Match.newMatch((Physical_Person) t.get(POSITION_P));
422 } catch(ClassCastException e) {
423 LOGGER.error("Element(s) in tuple not properly typed!",e);
424 return null;
425 }
426 }
427
428 @Override
429 protected Inv35.Match arrayToMatch(final Object[] match) {
430 try {
431 return Inv35.Match.newMatch((Physical_Person) match[POSITION_P]);
432 } catch(ClassCastException e) {
433 LOGGER.error("Element(s) in array not properly typed!",e);
434 return null;
435 }
436 }
437
438 @Override
439 protected Inv35.Match arrayToMatchMutable(final Object[] match) {
440 try {
441 return Inv35.Match.newMutableMatch((Physical_Person) match[POSITION_P]);
442 } catch(ClassCastException e) {
443 LOGGER.error("Element(s) in array not properly typed!",e);
444 return null;
445 }
446 }
447
448 /**
449 * @return the singleton instance of the query specification of this pattern
450 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
451 *
452 */
453 public static IQuerySpecification<Inv35.Matcher> querySpecification() {
454 return Inv35.instance();
455 }
456 }
457
458 private Inv35() {
459 super(GeneratedPQuery.INSTANCE);
460 }
461
462 /**
463 * @return the singleton instance of the query specification
464 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
465 *
466 */
467 public static Inv35 instance() {
468 try{
469 return LazyHolder.INSTANCE;
470 } catch (ExceptionInInitializerError err) {
471 throw processInitializerError(err);
472 }
473 }
474
475 @Override
476 protected Inv35.Matcher instantiate(final ViatraQueryEngine engine) {
477 return Inv35.Matcher.on(engine);
478 }
479
480 @Override
481 public Inv35.Matcher instantiate() {
482 return Inv35.Matcher.create();
483 }
484
485 @Override
486 public Inv35.Match newEmptyMatch() {
487 return Inv35.Match.newEmptyMatch();
488 }
489
490 @Override
491 public Inv35.Match newMatch(final Object... parameters) {
492 return Inv35.Match.newMatch((Taxation.Physical_Person) parameters[0]);
493 }
494
495 /**
496 * Inner class allowing the singleton instance of {@link Inv35} to be created
497 * <b>not</b> at the class load time of the outer class,
498 * but rather at the first call to {@link Inv35#instance()}.
499 *
500 * <p> This workaround is required e.g. to support recursion.
501 *
502 */
503 private static class LazyHolder {
504 private static final Inv35 INSTANCE = new Inv35();
505
506 /**
507 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
508 * This initialization order is required to support indirect recursion.
509 *
510 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
511 *
512 */
513 private static final Object STATIC_INITIALIZER = ensureInitialized();
514
515 public static Object ensureInitialized() {
516 INSTANCE.ensureInitializedInternal();
517 return null;
518 }
519 }
520
521 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
522 private static final Inv35.GeneratedPQuery INSTANCE = new GeneratedPQuery();
523
524 private final PParameter parameter_p = new PParameter("p", "Taxation.Physical_Person", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Physical_Person")), PParameterDirection.INOUT);
525
526 private final List<PParameter> parameters = Arrays.asList(parameter_p);
527
528 private GeneratedPQuery() {
529 super(PVisibility.PUBLIC);
530 }
531
532 @Override
533 public String getFullyQualifiedName() {
534 return "queries.inv35";
535 }
536
537 @Override
538 public List<String> getParameterNames() {
539 return Arrays.asList("p");
540 }
541
542 @Override
543 public List<PParameter> getParameters() {
544 return parameters;
545 }
546
547 @Override
548 public Set<PBody> doGetContainedBodies() {
549 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
550 Set<PBody> bodies = new LinkedHashSet<>();
551 {
552 PBody body = new PBody(this);
553 PVariable var_p = body.getOrCreateVariableByName("p");
554 PVariable var_birthDay = body.getOrCreateVariableByName("birthDay");
555 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
556 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
557 new ExportedParameter(body, var_p, parameter_p)
558 ));
559 // Physical_Person.birth_day(p, birthDay)
560 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
561 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
562 new TypeConstraint(body, Tuples.flatTupleOf(var_p, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "birth_day")));
563 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
564 new Equality(body, var__virtual_0_, var_birthDay);
565 // check(birthDay < 1)
566 new ExpressionEvaluation(body, new IExpressionEvaluator() {
567
568 @Override
569 public String getShortDescription() {
570 return "Expression evaluation from pattern inv35";
571 }
572
573 @Override
574 public Iterable<String> getInputParameterNames() {
575 return Arrays.asList("birthDay");}
576
577 @Override
578 public Object evaluateExpression(IValueProvider provider) throws Exception {
579 Integer birthDay = (Integer) provider.getValue("birthDay");
580 return evaluateExpression_1_1(birthDay);
581 }
582 }, null);
583 bodies.add(body);
584 }
585 {
586 PBody body = new PBody(this);
587 PVariable var_p = body.getOrCreateVariableByName("p");
588 PVariable var_birthDay = body.getOrCreateVariableByName("birthDay");
589 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
590 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
591 new ExportedParameter(body, var_p, parameter_p)
592 ));
593 // Physical_Person.birth_day(p, birthDay)
594 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
595 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
596 new TypeConstraint(body, Tuples.flatTupleOf(var_p, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "birth_day")));
597 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
598 new Equality(body, var__virtual_0_, var_birthDay);
599 // check(birthDay > 28)
600 new ExpressionEvaluation(body, new IExpressionEvaluator() {
601
602 @Override
603 public String getShortDescription() {
604 return "Expression evaluation from pattern inv35";
605 }
606
607 @Override
608 public Iterable<String> getInputParameterNames() {
609 return Arrays.asList("birthDay");}
610
611 @Override
612 public Object evaluateExpression(IValueProvider provider) throws Exception {
613 Integer birthDay = (Integer) provider.getValue("birthDay");
614 return evaluateExpression_2_1(birthDay);
615 }
616 }, null);
617 bodies.add(body);
618 }
619 {
620 PAnnotation annotation = new PAnnotation("Constraint");
621 annotation.addAttribute("message", "inv35");
622 annotation.addAttribute("severity", "error");
623 annotation.addAttribute("key", Arrays.asList(new Object[] {
624 new ParameterReference("p")
625 }));
626 addAnnotation(annotation);
627 }
628 return bodies;
629 }
630 }
631
632 private static boolean evaluateExpression_1_1(final Integer birthDay) {
633 return ((birthDay).intValue() < 1);
634 }
635
636 private static boolean evaluateExpression_2_1(final Integer birthDay) {
637 return ((birthDay).intValue() > 28);
638 }
639}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv47.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv47.java
deleted file mode 100644
index 10ba19d6..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv47.java
+++ /dev/null
@@ -1,636 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Legal_Union_Record;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
36import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
41import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
43import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
44import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
45import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
46import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
47import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
48import queries.X_inv47;
49
50/**
51 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
52 *
53 * <p>Original source:
54 * <code><pre>
55 * //inv36-AttributeRemoved
56 * //inv37-AttributeRemoved
57 * //inv38-AttributeRemoved
58 * //inv39-AttributeRemoved
59 * //inv40-AttributeRemoved
60 * //inv41-AttributeRemoved
61 * //inv42-AttributeRemoved
62 * //inv43-AttributeRemoved
63 * //inv44-AttributeRemoved
64 * //inv45-AttributeRemoved
65 * //inv46-AttributeRemoved
66 *
67 * //inv47-attributes-handled by multiplicity
68 * {@literal @}Constraint(message = "inv47", severity = "error", key = {lur})
69 * pattern inv47(lur : Legal_Union_Record) {
70 * Legal_Union_Record.end_year(lur, endY);
71 * Legal_Union_Record.start_year(lur, startY);
72 * neg find x_inv47(lur);
73 * check(startY {@literal >}= endY);
74 * }
75 * </pre></code>
76 *
77 * @see Matcher
78 * @see Match
79 *
80 */
81@SuppressWarnings("all")
82public final class Inv47 extends BaseGeneratedEMFQuerySpecification<Inv47.Matcher> {
83 /**
84 * Pattern-specific match representation of the queries.inv47 pattern,
85 * to be used in conjunction with {@link Matcher}.
86 *
87 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
88 * Each instance is a (possibly partial) substitution of pattern parameters,
89 * usable to represent a match of the pattern in the result of a query,
90 * or to specify the bound (fixed) input parameters when issuing a query.
91 *
92 * @see Matcher
93 *
94 */
95 public static abstract class Match extends BasePatternMatch {
96 private Legal_Union_Record fLur;
97
98 private static List<String> parameterNames = makeImmutableList("lur");
99
100 private Match(final Legal_Union_Record pLur) {
101 this.fLur = pLur;
102 }
103
104 @Override
105 public Object get(final String parameterName) {
106 switch(parameterName) {
107 case "lur": return this.fLur;
108 default: return null;
109 }
110 }
111
112 @Override
113 public Object get(final int index) {
114 switch(index) {
115 case 0: return this.fLur;
116 default: return null;
117 }
118 }
119
120 public Legal_Union_Record getLur() {
121 return this.fLur;
122 }
123
124 @Override
125 public boolean set(final String parameterName, final Object newValue) {
126 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
127 if ("lur".equals(parameterName) ) {
128 this.fLur = (Legal_Union_Record) newValue;
129 return true;
130 }
131 return false;
132 }
133
134 public void setLur(final Legal_Union_Record pLur) {
135 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
136 this.fLur = pLur;
137 }
138
139 @Override
140 public String patternName() {
141 return "queries.inv47";
142 }
143
144 @Override
145 public List<String> parameterNames() {
146 return Inv47.Match.parameterNames;
147 }
148
149 @Override
150 public Object[] toArray() {
151 return new Object[]{fLur};
152 }
153
154 @Override
155 public Inv47.Match toImmutable() {
156 return isMutable() ? newMatch(fLur) : this;
157 }
158
159 @Override
160 public String prettyPrint() {
161 StringBuilder result = new StringBuilder();
162 result.append("\"lur\"=" + prettyPrintValue(fLur));
163 return result.toString();
164 }
165
166 @Override
167 public int hashCode() {
168 return Objects.hash(fLur);
169 }
170
171 @Override
172 public boolean equals(final Object obj) {
173 if (this == obj)
174 return true;
175 if (obj == null) {
176 return false;
177 }
178 if ((obj instanceof Inv47.Match)) {
179 Inv47.Match other = (Inv47.Match) obj;
180 return Objects.equals(fLur, other.fLur);
181 } else {
182 // this should be infrequent
183 if (!(obj instanceof IPatternMatch)) {
184 return false;
185 }
186 IPatternMatch otherSig = (IPatternMatch) obj;
187 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
188 }
189 }
190
191 @Override
192 public Inv47 specification() {
193 return Inv47.instance();
194 }
195
196 /**
197 * Returns an empty, mutable match.
198 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
199 *
200 * @return the empty match.
201 *
202 */
203 public static Inv47.Match newEmptyMatch() {
204 return new Mutable(null);
205 }
206
207 /**
208 * Returns a mutable (partial) match.
209 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
210 *
211 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
212 * @return the new, mutable (partial) match object.
213 *
214 */
215 public static Inv47.Match newMutableMatch(final Legal_Union_Record pLur) {
216 return new Mutable(pLur);
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 pLur the fixed value of pattern parameter lur, or null if not bound.
224 * @return the (partial) match object.
225 *
226 */
227 public static Inv47.Match newMatch(final Legal_Union_Record pLur) {
228 return new Immutable(pLur);
229 }
230
231 private static final class Mutable extends Inv47.Match {
232 Mutable(final Legal_Union_Record pLur) {
233 super(pLur);
234 }
235
236 @Override
237 public boolean isMutable() {
238 return true;
239 }
240 }
241
242 private static final class Immutable extends Inv47.Match {
243 Immutable(final Legal_Union_Record pLur) {
244 super(pLur);
245 }
246
247 @Override
248 public boolean isMutable() {
249 return false;
250 }
251 }
252 }
253
254 /**
255 * Generated pattern matcher API of the queries.inv47 pattern,
256 * providing pattern-specific query methods.
257 *
258 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
259 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
260 *
261 * <p>Matches of the pattern will be represented as {@link Match}.
262 *
263 * <p>Original source:
264 * <code><pre>
265 * //inv36-AttributeRemoved
266 * //inv37-AttributeRemoved
267 * //inv38-AttributeRemoved
268 * //inv39-AttributeRemoved
269 * //inv40-AttributeRemoved
270 * //inv41-AttributeRemoved
271 * //inv42-AttributeRemoved
272 * //inv43-AttributeRemoved
273 * //inv44-AttributeRemoved
274 * //inv45-AttributeRemoved
275 * //inv46-AttributeRemoved
276 *
277 * //inv47-attributes-handled by multiplicity
278 * {@literal @}Constraint(message = "inv47", severity = "error", key = {lur})
279 * pattern inv47(lur : Legal_Union_Record) {
280 * Legal_Union_Record.end_year(lur, endY);
281 * Legal_Union_Record.start_year(lur, startY);
282 * neg find x_inv47(lur);
283 * check(startY {@literal >}= endY);
284 * }
285 * </pre></code>
286 *
287 * @see Match
288 * @see Inv47
289 *
290 */
291 public static class Matcher extends BaseMatcher<Inv47.Match> {
292 /**
293 * Initializes the pattern matcher within an existing VIATRA Query engine.
294 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
295 *
296 * @param engine the existing VIATRA Query engine in which this matcher will be created.
297 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
298 *
299 */
300 public static Inv47.Matcher on(final ViatraQueryEngine engine) {
301 // check if matcher already exists
302 Matcher matcher = engine.getExistingMatcher(querySpecification());
303 if (matcher == null) {
304 matcher = (Matcher)engine.getMatcher(querySpecification());
305 }
306 return matcher;
307 }
308
309 /**
310 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
311 * @return an initialized matcher
312 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
313 *
314 */
315 public static Inv47.Matcher create() {
316 return new Matcher();
317 }
318
319 private static final int POSITION_LUR = 0;
320
321 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv47.Matcher.class);
322
323 /**
324 * Initializes the pattern matcher within an existing VIATRA Query engine.
325 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
326 *
327 * @param engine the existing VIATRA Query engine in which this matcher will be created.
328 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
329 *
330 */
331 private Matcher() {
332 super(querySpecification());
333 }
334
335 /**
336 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
337 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
338 * @return matches represented as a Match object.
339 *
340 */
341 public Collection<Inv47.Match> getAllMatches(final Legal_Union_Record pLur) {
342 return rawStreamAllMatches(new Object[]{pLur}).collect(Collectors.toSet());
343 }
344
345 /**
346 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
347 * </p>
348 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
349 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
350 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
351 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
352 * @return a stream of matches represented as a Match object.
353 *
354 */
355 public Stream<Inv47.Match> streamAllMatches(final Legal_Union_Record pLur) {
356 return rawStreamAllMatches(new Object[]{pLur});
357 }
358
359 /**
360 * Returns 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 pLur the fixed value of pattern parameter lur, or null if not bound.
363 * @return a match represented as a Match object, or null if no match is found.
364 *
365 */
366 public Optional<Inv47.Match> getOneArbitraryMatch(final Legal_Union_Record pLur) {
367 return rawGetOneArbitraryMatch(new Object[]{pLur});
368 }
369
370 /**
371 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
372 * under any possible substitution of the unspecified parameters (if any).
373 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
374 * @return true if the input is a valid (partial) match of the pattern.
375 *
376 */
377 public boolean hasMatch(final Legal_Union_Record pLur) {
378 return rawHasMatch(new Object[]{pLur});
379 }
380
381 /**
382 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
383 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
384 * @return the number of pattern matches found.
385 *
386 */
387 public int countMatches(final Legal_Union_Record pLur) {
388 return rawCountMatches(new Object[]{pLur});
389 }
390
391 /**
392 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
393 * Neither determinism nor randomness of selection is guaranteed.
394 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
395 * @param processor the action that will process the selected match.
396 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
397 *
398 */
399 public boolean forOneArbitraryMatch(final Legal_Union_Record pLur, final Consumer<? super Inv47.Match> processor) {
400 return rawForOneArbitraryMatch(new Object[]{pLur}, processor);
401 }
402
403 /**
404 * Returns a new (partial) match.
405 * This can be used e.g. to call the matcher with a partial match.
406 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
407 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
408 * @return the (partial) match object.
409 *
410 */
411 public Inv47.Match newMatch(final Legal_Union_Record pLur) {
412 return Inv47.Match.newMatch(pLur);
413 }
414
415 /**
416 * Retrieve the set of values that occur in matches for lur.
417 * @return the Set of all values or empty set if there are no matches
418 *
419 */
420 protected Stream<Legal_Union_Record> rawStreamAllValuesOflur(final Object[] parameters) {
421 return rawStreamAllValues(POSITION_LUR, parameters).map(Legal_Union_Record.class::cast);
422 }
423
424 /**
425 * Retrieve the set of values that occur in matches for lur.
426 * @return the Set of all values or empty set if there are no matches
427 *
428 */
429 public Set<Legal_Union_Record> getAllValuesOflur() {
430 return rawStreamAllValuesOflur(emptyArray()).collect(Collectors.toSet());
431 }
432
433 /**
434 * Retrieve the set of values that occur in matches for lur.
435 * @return the Set of all values or empty set if there are no matches
436 *
437 */
438 public Stream<Legal_Union_Record> streamAllValuesOflur() {
439 return rawStreamAllValuesOflur(emptyArray());
440 }
441
442 @Override
443 protected Inv47.Match tupleToMatch(final Tuple t) {
444 try {
445 return Inv47.Match.newMatch((Legal_Union_Record) t.get(POSITION_LUR));
446 } catch(ClassCastException e) {
447 LOGGER.error("Element(s) in tuple not properly typed!",e);
448 return null;
449 }
450 }
451
452 @Override
453 protected Inv47.Match arrayToMatch(final Object[] match) {
454 try {
455 return Inv47.Match.newMatch((Legal_Union_Record) match[POSITION_LUR]);
456 } catch(ClassCastException e) {
457 LOGGER.error("Element(s) in array not properly typed!",e);
458 return null;
459 }
460 }
461
462 @Override
463 protected Inv47.Match arrayToMatchMutable(final Object[] match) {
464 try {
465 return Inv47.Match.newMutableMatch((Legal_Union_Record) match[POSITION_LUR]);
466 } catch(ClassCastException e) {
467 LOGGER.error("Element(s) in array not properly typed!",e);
468 return null;
469 }
470 }
471
472 /**
473 * @return the singleton instance of the query specification of this pattern
474 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
475 *
476 */
477 public static IQuerySpecification<Inv47.Matcher> querySpecification() {
478 return Inv47.instance();
479 }
480 }
481
482 private Inv47() {
483 super(GeneratedPQuery.INSTANCE);
484 }
485
486 /**
487 * @return the singleton instance of the query specification
488 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
489 *
490 */
491 public static Inv47 instance() {
492 try{
493 return LazyHolder.INSTANCE;
494 } catch (ExceptionInInitializerError err) {
495 throw processInitializerError(err);
496 }
497 }
498
499 @Override
500 protected Inv47.Matcher instantiate(final ViatraQueryEngine engine) {
501 return Inv47.Matcher.on(engine);
502 }
503
504 @Override
505 public Inv47.Matcher instantiate() {
506 return Inv47.Matcher.create();
507 }
508
509 @Override
510 public Inv47.Match newEmptyMatch() {
511 return Inv47.Match.newEmptyMatch();
512 }
513
514 @Override
515 public Inv47.Match newMatch(final Object... parameters) {
516 return Inv47.Match.newMatch((Taxation.Legal_Union_Record) parameters[0]);
517 }
518
519 /**
520 * Inner class allowing the singleton instance of {@link Inv47} to be created
521 * <b>not</b> at the class load time of the outer class,
522 * but rather at the first call to {@link Inv47#instance()}.
523 *
524 * <p> This workaround is required e.g. to support recursion.
525 *
526 */
527 private static class LazyHolder {
528 private static final Inv47 INSTANCE = new Inv47();
529
530 /**
531 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
532 * This initialization order is required to support indirect recursion.
533 *
534 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
535 *
536 */
537 private static final Object STATIC_INITIALIZER = ensureInitialized();
538
539 public static Object ensureInitialized() {
540 INSTANCE.ensureInitializedInternal();
541 return null;
542 }
543 }
544
545 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
546 private static final Inv47.GeneratedPQuery INSTANCE = new GeneratedPQuery();
547
548 private final PParameter parameter_lur = new PParameter("lur", "Taxation.Legal_Union_Record", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Legal_Union_Record")), PParameterDirection.INOUT);
549
550 private final List<PParameter> parameters = Arrays.asList(parameter_lur);
551
552 private GeneratedPQuery() {
553 super(PVisibility.PUBLIC);
554 }
555
556 @Override
557 public String getFullyQualifiedName() {
558 return "queries.inv47";
559 }
560
561 @Override
562 public List<String> getParameterNames() {
563 return Arrays.asList("lur");
564 }
565
566 @Override
567 public List<PParameter> getParameters() {
568 return parameters;
569 }
570
571 @Override
572 public Set<PBody> doGetContainedBodies() {
573 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
574 Set<PBody> bodies = new LinkedHashSet<>();
575 {
576 PBody body = new PBody(this);
577 PVariable var_lur = body.getOrCreateVariableByName("lur");
578 PVariable var_endY = body.getOrCreateVariableByName("endY");
579 PVariable var_startY = body.getOrCreateVariableByName("startY");
580 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
581 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
582 new ExportedParameter(body, var_lur, parameter_lur)
583 ));
584 // Legal_Union_Record.end_year(lur, endY)
585 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
586 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
587 new TypeConstraint(body, Tuples.flatTupleOf(var_lur, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "end_year")));
588 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
589 new Equality(body, var__virtual_0_, var_endY);
590 // Legal_Union_Record.start_year(lur, startY)
591 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
592 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
593 new TypeConstraint(body, Tuples.flatTupleOf(var_lur, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "start_year")));
594 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
595 new Equality(body, var__virtual_1_, var_startY);
596 // neg find x_inv47(lur)
597 new NegativePatternCall(body, Tuples.flatTupleOf(var_lur), X_inv47.instance().getInternalQueryRepresentation());
598 // check(startY >= endY)
599 new ExpressionEvaluation(body, new IExpressionEvaluator() {
600
601 @Override
602 public String getShortDescription() {
603 return "Expression evaluation from pattern inv47";
604 }
605
606 @Override
607 public Iterable<String> getInputParameterNames() {
608 return Arrays.asList("endY", "startY");}
609
610 @Override
611 public Object evaluateExpression(IValueProvider provider) throws Exception {
612 Integer endY = (Integer) provider.getValue("endY");
613 Integer startY = (Integer) provider.getValue("startY");
614 return evaluateExpression_1_1(endY, startY);
615 }
616 }, null);
617 bodies.add(body);
618 }
619 {
620 PAnnotation annotation = new PAnnotation("Constraint");
621 annotation.addAttribute("message", "inv47");
622 annotation.addAttribute("severity", "error");
623 annotation.addAttribute("key", Arrays.asList(new Object[] {
624 new ParameterReference("lur")
625 }));
626 addAnnotation(annotation);
627 }
628 return bodies;
629 }
630 }
631
632 private static boolean evaluateExpression_1_1(final Integer endY, final Integer startY) {
633 boolean _greaterEqualsThan = (startY.compareTo(endY) >= 0);
634 return _greaterEqualsThan;
635 }
636}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv48.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv48.java
deleted file mode 100644
index 67133328..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv48.java
+++ /dev/null
@@ -1,566 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Physical_Person;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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.annotations.PAnnotation;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
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;
41import queries.X_inv48_Dis;
42import queries.X_inv48_notDis;
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 * //inv48-attributes-handled by multiplicity
50 * {@literal @}Constraint(message = "inv48", severity = "error", key = {p})
51 * pattern inv48(p : Physical_Person) {
52 * neg find x_inv48_notDis(p);
53 * neg find x_inv48_Dis(p);
54 * }
55 * </pre></code>
56 *
57 * @see Matcher
58 * @see Match
59 *
60 */
61@SuppressWarnings("all")
62public final class Inv48 extends BaseGeneratedEMFQuerySpecification<Inv48.Matcher> {
63 /**
64 * Pattern-specific match representation of the queries.inv48 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 Physical_Person fP;
77
78 private static List<String> parameterNames = makeImmutableList("p");
79
80 private Match(final Physical_Person pP) {
81 this.fP = pP;
82 }
83
84 @Override
85 public Object get(final String parameterName) {
86 switch(parameterName) {
87 case "p": return this.fP;
88 default: return null;
89 }
90 }
91
92 @Override
93 public Object get(final int index) {
94 switch(index) {
95 case 0: return this.fP;
96 default: return null;
97 }
98 }
99
100 public Physical_Person getP() {
101 return this.fP;
102 }
103
104 @Override
105 public boolean set(final String parameterName, final Object newValue) {
106 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
107 if ("p".equals(parameterName) ) {
108 this.fP = (Physical_Person) newValue;
109 return true;
110 }
111 return false;
112 }
113
114 public void setP(final Physical_Person pP) {
115 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
116 this.fP = pP;
117 }
118
119 @Override
120 public String patternName() {
121 return "queries.inv48";
122 }
123
124 @Override
125 public List<String> parameterNames() {
126 return Inv48.Match.parameterNames;
127 }
128
129 @Override
130 public Object[] toArray() {
131 return new Object[]{fP};
132 }
133
134 @Override
135 public Inv48.Match toImmutable() {
136 return isMutable() ? newMatch(fP) : this;
137 }
138
139 @Override
140 public String prettyPrint() {
141 StringBuilder result = new StringBuilder();
142 result.append("\"p\"=" + prettyPrintValue(fP));
143 return result.toString();
144 }
145
146 @Override
147 public int hashCode() {
148 return Objects.hash(fP);
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 Inv48.Match)) {
159 Inv48.Match other = (Inv48.Match) obj;
160 return Objects.equals(fP, other.fP);
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 Inv48 specification() {
173 return Inv48.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 Inv48.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 pP the fixed value of pattern parameter p, or null if not bound.
192 * @return the new, mutable (partial) match object.
193 *
194 */
195 public static Inv48.Match newMutableMatch(final Physical_Person pP) {
196 return new Mutable(pP);
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 pP the fixed value of pattern parameter p, or null if not bound.
204 * @return the (partial) match object.
205 *
206 */
207 public static Inv48.Match newMatch(final Physical_Person pP) {
208 return new Immutable(pP);
209 }
210
211 private static final class Mutable extends Inv48.Match {
212 Mutable(final Physical_Person pP) {
213 super(pP);
214 }
215
216 @Override
217 public boolean isMutable() {
218 return true;
219 }
220 }
221
222 private static final class Immutable extends Inv48.Match {
223 Immutable(final Physical_Person pP) {
224 super(pP);
225 }
226
227 @Override
228 public boolean isMutable() {
229 return false;
230 }
231 }
232 }
233
234 /**
235 * Generated pattern matcher API of the queries.inv48 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 * //inv48-attributes-handled by multiplicity
246 * {@literal @}Constraint(message = "inv48", severity = "error", key = {p})
247 * pattern inv48(p : Physical_Person) {
248 * neg find x_inv48_notDis(p);
249 * neg find x_inv48_Dis(p);
250 * }
251 * </pre></code>
252 *
253 * @see Match
254 * @see Inv48
255 *
256 */
257 public static class Matcher extends BaseMatcher<Inv48.Match> {
258 /**
259 * Initializes the pattern matcher within an existing VIATRA Query engine.
260 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
261 *
262 * @param engine the existing VIATRA Query engine in which this matcher will be created.
263 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
264 *
265 */
266 public static Inv48.Matcher on(final ViatraQueryEngine engine) {
267 // check if matcher already exists
268 Matcher matcher = engine.getExistingMatcher(querySpecification());
269 if (matcher == null) {
270 matcher = (Matcher)engine.getMatcher(querySpecification());
271 }
272 return matcher;
273 }
274
275 /**
276 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
277 * @return an initialized matcher
278 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
279 *
280 */
281 public static Inv48.Matcher create() {
282 return new Matcher();
283 }
284
285 private static final int POSITION_P = 0;
286
287 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv48.Matcher.class);
288
289 /**
290 * Initializes the pattern matcher within an existing VIATRA Query engine.
291 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
292 *
293 * @param engine the existing VIATRA Query engine in which this matcher will be created.
294 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
295 *
296 */
297 private Matcher() {
298 super(querySpecification());
299 }
300
301 /**
302 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
303 * @param pP the fixed value of pattern parameter p, or null if not bound.
304 * @return matches represented as a Match object.
305 *
306 */
307 public Collection<Inv48.Match> getAllMatches(final Physical_Person pP) {
308 return rawStreamAllMatches(new Object[]{pP}).collect(Collectors.toSet());
309 }
310
311 /**
312 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
313 * </p>
314 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
315 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
316 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
317 * @param pP the fixed value of pattern parameter p, or null if not bound.
318 * @return a stream of matches represented as a Match object.
319 *
320 */
321 public Stream<Inv48.Match> streamAllMatches(final Physical_Person pP) {
322 return rawStreamAllMatches(new Object[]{pP});
323 }
324
325 /**
326 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
327 * Neither determinism nor randomness of selection is guaranteed.
328 * @param pP the fixed value of pattern parameter p, or null if not bound.
329 * @return a match represented as a Match object, or null if no match is found.
330 *
331 */
332 public Optional<Inv48.Match> getOneArbitraryMatch(final Physical_Person pP) {
333 return rawGetOneArbitraryMatch(new Object[]{pP});
334 }
335
336 /**
337 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
338 * under any possible substitution of the unspecified parameters (if any).
339 * @param pP the fixed value of pattern parameter p, or null if not bound.
340 * @return true if the input is a valid (partial) match of the pattern.
341 *
342 */
343 public boolean hasMatch(final Physical_Person pP) {
344 return rawHasMatch(new Object[]{pP});
345 }
346
347 /**
348 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
349 * @param pP the fixed value of pattern parameter p, or null if not bound.
350 * @return the number of pattern matches found.
351 *
352 */
353 public int countMatches(final Physical_Person pP) {
354 return rawCountMatches(new Object[]{pP});
355 }
356
357 /**
358 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
359 * Neither determinism nor randomness of selection is guaranteed.
360 * @param pP the fixed value of pattern parameter p, or null if not bound.
361 * @param processor the action that will process the selected match.
362 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
363 *
364 */
365 public boolean forOneArbitraryMatch(final Physical_Person pP, final Consumer<? super Inv48.Match> processor) {
366 return rawForOneArbitraryMatch(new Object[]{pP}, processor);
367 }
368
369 /**
370 * Returns a new (partial) match.
371 * This can be used e.g. to call the matcher with a partial match.
372 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
373 * @param pP the fixed value of pattern parameter p, or null if not bound.
374 * @return the (partial) match object.
375 *
376 */
377 public Inv48.Match newMatch(final Physical_Person pP) {
378 return Inv48.Match.newMatch(pP);
379 }
380
381 /**
382 * Retrieve the set of values that occur in matches for p.
383 * @return the Set of all values or empty set if there are no matches
384 *
385 */
386 protected Stream<Physical_Person> rawStreamAllValuesOfp(final Object[] parameters) {
387 return rawStreamAllValues(POSITION_P, parameters).map(Physical_Person.class::cast);
388 }
389
390 /**
391 * Retrieve the set of values that occur in matches for p.
392 * @return the Set of all values or empty set if there are no matches
393 *
394 */
395 public Set<Physical_Person> getAllValuesOfp() {
396 return rawStreamAllValuesOfp(emptyArray()).collect(Collectors.toSet());
397 }
398
399 /**
400 * Retrieve the set of values that occur in matches for p.
401 * @return the Set of all values or empty set if there are no matches
402 *
403 */
404 public Stream<Physical_Person> streamAllValuesOfp() {
405 return rawStreamAllValuesOfp(emptyArray());
406 }
407
408 @Override
409 protected Inv48.Match tupleToMatch(final Tuple t) {
410 try {
411 return Inv48.Match.newMatch((Physical_Person) t.get(POSITION_P));
412 } catch(ClassCastException e) {
413 LOGGER.error("Element(s) in tuple not properly typed!",e);
414 return null;
415 }
416 }
417
418 @Override
419 protected Inv48.Match arrayToMatch(final Object[] match) {
420 try {
421 return Inv48.Match.newMatch((Physical_Person) match[POSITION_P]);
422 } catch(ClassCastException e) {
423 LOGGER.error("Element(s) in array not properly typed!",e);
424 return null;
425 }
426 }
427
428 @Override
429 protected Inv48.Match arrayToMatchMutable(final Object[] match) {
430 try {
431 return Inv48.Match.newMutableMatch((Physical_Person) match[POSITION_P]);
432 } catch(ClassCastException e) {
433 LOGGER.error("Element(s) in array not properly typed!",e);
434 return null;
435 }
436 }
437
438 /**
439 * @return the singleton instance of the query specification of this pattern
440 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
441 *
442 */
443 public static IQuerySpecification<Inv48.Matcher> querySpecification() {
444 return Inv48.instance();
445 }
446 }
447
448 private Inv48() {
449 super(GeneratedPQuery.INSTANCE);
450 }
451
452 /**
453 * @return the singleton instance of the query specification
454 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
455 *
456 */
457 public static Inv48 instance() {
458 try{
459 return LazyHolder.INSTANCE;
460 } catch (ExceptionInInitializerError err) {
461 throw processInitializerError(err);
462 }
463 }
464
465 @Override
466 protected Inv48.Matcher instantiate(final ViatraQueryEngine engine) {
467 return Inv48.Matcher.on(engine);
468 }
469
470 @Override
471 public Inv48.Matcher instantiate() {
472 return Inv48.Matcher.create();
473 }
474
475 @Override
476 public Inv48.Match newEmptyMatch() {
477 return Inv48.Match.newEmptyMatch();
478 }
479
480 @Override
481 public Inv48.Match newMatch(final Object... parameters) {
482 return Inv48.Match.newMatch((Taxation.Physical_Person) parameters[0]);
483 }
484
485 /**
486 * Inner class allowing the singleton instance of {@link Inv48} to be created
487 * <b>not</b> at the class load time of the outer class,
488 * but rather at the first call to {@link Inv48#instance()}.
489 *
490 * <p> This workaround is required e.g. to support recursion.
491 *
492 */
493 private static class LazyHolder {
494 private static final Inv48 INSTANCE = new Inv48();
495
496 /**
497 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
498 * This initialization order is required to support indirect recursion.
499 *
500 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
501 *
502 */
503 private static final Object STATIC_INITIALIZER = ensureInitialized();
504
505 public static Object ensureInitialized() {
506 INSTANCE.ensureInitializedInternal();
507 return null;
508 }
509 }
510
511 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
512 private static final Inv48.GeneratedPQuery INSTANCE = new GeneratedPQuery();
513
514 private final PParameter parameter_p = new PParameter("p", "Taxation.Physical_Person", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Physical_Person")), PParameterDirection.INOUT);
515
516 private final List<PParameter> parameters = Arrays.asList(parameter_p);
517
518 private GeneratedPQuery() {
519 super(PVisibility.PUBLIC);
520 }
521
522 @Override
523 public String getFullyQualifiedName() {
524 return "queries.inv48";
525 }
526
527 @Override
528 public List<String> getParameterNames() {
529 return Arrays.asList("p");
530 }
531
532 @Override
533 public List<PParameter> getParameters() {
534 return parameters;
535 }
536
537 @Override
538 public Set<PBody> doGetContainedBodies() {
539 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
540 Set<PBody> bodies = new LinkedHashSet<>();
541 {
542 PBody body = new PBody(this);
543 PVariable var_p = body.getOrCreateVariableByName("p");
544 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
545 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
546 new ExportedParameter(body, var_p, parameter_p)
547 ));
548 // neg find x_inv48_notDis(p)
549 new NegativePatternCall(body, Tuples.flatTupleOf(var_p), X_inv48_notDis.instance().getInternalQueryRepresentation());
550 // neg find x_inv48_Dis(p)
551 new NegativePatternCall(body, Tuples.flatTupleOf(var_p), X_inv48_Dis.instance().getInternalQueryRepresentation());
552 bodies.add(body);
553 }
554 {
555 PAnnotation annotation = new PAnnotation("Constraint");
556 annotation.addAttribute("message", "inv48");
557 annotation.addAttribute("severity", "error");
558 annotation.addAttribute("key", Arrays.asList(new Object[] {
559 new ParameterReference("p")
560 }));
561 addAnnotation(annotation);
562 }
563 return bodies;
564 }
565 }
566}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv49.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv49.java
deleted file mode 100644
index 66bca24a..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/Inv49.java
+++ /dev/null
@@ -1,561 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Legal_Union_Record;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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.annotations.PAnnotation;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
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;
41import queries.X_inv49_1;
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 * //inv49-OclKindOf-handled by multiplicity
49 * {@literal @}Constraint(message = "inv49", severity = "error", key = {lur})
50 * pattern inv49(lur : Legal_Union_Record) {
51 * neg find x_inv49_1(lur);
52 * }
53 * </pre></code>
54 *
55 * @see Matcher
56 * @see Match
57 *
58 */
59@SuppressWarnings("all")
60public final class Inv49 extends BaseGeneratedEMFQuerySpecification<Inv49.Matcher> {
61 /**
62 * Pattern-specific match representation of the queries.inv49 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 Legal_Union_Record fLur;
75
76 private static List<String> parameterNames = makeImmutableList("lur");
77
78 private Match(final Legal_Union_Record pLur) {
79 this.fLur = pLur;
80 }
81
82 @Override
83 public Object get(final String parameterName) {
84 switch(parameterName) {
85 case "lur": return this.fLur;
86 default: return null;
87 }
88 }
89
90 @Override
91 public Object get(final int index) {
92 switch(index) {
93 case 0: return this.fLur;
94 default: return null;
95 }
96 }
97
98 public Legal_Union_Record getLur() {
99 return this.fLur;
100 }
101
102 @Override
103 public boolean set(final String parameterName, final Object newValue) {
104 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
105 if ("lur".equals(parameterName) ) {
106 this.fLur = (Legal_Union_Record) newValue;
107 return true;
108 }
109 return false;
110 }
111
112 public void setLur(final Legal_Union_Record pLur) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 this.fLur = pLur;
115 }
116
117 @Override
118 public String patternName() {
119 return "queries.inv49";
120 }
121
122 @Override
123 public List<String> parameterNames() {
124 return Inv49.Match.parameterNames;
125 }
126
127 @Override
128 public Object[] toArray() {
129 return new Object[]{fLur};
130 }
131
132 @Override
133 public Inv49.Match toImmutable() {
134 return isMutable() ? newMatch(fLur) : this;
135 }
136
137 @Override
138 public String prettyPrint() {
139 StringBuilder result = new StringBuilder();
140 result.append("\"lur\"=" + prettyPrintValue(fLur));
141 return result.toString();
142 }
143
144 @Override
145 public int hashCode() {
146 return Objects.hash(fLur);
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 Inv49.Match)) {
157 Inv49.Match other = (Inv49.Match) obj;
158 return Objects.equals(fLur, other.fLur);
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 Inv49 specification() {
171 return Inv49.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 Inv49.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 pLur the fixed value of pattern parameter lur, or null if not bound.
190 * @return the new, mutable (partial) match object.
191 *
192 */
193 public static Inv49.Match newMutableMatch(final Legal_Union_Record pLur) {
194 return new Mutable(pLur);
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 pLur the fixed value of pattern parameter lur, or null if not bound.
202 * @return the (partial) match object.
203 *
204 */
205 public static Inv49.Match newMatch(final Legal_Union_Record pLur) {
206 return new Immutable(pLur);
207 }
208
209 private static final class Mutable extends Inv49.Match {
210 Mutable(final Legal_Union_Record pLur) {
211 super(pLur);
212 }
213
214 @Override
215 public boolean isMutable() {
216 return true;
217 }
218 }
219
220 private static final class Immutable extends Inv49.Match {
221 Immutable(final Legal_Union_Record pLur) {
222 super(pLur);
223 }
224
225 @Override
226 public boolean isMutable() {
227 return false;
228 }
229 }
230 }
231
232 /**
233 * Generated pattern matcher API of the queries.inv49 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 * //inv49-OclKindOf-handled by multiplicity
244 * {@literal @}Constraint(message = "inv49", severity = "error", key = {lur})
245 * pattern inv49(lur : Legal_Union_Record) {
246 * neg find x_inv49_1(lur);
247 * }
248 * </pre></code>
249 *
250 * @see Match
251 * @see Inv49
252 *
253 */
254 public static class Matcher extends BaseMatcher<Inv49.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 Inv49.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 Inv49.Matcher create() {
279 return new Matcher();
280 }
281
282 private static final int POSITION_LUR = 0;
283
284 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Inv49.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 pLur the fixed value of pattern parameter lur, or null if not bound.
301 * @return matches represented as a Match object.
302 *
303 */
304 public Collection<Inv49.Match> getAllMatches(final Legal_Union_Record pLur) {
305 return rawStreamAllMatches(new Object[]{pLur}).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 pLur the fixed value of pattern parameter lur, or null if not bound.
315 * @return a stream of matches represented as a Match object.
316 *
317 */
318 public Stream<Inv49.Match> streamAllMatches(final Legal_Union_Record pLur) {
319 return rawStreamAllMatches(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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<Inv49.Match> getOneArbitraryMatch(final Legal_Union_Record pLur) {
330 return rawGetOneArbitraryMatch(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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 Legal_Union_Record pLur) {
341 return rawHasMatch(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, or null if not bound.
347 * @return the number of pattern matches found.
348 *
349 */
350 public int countMatches(final Legal_Union_Record pLur) {
351 return rawCountMatches(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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 Legal_Union_Record pLur, final Consumer<? super Inv49.Match> processor) {
363 return rawForOneArbitraryMatch(new Object[]{pLur}, 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 pLur the fixed value of pattern parameter lur, or null if not bound.
371 * @return the (partial) match object.
372 *
373 */
374 public Inv49.Match newMatch(final Legal_Union_Record pLur) {
375 return Inv49.Match.newMatch(pLur);
376 }
377
378 /**
379 * Retrieve the set of values that occur in matches for lur.
380 * @return the Set of all values or empty set if there are no matches
381 *
382 */
383 protected Stream<Legal_Union_Record> rawStreamAllValuesOflur(final Object[] parameters) {
384 return rawStreamAllValues(POSITION_LUR, parameters).map(Legal_Union_Record.class::cast);
385 }
386
387 /**
388 * Retrieve the set of values that occur in matches for lur.
389 * @return the Set of all values or empty set if there are no matches
390 *
391 */
392 public Set<Legal_Union_Record> getAllValuesOflur() {
393 return rawStreamAllValuesOflur(emptyArray()).collect(Collectors.toSet());
394 }
395
396 /**
397 * Retrieve the set of values that occur in matches for lur.
398 * @return the Set of all values or empty set if there are no matches
399 *
400 */
401 public Stream<Legal_Union_Record> streamAllValuesOflur() {
402 return rawStreamAllValuesOflur(emptyArray());
403 }
404
405 @Override
406 protected Inv49.Match tupleToMatch(final Tuple t) {
407 try {
408 return Inv49.Match.newMatch((Legal_Union_Record) t.get(POSITION_LUR));
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 Inv49.Match arrayToMatch(final Object[] match) {
417 try {
418 return Inv49.Match.newMatch((Legal_Union_Record) match[POSITION_LUR]);
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 Inv49.Match arrayToMatchMutable(final Object[] match) {
427 try {
428 return Inv49.Match.newMutableMatch((Legal_Union_Record) match[POSITION_LUR]);
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<Inv49.Matcher> querySpecification() {
441 return Inv49.instance();
442 }
443 }
444
445 private Inv49() {
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 Inv49 instance() {
455 try{
456 return LazyHolder.INSTANCE;
457 } catch (ExceptionInInitializerError err) {
458 throw processInitializerError(err);
459 }
460 }
461
462 @Override
463 protected Inv49.Matcher instantiate(final ViatraQueryEngine engine) {
464 return Inv49.Matcher.on(engine);
465 }
466
467 @Override
468 public Inv49.Matcher instantiate() {
469 return Inv49.Matcher.create();
470 }
471
472 @Override
473 public Inv49.Match newEmptyMatch() {
474 return Inv49.Match.newEmptyMatch();
475 }
476
477 @Override
478 public Inv49.Match newMatch(final Object... parameters) {
479 return Inv49.Match.newMatch((Taxation.Legal_Union_Record) parameters[0]);
480 }
481
482 /**
483 * Inner class allowing the singleton instance of {@link Inv49} 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 Inv49#instance()}.
486 *
487 * <p> This workaround is required e.g. to support recursion.
488 *
489 */
490 private static class LazyHolder {
491 private static final Inv49 INSTANCE = new Inv49();
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 Inv49.GeneratedPQuery INSTANCE = new GeneratedPQuery();
510
511 private final PParameter parameter_lur = new PParameter("lur", "Taxation.Legal_Union_Record", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Legal_Union_Record")), PParameterDirection.INOUT);
512
513 private final List<PParameter> parameters = Arrays.asList(parameter_lur);
514
515 private GeneratedPQuery() {
516 super(PVisibility.PUBLIC);
517 }
518
519 @Override
520 public String getFullyQualifiedName() {
521 return "queries.inv49";
522 }
523
524 @Override
525 public List<String> getParameterNames() {
526 return Arrays.asList("lur");
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_lur = body.getOrCreateVariableByName("lur");
541 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
542 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
543 new ExportedParameter(body, var_lur, parameter_lur)
544 ));
545 // neg find x_inv49_1(lur)
546 new NegativePatternCall(body, Tuples.flatTupleOf(var_lur), X_inv49_1.instance().getInternalQueryRepresentation());
547 bodies.add(body);
548 }
549 {
550 PAnnotation annotation = new PAnnotation("Constraint");
551 annotation.addAttribute("message", "inv49");
552 annotation.addAttribute("severity", "error");
553 annotation.addAttribute("key", Arrays.asList(new Object[] {
554 new ParameterReference("lur")
555 }));
556 addAnnotation(annotation);
557 }
558 return bodies;
559 }
560 }
561}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv03_eligAll.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv03_eligAll.java
deleted file mode 100644
index 0bfffe93..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv03_eligAll.java
+++ /dev/null
@@ -1,606 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Dependent;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.ConstantValue;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
40import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
43import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
44import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
45import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
46
47/**
48 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
49 *
50 * <p>Original source:
51 * <code><pre>
52 * pattern x_inv03_eligAll(dep : Dependent) {
53 * Dependent.birth_year(dep, by);
54 * check(2018-by {@literal <}= 21);
55 * } or {
56 * Dependent.continued_studies(dep, true);
57 * }
58 * </pre></code>
59 *
60 * @see Matcher
61 * @see Match
62 *
63 */
64@SuppressWarnings("all")
65public final class X_inv03_eligAll extends BaseGeneratedEMFQuerySpecification<X_inv03_eligAll.Matcher> {
66 /**
67 * Pattern-specific match representation of the queries.x_inv03_eligAll 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 Dependent fDep;
80
81 private static List<String> parameterNames = makeImmutableList("dep");
82
83 private Match(final Dependent pDep) {
84 this.fDep = pDep;
85 }
86
87 @Override
88 public Object get(final String parameterName) {
89 switch(parameterName) {
90 case "dep": return this.fDep;
91 default: return null;
92 }
93 }
94
95 @Override
96 public Object get(final int index) {
97 switch(index) {
98 case 0: return this.fDep;
99 default: return null;
100 }
101 }
102
103 public Dependent getDep() {
104 return this.fDep;
105 }
106
107 @Override
108 public boolean set(final String parameterName, final Object newValue) {
109 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
110 if ("dep".equals(parameterName) ) {
111 this.fDep = (Dependent) newValue;
112 return true;
113 }
114 return false;
115 }
116
117 public void setDep(final Dependent pDep) {
118 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
119 this.fDep = pDep;
120 }
121
122 @Override
123 public String patternName() {
124 return "queries.x_inv03_eligAll";
125 }
126
127 @Override
128 public List<String> parameterNames() {
129 return X_inv03_eligAll.Match.parameterNames;
130 }
131
132 @Override
133 public Object[] toArray() {
134 return new Object[]{fDep};
135 }
136
137 @Override
138 public X_inv03_eligAll.Match toImmutable() {
139 return isMutable() ? newMatch(fDep) : this;
140 }
141
142 @Override
143 public String prettyPrint() {
144 StringBuilder result = new StringBuilder();
145 result.append("\"dep\"=" + prettyPrintValue(fDep));
146 return result.toString();
147 }
148
149 @Override
150 public int hashCode() {
151 return Objects.hash(fDep);
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 X_inv03_eligAll.Match)) {
162 X_inv03_eligAll.Match other = (X_inv03_eligAll.Match) obj;
163 return Objects.equals(fDep, other.fDep);
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 X_inv03_eligAll specification() {
176 return X_inv03_eligAll.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 X_inv03_eligAll.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 pDep the fixed value of pattern parameter dep, or null if not bound.
195 * @return the new, mutable (partial) match object.
196 *
197 */
198 public static X_inv03_eligAll.Match newMutableMatch(final Dependent pDep) {
199 return new Mutable(pDep);
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 pDep the fixed value of pattern parameter dep, or null if not bound.
207 * @return the (partial) match object.
208 *
209 */
210 public static X_inv03_eligAll.Match newMatch(final Dependent pDep) {
211 return new Immutable(pDep);
212 }
213
214 private static final class Mutable extends X_inv03_eligAll.Match {
215 Mutable(final Dependent pDep) {
216 super(pDep);
217 }
218
219 @Override
220 public boolean isMutable() {
221 return true;
222 }
223 }
224
225 private static final class Immutable extends X_inv03_eligAll.Match {
226 Immutable(final Dependent pDep) {
227 super(pDep);
228 }
229
230 @Override
231 public boolean isMutable() {
232 return false;
233 }
234 }
235 }
236
237 /**
238 * Generated pattern matcher API of the queries.x_inv03_eligAll 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 * pattern x_inv03_eligAll(dep : Dependent) {
249 * Dependent.birth_year(dep, by);
250 * check(2018-by {@literal <}= 21);
251 * } or {
252 * Dependent.continued_studies(dep, true);
253 * }
254 * </pre></code>
255 *
256 * @see Match
257 * @see X_inv03_eligAll
258 *
259 */
260 public static class Matcher extends BaseMatcher<X_inv03_eligAll.Match> {
261 /**
262 * Initializes the pattern matcher within an existing VIATRA Query engine.
263 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
264 *
265 * @param engine the existing VIATRA Query engine in which this matcher will be created.
266 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
267 *
268 */
269 public static X_inv03_eligAll.Matcher on(final ViatraQueryEngine engine) {
270 // check if matcher already exists
271 Matcher matcher = engine.getExistingMatcher(querySpecification());
272 if (matcher == null) {
273 matcher = (Matcher)engine.getMatcher(querySpecification());
274 }
275 return matcher;
276 }
277
278 /**
279 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
280 * @return an initialized matcher
281 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
282 *
283 */
284 public static X_inv03_eligAll.Matcher create() {
285 return new Matcher();
286 }
287
288 private static final int POSITION_DEP = 0;
289
290 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv03_eligAll.Matcher.class);
291
292 /**
293 * Initializes the pattern matcher within an existing VIATRA Query engine.
294 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
295 *
296 * @param engine the existing VIATRA Query engine in which this matcher will be created.
297 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
298 *
299 */
300 private Matcher() {
301 super(querySpecification());
302 }
303
304 /**
305 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
306 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
307 * @return matches represented as a Match object.
308 *
309 */
310 public Collection<X_inv03_eligAll.Match> getAllMatches(final Dependent pDep) {
311 return rawStreamAllMatches(new Object[]{pDep}).collect(Collectors.toSet());
312 }
313
314 /**
315 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
316 * </p>
317 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
318 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
319 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
320 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
321 * @return a stream of matches represented as a Match object.
322 *
323 */
324 public Stream<X_inv03_eligAll.Match> streamAllMatches(final Dependent pDep) {
325 return rawStreamAllMatches(new Object[]{pDep});
326 }
327
328 /**
329 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
330 * Neither determinism nor randomness of selection is guaranteed.
331 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
332 * @return a match represented as a Match object, or null if no match is found.
333 *
334 */
335 public Optional<X_inv03_eligAll.Match> getOneArbitraryMatch(final Dependent pDep) {
336 return rawGetOneArbitraryMatch(new Object[]{pDep});
337 }
338
339 /**
340 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
341 * under any possible substitution of the unspecified parameters (if any).
342 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
343 * @return true if the input is a valid (partial) match of the pattern.
344 *
345 */
346 public boolean hasMatch(final Dependent pDep) {
347 return rawHasMatch(new Object[]{pDep});
348 }
349
350 /**
351 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
352 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
353 * @return the number of pattern matches found.
354 *
355 */
356 public int countMatches(final Dependent pDep) {
357 return rawCountMatches(new Object[]{pDep});
358 }
359
360 /**
361 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
362 * Neither determinism nor randomness of selection is guaranteed.
363 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
364 * @param processor the action that will process the selected match.
365 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
366 *
367 */
368 public boolean forOneArbitraryMatch(final Dependent pDep, final Consumer<? super X_inv03_eligAll.Match> processor) {
369 return rawForOneArbitraryMatch(new Object[]{pDep}, processor);
370 }
371
372 /**
373 * Returns a new (partial) match.
374 * This can be used e.g. to call the matcher with a partial match.
375 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
376 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
377 * @return the (partial) match object.
378 *
379 */
380 public X_inv03_eligAll.Match newMatch(final Dependent pDep) {
381 return X_inv03_eligAll.Match.newMatch(pDep);
382 }
383
384 /**
385 * Retrieve the set of values that occur in matches for dep.
386 * @return the Set of all values or empty set if there are no matches
387 *
388 */
389 protected Stream<Dependent> rawStreamAllValuesOfdep(final Object[] parameters) {
390 return rawStreamAllValues(POSITION_DEP, parameters).map(Dependent.class::cast);
391 }
392
393 /**
394 * Retrieve the set of values that occur in matches for dep.
395 * @return the Set of all values or empty set if there are no matches
396 *
397 */
398 public Set<Dependent> getAllValuesOfdep() {
399 return rawStreamAllValuesOfdep(emptyArray()).collect(Collectors.toSet());
400 }
401
402 /**
403 * Retrieve the set of values that occur in matches for dep.
404 * @return the Set of all values or empty set if there are no matches
405 *
406 */
407 public Stream<Dependent> streamAllValuesOfdep() {
408 return rawStreamAllValuesOfdep(emptyArray());
409 }
410
411 @Override
412 protected X_inv03_eligAll.Match tupleToMatch(final Tuple t) {
413 try {
414 return X_inv03_eligAll.Match.newMatch((Dependent) t.get(POSITION_DEP));
415 } catch(ClassCastException e) {
416 LOGGER.error("Element(s) in tuple not properly typed!",e);
417 return null;
418 }
419 }
420
421 @Override
422 protected X_inv03_eligAll.Match arrayToMatch(final Object[] match) {
423 try {
424 return X_inv03_eligAll.Match.newMatch((Dependent) match[POSITION_DEP]);
425 } catch(ClassCastException e) {
426 LOGGER.error("Element(s) in array not properly typed!",e);
427 return null;
428 }
429 }
430
431 @Override
432 protected X_inv03_eligAll.Match arrayToMatchMutable(final Object[] match) {
433 try {
434 return X_inv03_eligAll.Match.newMutableMatch((Dependent) match[POSITION_DEP]);
435 } catch(ClassCastException e) {
436 LOGGER.error("Element(s) in array not properly typed!",e);
437 return null;
438 }
439 }
440
441 /**
442 * @return the singleton instance of the query specification of this pattern
443 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
444 *
445 */
446 public static IQuerySpecification<X_inv03_eligAll.Matcher> querySpecification() {
447 return X_inv03_eligAll.instance();
448 }
449 }
450
451 private X_inv03_eligAll() {
452 super(GeneratedPQuery.INSTANCE);
453 }
454
455 /**
456 * @return the singleton instance of the query specification
457 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
458 *
459 */
460 public static X_inv03_eligAll instance() {
461 try{
462 return LazyHolder.INSTANCE;
463 } catch (ExceptionInInitializerError err) {
464 throw processInitializerError(err);
465 }
466 }
467
468 @Override
469 protected X_inv03_eligAll.Matcher instantiate(final ViatraQueryEngine engine) {
470 return X_inv03_eligAll.Matcher.on(engine);
471 }
472
473 @Override
474 public X_inv03_eligAll.Matcher instantiate() {
475 return X_inv03_eligAll.Matcher.create();
476 }
477
478 @Override
479 public X_inv03_eligAll.Match newEmptyMatch() {
480 return X_inv03_eligAll.Match.newEmptyMatch();
481 }
482
483 @Override
484 public X_inv03_eligAll.Match newMatch(final Object... parameters) {
485 return X_inv03_eligAll.Match.newMatch((Taxation.Dependent) parameters[0]);
486 }
487
488 /**
489 * Inner class allowing the singleton instance of {@link X_inv03_eligAll} to be created
490 * <b>not</b> at the class load time of the outer class,
491 * but rather at the first call to {@link X_inv03_eligAll#instance()}.
492 *
493 * <p> This workaround is required e.g. to support recursion.
494 *
495 */
496 private static class LazyHolder {
497 private static final X_inv03_eligAll INSTANCE = new X_inv03_eligAll();
498
499 /**
500 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
501 * This initialization order is required to support indirect recursion.
502 *
503 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
504 *
505 */
506 private static final Object STATIC_INITIALIZER = ensureInitialized();
507
508 public static Object ensureInitialized() {
509 INSTANCE.ensureInitializedInternal();
510 return null;
511 }
512 }
513
514 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
515 private static final X_inv03_eligAll.GeneratedPQuery INSTANCE = new GeneratedPQuery();
516
517 private final PParameter parameter_dep = new PParameter("dep", "Taxation.Dependent", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Dependent")), PParameterDirection.INOUT);
518
519 private final List<PParameter> parameters = Arrays.asList(parameter_dep);
520
521 private GeneratedPQuery() {
522 super(PVisibility.PUBLIC);
523 }
524
525 @Override
526 public String getFullyQualifiedName() {
527 return "queries.x_inv03_eligAll";
528 }
529
530 @Override
531 public List<String> getParameterNames() {
532 return Arrays.asList("dep");
533 }
534
535 @Override
536 public List<PParameter> getParameters() {
537 return parameters;
538 }
539
540 @Override
541 public Set<PBody> doGetContainedBodies() {
542 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
543 Set<PBody> bodies = new LinkedHashSet<>();
544 {
545 PBody body = new PBody(this);
546 PVariable var_dep = body.getOrCreateVariableByName("dep");
547 PVariable var_by = body.getOrCreateVariableByName("by");
548 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
549 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
550 new ExportedParameter(body, var_dep, parameter_dep)
551 ));
552 // Dependent.birth_year(dep, by)
553 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
554 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
555 new TypeConstraint(body, Tuples.flatTupleOf(var_dep, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "birth_year")));
556 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
557 new Equality(body, var__virtual_0_, var_by);
558 // check(2018-by <= 21)
559 new ExpressionEvaluation(body, new IExpressionEvaluator() {
560
561 @Override
562 public String getShortDescription() {
563 return "Expression evaluation from pattern x_inv03_eligAll";
564 }
565
566 @Override
567 public Iterable<String> getInputParameterNames() {
568 return Arrays.asList("by");}
569
570 @Override
571 public Object evaluateExpression(IValueProvider provider) throws Exception {
572 Integer by = (Integer) provider.getValue("by");
573 return evaluateExpression_1_1(by);
574 }
575 }, null);
576 bodies.add(body);
577 }
578 {
579 PBody body = new PBody(this);
580 PVariable var_dep = body.getOrCreateVariableByName("dep");
581 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
582 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
583 new ExportedParameter(body, var_dep, parameter_dep)
584 ));
585 // Dependent.continued_studies(dep, true)
586 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
587 new ConstantValue(body, var__virtual_0_, true);
588 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
589 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
590 new TypeConstraint(body, Tuples.flatTupleOf(var_dep, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Dependent", "continued_studies")));
591 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EBoolean")));
592 new Equality(body, var__virtual_1_, var__virtual_0_);
593 bodies.add(body);
594 }
595 return bodies;
596 }
597 }
598
599 private static boolean evaluateExpression_1_1(final Integer by) {
600 return ((2018 - (by).intValue()) <= 21);
601 }
602
603 private static boolean evaluateExpression_2_1() {
604 return true;
605 }
606}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv03_hasAll.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv03_hasAll.java
deleted file mode 100644
index 90deb92d..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv03_hasAll.java
+++ /dev/null
@@ -1,551 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Dependent;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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 x_inv03_hasAll(dep : Dependent) {
47 * Dependent.allowances(dep, _);
48 * }
49 * </pre></code>
50 *
51 * @see Matcher
52 * @see Match
53 *
54 */
55@SuppressWarnings("all")
56public final class X_inv03_hasAll extends BaseGeneratedEMFQuerySpecification<X_inv03_hasAll.Matcher> {
57 /**
58 * Pattern-specific match representation of the queries.x_inv03_hasAll 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 Dependent fDep;
71
72 private static List<String> parameterNames = makeImmutableList("dep");
73
74 private Match(final Dependent pDep) {
75 this.fDep = pDep;
76 }
77
78 @Override
79 public Object get(final String parameterName) {
80 switch(parameterName) {
81 case "dep": return this.fDep;
82 default: return null;
83 }
84 }
85
86 @Override
87 public Object get(final int index) {
88 switch(index) {
89 case 0: return this.fDep;
90 default: return null;
91 }
92 }
93
94 public Dependent getDep() {
95 return this.fDep;
96 }
97
98 @Override
99 public boolean set(final String parameterName, final Object newValue) {
100 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
101 if ("dep".equals(parameterName) ) {
102 this.fDep = (Dependent) newValue;
103 return true;
104 }
105 return false;
106 }
107
108 public void setDep(final Dependent pDep) {
109 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
110 this.fDep = pDep;
111 }
112
113 @Override
114 public String patternName() {
115 return "queries.x_inv03_hasAll";
116 }
117
118 @Override
119 public List<String> parameterNames() {
120 return X_inv03_hasAll.Match.parameterNames;
121 }
122
123 @Override
124 public Object[] toArray() {
125 return new Object[]{fDep};
126 }
127
128 @Override
129 public X_inv03_hasAll.Match toImmutable() {
130 return isMutable() ? newMatch(fDep) : this;
131 }
132
133 @Override
134 public String prettyPrint() {
135 StringBuilder result = new StringBuilder();
136 result.append("\"dep\"=" + prettyPrintValue(fDep));
137 return result.toString();
138 }
139
140 @Override
141 public int hashCode() {
142 return Objects.hash(fDep);
143 }
144
145 @Override
146 public boolean equals(final Object obj) {
147 if (this == obj)
148 return true;
149 if (obj == null) {
150 return false;
151 }
152 if ((obj instanceof X_inv03_hasAll.Match)) {
153 X_inv03_hasAll.Match other = (X_inv03_hasAll.Match) obj;
154 return Objects.equals(fDep, other.fDep);
155 } else {
156 // this should be infrequent
157 if (!(obj instanceof IPatternMatch)) {
158 return false;
159 }
160 IPatternMatch otherSig = (IPatternMatch) obj;
161 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
162 }
163 }
164
165 @Override
166 public X_inv03_hasAll specification() {
167 return X_inv03_hasAll.instance();
168 }
169
170 /**
171 * Returns an empty, mutable match.
172 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
173 *
174 * @return the empty match.
175 *
176 */
177 public static X_inv03_hasAll.Match newEmptyMatch() {
178 return new Mutable(null);
179 }
180
181 /**
182 * Returns a mutable (partial) match.
183 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
184 *
185 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
186 * @return the new, mutable (partial) match object.
187 *
188 */
189 public static X_inv03_hasAll.Match newMutableMatch(final Dependent pDep) {
190 return new Mutable(pDep);
191 }
192
193 /**
194 * Returns a new (partial) match.
195 * This can be used e.g. to call the matcher with a partial match.
196 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
197 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
198 * @return the (partial) match object.
199 *
200 */
201 public static X_inv03_hasAll.Match newMatch(final Dependent pDep) {
202 return new Immutable(pDep);
203 }
204
205 private static final class Mutable extends X_inv03_hasAll.Match {
206 Mutable(final Dependent pDep) {
207 super(pDep);
208 }
209
210 @Override
211 public boolean isMutable() {
212 return true;
213 }
214 }
215
216 private static final class Immutable extends X_inv03_hasAll.Match {
217 Immutable(final Dependent pDep) {
218 super(pDep);
219 }
220
221 @Override
222 public boolean isMutable() {
223 return false;
224 }
225 }
226 }
227
228 /**
229 * Generated pattern matcher API of the queries.x_inv03_hasAll pattern,
230 * providing pattern-specific query methods.
231 *
232 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
233 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
234 *
235 * <p>Matches of the pattern will be represented as {@link Match}.
236 *
237 * <p>Original source:
238 * <code><pre>
239 * pattern x_inv03_hasAll(dep : Dependent) {
240 * Dependent.allowances(dep, _);
241 * }
242 * </pre></code>
243 *
244 * @see Match
245 * @see X_inv03_hasAll
246 *
247 */
248 public static class Matcher extends BaseMatcher<X_inv03_hasAll.Match> {
249 /**
250 * Initializes the pattern matcher within an existing VIATRA Query engine.
251 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
252 *
253 * @param engine the existing VIATRA Query engine in which this matcher will be created.
254 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
255 *
256 */
257 public static X_inv03_hasAll.Matcher on(final ViatraQueryEngine engine) {
258 // check if matcher already exists
259 Matcher matcher = engine.getExistingMatcher(querySpecification());
260 if (matcher == null) {
261 matcher = (Matcher)engine.getMatcher(querySpecification());
262 }
263 return matcher;
264 }
265
266 /**
267 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
268 * @return an initialized matcher
269 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
270 *
271 */
272 public static X_inv03_hasAll.Matcher create() {
273 return new Matcher();
274 }
275
276 private static final int POSITION_DEP = 0;
277
278 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv03_hasAll.Matcher.class);
279
280 /**
281 * Initializes the pattern matcher within an existing VIATRA Query engine.
282 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
283 *
284 * @param engine the existing VIATRA Query engine in which this matcher will be created.
285 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
286 *
287 */
288 private Matcher() {
289 super(querySpecification());
290 }
291
292 /**
293 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
294 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
295 * @return matches represented as a Match object.
296 *
297 */
298 public Collection<X_inv03_hasAll.Match> getAllMatches(final Dependent pDep) {
299 return rawStreamAllMatches(new Object[]{pDep}).collect(Collectors.toSet());
300 }
301
302 /**
303 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
304 * </p>
305 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
306 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
307 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
308 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
309 * @return a stream of matches represented as a Match object.
310 *
311 */
312 public Stream<X_inv03_hasAll.Match> streamAllMatches(final Dependent pDep) {
313 return rawStreamAllMatches(new Object[]{pDep});
314 }
315
316 /**
317 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
318 * Neither determinism nor randomness of selection is guaranteed.
319 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
320 * @return a match represented as a Match object, or null if no match is found.
321 *
322 */
323 public Optional<X_inv03_hasAll.Match> getOneArbitraryMatch(final Dependent pDep) {
324 return rawGetOneArbitraryMatch(new Object[]{pDep});
325 }
326
327 /**
328 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
329 * under any possible substitution of the unspecified parameters (if any).
330 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
331 * @return true if the input is a valid (partial) match of the pattern.
332 *
333 */
334 public boolean hasMatch(final Dependent pDep) {
335 return rawHasMatch(new Object[]{pDep});
336 }
337
338 /**
339 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
340 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
341 * @return the number of pattern matches found.
342 *
343 */
344 public int countMatches(final Dependent pDep) {
345 return rawCountMatches(new Object[]{pDep});
346 }
347
348 /**
349 * Executes the given processor on 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 pDep the fixed value of pattern parameter dep, or null if not bound.
352 * @param processor the action that will process the selected match.
353 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
354 *
355 */
356 public boolean forOneArbitraryMatch(final Dependent pDep, final Consumer<? super X_inv03_hasAll.Match> processor) {
357 return rawForOneArbitraryMatch(new Object[]{pDep}, processor);
358 }
359
360 /**
361 * Returns a new (partial) match.
362 * This can be used e.g. to call the matcher with a partial match.
363 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
364 * @param pDep the fixed value of pattern parameter dep, or null if not bound.
365 * @return the (partial) match object.
366 *
367 */
368 public X_inv03_hasAll.Match newMatch(final Dependent pDep) {
369 return X_inv03_hasAll.Match.newMatch(pDep);
370 }
371
372 /**
373 * Retrieve the set of values that occur in matches for dep.
374 * @return the Set of all values or empty set if there are no matches
375 *
376 */
377 protected Stream<Dependent> rawStreamAllValuesOfdep(final Object[] parameters) {
378 return rawStreamAllValues(POSITION_DEP, parameters).map(Dependent.class::cast);
379 }
380
381 /**
382 * Retrieve the set of values that occur in matches for dep.
383 * @return the Set of all values or empty set if there are no matches
384 *
385 */
386 public Set<Dependent> getAllValuesOfdep() {
387 return rawStreamAllValuesOfdep(emptyArray()).collect(Collectors.toSet());
388 }
389
390 /**
391 * Retrieve the set of values that occur in matches for dep.
392 * @return the Set of all values or empty set if there are no matches
393 *
394 */
395 public Stream<Dependent> streamAllValuesOfdep() {
396 return rawStreamAllValuesOfdep(emptyArray());
397 }
398
399 @Override
400 protected X_inv03_hasAll.Match tupleToMatch(final Tuple t) {
401 try {
402 return X_inv03_hasAll.Match.newMatch((Dependent) t.get(POSITION_DEP));
403 } catch(ClassCastException e) {
404 LOGGER.error("Element(s) in tuple not properly typed!",e);
405 return null;
406 }
407 }
408
409 @Override
410 protected X_inv03_hasAll.Match arrayToMatch(final Object[] match) {
411 try {
412 return X_inv03_hasAll.Match.newMatch((Dependent) match[POSITION_DEP]);
413 } catch(ClassCastException e) {
414 LOGGER.error("Element(s) in array not properly typed!",e);
415 return null;
416 }
417 }
418
419 @Override
420 protected X_inv03_hasAll.Match arrayToMatchMutable(final Object[] match) {
421 try {
422 return X_inv03_hasAll.Match.newMutableMatch((Dependent) match[POSITION_DEP]);
423 } catch(ClassCastException e) {
424 LOGGER.error("Element(s) in array not properly typed!",e);
425 return null;
426 }
427 }
428
429 /**
430 * @return the singleton instance of the query specification of this pattern
431 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
432 *
433 */
434 public static IQuerySpecification<X_inv03_hasAll.Matcher> querySpecification() {
435 return X_inv03_hasAll.instance();
436 }
437 }
438
439 private X_inv03_hasAll() {
440 super(GeneratedPQuery.INSTANCE);
441 }
442
443 /**
444 * @return the singleton instance of the query specification
445 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
446 *
447 */
448 public static X_inv03_hasAll instance() {
449 try{
450 return LazyHolder.INSTANCE;
451 } catch (ExceptionInInitializerError err) {
452 throw processInitializerError(err);
453 }
454 }
455
456 @Override
457 protected X_inv03_hasAll.Matcher instantiate(final ViatraQueryEngine engine) {
458 return X_inv03_hasAll.Matcher.on(engine);
459 }
460
461 @Override
462 public X_inv03_hasAll.Matcher instantiate() {
463 return X_inv03_hasAll.Matcher.create();
464 }
465
466 @Override
467 public X_inv03_hasAll.Match newEmptyMatch() {
468 return X_inv03_hasAll.Match.newEmptyMatch();
469 }
470
471 @Override
472 public X_inv03_hasAll.Match newMatch(final Object... parameters) {
473 return X_inv03_hasAll.Match.newMatch((Taxation.Dependent) parameters[0]);
474 }
475
476 /**
477 * Inner class allowing the singleton instance of {@link X_inv03_hasAll} to be created
478 * <b>not</b> at the class load time of the outer class,
479 * but rather at the first call to {@link X_inv03_hasAll#instance()}.
480 *
481 * <p> This workaround is required e.g. to support recursion.
482 *
483 */
484 private static class LazyHolder {
485 private static final X_inv03_hasAll INSTANCE = new X_inv03_hasAll();
486
487 /**
488 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
489 * This initialization order is required to support indirect recursion.
490 *
491 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
492 *
493 */
494 private static final Object STATIC_INITIALIZER = ensureInitialized();
495
496 public static Object ensureInitialized() {
497 INSTANCE.ensureInitializedInternal();
498 return null;
499 }
500 }
501
502 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
503 private static final X_inv03_hasAll.GeneratedPQuery INSTANCE = new GeneratedPQuery();
504
505 private final PParameter parameter_dep = new PParameter("dep", "Taxation.Dependent", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Dependent")), PParameterDirection.INOUT);
506
507 private final List<PParameter> parameters = Arrays.asList(parameter_dep);
508
509 private GeneratedPQuery() {
510 super(PVisibility.PUBLIC);
511 }
512
513 @Override
514 public String getFullyQualifiedName() {
515 return "queries.x_inv03_hasAll";
516 }
517
518 @Override
519 public List<String> getParameterNames() {
520 return Arrays.asList("dep");
521 }
522
523 @Override
524 public List<PParameter> getParameters() {
525 return parameters;
526 }
527
528 @Override
529 public Set<PBody> doGetContainedBodies() {
530 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
531 Set<PBody> bodies = new LinkedHashSet<>();
532 {
533 PBody body = new PBody(this);
534 PVariable var_dep = body.getOrCreateVariableByName("dep");
535 PVariable var___0_ = body.getOrCreateVariableByName("_<0>");
536 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
537 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
538 new ExportedParameter(body, var_dep, parameter_dep)
539 ));
540 // Dependent.allowances(dep, _)
541 new TypeConstraint(body, Tuples.flatTupleOf(var_dep), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
542 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
543 new TypeConstraint(body, Tuples.flatTupleOf(var_dep, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Dependent", "allowances")));
544 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "External_Allowance")));
545 new Equality(body, var__virtual_0_, var___0_);
546 bodies.add(body);
547 }
548 return bodies;
549 }
550 }
551}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv05_inRange.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv05_inRange.java
deleted file mode 100644
index aea94873..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv05_inRange.java
+++ /dev/null
@@ -1,630 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Income;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
39import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
40import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
42import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
43import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
44import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
45
46/**
47 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
48 *
49 * <p>Original source:
50 * <code><pre>
51 * pattern x_inv05_inRange(inc : Income) {
52 * Income.details.worked_days(inc, wd);
53 * check(wd {@literal <} 1);
54 * } or {
55 * Income.details.worked_days(inc, wd);
56 * check(wd {@literal >} 25);
57 * }
58 * </pre></code>
59 *
60 * @see Matcher
61 * @see Match
62 *
63 */
64@SuppressWarnings("all")
65public final class X_inv05_inRange extends BaseGeneratedEMFQuerySpecification<X_inv05_inRange.Matcher> {
66 /**
67 * Pattern-specific match representation of the queries.x_inv05_inRange 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 Income fInc;
80
81 private static List<String> parameterNames = makeImmutableList("inc");
82
83 private Match(final Income pInc) {
84 this.fInc = pInc;
85 }
86
87 @Override
88 public Object get(final String parameterName) {
89 switch(parameterName) {
90 case "inc": return this.fInc;
91 default: return null;
92 }
93 }
94
95 @Override
96 public Object get(final int index) {
97 switch(index) {
98 case 0: return this.fInc;
99 default: return null;
100 }
101 }
102
103 public Income getInc() {
104 return this.fInc;
105 }
106
107 @Override
108 public boolean set(final String parameterName, final Object newValue) {
109 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
110 if ("inc".equals(parameterName) ) {
111 this.fInc = (Income) newValue;
112 return true;
113 }
114 return false;
115 }
116
117 public void setInc(final Income pInc) {
118 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
119 this.fInc = pInc;
120 }
121
122 @Override
123 public String patternName() {
124 return "queries.x_inv05_inRange";
125 }
126
127 @Override
128 public List<String> parameterNames() {
129 return X_inv05_inRange.Match.parameterNames;
130 }
131
132 @Override
133 public Object[] toArray() {
134 return new Object[]{fInc};
135 }
136
137 @Override
138 public X_inv05_inRange.Match toImmutable() {
139 return isMutable() ? newMatch(fInc) : this;
140 }
141
142 @Override
143 public String prettyPrint() {
144 StringBuilder result = new StringBuilder();
145 result.append("\"inc\"=" + prettyPrintValue(fInc));
146 return result.toString();
147 }
148
149 @Override
150 public int hashCode() {
151 return Objects.hash(fInc);
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 X_inv05_inRange.Match)) {
162 X_inv05_inRange.Match other = (X_inv05_inRange.Match) obj;
163 return Objects.equals(fInc, other.fInc);
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 X_inv05_inRange specification() {
176 return X_inv05_inRange.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 X_inv05_inRange.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 pInc the fixed value of pattern parameter inc, or null if not bound.
195 * @return the new, mutable (partial) match object.
196 *
197 */
198 public static X_inv05_inRange.Match newMutableMatch(final Income pInc) {
199 return new Mutable(pInc);
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 pInc the fixed value of pattern parameter inc, or null if not bound.
207 * @return the (partial) match object.
208 *
209 */
210 public static X_inv05_inRange.Match newMatch(final Income pInc) {
211 return new Immutable(pInc);
212 }
213
214 private static final class Mutable extends X_inv05_inRange.Match {
215 Mutable(final Income pInc) {
216 super(pInc);
217 }
218
219 @Override
220 public boolean isMutable() {
221 return true;
222 }
223 }
224
225 private static final class Immutable extends X_inv05_inRange.Match {
226 Immutable(final Income pInc) {
227 super(pInc);
228 }
229
230 @Override
231 public boolean isMutable() {
232 return false;
233 }
234 }
235 }
236
237 /**
238 * Generated pattern matcher API of the queries.x_inv05_inRange 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 * pattern x_inv05_inRange(inc : Income) {
249 * Income.details.worked_days(inc, wd);
250 * check(wd {@literal <} 1);
251 * } or {
252 * Income.details.worked_days(inc, wd);
253 * check(wd {@literal >} 25);
254 * }
255 * </pre></code>
256 *
257 * @see Match
258 * @see X_inv05_inRange
259 *
260 */
261 public static class Matcher extends BaseMatcher<X_inv05_inRange.Match> {
262 /**
263 * Initializes the pattern matcher within an existing VIATRA Query engine.
264 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
265 *
266 * @param engine the existing VIATRA Query engine in which this matcher will be created.
267 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
268 *
269 */
270 public static X_inv05_inRange.Matcher on(final ViatraQueryEngine engine) {
271 // check if matcher already exists
272 Matcher matcher = engine.getExistingMatcher(querySpecification());
273 if (matcher == null) {
274 matcher = (Matcher)engine.getMatcher(querySpecification());
275 }
276 return matcher;
277 }
278
279 /**
280 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
281 * @return an initialized matcher
282 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
283 *
284 */
285 public static X_inv05_inRange.Matcher create() {
286 return new Matcher();
287 }
288
289 private static final int POSITION_INC = 0;
290
291 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv05_inRange.Matcher.class);
292
293 /**
294 * Initializes the pattern matcher within an existing VIATRA Query engine.
295 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
296 *
297 * @param engine the existing VIATRA Query engine in which this matcher will be created.
298 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
299 *
300 */
301 private Matcher() {
302 super(querySpecification());
303 }
304
305 /**
306 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
307 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
308 * @return matches represented as a Match object.
309 *
310 */
311 public Collection<X_inv05_inRange.Match> getAllMatches(final Income pInc) {
312 return rawStreamAllMatches(new Object[]{pInc}).collect(Collectors.toSet());
313 }
314
315 /**
316 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
317 * </p>
318 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
319 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
320 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
321 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
322 * @return a stream of matches represented as a Match object.
323 *
324 */
325 public Stream<X_inv05_inRange.Match> streamAllMatches(final Income pInc) {
326 return rawStreamAllMatches(new Object[]{pInc});
327 }
328
329 /**
330 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
331 * Neither determinism nor randomness of selection is guaranteed.
332 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
333 * @return a match represented as a Match object, or null if no match is found.
334 *
335 */
336 public Optional<X_inv05_inRange.Match> getOneArbitraryMatch(final Income pInc) {
337 return rawGetOneArbitraryMatch(new Object[]{pInc});
338 }
339
340 /**
341 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
342 * under any possible substitution of the unspecified parameters (if any).
343 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
344 * @return true if the input is a valid (partial) match of the pattern.
345 *
346 */
347 public boolean hasMatch(final Income pInc) {
348 return rawHasMatch(new Object[]{pInc});
349 }
350
351 /**
352 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
353 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
354 * @return the number of pattern matches found.
355 *
356 */
357 public int countMatches(final Income pInc) {
358 return rawCountMatches(new Object[]{pInc});
359 }
360
361 /**
362 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
363 * Neither determinism nor randomness of selection is guaranteed.
364 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
365 * @param processor the action that will process the selected match.
366 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
367 *
368 */
369 public boolean forOneArbitraryMatch(final Income pInc, final Consumer<? super X_inv05_inRange.Match> processor) {
370 return rawForOneArbitraryMatch(new Object[]{pInc}, processor);
371 }
372
373 /**
374 * Returns a new (partial) match.
375 * This can be used e.g. to call the matcher with a partial match.
376 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
377 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
378 * @return the (partial) match object.
379 *
380 */
381 public X_inv05_inRange.Match newMatch(final Income pInc) {
382 return X_inv05_inRange.Match.newMatch(pInc);
383 }
384
385 /**
386 * Retrieve the set of values that occur in matches for inc.
387 * @return the Set of all values or empty set if there are no matches
388 *
389 */
390 protected Stream<Income> rawStreamAllValuesOfinc(final Object[] parameters) {
391 return rawStreamAllValues(POSITION_INC, parameters).map(Income.class::cast);
392 }
393
394 /**
395 * Retrieve the set of values that occur in matches for inc.
396 * @return the Set of all values or empty set if there are no matches
397 *
398 */
399 public Set<Income> getAllValuesOfinc() {
400 return rawStreamAllValuesOfinc(emptyArray()).collect(Collectors.toSet());
401 }
402
403 /**
404 * Retrieve the set of values that occur in matches for inc.
405 * @return the Set of all values or empty set if there are no matches
406 *
407 */
408 public Stream<Income> streamAllValuesOfinc() {
409 return rawStreamAllValuesOfinc(emptyArray());
410 }
411
412 @Override
413 protected X_inv05_inRange.Match tupleToMatch(final Tuple t) {
414 try {
415 return X_inv05_inRange.Match.newMatch((Income) t.get(POSITION_INC));
416 } catch(ClassCastException e) {
417 LOGGER.error("Element(s) in tuple not properly typed!",e);
418 return null;
419 }
420 }
421
422 @Override
423 protected X_inv05_inRange.Match arrayToMatch(final Object[] match) {
424 try {
425 return X_inv05_inRange.Match.newMatch((Income) match[POSITION_INC]);
426 } catch(ClassCastException e) {
427 LOGGER.error("Element(s) in array not properly typed!",e);
428 return null;
429 }
430 }
431
432 @Override
433 protected X_inv05_inRange.Match arrayToMatchMutable(final Object[] match) {
434 try {
435 return X_inv05_inRange.Match.newMutableMatch((Income) match[POSITION_INC]);
436 } catch(ClassCastException e) {
437 LOGGER.error("Element(s) in array not properly typed!",e);
438 return null;
439 }
440 }
441
442 /**
443 * @return the singleton instance of the query specification of this pattern
444 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
445 *
446 */
447 public static IQuerySpecification<X_inv05_inRange.Matcher> querySpecification() {
448 return X_inv05_inRange.instance();
449 }
450 }
451
452 private X_inv05_inRange() {
453 super(GeneratedPQuery.INSTANCE);
454 }
455
456 /**
457 * @return the singleton instance of the query specification
458 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
459 *
460 */
461 public static X_inv05_inRange instance() {
462 try{
463 return LazyHolder.INSTANCE;
464 } catch (ExceptionInInitializerError err) {
465 throw processInitializerError(err);
466 }
467 }
468
469 @Override
470 protected X_inv05_inRange.Matcher instantiate(final ViatraQueryEngine engine) {
471 return X_inv05_inRange.Matcher.on(engine);
472 }
473
474 @Override
475 public X_inv05_inRange.Matcher instantiate() {
476 return X_inv05_inRange.Matcher.create();
477 }
478
479 @Override
480 public X_inv05_inRange.Match newEmptyMatch() {
481 return X_inv05_inRange.Match.newEmptyMatch();
482 }
483
484 @Override
485 public X_inv05_inRange.Match newMatch(final Object... parameters) {
486 return X_inv05_inRange.Match.newMatch((Taxation.Income) parameters[0]);
487 }
488
489 /**
490 * Inner class allowing the singleton instance of {@link X_inv05_inRange} to be created
491 * <b>not</b> at the class load time of the outer class,
492 * but rather at the first call to {@link X_inv05_inRange#instance()}.
493 *
494 * <p> This workaround is required e.g. to support recursion.
495 *
496 */
497 private static class LazyHolder {
498 private static final X_inv05_inRange INSTANCE = new X_inv05_inRange();
499
500 /**
501 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
502 * This initialization order is required to support indirect recursion.
503 *
504 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
505 *
506 */
507 private static final Object STATIC_INITIALIZER = ensureInitialized();
508
509 public static Object ensureInitialized() {
510 INSTANCE.ensureInitializedInternal();
511 return null;
512 }
513 }
514
515 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
516 private static final X_inv05_inRange.GeneratedPQuery INSTANCE = new GeneratedPQuery();
517
518 private final PParameter parameter_inc = new PParameter("inc", "Taxation.Income", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Income")), PParameterDirection.INOUT);
519
520 private final List<PParameter> parameters = Arrays.asList(parameter_inc);
521
522 private GeneratedPQuery() {
523 super(PVisibility.PUBLIC);
524 }
525
526 @Override
527 public String getFullyQualifiedName() {
528 return "queries.x_inv05_inRange";
529 }
530
531 @Override
532 public List<String> getParameterNames() {
533 return Arrays.asList("inc");
534 }
535
536 @Override
537 public List<PParameter> getParameters() {
538 return parameters;
539 }
540
541 @Override
542 public Set<PBody> doGetContainedBodies() {
543 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
544 Set<PBody> bodies = new LinkedHashSet<>();
545 {
546 PBody body = new PBody(this);
547 PVariable var_inc = body.getOrCreateVariableByName("inc");
548 PVariable var_wd = body.getOrCreateVariableByName("wd");
549 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
550 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
551 new ExportedParameter(body, var_inc, parameter_inc)
552 ));
553 // Income.details.worked_days(inc, wd)
554 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
555 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
556 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
557 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
558 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
559 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "worked_days")));
560 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
561 new Equality(body, var__virtual_1_, var_wd);
562 // check(wd < 1)
563 new ExpressionEvaluation(body, new IExpressionEvaluator() {
564
565 @Override
566 public String getShortDescription() {
567 return "Expression evaluation from pattern x_inv05_inRange";
568 }
569
570 @Override
571 public Iterable<String> getInputParameterNames() {
572 return Arrays.asList("wd");}
573
574 @Override
575 public Object evaluateExpression(IValueProvider provider) throws Exception {
576 Integer wd = (Integer) provider.getValue("wd");
577 return evaluateExpression_1_1(wd);
578 }
579 }, null);
580 bodies.add(body);
581 }
582 {
583 PBody body = new PBody(this);
584 PVariable var_inc = body.getOrCreateVariableByName("inc");
585 PVariable var_wd = body.getOrCreateVariableByName("wd");
586 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
587 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
588 new ExportedParameter(body, var_inc, parameter_inc)
589 ));
590 // Income.details.worked_days(inc, wd)
591 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
592 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
593 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
594 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
595 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
596 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "worked_days")));
597 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
598 new Equality(body, var__virtual_1_, var_wd);
599 // check(wd > 25)
600 new ExpressionEvaluation(body, new IExpressionEvaluator() {
601
602 @Override
603 public String getShortDescription() {
604 return "Expression evaluation from pattern x_inv05_inRange";
605 }
606
607 @Override
608 public Iterable<String> getInputParameterNames() {
609 return Arrays.asList("wd");}
610
611 @Override
612 public Object evaluateExpression(IValueProvider provider) throws Exception {
613 Integer wd = (Integer) provider.getValue("wd");
614 return evaluateExpression_2_1(wd);
615 }
616 }, null);
617 bodies.add(body);
618 }
619 return bodies;
620 }
621 }
622
623 private static boolean evaluateExpression_1_1(final Integer wd) {
624 return ((wd).intValue() < 1);
625 }
626
627 private static boolean evaluateExpression_2_1(final Integer wd) {
628 return ((wd).intValue() > 25);
629 }
630}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_inRange.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_inRange.java
deleted file mode 100644
index b3efea21..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_inRange.java
+++ /dev/null
@@ -1,630 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Income;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
39import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
40import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
42import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
43import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
44import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
45
46/**
47 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
48 *
49 * <p>Original source:
50 * <code><pre>
51 * pattern x_inv08_inRange(inc : Income) {
52 * Income.details.distance(inc, dist);
53 * check(dist {@literal <} 0);
54 * } or {
55 * Income.details.distance(inc, dist);
56 * check(dist {@literal >} 100);
57 * }
58 * </pre></code>
59 *
60 * @see Matcher
61 * @see Match
62 *
63 */
64@SuppressWarnings("all")
65public final class X_inv08_inRange extends BaseGeneratedEMFQuerySpecification<X_inv08_inRange.Matcher> {
66 /**
67 * Pattern-specific match representation of the queries.x_inv08_inRange 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 Income fInc;
80
81 private static List<String> parameterNames = makeImmutableList("inc");
82
83 private Match(final Income pInc) {
84 this.fInc = pInc;
85 }
86
87 @Override
88 public Object get(final String parameterName) {
89 switch(parameterName) {
90 case "inc": return this.fInc;
91 default: return null;
92 }
93 }
94
95 @Override
96 public Object get(final int index) {
97 switch(index) {
98 case 0: return this.fInc;
99 default: return null;
100 }
101 }
102
103 public Income getInc() {
104 return this.fInc;
105 }
106
107 @Override
108 public boolean set(final String parameterName, final Object newValue) {
109 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
110 if ("inc".equals(parameterName) ) {
111 this.fInc = (Income) newValue;
112 return true;
113 }
114 return false;
115 }
116
117 public void setInc(final Income pInc) {
118 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
119 this.fInc = pInc;
120 }
121
122 @Override
123 public String patternName() {
124 return "queries.x_inv08_inRange";
125 }
126
127 @Override
128 public List<String> parameterNames() {
129 return X_inv08_inRange.Match.parameterNames;
130 }
131
132 @Override
133 public Object[] toArray() {
134 return new Object[]{fInc};
135 }
136
137 @Override
138 public X_inv08_inRange.Match toImmutable() {
139 return isMutable() ? newMatch(fInc) : this;
140 }
141
142 @Override
143 public String prettyPrint() {
144 StringBuilder result = new StringBuilder();
145 result.append("\"inc\"=" + prettyPrintValue(fInc));
146 return result.toString();
147 }
148
149 @Override
150 public int hashCode() {
151 return Objects.hash(fInc);
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 X_inv08_inRange.Match)) {
162 X_inv08_inRange.Match other = (X_inv08_inRange.Match) obj;
163 return Objects.equals(fInc, other.fInc);
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 X_inv08_inRange specification() {
176 return X_inv08_inRange.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 X_inv08_inRange.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 pInc the fixed value of pattern parameter inc, or null if not bound.
195 * @return the new, mutable (partial) match object.
196 *
197 */
198 public static X_inv08_inRange.Match newMutableMatch(final Income pInc) {
199 return new Mutable(pInc);
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 pInc the fixed value of pattern parameter inc, or null if not bound.
207 * @return the (partial) match object.
208 *
209 */
210 public static X_inv08_inRange.Match newMatch(final Income pInc) {
211 return new Immutable(pInc);
212 }
213
214 private static final class Mutable extends X_inv08_inRange.Match {
215 Mutable(final Income pInc) {
216 super(pInc);
217 }
218
219 @Override
220 public boolean isMutable() {
221 return true;
222 }
223 }
224
225 private static final class Immutable extends X_inv08_inRange.Match {
226 Immutable(final Income pInc) {
227 super(pInc);
228 }
229
230 @Override
231 public boolean isMutable() {
232 return false;
233 }
234 }
235 }
236
237 /**
238 * Generated pattern matcher API of the queries.x_inv08_inRange 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 * pattern x_inv08_inRange(inc : Income) {
249 * Income.details.distance(inc, dist);
250 * check(dist {@literal <} 0);
251 * } or {
252 * Income.details.distance(inc, dist);
253 * check(dist {@literal >} 100);
254 * }
255 * </pre></code>
256 *
257 * @see Match
258 * @see X_inv08_inRange
259 *
260 */
261 public static class Matcher extends BaseMatcher<X_inv08_inRange.Match> {
262 /**
263 * Initializes the pattern matcher within an existing VIATRA Query engine.
264 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
265 *
266 * @param engine the existing VIATRA Query engine in which this matcher will be created.
267 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
268 *
269 */
270 public static X_inv08_inRange.Matcher on(final ViatraQueryEngine engine) {
271 // check if matcher already exists
272 Matcher matcher = engine.getExistingMatcher(querySpecification());
273 if (matcher == null) {
274 matcher = (Matcher)engine.getMatcher(querySpecification());
275 }
276 return matcher;
277 }
278
279 /**
280 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
281 * @return an initialized matcher
282 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
283 *
284 */
285 public static X_inv08_inRange.Matcher create() {
286 return new Matcher();
287 }
288
289 private static final int POSITION_INC = 0;
290
291 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv08_inRange.Matcher.class);
292
293 /**
294 * Initializes the pattern matcher within an existing VIATRA Query engine.
295 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
296 *
297 * @param engine the existing VIATRA Query engine in which this matcher will be created.
298 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
299 *
300 */
301 private Matcher() {
302 super(querySpecification());
303 }
304
305 /**
306 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
307 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
308 * @return matches represented as a Match object.
309 *
310 */
311 public Collection<X_inv08_inRange.Match> getAllMatches(final Income pInc) {
312 return rawStreamAllMatches(new Object[]{pInc}).collect(Collectors.toSet());
313 }
314
315 /**
316 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
317 * </p>
318 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
319 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
320 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
321 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
322 * @return a stream of matches represented as a Match object.
323 *
324 */
325 public Stream<X_inv08_inRange.Match> streamAllMatches(final Income pInc) {
326 return rawStreamAllMatches(new Object[]{pInc});
327 }
328
329 /**
330 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
331 * Neither determinism nor randomness of selection is guaranteed.
332 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
333 * @return a match represented as a Match object, or null if no match is found.
334 *
335 */
336 public Optional<X_inv08_inRange.Match> getOneArbitraryMatch(final Income pInc) {
337 return rawGetOneArbitraryMatch(new Object[]{pInc});
338 }
339
340 /**
341 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
342 * under any possible substitution of the unspecified parameters (if any).
343 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
344 * @return true if the input is a valid (partial) match of the pattern.
345 *
346 */
347 public boolean hasMatch(final Income pInc) {
348 return rawHasMatch(new Object[]{pInc});
349 }
350
351 /**
352 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
353 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
354 * @return the number of pattern matches found.
355 *
356 */
357 public int countMatches(final Income pInc) {
358 return rawCountMatches(new Object[]{pInc});
359 }
360
361 /**
362 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
363 * Neither determinism nor randomness of selection is guaranteed.
364 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
365 * @param processor the action that will process the selected match.
366 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
367 *
368 */
369 public boolean forOneArbitraryMatch(final Income pInc, final Consumer<? super X_inv08_inRange.Match> processor) {
370 return rawForOneArbitraryMatch(new Object[]{pInc}, processor);
371 }
372
373 /**
374 * Returns a new (partial) match.
375 * This can be used e.g. to call the matcher with a partial match.
376 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
377 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
378 * @return the (partial) match object.
379 *
380 */
381 public X_inv08_inRange.Match newMatch(final Income pInc) {
382 return X_inv08_inRange.Match.newMatch(pInc);
383 }
384
385 /**
386 * Retrieve the set of values that occur in matches for inc.
387 * @return the Set of all values or empty set if there are no matches
388 *
389 */
390 protected Stream<Income> rawStreamAllValuesOfinc(final Object[] parameters) {
391 return rawStreamAllValues(POSITION_INC, parameters).map(Income.class::cast);
392 }
393
394 /**
395 * Retrieve the set of values that occur in matches for inc.
396 * @return the Set of all values or empty set if there are no matches
397 *
398 */
399 public Set<Income> getAllValuesOfinc() {
400 return rawStreamAllValuesOfinc(emptyArray()).collect(Collectors.toSet());
401 }
402
403 /**
404 * Retrieve the set of values that occur in matches for inc.
405 * @return the Set of all values or empty set if there are no matches
406 *
407 */
408 public Stream<Income> streamAllValuesOfinc() {
409 return rawStreamAllValuesOfinc(emptyArray());
410 }
411
412 @Override
413 protected X_inv08_inRange.Match tupleToMatch(final Tuple t) {
414 try {
415 return X_inv08_inRange.Match.newMatch((Income) t.get(POSITION_INC));
416 } catch(ClassCastException e) {
417 LOGGER.error("Element(s) in tuple not properly typed!",e);
418 return null;
419 }
420 }
421
422 @Override
423 protected X_inv08_inRange.Match arrayToMatch(final Object[] match) {
424 try {
425 return X_inv08_inRange.Match.newMatch((Income) match[POSITION_INC]);
426 } catch(ClassCastException e) {
427 LOGGER.error("Element(s) in array not properly typed!",e);
428 return null;
429 }
430 }
431
432 @Override
433 protected X_inv08_inRange.Match arrayToMatchMutable(final Object[] match) {
434 try {
435 return X_inv08_inRange.Match.newMutableMatch((Income) match[POSITION_INC]);
436 } catch(ClassCastException e) {
437 LOGGER.error("Element(s) in array not properly typed!",e);
438 return null;
439 }
440 }
441
442 /**
443 * @return the singleton instance of the query specification of this pattern
444 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
445 *
446 */
447 public static IQuerySpecification<X_inv08_inRange.Matcher> querySpecification() {
448 return X_inv08_inRange.instance();
449 }
450 }
451
452 private X_inv08_inRange() {
453 super(GeneratedPQuery.INSTANCE);
454 }
455
456 /**
457 * @return the singleton instance of the query specification
458 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
459 *
460 */
461 public static X_inv08_inRange instance() {
462 try{
463 return LazyHolder.INSTANCE;
464 } catch (ExceptionInInitializerError err) {
465 throw processInitializerError(err);
466 }
467 }
468
469 @Override
470 protected X_inv08_inRange.Matcher instantiate(final ViatraQueryEngine engine) {
471 return X_inv08_inRange.Matcher.on(engine);
472 }
473
474 @Override
475 public X_inv08_inRange.Matcher instantiate() {
476 return X_inv08_inRange.Matcher.create();
477 }
478
479 @Override
480 public X_inv08_inRange.Match newEmptyMatch() {
481 return X_inv08_inRange.Match.newEmptyMatch();
482 }
483
484 @Override
485 public X_inv08_inRange.Match newMatch(final Object... parameters) {
486 return X_inv08_inRange.Match.newMatch((Taxation.Income) parameters[0]);
487 }
488
489 /**
490 * Inner class allowing the singleton instance of {@link X_inv08_inRange} to be created
491 * <b>not</b> at the class load time of the outer class,
492 * but rather at the first call to {@link X_inv08_inRange#instance()}.
493 *
494 * <p> This workaround is required e.g. to support recursion.
495 *
496 */
497 private static class LazyHolder {
498 private static final X_inv08_inRange INSTANCE = new X_inv08_inRange();
499
500 /**
501 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
502 * This initialization order is required to support indirect recursion.
503 *
504 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
505 *
506 */
507 private static final Object STATIC_INITIALIZER = ensureInitialized();
508
509 public static Object ensureInitialized() {
510 INSTANCE.ensureInitializedInternal();
511 return null;
512 }
513 }
514
515 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
516 private static final X_inv08_inRange.GeneratedPQuery INSTANCE = new GeneratedPQuery();
517
518 private final PParameter parameter_inc = new PParameter("inc", "Taxation.Income", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Income")), PParameterDirection.INOUT);
519
520 private final List<PParameter> parameters = Arrays.asList(parameter_inc);
521
522 private GeneratedPQuery() {
523 super(PVisibility.PUBLIC);
524 }
525
526 @Override
527 public String getFullyQualifiedName() {
528 return "queries.x_inv08_inRange";
529 }
530
531 @Override
532 public List<String> getParameterNames() {
533 return Arrays.asList("inc");
534 }
535
536 @Override
537 public List<PParameter> getParameters() {
538 return parameters;
539 }
540
541 @Override
542 public Set<PBody> doGetContainedBodies() {
543 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
544 Set<PBody> bodies = new LinkedHashSet<>();
545 {
546 PBody body = new PBody(this);
547 PVariable var_inc = body.getOrCreateVariableByName("inc");
548 PVariable var_dist = body.getOrCreateVariableByName("dist");
549 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
550 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
551 new ExportedParameter(body, var_inc, parameter_inc)
552 ));
553 // Income.details.distance(inc, dist)
554 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
555 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
556 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
557 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
558 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
559 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "distance")));
560 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
561 new Equality(body, var__virtual_1_, var_dist);
562 // check(dist < 0)
563 new ExpressionEvaluation(body, new IExpressionEvaluator() {
564
565 @Override
566 public String getShortDescription() {
567 return "Expression evaluation from pattern x_inv08_inRange";
568 }
569
570 @Override
571 public Iterable<String> getInputParameterNames() {
572 return Arrays.asList("dist");}
573
574 @Override
575 public Object evaluateExpression(IValueProvider provider) throws Exception {
576 Double dist = (Double) provider.getValue("dist");
577 return evaluateExpression_1_1(dist);
578 }
579 }, null);
580 bodies.add(body);
581 }
582 {
583 PBody body = new PBody(this);
584 PVariable var_inc = body.getOrCreateVariableByName("inc");
585 PVariable var_dist = body.getOrCreateVariableByName("dist");
586 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
587 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
588 new ExportedParameter(body, var_inc, parameter_inc)
589 ));
590 // Income.details.distance(inc, dist)
591 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
592 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
593 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "details")));
594 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Detail")));
595 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
596 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income_Detail", "distance")));
597 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
598 new Equality(body, var__virtual_1_, var_dist);
599 // check(dist > 100)
600 new ExpressionEvaluation(body, new IExpressionEvaluator() {
601
602 @Override
603 public String getShortDescription() {
604 return "Expression evaluation from pattern x_inv08_inRange";
605 }
606
607 @Override
608 public Iterable<String> getInputParameterNames() {
609 return Arrays.asList("dist");}
610
611 @Override
612 public Object evaluateExpression(IValueProvider provider) throws Exception {
613 Double dist = (Double) provider.getValue("dist");
614 return evaluateExpression_2_1(dist);
615 }
616 }, null);
617 bodies.add(body);
618 }
619 return bodies;
620 }
621 }
622
623 private static boolean evaluateExpression_1_1(final Double dist) {
624 return ((dist).doubleValue() < 0);
625 }
626
627 private static boolean evaluateExpression_2_1(final Double dist) {
628 return ((dist).doubleValue() > 100);
629 }
630}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_noType.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_noType.java
deleted file mode 100644
index 451d7d66..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_noType.java
+++ /dev/null
@@ -1,551 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Income;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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 x_inv08_noType(inc : Income) {
47 * Income.income_type(inc, _);
48 * }
49 * </pre></code>
50 *
51 * @see Matcher
52 * @see Match
53 *
54 */
55@SuppressWarnings("all")
56public final class X_inv08_noType extends BaseGeneratedEMFQuerySpecification<X_inv08_noType.Matcher> {
57 /**
58 * Pattern-specific match representation of the queries.x_inv08_noType 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 Income fInc;
71
72 private static List<String> parameterNames = makeImmutableList("inc");
73
74 private Match(final Income pInc) {
75 this.fInc = pInc;
76 }
77
78 @Override
79 public Object get(final String parameterName) {
80 switch(parameterName) {
81 case "inc": return this.fInc;
82 default: return null;
83 }
84 }
85
86 @Override
87 public Object get(final int index) {
88 switch(index) {
89 case 0: return this.fInc;
90 default: return null;
91 }
92 }
93
94 public Income getInc() {
95 return this.fInc;
96 }
97
98 @Override
99 public boolean set(final String parameterName, final Object newValue) {
100 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
101 if ("inc".equals(parameterName) ) {
102 this.fInc = (Income) newValue;
103 return true;
104 }
105 return false;
106 }
107
108 public void setInc(final Income pInc) {
109 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
110 this.fInc = pInc;
111 }
112
113 @Override
114 public String patternName() {
115 return "queries.x_inv08_noType";
116 }
117
118 @Override
119 public List<String> parameterNames() {
120 return X_inv08_noType.Match.parameterNames;
121 }
122
123 @Override
124 public Object[] toArray() {
125 return new Object[]{fInc};
126 }
127
128 @Override
129 public X_inv08_noType.Match toImmutable() {
130 return isMutable() ? newMatch(fInc) : this;
131 }
132
133 @Override
134 public String prettyPrint() {
135 StringBuilder result = new StringBuilder();
136 result.append("\"inc\"=" + prettyPrintValue(fInc));
137 return result.toString();
138 }
139
140 @Override
141 public int hashCode() {
142 return Objects.hash(fInc);
143 }
144
145 @Override
146 public boolean equals(final Object obj) {
147 if (this == obj)
148 return true;
149 if (obj == null) {
150 return false;
151 }
152 if ((obj instanceof X_inv08_noType.Match)) {
153 X_inv08_noType.Match other = (X_inv08_noType.Match) obj;
154 return Objects.equals(fInc, other.fInc);
155 } else {
156 // this should be infrequent
157 if (!(obj instanceof IPatternMatch)) {
158 return false;
159 }
160 IPatternMatch otherSig = (IPatternMatch) obj;
161 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
162 }
163 }
164
165 @Override
166 public X_inv08_noType specification() {
167 return X_inv08_noType.instance();
168 }
169
170 /**
171 * Returns an empty, mutable match.
172 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
173 *
174 * @return the empty match.
175 *
176 */
177 public static X_inv08_noType.Match newEmptyMatch() {
178 return new Mutable(null);
179 }
180
181 /**
182 * Returns a mutable (partial) match.
183 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
184 *
185 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
186 * @return the new, mutable (partial) match object.
187 *
188 */
189 public static X_inv08_noType.Match newMutableMatch(final Income pInc) {
190 return new Mutable(pInc);
191 }
192
193 /**
194 * Returns a new (partial) match.
195 * This can be used e.g. to call the matcher with a partial match.
196 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
197 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
198 * @return the (partial) match object.
199 *
200 */
201 public static X_inv08_noType.Match newMatch(final Income pInc) {
202 return new Immutable(pInc);
203 }
204
205 private static final class Mutable extends X_inv08_noType.Match {
206 Mutable(final Income pInc) {
207 super(pInc);
208 }
209
210 @Override
211 public boolean isMutable() {
212 return true;
213 }
214 }
215
216 private static final class Immutable extends X_inv08_noType.Match {
217 Immutable(final Income pInc) {
218 super(pInc);
219 }
220
221 @Override
222 public boolean isMutable() {
223 return false;
224 }
225 }
226 }
227
228 /**
229 * Generated pattern matcher API of the queries.x_inv08_noType pattern,
230 * providing pattern-specific query methods.
231 *
232 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
233 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
234 *
235 * <p>Matches of the pattern will be represented as {@link Match}.
236 *
237 * <p>Original source:
238 * <code><pre>
239 * pattern x_inv08_noType(inc : Income) {
240 * Income.income_type(inc, _);
241 * }
242 * </pre></code>
243 *
244 * @see Match
245 * @see X_inv08_noType
246 *
247 */
248 public static class Matcher extends BaseMatcher<X_inv08_noType.Match> {
249 /**
250 * Initializes the pattern matcher within an existing VIATRA Query engine.
251 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
252 *
253 * @param engine the existing VIATRA Query engine in which this matcher will be created.
254 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
255 *
256 */
257 public static X_inv08_noType.Matcher on(final ViatraQueryEngine engine) {
258 // check if matcher already exists
259 Matcher matcher = engine.getExistingMatcher(querySpecification());
260 if (matcher == null) {
261 matcher = (Matcher)engine.getMatcher(querySpecification());
262 }
263 return matcher;
264 }
265
266 /**
267 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
268 * @return an initialized matcher
269 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
270 *
271 */
272 public static X_inv08_noType.Matcher create() {
273 return new Matcher();
274 }
275
276 private static final int POSITION_INC = 0;
277
278 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv08_noType.Matcher.class);
279
280 /**
281 * Initializes the pattern matcher within an existing VIATRA Query engine.
282 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
283 *
284 * @param engine the existing VIATRA Query engine in which this matcher will be created.
285 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
286 *
287 */
288 private Matcher() {
289 super(querySpecification());
290 }
291
292 /**
293 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
294 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
295 * @return matches represented as a Match object.
296 *
297 */
298 public Collection<X_inv08_noType.Match> getAllMatches(final Income pInc) {
299 return rawStreamAllMatches(new Object[]{pInc}).collect(Collectors.toSet());
300 }
301
302 /**
303 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
304 * </p>
305 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
306 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
307 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
308 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
309 * @return a stream of matches represented as a Match object.
310 *
311 */
312 public Stream<X_inv08_noType.Match> streamAllMatches(final Income pInc) {
313 return rawStreamAllMatches(new Object[]{pInc});
314 }
315
316 /**
317 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
318 * Neither determinism nor randomness of selection is guaranteed.
319 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
320 * @return a match represented as a Match object, or null if no match is found.
321 *
322 */
323 public Optional<X_inv08_noType.Match> getOneArbitraryMatch(final Income pInc) {
324 return rawGetOneArbitraryMatch(new Object[]{pInc});
325 }
326
327 /**
328 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
329 * under any possible substitution of the unspecified parameters (if any).
330 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
331 * @return true if the input is a valid (partial) match of the pattern.
332 *
333 */
334 public boolean hasMatch(final Income pInc) {
335 return rawHasMatch(new Object[]{pInc});
336 }
337
338 /**
339 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
340 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
341 * @return the number of pattern matches found.
342 *
343 */
344 public int countMatches(final Income pInc) {
345 return rawCountMatches(new Object[]{pInc});
346 }
347
348 /**
349 * Executes the given processor on 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 pInc the fixed value of pattern parameter inc, or null if not bound.
352 * @param processor the action that will process the selected match.
353 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
354 *
355 */
356 public boolean forOneArbitraryMatch(final Income pInc, final Consumer<? super X_inv08_noType.Match> processor) {
357 return rawForOneArbitraryMatch(new Object[]{pInc}, processor);
358 }
359
360 /**
361 * Returns a new (partial) match.
362 * This can be used e.g. to call the matcher with a partial match.
363 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
364 * @param pInc the fixed value of pattern parameter inc, or null if not bound.
365 * @return the (partial) match object.
366 *
367 */
368 public X_inv08_noType.Match newMatch(final Income pInc) {
369 return X_inv08_noType.Match.newMatch(pInc);
370 }
371
372 /**
373 * Retrieve the set of values that occur in matches for inc.
374 * @return the Set of all values or empty set if there are no matches
375 *
376 */
377 protected Stream<Income> rawStreamAllValuesOfinc(final Object[] parameters) {
378 return rawStreamAllValues(POSITION_INC, parameters).map(Income.class::cast);
379 }
380
381 /**
382 * Retrieve the set of values that occur in matches for inc.
383 * @return the Set of all values or empty set if there are no matches
384 *
385 */
386 public Set<Income> getAllValuesOfinc() {
387 return rawStreamAllValuesOfinc(emptyArray()).collect(Collectors.toSet());
388 }
389
390 /**
391 * Retrieve the set of values that occur in matches for inc.
392 * @return the Set of all values or empty set if there are no matches
393 *
394 */
395 public Stream<Income> streamAllValuesOfinc() {
396 return rawStreamAllValuesOfinc(emptyArray());
397 }
398
399 @Override
400 protected X_inv08_noType.Match tupleToMatch(final Tuple t) {
401 try {
402 return X_inv08_noType.Match.newMatch((Income) t.get(POSITION_INC));
403 } catch(ClassCastException e) {
404 LOGGER.error("Element(s) in tuple not properly typed!",e);
405 return null;
406 }
407 }
408
409 @Override
410 protected X_inv08_noType.Match arrayToMatch(final Object[] match) {
411 try {
412 return X_inv08_noType.Match.newMatch((Income) match[POSITION_INC]);
413 } catch(ClassCastException e) {
414 LOGGER.error("Element(s) in array not properly typed!",e);
415 return null;
416 }
417 }
418
419 @Override
420 protected X_inv08_noType.Match arrayToMatchMutable(final Object[] match) {
421 try {
422 return X_inv08_noType.Match.newMutableMatch((Income) match[POSITION_INC]);
423 } catch(ClassCastException e) {
424 LOGGER.error("Element(s) in array not properly typed!",e);
425 return null;
426 }
427 }
428
429 /**
430 * @return the singleton instance of the query specification of this pattern
431 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
432 *
433 */
434 public static IQuerySpecification<X_inv08_noType.Matcher> querySpecification() {
435 return X_inv08_noType.instance();
436 }
437 }
438
439 private X_inv08_noType() {
440 super(GeneratedPQuery.INSTANCE);
441 }
442
443 /**
444 * @return the singleton instance of the query specification
445 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
446 *
447 */
448 public static X_inv08_noType instance() {
449 try{
450 return LazyHolder.INSTANCE;
451 } catch (ExceptionInInitializerError err) {
452 throw processInitializerError(err);
453 }
454 }
455
456 @Override
457 protected X_inv08_noType.Matcher instantiate(final ViatraQueryEngine engine) {
458 return X_inv08_noType.Matcher.on(engine);
459 }
460
461 @Override
462 public X_inv08_noType.Matcher instantiate() {
463 return X_inv08_noType.Matcher.create();
464 }
465
466 @Override
467 public X_inv08_noType.Match newEmptyMatch() {
468 return X_inv08_noType.Match.newEmptyMatch();
469 }
470
471 @Override
472 public X_inv08_noType.Match newMatch(final Object... parameters) {
473 return X_inv08_noType.Match.newMatch((Taxation.Income) parameters[0]);
474 }
475
476 /**
477 * Inner class allowing the singleton instance of {@link X_inv08_noType} to be created
478 * <b>not</b> at the class load time of the outer class,
479 * but rather at the first call to {@link X_inv08_noType#instance()}.
480 *
481 * <p> This workaround is required e.g. to support recursion.
482 *
483 */
484 private static class LazyHolder {
485 private static final X_inv08_noType INSTANCE = new X_inv08_noType();
486
487 /**
488 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
489 * This initialization order is required to support indirect recursion.
490 *
491 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
492 *
493 */
494 private static final Object STATIC_INITIALIZER = ensureInitialized();
495
496 public static Object ensureInitialized() {
497 INSTANCE.ensureInitializedInternal();
498 return null;
499 }
500 }
501
502 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
503 private static final X_inv08_noType.GeneratedPQuery INSTANCE = new GeneratedPQuery();
504
505 private final PParameter parameter_inc = new PParameter("inc", "Taxation.Income", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Income")), PParameterDirection.INOUT);
506
507 private final List<PParameter> parameters = Arrays.asList(parameter_inc);
508
509 private GeneratedPQuery() {
510 super(PVisibility.PUBLIC);
511 }
512
513 @Override
514 public String getFullyQualifiedName() {
515 return "queries.x_inv08_noType";
516 }
517
518 @Override
519 public List<String> getParameterNames() {
520 return Arrays.asList("inc");
521 }
522
523 @Override
524 public List<PParameter> getParameters() {
525 return parameters;
526 }
527
528 @Override
529 public Set<PBody> doGetContainedBodies() {
530 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
531 Set<PBody> bodies = new LinkedHashSet<>();
532 {
533 PBody body = new PBody(this);
534 PVariable var_inc = body.getOrCreateVariableByName("inc");
535 PVariable var___0_ = body.getOrCreateVariableByName("_<0>");
536 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
537 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
538 new ExportedParameter(body, var_inc, parameter_inc)
539 ));
540 // Income.income_type(inc, _)
541 new TypeConstraint(body, Tuples.flatTupleOf(var_inc), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
542 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
543 new TypeConstraint(body, Tuples.flatTupleOf(var_inc, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "income_type")));
544 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income_Type")));
545 new Equality(body, var__virtual_0_, var___0_);
546 bodies.add(body);
547 }
548 return bodies;
549 }
550 }
551}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_notEI.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_notEI.java
deleted file mode 100644
index 07236028..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv08_notEI.java
+++ /dev/null
@@ -1,544 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Employment_Income;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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 * pattern x_inv08_notEI(type : Employment_Income) {
45 * Employment_Income(type);
46 * }
47 * </pre></code>
48 *
49 * @see Matcher
50 * @see Match
51 *
52 */
53@SuppressWarnings("all")
54public final class X_inv08_notEI extends BaseGeneratedEMFQuerySpecification<X_inv08_notEI.Matcher> {
55 /**
56 * Pattern-specific match representation of the queries.x_inv08_notEI pattern,
57 * to be used in conjunction with {@link Matcher}.
58 *
59 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
60 * Each instance is a (possibly partial) substitution of pattern parameters,
61 * usable to represent a match of the pattern in the result of a query,
62 * or to specify the bound (fixed) input parameters when issuing a query.
63 *
64 * @see Matcher
65 *
66 */
67 public static abstract class Match extends BasePatternMatch {
68 private Employment_Income fType;
69
70 private static List<String> parameterNames = makeImmutableList("type");
71
72 private Match(final Employment_Income pType) {
73 this.fType = pType;
74 }
75
76 @Override
77 public Object get(final String parameterName) {
78 switch(parameterName) {
79 case "type": return this.fType;
80 default: return null;
81 }
82 }
83
84 @Override
85 public Object get(final int index) {
86 switch(index) {
87 case 0: return this.fType;
88 default: return null;
89 }
90 }
91
92 public Employment_Income getType() {
93 return this.fType;
94 }
95
96 @Override
97 public boolean set(final String parameterName, final Object newValue) {
98 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
99 if ("type".equals(parameterName) ) {
100 this.fType = (Employment_Income) newValue;
101 return true;
102 }
103 return false;
104 }
105
106 public void setType(final Employment_Income pType) {
107 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
108 this.fType = pType;
109 }
110
111 @Override
112 public String patternName() {
113 return "queries.x_inv08_notEI";
114 }
115
116 @Override
117 public List<String> parameterNames() {
118 return X_inv08_notEI.Match.parameterNames;
119 }
120
121 @Override
122 public Object[] toArray() {
123 return new Object[]{fType};
124 }
125
126 @Override
127 public X_inv08_notEI.Match toImmutable() {
128 return isMutable() ? newMatch(fType) : this;
129 }
130
131 @Override
132 public String prettyPrint() {
133 StringBuilder result = new StringBuilder();
134 result.append("\"type\"=" + prettyPrintValue(fType));
135 return result.toString();
136 }
137
138 @Override
139 public int hashCode() {
140 return Objects.hash(fType);
141 }
142
143 @Override
144 public boolean equals(final Object obj) {
145 if (this == obj)
146 return true;
147 if (obj == null) {
148 return false;
149 }
150 if ((obj instanceof X_inv08_notEI.Match)) {
151 X_inv08_notEI.Match other = (X_inv08_notEI.Match) obj;
152 return Objects.equals(fType, other.fType);
153 } else {
154 // this should be infrequent
155 if (!(obj instanceof IPatternMatch)) {
156 return false;
157 }
158 IPatternMatch otherSig = (IPatternMatch) obj;
159 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
160 }
161 }
162
163 @Override
164 public X_inv08_notEI specification() {
165 return X_inv08_notEI.instance();
166 }
167
168 /**
169 * Returns an empty, mutable match.
170 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
171 *
172 * @return the empty match.
173 *
174 */
175 public static X_inv08_notEI.Match newEmptyMatch() {
176 return new Mutable(null);
177 }
178
179 /**
180 * Returns a mutable (partial) match.
181 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
182 *
183 * @param pType the fixed value of pattern parameter type, or null if not bound.
184 * @return the new, mutable (partial) match object.
185 *
186 */
187 public static X_inv08_notEI.Match newMutableMatch(final Employment_Income pType) {
188 return new Mutable(pType);
189 }
190
191 /**
192 * Returns a new (partial) match.
193 * This can be used e.g. to call the matcher with a partial match.
194 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
195 * @param pType the fixed value of pattern parameter type, or null if not bound.
196 * @return the (partial) match object.
197 *
198 */
199 public static X_inv08_notEI.Match newMatch(final Employment_Income pType) {
200 return new Immutable(pType);
201 }
202
203 private static final class Mutable extends X_inv08_notEI.Match {
204 Mutable(final Employment_Income pType) {
205 super(pType);
206 }
207
208 @Override
209 public boolean isMutable() {
210 return true;
211 }
212 }
213
214 private static final class Immutable extends X_inv08_notEI.Match {
215 Immutable(final Employment_Income pType) {
216 super(pType);
217 }
218
219 @Override
220 public boolean isMutable() {
221 return false;
222 }
223 }
224 }
225
226 /**
227 * Generated pattern matcher API of the queries.x_inv08_notEI pattern,
228 * providing pattern-specific query methods.
229 *
230 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
231 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
232 *
233 * <p>Matches of the pattern will be represented as {@link Match}.
234 *
235 * <p>Original source:
236 * <code><pre>
237 * pattern x_inv08_notEI(type : Employment_Income) {
238 * Employment_Income(type);
239 * }
240 * </pre></code>
241 *
242 * @see Match
243 * @see X_inv08_notEI
244 *
245 */
246 public static class Matcher extends BaseMatcher<X_inv08_notEI.Match> {
247 /**
248 * Initializes the pattern matcher within an existing VIATRA Query engine.
249 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
250 *
251 * @param engine the existing VIATRA Query engine in which this matcher will be created.
252 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
253 *
254 */
255 public static X_inv08_notEI.Matcher on(final ViatraQueryEngine engine) {
256 // check if matcher already exists
257 Matcher matcher = engine.getExistingMatcher(querySpecification());
258 if (matcher == null) {
259 matcher = (Matcher)engine.getMatcher(querySpecification());
260 }
261 return matcher;
262 }
263
264 /**
265 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
266 * @return an initialized matcher
267 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
268 *
269 */
270 public static X_inv08_notEI.Matcher create() {
271 return new Matcher();
272 }
273
274 private static final int POSITION_TYPE = 0;
275
276 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv08_notEI.Matcher.class);
277
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 private Matcher() {
287 super(querySpecification());
288 }
289
290 /**
291 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
292 * @param pType the fixed value of pattern parameter type, or null if not bound.
293 * @return matches represented as a Match object.
294 *
295 */
296 public Collection<X_inv08_notEI.Match> getAllMatches(final Employment_Income pType) {
297 return rawStreamAllMatches(new Object[]{pType}).collect(Collectors.toSet());
298 }
299
300 /**
301 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
302 * </p>
303 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
304 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
305 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
306 * @param pType the fixed value of pattern parameter type, or null if not bound.
307 * @return a stream of matches represented as a Match object.
308 *
309 */
310 public Stream<X_inv08_notEI.Match> streamAllMatches(final Employment_Income pType) {
311 return rawStreamAllMatches(new Object[]{pType});
312 }
313
314 /**
315 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
316 * Neither determinism nor randomness of selection is guaranteed.
317 * @param pType the fixed value of pattern parameter type, or null if not bound.
318 * @return a match represented as a Match object, or null if no match is found.
319 *
320 */
321 public Optional<X_inv08_notEI.Match> getOneArbitraryMatch(final Employment_Income pType) {
322 return rawGetOneArbitraryMatch(new Object[]{pType});
323 }
324
325 /**
326 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
327 * under any possible substitution of the unspecified parameters (if any).
328 * @param pType the fixed value of pattern parameter type, or null if not bound.
329 * @return true if the input is a valid (partial) match of the pattern.
330 *
331 */
332 public boolean hasMatch(final Employment_Income pType) {
333 return rawHasMatch(new Object[]{pType});
334 }
335
336 /**
337 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
338 * @param pType the fixed value of pattern parameter type, or null if not bound.
339 * @return the number of pattern matches found.
340 *
341 */
342 public int countMatches(final Employment_Income pType) {
343 return rawCountMatches(new Object[]{pType});
344 }
345
346 /**
347 * Executes the given processor on 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 pType the fixed value of pattern parameter type, or null if not bound.
350 * @param processor the action that will process the selected match.
351 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
352 *
353 */
354 public boolean forOneArbitraryMatch(final Employment_Income pType, final Consumer<? super X_inv08_notEI.Match> processor) {
355 return rawForOneArbitraryMatch(new Object[]{pType}, processor);
356 }
357
358 /**
359 * Returns a new (partial) match.
360 * This can be used e.g. to call the matcher with a partial match.
361 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
362 * @param pType the fixed value of pattern parameter type, or null if not bound.
363 * @return the (partial) match object.
364 *
365 */
366 public X_inv08_notEI.Match newMatch(final Employment_Income pType) {
367 return X_inv08_notEI.Match.newMatch(pType);
368 }
369
370 /**
371 * Retrieve the set of values that occur in matches for type.
372 * @return the Set of all values or empty set if there are no matches
373 *
374 */
375 protected Stream<Employment_Income> rawStreamAllValuesOftype(final Object[] parameters) {
376 return rawStreamAllValues(POSITION_TYPE, parameters).map(Employment_Income.class::cast);
377 }
378
379 /**
380 * Retrieve the set of values that occur in matches for type.
381 * @return the Set of all values or empty set if there are no matches
382 *
383 */
384 public Set<Employment_Income> getAllValuesOftype() {
385 return rawStreamAllValuesOftype(emptyArray()).collect(Collectors.toSet());
386 }
387
388 /**
389 * Retrieve the set of values that occur in matches for type.
390 * @return the Set of all values or empty set if there are no matches
391 *
392 */
393 public Stream<Employment_Income> streamAllValuesOftype() {
394 return rawStreamAllValuesOftype(emptyArray());
395 }
396
397 @Override
398 protected X_inv08_notEI.Match tupleToMatch(final Tuple t) {
399 try {
400 return X_inv08_notEI.Match.newMatch((Employment_Income) t.get(POSITION_TYPE));
401 } catch(ClassCastException e) {
402 LOGGER.error("Element(s) in tuple not properly typed!",e);
403 return null;
404 }
405 }
406
407 @Override
408 protected X_inv08_notEI.Match arrayToMatch(final Object[] match) {
409 try {
410 return X_inv08_notEI.Match.newMatch((Employment_Income) match[POSITION_TYPE]);
411 } catch(ClassCastException e) {
412 LOGGER.error("Element(s) in array not properly typed!",e);
413 return null;
414 }
415 }
416
417 @Override
418 protected X_inv08_notEI.Match arrayToMatchMutable(final Object[] match) {
419 try {
420 return X_inv08_notEI.Match.newMutableMatch((Employment_Income) match[POSITION_TYPE]);
421 } catch(ClassCastException e) {
422 LOGGER.error("Element(s) in array not properly typed!",e);
423 return null;
424 }
425 }
426
427 /**
428 * @return the singleton instance of the query specification of this pattern
429 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
430 *
431 */
432 public static IQuerySpecification<X_inv08_notEI.Matcher> querySpecification() {
433 return X_inv08_notEI.instance();
434 }
435 }
436
437 private X_inv08_notEI() {
438 super(GeneratedPQuery.INSTANCE);
439 }
440
441 /**
442 * @return the singleton instance of the query specification
443 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
444 *
445 */
446 public static X_inv08_notEI instance() {
447 try{
448 return LazyHolder.INSTANCE;
449 } catch (ExceptionInInitializerError err) {
450 throw processInitializerError(err);
451 }
452 }
453
454 @Override
455 protected X_inv08_notEI.Matcher instantiate(final ViatraQueryEngine engine) {
456 return X_inv08_notEI.Matcher.on(engine);
457 }
458
459 @Override
460 public X_inv08_notEI.Matcher instantiate() {
461 return X_inv08_notEI.Matcher.create();
462 }
463
464 @Override
465 public X_inv08_notEI.Match newEmptyMatch() {
466 return X_inv08_notEI.Match.newEmptyMatch();
467 }
468
469 @Override
470 public X_inv08_notEI.Match newMatch(final Object... parameters) {
471 return X_inv08_notEI.Match.newMatch((Taxation.Employment_Income) parameters[0]);
472 }
473
474 /**
475 * Inner class allowing the singleton instance of {@link X_inv08_notEI} to be created
476 * <b>not</b> at the class load time of the outer class,
477 * but rather at the first call to {@link X_inv08_notEI#instance()}.
478 *
479 * <p> This workaround is required e.g. to support recursion.
480 *
481 */
482 private static class LazyHolder {
483 private static final X_inv08_notEI INSTANCE = new X_inv08_notEI();
484
485 /**
486 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
487 * This initialization order is required to support indirect recursion.
488 *
489 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
490 *
491 */
492 private static final Object STATIC_INITIALIZER = ensureInitialized();
493
494 public static Object ensureInitialized() {
495 INSTANCE.ensureInitializedInternal();
496 return null;
497 }
498 }
499
500 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
501 private static final X_inv08_notEI.GeneratedPQuery INSTANCE = new GeneratedPQuery();
502
503 private final PParameter parameter_type = new PParameter("type", "Taxation.Employment_Income", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Employment_Income")), PParameterDirection.INOUT);
504
505 private final List<PParameter> parameters = Arrays.asList(parameter_type);
506
507 private GeneratedPQuery() {
508 super(PVisibility.PUBLIC);
509 }
510
511 @Override
512 public String getFullyQualifiedName() {
513 return "queries.x_inv08_notEI";
514 }
515
516 @Override
517 public List<String> getParameterNames() {
518 return Arrays.asList("type");
519 }
520
521 @Override
522 public List<PParameter> getParameters() {
523 return parameters;
524 }
525
526 @Override
527 public Set<PBody> doGetContainedBodies() {
528 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
529 Set<PBody> bodies = new LinkedHashSet<>();
530 {
531 PBody body = new PBody(this);
532 PVariable var_type = body.getOrCreateVariableByName("type");
533 new TypeConstraint(body, Tuples.flatTupleOf(var_type), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Employment_Income")));
534 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
535 new ExportedParameter(body, var_type, parameter_type)
536 ));
537 // Employment_Income(type)
538 new TypeConstraint(body, Tuples.flatTupleOf(var_type), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Employment_Income")));
539 bodies.add(body);
540 }
541 return bodies;
542 }
543 }
544}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv11_incNotOver100.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv11_incNotOver100.java
deleted file mode 100644
index 995946eb..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv11_incNotOver100.java
+++ /dev/null
@@ -1,684 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Expense;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
39import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
40import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
42import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
43import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
44import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
45
46/**
47 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
48 *
49 * <p>Original source:
50 * <code><pre>
51 * pattern x_inv11_incNotOver100(exp : Expense) {
52 * Expense.income.income_amount(exp, incVal);
53 * check(incVal / 2 {@literal <}= 50);
54 * } or {
55 * Expense.declared_amount(exp, decl);
56 * check(decl {@literal <} 50);
57 * } or {
58 * Expense.income.income_amount(exp, incVal);
59 * Expense.declared_amount(exp, decl);
60 * check(decl {@literal >} incVal/2);
61 * }
62 * </pre></code>
63 *
64 * @see Matcher
65 * @see Match
66 *
67 */
68@SuppressWarnings("all")
69public final class X_inv11_incNotOver100 extends BaseGeneratedEMFQuerySpecification<X_inv11_incNotOver100.Matcher> {
70 /**
71 * Pattern-specific match representation of the queries.x_inv11_incNotOver100 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 Expense fExp;
84
85 private static List<String> parameterNames = makeImmutableList("exp");
86
87 private Match(final Expense pExp) {
88 this.fExp = pExp;
89 }
90
91 @Override
92 public Object get(final String parameterName) {
93 switch(parameterName) {
94 case "exp": return this.fExp;
95 default: return null;
96 }
97 }
98
99 @Override
100 public Object get(final int index) {
101 switch(index) {
102 case 0: return this.fExp;
103 default: return null;
104 }
105 }
106
107 public Expense getExp() {
108 return this.fExp;
109 }
110
111 @Override
112 public boolean set(final String parameterName, final Object newValue) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 if ("exp".equals(parameterName) ) {
115 this.fExp = (Expense) newValue;
116 return true;
117 }
118 return false;
119 }
120
121 public void setExp(final Expense pExp) {
122 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
123 this.fExp = pExp;
124 }
125
126 @Override
127 public String patternName() {
128 return "queries.x_inv11_incNotOver100";
129 }
130
131 @Override
132 public List<String> parameterNames() {
133 return X_inv11_incNotOver100.Match.parameterNames;
134 }
135
136 @Override
137 public Object[] toArray() {
138 return new Object[]{fExp};
139 }
140
141 @Override
142 public X_inv11_incNotOver100.Match toImmutable() {
143 return isMutable() ? newMatch(fExp) : this;
144 }
145
146 @Override
147 public String prettyPrint() {
148 StringBuilder result = new StringBuilder();
149 result.append("\"exp\"=" + prettyPrintValue(fExp));
150 return result.toString();
151 }
152
153 @Override
154 public int hashCode() {
155 return Objects.hash(fExp);
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 X_inv11_incNotOver100.Match)) {
166 X_inv11_incNotOver100.Match other = (X_inv11_incNotOver100.Match) obj;
167 return Objects.equals(fExp, other.fExp);
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 X_inv11_incNotOver100 specification() {
180 return X_inv11_incNotOver100.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 X_inv11_incNotOver100.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 pExp the fixed value of pattern parameter exp, or null if not bound.
199 * @return the new, mutable (partial) match object.
200 *
201 */
202 public static X_inv11_incNotOver100.Match newMutableMatch(final Expense pExp) {
203 return new Mutable(pExp);
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 pExp the fixed value of pattern parameter exp, or null if not bound.
211 * @return the (partial) match object.
212 *
213 */
214 public static X_inv11_incNotOver100.Match newMatch(final Expense pExp) {
215 return new Immutable(pExp);
216 }
217
218 private static final class Mutable extends X_inv11_incNotOver100.Match {
219 Mutable(final Expense pExp) {
220 super(pExp);
221 }
222
223 @Override
224 public boolean isMutable() {
225 return true;
226 }
227 }
228
229 private static final class Immutable extends X_inv11_incNotOver100.Match {
230 Immutable(final Expense pExp) {
231 super(pExp);
232 }
233
234 @Override
235 public boolean isMutable() {
236 return false;
237 }
238 }
239 }
240
241 /**
242 * Generated pattern matcher API of the queries.x_inv11_incNotOver100 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 * pattern x_inv11_incNotOver100(exp : Expense) {
253 * Expense.income.income_amount(exp, incVal);
254 * check(incVal / 2 {@literal <}= 50);
255 * } or {
256 * Expense.declared_amount(exp, decl);
257 * check(decl {@literal <} 50);
258 * } or {
259 * Expense.income.income_amount(exp, incVal);
260 * Expense.declared_amount(exp, decl);
261 * check(decl {@literal >} incVal/2);
262 * }
263 * </pre></code>
264 *
265 * @see Match
266 * @see X_inv11_incNotOver100
267 *
268 */
269 public static class Matcher extends BaseMatcher<X_inv11_incNotOver100.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 X_inv11_incNotOver100.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 X_inv11_incNotOver100.Matcher create() {
294 return new Matcher();
295 }
296
297 private static final int POSITION_EXP = 0;
298
299 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv11_incNotOver100.Matcher.class);
300
301 /**
302 * Initializes the pattern matcher within an existing VIATRA Query engine.
303 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
304 *
305 * @param engine the existing VIATRA Query engine in which this matcher will be created.
306 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
307 *
308 */
309 private Matcher() {
310 super(querySpecification());
311 }
312
313 /**
314 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
315 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
316 * @return matches represented as a Match object.
317 *
318 */
319 public Collection<X_inv11_incNotOver100.Match> getAllMatches(final Expense pExp) {
320 return rawStreamAllMatches(new Object[]{pExp}).collect(Collectors.toSet());
321 }
322
323 /**
324 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
325 * </p>
326 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
327 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
328 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
329 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
330 * @return a stream of matches represented as a Match object.
331 *
332 */
333 public Stream<X_inv11_incNotOver100.Match> streamAllMatches(final Expense pExp) {
334 return rawStreamAllMatches(new Object[]{pExp});
335 }
336
337 /**
338 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
339 * Neither determinism nor randomness of selection is guaranteed.
340 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
341 * @return a match represented as a Match object, or null if no match is found.
342 *
343 */
344 public Optional<X_inv11_incNotOver100.Match> getOneArbitraryMatch(final Expense pExp) {
345 return rawGetOneArbitraryMatch(new Object[]{pExp});
346 }
347
348 /**
349 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
350 * under any possible substitution of the unspecified parameters (if any).
351 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
352 * @return true if the input is a valid (partial) match of the pattern.
353 *
354 */
355 public boolean hasMatch(final Expense pExp) {
356 return rawHasMatch(new Object[]{pExp});
357 }
358
359 /**
360 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
361 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
362 * @return the number of pattern matches found.
363 *
364 */
365 public int countMatches(final Expense pExp) {
366 return rawCountMatches(new Object[]{pExp});
367 }
368
369 /**
370 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
371 * Neither determinism nor randomness of selection is guaranteed.
372 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
373 * @param processor the action that will process the selected match.
374 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
375 *
376 */
377 public boolean forOneArbitraryMatch(final Expense pExp, final Consumer<? super X_inv11_incNotOver100.Match> processor) {
378 return rawForOneArbitraryMatch(new Object[]{pExp}, processor);
379 }
380
381 /**
382 * Returns a new (partial) match.
383 * This can be used e.g. to call the matcher with a partial match.
384 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
385 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
386 * @return the (partial) match object.
387 *
388 */
389 public X_inv11_incNotOver100.Match newMatch(final Expense pExp) {
390 return X_inv11_incNotOver100.Match.newMatch(pExp);
391 }
392
393 /**
394 * Retrieve the set of values that occur in matches for exp.
395 * @return the Set of all values or empty set if there are no matches
396 *
397 */
398 protected Stream<Expense> rawStreamAllValuesOfexp(final Object[] parameters) {
399 return rawStreamAllValues(POSITION_EXP, parameters).map(Expense.class::cast);
400 }
401
402 /**
403 * Retrieve the set of values that occur in matches for exp.
404 * @return the Set of all values or empty set if there are no matches
405 *
406 */
407 public Set<Expense> getAllValuesOfexp() {
408 return rawStreamAllValuesOfexp(emptyArray()).collect(Collectors.toSet());
409 }
410
411 /**
412 * Retrieve the set of values that occur in matches for exp.
413 * @return the Set of all values or empty set if there are no matches
414 *
415 */
416 public Stream<Expense> streamAllValuesOfexp() {
417 return rawStreamAllValuesOfexp(emptyArray());
418 }
419
420 @Override
421 protected X_inv11_incNotOver100.Match tupleToMatch(final Tuple t) {
422 try {
423 return X_inv11_incNotOver100.Match.newMatch((Expense) t.get(POSITION_EXP));
424 } catch(ClassCastException e) {
425 LOGGER.error("Element(s) in tuple not properly typed!",e);
426 return null;
427 }
428 }
429
430 @Override
431 protected X_inv11_incNotOver100.Match arrayToMatch(final Object[] match) {
432 try {
433 return X_inv11_incNotOver100.Match.newMatch((Expense) match[POSITION_EXP]);
434 } catch(ClassCastException e) {
435 LOGGER.error("Element(s) in array not properly typed!",e);
436 return null;
437 }
438 }
439
440 @Override
441 protected X_inv11_incNotOver100.Match arrayToMatchMutable(final Object[] match) {
442 try {
443 return X_inv11_incNotOver100.Match.newMutableMatch((Expense) match[POSITION_EXP]);
444 } catch(ClassCastException e) {
445 LOGGER.error("Element(s) in array not properly typed!",e);
446 return null;
447 }
448 }
449
450 /**
451 * @return the singleton instance of the query specification of this pattern
452 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
453 *
454 */
455 public static IQuerySpecification<X_inv11_incNotOver100.Matcher> querySpecification() {
456 return X_inv11_incNotOver100.instance();
457 }
458 }
459
460 private X_inv11_incNotOver100() {
461 super(GeneratedPQuery.INSTANCE);
462 }
463
464 /**
465 * @return the singleton instance of the query specification
466 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
467 *
468 */
469 public static X_inv11_incNotOver100 instance() {
470 try{
471 return LazyHolder.INSTANCE;
472 } catch (ExceptionInInitializerError err) {
473 throw processInitializerError(err);
474 }
475 }
476
477 @Override
478 protected X_inv11_incNotOver100.Matcher instantiate(final ViatraQueryEngine engine) {
479 return X_inv11_incNotOver100.Matcher.on(engine);
480 }
481
482 @Override
483 public X_inv11_incNotOver100.Matcher instantiate() {
484 return X_inv11_incNotOver100.Matcher.create();
485 }
486
487 @Override
488 public X_inv11_incNotOver100.Match newEmptyMatch() {
489 return X_inv11_incNotOver100.Match.newEmptyMatch();
490 }
491
492 @Override
493 public X_inv11_incNotOver100.Match newMatch(final Object... parameters) {
494 return X_inv11_incNotOver100.Match.newMatch((Taxation.Expense) parameters[0]);
495 }
496
497 /**
498 * Inner class allowing the singleton instance of {@link X_inv11_incNotOver100} to be created
499 * <b>not</b> at the class load time of the outer class,
500 * but rather at the first call to {@link X_inv11_incNotOver100#instance()}.
501 *
502 * <p> This workaround is required e.g. to support recursion.
503 *
504 */
505 private static class LazyHolder {
506 private static final X_inv11_incNotOver100 INSTANCE = new X_inv11_incNotOver100();
507
508 /**
509 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
510 * This initialization order is required to support indirect recursion.
511 *
512 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
513 *
514 */
515 private static final Object STATIC_INITIALIZER = ensureInitialized();
516
517 public static Object ensureInitialized() {
518 INSTANCE.ensureInitializedInternal();
519 return null;
520 }
521 }
522
523 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
524 private static final X_inv11_incNotOver100.GeneratedPQuery INSTANCE = new GeneratedPQuery();
525
526 private final PParameter parameter_exp = new PParameter("exp", "Taxation.Expense", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Expense")), PParameterDirection.INOUT);
527
528 private final List<PParameter> parameters = Arrays.asList(parameter_exp);
529
530 private GeneratedPQuery() {
531 super(PVisibility.PUBLIC);
532 }
533
534 @Override
535 public String getFullyQualifiedName() {
536 return "queries.x_inv11_incNotOver100";
537 }
538
539 @Override
540 public List<String> getParameterNames() {
541 return Arrays.asList("exp");
542 }
543
544 @Override
545 public List<PParameter> getParameters() {
546 return parameters;
547 }
548
549 @Override
550 public Set<PBody> doGetContainedBodies() {
551 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
552 Set<PBody> bodies = new LinkedHashSet<>();
553 {
554 PBody body = new PBody(this);
555 PVariable var_exp = body.getOrCreateVariableByName("exp");
556 PVariable var_incVal = body.getOrCreateVariableByName("incVal");
557 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
558 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
559 new ExportedParameter(body, var_exp, parameter_exp)
560 ));
561 // Expense.income.income_amount(exp, incVal)
562 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
563 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
564 new TypeConstraint(body, Tuples.flatTupleOf(var_exp, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Expense", "income")));
565 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
566 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
567 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "income_amount")));
568 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
569 new Equality(body, var__virtual_1_, var_incVal);
570 // check(incVal / 2 <= 50)
571 new ExpressionEvaluation(body, new IExpressionEvaluator() {
572
573 @Override
574 public String getShortDescription() {
575 return "Expression evaluation from pattern x_inv11_incNotOver100";
576 }
577
578 @Override
579 public Iterable<String> getInputParameterNames() {
580 return Arrays.asList("incVal");}
581
582 @Override
583 public Object evaluateExpression(IValueProvider provider) throws Exception {
584 Double incVal = (Double) provider.getValue("incVal");
585 return evaluateExpression_1_1(incVal);
586 }
587 }, null);
588 bodies.add(body);
589 }
590 {
591 PBody body = new PBody(this);
592 PVariable var_exp = body.getOrCreateVariableByName("exp");
593 PVariable var_decl = body.getOrCreateVariableByName("decl");
594 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
595 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
596 new ExportedParameter(body, var_exp, parameter_exp)
597 ));
598 // Expense.declared_amount(exp, decl)
599 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
600 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
601 new TypeConstraint(body, Tuples.flatTupleOf(var_exp, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Expense", "declared_amount")));
602 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
603 new Equality(body, var__virtual_0_, var_decl);
604 // check(decl < 50)
605 new ExpressionEvaluation(body, new IExpressionEvaluator() {
606
607 @Override
608 public String getShortDescription() {
609 return "Expression evaluation from pattern x_inv11_incNotOver100";
610 }
611
612 @Override
613 public Iterable<String> getInputParameterNames() {
614 return Arrays.asList("decl");}
615
616 @Override
617 public Object evaluateExpression(IValueProvider provider) throws Exception {
618 Double decl = (Double) provider.getValue("decl");
619 return evaluateExpression_2_1(decl);
620 }
621 }, null);
622 bodies.add(body);
623 }
624 {
625 PBody body = new PBody(this);
626 PVariable var_exp = body.getOrCreateVariableByName("exp");
627 PVariable var_incVal = body.getOrCreateVariableByName("incVal");
628 PVariable var_decl = body.getOrCreateVariableByName("decl");
629 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
630 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
631 new ExportedParameter(body, var_exp, parameter_exp)
632 ));
633 // Expense.income.income_amount(exp, incVal)
634 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
635 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
636 new TypeConstraint(body, Tuples.flatTupleOf(var_exp, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Expense", "income")));
637 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
638 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
639 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "income_amount")));
640 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
641 new Equality(body, var__virtual_1_, var_incVal);
642 // Expense.declared_amount(exp, decl)
643 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
644 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
645 new TypeConstraint(body, Tuples.flatTupleOf(var_exp, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Expense", "declared_amount")));
646 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
647 new Equality(body, var__virtual_2_, var_decl);
648 // check(decl > incVal/2)
649 new ExpressionEvaluation(body, new IExpressionEvaluator() {
650
651 @Override
652 public String getShortDescription() {
653 return "Expression evaluation from pattern x_inv11_incNotOver100";
654 }
655
656 @Override
657 public Iterable<String> getInputParameterNames() {
658 return Arrays.asList("decl", "incVal");}
659
660 @Override
661 public Object evaluateExpression(IValueProvider provider) throws Exception {
662 Double decl = (Double) provider.getValue("decl");
663 Double incVal = (Double) provider.getValue("incVal");
664 return evaluateExpression_3_1(decl, incVal);
665 }
666 }, null);
667 bodies.add(body);
668 }
669 return bodies;
670 }
671 }
672
673 private static boolean evaluateExpression_1_1(final Double incVal) {
674 return (((incVal).doubleValue() / 2) <= 50);
675 }
676
677 private static boolean evaluateExpression_2_1(final Double decl) {
678 return ((decl).doubleValue() < 50);
679 }
680
681 private static boolean evaluateExpression_3_1(final Double decl, final Double incVal) {
682 return ((decl).doubleValue() > ((incVal).doubleValue() / 2));
683 }
684}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv11_incOver100.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv11_incOver100.java
deleted file mode 100644
index 65ae5dd6..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv11_incOver100.java
+++ /dev/null
@@ -1,629 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Expense;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
39import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
40import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
42import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
43import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
44import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
45
46/**
47 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
48 *
49 * <p>Original source:
50 * <code><pre>
51 * pattern x_inv11_incOver100(exp : Expense) {
52 * Expense.income.income_amount(exp, incVal);
53 * check(incVal / 2 {@literal >} 50);
54 *
55 * } or {
56 * Expense.declared_amount(exp, decl);
57 * check(decl != 50);
58 * }
59 * </pre></code>
60 *
61 * @see Matcher
62 * @see Match
63 *
64 */
65@SuppressWarnings("all")
66public final class X_inv11_incOver100 extends BaseGeneratedEMFQuerySpecification<X_inv11_incOver100.Matcher> {
67 /**
68 * Pattern-specific match representation of the queries.x_inv11_incOver100 pattern,
69 * to be used in conjunction with {@link Matcher}.
70 *
71 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
72 * Each instance is a (possibly partial) substitution of pattern parameters,
73 * usable to represent a match of the pattern in the result of a query,
74 * or to specify the bound (fixed) input parameters when issuing a query.
75 *
76 * @see Matcher
77 *
78 */
79 public static abstract class Match extends BasePatternMatch {
80 private Expense fExp;
81
82 private static List<String> parameterNames = makeImmutableList("exp");
83
84 private Match(final Expense pExp) {
85 this.fExp = pExp;
86 }
87
88 @Override
89 public Object get(final String parameterName) {
90 switch(parameterName) {
91 case "exp": return this.fExp;
92 default: return null;
93 }
94 }
95
96 @Override
97 public Object get(final int index) {
98 switch(index) {
99 case 0: return this.fExp;
100 default: return null;
101 }
102 }
103
104 public Expense getExp() {
105 return this.fExp;
106 }
107
108 @Override
109 public boolean set(final String parameterName, final Object newValue) {
110 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
111 if ("exp".equals(parameterName) ) {
112 this.fExp = (Expense) newValue;
113 return true;
114 }
115 return false;
116 }
117
118 public void setExp(final Expense pExp) {
119 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
120 this.fExp = pExp;
121 }
122
123 @Override
124 public String patternName() {
125 return "queries.x_inv11_incOver100";
126 }
127
128 @Override
129 public List<String> parameterNames() {
130 return X_inv11_incOver100.Match.parameterNames;
131 }
132
133 @Override
134 public Object[] toArray() {
135 return new Object[]{fExp};
136 }
137
138 @Override
139 public X_inv11_incOver100.Match toImmutable() {
140 return isMutable() ? newMatch(fExp) : this;
141 }
142
143 @Override
144 public String prettyPrint() {
145 StringBuilder result = new StringBuilder();
146 result.append("\"exp\"=" + prettyPrintValue(fExp));
147 return result.toString();
148 }
149
150 @Override
151 public int hashCode() {
152 return Objects.hash(fExp);
153 }
154
155 @Override
156 public boolean equals(final Object obj) {
157 if (this == obj)
158 return true;
159 if (obj == null) {
160 return false;
161 }
162 if ((obj instanceof X_inv11_incOver100.Match)) {
163 X_inv11_incOver100.Match other = (X_inv11_incOver100.Match) obj;
164 return Objects.equals(fExp, other.fExp);
165 } else {
166 // this should be infrequent
167 if (!(obj instanceof IPatternMatch)) {
168 return false;
169 }
170 IPatternMatch otherSig = (IPatternMatch) obj;
171 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
172 }
173 }
174
175 @Override
176 public X_inv11_incOver100 specification() {
177 return X_inv11_incOver100.instance();
178 }
179
180 /**
181 * Returns an empty, mutable match.
182 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
183 *
184 * @return the empty match.
185 *
186 */
187 public static X_inv11_incOver100.Match newEmptyMatch() {
188 return new Mutable(null);
189 }
190
191 /**
192 * Returns a mutable (partial) match.
193 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
194 *
195 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
196 * @return the new, mutable (partial) match object.
197 *
198 */
199 public static X_inv11_incOver100.Match newMutableMatch(final Expense pExp) {
200 return new Mutable(pExp);
201 }
202
203 /**
204 * Returns a new (partial) match.
205 * This can be used e.g. to call the matcher with a partial match.
206 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
207 * @param pExp the fixed value of pattern parameter exp, or null if not bound.
208 * @return the (partial) match object.
209 *
210 */
211 public static X_inv11_incOver100.Match newMatch(final Expense pExp) {
212 return new Immutable(pExp);
213 }
214
215 private static final class Mutable extends X_inv11_incOver100.Match {
216 Mutable(final Expense pExp) {
217 super(pExp);
218 }
219
220 @Override
221 public boolean isMutable() {
222 return true;
223 }
224 }
225
226 private static final class Immutable extends X_inv11_incOver100.Match {
227 Immutable(final Expense pExp) {
228 super(pExp);
229 }
230
231 @Override
232 public boolean isMutable() {
233 return false;
234 }
235 }
236 }
237
238 /**
239 * Generated pattern matcher API of the queries.x_inv11_incOver100 pattern,
240 * providing pattern-specific query methods.
241 *
242 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
243 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
244 *
245 * <p>Matches of the pattern will be represented as {@link Match}.
246 *
247 * <p>Original source:
248 * <code><pre>
249 * pattern x_inv11_incOver100(exp : Expense) {
250 * Expense.income.income_amount(exp, incVal);
251 * check(incVal / 2 {@literal >} 50);
252 *
253 * } or {
254 * Expense.declared_amount(exp, decl);
255 * check(decl != 50);
256 * }
257 * </pre></code>
258 *
259 * @see Match
260 * @see X_inv11_incOver100
261 *
262 */
263 public static class Matcher extends BaseMatcher<X_inv11_incOver100.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 X_inv11_incOver100.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 X_inv11_incOver100.Matcher create() {
288 return new Matcher();
289 }
290
291 private static final int POSITION_EXP = 0;
292
293 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv11_incOver100.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 pExp the fixed value of pattern parameter exp, or null if not bound.
310 * @return matches represented as a Match object.
311 *
312 */
313 public Collection<X_inv11_incOver100.Match> getAllMatches(final Expense pExp) {
314 return rawStreamAllMatches(new Object[]{pExp}).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 pExp the fixed value of pattern parameter exp, or null if not bound.
324 * @return a stream of matches represented as a Match object.
325 *
326 */
327 public Stream<X_inv11_incOver100.Match> streamAllMatches(final Expense pExp) {
328 return rawStreamAllMatches(new Object[]{pExp});
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 pExp the fixed value of pattern parameter exp, 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<X_inv11_incOver100.Match> getOneArbitraryMatch(final Expense pExp) {
339 return rawGetOneArbitraryMatch(new Object[]{pExp});
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 pExp the fixed value of pattern parameter exp, 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 Expense pExp) {
350 return rawHasMatch(new Object[]{pExp});
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 pExp the fixed value of pattern parameter exp, or null if not bound.
356 * @return the number of pattern matches found.
357 *
358 */
359 public int countMatches(final Expense pExp) {
360 return rawCountMatches(new Object[]{pExp});
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 pExp the fixed value of pattern parameter exp, 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 Expense pExp, final Consumer<? super X_inv11_incOver100.Match> processor) {
372 return rawForOneArbitraryMatch(new Object[]{pExp}, 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 pExp the fixed value of pattern parameter exp, or null if not bound.
380 * @return the (partial) match object.
381 *
382 */
383 public X_inv11_incOver100.Match newMatch(final Expense pExp) {
384 return X_inv11_incOver100.Match.newMatch(pExp);
385 }
386
387 /**
388 * Retrieve the set of values that occur in matches for exp.
389 * @return the Set of all values or empty set if there are no matches
390 *
391 */
392 protected Stream<Expense> rawStreamAllValuesOfexp(final Object[] parameters) {
393 return rawStreamAllValues(POSITION_EXP, parameters).map(Expense.class::cast);
394 }
395
396 /**
397 * Retrieve the set of values that occur in matches for exp.
398 * @return the Set of all values or empty set if there are no matches
399 *
400 */
401 public Set<Expense> getAllValuesOfexp() {
402 return rawStreamAllValuesOfexp(emptyArray()).collect(Collectors.toSet());
403 }
404
405 /**
406 * Retrieve the set of values that occur in matches for exp.
407 * @return the Set of all values or empty set if there are no matches
408 *
409 */
410 public Stream<Expense> streamAllValuesOfexp() {
411 return rawStreamAllValuesOfexp(emptyArray());
412 }
413
414 @Override
415 protected X_inv11_incOver100.Match tupleToMatch(final Tuple t) {
416 try {
417 return X_inv11_incOver100.Match.newMatch((Expense) t.get(POSITION_EXP));
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 X_inv11_incOver100.Match arrayToMatch(final Object[] match) {
426 try {
427 return X_inv11_incOver100.Match.newMatch((Expense) match[POSITION_EXP]);
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 X_inv11_incOver100.Match arrayToMatchMutable(final Object[] match) {
436 try {
437 return X_inv11_incOver100.Match.newMutableMatch((Expense) match[POSITION_EXP]);
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<X_inv11_incOver100.Matcher> querySpecification() {
450 return X_inv11_incOver100.instance();
451 }
452 }
453
454 private X_inv11_incOver100() {
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 X_inv11_incOver100 instance() {
464 try{
465 return LazyHolder.INSTANCE;
466 } catch (ExceptionInInitializerError err) {
467 throw processInitializerError(err);
468 }
469 }
470
471 @Override
472 protected X_inv11_incOver100.Matcher instantiate(final ViatraQueryEngine engine) {
473 return X_inv11_incOver100.Matcher.on(engine);
474 }
475
476 @Override
477 public X_inv11_incOver100.Matcher instantiate() {
478 return X_inv11_incOver100.Matcher.create();
479 }
480
481 @Override
482 public X_inv11_incOver100.Match newEmptyMatch() {
483 return X_inv11_incOver100.Match.newEmptyMatch();
484 }
485
486 @Override
487 public X_inv11_incOver100.Match newMatch(final Object... parameters) {
488 return X_inv11_incOver100.Match.newMatch((Taxation.Expense) parameters[0]);
489 }
490
491 /**
492 * Inner class allowing the singleton instance of {@link X_inv11_incOver100} 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 X_inv11_incOver100#instance()}.
495 *
496 * <p> This workaround is required e.g. to support recursion.
497 *
498 */
499 private static class LazyHolder {
500 private static final X_inv11_incOver100 INSTANCE = new X_inv11_incOver100();
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 X_inv11_incOver100.GeneratedPQuery INSTANCE = new GeneratedPQuery();
519
520 private final PParameter parameter_exp = new PParameter("exp", "Taxation.Expense", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Expense")), PParameterDirection.INOUT);
521
522 private final List<PParameter> parameters = Arrays.asList(parameter_exp);
523
524 private GeneratedPQuery() {
525 super(PVisibility.PUBLIC);
526 }
527
528 @Override
529 public String getFullyQualifiedName() {
530 return "queries.x_inv11_incOver100";
531 }
532
533 @Override
534 public List<String> getParameterNames() {
535 return Arrays.asList("exp");
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_exp = body.getOrCreateVariableByName("exp");
550 PVariable var_incVal = body.getOrCreateVariableByName("incVal");
551 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
552 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
553 new ExportedParameter(body, var_exp, parameter_exp)
554 ));
555 // Expense.income.income_amount(exp, incVal)
556 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
557 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
558 new TypeConstraint(body, Tuples.flatTupleOf(var_exp, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Expense", "income")));
559 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Income")));
560 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
561 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Income", "income_amount")));
562 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
563 new Equality(body, var__virtual_1_, var_incVal);
564 // check(incVal / 2 > 50)
565 new ExpressionEvaluation(body, new IExpressionEvaluator() {
566
567 @Override
568 public String getShortDescription() {
569 return "Expression evaluation from pattern x_inv11_incOver100";
570 }
571
572 @Override
573 public Iterable<String> getInputParameterNames() {
574 return Arrays.asList("incVal");}
575
576 @Override
577 public Object evaluateExpression(IValueProvider provider) throws Exception {
578 Double incVal = (Double) provider.getValue("incVal");
579 return evaluateExpression_1_1(incVal);
580 }
581 }, null);
582 bodies.add(body);
583 }
584 {
585 PBody body = new PBody(this);
586 PVariable var_exp = body.getOrCreateVariableByName("exp");
587 PVariable var_decl = body.getOrCreateVariableByName("decl");
588 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
589 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
590 new ExportedParameter(body, var_exp, parameter_exp)
591 ));
592 // Expense.declared_amount(exp, decl)
593 new TypeConstraint(body, Tuples.flatTupleOf(var_exp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Expense")));
594 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
595 new TypeConstraint(body, Tuples.flatTupleOf(var_exp, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Expense", "declared_amount")));
596 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
597 new Equality(body, var__virtual_0_, var_decl);
598 // check(decl != 50)
599 new ExpressionEvaluation(body, new IExpressionEvaluator() {
600
601 @Override
602 public String getShortDescription() {
603 return "Expression evaluation from pattern x_inv11_incOver100";
604 }
605
606 @Override
607 public Iterable<String> getInputParameterNames() {
608 return Arrays.asList("decl");}
609
610 @Override
611 public Object evaluateExpression(IValueProvider provider) throws Exception {
612 Double decl = (Double) provider.getValue("decl");
613 return evaluateExpression_2_1(decl);
614 }
615 }, null);
616 bodies.add(body);
617 }
618 return bodies;
619 }
620 }
621
622 private static boolean evaluateExpression_1_1(final Double incVal) {
623 return (((incVal).doubleValue() / 2) > 50);
624 }
625
626 private static boolean evaluateExpression_2_1(final Double decl) {
627 return ((decl).doubleValue() != 50);
628 }
629}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv12_notNonRes.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv12_notNonRes.java
deleted file mode 100644
index 96aea5e8..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv12_notNonRes.java
+++ /dev/null
@@ -1,544 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Non_Resident_Tax_Payer;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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 * pattern x_inv12_notNonRes(tp : Non_Resident_Tax_Payer) {
45 * Non_Resident_Tax_Payer(tp);
46 * }
47 * </pre></code>
48 *
49 * @see Matcher
50 * @see Match
51 *
52 */
53@SuppressWarnings("all")
54public final class X_inv12_notNonRes extends BaseGeneratedEMFQuerySpecification<X_inv12_notNonRes.Matcher> {
55 /**
56 * Pattern-specific match representation of the queries.x_inv12_notNonRes pattern,
57 * to be used in conjunction with {@link Matcher}.
58 *
59 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
60 * Each instance is a (possibly partial) substitution of pattern parameters,
61 * usable to represent a match of the pattern in the result of a query,
62 * or to specify the bound (fixed) input parameters when issuing a query.
63 *
64 * @see Matcher
65 *
66 */
67 public static abstract class Match extends BasePatternMatch {
68 private Non_Resident_Tax_Payer fTp;
69
70 private static List<String> parameterNames = makeImmutableList("tp");
71
72 private Match(final Non_Resident_Tax_Payer pTp) {
73 this.fTp = pTp;
74 }
75
76 @Override
77 public Object get(final String parameterName) {
78 switch(parameterName) {
79 case "tp": return this.fTp;
80 default: return null;
81 }
82 }
83
84 @Override
85 public Object get(final int index) {
86 switch(index) {
87 case 0: return this.fTp;
88 default: return null;
89 }
90 }
91
92 public Non_Resident_Tax_Payer getTp() {
93 return this.fTp;
94 }
95
96 @Override
97 public boolean set(final String parameterName, final Object newValue) {
98 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
99 if ("tp".equals(parameterName) ) {
100 this.fTp = (Non_Resident_Tax_Payer) newValue;
101 return true;
102 }
103 return false;
104 }
105
106 public void setTp(final Non_Resident_Tax_Payer pTp) {
107 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
108 this.fTp = pTp;
109 }
110
111 @Override
112 public String patternName() {
113 return "queries.x_inv12_notNonRes";
114 }
115
116 @Override
117 public List<String> parameterNames() {
118 return X_inv12_notNonRes.Match.parameterNames;
119 }
120
121 @Override
122 public Object[] toArray() {
123 return new Object[]{fTp};
124 }
125
126 @Override
127 public X_inv12_notNonRes.Match toImmutable() {
128 return isMutable() ? newMatch(fTp) : this;
129 }
130
131 @Override
132 public String prettyPrint() {
133 StringBuilder result = new StringBuilder();
134 result.append("\"tp\"=" + prettyPrintValue(fTp));
135 return result.toString();
136 }
137
138 @Override
139 public int hashCode() {
140 return Objects.hash(fTp);
141 }
142
143 @Override
144 public boolean equals(final Object obj) {
145 if (this == obj)
146 return true;
147 if (obj == null) {
148 return false;
149 }
150 if ((obj instanceof X_inv12_notNonRes.Match)) {
151 X_inv12_notNonRes.Match other = (X_inv12_notNonRes.Match) obj;
152 return Objects.equals(fTp, other.fTp);
153 } else {
154 // this should be infrequent
155 if (!(obj instanceof IPatternMatch)) {
156 return false;
157 }
158 IPatternMatch otherSig = (IPatternMatch) obj;
159 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
160 }
161 }
162
163 @Override
164 public X_inv12_notNonRes specification() {
165 return X_inv12_notNonRes.instance();
166 }
167
168 /**
169 * Returns an empty, mutable match.
170 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
171 *
172 * @return the empty match.
173 *
174 */
175 public static X_inv12_notNonRes.Match newEmptyMatch() {
176 return new Mutable(null);
177 }
178
179 /**
180 * Returns a mutable (partial) match.
181 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
182 *
183 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
184 * @return the new, mutable (partial) match object.
185 *
186 */
187 public static X_inv12_notNonRes.Match newMutableMatch(final Non_Resident_Tax_Payer pTp) {
188 return new Mutable(pTp);
189 }
190
191 /**
192 * Returns a new (partial) match.
193 * This can be used e.g. to call the matcher with a partial match.
194 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
195 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
196 * @return the (partial) match object.
197 *
198 */
199 public static X_inv12_notNonRes.Match newMatch(final Non_Resident_Tax_Payer pTp) {
200 return new Immutable(pTp);
201 }
202
203 private static final class Mutable extends X_inv12_notNonRes.Match {
204 Mutable(final Non_Resident_Tax_Payer pTp) {
205 super(pTp);
206 }
207
208 @Override
209 public boolean isMutable() {
210 return true;
211 }
212 }
213
214 private static final class Immutable extends X_inv12_notNonRes.Match {
215 Immutable(final Non_Resident_Tax_Payer pTp) {
216 super(pTp);
217 }
218
219 @Override
220 public boolean isMutable() {
221 return false;
222 }
223 }
224 }
225
226 /**
227 * Generated pattern matcher API of the queries.x_inv12_notNonRes pattern,
228 * providing pattern-specific query methods.
229 *
230 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
231 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
232 *
233 * <p>Matches of the pattern will be represented as {@link Match}.
234 *
235 * <p>Original source:
236 * <code><pre>
237 * pattern x_inv12_notNonRes(tp : Non_Resident_Tax_Payer) {
238 * Non_Resident_Tax_Payer(tp);
239 * }
240 * </pre></code>
241 *
242 * @see Match
243 * @see X_inv12_notNonRes
244 *
245 */
246 public static class Matcher extends BaseMatcher<X_inv12_notNonRes.Match> {
247 /**
248 * Initializes the pattern matcher within an existing VIATRA Query engine.
249 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
250 *
251 * @param engine the existing VIATRA Query engine in which this matcher will be created.
252 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
253 *
254 */
255 public static X_inv12_notNonRes.Matcher on(final ViatraQueryEngine engine) {
256 // check if matcher already exists
257 Matcher matcher = engine.getExistingMatcher(querySpecification());
258 if (matcher == null) {
259 matcher = (Matcher)engine.getMatcher(querySpecification());
260 }
261 return matcher;
262 }
263
264 /**
265 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
266 * @return an initialized matcher
267 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
268 *
269 */
270 public static X_inv12_notNonRes.Matcher create() {
271 return new Matcher();
272 }
273
274 private static final int POSITION_TP = 0;
275
276 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv12_notNonRes.Matcher.class);
277
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 private Matcher() {
287 super(querySpecification());
288 }
289
290 /**
291 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
292 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
293 * @return matches represented as a Match object.
294 *
295 */
296 public Collection<X_inv12_notNonRes.Match> getAllMatches(final Non_Resident_Tax_Payer pTp) {
297 return rawStreamAllMatches(new Object[]{pTp}).collect(Collectors.toSet());
298 }
299
300 /**
301 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
302 * </p>
303 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
304 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
305 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
306 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
307 * @return a stream of matches represented as a Match object.
308 *
309 */
310 public Stream<X_inv12_notNonRes.Match> streamAllMatches(final Non_Resident_Tax_Payer pTp) {
311 return rawStreamAllMatches(new Object[]{pTp});
312 }
313
314 /**
315 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
316 * Neither determinism nor randomness of selection is guaranteed.
317 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
318 * @return a match represented as a Match object, or null if no match is found.
319 *
320 */
321 public Optional<X_inv12_notNonRes.Match> getOneArbitraryMatch(final Non_Resident_Tax_Payer pTp) {
322 return rawGetOneArbitraryMatch(new Object[]{pTp});
323 }
324
325 /**
326 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
327 * under any possible substitution of the unspecified parameters (if any).
328 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
329 * @return true if the input is a valid (partial) match of the pattern.
330 *
331 */
332 public boolean hasMatch(final Non_Resident_Tax_Payer pTp) {
333 return rawHasMatch(new Object[]{pTp});
334 }
335
336 /**
337 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
338 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
339 * @return the number of pattern matches found.
340 *
341 */
342 public int countMatches(final Non_Resident_Tax_Payer pTp) {
343 return rawCountMatches(new Object[]{pTp});
344 }
345
346 /**
347 * Executes the given processor on 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 pTp the fixed value of pattern parameter tp, or null if not bound.
350 * @param processor the action that will process the selected match.
351 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
352 *
353 */
354 public boolean forOneArbitraryMatch(final Non_Resident_Tax_Payer pTp, final Consumer<? super X_inv12_notNonRes.Match> processor) {
355 return rawForOneArbitraryMatch(new Object[]{pTp}, processor);
356 }
357
358 /**
359 * Returns a new (partial) match.
360 * This can be used e.g. to call the matcher with a partial match.
361 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
362 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
363 * @return the (partial) match object.
364 *
365 */
366 public X_inv12_notNonRes.Match newMatch(final Non_Resident_Tax_Payer pTp) {
367 return X_inv12_notNonRes.Match.newMatch(pTp);
368 }
369
370 /**
371 * Retrieve the set of values that occur in matches for tp.
372 * @return the Set of all values or empty set if there are no matches
373 *
374 */
375 protected Stream<Non_Resident_Tax_Payer> rawStreamAllValuesOftp(final Object[] parameters) {
376 return rawStreamAllValues(POSITION_TP, parameters).map(Non_Resident_Tax_Payer.class::cast);
377 }
378
379 /**
380 * Retrieve the set of values that occur in matches for tp.
381 * @return the Set of all values or empty set if there are no matches
382 *
383 */
384 public Set<Non_Resident_Tax_Payer> getAllValuesOftp() {
385 return rawStreamAllValuesOftp(emptyArray()).collect(Collectors.toSet());
386 }
387
388 /**
389 * Retrieve the set of values that occur in matches for tp.
390 * @return the Set of all values or empty set if there are no matches
391 *
392 */
393 public Stream<Non_Resident_Tax_Payer> streamAllValuesOftp() {
394 return rawStreamAllValuesOftp(emptyArray());
395 }
396
397 @Override
398 protected X_inv12_notNonRes.Match tupleToMatch(final Tuple t) {
399 try {
400 return X_inv12_notNonRes.Match.newMatch((Non_Resident_Tax_Payer) t.get(POSITION_TP));
401 } catch(ClassCastException e) {
402 LOGGER.error("Element(s) in tuple not properly typed!",e);
403 return null;
404 }
405 }
406
407 @Override
408 protected X_inv12_notNonRes.Match arrayToMatch(final Object[] match) {
409 try {
410 return X_inv12_notNonRes.Match.newMatch((Non_Resident_Tax_Payer) match[POSITION_TP]);
411 } catch(ClassCastException e) {
412 LOGGER.error("Element(s) in array not properly typed!",e);
413 return null;
414 }
415 }
416
417 @Override
418 protected X_inv12_notNonRes.Match arrayToMatchMutable(final Object[] match) {
419 try {
420 return X_inv12_notNonRes.Match.newMutableMatch((Non_Resident_Tax_Payer) match[POSITION_TP]);
421 } catch(ClassCastException e) {
422 LOGGER.error("Element(s) in array not properly typed!",e);
423 return null;
424 }
425 }
426
427 /**
428 * @return the singleton instance of the query specification of this pattern
429 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
430 *
431 */
432 public static IQuerySpecification<X_inv12_notNonRes.Matcher> querySpecification() {
433 return X_inv12_notNonRes.instance();
434 }
435 }
436
437 private X_inv12_notNonRes() {
438 super(GeneratedPQuery.INSTANCE);
439 }
440
441 /**
442 * @return the singleton instance of the query specification
443 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
444 *
445 */
446 public static X_inv12_notNonRes instance() {
447 try{
448 return LazyHolder.INSTANCE;
449 } catch (ExceptionInInitializerError err) {
450 throw processInitializerError(err);
451 }
452 }
453
454 @Override
455 protected X_inv12_notNonRes.Matcher instantiate(final ViatraQueryEngine engine) {
456 return X_inv12_notNonRes.Matcher.on(engine);
457 }
458
459 @Override
460 public X_inv12_notNonRes.Matcher instantiate() {
461 return X_inv12_notNonRes.Matcher.create();
462 }
463
464 @Override
465 public X_inv12_notNonRes.Match newEmptyMatch() {
466 return X_inv12_notNonRes.Match.newEmptyMatch();
467 }
468
469 @Override
470 public X_inv12_notNonRes.Match newMatch(final Object... parameters) {
471 return X_inv12_notNonRes.Match.newMatch((Taxation.Non_Resident_Tax_Payer) parameters[0]);
472 }
473
474 /**
475 * Inner class allowing the singleton instance of {@link X_inv12_notNonRes} to be created
476 * <b>not</b> at the class load time of the outer class,
477 * but rather at the first call to {@link X_inv12_notNonRes#instance()}.
478 *
479 * <p> This workaround is required e.g. to support recursion.
480 *
481 */
482 private static class LazyHolder {
483 private static final X_inv12_notNonRes INSTANCE = new X_inv12_notNonRes();
484
485 /**
486 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
487 * This initialization order is required to support indirect recursion.
488 *
489 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
490 *
491 */
492 private static final Object STATIC_INITIALIZER = ensureInitialized();
493
494 public static Object ensureInitialized() {
495 INSTANCE.ensureInitializedInternal();
496 return null;
497 }
498 }
499
500 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
501 private static final X_inv12_notNonRes.GeneratedPQuery INSTANCE = new GeneratedPQuery();
502
503 private final PParameter parameter_tp = new PParameter("tp", "Taxation.Non_Resident_Tax_Payer", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Non_Resident_Tax_Payer")), PParameterDirection.INOUT);
504
505 private final List<PParameter> parameters = Arrays.asList(parameter_tp);
506
507 private GeneratedPQuery() {
508 super(PVisibility.PUBLIC);
509 }
510
511 @Override
512 public String getFullyQualifiedName() {
513 return "queries.x_inv12_notNonRes";
514 }
515
516 @Override
517 public List<String> getParameterNames() {
518 return Arrays.asList("tp");
519 }
520
521 @Override
522 public List<PParameter> getParameters() {
523 return parameters;
524 }
525
526 @Override
527 public Set<PBody> doGetContainedBodies() {
528 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
529 Set<PBody> bodies = new LinkedHashSet<>();
530 {
531 PBody body = new PBody(this);
532 PVariable var_tp = body.getOrCreateVariableByName("tp");
533 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Non_Resident_Tax_Payer")));
534 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
535 new ExportedParameter(body, var_tp, parameter_tp)
536 ));
537 // Non_Resident_Tax_Payer(tp)
538 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Non_Resident_Tax_Payer")));
539 bodies.add(body);
540 }
541 return bodies;
542 }
543 }
544}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv12_notZZ.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv12_notZZ.java
deleted file mode 100644
index f8e7da17..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv12_notZZ.java
+++ /dev/null
@@ -1,555 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Habitual_Address;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.basicenumerables.ConstantValue;
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 x_inv12_notZZ(hab_add : Habitual_Address) {
50 * Address.country(hab_add, ::ZZ);
51 * }
52 * </pre></code>
53 *
54 * @see Matcher
55 * @see Match
56 *
57 */
58@SuppressWarnings("all")
59public final class X_inv12_notZZ extends BaseGeneratedEMFQuerySpecification<X_inv12_notZZ.Matcher> {
60 /**
61 * Pattern-specific match representation of the queries.x_inv12_notZZ 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 Habitual_Address fHab_add;
74
75 private static List<String> parameterNames = makeImmutableList("hab_add");
76
77 private Match(final Habitual_Address pHab_add) {
78 this.fHab_add = pHab_add;
79 }
80
81 @Override
82 public Object get(final String parameterName) {
83 switch(parameterName) {
84 case "hab_add": return this.fHab_add;
85 default: return null;
86 }
87 }
88
89 @Override
90 public Object get(final int index) {
91 switch(index) {
92 case 0: return this.fHab_add;
93 default: return null;
94 }
95 }
96
97 public Habitual_Address getHab_add() {
98 return this.fHab_add;
99 }
100
101 @Override
102 public boolean set(final String parameterName, final Object newValue) {
103 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
104 if ("hab_add".equals(parameterName) ) {
105 this.fHab_add = (Habitual_Address) newValue;
106 return true;
107 }
108 return false;
109 }
110
111 public void setHab_add(final Habitual_Address pHab_add) {
112 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
113 this.fHab_add = pHab_add;
114 }
115
116 @Override
117 public String patternName() {
118 return "queries.x_inv12_notZZ";
119 }
120
121 @Override
122 public List<String> parameterNames() {
123 return X_inv12_notZZ.Match.parameterNames;
124 }
125
126 @Override
127 public Object[] toArray() {
128 return new Object[]{fHab_add};
129 }
130
131 @Override
132 public X_inv12_notZZ.Match toImmutable() {
133 return isMutable() ? newMatch(fHab_add) : this;
134 }
135
136 @Override
137 public String prettyPrint() {
138 StringBuilder result = new StringBuilder();
139 result.append("\"hab_add\"=" + prettyPrintValue(fHab_add));
140 return result.toString();
141 }
142
143 @Override
144 public int hashCode() {
145 return Objects.hash(fHab_add);
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 X_inv12_notZZ.Match)) {
156 X_inv12_notZZ.Match other = (X_inv12_notZZ.Match) obj;
157 return Objects.equals(fHab_add, other.fHab_add);
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 X_inv12_notZZ specification() {
170 return X_inv12_notZZ.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 X_inv12_notZZ.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 pHab_add the fixed value of pattern parameter hab_add, or null if not bound.
189 * @return the new, mutable (partial) match object.
190 *
191 */
192 public static X_inv12_notZZ.Match newMutableMatch(final Habitual_Address pHab_add) {
193 return new Mutable(pHab_add);
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 pHab_add the fixed value of pattern parameter hab_add, or null if not bound.
201 * @return the (partial) match object.
202 *
203 */
204 public static X_inv12_notZZ.Match newMatch(final Habitual_Address pHab_add) {
205 return new Immutable(pHab_add);
206 }
207
208 private static final class Mutable extends X_inv12_notZZ.Match {
209 Mutable(final Habitual_Address pHab_add) {
210 super(pHab_add);
211 }
212
213 @Override
214 public boolean isMutable() {
215 return true;
216 }
217 }
218
219 private static final class Immutable extends X_inv12_notZZ.Match {
220 Immutable(final Habitual_Address pHab_add) {
221 super(pHab_add);
222 }
223
224 @Override
225 public boolean isMutable() {
226 return false;
227 }
228 }
229 }
230
231 /**
232 * Generated pattern matcher API of the queries.x_inv12_notZZ 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 x_inv12_notZZ(hab_add : Habitual_Address) {
243 * Address.country(hab_add, ::ZZ);
244 * }
245 * </pre></code>
246 *
247 * @see Match
248 * @see X_inv12_notZZ
249 *
250 */
251 public static class Matcher extends BaseMatcher<X_inv12_notZZ.Match> {
252 /**
253 * Initializes the pattern matcher within an existing VIATRA Query engine.
254 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
255 *
256 * @param engine the existing VIATRA Query engine in which this matcher will be created.
257 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
258 *
259 */
260 public static X_inv12_notZZ.Matcher on(final ViatraQueryEngine engine) {
261 // check if matcher already exists
262 Matcher matcher = engine.getExistingMatcher(querySpecification());
263 if (matcher == null) {
264 matcher = (Matcher)engine.getMatcher(querySpecification());
265 }
266 return matcher;
267 }
268
269 /**
270 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
271 * @return an initialized matcher
272 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
273 *
274 */
275 public static X_inv12_notZZ.Matcher create() {
276 return new Matcher();
277 }
278
279 private static final int POSITION_HAB_ADD = 0;
280
281 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv12_notZZ.Matcher.class);
282
283 /**
284 * Initializes the pattern matcher within an existing VIATRA Query engine.
285 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
286 *
287 * @param engine the existing VIATRA Query engine in which this matcher will be created.
288 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
289 *
290 */
291 private Matcher() {
292 super(querySpecification());
293 }
294
295 /**
296 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
297 * @param pHab_add the fixed value of pattern parameter hab_add, or null if not bound.
298 * @return matches represented as a Match object.
299 *
300 */
301 public Collection<X_inv12_notZZ.Match> getAllMatches(final Habitual_Address pHab_add) {
302 return rawStreamAllMatches(new Object[]{pHab_add}).collect(Collectors.toSet());
303 }
304
305 /**
306 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
307 * </p>
308 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
309 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
310 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
311 * @param pHab_add the fixed value of pattern parameter hab_add, or null if not bound.
312 * @return a stream of matches represented as a Match object.
313 *
314 */
315 public Stream<X_inv12_notZZ.Match> streamAllMatches(final Habitual_Address pHab_add) {
316 return rawStreamAllMatches(new Object[]{pHab_add});
317 }
318
319 /**
320 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
321 * Neither determinism nor randomness of selection is guaranteed.
322 * @param pHab_add the fixed value of pattern parameter hab_add, or null if not bound.
323 * @return a match represented as a Match object, or null if no match is found.
324 *
325 */
326 public Optional<X_inv12_notZZ.Match> getOneArbitraryMatch(final Habitual_Address pHab_add) {
327 return rawGetOneArbitraryMatch(new Object[]{pHab_add});
328 }
329
330 /**
331 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
332 * under any possible substitution of the unspecified parameters (if any).
333 * @param pHab_add the fixed value of pattern parameter hab_add, or null if not bound.
334 * @return true if the input is a valid (partial) match of the pattern.
335 *
336 */
337 public boolean hasMatch(final Habitual_Address pHab_add) {
338 return rawHasMatch(new Object[]{pHab_add});
339 }
340
341 /**
342 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
343 * @param pHab_add the fixed value of pattern parameter hab_add, or null if not bound.
344 * @return the number of pattern matches found.
345 *
346 */
347 public int countMatches(final Habitual_Address pHab_add) {
348 return rawCountMatches(new Object[]{pHab_add});
349 }
350
351 /**
352 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
353 * Neither determinism nor randomness of selection is guaranteed.
354 * @param pHab_add the fixed value of pattern parameter hab_add, or null if not bound.
355 * @param processor the action that will process the selected match.
356 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
357 *
358 */
359 public boolean forOneArbitraryMatch(final Habitual_Address pHab_add, final Consumer<? super X_inv12_notZZ.Match> processor) {
360 return rawForOneArbitraryMatch(new Object[]{pHab_add}, processor);
361 }
362
363 /**
364 * Returns a new (partial) match.
365 * This can be used e.g. to call the matcher with a partial match.
366 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
367 * @param pHab_add the fixed value of pattern parameter hab_add, or null if not bound.
368 * @return the (partial) match object.
369 *
370 */
371 public X_inv12_notZZ.Match newMatch(final Habitual_Address pHab_add) {
372 return X_inv12_notZZ.Match.newMatch(pHab_add);
373 }
374
375 /**
376 * Retrieve the set of values that occur in matches for hab_add.
377 * @return the Set of all values or empty set if there are no matches
378 *
379 */
380 protected Stream<Habitual_Address> rawStreamAllValuesOfhab_add(final Object[] parameters) {
381 return rawStreamAllValues(POSITION_HAB_ADD, parameters).map(Habitual_Address.class::cast);
382 }
383
384 /**
385 * Retrieve the set of values that occur in matches for hab_add.
386 * @return the Set of all values or empty set if there are no matches
387 *
388 */
389 public Set<Habitual_Address> getAllValuesOfhab_add() {
390 return rawStreamAllValuesOfhab_add(emptyArray()).collect(Collectors.toSet());
391 }
392
393 /**
394 * Retrieve the set of values that occur in matches for hab_add.
395 * @return the Set of all values or empty set if there are no matches
396 *
397 */
398 public Stream<Habitual_Address> streamAllValuesOfhab_add() {
399 return rawStreamAllValuesOfhab_add(emptyArray());
400 }
401
402 @Override
403 protected X_inv12_notZZ.Match tupleToMatch(final Tuple t) {
404 try {
405 return X_inv12_notZZ.Match.newMatch((Habitual_Address) t.get(POSITION_HAB_ADD));
406 } catch(ClassCastException e) {
407 LOGGER.error("Element(s) in tuple not properly typed!",e);
408 return null;
409 }
410 }
411
412 @Override
413 protected X_inv12_notZZ.Match arrayToMatch(final Object[] match) {
414 try {
415 return X_inv12_notZZ.Match.newMatch((Habitual_Address) match[POSITION_HAB_ADD]);
416 } catch(ClassCastException e) {
417 LOGGER.error("Element(s) in array not properly typed!",e);
418 return null;
419 }
420 }
421
422 @Override
423 protected X_inv12_notZZ.Match arrayToMatchMutable(final Object[] match) {
424 try {
425 return X_inv12_notZZ.Match.newMutableMatch((Habitual_Address) match[POSITION_HAB_ADD]);
426 } catch(ClassCastException e) {
427 LOGGER.error("Element(s) in array not properly typed!",e);
428 return null;
429 }
430 }
431
432 /**
433 * @return the singleton instance of the query specification of this pattern
434 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
435 *
436 */
437 public static IQuerySpecification<X_inv12_notZZ.Matcher> querySpecification() {
438 return X_inv12_notZZ.instance();
439 }
440 }
441
442 private X_inv12_notZZ() {
443 super(GeneratedPQuery.INSTANCE);
444 }
445
446 /**
447 * @return the singleton instance of the query specification
448 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
449 *
450 */
451 public static X_inv12_notZZ instance() {
452 try{
453 return LazyHolder.INSTANCE;
454 } catch (ExceptionInInitializerError err) {
455 throw processInitializerError(err);
456 }
457 }
458
459 @Override
460 protected X_inv12_notZZ.Matcher instantiate(final ViatraQueryEngine engine) {
461 return X_inv12_notZZ.Matcher.on(engine);
462 }
463
464 @Override
465 public X_inv12_notZZ.Matcher instantiate() {
466 return X_inv12_notZZ.Matcher.create();
467 }
468
469 @Override
470 public X_inv12_notZZ.Match newEmptyMatch() {
471 return X_inv12_notZZ.Match.newEmptyMatch();
472 }
473
474 @Override
475 public X_inv12_notZZ.Match newMatch(final Object... parameters) {
476 return X_inv12_notZZ.Match.newMatch((Taxation.Habitual_Address) parameters[0]);
477 }
478
479 /**
480 * Inner class allowing the singleton instance of {@link X_inv12_notZZ} to be created
481 * <b>not</b> at the class load time of the outer class,
482 * but rather at the first call to {@link X_inv12_notZZ#instance()}.
483 *
484 * <p> This workaround is required e.g. to support recursion.
485 *
486 */
487 private static class LazyHolder {
488 private static final X_inv12_notZZ INSTANCE = new X_inv12_notZZ();
489
490 /**
491 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
492 * This initialization order is required to support indirect recursion.
493 *
494 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
495 *
496 */
497 private static final Object STATIC_INITIALIZER = ensureInitialized();
498
499 public static Object ensureInitialized() {
500 INSTANCE.ensureInitializedInternal();
501 return null;
502 }
503 }
504
505 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
506 private static final X_inv12_notZZ.GeneratedPQuery INSTANCE = new GeneratedPQuery();
507
508 private final PParameter parameter_hab_add = new PParameter("hab_add", "Taxation.Habitual_Address", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Habitual_Address")), PParameterDirection.INOUT);
509
510 private final List<PParameter> parameters = Arrays.asList(parameter_hab_add);
511
512 private GeneratedPQuery() {
513 super(PVisibility.PUBLIC);
514 }
515
516 @Override
517 public String getFullyQualifiedName() {
518 return "queries.x_inv12_notZZ";
519 }
520
521 @Override
522 public List<String> getParameterNames() {
523 return Arrays.asList("hab_add");
524 }
525
526 @Override
527 public List<PParameter> getParameters() {
528 return parameters;
529 }
530
531 @Override
532 public Set<PBody> doGetContainedBodies() {
533 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
534 Set<PBody> bodies = new LinkedHashSet<>();
535 {
536 PBody body = new PBody(this);
537 PVariable var_hab_add = body.getOrCreateVariableByName("hab_add");
538 new TypeConstraint(body, Tuples.flatTupleOf(var_hab_add), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Habitual_Address")));
539 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
540 new ExportedParameter(body, var_hab_add, parameter_hab_add)
541 ));
542 // Address.country(hab_add, ::ZZ)
543 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
544 new ConstantValue(body, var__virtual_0_, getEnumLiteral("http:///TaxCard.ecore", "Country", "ZZ").getInstance());
545 new TypeConstraint(body, Tuples.flatTupleOf(var_hab_add), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Address")));
546 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
547 new TypeConstraint(body, Tuples.flatTupleOf(var_hab_add, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Address", "country")));
548 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http:///TaxCard.ecore", "Country")));
549 new Equality(body, var__virtual_1_, var__virtual_0_);
550 bodies.add(body);
551 }
552 return bodies;
553 }
554 }
555}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv13.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv13.java
deleted file mode 100644
index 42afdd70..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv13.java
+++ /dev/null
@@ -1,544 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Resident_Tax_Payer;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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 * pattern x_inv13(tp : Resident_Tax_Payer) {
45 * Resident_Tax_Payer(tp);
46 * }
47 * </pre></code>
48 *
49 * @see Matcher
50 * @see Match
51 *
52 */
53@SuppressWarnings("all")
54public final class X_inv13 extends BaseGeneratedEMFQuerySpecification<X_inv13.Matcher> {
55 /**
56 * Pattern-specific match representation of the queries.x_inv13 pattern,
57 * to be used in conjunction with {@link Matcher}.
58 *
59 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
60 * Each instance is a (possibly partial) substitution of pattern parameters,
61 * usable to represent a match of the pattern in the result of a query,
62 * or to specify the bound (fixed) input parameters when issuing a query.
63 *
64 * @see Matcher
65 *
66 */
67 public static abstract class Match extends BasePatternMatch {
68 private Resident_Tax_Payer fTp;
69
70 private static List<String> parameterNames = makeImmutableList("tp");
71
72 private Match(final Resident_Tax_Payer pTp) {
73 this.fTp = pTp;
74 }
75
76 @Override
77 public Object get(final String parameterName) {
78 switch(parameterName) {
79 case "tp": return this.fTp;
80 default: return null;
81 }
82 }
83
84 @Override
85 public Object get(final int index) {
86 switch(index) {
87 case 0: return this.fTp;
88 default: return null;
89 }
90 }
91
92 public Resident_Tax_Payer getTp() {
93 return this.fTp;
94 }
95
96 @Override
97 public boolean set(final String parameterName, final Object newValue) {
98 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
99 if ("tp".equals(parameterName) ) {
100 this.fTp = (Resident_Tax_Payer) newValue;
101 return true;
102 }
103 return false;
104 }
105
106 public void setTp(final Resident_Tax_Payer pTp) {
107 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
108 this.fTp = pTp;
109 }
110
111 @Override
112 public String patternName() {
113 return "queries.x_inv13";
114 }
115
116 @Override
117 public List<String> parameterNames() {
118 return X_inv13.Match.parameterNames;
119 }
120
121 @Override
122 public Object[] toArray() {
123 return new Object[]{fTp};
124 }
125
126 @Override
127 public X_inv13.Match toImmutable() {
128 return isMutable() ? newMatch(fTp) : this;
129 }
130
131 @Override
132 public String prettyPrint() {
133 StringBuilder result = new StringBuilder();
134 result.append("\"tp\"=" + prettyPrintValue(fTp));
135 return result.toString();
136 }
137
138 @Override
139 public int hashCode() {
140 return Objects.hash(fTp);
141 }
142
143 @Override
144 public boolean equals(final Object obj) {
145 if (this == obj)
146 return true;
147 if (obj == null) {
148 return false;
149 }
150 if ((obj instanceof X_inv13.Match)) {
151 X_inv13.Match other = (X_inv13.Match) obj;
152 return Objects.equals(fTp, other.fTp);
153 } else {
154 // this should be infrequent
155 if (!(obj instanceof IPatternMatch)) {
156 return false;
157 }
158 IPatternMatch otherSig = (IPatternMatch) obj;
159 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
160 }
161 }
162
163 @Override
164 public X_inv13 specification() {
165 return X_inv13.instance();
166 }
167
168 /**
169 * Returns an empty, mutable match.
170 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
171 *
172 * @return the empty match.
173 *
174 */
175 public static X_inv13.Match newEmptyMatch() {
176 return new Mutable(null);
177 }
178
179 /**
180 * Returns a mutable (partial) match.
181 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
182 *
183 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
184 * @return the new, mutable (partial) match object.
185 *
186 */
187 public static X_inv13.Match newMutableMatch(final Resident_Tax_Payer pTp) {
188 return new Mutable(pTp);
189 }
190
191 /**
192 * Returns a new (partial) match.
193 * This can be used e.g. to call the matcher with a partial match.
194 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
195 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
196 * @return the (partial) match object.
197 *
198 */
199 public static X_inv13.Match newMatch(final Resident_Tax_Payer pTp) {
200 return new Immutable(pTp);
201 }
202
203 private static final class Mutable extends X_inv13.Match {
204 Mutable(final Resident_Tax_Payer pTp) {
205 super(pTp);
206 }
207
208 @Override
209 public boolean isMutable() {
210 return true;
211 }
212 }
213
214 private static final class Immutable extends X_inv13.Match {
215 Immutable(final Resident_Tax_Payer pTp) {
216 super(pTp);
217 }
218
219 @Override
220 public boolean isMutable() {
221 return false;
222 }
223 }
224 }
225
226 /**
227 * Generated pattern matcher API of the queries.x_inv13 pattern,
228 * providing pattern-specific query methods.
229 *
230 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
231 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
232 *
233 * <p>Matches of the pattern will be represented as {@link Match}.
234 *
235 * <p>Original source:
236 * <code><pre>
237 * pattern x_inv13(tp : Resident_Tax_Payer) {
238 * Resident_Tax_Payer(tp);
239 * }
240 * </pre></code>
241 *
242 * @see Match
243 * @see X_inv13
244 *
245 */
246 public static class Matcher extends BaseMatcher<X_inv13.Match> {
247 /**
248 * Initializes the pattern matcher within an existing VIATRA Query engine.
249 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
250 *
251 * @param engine the existing VIATRA Query engine in which this matcher will be created.
252 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
253 *
254 */
255 public static X_inv13.Matcher on(final ViatraQueryEngine engine) {
256 // check if matcher already exists
257 Matcher matcher = engine.getExistingMatcher(querySpecification());
258 if (matcher == null) {
259 matcher = (Matcher)engine.getMatcher(querySpecification());
260 }
261 return matcher;
262 }
263
264 /**
265 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
266 * @return an initialized matcher
267 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
268 *
269 */
270 public static X_inv13.Matcher create() {
271 return new Matcher();
272 }
273
274 private static final int POSITION_TP = 0;
275
276 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv13.Matcher.class);
277
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 private Matcher() {
287 super(querySpecification());
288 }
289
290 /**
291 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
292 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
293 * @return matches represented as a Match object.
294 *
295 */
296 public Collection<X_inv13.Match> getAllMatches(final Resident_Tax_Payer pTp) {
297 return rawStreamAllMatches(new Object[]{pTp}).collect(Collectors.toSet());
298 }
299
300 /**
301 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
302 * </p>
303 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
304 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
305 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
306 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
307 * @return a stream of matches represented as a Match object.
308 *
309 */
310 public Stream<X_inv13.Match> streamAllMatches(final Resident_Tax_Payer pTp) {
311 return rawStreamAllMatches(new Object[]{pTp});
312 }
313
314 /**
315 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
316 * Neither determinism nor randomness of selection is guaranteed.
317 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
318 * @return a match represented as a Match object, or null if no match is found.
319 *
320 */
321 public Optional<X_inv13.Match> getOneArbitraryMatch(final Resident_Tax_Payer pTp) {
322 return rawGetOneArbitraryMatch(new Object[]{pTp});
323 }
324
325 /**
326 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
327 * under any possible substitution of the unspecified parameters (if any).
328 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
329 * @return true if the input is a valid (partial) match of the pattern.
330 *
331 */
332 public boolean hasMatch(final Resident_Tax_Payer pTp) {
333 return rawHasMatch(new Object[]{pTp});
334 }
335
336 /**
337 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
338 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
339 * @return the number of pattern matches found.
340 *
341 */
342 public int countMatches(final Resident_Tax_Payer pTp) {
343 return rawCountMatches(new Object[]{pTp});
344 }
345
346 /**
347 * Executes the given processor on 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 pTp the fixed value of pattern parameter tp, or null if not bound.
350 * @param processor the action that will process the selected match.
351 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
352 *
353 */
354 public boolean forOneArbitraryMatch(final Resident_Tax_Payer pTp, final Consumer<? super X_inv13.Match> processor) {
355 return rawForOneArbitraryMatch(new Object[]{pTp}, processor);
356 }
357
358 /**
359 * Returns a new (partial) match.
360 * This can be used e.g. to call the matcher with a partial match.
361 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
362 * @param pTp the fixed value of pattern parameter tp, or null if not bound.
363 * @return the (partial) match object.
364 *
365 */
366 public X_inv13.Match newMatch(final Resident_Tax_Payer pTp) {
367 return X_inv13.Match.newMatch(pTp);
368 }
369
370 /**
371 * Retrieve the set of values that occur in matches for tp.
372 * @return the Set of all values or empty set if there are no matches
373 *
374 */
375 protected Stream<Resident_Tax_Payer> rawStreamAllValuesOftp(final Object[] parameters) {
376 return rawStreamAllValues(POSITION_TP, parameters).map(Resident_Tax_Payer.class::cast);
377 }
378
379 /**
380 * Retrieve the set of values that occur in matches for tp.
381 * @return the Set of all values or empty set if there are no matches
382 *
383 */
384 public Set<Resident_Tax_Payer> getAllValuesOftp() {
385 return rawStreamAllValuesOftp(emptyArray()).collect(Collectors.toSet());
386 }
387
388 /**
389 * Retrieve the set of values that occur in matches for tp.
390 * @return the Set of all values or empty set if there are no matches
391 *
392 */
393 public Stream<Resident_Tax_Payer> streamAllValuesOftp() {
394 return rawStreamAllValuesOftp(emptyArray());
395 }
396
397 @Override
398 protected X_inv13.Match tupleToMatch(final Tuple t) {
399 try {
400 return X_inv13.Match.newMatch((Resident_Tax_Payer) t.get(POSITION_TP));
401 } catch(ClassCastException e) {
402 LOGGER.error("Element(s) in tuple not properly typed!",e);
403 return null;
404 }
405 }
406
407 @Override
408 protected X_inv13.Match arrayToMatch(final Object[] match) {
409 try {
410 return X_inv13.Match.newMatch((Resident_Tax_Payer) match[POSITION_TP]);
411 } catch(ClassCastException e) {
412 LOGGER.error("Element(s) in array not properly typed!",e);
413 return null;
414 }
415 }
416
417 @Override
418 protected X_inv13.Match arrayToMatchMutable(final Object[] match) {
419 try {
420 return X_inv13.Match.newMutableMatch((Resident_Tax_Payer) match[POSITION_TP]);
421 } catch(ClassCastException e) {
422 LOGGER.error("Element(s) in array not properly typed!",e);
423 return null;
424 }
425 }
426
427 /**
428 * @return the singleton instance of the query specification of this pattern
429 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
430 *
431 */
432 public static IQuerySpecification<X_inv13.Matcher> querySpecification() {
433 return X_inv13.instance();
434 }
435 }
436
437 private X_inv13() {
438 super(GeneratedPQuery.INSTANCE);
439 }
440
441 /**
442 * @return the singleton instance of the query specification
443 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
444 *
445 */
446 public static X_inv13 instance() {
447 try{
448 return LazyHolder.INSTANCE;
449 } catch (ExceptionInInitializerError err) {
450 throw processInitializerError(err);
451 }
452 }
453
454 @Override
455 protected X_inv13.Matcher instantiate(final ViatraQueryEngine engine) {
456 return X_inv13.Matcher.on(engine);
457 }
458
459 @Override
460 public X_inv13.Matcher instantiate() {
461 return X_inv13.Matcher.create();
462 }
463
464 @Override
465 public X_inv13.Match newEmptyMatch() {
466 return X_inv13.Match.newEmptyMatch();
467 }
468
469 @Override
470 public X_inv13.Match newMatch(final Object... parameters) {
471 return X_inv13.Match.newMatch((Taxation.Resident_Tax_Payer) parameters[0]);
472 }
473
474 /**
475 * Inner class allowing the singleton instance of {@link X_inv13} to be created
476 * <b>not</b> at the class load time of the outer class,
477 * but rather at the first call to {@link X_inv13#instance()}.
478 *
479 * <p> This workaround is required e.g. to support recursion.
480 *
481 */
482 private static class LazyHolder {
483 private static final X_inv13 INSTANCE = new X_inv13();
484
485 /**
486 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
487 * This initialization order is required to support indirect recursion.
488 *
489 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
490 *
491 */
492 private static final Object STATIC_INITIALIZER = ensureInitialized();
493
494 public static Object ensureInitialized() {
495 INSTANCE.ensureInitializedInternal();
496 return null;
497 }
498 }
499
500 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
501 private static final X_inv13.GeneratedPQuery INSTANCE = new GeneratedPQuery();
502
503 private final PParameter parameter_tp = new PParameter("tp", "Taxation.Resident_Tax_Payer", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Resident_Tax_Payer")), PParameterDirection.INOUT);
504
505 private final List<PParameter> parameters = Arrays.asList(parameter_tp);
506
507 private GeneratedPQuery() {
508 super(PVisibility.PUBLIC);
509 }
510
511 @Override
512 public String getFullyQualifiedName() {
513 return "queries.x_inv13";
514 }
515
516 @Override
517 public List<String> getParameterNames() {
518 return Arrays.asList("tp");
519 }
520
521 @Override
522 public List<PParameter> getParameters() {
523 return parameters;
524 }
525
526 @Override
527 public Set<PBody> doGetContainedBodies() {
528 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
529 Set<PBody> bodies = new LinkedHashSet<>();
530 {
531 PBody body = new PBody(this);
532 PVariable var_tp = body.getOrCreateVariableByName("tp");
533 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Resident_Tax_Payer")));
534 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
535 new ExportedParameter(body, var_tp, parameter_tp)
536 ));
537 // Resident_Tax_Payer(tp)
538 new TypeConstraint(body, Tuples.flatTupleOf(var_tp), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Resident_Tax_Payer")));
539 bodies.add(body);
540 }
541 return bodies;
542 }
543 }
544}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv15.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv15.java
deleted file mode 100644
index d162542d..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv15.java
+++ /dev/null
@@ -1,637 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.External_Allowance;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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 x_inv15(ea : External_Allowance) {
47 * External_Allowance.person(ea, child);
48 * Household.children(h, child);//only one due to multiplicity
49 * Household.parents.individual_A(h, iA);
50 * Tax_Payer(iA);
51 * External_Allowance.reciver(ea, iA);
52 * } or {
53 * External_Allowance.person(ea, child);
54 * Household.children(h, child);//only one due to multiplicity
55 * Household.parents.individual_B(h, iB);
56 * Tax_Payer(iB);
57 * External_Allowance.reciver(ea, iB);
58 * }
59 * </pre></code>
60 *
61 * @see Matcher
62 * @see Match
63 *
64 */
65@SuppressWarnings("all")
66public final class X_inv15 extends BaseGeneratedEMFQuerySpecification<X_inv15.Matcher> {
67 /**
68 * Pattern-specific match representation of the queries.x_inv15 pattern,
69 * to be used in conjunction with {@link Matcher}.
70 *
71 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
72 * Each instance is a (possibly partial) substitution of pattern parameters,
73 * usable to represent a match of the pattern in the result of a query,
74 * or to specify the bound (fixed) input parameters when issuing a query.
75 *
76 * @see Matcher
77 *
78 */
79 public static abstract class Match extends BasePatternMatch {
80 private External_Allowance fEa;
81
82 private static List<String> parameterNames = makeImmutableList("ea");
83
84 private Match(final External_Allowance pEa) {
85 this.fEa = pEa;
86 }
87
88 @Override
89 public Object get(final String parameterName) {
90 switch(parameterName) {
91 case "ea": return this.fEa;
92 default: return null;
93 }
94 }
95
96 @Override
97 public Object get(final int index) {
98 switch(index) {
99 case 0: return this.fEa;
100 default: return null;
101 }
102 }
103
104 public External_Allowance getEa() {
105 return this.fEa;
106 }
107
108 @Override
109 public boolean set(final String parameterName, final Object newValue) {
110 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
111 if ("ea".equals(parameterName) ) {
112 this.fEa = (External_Allowance) newValue;
113 return true;
114 }
115 return false;
116 }
117
118 public void setEa(final External_Allowance pEa) {
119 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
120 this.fEa = pEa;
121 }
122
123 @Override
124 public String patternName() {
125 return "queries.x_inv15";
126 }
127
128 @Override
129 public List<String> parameterNames() {
130 return X_inv15.Match.parameterNames;
131 }
132
133 @Override
134 public Object[] toArray() {
135 return new Object[]{fEa};
136 }
137
138 @Override
139 public X_inv15.Match toImmutable() {
140 return isMutable() ? newMatch(fEa) : this;
141 }
142
143 @Override
144 public String prettyPrint() {
145 StringBuilder result = new StringBuilder();
146 result.append("\"ea\"=" + prettyPrintValue(fEa));
147 return result.toString();
148 }
149
150 @Override
151 public int hashCode() {
152 return Objects.hash(fEa);
153 }
154
155 @Override
156 public boolean equals(final Object obj) {
157 if (this == obj)
158 return true;
159 if (obj == null) {
160 return false;
161 }
162 if ((obj instanceof X_inv15.Match)) {
163 X_inv15.Match other = (X_inv15.Match) obj;
164 return Objects.equals(fEa, other.fEa);
165 } else {
166 // this should be infrequent
167 if (!(obj instanceof IPatternMatch)) {
168 return false;
169 }
170 IPatternMatch otherSig = (IPatternMatch) obj;
171 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
172 }
173 }
174
175 @Override
176 public X_inv15 specification() {
177 return X_inv15.instance();
178 }
179
180 /**
181 * Returns an empty, mutable match.
182 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
183 *
184 * @return the empty match.
185 *
186 */
187 public static X_inv15.Match newEmptyMatch() {
188 return new Mutable(null);
189 }
190
191 /**
192 * Returns a mutable (partial) match.
193 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
194 *
195 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
196 * @return the new, mutable (partial) match object.
197 *
198 */
199 public static X_inv15.Match newMutableMatch(final External_Allowance pEa) {
200 return new Mutable(pEa);
201 }
202
203 /**
204 * Returns a new (partial) match.
205 * This can be used e.g. to call the matcher with a partial match.
206 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
207 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
208 * @return the (partial) match object.
209 *
210 */
211 public static X_inv15.Match newMatch(final External_Allowance pEa) {
212 return new Immutable(pEa);
213 }
214
215 private static final class Mutable extends X_inv15.Match {
216 Mutable(final External_Allowance pEa) {
217 super(pEa);
218 }
219
220 @Override
221 public boolean isMutable() {
222 return true;
223 }
224 }
225
226 private static final class Immutable extends X_inv15.Match {
227 Immutable(final External_Allowance pEa) {
228 super(pEa);
229 }
230
231 @Override
232 public boolean isMutable() {
233 return false;
234 }
235 }
236 }
237
238 /**
239 * Generated pattern matcher API of the queries.x_inv15 pattern,
240 * providing pattern-specific query methods.
241 *
242 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
243 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
244 *
245 * <p>Matches of the pattern will be represented as {@link Match}.
246 *
247 * <p>Original source:
248 * <code><pre>
249 * pattern x_inv15(ea : External_Allowance) {
250 * External_Allowance.person(ea, child);
251 * Household.children(h, child);//only one due to multiplicity
252 * Household.parents.individual_A(h, iA);
253 * Tax_Payer(iA);
254 * External_Allowance.reciver(ea, iA);
255 * } or {
256 * External_Allowance.person(ea, child);
257 * Household.children(h, child);//only one due to multiplicity
258 * Household.parents.individual_B(h, iB);
259 * Tax_Payer(iB);
260 * External_Allowance.reciver(ea, iB);
261 * }
262 * </pre></code>
263 *
264 * @see Match
265 * @see X_inv15
266 *
267 */
268 public static class Matcher extends BaseMatcher<X_inv15.Match> {
269 /**
270 * Initializes the pattern matcher within an existing VIATRA Query engine.
271 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
272 *
273 * @param engine the existing VIATRA Query engine in which this matcher will be created.
274 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
275 *
276 */
277 public static X_inv15.Matcher on(final ViatraQueryEngine engine) {
278 // check if matcher already exists
279 Matcher matcher = engine.getExistingMatcher(querySpecification());
280 if (matcher == null) {
281 matcher = (Matcher)engine.getMatcher(querySpecification());
282 }
283 return matcher;
284 }
285
286 /**
287 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
288 * @return an initialized matcher
289 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
290 *
291 */
292 public static X_inv15.Matcher create() {
293 return new Matcher();
294 }
295
296 private static final int POSITION_EA = 0;
297
298 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv15.Matcher.class);
299
300 /**
301 * Initializes the pattern matcher within an existing VIATRA Query engine.
302 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
303 *
304 * @param engine the existing VIATRA Query engine in which this matcher will be created.
305 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
306 *
307 */
308 private Matcher() {
309 super(querySpecification());
310 }
311
312 /**
313 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
314 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
315 * @return matches represented as a Match object.
316 *
317 */
318 public Collection<X_inv15.Match> getAllMatches(final External_Allowance pEa) {
319 return rawStreamAllMatches(new Object[]{pEa}).collect(Collectors.toSet());
320 }
321
322 /**
323 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
324 * </p>
325 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
326 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
327 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
328 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
329 * @return a stream of matches represented as a Match object.
330 *
331 */
332 public Stream<X_inv15.Match> streamAllMatches(final External_Allowance pEa) {
333 return rawStreamAllMatches(new Object[]{pEa});
334 }
335
336 /**
337 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
338 * Neither determinism nor randomness of selection is guaranteed.
339 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
340 * @return a match represented as a Match object, or null if no match is found.
341 *
342 */
343 public Optional<X_inv15.Match> getOneArbitraryMatch(final External_Allowance pEa) {
344 return rawGetOneArbitraryMatch(new Object[]{pEa});
345 }
346
347 /**
348 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
349 * under any possible substitution of the unspecified parameters (if any).
350 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
351 * @return true if the input is a valid (partial) match of the pattern.
352 *
353 */
354 public boolean hasMatch(final External_Allowance pEa) {
355 return rawHasMatch(new Object[]{pEa});
356 }
357
358 /**
359 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
360 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
361 * @return the number of pattern matches found.
362 *
363 */
364 public int countMatches(final External_Allowance pEa) {
365 return rawCountMatches(new Object[]{pEa});
366 }
367
368 /**
369 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
370 * Neither determinism nor randomness of selection is guaranteed.
371 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
372 * @param processor the action that will process the selected match.
373 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
374 *
375 */
376 public boolean forOneArbitraryMatch(final External_Allowance pEa, final Consumer<? super X_inv15.Match> processor) {
377 return rawForOneArbitraryMatch(new Object[]{pEa}, processor);
378 }
379
380 /**
381 * Returns a new (partial) match.
382 * This can be used e.g. to call the matcher with a partial match.
383 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
384 * @param pEa the fixed value of pattern parameter ea, or null if not bound.
385 * @return the (partial) match object.
386 *
387 */
388 public X_inv15.Match newMatch(final External_Allowance pEa) {
389 return X_inv15.Match.newMatch(pEa);
390 }
391
392 /**
393 * Retrieve the set of values that occur in matches for ea.
394 * @return the Set of all values or empty set if there are no matches
395 *
396 */
397 protected Stream<External_Allowance> rawStreamAllValuesOfea(final Object[] parameters) {
398 return rawStreamAllValues(POSITION_EA, parameters).map(External_Allowance.class::cast);
399 }
400
401 /**
402 * Retrieve the set of values that occur in matches for ea.
403 * @return the Set of all values or empty set if there are no matches
404 *
405 */
406 public Set<External_Allowance> getAllValuesOfea() {
407 return rawStreamAllValuesOfea(emptyArray()).collect(Collectors.toSet());
408 }
409
410 /**
411 * Retrieve the set of values that occur in matches for ea.
412 * @return the Set of all values or empty set if there are no matches
413 *
414 */
415 public Stream<External_Allowance> streamAllValuesOfea() {
416 return rawStreamAllValuesOfea(emptyArray());
417 }
418
419 @Override
420 protected X_inv15.Match tupleToMatch(final Tuple t) {
421 try {
422 return X_inv15.Match.newMatch((External_Allowance) t.get(POSITION_EA));
423 } catch(ClassCastException e) {
424 LOGGER.error("Element(s) in tuple not properly typed!",e);
425 return null;
426 }
427 }
428
429 @Override
430 protected X_inv15.Match arrayToMatch(final Object[] match) {
431 try {
432 return X_inv15.Match.newMatch((External_Allowance) match[POSITION_EA]);
433 } catch(ClassCastException e) {
434 LOGGER.error("Element(s) in array not properly typed!",e);
435 return null;
436 }
437 }
438
439 @Override
440 protected X_inv15.Match arrayToMatchMutable(final Object[] match) {
441 try {
442 return X_inv15.Match.newMutableMatch((External_Allowance) match[POSITION_EA]);
443 } catch(ClassCastException e) {
444 LOGGER.error("Element(s) in array not properly typed!",e);
445 return null;
446 }
447 }
448
449 /**
450 * @return the singleton instance of the query specification of this pattern
451 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
452 *
453 */
454 public static IQuerySpecification<X_inv15.Matcher> querySpecification() {
455 return X_inv15.instance();
456 }
457 }
458
459 private X_inv15() {
460 super(GeneratedPQuery.INSTANCE);
461 }
462
463 /**
464 * @return the singleton instance of the query specification
465 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
466 *
467 */
468 public static X_inv15 instance() {
469 try{
470 return LazyHolder.INSTANCE;
471 } catch (ExceptionInInitializerError err) {
472 throw processInitializerError(err);
473 }
474 }
475
476 @Override
477 protected X_inv15.Matcher instantiate(final ViatraQueryEngine engine) {
478 return X_inv15.Matcher.on(engine);
479 }
480
481 @Override
482 public X_inv15.Matcher instantiate() {
483 return X_inv15.Matcher.create();
484 }
485
486 @Override
487 public X_inv15.Match newEmptyMatch() {
488 return X_inv15.Match.newEmptyMatch();
489 }
490
491 @Override
492 public X_inv15.Match newMatch(final Object... parameters) {
493 return X_inv15.Match.newMatch((Taxation.External_Allowance) parameters[0]);
494 }
495
496 /**
497 * Inner class allowing the singleton instance of {@link X_inv15} to be created
498 * <b>not</b> at the class load time of the outer class,
499 * but rather at the first call to {@link X_inv15#instance()}.
500 *
501 * <p> This workaround is required e.g. to support recursion.
502 *
503 */
504 private static class LazyHolder {
505 private static final X_inv15 INSTANCE = new X_inv15();
506
507 /**
508 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
509 * This initialization order is required to support indirect recursion.
510 *
511 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
512 *
513 */
514 private static final Object STATIC_INITIALIZER = ensureInitialized();
515
516 public static Object ensureInitialized() {
517 INSTANCE.ensureInitializedInternal();
518 return null;
519 }
520 }
521
522 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
523 private static final X_inv15.GeneratedPQuery INSTANCE = new GeneratedPQuery();
524
525 private final PParameter parameter_ea = new PParameter("ea", "Taxation.External_Allowance", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "External_Allowance")), PParameterDirection.INOUT);
526
527 private final List<PParameter> parameters = Arrays.asList(parameter_ea);
528
529 private GeneratedPQuery() {
530 super(PVisibility.PUBLIC);
531 }
532
533 @Override
534 public String getFullyQualifiedName() {
535 return "queries.x_inv15";
536 }
537
538 @Override
539 public List<String> getParameterNames() {
540 return Arrays.asList("ea");
541 }
542
543 @Override
544 public List<PParameter> getParameters() {
545 return parameters;
546 }
547
548 @Override
549 public Set<PBody> doGetContainedBodies() {
550 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
551 Set<PBody> bodies = new LinkedHashSet<>();
552 {
553 PBody body = new PBody(this);
554 PVariable var_ea = body.getOrCreateVariableByName("ea");
555 PVariable var_child = body.getOrCreateVariableByName("child");
556 PVariable var_h = body.getOrCreateVariableByName("h");
557 PVariable var_iA = body.getOrCreateVariableByName("iA");
558 new TypeConstraint(body, Tuples.flatTupleOf(var_ea), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "External_Allowance")));
559 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
560 new ExportedParameter(body, var_ea, parameter_ea)
561 ));
562 // External_Allowance.person(ea, child)
563 new TypeConstraint(body, Tuples.flatTupleOf(var_ea), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "External_Allowance")));
564 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
565 new TypeConstraint(body, Tuples.flatTupleOf(var_ea, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "External_Allowance", "person")));
566 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
567 new Equality(body, var__virtual_0_, var_child);
568 // Household.children(h, child)
569 new TypeConstraint(body, Tuples.flatTupleOf(var_h), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Household")));
570 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
571 new TypeConstraint(body, Tuples.flatTupleOf(var_h, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Household", "children")));
572 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
573 new Equality(body, var__virtual_1_, var_child);
574 // //only one due to multiplicity Household.parents.individual_A(h, iA)
575 new TypeConstraint(body, Tuples.flatTupleOf(var_h), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Household")));
576 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
577 new TypeConstraint(body, Tuples.flatTupleOf(var_h, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Household", "parents")));
578 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
579 PVariable var__virtual_3_ = body.getOrCreateVariableByName(".virtual{3}");
580 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_, var__virtual_3_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "individual_A")));
581 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_3_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
582 new Equality(body, var__virtual_3_, var_iA);
583 // Tax_Payer(iA)
584 new TypeConstraint(body, Tuples.flatTupleOf(var_iA), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
585 // External_Allowance.reciver(ea, iA)
586 new TypeConstraint(body, Tuples.flatTupleOf(var_ea), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "External_Allowance")));
587 PVariable var__virtual_4_ = body.getOrCreateVariableByName(".virtual{4}");
588 new TypeConstraint(body, Tuples.flatTupleOf(var_ea, var__virtual_4_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "External_Allowance", "reciver")));
589 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_4_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
590 new Equality(body, var__virtual_4_, var_iA);
591 bodies.add(body);
592 }
593 {
594 PBody body = new PBody(this);
595 PVariable var_ea = body.getOrCreateVariableByName("ea");
596 PVariable var_child = body.getOrCreateVariableByName("child");
597 PVariable var_h = body.getOrCreateVariableByName("h");
598 PVariable var_iB = body.getOrCreateVariableByName("iB");
599 new TypeConstraint(body, Tuples.flatTupleOf(var_ea), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "External_Allowance")));
600 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
601 new ExportedParameter(body, var_ea, parameter_ea)
602 ));
603 // External_Allowance.person(ea, child)
604 new TypeConstraint(body, Tuples.flatTupleOf(var_ea), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "External_Allowance")));
605 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
606 new TypeConstraint(body, Tuples.flatTupleOf(var_ea, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "External_Allowance", "person")));
607 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
608 new Equality(body, var__virtual_0_, var_child);
609 // Household.children(h, child)
610 new TypeConstraint(body, Tuples.flatTupleOf(var_h), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Household")));
611 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
612 new TypeConstraint(body, Tuples.flatTupleOf(var_h, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Household", "children")));
613 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
614 new Equality(body, var__virtual_1_, var_child);
615 // //only one due to multiplicity Household.parents.individual_B(h, iB)
616 new TypeConstraint(body, Tuples.flatTupleOf(var_h), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Household")));
617 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
618 new TypeConstraint(body, Tuples.flatTupleOf(var_h, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Household", "parents")));
619 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
620 PVariable var__virtual_3_ = body.getOrCreateVariableByName(".virtual{3}");
621 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_, var__virtual_3_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "individual_B")));
622 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_3_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
623 new Equality(body, var__virtual_3_, var_iB);
624 // Tax_Payer(iB)
625 new TypeConstraint(body, Tuples.flatTupleOf(var_iB), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
626 // External_Allowance.reciver(ea, iB)
627 new TypeConstraint(body, Tuples.flatTupleOf(var_ea), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "External_Allowance")));
628 PVariable var__virtual_4_ = body.getOrCreateVariableByName(".virtual{4}");
629 new TypeConstraint(body, Tuples.flatTupleOf(var_ea, var__virtual_4_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "External_Allowance", "reciver")));
630 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_4_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
631 new Equality(body, var__virtual_4_, var_iB);
632 bodies.add(body);
633 }
634 return bodies;
635 }
636 }
637}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv47.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv47.java
deleted file mode 100644
index c602f8d4..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv47.java
+++ /dev/null
@@ -1,569 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Legal_Union_Record;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.basicenumerables.ConstantValue;
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 x_inv47(lur : Legal_Union_Record) {
50 * Legal_Union_Record.separation_cause(lur, ::NONE);
51 * Legal_Union_Record.end_year(lur, -1);
52 * }
53 * </pre></code>
54 *
55 * @see Matcher
56 * @see Match
57 *
58 */
59@SuppressWarnings("all")
60public final class X_inv47 extends BaseGeneratedEMFQuerySpecification<X_inv47.Matcher> {
61 /**
62 * Pattern-specific match representation of the queries.x_inv47 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 Legal_Union_Record fLur;
75
76 private static List<String> parameterNames = makeImmutableList("lur");
77
78 private Match(final Legal_Union_Record pLur) {
79 this.fLur = pLur;
80 }
81
82 @Override
83 public Object get(final String parameterName) {
84 switch(parameterName) {
85 case "lur": return this.fLur;
86 default: return null;
87 }
88 }
89
90 @Override
91 public Object get(final int index) {
92 switch(index) {
93 case 0: return this.fLur;
94 default: return null;
95 }
96 }
97
98 public Legal_Union_Record getLur() {
99 return this.fLur;
100 }
101
102 @Override
103 public boolean set(final String parameterName, final Object newValue) {
104 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
105 if ("lur".equals(parameterName) ) {
106 this.fLur = (Legal_Union_Record) newValue;
107 return true;
108 }
109 return false;
110 }
111
112 public void setLur(final Legal_Union_Record pLur) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 this.fLur = pLur;
115 }
116
117 @Override
118 public String patternName() {
119 return "queries.x_inv47";
120 }
121
122 @Override
123 public List<String> parameterNames() {
124 return X_inv47.Match.parameterNames;
125 }
126
127 @Override
128 public Object[] toArray() {
129 return new Object[]{fLur};
130 }
131
132 @Override
133 public X_inv47.Match toImmutable() {
134 return isMutable() ? newMatch(fLur) : this;
135 }
136
137 @Override
138 public String prettyPrint() {
139 StringBuilder result = new StringBuilder();
140 result.append("\"lur\"=" + prettyPrintValue(fLur));
141 return result.toString();
142 }
143
144 @Override
145 public int hashCode() {
146 return Objects.hash(fLur);
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 X_inv47.Match)) {
157 X_inv47.Match other = (X_inv47.Match) obj;
158 return Objects.equals(fLur, other.fLur);
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 X_inv47 specification() {
171 return X_inv47.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 X_inv47.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 pLur the fixed value of pattern parameter lur, or null if not bound.
190 * @return the new, mutable (partial) match object.
191 *
192 */
193 public static X_inv47.Match newMutableMatch(final Legal_Union_Record pLur) {
194 return new Mutable(pLur);
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 pLur the fixed value of pattern parameter lur, or null if not bound.
202 * @return the (partial) match object.
203 *
204 */
205 public static X_inv47.Match newMatch(final Legal_Union_Record pLur) {
206 return new Immutable(pLur);
207 }
208
209 private static final class Mutable extends X_inv47.Match {
210 Mutable(final Legal_Union_Record pLur) {
211 super(pLur);
212 }
213
214 @Override
215 public boolean isMutable() {
216 return true;
217 }
218 }
219
220 private static final class Immutable extends X_inv47.Match {
221 Immutable(final Legal_Union_Record pLur) {
222 super(pLur);
223 }
224
225 @Override
226 public boolean isMutable() {
227 return false;
228 }
229 }
230 }
231
232 /**
233 * Generated pattern matcher API of the queries.x_inv47 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 * pattern x_inv47(lur : Legal_Union_Record) {
244 * Legal_Union_Record.separation_cause(lur, ::NONE);
245 * Legal_Union_Record.end_year(lur, -1);
246 * }
247 * </pre></code>
248 *
249 * @see Match
250 * @see X_inv47
251 *
252 */
253 public static class Matcher extends BaseMatcher<X_inv47.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 X_inv47.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 X_inv47.Matcher create() {
278 return new Matcher();
279 }
280
281 private static final int POSITION_LUR = 0;
282
283 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv47.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 pLur the fixed value of pattern parameter lur, or null if not bound.
300 * @return matches represented as a Match object.
301 *
302 */
303 public Collection<X_inv47.Match> getAllMatches(final Legal_Union_Record pLur) {
304 return rawStreamAllMatches(new Object[]{pLur}).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 pLur the fixed value of pattern parameter lur, or null if not bound.
314 * @return a stream of matches represented as a Match object.
315 *
316 */
317 public Stream<X_inv47.Match> streamAllMatches(final Legal_Union_Record pLur) {
318 return rawStreamAllMatches(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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<X_inv47.Match> getOneArbitraryMatch(final Legal_Union_Record pLur) {
329 return rawGetOneArbitraryMatch(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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 Legal_Union_Record pLur) {
340 return rawHasMatch(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, or null if not bound.
346 * @return the number of pattern matches found.
347 *
348 */
349 public int countMatches(final Legal_Union_Record pLur) {
350 return rawCountMatches(new Object[]{pLur});
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 pLur the fixed value of pattern parameter lur, 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 Legal_Union_Record pLur, final Consumer<? super X_inv47.Match> processor) {
362 return rawForOneArbitraryMatch(new Object[]{pLur}, 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 pLur the fixed value of pattern parameter lur, or null if not bound.
370 * @return the (partial) match object.
371 *
372 */
373 public X_inv47.Match newMatch(final Legal_Union_Record pLur) {
374 return X_inv47.Match.newMatch(pLur);
375 }
376
377 /**
378 * Retrieve the set of values that occur in matches for lur.
379 * @return the Set of all values or empty set if there are no matches
380 *
381 */
382 protected Stream<Legal_Union_Record> rawStreamAllValuesOflur(final Object[] parameters) {
383 return rawStreamAllValues(POSITION_LUR, parameters).map(Legal_Union_Record.class::cast);
384 }
385
386 /**
387 * Retrieve the set of values that occur in matches for lur.
388 * @return the Set of all values or empty set if there are no matches
389 *
390 */
391 public Set<Legal_Union_Record> getAllValuesOflur() {
392 return rawStreamAllValuesOflur(emptyArray()).collect(Collectors.toSet());
393 }
394
395 /**
396 * Retrieve the set of values that occur in matches for lur.
397 * @return the Set of all values or empty set if there are no matches
398 *
399 */
400 public Stream<Legal_Union_Record> streamAllValuesOflur() {
401 return rawStreamAllValuesOflur(emptyArray());
402 }
403
404 @Override
405 protected X_inv47.Match tupleToMatch(final Tuple t) {
406 try {
407 return X_inv47.Match.newMatch((Legal_Union_Record) t.get(POSITION_LUR));
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 X_inv47.Match arrayToMatch(final Object[] match) {
416 try {
417 return X_inv47.Match.newMatch((Legal_Union_Record) match[POSITION_LUR]);
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 X_inv47.Match arrayToMatchMutable(final Object[] match) {
426 try {
427 return X_inv47.Match.newMutableMatch((Legal_Union_Record) match[POSITION_LUR]);
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<X_inv47.Matcher> querySpecification() {
440 return X_inv47.instance();
441 }
442 }
443
444 private X_inv47() {
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 X_inv47 instance() {
454 try{
455 return LazyHolder.INSTANCE;
456 } catch (ExceptionInInitializerError err) {
457 throw processInitializerError(err);
458 }
459 }
460
461 @Override
462 protected X_inv47.Matcher instantiate(final ViatraQueryEngine engine) {
463 return X_inv47.Matcher.on(engine);
464 }
465
466 @Override
467 public X_inv47.Matcher instantiate() {
468 return X_inv47.Matcher.create();
469 }
470
471 @Override
472 public X_inv47.Match newEmptyMatch() {
473 return X_inv47.Match.newEmptyMatch();
474 }
475
476 @Override
477 public X_inv47.Match newMatch(final Object... parameters) {
478 return X_inv47.Match.newMatch((Taxation.Legal_Union_Record) parameters[0]);
479 }
480
481 /**
482 * Inner class allowing the singleton instance of {@link X_inv47} 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 X_inv47#instance()}.
485 *
486 * <p> This workaround is required e.g. to support recursion.
487 *
488 */
489 private static class LazyHolder {
490 private static final X_inv47 INSTANCE = new X_inv47();
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 X_inv47.GeneratedPQuery INSTANCE = new GeneratedPQuery();
509
510 private final PParameter parameter_lur = new PParameter("lur", "Taxation.Legal_Union_Record", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Legal_Union_Record")), PParameterDirection.INOUT);
511
512 private final List<PParameter> parameters = Arrays.asList(parameter_lur);
513
514 private GeneratedPQuery() {
515 super(PVisibility.PUBLIC);
516 }
517
518 @Override
519 public String getFullyQualifiedName() {
520 return "queries.x_inv47";
521 }
522
523 @Override
524 public List<String> getParameterNames() {
525 return Arrays.asList("lur");
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_lur = body.getOrCreateVariableByName("lur");
540 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
541 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
542 new ExportedParameter(body, var_lur, parameter_lur)
543 ));
544 // Legal_Union_Record.separation_cause(lur, ::NONE)
545 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
546 new ConstantValue(body, var__virtual_0_, getEnumLiteral("http:///TaxCard.ecore", "Separation_Causes", "NONE").getInstance());
547 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
548 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
549 new TypeConstraint(body, Tuples.flatTupleOf(var_lur, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "separation_cause")));
550 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http:///TaxCard.ecore", "Separation_Causes")));
551 new Equality(body, var__virtual_1_, var__virtual_0_);
552 // Legal_Union_Record.end_year(lur, -1)
553 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
554 new ConstantValue(body, var__virtual_2_, -1);
555 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
556 PVariable var__virtual_3_ = body.getOrCreateVariableByName(".virtual{3}");
557 new TypeConstraint(body, Tuples.flatTupleOf(var_lur, var__virtual_3_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "end_year")));
558 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_3_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EInt")));
559 new Equality(body, var__virtual_3_, var__virtual_2_);
560 bodies.add(body);
561 }
562 return bodies;
563 }
564 }
565
566 private static int evaluateExpression_1_1() {
567 return 1;
568 }
569}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_3.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_3.java
deleted file mode 100644
index 913e9c7e..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_3.java
+++ /dev/null
@@ -1,555 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Physical_Person;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.basicenumerables.ConstantValue;
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 x_inv48_3(p : Physical_Person) {
50 * Physical_Person.disability_type(p, ::NONE);
51 * }
52 * </pre></code>
53 *
54 * @see Matcher
55 * @see Match
56 *
57 */
58@SuppressWarnings("all")
59public final class X_inv48_3 extends BaseGeneratedEMFQuerySpecification<X_inv48_3.Matcher> {
60 /**
61 * Pattern-specific match representation of the queries.x_inv48_3 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 Physical_Person fP;
74
75 private static List<String> parameterNames = makeImmutableList("p");
76
77 private Match(final Physical_Person pP) {
78 this.fP = pP;
79 }
80
81 @Override
82 public Object get(final String parameterName) {
83 switch(parameterName) {
84 case "p": return this.fP;
85 default: return null;
86 }
87 }
88
89 @Override
90 public Object get(final int index) {
91 switch(index) {
92 case 0: return this.fP;
93 default: return null;
94 }
95 }
96
97 public Physical_Person getP() {
98 return this.fP;
99 }
100
101 @Override
102 public boolean set(final String parameterName, final Object newValue) {
103 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
104 if ("p".equals(parameterName) ) {
105 this.fP = (Physical_Person) newValue;
106 return true;
107 }
108 return false;
109 }
110
111 public void setP(final Physical_Person pP) {
112 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
113 this.fP = pP;
114 }
115
116 @Override
117 public String patternName() {
118 return "queries.x_inv48_3";
119 }
120
121 @Override
122 public List<String> parameterNames() {
123 return X_inv48_3.Match.parameterNames;
124 }
125
126 @Override
127 public Object[] toArray() {
128 return new Object[]{fP};
129 }
130
131 @Override
132 public X_inv48_3.Match toImmutable() {
133 return isMutable() ? newMatch(fP) : this;
134 }
135
136 @Override
137 public String prettyPrint() {
138 StringBuilder result = new StringBuilder();
139 result.append("\"p\"=" + prettyPrintValue(fP));
140 return result.toString();
141 }
142
143 @Override
144 public int hashCode() {
145 return Objects.hash(fP);
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 X_inv48_3.Match)) {
156 X_inv48_3.Match other = (X_inv48_3.Match) obj;
157 return Objects.equals(fP, other.fP);
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 X_inv48_3 specification() {
170 return X_inv48_3.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 X_inv48_3.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 pP the fixed value of pattern parameter p, or null if not bound.
189 * @return the new, mutable (partial) match object.
190 *
191 */
192 public static X_inv48_3.Match newMutableMatch(final Physical_Person pP) {
193 return new Mutable(pP);
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 pP the fixed value of pattern parameter p, or null if not bound.
201 * @return the (partial) match object.
202 *
203 */
204 public static X_inv48_3.Match newMatch(final Physical_Person pP) {
205 return new Immutable(pP);
206 }
207
208 private static final class Mutable extends X_inv48_3.Match {
209 Mutable(final Physical_Person pP) {
210 super(pP);
211 }
212
213 @Override
214 public boolean isMutable() {
215 return true;
216 }
217 }
218
219 private static final class Immutable extends X_inv48_3.Match {
220 Immutable(final Physical_Person pP) {
221 super(pP);
222 }
223
224 @Override
225 public boolean isMutable() {
226 return false;
227 }
228 }
229 }
230
231 /**
232 * Generated pattern matcher API of the queries.x_inv48_3 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 x_inv48_3(p : Physical_Person) {
243 * Physical_Person.disability_type(p, ::NONE);
244 * }
245 * </pre></code>
246 *
247 * @see Match
248 * @see X_inv48_3
249 *
250 */
251 public static class Matcher extends BaseMatcher<X_inv48_3.Match> {
252 /**
253 * Initializes the pattern matcher within an existing VIATRA Query engine.
254 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
255 *
256 * @param engine the existing VIATRA Query engine in which this matcher will be created.
257 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
258 *
259 */
260 public static X_inv48_3.Matcher on(final ViatraQueryEngine engine) {
261 // check if matcher already exists
262 Matcher matcher = engine.getExistingMatcher(querySpecification());
263 if (matcher == null) {
264 matcher = (Matcher)engine.getMatcher(querySpecification());
265 }
266 return matcher;
267 }
268
269 /**
270 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
271 * @return an initialized matcher
272 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
273 *
274 */
275 public static X_inv48_3.Matcher create() {
276 return new Matcher();
277 }
278
279 private static final int POSITION_P = 0;
280
281 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv48_3.Matcher.class);
282
283 /**
284 * Initializes the pattern matcher within an existing VIATRA Query engine.
285 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
286 *
287 * @param engine the existing VIATRA Query engine in which this matcher will be created.
288 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
289 *
290 */
291 private Matcher() {
292 super(querySpecification());
293 }
294
295 /**
296 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
297 * @param pP the fixed value of pattern parameter p, or null if not bound.
298 * @return matches represented as a Match object.
299 *
300 */
301 public Collection<X_inv48_3.Match> getAllMatches(final Physical_Person pP) {
302 return rawStreamAllMatches(new Object[]{pP}).collect(Collectors.toSet());
303 }
304
305 /**
306 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
307 * </p>
308 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
309 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
310 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
311 * @param pP the fixed value of pattern parameter p, or null if not bound.
312 * @return a stream of matches represented as a Match object.
313 *
314 */
315 public Stream<X_inv48_3.Match> streamAllMatches(final Physical_Person pP) {
316 return rawStreamAllMatches(new Object[]{pP});
317 }
318
319 /**
320 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
321 * Neither determinism nor randomness of selection is guaranteed.
322 * @param pP the fixed value of pattern parameter p, or null if not bound.
323 * @return a match represented as a Match object, or null if no match is found.
324 *
325 */
326 public Optional<X_inv48_3.Match> getOneArbitraryMatch(final Physical_Person pP) {
327 return rawGetOneArbitraryMatch(new Object[]{pP});
328 }
329
330 /**
331 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
332 * under any possible substitution of the unspecified parameters (if any).
333 * @param pP the fixed value of pattern parameter p, or null if not bound.
334 * @return true if the input is a valid (partial) match of the pattern.
335 *
336 */
337 public boolean hasMatch(final Physical_Person pP) {
338 return rawHasMatch(new Object[]{pP});
339 }
340
341 /**
342 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
343 * @param pP the fixed value of pattern parameter p, or null if not bound.
344 * @return the number of pattern matches found.
345 *
346 */
347 public int countMatches(final Physical_Person pP) {
348 return rawCountMatches(new Object[]{pP});
349 }
350
351 /**
352 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
353 * Neither determinism nor randomness of selection is guaranteed.
354 * @param pP the fixed value of pattern parameter p, or null if not bound.
355 * @param processor the action that will process the selected match.
356 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
357 *
358 */
359 public boolean forOneArbitraryMatch(final Physical_Person pP, final Consumer<? super X_inv48_3.Match> processor) {
360 return rawForOneArbitraryMatch(new Object[]{pP}, processor);
361 }
362
363 /**
364 * Returns a new (partial) match.
365 * This can be used e.g. to call the matcher with a partial match.
366 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
367 * @param pP the fixed value of pattern parameter p, or null if not bound.
368 * @return the (partial) match object.
369 *
370 */
371 public X_inv48_3.Match newMatch(final Physical_Person pP) {
372 return X_inv48_3.Match.newMatch(pP);
373 }
374
375 /**
376 * Retrieve the set of values that occur in matches for p.
377 * @return the Set of all values or empty set if there are no matches
378 *
379 */
380 protected Stream<Physical_Person> rawStreamAllValuesOfp(final Object[] parameters) {
381 return rawStreamAllValues(POSITION_P, parameters).map(Physical_Person.class::cast);
382 }
383
384 /**
385 * Retrieve the set of values that occur in matches for p.
386 * @return the Set of all values or empty set if there are no matches
387 *
388 */
389 public Set<Physical_Person> getAllValuesOfp() {
390 return rawStreamAllValuesOfp(emptyArray()).collect(Collectors.toSet());
391 }
392
393 /**
394 * Retrieve the set of values that occur in matches for p.
395 * @return the Set of all values or empty set if there are no matches
396 *
397 */
398 public Stream<Physical_Person> streamAllValuesOfp() {
399 return rawStreamAllValuesOfp(emptyArray());
400 }
401
402 @Override
403 protected X_inv48_3.Match tupleToMatch(final Tuple t) {
404 try {
405 return X_inv48_3.Match.newMatch((Physical_Person) t.get(POSITION_P));
406 } catch(ClassCastException e) {
407 LOGGER.error("Element(s) in tuple not properly typed!",e);
408 return null;
409 }
410 }
411
412 @Override
413 protected X_inv48_3.Match arrayToMatch(final Object[] match) {
414 try {
415 return X_inv48_3.Match.newMatch((Physical_Person) match[POSITION_P]);
416 } catch(ClassCastException e) {
417 LOGGER.error("Element(s) in array not properly typed!",e);
418 return null;
419 }
420 }
421
422 @Override
423 protected X_inv48_3.Match arrayToMatchMutable(final Object[] match) {
424 try {
425 return X_inv48_3.Match.newMutableMatch((Physical_Person) match[POSITION_P]);
426 } catch(ClassCastException e) {
427 LOGGER.error("Element(s) in array not properly typed!",e);
428 return null;
429 }
430 }
431
432 /**
433 * @return the singleton instance of the query specification of this pattern
434 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
435 *
436 */
437 public static IQuerySpecification<X_inv48_3.Matcher> querySpecification() {
438 return X_inv48_3.instance();
439 }
440 }
441
442 private X_inv48_3() {
443 super(GeneratedPQuery.INSTANCE);
444 }
445
446 /**
447 * @return the singleton instance of the query specification
448 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
449 *
450 */
451 public static X_inv48_3 instance() {
452 try{
453 return LazyHolder.INSTANCE;
454 } catch (ExceptionInInitializerError err) {
455 throw processInitializerError(err);
456 }
457 }
458
459 @Override
460 protected X_inv48_3.Matcher instantiate(final ViatraQueryEngine engine) {
461 return X_inv48_3.Matcher.on(engine);
462 }
463
464 @Override
465 public X_inv48_3.Matcher instantiate() {
466 return X_inv48_3.Matcher.create();
467 }
468
469 @Override
470 public X_inv48_3.Match newEmptyMatch() {
471 return X_inv48_3.Match.newEmptyMatch();
472 }
473
474 @Override
475 public X_inv48_3.Match newMatch(final Object... parameters) {
476 return X_inv48_3.Match.newMatch((Taxation.Physical_Person) parameters[0]);
477 }
478
479 /**
480 * Inner class allowing the singleton instance of {@link X_inv48_3} to be created
481 * <b>not</b> at the class load time of the outer class,
482 * but rather at the first call to {@link X_inv48_3#instance()}.
483 *
484 * <p> This workaround is required e.g. to support recursion.
485 *
486 */
487 private static class LazyHolder {
488 private static final X_inv48_3 INSTANCE = new X_inv48_3();
489
490 /**
491 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
492 * This initialization order is required to support indirect recursion.
493 *
494 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
495 *
496 */
497 private static final Object STATIC_INITIALIZER = ensureInitialized();
498
499 public static Object ensureInitialized() {
500 INSTANCE.ensureInitializedInternal();
501 return null;
502 }
503 }
504
505 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
506 private static final X_inv48_3.GeneratedPQuery INSTANCE = new GeneratedPQuery();
507
508 private final PParameter parameter_p = new PParameter("p", "Taxation.Physical_Person", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Physical_Person")), PParameterDirection.INOUT);
509
510 private final List<PParameter> parameters = Arrays.asList(parameter_p);
511
512 private GeneratedPQuery() {
513 super(PVisibility.PUBLIC);
514 }
515
516 @Override
517 public String getFullyQualifiedName() {
518 return "queries.x_inv48_3";
519 }
520
521 @Override
522 public List<String> getParameterNames() {
523 return Arrays.asList("p");
524 }
525
526 @Override
527 public List<PParameter> getParameters() {
528 return parameters;
529 }
530
531 @Override
532 public Set<PBody> doGetContainedBodies() {
533 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
534 Set<PBody> bodies = new LinkedHashSet<>();
535 {
536 PBody body = new PBody(this);
537 PVariable var_p = body.getOrCreateVariableByName("p");
538 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
539 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
540 new ExportedParameter(body, var_p, parameter_p)
541 ));
542 // Physical_Person.disability_type(p, ::NONE)
543 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
544 new ConstantValue(body, var__virtual_0_, getEnumLiteral("http:///TaxCard.ecore", "Disability_Types", "NONE").getInstance());
545 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
546 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
547 new TypeConstraint(body, Tuples.flatTupleOf(var_p, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "disability_type")));
548 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http:///TaxCard.ecore", "Disability_Types")));
549 new Equality(body, var__virtual_1_, var__virtual_0_);
550 bodies.add(body);
551 }
552 return bodies;
553 }
554 }
555}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_Dis.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_Dis.java
deleted file mode 100644
index 08de1250..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_Dis.java
+++ /dev/null
@@ -1,610 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Physical_Person;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.IExpressionEvaluator;
32import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
33import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
34import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
40import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
43import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
44import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
45import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
46import queries.X_inv48_3;
47
48/**
49 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
50 *
51 * <p>Original source:
52 * <code><pre>
53 * pattern x_inv48_Dis(p : Physical_Person) {
54 * neg find x_inv48_3(p);
55 * Physical_Person.disability_percentage(p, disPer);
56 * check(disPer {@literal >} 0.0);
57 * check(disPer {@literal <}= 1.0);
58 * }
59 * </pre></code>
60 *
61 * @see Matcher
62 * @see Match
63 *
64 */
65@SuppressWarnings("all")
66public final class X_inv48_Dis extends BaseGeneratedEMFQuerySpecification<X_inv48_Dis.Matcher> {
67 /**
68 * Pattern-specific match representation of the queries.x_inv48_Dis pattern,
69 * to be used in conjunction with {@link Matcher}.
70 *
71 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
72 * Each instance is a (possibly partial) substitution of pattern parameters,
73 * usable to represent a match of the pattern in the result of a query,
74 * or to specify the bound (fixed) input parameters when issuing a query.
75 *
76 * @see Matcher
77 *
78 */
79 public static abstract class Match extends BasePatternMatch {
80 private Physical_Person fP;
81
82 private static List<String> parameterNames = makeImmutableList("p");
83
84 private Match(final Physical_Person pP) {
85 this.fP = pP;
86 }
87
88 @Override
89 public Object get(final String parameterName) {
90 switch(parameterName) {
91 case "p": return this.fP;
92 default: return null;
93 }
94 }
95
96 @Override
97 public Object get(final int index) {
98 switch(index) {
99 case 0: return this.fP;
100 default: return null;
101 }
102 }
103
104 public Physical_Person getP() {
105 return this.fP;
106 }
107
108 @Override
109 public boolean set(final String parameterName, final Object newValue) {
110 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
111 if ("p".equals(parameterName) ) {
112 this.fP = (Physical_Person) newValue;
113 return true;
114 }
115 return false;
116 }
117
118 public void setP(final Physical_Person pP) {
119 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
120 this.fP = pP;
121 }
122
123 @Override
124 public String patternName() {
125 return "queries.x_inv48_Dis";
126 }
127
128 @Override
129 public List<String> parameterNames() {
130 return X_inv48_Dis.Match.parameterNames;
131 }
132
133 @Override
134 public Object[] toArray() {
135 return new Object[]{fP};
136 }
137
138 @Override
139 public X_inv48_Dis.Match toImmutable() {
140 return isMutable() ? newMatch(fP) : this;
141 }
142
143 @Override
144 public String prettyPrint() {
145 StringBuilder result = new StringBuilder();
146 result.append("\"p\"=" + prettyPrintValue(fP));
147 return result.toString();
148 }
149
150 @Override
151 public int hashCode() {
152 return Objects.hash(fP);
153 }
154
155 @Override
156 public boolean equals(final Object obj) {
157 if (this == obj)
158 return true;
159 if (obj == null) {
160 return false;
161 }
162 if ((obj instanceof X_inv48_Dis.Match)) {
163 X_inv48_Dis.Match other = (X_inv48_Dis.Match) obj;
164 return Objects.equals(fP, other.fP);
165 } else {
166 // this should be infrequent
167 if (!(obj instanceof IPatternMatch)) {
168 return false;
169 }
170 IPatternMatch otherSig = (IPatternMatch) obj;
171 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
172 }
173 }
174
175 @Override
176 public X_inv48_Dis specification() {
177 return X_inv48_Dis.instance();
178 }
179
180 /**
181 * Returns an empty, mutable match.
182 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
183 *
184 * @return the empty match.
185 *
186 */
187 public static X_inv48_Dis.Match newEmptyMatch() {
188 return new Mutable(null);
189 }
190
191 /**
192 * Returns a mutable (partial) match.
193 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
194 *
195 * @param pP the fixed value of pattern parameter p, or null if not bound.
196 * @return the new, mutable (partial) match object.
197 *
198 */
199 public static X_inv48_Dis.Match newMutableMatch(final Physical_Person pP) {
200 return new Mutable(pP);
201 }
202
203 /**
204 * Returns a new (partial) match.
205 * This can be used e.g. to call the matcher with a partial match.
206 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
207 * @param pP the fixed value of pattern parameter p, or null if not bound.
208 * @return the (partial) match object.
209 *
210 */
211 public static X_inv48_Dis.Match newMatch(final Physical_Person pP) {
212 return new Immutable(pP);
213 }
214
215 private static final class Mutable extends X_inv48_Dis.Match {
216 Mutable(final Physical_Person pP) {
217 super(pP);
218 }
219
220 @Override
221 public boolean isMutable() {
222 return true;
223 }
224 }
225
226 private static final class Immutable extends X_inv48_Dis.Match {
227 Immutable(final Physical_Person pP) {
228 super(pP);
229 }
230
231 @Override
232 public boolean isMutable() {
233 return false;
234 }
235 }
236 }
237
238 /**
239 * Generated pattern matcher API of the queries.x_inv48_Dis pattern,
240 * providing pattern-specific query methods.
241 *
242 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
243 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
244 *
245 * <p>Matches of the pattern will be represented as {@link Match}.
246 *
247 * <p>Original source:
248 * <code><pre>
249 * pattern x_inv48_Dis(p : Physical_Person) {
250 * neg find x_inv48_3(p);
251 * Physical_Person.disability_percentage(p, disPer);
252 * check(disPer {@literal >} 0.0);
253 * check(disPer {@literal <}= 1.0);
254 * }
255 * </pre></code>
256 *
257 * @see Match
258 * @see X_inv48_Dis
259 *
260 */
261 public static class Matcher extends BaseMatcher<X_inv48_Dis.Match> {
262 /**
263 * Initializes the pattern matcher within an existing VIATRA Query engine.
264 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
265 *
266 * @param engine the existing VIATRA Query engine in which this matcher will be created.
267 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
268 *
269 */
270 public static X_inv48_Dis.Matcher on(final ViatraQueryEngine engine) {
271 // check if matcher already exists
272 Matcher matcher = engine.getExistingMatcher(querySpecification());
273 if (matcher == null) {
274 matcher = (Matcher)engine.getMatcher(querySpecification());
275 }
276 return matcher;
277 }
278
279 /**
280 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
281 * @return an initialized matcher
282 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
283 *
284 */
285 public static X_inv48_Dis.Matcher create() {
286 return new Matcher();
287 }
288
289 private static final int POSITION_P = 0;
290
291 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv48_Dis.Matcher.class);
292
293 /**
294 * Initializes the pattern matcher within an existing VIATRA Query engine.
295 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
296 *
297 * @param engine the existing VIATRA Query engine in which this matcher will be created.
298 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
299 *
300 */
301 private Matcher() {
302 super(querySpecification());
303 }
304
305 /**
306 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
307 * @param pP the fixed value of pattern parameter p, or null if not bound.
308 * @return matches represented as a Match object.
309 *
310 */
311 public Collection<X_inv48_Dis.Match> getAllMatches(final Physical_Person pP) {
312 return rawStreamAllMatches(new Object[]{pP}).collect(Collectors.toSet());
313 }
314
315 /**
316 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
317 * </p>
318 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
319 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
320 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
321 * @param pP the fixed value of pattern parameter p, or null if not bound.
322 * @return a stream of matches represented as a Match object.
323 *
324 */
325 public Stream<X_inv48_Dis.Match> streamAllMatches(final Physical_Person pP) {
326 return rawStreamAllMatches(new Object[]{pP});
327 }
328
329 /**
330 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
331 * Neither determinism nor randomness of selection is guaranteed.
332 * @param pP the fixed value of pattern parameter p, or null if not bound.
333 * @return a match represented as a Match object, or null if no match is found.
334 *
335 */
336 public Optional<X_inv48_Dis.Match> getOneArbitraryMatch(final Physical_Person pP) {
337 return rawGetOneArbitraryMatch(new Object[]{pP});
338 }
339
340 /**
341 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
342 * under any possible substitution of the unspecified parameters (if any).
343 * @param pP the fixed value of pattern parameter p, or null if not bound.
344 * @return true if the input is a valid (partial) match of the pattern.
345 *
346 */
347 public boolean hasMatch(final Physical_Person pP) {
348 return rawHasMatch(new Object[]{pP});
349 }
350
351 /**
352 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
353 * @param pP the fixed value of pattern parameter p, or null if not bound.
354 * @return the number of pattern matches found.
355 *
356 */
357 public int countMatches(final Physical_Person pP) {
358 return rawCountMatches(new Object[]{pP});
359 }
360
361 /**
362 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
363 * Neither determinism nor randomness of selection is guaranteed.
364 * @param pP the fixed value of pattern parameter p, or null if not bound.
365 * @param processor the action that will process the selected match.
366 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
367 *
368 */
369 public boolean forOneArbitraryMatch(final Physical_Person pP, final Consumer<? super X_inv48_Dis.Match> processor) {
370 return rawForOneArbitraryMatch(new Object[]{pP}, processor);
371 }
372
373 /**
374 * Returns a new (partial) match.
375 * This can be used e.g. to call the matcher with a partial match.
376 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
377 * @param pP the fixed value of pattern parameter p, or null if not bound.
378 * @return the (partial) match object.
379 *
380 */
381 public X_inv48_Dis.Match newMatch(final Physical_Person pP) {
382 return X_inv48_Dis.Match.newMatch(pP);
383 }
384
385 /**
386 * Retrieve the set of values that occur in matches for p.
387 * @return the Set of all values or empty set if there are no matches
388 *
389 */
390 protected Stream<Physical_Person> rawStreamAllValuesOfp(final Object[] parameters) {
391 return rawStreamAllValues(POSITION_P, parameters).map(Physical_Person.class::cast);
392 }
393
394 /**
395 * Retrieve the set of values that occur in matches for p.
396 * @return the Set of all values or empty set if there are no matches
397 *
398 */
399 public Set<Physical_Person> getAllValuesOfp() {
400 return rawStreamAllValuesOfp(emptyArray()).collect(Collectors.toSet());
401 }
402
403 /**
404 * Retrieve the set of values that occur in matches for p.
405 * @return the Set of all values or empty set if there are no matches
406 *
407 */
408 public Stream<Physical_Person> streamAllValuesOfp() {
409 return rawStreamAllValuesOfp(emptyArray());
410 }
411
412 @Override
413 protected X_inv48_Dis.Match tupleToMatch(final Tuple t) {
414 try {
415 return X_inv48_Dis.Match.newMatch((Physical_Person) t.get(POSITION_P));
416 } catch(ClassCastException e) {
417 LOGGER.error("Element(s) in tuple not properly typed!",e);
418 return null;
419 }
420 }
421
422 @Override
423 protected X_inv48_Dis.Match arrayToMatch(final Object[] match) {
424 try {
425 return X_inv48_Dis.Match.newMatch((Physical_Person) match[POSITION_P]);
426 } catch(ClassCastException e) {
427 LOGGER.error("Element(s) in array not properly typed!",e);
428 return null;
429 }
430 }
431
432 @Override
433 protected X_inv48_Dis.Match arrayToMatchMutable(final Object[] match) {
434 try {
435 return X_inv48_Dis.Match.newMutableMatch((Physical_Person) match[POSITION_P]);
436 } catch(ClassCastException e) {
437 LOGGER.error("Element(s) in array not properly typed!",e);
438 return null;
439 }
440 }
441
442 /**
443 * @return the singleton instance of the query specification of this pattern
444 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
445 *
446 */
447 public static IQuerySpecification<X_inv48_Dis.Matcher> querySpecification() {
448 return X_inv48_Dis.instance();
449 }
450 }
451
452 private X_inv48_Dis() {
453 super(GeneratedPQuery.INSTANCE);
454 }
455
456 /**
457 * @return the singleton instance of the query specification
458 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
459 *
460 */
461 public static X_inv48_Dis instance() {
462 try{
463 return LazyHolder.INSTANCE;
464 } catch (ExceptionInInitializerError err) {
465 throw processInitializerError(err);
466 }
467 }
468
469 @Override
470 protected X_inv48_Dis.Matcher instantiate(final ViatraQueryEngine engine) {
471 return X_inv48_Dis.Matcher.on(engine);
472 }
473
474 @Override
475 public X_inv48_Dis.Matcher instantiate() {
476 return X_inv48_Dis.Matcher.create();
477 }
478
479 @Override
480 public X_inv48_Dis.Match newEmptyMatch() {
481 return X_inv48_Dis.Match.newEmptyMatch();
482 }
483
484 @Override
485 public X_inv48_Dis.Match newMatch(final Object... parameters) {
486 return X_inv48_Dis.Match.newMatch((Taxation.Physical_Person) parameters[0]);
487 }
488
489 /**
490 * Inner class allowing the singleton instance of {@link X_inv48_Dis} to be created
491 * <b>not</b> at the class load time of the outer class,
492 * but rather at the first call to {@link X_inv48_Dis#instance()}.
493 *
494 * <p> This workaround is required e.g. to support recursion.
495 *
496 */
497 private static class LazyHolder {
498 private static final X_inv48_Dis INSTANCE = new X_inv48_Dis();
499
500 /**
501 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
502 * This initialization order is required to support indirect recursion.
503 *
504 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
505 *
506 */
507 private static final Object STATIC_INITIALIZER = ensureInitialized();
508
509 public static Object ensureInitialized() {
510 INSTANCE.ensureInitializedInternal();
511 return null;
512 }
513 }
514
515 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
516 private static final X_inv48_Dis.GeneratedPQuery INSTANCE = new GeneratedPQuery();
517
518 private final PParameter parameter_p = new PParameter("p", "Taxation.Physical_Person", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Physical_Person")), PParameterDirection.INOUT);
519
520 private final List<PParameter> parameters = Arrays.asList(parameter_p);
521
522 private GeneratedPQuery() {
523 super(PVisibility.PUBLIC);
524 }
525
526 @Override
527 public String getFullyQualifiedName() {
528 return "queries.x_inv48_Dis";
529 }
530
531 @Override
532 public List<String> getParameterNames() {
533 return Arrays.asList("p");
534 }
535
536 @Override
537 public List<PParameter> getParameters() {
538 return parameters;
539 }
540
541 @Override
542 public Set<PBody> doGetContainedBodies() {
543 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
544 Set<PBody> bodies = new LinkedHashSet<>();
545 {
546 PBody body = new PBody(this);
547 PVariable var_p = body.getOrCreateVariableByName("p");
548 PVariable var_disPer = body.getOrCreateVariableByName("disPer");
549 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
550 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
551 new ExportedParameter(body, var_p, parameter_p)
552 ));
553 // neg find x_inv48_3(p)
554 new NegativePatternCall(body, Tuples.flatTupleOf(var_p), X_inv48_3.instance().getInternalQueryRepresentation());
555 // Physical_Person.disability_percentage(p, disPer)
556 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
557 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
558 new TypeConstraint(body, Tuples.flatTupleOf(var_p, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "disability_percentage")));
559 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
560 new Equality(body, var__virtual_0_, var_disPer);
561 // check(disPer > 0.0)
562 new ExpressionEvaluation(body, new IExpressionEvaluator() {
563
564 @Override
565 public String getShortDescription() {
566 return "Expression evaluation from pattern x_inv48_Dis";
567 }
568
569 @Override
570 public Iterable<String> getInputParameterNames() {
571 return Arrays.asList("disPer");}
572
573 @Override
574 public Object evaluateExpression(IValueProvider provider) throws Exception {
575 Double disPer = (Double) provider.getValue("disPer");
576 return evaluateExpression_1_1(disPer);
577 }
578 }, null);
579 // check(disPer <= 1.0)
580 new ExpressionEvaluation(body, new IExpressionEvaluator() {
581
582 @Override
583 public String getShortDescription() {
584 return "Expression evaluation from pattern x_inv48_Dis";
585 }
586
587 @Override
588 public Iterable<String> getInputParameterNames() {
589 return Arrays.asList("disPer");}
590
591 @Override
592 public Object evaluateExpression(IValueProvider provider) throws Exception {
593 Double disPer = (Double) provider.getValue("disPer");
594 return evaluateExpression_1_2(disPer);
595 }
596 }, null);
597 bodies.add(body);
598 }
599 return bodies;
600 }
601 }
602
603 private static boolean evaluateExpression_1_1(final Double disPer) {
604 return ((disPer).doubleValue() > 0.0);
605 }
606
607 private static boolean evaluateExpression_1_2(final Double disPer) {
608 return ((disPer).doubleValue() <= 1.0);
609 }
610}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_notDis.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_notDis.java
deleted file mode 100644
index 21dcc068..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv48_notDis.java
+++ /dev/null
@@ -1,569 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Physical_Person;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EDataType;
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.EDataTypeInSlotsKey;
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.basicenumerables.ConstantValue;
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 x_inv48_notDis(p : Physical_Person) {
50 * Physical_Person.disability_type(p, ::NONE);
51 * Physical_Person.disability_percentage(p, 0.0);
52 * }
53 * </pre></code>
54 *
55 * @see Matcher
56 * @see Match
57 *
58 */
59@SuppressWarnings("all")
60public final class X_inv48_notDis extends BaseGeneratedEMFQuerySpecification<X_inv48_notDis.Matcher> {
61 /**
62 * Pattern-specific match representation of the queries.x_inv48_notDis 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 Physical_Person fP;
75
76 private static List<String> parameterNames = makeImmutableList("p");
77
78 private Match(final Physical_Person pP) {
79 this.fP = pP;
80 }
81
82 @Override
83 public Object get(final String parameterName) {
84 switch(parameterName) {
85 case "p": return this.fP;
86 default: return null;
87 }
88 }
89
90 @Override
91 public Object get(final int index) {
92 switch(index) {
93 case 0: return this.fP;
94 default: return null;
95 }
96 }
97
98 public Physical_Person getP() {
99 return this.fP;
100 }
101
102 @Override
103 public boolean set(final String parameterName, final Object newValue) {
104 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
105 if ("p".equals(parameterName) ) {
106 this.fP = (Physical_Person) newValue;
107 return true;
108 }
109 return false;
110 }
111
112 public void setP(final Physical_Person pP) {
113 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
114 this.fP = pP;
115 }
116
117 @Override
118 public String patternName() {
119 return "queries.x_inv48_notDis";
120 }
121
122 @Override
123 public List<String> parameterNames() {
124 return X_inv48_notDis.Match.parameterNames;
125 }
126
127 @Override
128 public Object[] toArray() {
129 return new Object[]{fP};
130 }
131
132 @Override
133 public X_inv48_notDis.Match toImmutable() {
134 return isMutable() ? newMatch(fP) : this;
135 }
136
137 @Override
138 public String prettyPrint() {
139 StringBuilder result = new StringBuilder();
140 result.append("\"p\"=" + prettyPrintValue(fP));
141 return result.toString();
142 }
143
144 @Override
145 public int hashCode() {
146 return Objects.hash(fP);
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 X_inv48_notDis.Match)) {
157 X_inv48_notDis.Match other = (X_inv48_notDis.Match) obj;
158 return Objects.equals(fP, other.fP);
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 X_inv48_notDis specification() {
171 return X_inv48_notDis.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 X_inv48_notDis.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 pP the fixed value of pattern parameter p, or null if not bound.
190 * @return the new, mutable (partial) match object.
191 *
192 */
193 public static X_inv48_notDis.Match newMutableMatch(final Physical_Person pP) {
194 return new Mutable(pP);
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 pP the fixed value of pattern parameter p, or null if not bound.
202 * @return the (partial) match object.
203 *
204 */
205 public static X_inv48_notDis.Match newMatch(final Physical_Person pP) {
206 return new Immutable(pP);
207 }
208
209 private static final class Mutable extends X_inv48_notDis.Match {
210 Mutable(final Physical_Person pP) {
211 super(pP);
212 }
213
214 @Override
215 public boolean isMutable() {
216 return true;
217 }
218 }
219
220 private static final class Immutable extends X_inv48_notDis.Match {
221 Immutable(final Physical_Person pP) {
222 super(pP);
223 }
224
225 @Override
226 public boolean isMutable() {
227 return false;
228 }
229 }
230 }
231
232 /**
233 * Generated pattern matcher API of the queries.x_inv48_notDis 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 * pattern x_inv48_notDis(p : Physical_Person) {
244 * Physical_Person.disability_type(p, ::NONE);
245 * Physical_Person.disability_percentage(p, 0.0);
246 * }
247 * </pre></code>
248 *
249 * @see Match
250 * @see X_inv48_notDis
251 *
252 */
253 public static class Matcher extends BaseMatcher<X_inv48_notDis.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 X_inv48_notDis.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 X_inv48_notDis.Matcher create() {
278 return new Matcher();
279 }
280
281 private static final int POSITION_P = 0;
282
283 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv48_notDis.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 pP the fixed value of pattern parameter p, or null if not bound.
300 * @return matches represented as a Match object.
301 *
302 */
303 public Collection<X_inv48_notDis.Match> getAllMatches(final Physical_Person pP) {
304 return rawStreamAllMatches(new Object[]{pP}).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 pP the fixed value of pattern parameter p, or null if not bound.
314 * @return a stream of matches represented as a Match object.
315 *
316 */
317 public Stream<X_inv48_notDis.Match> streamAllMatches(final Physical_Person pP) {
318 return rawStreamAllMatches(new Object[]{pP});
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 pP the fixed value of pattern parameter p, 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<X_inv48_notDis.Match> getOneArbitraryMatch(final Physical_Person pP) {
329 return rawGetOneArbitraryMatch(new Object[]{pP});
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 pP the fixed value of pattern parameter p, 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 Physical_Person pP) {
340 return rawHasMatch(new Object[]{pP});
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 pP the fixed value of pattern parameter p, or null if not bound.
346 * @return the number of pattern matches found.
347 *
348 */
349 public int countMatches(final Physical_Person pP) {
350 return rawCountMatches(new Object[]{pP});
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 pP the fixed value of pattern parameter p, 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 Physical_Person pP, final Consumer<? super X_inv48_notDis.Match> processor) {
362 return rawForOneArbitraryMatch(new Object[]{pP}, 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 pP the fixed value of pattern parameter p, or null if not bound.
370 * @return the (partial) match object.
371 *
372 */
373 public X_inv48_notDis.Match newMatch(final Physical_Person pP) {
374 return X_inv48_notDis.Match.newMatch(pP);
375 }
376
377 /**
378 * Retrieve the set of values that occur in matches for p.
379 * @return the Set of all values or empty set if there are no matches
380 *
381 */
382 protected Stream<Physical_Person> rawStreamAllValuesOfp(final Object[] parameters) {
383 return rawStreamAllValues(POSITION_P, parameters).map(Physical_Person.class::cast);
384 }
385
386 /**
387 * Retrieve the set of values that occur in matches for p.
388 * @return the Set of all values or empty set if there are no matches
389 *
390 */
391 public Set<Physical_Person> getAllValuesOfp() {
392 return rawStreamAllValuesOfp(emptyArray()).collect(Collectors.toSet());
393 }
394
395 /**
396 * Retrieve the set of values that occur in matches for p.
397 * @return the Set of all values or empty set if there are no matches
398 *
399 */
400 public Stream<Physical_Person> streamAllValuesOfp() {
401 return rawStreamAllValuesOfp(emptyArray());
402 }
403
404 @Override
405 protected X_inv48_notDis.Match tupleToMatch(final Tuple t) {
406 try {
407 return X_inv48_notDis.Match.newMatch((Physical_Person) t.get(POSITION_P));
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 X_inv48_notDis.Match arrayToMatch(final Object[] match) {
416 try {
417 return X_inv48_notDis.Match.newMatch((Physical_Person) match[POSITION_P]);
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 X_inv48_notDis.Match arrayToMatchMutable(final Object[] match) {
426 try {
427 return X_inv48_notDis.Match.newMutableMatch((Physical_Person) match[POSITION_P]);
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<X_inv48_notDis.Matcher> querySpecification() {
440 return X_inv48_notDis.instance();
441 }
442 }
443
444 private X_inv48_notDis() {
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 X_inv48_notDis instance() {
454 try{
455 return LazyHolder.INSTANCE;
456 } catch (ExceptionInInitializerError err) {
457 throw processInitializerError(err);
458 }
459 }
460
461 @Override
462 protected X_inv48_notDis.Matcher instantiate(final ViatraQueryEngine engine) {
463 return X_inv48_notDis.Matcher.on(engine);
464 }
465
466 @Override
467 public X_inv48_notDis.Matcher instantiate() {
468 return X_inv48_notDis.Matcher.create();
469 }
470
471 @Override
472 public X_inv48_notDis.Match newEmptyMatch() {
473 return X_inv48_notDis.Match.newEmptyMatch();
474 }
475
476 @Override
477 public X_inv48_notDis.Match newMatch(final Object... parameters) {
478 return X_inv48_notDis.Match.newMatch((Taxation.Physical_Person) parameters[0]);
479 }
480
481 /**
482 * Inner class allowing the singleton instance of {@link X_inv48_notDis} 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 X_inv48_notDis#instance()}.
485 *
486 * <p> This workaround is required e.g. to support recursion.
487 *
488 */
489 private static class LazyHolder {
490 private static final X_inv48_notDis INSTANCE = new X_inv48_notDis();
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 X_inv48_notDis.GeneratedPQuery INSTANCE = new GeneratedPQuery();
509
510 private final PParameter parameter_p = new PParameter("p", "Taxation.Physical_Person", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Physical_Person")), PParameterDirection.INOUT);
511
512 private final List<PParameter> parameters = Arrays.asList(parameter_p);
513
514 private GeneratedPQuery() {
515 super(PVisibility.PUBLIC);
516 }
517
518 @Override
519 public String getFullyQualifiedName() {
520 return "queries.x_inv48_notDis";
521 }
522
523 @Override
524 public List<String> getParameterNames() {
525 return Arrays.asList("p");
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_p = body.getOrCreateVariableByName("p");
540 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
541 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
542 new ExportedParameter(body, var_p, parameter_p)
543 ));
544 // Physical_Person.disability_type(p, ::NONE)
545 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
546 new ConstantValue(body, var__virtual_0_, getEnumLiteral("http:///TaxCard.ecore", "Disability_Types", "NONE").getInstance());
547 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
548 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
549 new TypeConstraint(body, Tuples.flatTupleOf(var_p, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "disability_type")));
550 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http:///TaxCard.ecore", "Disability_Types")));
551 new Equality(body, var__virtual_1_, var__virtual_0_);
552 // Physical_Person.disability_percentage(p, 0.0)
553 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
554 new ConstantValue(body, var__virtual_2_, 0.0);
555 new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
556 PVariable var__virtual_3_ = body.getOrCreateVariableByName(".virtual{3}");
557 new TypeConstraint(body, Tuples.flatTupleOf(var_p, var__virtual_3_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Physical_Person", "disability_percentage")));
558 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_3_), new EDataTypeInSlotsKey((EDataType)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EDouble")));
559 new Equality(body, var__virtual_3_, var__virtual_2_);
560 bodies.add(body);
561 }
562 return bodies;
563 }
564 }
565
566 private static double evaluateExpression_1_1() {
567 return 0.0;
568 }
569}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv49_1.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv49_1.java
deleted file mode 100644
index 67915440..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv49_1.java
+++ /dev/null
@@ -1,579 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Legal_Union_Record;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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.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;
42import queries.X_inv49_2;
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 x_inv49_1(lur : Legal_Union_Record) {
50 * Legal_Union_Record.individual_A(lur, iA);
51 * Legal_Union_Record.individual_B(lur, iB);
52 * Tax_Payer(iA);
53 * Physical_Person(iB);
54 * neg find x_inv49_2(iB);
55 * iA != iB;
56 * }
57 * </pre></code>
58 *
59 * @see Matcher
60 * @see Match
61 *
62 */
63@SuppressWarnings("all")
64public final class X_inv49_1 extends BaseGeneratedEMFQuerySpecification<X_inv49_1.Matcher> {
65 /**
66 * Pattern-specific match representation of the queries.x_inv49_1 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 Legal_Union_Record fLur;
79
80 private static List<String> parameterNames = makeImmutableList("lur");
81
82 private Match(final Legal_Union_Record pLur) {
83 this.fLur = pLur;
84 }
85
86 @Override
87 public Object get(final String parameterName) {
88 switch(parameterName) {
89 case "lur": return this.fLur;
90 default: return null;
91 }
92 }
93
94 @Override
95 public Object get(final int index) {
96 switch(index) {
97 case 0: return this.fLur;
98 default: return null;
99 }
100 }
101
102 public Legal_Union_Record getLur() {
103 return this.fLur;
104 }
105
106 @Override
107 public boolean set(final String parameterName, final Object newValue) {
108 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
109 if ("lur".equals(parameterName) ) {
110 this.fLur = (Legal_Union_Record) newValue;
111 return true;
112 }
113 return false;
114 }
115
116 public void setLur(final Legal_Union_Record pLur) {
117 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
118 this.fLur = pLur;
119 }
120
121 @Override
122 public String patternName() {
123 return "queries.x_inv49_1";
124 }
125
126 @Override
127 public List<String> parameterNames() {
128 return X_inv49_1.Match.parameterNames;
129 }
130
131 @Override
132 public Object[] toArray() {
133 return new Object[]{fLur};
134 }
135
136 @Override
137 public X_inv49_1.Match toImmutable() {
138 return isMutable() ? newMatch(fLur) : this;
139 }
140
141 @Override
142 public String prettyPrint() {
143 StringBuilder result = new StringBuilder();
144 result.append("\"lur\"=" + prettyPrintValue(fLur));
145 return result.toString();
146 }
147
148 @Override
149 public int hashCode() {
150 return Objects.hash(fLur);
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 X_inv49_1.Match)) {
161 X_inv49_1.Match other = (X_inv49_1.Match) obj;
162 return Objects.equals(fLur, other.fLur);
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 X_inv49_1 specification() {
175 return X_inv49_1.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 X_inv49_1.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 pLur the fixed value of pattern parameter lur, or null if not bound.
194 * @return the new, mutable (partial) match object.
195 *
196 */
197 public static X_inv49_1.Match newMutableMatch(final Legal_Union_Record pLur) {
198 return new Mutable(pLur);
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 pLur the fixed value of pattern parameter lur, or null if not bound.
206 * @return the (partial) match object.
207 *
208 */
209 public static X_inv49_1.Match newMatch(final Legal_Union_Record pLur) {
210 return new Immutable(pLur);
211 }
212
213 private static final class Mutable extends X_inv49_1.Match {
214 Mutable(final Legal_Union_Record pLur) {
215 super(pLur);
216 }
217
218 @Override
219 public boolean isMutable() {
220 return true;
221 }
222 }
223
224 private static final class Immutable extends X_inv49_1.Match {
225 Immutable(final Legal_Union_Record pLur) {
226 super(pLur);
227 }
228
229 @Override
230 public boolean isMutable() {
231 return false;
232 }
233 }
234 }
235
236 /**
237 * Generated pattern matcher API of the queries.x_inv49_1 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 * pattern x_inv49_1(lur : Legal_Union_Record) {
248 * Legal_Union_Record.individual_A(lur, iA);
249 * Legal_Union_Record.individual_B(lur, iB);
250 * Tax_Payer(iA);
251 * Physical_Person(iB);
252 * neg find x_inv49_2(iB);
253 * iA != iB;
254 * }
255 * </pre></code>
256 *
257 * @see Match
258 * @see X_inv49_1
259 *
260 */
261 public static class Matcher extends BaseMatcher<X_inv49_1.Match> {
262 /**
263 * Initializes the pattern matcher within an existing VIATRA Query engine.
264 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
265 *
266 * @param engine the existing VIATRA Query engine in which this matcher will be created.
267 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
268 *
269 */
270 public static X_inv49_1.Matcher on(final ViatraQueryEngine engine) {
271 // check if matcher already exists
272 Matcher matcher = engine.getExistingMatcher(querySpecification());
273 if (matcher == null) {
274 matcher = (Matcher)engine.getMatcher(querySpecification());
275 }
276 return matcher;
277 }
278
279 /**
280 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
281 * @return an initialized matcher
282 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
283 *
284 */
285 public static X_inv49_1.Matcher create() {
286 return new Matcher();
287 }
288
289 private static final int POSITION_LUR = 0;
290
291 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv49_1.Matcher.class);
292
293 /**
294 * Initializes the pattern matcher within an existing VIATRA Query engine.
295 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
296 *
297 * @param engine the existing VIATRA Query engine in which this matcher will be created.
298 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
299 *
300 */
301 private Matcher() {
302 super(querySpecification());
303 }
304
305 /**
306 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
307 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
308 * @return matches represented as a Match object.
309 *
310 */
311 public Collection<X_inv49_1.Match> getAllMatches(final Legal_Union_Record pLur) {
312 return rawStreamAllMatches(new Object[]{pLur}).collect(Collectors.toSet());
313 }
314
315 /**
316 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
317 * </p>
318 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
319 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
320 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
321 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
322 * @return a stream of matches represented as a Match object.
323 *
324 */
325 public Stream<X_inv49_1.Match> streamAllMatches(final Legal_Union_Record pLur) {
326 return rawStreamAllMatches(new Object[]{pLur});
327 }
328
329 /**
330 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
331 * Neither determinism nor randomness of selection is guaranteed.
332 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
333 * @return a match represented as a Match object, or null if no match is found.
334 *
335 */
336 public Optional<X_inv49_1.Match> getOneArbitraryMatch(final Legal_Union_Record pLur) {
337 return rawGetOneArbitraryMatch(new Object[]{pLur});
338 }
339
340 /**
341 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
342 * under any possible substitution of the unspecified parameters (if any).
343 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
344 * @return true if the input is a valid (partial) match of the pattern.
345 *
346 */
347 public boolean hasMatch(final Legal_Union_Record pLur) {
348 return rawHasMatch(new Object[]{pLur});
349 }
350
351 /**
352 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
353 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
354 * @return the number of pattern matches found.
355 *
356 */
357 public int countMatches(final Legal_Union_Record pLur) {
358 return rawCountMatches(new Object[]{pLur});
359 }
360
361 /**
362 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
363 * Neither determinism nor randomness of selection is guaranteed.
364 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
365 * @param processor the action that will process the selected match.
366 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
367 *
368 */
369 public boolean forOneArbitraryMatch(final Legal_Union_Record pLur, final Consumer<? super X_inv49_1.Match> processor) {
370 return rawForOneArbitraryMatch(new Object[]{pLur}, processor);
371 }
372
373 /**
374 * Returns a new (partial) match.
375 * This can be used e.g. to call the matcher with a partial match.
376 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
377 * @param pLur the fixed value of pattern parameter lur, or null if not bound.
378 * @return the (partial) match object.
379 *
380 */
381 public X_inv49_1.Match newMatch(final Legal_Union_Record pLur) {
382 return X_inv49_1.Match.newMatch(pLur);
383 }
384
385 /**
386 * Retrieve the set of values that occur in matches for lur.
387 * @return the Set of all values or empty set if there are no matches
388 *
389 */
390 protected Stream<Legal_Union_Record> rawStreamAllValuesOflur(final Object[] parameters) {
391 return rawStreamAllValues(POSITION_LUR, parameters).map(Legal_Union_Record.class::cast);
392 }
393
394 /**
395 * Retrieve the set of values that occur in matches for lur.
396 * @return the Set of all values or empty set if there are no matches
397 *
398 */
399 public Set<Legal_Union_Record> getAllValuesOflur() {
400 return rawStreamAllValuesOflur(emptyArray()).collect(Collectors.toSet());
401 }
402
403 /**
404 * Retrieve the set of values that occur in matches for lur.
405 * @return the Set of all values or empty set if there are no matches
406 *
407 */
408 public Stream<Legal_Union_Record> streamAllValuesOflur() {
409 return rawStreamAllValuesOflur(emptyArray());
410 }
411
412 @Override
413 protected X_inv49_1.Match tupleToMatch(final Tuple t) {
414 try {
415 return X_inv49_1.Match.newMatch((Legal_Union_Record) t.get(POSITION_LUR));
416 } catch(ClassCastException e) {
417 LOGGER.error("Element(s) in tuple not properly typed!",e);
418 return null;
419 }
420 }
421
422 @Override
423 protected X_inv49_1.Match arrayToMatch(final Object[] match) {
424 try {
425 return X_inv49_1.Match.newMatch((Legal_Union_Record) match[POSITION_LUR]);
426 } catch(ClassCastException e) {
427 LOGGER.error("Element(s) in array not properly typed!",e);
428 return null;
429 }
430 }
431
432 @Override
433 protected X_inv49_1.Match arrayToMatchMutable(final Object[] match) {
434 try {
435 return X_inv49_1.Match.newMutableMatch((Legal_Union_Record) match[POSITION_LUR]);
436 } catch(ClassCastException e) {
437 LOGGER.error("Element(s) in array not properly typed!",e);
438 return null;
439 }
440 }
441
442 /**
443 * @return the singleton instance of the query specification of this pattern
444 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
445 *
446 */
447 public static IQuerySpecification<X_inv49_1.Matcher> querySpecification() {
448 return X_inv49_1.instance();
449 }
450 }
451
452 private X_inv49_1() {
453 super(GeneratedPQuery.INSTANCE);
454 }
455
456 /**
457 * @return the singleton instance of the query specification
458 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
459 *
460 */
461 public static X_inv49_1 instance() {
462 try{
463 return LazyHolder.INSTANCE;
464 } catch (ExceptionInInitializerError err) {
465 throw processInitializerError(err);
466 }
467 }
468
469 @Override
470 protected X_inv49_1.Matcher instantiate(final ViatraQueryEngine engine) {
471 return X_inv49_1.Matcher.on(engine);
472 }
473
474 @Override
475 public X_inv49_1.Matcher instantiate() {
476 return X_inv49_1.Matcher.create();
477 }
478
479 @Override
480 public X_inv49_1.Match newEmptyMatch() {
481 return X_inv49_1.Match.newEmptyMatch();
482 }
483
484 @Override
485 public X_inv49_1.Match newMatch(final Object... parameters) {
486 return X_inv49_1.Match.newMatch((Taxation.Legal_Union_Record) parameters[0]);
487 }
488
489 /**
490 * Inner class allowing the singleton instance of {@link X_inv49_1} to be created
491 * <b>not</b> at the class load time of the outer class,
492 * but rather at the first call to {@link X_inv49_1#instance()}.
493 *
494 * <p> This workaround is required e.g. to support recursion.
495 *
496 */
497 private static class LazyHolder {
498 private static final X_inv49_1 INSTANCE = new X_inv49_1();
499
500 /**
501 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
502 * This initialization order is required to support indirect recursion.
503 *
504 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
505 *
506 */
507 private static final Object STATIC_INITIALIZER = ensureInitialized();
508
509 public static Object ensureInitialized() {
510 INSTANCE.ensureInitializedInternal();
511 return null;
512 }
513 }
514
515 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
516 private static final X_inv49_1.GeneratedPQuery INSTANCE = new GeneratedPQuery();
517
518 private final PParameter parameter_lur = new PParameter("lur", "Taxation.Legal_Union_Record", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Legal_Union_Record")), PParameterDirection.INOUT);
519
520 private final List<PParameter> parameters = Arrays.asList(parameter_lur);
521
522 private GeneratedPQuery() {
523 super(PVisibility.PUBLIC);
524 }
525
526 @Override
527 public String getFullyQualifiedName() {
528 return "queries.x_inv49_1";
529 }
530
531 @Override
532 public List<String> getParameterNames() {
533 return Arrays.asList("lur");
534 }
535
536 @Override
537 public List<PParameter> getParameters() {
538 return parameters;
539 }
540
541 @Override
542 public Set<PBody> doGetContainedBodies() {
543 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
544 Set<PBody> bodies = new LinkedHashSet<>();
545 {
546 PBody body = new PBody(this);
547 PVariable var_lur = body.getOrCreateVariableByName("lur");
548 PVariable var_iA = body.getOrCreateVariableByName("iA");
549 PVariable var_iB = body.getOrCreateVariableByName("iB");
550 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
551 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
552 new ExportedParameter(body, var_lur, parameter_lur)
553 ));
554 // Legal_Union_Record.individual_A(lur, iA)
555 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
556 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
557 new TypeConstraint(body, Tuples.flatTupleOf(var_lur, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "individual_A")));
558 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
559 new Equality(body, var__virtual_0_, var_iA);
560 // Legal_Union_Record.individual_B(lur, iB)
561 new TypeConstraint(body, Tuples.flatTupleOf(var_lur), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Legal_Union_Record")));
562 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
563 new TypeConstraint(body, Tuples.flatTupleOf(var_lur, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http:///TaxCard.ecore", "Legal_Union_Record", "individual_B")));
564 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
565 new Equality(body, var__virtual_1_, var_iB);
566 // Tax_Payer(iA)
567 new TypeConstraint(body, Tuples.flatTupleOf(var_iA), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Tax_Payer")));
568 // Physical_Person(iB)
569 new TypeConstraint(body, Tuples.flatTupleOf(var_iB), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Physical_Person")));
570 // neg find x_inv49_2(iB)
571 new NegativePatternCall(body, Tuples.flatTupleOf(var_iB), X_inv49_2.instance().getInternalQueryRepresentation());
572 // iA != iB
573 new Inequality(body, var_iA, var_iB);
574 bodies.add(body);
575 }
576 return bodies;
577 }
578 }
579}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv49_2.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv49_2.java
deleted file mode 100644
index 66decdb4..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src-gen/queries/X_inv49_2.java
+++ /dev/null
@@ -1,544 +0,0 @@
1/**
2 * Generated from platform:/resource/case.study.pledge.run/src/queries/case_study_A.vql
3 */
4package queries;
5
6import Taxation.Dependent;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
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 * pattern x_inv49_2(iB: Dependent) {
45 * Dependent(iB);
46 * }
47 * </pre></code>
48 *
49 * @see Matcher
50 * @see Match
51 *
52 */
53@SuppressWarnings("all")
54public final class X_inv49_2 extends BaseGeneratedEMFQuerySpecification<X_inv49_2.Matcher> {
55 /**
56 * Pattern-specific match representation of the queries.x_inv49_2 pattern,
57 * to be used in conjunction with {@link Matcher}.
58 *
59 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
60 * Each instance is a (possibly partial) substitution of pattern parameters,
61 * usable to represent a match of the pattern in the result of a query,
62 * or to specify the bound (fixed) input parameters when issuing a query.
63 *
64 * @see Matcher
65 *
66 */
67 public static abstract class Match extends BasePatternMatch {
68 private Dependent fIB;
69
70 private static List<String> parameterNames = makeImmutableList("iB");
71
72 private Match(final Dependent pIB) {
73 this.fIB = pIB;
74 }
75
76 @Override
77 public Object get(final String parameterName) {
78 switch(parameterName) {
79 case "iB": return this.fIB;
80 default: return null;
81 }
82 }
83
84 @Override
85 public Object get(final int index) {
86 switch(index) {
87 case 0: return this.fIB;
88 default: return null;
89 }
90 }
91
92 public Dependent getIB() {
93 return this.fIB;
94 }
95
96 @Override
97 public boolean set(final String parameterName, final Object newValue) {
98 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
99 if ("iB".equals(parameterName) ) {
100 this.fIB = (Dependent) newValue;
101 return true;
102 }
103 return false;
104 }
105
106 public void setIB(final Dependent pIB) {
107 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
108 this.fIB = pIB;
109 }
110
111 @Override
112 public String patternName() {
113 return "queries.x_inv49_2";
114 }
115
116 @Override
117 public List<String> parameterNames() {
118 return X_inv49_2.Match.parameterNames;
119 }
120
121 @Override
122 public Object[] toArray() {
123 return new Object[]{fIB};
124 }
125
126 @Override
127 public X_inv49_2.Match toImmutable() {
128 return isMutable() ? newMatch(fIB) : this;
129 }
130
131 @Override
132 public String prettyPrint() {
133 StringBuilder result = new StringBuilder();
134 result.append("\"iB\"=" + prettyPrintValue(fIB));
135 return result.toString();
136 }
137
138 @Override
139 public int hashCode() {
140 return Objects.hash(fIB);
141 }
142
143 @Override
144 public boolean equals(final Object obj) {
145 if (this == obj)
146 return true;
147 if (obj == null) {
148 return false;
149 }
150 if ((obj instanceof X_inv49_2.Match)) {
151 X_inv49_2.Match other = (X_inv49_2.Match) obj;
152 return Objects.equals(fIB, other.fIB);
153 } else {
154 // this should be infrequent
155 if (!(obj instanceof IPatternMatch)) {
156 return false;
157 }
158 IPatternMatch otherSig = (IPatternMatch) obj;
159 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
160 }
161 }
162
163 @Override
164 public X_inv49_2 specification() {
165 return X_inv49_2.instance();
166 }
167
168 /**
169 * Returns an empty, mutable match.
170 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
171 *
172 * @return the empty match.
173 *
174 */
175 public static X_inv49_2.Match newEmptyMatch() {
176 return new Mutable(null);
177 }
178
179 /**
180 * Returns a mutable (partial) match.
181 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
182 *
183 * @param pIB the fixed value of pattern parameter iB, or null if not bound.
184 * @return the new, mutable (partial) match object.
185 *
186 */
187 public static X_inv49_2.Match newMutableMatch(final Dependent pIB) {
188 return new Mutable(pIB);
189 }
190
191 /**
192 * Returns a new (partial) match.
193 * This can be used e.g. to call the matcher with a partial match.
194 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
195 * @param pIB the fixed value of pattern parameter iB, or null if not bound.
196 * @return the (partial) match object.
197 *
198 */
199 public static X_inv49_2.Match newMatch(final Dependent pIB) {
200 return new Immutable(pIB);
201 }
202
203 private static final class Mutable extends X_inv49_2.Match {
204 Mutable(final Dependent pIB) {
205 super(pIB);
206 }
207
208 @Override
209 public boolean isMutable() {
210 return true;
211 }
212 }
213
214 private static final class Immutable extends X_inv49_2.Match {
215 Immutable(final Dependent pIB) {
216 super(pIB);
217 }
218
219 @Override
220 public boolean isMutable() {
221 return false;
222 }
223 }
224 }
225
226 /**
227 * Generated pattern matcher API of the queries.x_inv49_2 pattern,
228 * providing pattern-specific query methods.
229 *
230 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
231 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
232 *
233 * <p>Matches of the pattern will be represented as {@link Match}.
234 *
235 * <p>Original source:
236 * <code><pre>
237 * pattern x_inv49_2(iB: Dependent) {
238 * Dependent(iB);
239 * }
240 * </pre></code>
241 *
242 * @see Match
243 * @see X_inv49_2
244 *
245 */
246 public static class Matcher extends BaseMatcher<X_inv49_2.Match> {
247 /**
248 * Initializes the pattern matcher within an existing VIATRA Query engine.
249 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
250 *
251 * @param engine the existing VIATRA Query engine in which this matcher will be created.
252 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
253 *
254 */
255 public static X_inv49_2.Matcher on(final ViatraQueryEngine engine) {
256 // check if matcher already exists
257 Matcher matcher = engine.getExistingMatcher(querySpecification());
258 if (matcher == null) {
259 matcher = (Matcher)engine.getMatcher(querySpecification());
260 }
261 return matcher;
262 }
263
264 /**
265 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
266 * @return an initialized matcher
267 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
268 *
269 */
270 public static X_inv49_2.Matcher create() {
271 return new Matcher();
272 }
273
274 private static final int POSITION_IB = 0;
275
276 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(X_inv49_2.Matcher.class);
277
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 private Matcher() {
287 super(querySpecification());
288 }
289
290 /**
291 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
292 * @param pIB the fixed value of pattern parameter iB, or null if not bound.
293 * @return matches represented as a Match object.
294 *
295 */
296 public Collection<X_inv49_2.Match> getAllMatches(final Dependent pIB) {
297 return rawStreamAllMatches(new Object[]{pIB}).collect(Collectors.toSet());
298 }
299
300 /**
301 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
302 * </p>
303 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
304 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
305 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
306 * @param pIB the fixed value of pattern parameter iB, or null if not bound.
307 * @return a stream of matches represented as a Match object.
308 *
309 */
310 public Stream<X_inv49_2.Match> streamAllMatches(final Dependent pIB) {
311 return rawStreamAllMatches(new Object[]{pIB});
312 }
313
314 /**
315 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
316 * Neither determinism nor randomness of selection is guaranteed.
317 * @param pIB the fixed value of pattern parameter iB, or null if not bound.
318 * @return a match represented as a Match object, or null if no match is found.
319 *
320 */
321 public Optional<X_inv49_2.Match> getOneArbitraryMatch(final Dependent pIB) {
322 return rawGetOneArbitraryMatch(new Object[]{pIB});
323 }
324
325 /**
326 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
327 * under any possible substitution of the unspecified parameters (if any).
328 * @param pIB the fixed value of pattern parameter iB, or null if not bound.
329 * @return true if the input is a valid (partial) match of the pattern.
330 *
331 */
332 public boolean hasMatch(final Dependent pIB) {
333 return rawHasMatch(new Object[]{pIB});
334 }
335
336 /**
337 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
338 * @param pIB the fixed value of pattern parameter iB, or null if not bound.
339 * @return the number of pattern matches found.
340 *
341 */
342 public int countMatches(final Dependent pIB) {
343 return rawCountMatches(new Object[]{pIB});
344 }
345
346 /**
347 * Executes the given processor on 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 pIB the fixed value of pattern parameter iB, or null if not bound.
350 * @param processor the action that will process the selected match.
351 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
352 *
353 */
354 public boolean forOneArbitraryMatch(final Dependent pIB, final Consumer<? super X_inv49_2.Match> processor) {
355 return rawForOneArbitraryMatch(new Object[]{pIB}, processor);
356 }
357
358 /**
359 * Returns a new (partial) match.
360 * This can be used e.g. to call the matcher with a partial match.
361 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
362 * @param pIB the fixed value of pattern parameter iB, or null if not bound.
363 * @return the (partial) match object.
364 *
365 */
366 public X_inv49_2.Match newMatch(final Dependent pIB) {
367 return X_inv49_2.Match.newMatch(pIB);
368 }
369
370 /**
371 * Retrieve the set of values that occur in matches for iB.
372 * @return the Set of all values or empty set if there are no matches
373 *
374 */
375 protected Stream<Dependent> rawStreamAllValuesOfiB(final Object[] parameters) {
376 return rawStreamAllValues(POSITION_IB, parameters).map(Dependent.class::cast);
377 }
378
379 /**
380 * Retrieve the set of values that occur in matches for iB.
381 * @return the Set of all values or empty set if there are no matches
382 *
383 */
384 public Set<Dependent> getAllValuesOfiB() {
385 return rawStreamAllValuesOfiB(emptyArray()).collect(Collectors.toSet());
386 }
387
388 /**
389 * Retrieve the set of values that occur in matches for iB.
390 * @return the Set of all values or empty set if there are no matches
391 *
392 */
393 public Stream<Dependent> streamAllValuesOfiB() {
394 return rawStreamAllValuesOfiB(emptyArray());
395 }
396
397 @Override
398 protected X_inv49_2.Match tupleToMatch(final Tuple t) {
399 try {
400 return X_inv49_2.Match.newMatch((Dependent) t.get(POSITION_IB));
401 } catch(ClassCastException e) {
402 LOGGER.error("Element(s) in tuple not properly typed!",e);
403 return null;
404 }
405 }
406
407 @Override
408 protected X_inv49_2.Match arrayToMatch(final Object[] match) {
409 try {
410 return X_inv49_2.Match.newMatch((Dependent) match[POSITION_IB]);
411 } catch(ClassCastException e) {
412 LOGGER.error("Element(s) in array not properly typed!",e);
413 return null;
414 }
415 }
416
417 @Override
418 protected X_inv49_2.Match arrayToMatchMutable(final Object[] match) {
419 try {
420 return X_inv49_2.Match.newMutableMatch((Dependent) match[POSITION_IB]);
421 } catch(ClassCastException e) {
422 LOGGER.error("Element(s) in array not properly typed!",e);
423 return null;
424 }
425 }
426
427 /**
428 * @return the singleton instance of the query specification of this pattern
429 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
430 *
431 */
432 public static IQuerySpecification<X_inv49_2.Matcher> querySpecification() {
433 return X_inv49_2.instance();
434 }
435 }
436
437 private X_inv49_2() {
438 super(GeneratedPQuery.INSTANCE);
439 }
440
441 /**
442 * @return the singleton instance of the query specification
443 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
444 *
445 */
446 public static X_inv49_2 instance() {
447 try{
448 return LazyHolder.INSTANCE;
449 } catch (ExceptionInInitializerError err) {
450 throw processInitializerError(err);
451 }
452 }
453
454 @Override
455 protected X_inv49_2.Matcher instantiate(final ViatraQueryEngine engine) {
456 return X_inv49_2.Matcher.on(engine);
457 }
458
459 @Override
460 public X_inv49_2.Matcher instantiate() {
461 return X_inv49_2.Matcher.create();
462 }
463
464 @Override
465 public X_inv49_2.Match newEmptyMatch() {
466 return X_inv49_2.Match.newEmptyMatch();
467 }
468
469 @Override
470 public X_inv49_2.Match newMatch(final Object... parameters) {
471 return X_inv49_2.Match.newMatch((Taxation.Dependent) parameters[0]);
472 }
473
474 /**
475 * Inner class allowing the singleton instance of {@link X_inv49_2} to be created
476 * <b>not</b> at the class load time of the outer class,
477 * but rather at the first call to {@link X_inv49_2#instance()}.
478 *
479 * <p> This workaround is required e.g. to support recursion.
480 *
481 */
482 private static class LazyHolder {
483 private static final X_inv49_2 INSTANCE = new X_inv49_2();
484
485 /**
486 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
487 * This initialization order is required to support indirect recursion.
488 *
489 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
490 *
491 */
492 private static final Object STATIC_INITIALIZER = ensureInitialized();
493
494 public static Object ensureInitialized() {
495 INSTANCE.ensureInitializedInternal();
496 return null;
497 }
498 }
499
500 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
501 private static final X_inv49_2.GeneratedPQuery INSTANCE = new GeneratedPQuery();
502
503 private final PParameter parameter_iB = new PParameter("iB", "Taxation.Dependent", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http:///TaxCard.ecore", "Dependent")), PParameterDirection.INOUT);
504
505 private final List<PParameter> parameters = Arrays.asList(parameter_iB);
506
507 private GeneratedPQuery() {
508 super(PVisibility.PUBLIC);
509 }
510
511 @Override
512 public String getFullyQualifiedName() {
513 return "queries.x_inv49_2";
514 }
515
516 @Override
517 public List<String> getParameterNames() {
518 return Arrays.asList("iB");
519 }
520
521 @Override
522 public List<PParameter> getParameters() {
523 return parameters;
524 }
525
526 @Override
527 public Set<PBody> doGetContainedBodies() {
528 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
529 Set<PBody> bodies = new LinkedHashSet<>();
530 {
531 PBody body = new PBody(this);
532 PVariable var_iB = body.getOrCreateVariableByName("iB");
533 new TypeConstraint(body, Tuples.flatTupleOf(var_iB), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
534 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
535 new ExportedParameter(body, var_iB, parameter_iB)
536 ));
537 // Dependent(iB)
538 new TypeConstraint(body, Tuples.flatTupleOf(var_iB), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http:///TaxCard.ecore", "Dependent")));
539 bodies.add(body);
540 }
541 return bodies;
542 }
543 }
544}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/queries/NewOCLFileX.ocl b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/queries/NewOCLFileX.ocl
deleted file mode 100644
index 66ae728e..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/queries/NewOCLFileX.ocl
+++ /dev/null
@@ -1,45 +0,0 @@
1import 'file:/Users/Aren Babikian/git/VIATRA-Attributes/case.study.a.model/model/Taxation.ecore'
2
3package Taxation
4
5--context Income inv inv8:
6--if(not self.income_type.oclIsTypeOf(Employment_Income)) then
7--self.details->forAll(d| d.distance = 0)
8--else
9--self.details->forAll(d| d.distance >= 0.0 and d.distance <= 100)
10--endif
11--
12--context Legal_Union_Record inv inv490:
13--self.individual_A.oclIsKindOf(Tax_Payer)
14--
15--context Legal_Union_Record inv inv491:
16--self.individual_B->forAll(i | i.oclIsKindOf(Physical_Person) )
17--
18--context Legal_Union_Record inv inv492:
19--self.individual_B->forAll(i | not i.oclIsTypeOf(Dependent) )
20--
21--context Legal_Union_Record inv inv493:
22--self.individual_A <> self.individual_B
23--
24--context Tax_Payer inv inv13:
25-- self.addresses->exists( hab_add:Address | hab_add.oclIsTypeOf(Habitual_Address) = true and hab_add.country=Country::ZZ)
26--implies
27-- self.oclIsTypeOf(Resident_Tax_Payer)
28
29 context Income inv inv7:
30let val:Real =self.details->asOrderedSet()->first().distance in
31self.details->forAll(d: Income_Detail|d.distance = val)
32
33--context External_Allowance inv inv15:
34--let child:Dependent = self.person in
35--let h:Household = Household.allInstances()->select(children->includes(child))->asOrderedSet()->first() in
36--let t1:Set(Physical_Person) = Set{h.parents.individual_A}->union(h.parents.individual_B)->select(oclIsKindOf(Tax_Payer)) in
37--if(t1->size()=1) then
38--self.reciver = t1->asOrderedSet()->first()
39--else
40--self.reciver = t1->asOrderedSet()->at(2) or self.reciver = t1->asOrderedSet()->at(1)
41--endif
42
43
44
45endpackage \ No newline at end of file
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/queries/case_study_A.vql b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/queries/case_study_A.vql
deleted file mode 100644
index 5d46bf42..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/queries/case_study_A.vql
+++ /dev/null
@@ -1,334 +0,0 @@
1package queries
2
3import "http:///TaxCard.ecore"
4
5//AttributeRemoved -> DF
6
7//inv1-External_Allowance.amount is a derived feature (TODOcheck)
8//inv2-Tax_Card.income.taxPayer.taxesDue is a derived feature (TODOcheck)
9
10//inv3-multiplicity adjusted
11@Constraint(message = "inv03", severity = "error", key = {dep})
12pattern inv03(dep : Dependent) {
13 find x_inv03_eligAll(dep);
14 neg find x_inv03_hasAll(dep);
15} or {
16 Dependent.birth_year(dep, by);
17 check(2018-by > 21);
18 Dependent.continued_studies(dep, false);
19 Dependent.allowances(dep, _);
20}
21pattern x_inv03_eligAll(dep : Dependent) {
22 Dependent.birth_year(dep, by);
23 check(2018-by <= 21);
24} or {
25 Dependent.continued_studies(dep, true);
26}
27pattern x_inv03_hasAll(dep : Dependent) {
28 Dependent.allowances(dep, _);
29}
30
31//inv5 - oclIsTypeOf - handled here
32@Constraint(message = "inv05", severity = "error", key = {inc})
33pattern inv05(inc : Income) {
34 //income_type: None
35 neg find x_inv08_noType(inc);
36 Income.details.worked_days(inc, wd);
37 check(wd != 0);
38} or {
39 //income_type: Not Employment_Income
40 Income.income_type(inc, type);
41 neg find x_inv08_notEI(type);
42 Income.details.worked_days(inc, wd);
43 check(wd != 0);
44} or {
45 //income_type: Employment Income
46 Income.income_type(inc, type);
47 Employment_Income(type);
48 find x_inv05_inRange(inc);
49}
50pattern x_inv05_inRange(inc : Income) {
51 Income.details.worked_days(inc, wd);
52 check(wd < 1);
53} or {
54 Income.details.worked_days(inc, wd);
55 check(wd > 25);
56}
57
58//inv6-Does not make sens, but directly from OCL
59//first part of or from definition of getAge()
60@Constraint(message = "inv06", severity = "error", key = {tp})
61pattern inv06(tp : Tax_Payer) {
62 Tax_Payer.dependents(tp, _);
63 Tax_Payer.birth_year(tp, TPBy);
64 check(2018 - TPBy > 2018-16);
65} or {
66 Tax_Payer.birth_year(tp, TPBy);
67 Tax_Payer.dependents(tp, dep);
68 Dependent.birth_year(dep, DepBy);
69 check(2018-DepBy <= 2018-TPBy-16);
70}
71
72//inv7-OrderedSet
73@Constraint(message = "inv07", severity = "error", key = {inc})
74pattern inv07(inc : Income) {
75 Income.details.distance(inc, d1);
76 Income.details.distance(inc, d2);
77 check(d1 != d2);//compare values
78}
79
80//user_complete_details-AttributeRemoved
81
82//inv8 - oclIsTypeOf - handled here
83@Constraint(message = "inv08", severity = "error", key = {inc})
84pattern inv08(inc : Income) {
85 //income_type: None
86 neg find x_inv08_noType(inc);
87 Income.details.distance(inc, dist);
88 check(dist != 0);
89} or {
90 //income_type: Not Employment_Income
91 Income.income_type(inc, type);
92 neg find x_inv08_notEI(type);
93 Income.details.distance(inc, dist);
94 check(dist != 0);
95} or {
96 //income_type: Employment Income
97 Income.income_type(inc, type);
98 Employment_Income(type);
99 find x_inv08_inRange(inc);
100}
101pattern x_inv08_notEI(type : Employment_Income) {
102 Employment_Income(type);
103}
104pattern x_inv08_noType(inc : Income) {
105 Income.income_type(inc, _);
106}
107pattern x_inv08_inRange(inc : Income) {
108 Income.details.distance(inc, dist);
109 check(dist < 0);
110} or {
111 Income.details.distance(inc, dist);
112 check(dist > 100);
113}
114//inv9-DerivedFeature
115
116//inv10-Ordered Sets
117@Constraint(message = "inv10", severity = "error", key = {inc})
118pattern inv10(inc : Income) {
119 Income.details.amount(inc, a1);
120 Income.details.amount(inc, a2);
121 check(a1 != a2);//compare values
122}
123
124//inv11-attributes-handled by multiplicity
125@Constraint(message = "inv11", severity = "error", key = {exp})
126pattern inv11(exp : Expense) {
127 find x_inv11_incOver100(exp);
128 find x_inv11_incNotOver100(exp);
129}
130pattern x_inv11_incOver100(exp : Expense) {
131 Expense.income.income_amount(exp, incVal);
132 check(incVal / 2 > 50);
133
134} or {
135 Expense.declared_amount(exp, decl);
136 check(decl != 50);
137}
138pattern x_inv11_incNotOver100(exp : Expense) {
139 Expense.income.income_amount(exp, incVal);
140 check(incVal / 2 <= 50);
141} or {
142 Expense.declared_amount(exp, decl);
143 check(decl < 50);
144} or {
145 Expense.income.income_amount(exp, incVal);
146 Expense.declared_amount(exp, decl);
147 check(decl > incVal/2);
148}
149
150//inv12
151//exists - handled logically
152@Constraint(message = "inv12", severity = "error", key = {tp})
153pattern inv12(tp : Tax_Payer) {
154 Tax_Payer.addresses(tp, hab_add);
155 Habitual_Address(hab_add);
156 neg find x_inv12_notZZ(hab_add);
157 Tax_Payer.incomes(tp, inc);
158 Local_Income(inc);
159 neg find x_inv12_notNonRes(tp);
160}
161pattern x_inv12_notNonRes(tp : Non_Resident_Tax_Payer) {
162 Non_Resident_Tax_Payer(tp);
163}
164pattern x_inv12_notZZ(hab_add : Habitual_Address) {
165 Address.country(hab_add, ::ZZ);
166}
167
168//inv13 - Added new containment rel Phys_Pers->Address
169//exists - handled logically
170@Constraint(message = "inv13", severity = "error", key = {tp})
171pattern inv13(tp : Tax_Payer) {
172 Tax_Payer.addresses(tp, hab_add);
173 Habitual_Address(hab_add);
174 Address.country(hab_add, ::ZZ);
175 neg find x_inv13(tp);
176}
177pattern x_inv13(tp : Resident_Tax_Payer) {
178 Resident_Tax_Payer(tp);
179}
180
181//inv14-MultiplicityChanged
182
183//inv15-Ordered Sets in assignment if block
184//ERROR if no household object
185@Constraint(message = "inv15", severity = "error", key = {ea})
186pattern inv15(ea : External_Allowance) {
187 neg find x_inv15(ea);
188}
189pattern x_inv15(ea : External_Allowance) {
190 External_Allowance.person(ea, child);
191 Household.children(h, child);//only one due to multiplicity
192 Household.parents.individual_A(h, iA);
193 Tax_Payer(iA);
194 External_Allowance.reciver(ea, iA);
195} or {
196 External_Allowance.person(ea, child);
197 Household.children(h, child);//only one due to multiplicity
198 Household.parents.individual_B(h, iB);
199 Tax_Payer(iB);
200 External_Allowance.reciver(ea, iB);
201}
202
203//inv16-Tax_Card.tax_card_type is a derived feature
204
205//inv17-attribute-handled by multiplicity
206@Constraint(message = "inv17", severity = "error", key = {lur})
207pattern inv17(lur : Legal_Union_Record) {
208 Legal_Union_Record.start_year(lur, sy);
209 check(sy < 1950);
210} or {
211 Legal_Union_Record.start_year(lur, sy);
212 check(sy > 2018);
213}
214
215//inv18-MultiplicityChecked
216//inv19-MultiplicityChecked
217
218//inv20-Useless constraint since both edges are containment (TODOCheck)
219//OclIsUndefined-Handled by multiplicity
220@Constraint(message = "inv20", severity = "error", key = {lur})
221pattern inv20(lur : Legal_Union_Record) {
222 Legal_Union_Record.individual_A(lur, iA);
223 Legal_Union_Record.individual_B(lur, iB);
224 iA == iB;
225}
226//inv21-MultiplicityChecked
227//inv22-MultiplicityChecked
228//inv23-MultiplicityChecked
229//inv24-MultiplicityChecked
230//inv25-MultiplicityChecked
231//inv26-MultiplicityChanged
232//inv27-dupOfInv24
233//inv28-dubOfInv23
234//inv29-MultiplicityChanged
235//inv30-AttributeRemoved
236//inv31-AttributeRemoved
237//inv32-AttributeRemoved
238
239//inv33-attribute-handled by multiplicity
240@Constraint(message = "inv33", severity = "error", key = {p})
241pattern inv33(p : Physical_Person) {
242 Physical_Person.birth_year(p, by);
243 check(2018-by < 0);
244} or {
245 Physical_Person.birth_year(p, by);
246 check(2018-by > 100);
247}
248
249//inv34-attribute-handled by multiplicity
250@Constraint(message = "inv34", severity = "error", key = {p})
251pattern inv34(p : Physical_Person) {
252 Physical_Person.birth_month(p, birthMonth);
253 check(birthMonth < 1);
254} or {
255 Physical_Person.birth_month(p, birthMonth);
256 check(birthMonth > 12);
257}
258
259//inv35-attribute-handled by multiplicity
260@Constraint(message = "inv35", severity = "error", key = {p})
261pattern inv35(p : Physical_Person) {
262 Physical_Person.birth_day(p, birthDay);
263 check(birthDay < 1);
264} or {
265 Physical_Person.birth_day(p, birthDay);
266 check(birthDay > 28);
267}
268
269//inv36-AttributeRemoved
270//inv37-AttributeRemoved
271//inv38-AttributeRemoved
272//inv39-AttributeRemoved
273//inv40-AttributeRemoved
274//inv41-AttributeRemoved
275//inv42-AttributeRemoved
276//inv43-AttributeRemoved
277//inv44-AttributeRemoved
278//inv45-AttributeRemoved
279//inv46-AttributeRemoved
280
281//inv47-attributes-handled by multiplicity
282@Constraint(message = "inv47", severity = "error", key = {lur})
283pattern inv47(lur : Legal_Union_Record) {
284 Legal_Union_Record.end_year(lur, endY);
285 Legal_Union_Record.start_year(lur, startY);
286 neg find x_inv47(lur);
287 check(startY >= endY);
288}
289pattern x_inv47(lur : Legal_Union_Record) {
290 Legal_Union_Record.separation_cause(lur, ::NONE);
291 Legal_Union_Record.end_year(lur, -1);
292}
293
294//inv48-attributes-handled by multiplicity
295@Constraint(message = "inv48", severity = "error", key = {p})
296pattern inv48(p : Physical_Person) {
297 neg find x_inv48_notDis(p);
298 neg find x_inv48_Dis(p);
299}
300pattern x_inv48_notDis(p : Physical_Person) {
301 Physical_Person.disability_type(p, ::NONE);
302 Physical_Person.disability_percentage(p, 0.0);
303}
304pattern x_inv48_Dis(p : Physical_Person) {
305 neg find x_inv48_3(p);
306 Physical_Person.disability_percentage(p, disPer);
307 check(disPer > 0.0);
308 check(disPer <= 1.0);
309}
310pattern x_inv48_3(p : Physical_Person) {
311 Physical_Person.disability_type(p, ::NONE);
312}
313
314//inv49-OclKindOf-handled by multiplicity
315@Constraint(message = "inv49", severity = "error", key = {lur})
316pattern inv49(lur : Legal_Union_Record) {
317 neg find x_inv49_1(lur);
318}
319pattern x_inv49_1(lur : Legal_Union_Record) {
320 Legal_Union_Record.individual_A(lur, iA);
321 Legal_Union_Record.individual_B(lur, iB);
322 Tax_Payer(iA);
323 Physical_Person(iB);
324 neg find x_inv49_2(iB);
325 iA != iB;
326}
327pattern x_inv49_2(iB: Dependent) {
328 Dependent(iB);
329}
330
331//inv50-MultiplicityChecked
332//inv51-MultiplicityChecked
333//inv52-MultiplicityChecked
334//inv53-MultiplicityChecked \ No newline at end of file
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/run/RunGenerator.xtend b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/run/RunGenerator.xtend
deleted file mode 100644
index 8bd70919..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/src/run/RunGenerator.xtend
+++ /dev/null
@@ -1,151 +0,0 @@
1package run
2
3import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
4import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration
5import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
6import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor
7import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
8import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult
9import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.impl.ModelResultImpl
10import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore
11import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic
12import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration
13import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor
14import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic
15import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner
16import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration
17import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace
18import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace
19import java.io.PrintWriter
20import java.text.SimpleDateFormat
21import java.util.Date
22import java.util.HashMap
23import java.util.List
24import java.util.Map
25import org.eclipse.emf.ecore.EAttribute
26import org.eclipse.emf.ecore.EClass
27import org.eclipse.emf.ecore.EEnum
28import org.eclipse.emf.ecore.EEnumLiteral
29import org.eclipse.emf.ecore.EObject
30import org.eclipse.emf.ecore.EPackage
31import org.eclipse.emf.ecore.EReference
32import org.eclipse.emf.ecore.resource.Resource
33import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
34import org.eclipse.viatra.query.runtime.api.IQueryGroup
35import Taxation.TaxationPackage
36
37class GenerateScenarios {
38 def static void main(String[] args) {
39 val Ecore2Logic ecore2Logic = new Ecore2Logic
40// val Logic2Ecore logic2Ecore = new Logic2Ecore(ecore2Logic)
41// val Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic)
42// val InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic
43 // Workspace setup
44 val Date date = new Date(System.currentTimeMillis)
45 val SimpleDateFormat format = new SimpleDateFormat("dd-HHmm");
46 val formattedDate = format.format(date)
47
48 val workspace = new FileSystemWorkspace('''output/''' + formattedDate + '''/''', "")
49 workspace.initAndClear
50
51 // Logicproblem writing setup
52 val reg = Resource.Factory.Registry.INSTANCE
53 val map = reg.extensionToFactoryMap
54 map.put("logicproblem", new XMIResourceFactoryImpl)
55
56 println("Input and output workspaces are created")
57
58 print(TaxationPackage.eINSTANCE.getEClassifiers.filter(EClass).toList.get(0))
59
60 val metamodel = loadMetamodel(TaxationPackage.eINSTANCE)
61// val partialModel = loadPartialModel(inputs, "yakindu/Yakindu.xmi")
62// val queries = loadQueries(metamodel, Patterns.instance)
63 println("DSL loaded")
64
65 val SIZE = 10
66 var REPS = 1
67
68 val RUNTIME = 300
69
70 val modelGenerationProblem = ecore2Logic.transformMetamodel(metamodel, new Ecore2LogicConfiguration())
71// var modelExtensionProblem = instanceModel2Logic.transform(modelGenerationProblem, partialModel)
72// var validModelExtensionProblem = viatra2Logic.transformQueries(queries, modelExtensionProblem,
73// new Viatra2LogicConfiguration)
74 var problem = modelGenerationProblem.output
75 workspace.writeModel(problem, "scenario.logicproblem")
76 println("Problem created")
77
78 for (var i = 0; i <= REPS; i++) {
79
80 var ViatraReasoner reasoner = new ViatraReasoner
81
82 // /////////////////////////////////////////////////////
83 // Define Config File
84 val solverConfig = new ViatraReasonerConfiguration => [
85 // add configuration things, in config file first
86// it.documentationLevel = DocumentationLevel::FULL
87// it.iteration = iter
88 it.runtimeLimit = RUNTIME
89 it.typeScopes.maxNewElements = SIZE
90 it.typeScopes.minNewElements = SIZE
91 ]
92
93 var solution = reasoner.solve(problem, solverConfig, workspace)
94 print("Problem Solved")
95
96 // Run Garbage Collector
97 val Runtime r = Runtime.getRuntime();
98 r.gc();
99 r.gc();
100 r.gc();
101 Thread.sleep(3000)
102 }
103
104 }
105
106 def static Map<Type, Integer> getTypeMap(Map<Class, Integer> classMap, EcoreMetamodelDescriptor metamodel,
107 Ecore2Logic e2l, Ecore2Logic_Trace trace) {
108 val typeMap = new HashMap<Type, Integer>
109 val listMap = metamodel.classes.toMap[s|s.name]
110
111 for (Class elem : classMap.keySet) {
112 typeMap.put(e2l.TypeofEClass(
113 trace,
114 listMap.get(elem.simpleName)
115 ), classMap.get(elem))
116 }
117 return typeMap
118 }
119
120 def static loadMetamodel(EPackage pckg) {
121 val List<EClass> classes = pckg.getEClassifiers.filter(EClass).toList
122 val List<EEnum> enums = pckg.getEClassifiers.filter(EEnum).toList
123 val List<EEnumLiteral> literals = enums.map[getELiterals].flatten.toList
124 val List<EReference> references = classes.map[getEReferences].flatten.toList
125 val List<EAttribute> attributes = classes.map[getEAttributes].flatten.toList
126 return new EcoreMetamodelDescriptor(classes, #{}, false, enums, literals, references, attributes)
127 }
128
129 def static loadPartialModel(ReasonerWorkspace inputs, String path) {
130 Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl())
131 inputs.readModel(EObject, path).eResource.contents
132// inputs.readModel(EObject,"FamInstance.xmi").eResource.allContents.toList
133 }
134
135 def static loadQueries(EcoreMetamodelDescriptor metamodel, IQueryGroup i) {
136 val patterns = i.specifications.toList
137 val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet
138 val derivedFeatures = emptyMap
139 // NO DERIVED FEATURES
140// val derivedFeatures = new LinkedHashMap
141// derivedFeatures.put(i.type,metamodel.attributes.filter[it.name == "type"].head)
142// derivedFeatures.put(i.model,metamodel.references.filter[it.name == "model"].head)
143 val res = new ViatraQuerySetDescriptor(
144 patterns,
145 wfPatterns,
146 derivedFeatures
147 )
148 return res
149 }
150
151}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/.RunGenerator.xtendbin b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/.RunGenerator.xtendbin
deleted file mode 100644
index e2021169..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/.RunGenerator.xtendbin
+++ /dev/null
Binary files differ
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/.gitignore b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/.gitignore
deleted file mode 100644
index 8e503b4a..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
1/.GenerateScenarios.java._trace
2/.checkQueries.java._trace
3/.RunGenerator.xtendbin
4/GenerateScenarios.java
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/GenerateScenarios.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/GenerateScenarios.java
deleted file mode 100644
index 7ec45124..00000000
--- a/Tests/MODELS2020-CaseStudies/case.study.pledge.queries/xtend-gen/run/GenerateScenarios.java
+++ /dev/null
@@ -1,165 +0,0 @@
1package run;
2
3import Taxation.TaxationPackage;
4import com.google.common.base.Objects;
5import com.google.common.collect.Iterables;
6import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic;
7import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration;
8import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace;
9import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor;
10import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput;
11import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type;
12import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem;
13import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult;
14import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor;
15import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner;
16import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration;
17import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace;
18import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace;
19import java.text.SimpleDateFormat;
20import java.util.Collections;
21import java.util.Date;
22import java.util.HashMap;
23import java.util.List;
24import java.util.Map;
25import java.util.Set;
26import org.eclipse.emf.common.util.EList;
27import org.eclipse.emf.ecore.EAttribute;
28import org.eclipse.emf.ecore.EClass;
29import org.eclipse.emf.ecore.EEnum;
30import org.eclipse.emf.ecore.EEnumLiteral;
31import org.eclipse.emf.ecore.EObject;
32import org.eclipse.emf.ecore.EPackage;
33import org.eclipse.emf.ecore.EReference;
34import org.eclipse.emf.ecore.EStructuralFeature;
35import org.eclipse.emf.ecore.resource.Resource;
36import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
37import org.eclipse.viatra.query.runtime.api.IQueryGroup;
38import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
39import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
40import org.eclipse.xtend2.lib.StringConcatenation;
41import org.eclipse.xtext.xbase.lib.CollectionLiterals;
42import org.eclipse.xtext.xbase.lib.Exceptions;
43import org.eclipse.xtext.xbase.lib.Functions.Function1;
44import org.eclipse.xtext.xbase.lib.InputOutput;
45import org.eclipse.xtext.xbase.lib.IterableExtensions;
46import org.eclipse.xtext.xbase.lib.ListExtensions;
47import org.eclipse.xtext.xbase.lib.ObjectExtensions;
48import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
49
50@SuppressWarnings("all")
51public class GenerateScenarios {
52 public static void main(final String[] args) {
53 try {
54 final Ecore2Logic ecore2Logic = new Ecore2Logic();
55 long _currentTimeMillis = System.currentTimeMillis();
56 final Date date = new Date(_currentTimeMillis);
57 final SimpleDateFormat format = new SimpleDateFormat("dd-HHmm");
58 final String formattedDate = format.format(date);
59 StringConcatenation _builder = new StringConcatenation();
60 _builder.append("output/");
61 String _plus = (_builder.toString() + formattedDate);
62 StringConcatenation _builder_1 = new StringConcatenation();
63 _builder_1.append("/");
64 String _plus_1 = (_plus + _builder_1);
65 final FileSystemWorkspace workspace = new FileSystemWorkspace(_plus_1, "");
66 workspace.initAndClear();
67 final Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
68 final Map<String, Object> map = reg.getExtensionToFactoryMap();
69 XMIResourceFactoryImpl _xMIResourceFactoryImpl = new XMIResourceFactoryImpl();
70 map.put("logicproblem", _xMIResourceFactoryImpl);
71 InputOutput.<String>println("Input and output workspaces are created");
72 InputOutput.<EClass>print(IterableExtensions.<EClass>toList(Iterables.<EClass>filter(TaxationPackage.eINSTANCE.getEClassifiers(), EClass.class)).get(0));
73 final EcoreMetamodelDescriptor metamodel = GenerateScenarios.loadMetamodel(TaxationPackage.eINSTANCE);
74 InputOutput.<String>println("DSL loaded");
75 final int SIZE = 10;
76 int REPS = 1;
77 final int RUNTIME = 300;
78 Ecore2LogicConfiguration _ecore2LogicConfiguration = new Ecore2LogicConfiguration();
79 final TracedOutput<LogicProblem, Ecore2Logic_Trace> modelGenerationProblem = ecore2Logic.transformMetamodel(metamodel, _ecore2LogicConfiguration);
80 LogicProblem problem = modelGenerationProblem.getOutput();
81 workspace.writeModel(problem, "scenario.logicproblem");
82 InputOutput.<String>println("Problem created");
83 for (int i = 0; (i <= REPS); i++) {
84 {
85 ViatraReasoner reasoner = new ViatraReasoner();
86 ViatraReasonerConfiguration _viatraReasonerConfiguration = new ViatraReasonerConfiguration();
87 final Procedure1<ViatraReasonerConfiguration> _function = (ViatraReasonerConfiguration it) -> {
88 it.runtimeLimit = RUNTIME;
89 it.typeScopes.maxNewElements = SIZE;
90 it.typeScopes.minNewElements = SIZE;
91 };
92 final ViatraReasonerConfiguration solverConfig = ObjectExtensions.<ViatraReasonerConfiguration>operator_doubleArrow(_viatraReasonerConfiguration, _function);
93 LogicResult solution = reasoner.solve(problem, solverConfig, workspace);
94 InputOutput.<String>print("Problem Solved");
95 final Runtime r = Runtime.getRuntime();
96 r.gc();
97 r.gc();
98 r.gc();
99 Thread.sleep(3000);
100 }
101 }
102 } catch (Throwable _e) {
103 throw Exceptions.sneakyThrow(_e);
104 }
105 }
106
107 public static Map<Type, Integer> getTypeMap(final Map<Class, Integer> classMap, final EcoreMetamodelDescriptor metamodel, final Ecore2Logic e2l, final Ecore2Logic_Trace trace) {
108 final HashMap<Type, Integer> typeMap = new HashMap<Type, Integer>();
109 final Function1<EClass, String> _function = (EClass s) -> {
110 return s.getName();
111 };
112 final Map<String, EClass> listMap = IterableExtensions.<String, EClass>toMap(metamodel.getClasses(), _function);
113 Set<Class> _keySet = classMap.keySet();
114 for (final Class elem : _keySet) {
115 typeMap.put(
116 e2l.TypeofEClass(trace,
117 listMap.get(elem.getSimpleName())), classMap.get(elem));
118 }
119 return typeMap;
120 }
121
122 public static EcoreMetamodelDescriptor loadMetamodel(final EPackage pckg) {
123 final List<EClass> classes = IterableExtensions.<EClass>toList(Iterables.<EClass>filter(pckg.getEClassifiers(), EClass.class));
124 final List<EEnum> enums = IterableExtensions.<EEnum>toList(Iterables.<EEnum>filter(pckg.getEClassifiers(), EEnum.class));
125 final Function1<EEnum, EList<EEnumLiteral>> _function = (EEnum it) -> {
126 return it.getELiterals();
127 };
128 final List<EEnumLiteral> literals = IterableExtensions.<EEnumLiteral>toList(Iterables.<EEnumLiteral>concat(ListExtensions.<EEnum, EList<EEnumLiteral>>map(enums, _function)));
129 final Function1<EClass, EList<EReference>> _function_1 = (EClass it) -> {
130 return it.getEReferences();
131 };
132 final List<EReference> references = IterableExtensions.<EReference>toList(Iterables.<EReference>concat(ListExtensions.<EClass, EList<EReference>>map(classes, _function_1)));
133 final Function1<EClass, EList<EAttribute>> _function_2 = (EClass it) -> {
134 return it.getEAttributes();
135 };
136 final List<EAttribute> attributes = IterableExtensions.<EAttribute>toList(Iterables.<EAttribute>concat(ListExtensions.<EClass, EList<EAttribute>>map(classes, _function_2)));
137 return new EcoreMetamodelDescriptor(classes, Collections.<EClass>unmodifiableSet(CollectionLiterals.<EClass>newHashSet()), false, enums, literals, references, attributes);
138 }
139
140 public static EList<EObject> loadPartialModel(final ReasonerWorkspace inputs, final String path) {
141 EList<EObject> _xblockexpression = null;
142 {
143 Map<String, Object> _extensionToFactoryMap = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap();
144 XMIResourceFactoryImpl _xMIResourceFactoryImpl = new XMIResourceFactoryImpl();
145 _extensionToFactoryMap.put("*", _xMIResourceFactoryImpl);
146 _xblockexpression = inputs.<EObject>readModel(EObject.class, path).eResource().getContents();
147 }
148 return _xblockexpression;
149 }
150
151 public static ViatraQuerySetDescriptor loadQueries(final EcoreMetamodelDescriptor metamodel, final IQueryGroup i) {
152 final List<IQuerySpecification<?>> patterns = IterableExtensions.<IQuerySpecification<?>>toList(i.getSpecifications());
153 final Function1<IQuerySpecification<?>, Boolean> _function = (IQuerySpecification<?> it) -> {
154 final Function1<PAnnotation, Boolean> _function_1 = (PAnnotation it_1) -> {
155 String _name = it_1.getName();
156 return Boolean.valueOf(Objects.equal(_name, "Constraint"));
157 };
158 return Boolean.valueOf(IterableExtensions.<PAnnotation>exists(it.getAllAnnotations(), _function_1));
159 };
160 final Set<IQuerySpecification<?>> wfPatterns = IterableExtensions.<IQuerySpecification<?>>toSet(IterableExtensions.<IQuerySpecification<?>>filter(patterns, _function));
161 final Map<IQuerySpecification<?>, EStructuralFeature> derivedFeatures = CollectionLiterals.<IQuerySpecification<?>, EStructuralFeature>emptyMap();
162 final ViatraQuerySetDescriptor res = new ViatraQuerySetDescriptor(patterns, wfPatterns, derivedFeatures);
163 return res;
164 }
165}