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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.db.common.request;
\r
14 import java.util.Collection;
\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
28 * Facade class that aggregates the most common queries.
\r
32 * System.out.println( session.read( Queries.adapt(r, String.class) ) );
\r
34 * @author Tuukka Lehtonen
\r
35 * @author Toni Kalajainen
\r
37 public class Queries {
\r
39 public static AsyncRead<Resource> resource(String uri) {
\r
40 return new org.simantics.db.common.primitiverequest.Resource(uri);
\r
43 public static Read<String> name(final Resource resource) {
\r
44 return new ResourceRead<String>(resource) {
\r
46 public String perform(ReadGraph graph) throws DatabaseException {
\r
47 return graph.getRelatedValue(resource, Layer0.getInstance(graph).HasName);
\r
52 public static Read<String> safeName(final Resource resource) {
\r
53 return new ResourceRead<String>(resource) {
\r
55 public String perform(ReadGraph graph) throws DatabaseException {
\r
56 return NameUtils.getSafeName(graph, resource);
\r
61 public static Read<String> name(final String uri) {
\r
62 return new UnaryRead<String, String>(uri) {
\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
71 public static Read<String> uri(Resource resource) {
\r
72 return new ResourceToURI(resource);
\r
75 public static Read<String> possibleUri(Resource resource) {
\r
76 return new ResourceToPossibleURI(resource);
\r
79 public static <T> Read<T> adapt(Resource resource, Class<T> target)
\r
81 return new Adapt<T>(resource, target);
\r
84 public static <T> Read<T> adapt(Resource resource, Class<T> target, boolean allowNull)
\r
86 return new Adapt<T>(resource, target, allowNull);
\r
89 public static <T> Read<T> adapt(Resource resource, Class<T> target, boolean allowNull, boolean uniqueResult)
\r
91 return new Adapt<T>(resource, target, allowNull, uniqueResult);
\r
94 public static Read<Boolean> isInstanceOf(Resource resource, Resource type)
\r
96 return new IsInstanceOfQuery(resource, type);
\r
99 public static Read<Boolean> isInstanceOf(Resource resource, String type)
\r
101 return new IsInstanceOfQuery2(resource, type);
\r
104 public static <T> Read<T> getRelatedValue(Resource subject, Resource relation, Binding binding)
\r
106 return new ReadRelatedValue<T>(subject, relation, binding);
\r
109 public static <T> Read<T> getRelatedValue(Resource subject, String relation, Binding binding)
\r
111 return new ReadRelatedValue2<T>(subject, relation, binding);
\r
114 public static <T> Read<T> getPossibleRelatedValue(Resource subject, Resource relation, Binding binding)
\r
116 return new ReadPossibleRelatedValue<T>(subject, relation, binding);
\r
119 public static Read<Boolean> hasTag(Resource subject, Resource tag) {
\r
120 return new HasTag(subject, tag);
\r
123 public static ObjectsWithType objectsWithType(Resource subject, Resource subrelationOf, Resource instanceOf) {
\r
124 return new ObjectsWithType(subject, subrelationOf, instanceOf);
\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
131 public static Read<Resource> possibleObject(final Resource subject, final Resource predicate) {
\r
132 return new Read<Resource>() {
\r
134 public Resource perform(ReadGraph graph) throws DatabaseException {
\r
135 return graph.getPossibleObject(subject, predicate);
\r
140 public static Read<Collection<Resource>> objects(final Resource subject, final Resource predicate) {
\r
141 return new Read<Collection<Resource>>() {
\r
143 public Collection<Resource> perform(ReadGraph graph) throws DatabaseException {
\r
144 return graph.getObjects(subject, predicate);
\r
153 class IsInstanceOfQuery implements Read<Boolean> {
\r
155 final protected Resource resource;
\r
156 final protected Resource type;
\r
158 public IsInstanceOfQuery(Resource resource, Resource type) {
\r
159 this.resource = resource;
\r
164 public int hashCode() {
\r
165 return resource.hashCode() + 13 * type.hashCode();
\r
169 public boolean equals(Object object) {
\r
170 if (this == object)
\r
172 else if (object == null)
\r
174 else if (getClass() != object.getClass())
\r
176 IsInstanceOfQuery other = (IsInstanceOfQuery) object;
\r
177 return resource.equals(other.resource) && type.equals(other.type);
\r
181 public Boolean perform(ReadGraph graph) throws DatabaseException {
\r
182 return graph.isInstanceOf(resource, type);
\r
187 class IsInstanceOfQuery2 implements Read<Boolean> {
\r
189 final protected Resource resource;
\r
190 final protected String type;
\r
192 public IsInstanceOfQuery2(Resource resource, String type) {
\r
193 this.resource = resource;
\r
198 public int hashCode() {
\r
199 return resource.hashCode() + 13 * type.hashCode();
\r
203 public boolean equals(Object object) {
\r
204 if (this == object)
\r
206 else if (object == null)
\r
208 else if (getClass() != object.getClass())
\r
210 IsInstanceOfQuery other = (IsInstanceOfQuery) object;
\r
211 return resource.equals(other.resource) && type.equals(other.type);
\r
215 public Boolean perform(ReadGraph graph) throws DatabaseException {
\r
216 Resource typeResource = graph.getResource(type);
\r
217 return graph.isInstanceOf(resource, typeResource);
\r
223 class ReadRelatedValue<T> implements Read<T> {
\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
236 public int hashCode() {
\r
237 return subject.hashCode() + 13 * relation.hashCode() + 7*binding.hashCode();
\r
241 public boolean equals(Object object) {
\r
242 if (this == object)
\r
244 else if (object == null)
\r
246 else if (getClass() != object.getClass())
\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
254 @SuppressWarnings("unchecked")
\r
256 public T perform(ReadGraph graph) throws DatabaseException {
\r
257 return (T) graph.getRelatedValue(subject, relation, binding);
\r
262 class ReadRelatedValue2<T> implements Read<T> {
\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
275 public int hashCode() {
\r
276 return subject.hashCode() + 13 * relation.hashCode() + 7*binding.hashCode();
\r
280 public boolean equals(Object object) {
\r
281 if (this == object)
\r
283 else if (object == null)
\r
285 else if (getClass() != object.getClass())
\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
293 @SuppressWarnings("unchecked")
\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
301 class ReadPossibleRelatedValue<T> implements Read<T> {
\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
314 public int hashCode() {
\r
315 return subject.hashCode() + 13 * relation.hashCode() + 7*binding.hashCode() + 5453;
\r
319 public boolean equals(Object object) {
\r
320 if (this == object)
\r
322 else if (object == null)
\r
324 else if (getClass() != object.getClass())
\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
332 @SuppressWarnings("unchecked")
\r
334 public T perform(ReadGraph graph) throws DatabaseException {
\r
335 return (T) graph.getPossibleRelatedValue(subject, relation, binding);
\r
339 class HasTag extends ResourceRead2<Boolean> {
\r
340 public HasTag(Resource subject, Resource tag) {
\r
341 super(subject, tag);
\r
345 public Boolean perform(ReadGraph graph) throws DatabaseException {
\r
346 return Boolean.valueOf(graph.hasStatement(resource, resource2, resource));
\r