]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.common/src/org/simantics/db/common/request/Queries.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.common / src / org / simantics / db / common / request / Queries.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.db.common.request;\r
13 \r
14 import java.util.Collection;\r
15 \r
16 import org.simantics.databoard.binding.Binding;\r
17 import org.simantics.db.ReadGraph;\r
18 import org.simantics.db.Resource;\r
19 import org.simantics.db.common.uri.ResourceToPossibleURI;\r
20 import org.simantics.db.common.uri.ResourceToURI;\r
21 import org.simantics.db.common.utils.NameUtils;\r
22 import org.simantics.db.exception.DatabaseException;\r
23 import org.simantics.db.request.AsyncRead;\r
24 import org.simantics.db.request.Read;\r
25 import org.simantics.layer0.Layer0;\r
26 \r
27 /**\r
28  * Facade class that aggregates the most common queries.\r
29  * \r
30  * Example:\r
31  * \r
32  *   System.out.println(  session.read( Queries.adapt(r, String.class) )  );\r
33  *\r
34  * @author Tuukka Lehtonen\r
35  * @author Toni Kalajainen\r
36  */\r
37 public class Queries {\r
38 \r
39     public static AsyncRead<Resource> resource(String uri) {\r
40         return new org.simantics.db.common.primitiverequest.Resource(uri);\r
41     }\r
42 \r
43     public static Read<String> name(final Resource resource) {\r
44         return new ResourceRead<String>(resource) {\r
45             @Override\r
46             public String perform(ReadGraph graph) throws DatabaseException {\r
47                 return graph.getRelatedValue(resource, Layer0.getInstance(graph).HasName);\r
48             }\r
49         };\r
50     }\r
51 \r
52     public static Read<String> safeName(final Resource resource) {\r
53         return new ResourceRead<String>(resource) {\r
54             @Override\r
55             public String perform(ReadGraph graph) throws DatabaseException {\r
56                 return NameUtils.getSafeName(graph, resource);\r
57             }\r
58         };\r
59     }\r
60 \r
61     public static Read<String> name(final String uri) {\r
62         return new UnaryRead<String, String>(uri) {\r
63             @Override\r
64             public String perform(ReadGraph graph) throws DatabaseException {\r
65                 Resource resource = graph.getResource(uri);\r
66                 return graph.getRelatedValue(resource, Layer0.getInstance(graph).HasName);\r
67             }\r
68         };\r
69     }\r
70 \r
71     public static Read<String> uri(Resource resource) {\r
72         return new ResourceToURI(resource);\r
73     }\r
74 \r
75     public static Read<String> possibleUri(Resource resource) {\r
76         return new ResourceToPossibleURI(resource);\r
77     }\r
78 \r
79     public static <T> Read<T> adapt(Resource resource, Class<T> target)\r
80     {\r
81         return new Adapt<T>(resource, target);\r
82     }\r
83 \r
84     public static <T> Read<T> adapt(Resource resource, Class<T> target, boolean allowNull)\r
85     {\r
86         return new Adapt<T>(resource, target, allowNull);\r
87     }\r
88 \r
89     public static <T> Read<T> adapt(Resource resource, Class<T> target, boolean allowNull, boolean uniqueResult)\r
90     {\r
91         return new Adapt<T>(resource, target, allowNull, uniqueResult);\r
92     }\r
93 \r
94     public static Read<Boolean> isInstanceOf(Resource resource, Resource type)\r
95     {\r
96         return new IsInstanceOfQuery(resource, type);\r
97     }\r
98 \r
99     public static Read<Boolean> isInstanceOf(Resource resource, String type)\r
100     {\r
101         return new IsInstanceOfQuery2(resource, type);\r
102     }\r
103 \r
104     public static <T> Read<T> getRelatedValue(Resource subject, Resource relation, Binding binding)\r
105     {\r
106         return new ReadRelatedValue<T>(subject, relation, binding);\r
107     }\r
108 \r
109     public static <T> Read<T> getRelatedValue(Resource subject, String relation, Binding binding)\r
110     {\r
111         return new ReadRelatedValue2<T>(subject, relation, binding);\r
112     }\r
113 \r
114     public static <T> Read<T> getPossibleRelatedValue(Resource subject, Resource relation, Binding binding)\r
115     {\r
116         return new ReadPossibleRelatedValue<T>(subject, relation, binding);\r
117     }\r
118     \r
119     public static Read<Boolean> hasTag(Resource subject, Resource tag) {\r
120         return new HasTag(subject, tag);\r
121     }\r
122 \r
123     public static ObjectsWithType objectsWithType(Resource subject, Resource subrelationOf, Resource instanceOf) {\r
124         return new ObjectsWithType(subject, subrelationOf, instanceOf);\r
125     }\r
126 \r
127         public static Read<Resource> possibleObjectWithType(final Resource resource, final Resource predicate, final Resource type) {\r
128                 return new PossibleObjectWithType(resource, predicate, type);\r
129         }\r
130         \r
131         public static Read<Resource> possibleObject(final Resource subject, final Resource predicate) {\r
132                 return new Read<Resource>() {\r
133                         @Override\r
134                         public Resource perform(ReadGraph graph) throws DatabaseException {\r
135                                 return graph.getPossibleObject(subject, predicate);\r
136                         }\r
137                 };              \r
138         }\r
139         \r
140         public static Read<Collection<Resource>> objects(final Resource subject, final Resource predicate) {\r
141                 return new Read<Collection<Resource>>() {\r
142                         @Override\r
143                         public Collection<Resource> perform(ReadGraph graph) throws DatabaseException {\r
144                                 return graph.getObjects(subject, predicate);\r
145                         }\r
146                 };              \r
147         }       \r
148         \r
149     \r
150 }\r
151 \r
152 \r
153 class IsInstanceOfQuery implements Read<Boolean> {\r
154 \r
155     final protected Resource resource;\r
156     final protected Resource type;\r
157 \r
158     public IsInstanceOfQuery(Resource resource, Resource type) {\r
159         this.resource = resource;\r
160         this.type = type;\r
161     }\r
162 \r
163     @Override\r
164     public int hashCode() {\r
165         return resource.hashCode() + 13 * type.hashCode();\r
166     }\r
167 \r
168     @Override\r
169     public boolean equals(Object object) {\r
170         if (this == object)\r
171             return true;\r
172         else if (object == null)\r
173             return false;\r
174         else if (getClass() != object.getClass())\r
175             return false;\r
176         IsInstanceOfQuery other = (IsInstanceOfQuery) object;\r
177         return resource.equals(other.resource) && type.equals(other.type);\r
178     }\r
179 \r
180     @Override\r
181     public Boolean perform(ReadGraph graph) throws DatabaseException {\r
182         return graph.isInstanceOf(resource, type);\r
183     }\r
184 \r
185 }\r
186 \r
187 class IsInstanceOfQuery2 implements Read<Boolean> {\r
188 \r
189     final protected Resource resource;\r
190     final protected String type;\r
191 \r
192     public IsInstanceOfQuery2(Resource resource, String type) {\r
193         this.resource = resource;\r
194         this.type = type;\r
195     }\r
196 \r
197     @Override\r
198     public int hashCode() {\r
199         return resource.hashCode() + 13 * type.hashCode();\r
200     }\r
201 \r
202     @Override\r
203     public boolean equals(Object object) {\r
204         if (this == object)\r
205             return true;\r
206         else if (object == null)\r
207             return false;\r
208         else if (getClass() != object.getClass())\r
209             return false;\r
210         IsInstanceOfQuery other = (IsInstanceOfQuery) object;\r
211         return resource.equals(other.resource) && type.equals(other.type);\r
212     }\r
213 \r
214     @Override\r
215     public Boolean perform(ReadGraph graph) throws DatabaseException {\r
216         Resource typeResource = graph.getResource(type);\r
217         return graph.isInstanceOf(resource, typeResource);\r
218     }\r
219 \r
220 }\r
221 \r
222 \r
223 class ReadRelatedValue<T> implements Read<T> {\r
224 \r
225     Resource subject;\r
226     Resource relation;\r
227     Binding binding;\r
228 \r
229     public ReadRelatedValue(Resource subject, Resource relation, Binding binding) {\r
230         this.subject = subject;\r
231         this.relation = relation;\r
232         this.binding = binding;\r
233     }\r
234 \r
235     @Override\r
236     public int hashCode() {\r
237         return subject.hashCode() + 13 * relation.hashCode() + 7*binding.hashCode();\r
238     }\r
239 \r
240     @Override\r
241     public boolean equals(Object object) {\r
242         if (this == object)\r
243             return true;\r
244         else if (object == null)\r
245             return false;\r
246         else if (getClass() != object.getClass())\r
247             return false;\r
248         ReadRelatedValue<?> other = (ReadRelatedValue<?>) object;\r
249         return subject.equals(other.subject) &&\r
250         relation.equals(other.relation) &&\r
251         binding.equals(other.binding);\r
252     }\r
253 \r
254     @SuppressWarnings("unchecked")\r
255     @Override\r
256     public T perform(ReadGraph graph) throws DatabaseException {\r
257         return (T) graph.getRelatedValue(subject, relation, binding);\r
258     }\r
259 }\r
260 \r
261 \r
262 class ReadRelatedValue2<T> implements Read<T> {\r
263 \r
264     Resource subject;\r
265     String relation;\r
266     Binding binding;\r
267 \r
268     public ReadRelatedValue2(Resource subject, String relation, Binding binding) {\r
269         this.subject = subject;\r
270         this.relation = relation;\r
271         this.binding = binding;\r
272     }\r
273 \r
274     @Override\r
275     public int hashCode() {\r
276         return subject.hashCode() + 13 * relation.hashCode() + 7*binding.hashCode();\r
277     }\r
278 \r
279     @Override\r
280     public boolean equals(Object object) {\r
281         if (this == object)\r
282             return true;\r
283         else if (object == null)\r
284             return false;\r
285         else if (getClass() != object.getClass())\r
286             return false;\r
287         ReadRelatedValue2<?> other = (ReadRelatedValue2<?>) object;\r
288         return subject.equals(other.subject) &&\r
289         relation.equals(other.relation) &&\r
290         binding.equals(other.binding);\r
291     }\r
292 \r
293     @SuppressWarnings("unchecked")\r
294     @Override\r
295     public T perform(ReadGraph graph) throws DatabaseException {\r
296         Resource relationResource = graph.getResource(relation);\r
297         return (T) graph.getRelatedValue(subject, relationResource, binding);\r
298     }\r
299 }\r
300 \r
301 class ReadPossibleRelatedValue<T> implements Read<T> {\r
302 \r
303     Resource subject;\r
304     Resource relation;\r
305     Binding binding;\r
306 \r
307     public ReadPossibleRelatedValue(Resource subject, Resource relation, Binding binding) {\r
308         this.subject = subject;\r
309         this.relation = relation;\r
310         this.binding = binding;\r
311     }\r
312 \r
313     @Override\r
314     public int hashCode() {\r
315         return subject.hashCode() + 13 * relation.hashCode() + 7*binding.hashCode() + 5453;\r
316     }\r
317 \r
318     @Override\r
319     public boolean equals(Object object) {\r
320         if (this == object)\r
321             return true;\r
322         else if (object == null)\r
323             return false;\r
324         else if (getClass() != object.getClass())\r
325             return false;\r
326         ReadPossibleRelatedValue<?> other = (ReadPossibleRelatedValue<?>) object;\r
327         return subject.equals(other.subject) &&\r
328         relation.equals(other.relation) &&\r
329         binding.equals(other.binding);\r
330     }\r
331 \r
332     @SuppressWarnings("unchecked")\r
333     @Override\r
334     public T perform(ReadGraph graph) throws DatabaseException {\r
335         return (T) graph.getPossibleRelatedValue(subject, relation, binding);\r
336     }\r
337 }\r
338 \r
339 class HasTag extends ResourceRead2<Boolean> {\r
340     public HasTag(Resource subject, Resource tag) {\r
341         super(subject, tag);\r
342     }\r
343 \r
344     @Override\r
345     public Boolean perform(ReadGraph graph) throws DatabaseException {\r
346         return Boolean.valueOf(graph.hasStatement(resource, resource2, resource));\r
347     }\r
348 }