aboutsummaryrefslogtreecommitdiff
path: root/src/org/semanticweb/karma2/model/cqparser/ConjunctiveQueryWalker.java
diff options
context:
space:
mode:
authoryzhou <yujiao.zhou@gmail.com>2015-04-21 10:34:27 +0100
committeryzhou <yujiao.zhou@gmail.com>2015-04-21 10:34:27 +0100
commit9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8 (patch)
tree47511c0fb89dccff0db4b5990522e04f294d795b /src/org/semanticweb/karma2/model/cqparser/ConjunctiveQueryWalker.java
parentb1ac207612ee8b045244253fb94b866104bc34f2 (diff)
downloadACQuA-9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8.tar.gz
ACQuA-9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8.zip
initial version
Diffstat (limited to 'src/org/semanticweb/karma2/model/cqparser/ConjunctiveQueryWalker.java')
-rw-r--r--src/org/semanticweb/karma2/model/cqparser/ConjunctiveQueryWalker.java179
1 files changed, 179 insertions, 0 deletions
diff --git a/src/org/semanticweb/karma2/model/cqparser/ConjunctiveQueryWalker.java b/src/org/semanticweb/karma2/model/cqparser/ConjunctiveQueryWalker.java
new file mode 100644
index 0000000..f95ac12
--- /dev/null
+++ b/src/org/semanticweb/karma2/model/cqparser/ConjunctiveQueryWalker.java
@@ -0,0 +1,179 @@
1package org.semanticweb.karma2.model.cqparser;
2
3
4
5import java.util.ArrayList;
6import java.util.Iterator;
7import java.util.List;
8
9import org.antlr.runtime.tree.CommonTree;
10import org.semanticweb.HermiT.model.Atom;
11import org.semanticweb.HermiT.model.AtomicConcept;
12import org.semanticweb.HermiT.model.AtomicRole;
13import org.semanticweb.HermiT.model.Individual;
14import org.semanticweb.HermiT.model.Term;
15import org.semanticweb.HermiT.model.Variable;
16import org.semanticweb.karma2.exception.IllegalInputQueryException;
17import org.semanticweb.karma2.model.ConjunctiveQuery;
18
19import uk.ac.ox.cs.JRDFox.Prefixes;
20import uk.ac.ox.cs.pagoda.util.Utility;
21
22
23
24
25public class ConjunctiveQueryWalker {
26
27
28 public ConjunctiveQueryWalker() {
29
30 }
31
32 @SuppressWarnings("unchecked")
33 private List<CommonTree> childrenOf(CommonTree node) {
34 return (List<CommonTree>) node.getChildren();
35 }
36
37
38 private boolean isSafe(Term[] headTerms, Atom[] atoms) {
39 for (Term t : headTerms) {
40 if (t instanceof Variable) {
41 boolean res = false;
42 for (Atom a : atoms) {
43 if (a.getArity()==1) {
44 if (a.getArgument(0).equals(t))
45 res = true;
46 }
47 if (a.getArity()==2) {
48 if (a.getArgument(0).equals(t) || a.getArgument(1).equals(t))
49 res = true;
50 }
51 }
52 if(!res)
53 return false;
54 }
55 }
56 return true;
57 }
58
59
60 public ConjunctiveQuery walkExpressionNode(CommonTree ruleNode) throws IllegalInputQueryException {
61
62 assert (ruleNode.getType() == ConjunctiveQueryLexer.EXPRESSION);
63
64 Iterator<CommonTree> iterator = childrenOf(ruleNode).iterator();
65
66 CommonTree prefixList = iterator.next();
67 assert (prefixList.getType() == ConjunctiveQueryLexer.PREFIX_LIST);
68 Prefixes prefixes = walkPrefixList(prefixList);
69 CommonTree rulebody = iterator.next();
70 assert (prefixList.getType() == ConjunctiveQueryLexer.RULE);
71 return walkRuleNode(rulebody, prefixes);
72
73 }
74
75 public Prefixes walkPrefixList(CommonTree prefixlist) throws IllegalInputQueryException {
76 assert (prefixlist.getType() == ConjunctiveQueryLexer.PREFIX_LIST);
77 Prefixes pref = new Prefixes();
78 for (CommonTree prefixNode : childrenOf(prefixlist)) {
79 walkPrefixNode(prefixNode, pref);
80 }
81 return pref;
82
83 }
84
85 private void walkPrefixNode(CommonTree prefixNode, Prefixes pref) throws IllegalInputQueryException {
86 Iterator<CommonTree> iterator = childrenOf(prefixNode).iterator();
87 CommonTree shortID = iterator.next();
88 CommonTree longID = iterator.next();
89 pref.declarePrefix(shortID.getText() + ":", longID.getText());
90 }
91
92
93 public ConjunctiveQuery walkRuleNode(CommonTree ruleNode, Prefixes prefixes) throws IllegalInputQueryException {
94
95 assert (ruleNode.getType() == ConjunctiveQueryLexer.RULE);
96
97 Iterator<CommonTree> iterator = childrenOf(ruleNode).iterator();
98
99 CommonTree headNode = iterator.next();
100 assert (headNode.getType() == ConjunctiveQueryLexer.HEADATOM);
101 Term[] headTerms = walkHeadAtomNode(headNode);
102 Atom[] atoms = walkAtomList(iterator.next());
103 if (!isSafe(headTerms, atoms))
104 throw new IllegalInputQueryException("query is not safe");
105 return new ConjunctiveQuery(atoms, headTerms, prefixes);
106
107 }
108
109 private Term[] walkHeadAtomNode(CommonTree node) throws IllegalInputQueryException {
110 List<Term> terms = new ArrayList<Term>();
111 for (CommonTree termNode : childrenOf(node)) {
112 terms.add(walkTermNode(termNode));
113 }
114 return terms.toArray(new Term[terms.size()]);
115 }
116
117
118 private String walkCompositeId(CommonTree compositeID) {
119 Iterator<CommonTree> iterator = childrenOf(compositeID).iterator();
120 return iterator.next().getText() + ":" + iterator.next().getText() ;
121 }
122
123 private String walkSimpleId(CommonTree termNode) {
124 Iterator<CommonTree> it = childrenOf(termNode).iterator();
125 it.next();
126 CommonTree t = it.next();
127 return t.getText();
128 }
129
130 private Term walkTermNode(CommonTree termNode) throws IllegalInputQueryException {
131 if (termNode.getType() == ConjunctiveQueryLexer.VARIABLE) {
132 return Variable.create("?" + childrenOf(termNode).iterator().next().getText());
133 }
134 if (termNode.getType() == ConjunctiveQueryLexer.CONSTANT) {
135 Individual newind = Individual.create(walkCompositeId(childrenOf(termNode).iterator().next()));
136 Utility.logError(newind);
137 return newind;
138 }
139 if (termNode.getType() == ConjunctiveQueryLexer.SCONSTANT) {
140 Individual newind = Individual.create(walkSimpleId(termNode));
141 return newind;
142 }
143 throw new IllegalArgumentException();
144 }
145
146
147
148 public Atom[] walkAtomList(CommonTree node) throws IllegalInputQueryException {
149 assert (node.getType() == ConjunctiveQueryLexer.ATOM_LIST);
150 List<Atom> atoms = new ArrayList<Atom>();
151 for (CommonTree atomNode : childrenOf(node)) {
152 atoms.add(walkAtomNode(atomNode));
153 }
154 return atoms.toArray(new Atom[atoms.size()]);
155
156 }
157
158 private Atom walkAtomNode(CommonTree atomNode) throws IllegalInputQueryException {
159 assert (atomNode.getType() == ConjunctiveQueryLexer.ATOM);
160 Iterator<CommonTree> iterator = childrenOf(atomNode).iterator();
161 CommonTree id = iterator.next();
162 String predicatename = walkCompositeId(id);
163 List<Term> listofterms = new ArrayList<Term>();
164 while (iterator.hasNext()){
165 listofterms.add(walkTermNode(iterator.next()));
166 }
167 if(listofterms.isEmpty() || (listofterms.size()>2))
168 throw new IllegalInputQueryException("Problem parsing terms in the query");
169 Term[] terms = listofterms.toArray(new Term[listofterms.size()]);
170 if (terms.length == 1)
171 return Atom.create(AtomicConcept.create(predicatename), terms);
172 if (terms.length == 2)
173 return Atom.create(AtomicRole.create(predicatename), terms);
174 throw new IllegalInputQueryException("Problem parsing terms in the query");
175 }
176
177
178}
179