Skip to content

Package: TypedQueryImpl

TypedQueryImpl

nameinstructionbranchcomplexitylinemethod
TypedQueryImpl(QueryHolder, Class, ConnectionWrapper, MetamodelProvider)
M: 0 C: 22
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
executeUpdate()
M: 0 C: 3
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
getMaxResults()
M: 0 C: 3
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getParameter(String)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getParameter(int)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getParameterValue(Parameter)
M: 0 C: 12
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
getParameterValue(String)
M: 0 C: 9
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
getParameterValue(int)
M: 0 C: 9
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
getParameters()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getResultList()
M: 0 C: 25
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 11
100%
M: 0 C: 1
100%
getResultListImpl(int)
M: 9 C: 74
89%
M: 1 C: 9
90%
M: 1 C: 5
83%
M: 2 C: 17
89%
M: 0 C: 1
100%
getSingleResult()
M: 0 C: 53
100%
M: 0 C: 4
100%
M: 0 C: 3
100%
M: 0 C: 12
100%
M: 0 C: 1
100%
isBound(Parameter)
M: 0 C: 9
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
loadEntityInstance(ResultSet, Descriptor)
M: 0 C: 22
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
loadResultValue(ResultSet)
M: 15 C: 6
29%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 2 C: 1
33%
M: 0 C: 1
100%
setDescriptor(Descriptor)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
setMaxResults(int)
M: 0 C: 14
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
setParameter(Parameter, Object)
M: 0 C: 13
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
setParameter(Parameter, String, String)
M: 0 C: 14
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
setParameter(String, Object)
M: 0 C: 16
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
setParameter(String, String, String)
M: 0 C: 17
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
setParameter(int, Object)
M: 0 C: 16
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
setParameter(int, String, String)
M: 0 C: 17
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
setUnitOfWork(UnitOfWork)
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
static {...}
M: 0 C: 1
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%

Coverage

1: /**
2: * Copyright (C) 2016 Czech Technical University in Prague
3: *
4: * This program is free software: you can redistribute it and/or modify it under
5: * the terms of the GNU General Public License as published by the Free Software
6: * Foundation, either version 3 of the License, or (at your option) any
7: * later version.
8: *
9: * This program is distributed in the hope that it will be useful, but WITHOUT
10: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
12: * details. You should have received a copy of the GNU General Public License
13: * along with this program. If not, see <http://www.gnu.org/licenses/>.
14: */
15: package cz.cvut.kbss.jopa.model;
16:
17: import cz.cvut.kbss.jopa.exceptions.NoResultException;
18: import cz.cvut.kbss.jopa.exceptions.NoUniqueResultException;
19: import cz.cvut.kbss.jopa.exceptions.OWLPersistenceException;
20: import cz.cvut.kbss.jopa.model.descriptors.Descriptor;
21: import cz.cvut.kbss.jopa.model.descriptors.EntityDescriptor;
22: import cz.cvut.kbss.jopa.model.query.Parameter;
23: import cz.cvut.kbss.jopa.model.query.TypedQuery;
24: import cz.cvut.kbss.jopa.query.QueryHolder;
25: import cz.cvut.kbss.jopa.sessions.ConnectionWrapper;
26: import cz.cvut.kbss.jopa.sessions.MetamodelProvider;
27: import cz.cvut.kbss.jopa.sessions.UnitOfWork;
28: import cz.cvut.kbss.jopa.utils.ErrorUtils;
29: import cz.cvut.kbss.ontodriver.ResultSet;
30: import cz.cvut.kbss.ontodriver.Statement;
31: import cz.cvut.kbss.ontodriver.exception.OntoDriverException;
32:
33: import java.net.URI;
34: import java.util.*;
35:
36: public class TypedQueryImpl<X> extends AbstractQuery implements TypedQuery<X> {
37:
38: private final Class<X> resultType;
39: private final MetamodelProvider metamodelProvider;
40:
41: private UnitOfWork uow;
42:
43: private int maxResults;
44:
45: private Descriptor descriptor;
46:
47: public TypedQueryImpl(final QueryHolder query, final Class<X> resultType,
48: final ConnectionWrapper connection, MetamodelProvider metamodelProvider) {
49: super(query, connection);
50: this.resultType = Objects.requireNonNull(resultType, ErrorUtils.getNPXMessageSupplier("resultType"));
51: this.metamodelProvider = Objects
52: .requireNonNull(metamodelProvider, ErrorUtils.getNPXMessageSupplier("metamodelProvider"));
53: this.maxResults = Integer.MAX_VALUE;
54: }
55:
56: public void setUnitOfWork(UnitOfWork uow) {
57: this.uow = uow;
58: }
59:
60: @Override
61: public void executeUpdate() {
62: executeUpdateImpl();
63: }
64:
65: @Override
66: public List<X> getResultList() {
67:• if (maxResults == 0) {
68: return Collections.emptyList();
69: }
70: List<X> list;
71: try {
72: list = getResultListImpl(maxResults);
73: } catch (OntoDriverException e) {
74: markTransactionForRollback();
75: throw queryEvaluationException(e);
76: } catch (RuntimeException e) {
77: markTransactionForRollback();
78: throw e;
79: }
80:
81: return list;
82: }
83:
84: @Override
85: public X getSingleResult() {
86: try {
87: // call it with maxResults = 2 just to see whether there are
88: // multiple results
89: final List<X> res = getResultListImpl(2);
90:• if (res.isEmpty()) {
91: throw new NoResultException("No result found for query " + query);
92: }
93:• if (res.size() > 1) {
94: throw new NoUniqueResultException("Multiple results found for query " + query);
95: }
96: return res.get(0);
97: } catch (OntoDriverException e) {
98: markTransactionForRollback();
99: throw queryEvaluationException(e);
100: } catch (RuntimeException e) {
101: markTransactionForRollback();
102: throw e;
103: }
104: }
105:
106: @Override
107: public TypedQuery<X> setMaxResults(int maxResults) {
108:• if (maxResults < 0) {
109: markTransactionForRollback();
110: throw new IllegalArgumentException("Cannot set maximum number of results to less than 0.");
111: }
112: this.maxResults = maxResults;
113: return this;
114: }
115:
116: @Override
117: public int getMaxResults() {
118: return maxResults;
119: }
120:
121: @Override
122: public Parameter<?> getParameter(int position) {
123: return query.getParameter(position);
124: }
125:
126: @Override
127: public Parameter<?> getParameter(String name) {
128: return query.getParameter(name);
129: }
130:
131: @Override
132: public Set<Parameter<?>> getParameters() {
133: return query.getParameters();
134: }
135:
136: @Override
137: public boolean isBound(Parameter<?> parameter) {
138:• return query.getParameterValue(parameter) != null;
139: }
140:
141: @Override
142: public Object getParameterValue(int position) {
143: final Parameter<?> param = query.getParameter(position);
144: return getParameterValue(param);
145: }
146:
147: @Override
148: public Object getParameterValue(String name) {
149: final Parameter<?> param = query.getParameter(name);
150: return getParameterValue(param);
151: }
152:
153: @Override
154: public <T> T getParameterValue(Parameter<T> parameter) {
155:• if (!isBound(parameter)) {
156: throw unboundParam(parameter);
157: }
158: return (T) query.getParameterValue(parameter);
159: }
160:
161: @Override
162: public TypedQuery<X> setParameter(int position, Object value) {
163: try {
164: query.setParameter(query.getParameter(position), value);
165: } catch (RuntimeException e) {
166: markTransactionForRollback();
167: throw e;
168: }
169: return this;
170: }
171:
172: @Override
173: public TypedQuery<X> setParameter(int position, String value, String language) {
174: try {
175: query.setParameter(query.getParameter(position), value, language);
176: } catch (RuntimeException e) {
177: markTransactionForRollback();
178: throw e;
179: }
180: return this;
181: }
182:
183: @Override
184: public TypedQuery<X> setParameter(String name, Object value) {
185: try {
186: query.setParameter(query.getParameter(name), value);
187: } catch (RuntimeException e) {
188: markTransactionForRollback();
189: throw e;
190: }
191: return this;
192: }
193:
194: @Override
195: public TypedQuery<X> setParameter(String name, String value, String language) {
196: try {
197: query.setParameter(query.getParameter(name), value, language);
198: } catch (RuntimeException e) {
199: markTransactionForRollback();
200: throw e;
201: }
202: return this;
203: }
204:
205: @Override
206: public <T> TypedQuery<X> setParameter(Parameter<T> parameter, T value) {
207: try {
208: query.setParameter(parameter, value);
209: } catch (RuntimeException e) {
210: markTransactionForRollback();
211: throw e;
212: }
213: return this;
214: }
215:
216: @Override
217: public TypedQuery<X> setParameter(Parameter<String> parameter, String value, String language) {
218: try {
219: query.setParameter(parameter, value, language);
220: } catch (RuntimeException e) {
221: markTransactionForRollback();
222: throw e;
223: }
224: return this;
225: }
226:
227: @Override
228: public TypedQuery<X> setDescriptor(Descriptor descriptor) {
229: this.descriptor = descriptor;
230: return this;
231: }
232:
233: private List<X> getResultListImpl(int maxResults) throws OntoDriverException {
234:• assert maxResults > 0;
235: final Statement stmt = connection.createStatement();
236: try {
237: setTargetOntology(stmt);
238: final ResultSet rs = stmt.executeQuery(query.assembleQuery());
239: final List<X> res = new ArrayList<>();
240: // TODO register this as observer on the result set so that additional results can be loaded asynchronously
241: int cnt = 0;
242: final boolean isTypeManaged = metamodelProvider.isTypeManaged(resultType);
243:• final Descriptor instDescriptor = descriptor != null ? descriptor : new EntityDescriptor();
244:• while (rs.hasNext() && cnt < maxResults) {
245: rs.next();
246:• if (isTypeManaged) {
247: loadEntityInstance(rs, instDescriptor).ifPresent(res::add);
248: } else {
249: res.add(loadResultValue(rs));
250: }
251: cnt++;
252: }
253: return res;
254: } finally {
255: try {
256: stmt.close();
257: } catch (Exception e) {
258: LOG.error("Unable to close statement after query evaluation.", e);
259: }
260: }
261: }
262:
263: private Optional<X> loadEntityInstance(ResultSet resultSet, Descriptor instanceDescriptor)
264: throws OntoDriverException {
265:• if (uow == null) {
266: throw new IllegalStateException("Cannot load entity instance without Unit of Work.");
267: }
268: final URI uri = URI.create(resultSet.getString(0));
269: return Optional.ofNullable(uow.readObject(resultType, uri, instanceDescriptor));
270: }
271:
272: private X loadResultValue(ResultSet resultSet) throws OntoDriverException {
273: try {
274: return resultSet.getObject(0, resultType);
275: } catch (OntoDriverException e) {
276: throw new OWLPersistenceException("Unable to map the query result to class " + resultType, e);
277: }
278: }
279: }