Package: SelectResultSet
SelectResultSet
name | instruction | branch | complexity | line | method | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SelectResultSet(QueryResult, Statement) |
|
|
|
|
|
||||||||||||||||||||
ensureState() |
|
|
|
|
|
||||||||||||||||||||
ensureValueIsAssignableToClass(Object, Class) |
|
|
|
|
|
||||||||||||||||||||
ensureValueIsLiteral(OWLObject) |
|
|
|
|
|
||||||||||||||||||||
findColumn(String) |
|
|
|
|
|
||||||||||||||||||||
first() |
|
|
|
|
|
||||||||||||||||||||
getBoolean(String) |
|
|
|
|
|
||||||||||||||||||||
getBoolean(int) |
|
|
|
|
|
||||||||||||||||||||
getByte(String) |
|
|
|
|
|
||||||||||||||||||||
getByte(int) |
|
|
|
|
|
||||||||||||||||||||
getColumnCount() |
|
|
|
|
|
||||||||||||||||||||
getCurrentValue(String) |
|
|
|
|
|
||||||||||||||||||||
getCurrentValue(int) |
|
|
|
|
|
||||||||||||||||||||
getDouble(String) |
|
|
|
|
|
||||||||||||||||||||
getDouble(int) |
|
|
|
|
|
||||||||||||||||||||
getFloat(String) |
|
|
|
|
|
||||||||||||||||||||
getFloat(int) |
|
|
|
|
|
||||||||||||||||||||
getInt(String) |
|
|
|
|
|
||||||||||||||||||||
getInt(int) |
|
|
|
|
|
||||||||||||||||||||
getLiteral(String) |
|
|
|
|
|
||||||||||||||||||||
getLiteral(int) |
|
|
|
|
|
||||||||||||||||||||
getLong(String) |
|
|
|
|
|
||||||||||||||||||||
getLong(int) |
|
|
|
|
|
||||||||||||||||||||
getObject(String) |
|
|
|
|
|
||||||||||||||||||||
getObject(String, Class) |
|
|
|
|
|
||||||||||||||||||||
getObject(int) |
|
|
|
|
|
||||||||||||||||||||
getObject(int, Class) |
|
|
|
|
|
||||||||||||||||||||
getPrimitiveValue(Class, String) |
|
|
|
|
|
||||||||||||||||||||
getPrimitiveValue(Class, int) |
|
|
|
|
|
||||||||||||||||||||
getRowIndex() |
|
|
|
|
|
||||||||||||||||||||
getShort(String) |
|
|
|
|
|
||||||||||||||||||||
getShort(int) |
|
|
|
|
|
||||||||||||||||||||
getString(String) |
|
|
|
|
|
||||||||||||||||||||
getString(int) |
|
|
|
|
|
||||||||||||||||||||
hasNext() |
|
|
|
|
|
||||||||||||||||||||
isBound(String) |
|
|
|
|
|
||||||||||||||||||||
isBound(int) |
|
|
|
|
|
||||||||||||||||||||
isFirst() |
|
|
|
|
|
||||||||||||||||||||
last() |
|
|
|
|
|
||||||||||||||||||||
next() |
|
|
|
|
|
||||||||||||||||||||
owlObjectToObject(OWLObject) |
|
|
|
|
|
||||||||||||||||||||
owlObjectToType(OWLObject, Class) |
|
|
|
|
|
||||||||||||||||||||
owlValueToString(OWLObject) |
|
|
|
|
|
||||||||||||||||||||
previous() |
|
|
|
|
|
||||||||||||||||||||
relative(int) |
|
|
|
|
|
||||||||||||||||||||
resolveVariableNamesAndIndexes() |
|
|
|
|
|
||||||||||||||||||||
setRowIndex(int) |
|
|
|
|
|
Coverage
1: /*
2: * JOPA
3: * Copyright (C) 2024 Czech Technical University in Prague
4: *
5: * This library is free software; you can redistribute it and/or
6: * modify it under the terms of the GNU Lesser General Public
7: * License as published by the Free Software Foundation; either
8: * version 3.0 of the License, or (at your option) any later version.
9: *
10: * This library is distributed in the hope that it will be useful,
11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: * Lesser General Public License for more details.
14: *
15: * You should have received a copy of the GNU Lesser General Public
16: * License along with this library.
17: */
18: package cz.cvut.kbss.ontodriver.owlapi.query;
19:
20: import cz.cvut.kbss.jopa.datatype.DatatypeTransformer;
21: import cz.cvut.kbss.ontodriver.Statement;
22: import cz.cvut.kbss.ontodriver.exception.OntoDriverException;
23: import cz.cvut.kbss.ontodriver.exception.VariableNotBoundException;
24: import cz.cvut.kbss.ontodriver.owlapi.exception.BindingValueMismatchException;
25: import cz.cvut.kbss.ontodriver.owlapi.exception.OwlapiDriverException;
26: import cz.cvut.kbss.ontodriver.owlapi.util.OwlapiUtils;
27: import cz.cvut.kbss.owl2query.model.GroundTerm;
28: import cz.cvut.kbss.owl2query.model.QueryResult;
29: import cz.cvut.kbss.owl2query.model.ResultBinding;
30: import cz.cvut.kbss.owl2query.model.Variable;
31: import org.semanticweb.owlapi.model.OWLEntity;
32: import org.semanticweb.owlapi.model.OWLLiteral;
33: import org.semanticweb.owlapi.model.OWLObject;
34:
35: import java.net.URI;
36: import java.util.*;
37: import java.util.stream.Collectors;
38:
39: import static cz.cvut.kbss.ontodriver.util.ErrorUtils.getNPXMessageSupplier;
40:
41: class SelectResultSet extends AbstractResultSet {
42:
43: private final QueryResult<OWLObject> queryResult;
44: private Iterator<ResultBinding<OWLObject>> iterator;
45:
46: private final Map<String, Variable<OWLObject>> namesToVariables;
47: private final Map<Integer, Variable<OWLObject>> indexesToVariables;
48:
49: private int currentIndex;
50: private ResultBinding<OWLObject> currentRow;
51:
52: public SelectResultSet(QueryResult<OWLObject> queryResult, Statement statement) {
53: super(statement);
54: this.queryResult = queryResult;
55: this.iterator = queryResult.iterator();
56: this.currentIndex = -1;
57: final int bindingSize = queryResult.getResultVars().size();
58: this.namesToVariables = new HashMap<>(bindingSize);
59: this.indexesToVariables = new HashMap<>(bindingSize);
60: resolveVariableNamesAndIndexes();
61: }
62:
63: private void resolveVariableNamesAndIndexes() {
64: Integer i = 0;
65:• for (Variable<OWLObject> v : queryResult.getResultVars()) {
66: namesToVariables.put(v.getName(), v);
67: indexesToVariables.put(i, v);
68: i++;
69: }
70: }
71:
72: @Override
73: public int findColumn(String columnLabel) {
74: ensureOpen();
75: final Variable<OWLObject> v = namesToVariables.get(columnLabel);
76:• if (v == null) {
77: return -1;
78: }
79:• for (Map.Entry<Integer, Variable<OWLObject>> e : indexesToVariables.entrySet()) {
80:• if (e.getValue().equals(v)) {
81: return e.getKey();
82: }
83: }
84: return -1;
85: }
86:
87: @Override
88: public int getColumnCount() {
89: ensureOpen();
90: return namesToVariables.size();
91: }
92:
93: @Override
94: public boolean isBound(int variableIndex) {
95: ensureState();
96:• return indexesToVariables.containsKey(variableIndex) && currentRow
97:• .get(indexesToVariables.get(variableIndex)) != null;
98: }
99:
100: @Override
101: public boolean isBound(String variableName) {
102: ensureState();
103:• return namesToVariables.containsKey(variableName) && currentRow.get(namesToVariables.get(variableName)) != null;
104: }
105:
106: @Override
107: public void first() {
108: ensureOpen();
109: this.currentIndex = -1;
110: this.iterator = queryResult.iterator();
111: next();
112: }
113:
114: @Override
115: public boolean getBoolean(int columnIndex) throws OntoDriverException {
116: return getPrimitiveValue(Boolean.class, columnIndex);
117: }
118:
119: private <T> T getPrimitiveValue(Class<T> cls, int columnIndex) throws OntoDriverException {
120: final Object val = OwlapiUtils.owlLiteralToValue(getLiteral(columnIndex));
121: ensureValueIsAssignableToClass(val, cls);
122: return cls.cast(val);
123: }
124:
125: private static <T> void ensureValueIsAssignableToClass(Object val, Class<T> cls) {
126:• if (!cls.isAssignableFrom(val.getClass())) {
127: throw new BindingValueMismatchException("Value " + val + " cannot be returned as " + cls.getSimpleName());
128: }
129: }
130:
131: private OWLLiteral getLiteral(int columnIndex) throws OntoDriverException {
132: final OWLObject currentValue = getCurrentValue(columnIndex);
133: ensureValueIsLiteral(currentValue);
134: return (OWLLiteral) currentValue;
135: }
136:
137: private static void ensureValueIsLiteral(OWLObject currentValue) {
138:• if (!(currentValue instanceof OWLLiteral)) {
139: throw new BindingValueMismatchException("Value " + currentValue + " is not an OWLLiteral.");
140: }
141: }
142:
143: private OWLObject getCurrentValue(int columnIndex) throws OwlapiDriverException {
144: ensureState();
145:• if (!indexesToVariables.containsKey(columnIndex)) {
146: throw new OwlapiDriverException("No result binding found for index " + columnIndex);
147: }
148: final Variable<OWLObject> v = indexesToVariables.get(columnIndex);
149: final GroundTerm<OWLObject> gt = currentRow.get(v);
150:• if (gt == null) {
151: throw new VariableNotBoundException(
152: "Variable at index " + columnIndex + " not bound in the current result row.");
153: }
154: return gt.getWrappedObject();
155: }
156:
157: private void ensureState() {
158: ensureOpen();
159:• if (currentRow == null) {
160: throw new IllegalStateException("Current row is null.");
161: }
162: }
163:
164: @Override
165: public boolean getBoolean(String columnLabel) throws OntoDriverException {
166: return getPrimitiveValue(Boolean.class, columnLabel);
167: }
168:
169: private <T> T getPrimitiveValue(Class<T> cls, String columnLabel) throws OwlapiDriverException {
170: final Object val = OwlapiUtils.owlLiteralToValue(getLiteral(columnLabel));
171: ensureValueIsAssignableToClass(val, cls);
172: return cls.cast(val);
173: }
174:
175: private OWLLiteral getLiteral(String columnLabel) throws OwlapiDriverException {
176: final OWLObject currentValue = getCurrentValue(columnLabel);
177: ensureValueIsLiteral(currentValue);
178: return (OWLLiteral) currentValue;
179: }
180:
181: private OWLObject getCurrentValue(String columnLabel) throws OwlapiDriverException {
182: ensureState();
183:• if (!namesToVariables.containsKey(columnLabel)) {
184: throw new OwlapiDriverException("No result binding found for label " + columnLabel);
185: }
186: final Variable<OWLObject> v = namesToVariables.get(columnLabel);
187: final GroundTerm<OWLObject> gt = currentRow.get(v);
188:• if (gt == null) {
189: throw new VariableNotBoundException(
190: "Variable \"" + columnLabel + "\" not bound in the current result row.");
191: }
192: return gt.getWrappedObject();
193: }
194:
195: @Override
196: public byte getByte(int columnIndex) throws OntoDriverException {
197: final Number num = getPrimitiveValue(Number.class, columnIndex);
198: return num.byteValue();
199: }
200:
201: @Override
202: public byte getByte(String columnLabel) throws OntoDriverException {
203: final Number num = getPrimitiveValue(Number.class, columnLabel);
204: return num.byteValue();
205: }
206:
207: @Override
208: public double getDouble(int columnIndex) throws OntoDriverException {
209: final Number num = getPrimitiveValue(Number.class, columnIndex);
210: return num.doubleValue();
211: }
212:
213: @Override
214: public double getDouble(String columnLabel) throws OntoDriverException {
215: final Number num = getPrimitiveValue(Number.class, columnLabel);
216: return num.doubleValue();
217: }
218:
219: @Override
220: public float getFloat(int columnIndex) throws OntoDriverException {
221: final Number num = getPrimitiveValue(Number.class, columnIndex);
222: return num.floatValue();
223: }
224:
225: @Override
226: public float getFloat(String columnLabel) throws OntoDriverException {
227: final Number num = getPrimitiveValue(Number.class, columnLabel);
228: return num.floatValue();
229: }
230:
231: @Override
232: public int getInt(int columnIndex) throws OntoDriverException {
233: final Number num = getPrimitiveValue(Number.class, columnIndex);
234: return num.intValue();
235: }
236:
237: @Override
238: public int getInt(String columnLabel) throws OntoDriverException {
239: final Number num = getPrimitiveValue(Number.class, columnLabel);
240: return num.intValue();
241: }
242:
243: @Override
244: public long getLong(int columnIndex) throws OntoDriverException {
245: final Number num = getPrimitiveValue(Number.class, columnIndex);
246: return num.longValue();
247: }
248:
249: @Override
250: public long getLong(String columnLabel) throws OntoDriverException {
251: final Number num = getPrimitiveValue(Number.class, columnLabel);
252: return num.longValue();
253: }
254:
255: @Override
256: public Object getObject(int columnIndex) throws OntoDriverException {
257: return owlObjectToObject(getCurrentValue(columnIndex));
258: }
259:
260: private static Object owlObjectToObject(OWLObject owlValue) {
261:• if (owlValue == null) {
262: return null;
263: }
264:• if (owlValue instanceof OWLLiteral) {
265: return OwlapiUtils.owlLiteralToValue((OWLLiteral) owlValue);
266: }
267: final Set<OWLEntity> sig = owlValue.signature().collect(Collectors.toSet());
268:• if (sig.isEmpty()) {
269: return owlValue.toString();
270: } else {
271: return URI.create(sig.iterator().next().toStringID());
272: }
273: }
274:
275: @Override
276: public Object getObject(String columnLabel) throws OntoDriverException {
277: return owlObjectToObject(getCurrentValue(columnLabel));
278: }
279:
280: @Override
281: public <T> T getObject(int columnIndex, Class<T> cls) throws OntoDriverException {
282: Objects.requireNonNull(cls);
283: return owlObjectToType(getCurrentValue(columnIndex), cls);
284: }
285:
286: private static <T> T owlObjectToType(OWLObject owlValue, Class<T> cls) throws OntoDriverException {
287:• if (cls.isAssignableFrom(owlValue.getClass())) {
288: return cls.cast(owlValue);
289: }
290:• if (owlValue instanceof OWLLiteral) {
291: final Object ob = OwlapiUtils.owlLiteralToValue((OWLLiteral) owlValue);
292: return cls.cast(DatatypeTransformer.transform(ob, cls));
293: } else {
294: final Set<OWLEntity> sig = owlValue.signature().collect(Collectors.toSet());
295:• if (!sig.isEmpty()) {
296: final URI uri = URI.create(sig.iterator().next().toStringID());
297: return cls.cast(DatatypeTransformer.transform(uri, cls));
298: }
299: }
300: throw new OwlapiDriverException("Conversion to type " + cls + " is not supported.");
301: }
302:
303: @Override
304: public <T> T getObject(String columnLabel, Class<T> cls) throws OntoDriverException {
305: Objects.requireNonNull(cls, getNPXMessageSupplier("cls"));
306: return owlObjectToType(getCurrentValue(columnLabel), cls);
307: }
308:
309: @Override
310: public int getRowIndex() {
311: return currentIndex;
312: }
313:
314: @Override
315: public short getShort(int columnIndex) throws OntoDriverException {
316: final Number num = getPrimitiveValue(Number.class, columnIndex);
317: return num.shortValue();
318: }
319:
320: @Override
321: public short getShort(String columnLabel) throws OntoDriverException {
322: final Number num = getPrimitiveValue(Number.class, columnLabel);
323: return num.shortValue();
324: }
325:
326: @Override
327: public String getString(int columnIndex) throws OntoDriverException {
328: return owlValueToString(getCurrentValue(columnIndex));
329: }
330:
331: private static String owlValueToString(OWLObject owlValue) {
332:• if (owlValue instanceof OWLLiteral) {
333: return ((OWLLiteral) owlValue).getLiteral();
334: }
335: final Set<OWLEntity> sig = owlValue.signature().collect(Collectors.toSet());
336:• if (sig.isEmpty()) {
337: return owlValue.toString();
338: } else {
339: return sig.iterator().next().toStringID();
340: }
341: }
342:
343: @Override
344: public String getString(String columnLabel) throws OntoDriverException {
345: return owlValueToString(getCurrentValue(columnLabel));
346: }
347:
348: @Override
349: public boolean isFirst() {
350: ensureOpen();
351:• return currentIndex == 0;
352: }
353:
354: @Override
355: public boolean hasNext() {
356: ensureOpen();
357: return iterator.hasNext();
358: }
359:
360: @Override
361: public void last() {
362: ensureOpen();
363:• while (hasNext()) {
364: next();
365: }
366: }
367:
368: @Override
369: public void next() {
370: ensureOpen();
371:• if (!hasNext()) {
372: throw new NoSuchElementException("The result set has no more rows.");
373: }
374: this.currentRow = iterator.next();
375: currentIndex++;
376: }
377:
378: @Override
379: public void previous() {
380: ensureOpen();
381: relative(-1);
382: }
383:
384: @Override
385: public void relative(int rows) {
386: ensureOpen();
387: setRowIndex(currentIndex + rows);
388: }
389:
390: @Override
391: public void setRowIndex(int rowIndex) {
392: ensureOpen();
393:• if (rowIndex == currentIndex) {
394: return;
395: }
396:• if (rowIndex < 0) {
397: throw new IllegalArgumentException("Cannot set row index to a number less than 0.");
398: }
399:• if (rowIndex < currentIndex) {
400: first();
401: }
402:• while (rowIndex > currentIndex && hasNext()) {
403: next();
404: }
405: }
406: }