Package: SparqlQueryHolder
SparqlQueryHolder
name | instruction | branch | complexity | line | method | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SparqlQueryHolder(String, List, List) |
|
|
|
|
|
||||||||||||||||||||
assembleQuery() |
|
|
|
|
|
||||||||||||||||||||
assembleValuesClause(Set) |
|
|
|
|
|
||||||||||||||||||||
clearParameter(Parameter) |
|
|
|
|
|
||||||||||||||||||||
clearParameters() |
|
|
|
|
|
||||||||||||||||||||
getFirstResult() |
|
|
|
|
|
||||||||||||||||||||
getInternalParameter(Parameter) |
|
|
|
|
|
||||||||||||||||||||
getMaxResults() |
|
|
|
|
|
||||||||||||||||||||
getParameter(String) |
|
|
|
|
|
||||||||||||||||||||
getParameter(int) |
|
|
|
|
|
||||||||||||||||||||
getParameterValue(Parameter) |
|
|
|
|
|
||||||||||||||||||||
getParameters() |
|
|
|
|
|
||||||||||||||||||||
getQuery() |
|
|
|
|
|
||||||||||||||||||||
hasParameter(String) |
|
|
|
|
|
||||||||||||||||||||
hasParameter(int) |
|
|
|
|
|
||||||||||||||||||||
lambda$new$0(QueryParameter) |
|
|
|
|
|
||||||||||||||||||||
lambda$new$1(QueryParameter) |
|
|
|
|
|
||||||||||||||||||||
setFirstResult(int) |
|
|
|
|
|
||||||||||||||||||||
setMaxResults(int) |
|
|
|
|
|
||||||||||||||||||||
setParameter(Parameter, Object) |
|
|
|
|
|
||||||||||||||||||||
setParameter(Parameter, String, String) |
|
|
|
|
|
||||||||||||||||||||
setUntypedParameter(Parameter, Object) |
|
|
|
|
|
||||||||||||||||||||
static {...} |
|
|
|
|
|
||||||||||||||||||||
toString() |
|
|
|
|
|
||||||||||||||||||||
unknownParameter(Object) |
|
|
|
|
|
Coverage
1: /*
2: * JOPA
3: * Copyright (C) 2023 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.jopa.query.sparql;
19:
20: import cz.cvut.kbss.jopa.model.query.Parameter;
21: import cz.cvut.kbss.jopa.query.QueryHolder;
22: import cz.cvut.kbss.jopa.query.QueryParameter;
23:
24: import java.util.*;
25:
26: public class SparqlQueryHolder implements QueryHolder {
27:
28: private static final String SPARQL_LIMIT = " LIMIT ";
29: private static final String SPARQL_OFFSET = " OFFSET ";
30:
31: // Original query string
32: private final String query;
33:
34: private final Map<Parameter<?>, QueryParameter<?>> parameterSet;
35: private final Map<Object, QueryParameter<?>> identifiersToParameters;
36: // These parameters are in order matching the query parts and can appear multiple times in the list
37: private final List<QueryParameter<?>> parameters;
38: private final List<String> queryParts;
39:
40: private int offset = 0;
41:
42: private int limit = Integer.MAX_VALUE;
43:
44: public SparqlQueryHolder(String query, List<String> parts, List<QueryParameter<?>> parameters) {
45: this.query = query;
46: this.parameters = parameters;
47: this.queryParts = parts;
48: this.parameterSet = new HashMap<>();
49: parameters.forEach(p -> parameterSet.put(p, p));
50: this.identifiersToParameters = new HashMap<>(parameterSet.size());
51: parameterSet.values().forEach(p -> identifiersToParameters.put(p.getIdentifier(), p));
52: }
53:
54: @Override
55: public String getQuery() {
56: return query;
57: }
58:
59: @Override
60: public Set<Parameter<?>> getParameters() {
61: return Collections.unmodifiableSet(parameterSet.keySet());
62: }
63:
64: @Override
65: public boolean hasParameter(String name) {
66: return identifiersToParameters.containsKey(name);
67: }
68:
69: @Override
70: public boolean hasParameter(int position) {
71: return identifiersToParameters.containsKey(position);
72: }
73:
74: @Override
75: public QueryParameter<?> getParameter(String name) {
76:• if (!hasParameter(name)) {
77: throw unknownParameter(name);
78: }
79: return identifiersToParameters.get(name);
80: }
81:
82: private static IllegalArgumentException unknownParameter(Object p) {
83: return new IllegalArgumentException("Parameter '" + p + "' does not exist in this query.");
84: }
85:
86: @Override
87: public Parameter<?> getParameter(int position) {
88:• if (!hasParameter(position)) {
89: throw unknownParameter(position);
90: }
91: return identifiersToParameters.get(position);
92: }
93:
94: @Override
95: public Object getParameterValue(Parameter<?> parameter) {
96:• assert getInternalParameter(parameter).getValue() != null;
97: return getInternalParameter(parameter).getValue().getValue();
98: }
99:
100: private QueryParameter<?> getInternalParameter(Parameter<?> p) {
101: Objects.requireNonNull(p);
102:• if (!parameterSet.containsKey(p)) {
103: throw unknownParameter(p);
104: }
105: return parameterSet.get(p);
106: }
107:
108: @Override
109: public <T> void setParameter(Parameter<T> parameter, Object value) {
110: Objects.requireNonNull(value);
111: getInternalParameter(parameter).setValue(value);
112: }
113:
114: @Override
115: public <T> void setParameter(Parameter<T> parameter, String value, String language) {
116: Objects.requireNonNull(value);
117: getInternalParameter(parameter).setValue(value, language);
118: }
119:
120: @Override
121: public <T> void setUntypedParameter(Parameter<T> parameter, Object value) {
122: Objects.requireNonNull(value);
123: getInternalParameter(parameter).setUntypedValue(value);
124: }
125:
126: @Override
127: public void setFirstResult(int startPosition) {
128: this.offset = startPosition;
129: }
130:
131: @Override
132: public int getFirstResult() {
133: return offset;
134: }
135:
136: @Override
137: public void setMaxResults(int maxResults) {
138: this.limit = maxResults;
139: }
140:
141: @Override
142: public int getMaxResults() {
143: return limit;
144: }
145:
146: @Override
147: public void clearParameter(Parameter<?> parameter) {
148: getInternalParameter(parameter).resetValue();
149: }
150:
151: @Override
152: public void clearParameters() {
153: parameterSet.values().forEach(QueryParameter::resetValue);
154: }
155:
156: @Override
157: public String assembleQuery() {
158: final StringBuilder sb = new StringBuilder();
159: final Set<QueryParameter<?>> projectedParams = new LinkedHashSet<>();
160:• for (int i = 0; i < parameters.size(); i++) {
161: sb.append(queryParts.get(i));
162: final QueryParameter<?> qp = parameters.get(i);
163:• if (qp.isProjected() && qp.getValue().isSet()) {
164: projectedParams.add(qp);
165: sb.append(qp.getIdentifierAsQueryString());
166: } else {
167: sb.append(qp.getValue().getQueryString());
168: }
169: }
170:• if (queryParts.size() > parameters.size()) {
171: sb.append(queryParts.get(parameters.size()));
172: }
173:• if (limit != Integer.MAX_VALUE) {
174: sb.append(SPARQL_LIMIT).append(limit);
175: }
176:• if (offset != 0) {
177: sb.append(SPARQL_OFFSET).append(offset);
178: }
179: assembleValuesClause(projectedParams).ifPresent(sb::append);
180: return sb.toString();
181: }
182:
183: /**
184: * Generates a VALUES clause for query parameters that are set and appear in SELECT projection.
185: * <p>
186: * TODO Note that the current implementation does not support collection-valued parameters.
187: *
188: * @param parameters Projected parameters to output into query as VALUES clause
189: * @return VALUES clause, if there were any set parameters
190: */
191: private static Optional<String> assembleValuesClause(Set<QueryParameter<?>> parameters) {
192:• if (parameters.isEmpty()) {
193: return Optional.empty();
194: }
195: final StringBuilder variables = new StringBuilder();
196: final StringBuilder data = new StringBuilder();
197:• for (QueryParameter<?> qp : parameters) {
198:• if (variables.length() > 0) {
199: variables.append(' ');
200: }
201: variables.append(qp.getIdentifierAsQueryString());
202: data.append('(').append(qp.getValue().getQueryString()).append(')');
203: }
204: return Optional.of(" VALUES (" + variables + ") {" + data + "}");
205: }
206:
207: @Override
208: public String toString() {
209: return assembleQuery();
210: }
211: }