use of org.eclipse.rdf4j.query.BindingSet in project rdf4j by eclipse.
the class MutableTupleQueryResult method previous.
public BindingSet previous() {
if (hasPrevious()) {
BindingSet result = bindingSets.get(currentIndex - 1);
currentIndex--;
lastReturned = currentIndex;
return result;
}
throw new NoSuchElementException();
}
use of org.eclipse.rdf4j.query.BindingSet in project rdf4j by eclipse.
the class AbstractHTTPUpdate method getBindingsArray.
public Binding[] getBindingsArray() {
BindingSet bindings = this.getBindings();
Binding[] bindingsArray = new Binding[bindings.size()];
Iterator<Binding> iter = bindings.iterator();
for (int i = 0; i < bindings.size(); i++) {
bindingsArray[i] = iter.next();
}
return bindingsArray;
}
use of org.eclipse.rdf4j.query.BindingSet in project rdf4j by eclipse.
the class RepositoryFederatedService method evaluateInternal.
/**
* Evaluate the SPARQL query that can be constructed from the SERVICE node at the initialized
* {@link Repository} of this {@link FederatedService}. Use specified bindings as constraints to the
* query. Try to evaluate using BINDINGS clause, if this yields an exception fall back to the naive
* implementation. This method deals with SILENT SERVICEs.
*/
protected CloseableIteration<BindingSet, QueryEvaluationException> evaluateInternal(Service service, CloseableIteration<BindingSet, QueryEvaluationException> bindings, String baseUri) throws QueryEvaluationException {
// materialize all bindings (to allow for fallback in case of errors)
// note that this may be blocking depending on the underlying iterator
List<BindingSet> allBindings = new LinkedList<BindingSet>();
while (bindings.hasNext()) {
allBindings.add(bindings.next());
}
if (allBindings.size() == 0) {
return new EmptyIteration<BindingSet, QueryEvaluationException>();
}
// projection vars
Set<String> projectionVars = new HashSet<String>(service.getServiceVars());
projectionVars.removeAll(allBindings.get(0).getBindingNames());
// below we need to take care for SILENT services
CloseableIteration<BindingSet, QueryEvaluationException> result = null;
try {
// fallback to simple evaluation (just a single binding)
if (allBindings.size() == 1) {
result = select(service, projectionVars, allBindings.get(0), baseUri);
result = service.isSilent() ? new SilentIteration(result) : result;
return result;
}
// To be able to insert the input bindings again later on, we need some
// means to identify the row of each binding. hence, we use an
// additional
// projection variable, which is also passed in the BINDINGS clause
// with the value of the actual row. The value corresponds to the index
// of the binding in the index list
projectionVars.add("__rowIdx");
String queryString = service.getSelectQueryString(projectionVars);
List<String> relevantBindingNames = getRelevantBindingNames(allBindings, service.getServiceVars());
if (relevantBindingNames.size() != 0) {
// append the VALUES clause to the query
queryString += buildVALUESClause(allBindings, relevantBindingNames);
}
TupleQuery query = getConnection().prepareTupleQuery(QueryLanguage.SPARQL, queryString, baseUri);
TupleQueryResult res = null;
// TODO how to retrieve max query value
query.setMaxQueryTime(60);
// from actual setting?
res = query.evaluate();
if (relevantBindingNames.size() == 0)
// cross
result = new SPARQLCrossProductIteration(res, allBindings);
else
// product
// common
result = new ServiceJoinConversionIteration(res, allBindings);
// join
result = service.isSilent() ? new SilentIteration(result) : result;
return result;
} catch (RepositoryException e) {
Iterations.closeCloseable(result);
if (service.isSilent())
return new CollectionIteration<BindingSet, QueryEvaluationException>(allBindings);
throw new QueryEvaluationException("Repository for endpoint " + rep.toString() + " could not be initialized.", e);
} catch (MalformedQueryException e) {
// this exception must not be silenced, bug in our code
throw new QueryEvaluationException(e);
} catch (QueryEvaluationException e) {
Iterations.closeCloseable(result);
if (service.isSilent())
return new CollectionIteration<BindingSet, QueryEvaluationException>(allBindings);
throw e;
} catch (RuntimeException e) {
Iterations.closeCloseable(result);
// QueryEval) if silent
if (service.isSilent())
return new CollectionIteration<BindingSet, QueryEvaluationException>(allBindings);
throw e;
}
}
use of org.eclipse.rdf4j.query.BindingSet in project rdf4j by eclipse.
the class RepositoryFederatedService method buildVALUESClause.
/**
* Computes the VALUES clause for the set of relevant input bindings. The VALUES clause is attached to a
* subquery for block-nested-loop evaluation. Implementation note: we use a special binding to mark the
* rowIndex of the input binding.
*
* @param bindings
* @param relevantBindingNames
* @return a string with the VALUES clause for the given set of relevant input bindings
* @throws QueryEvaluationException
*/
private String buildVALUESClause(List<BindingSet> bindings, List<String> relevantBindingNames) throws QueryEvaluationException {
StringBuilder sb = new StringBuilder();
// __rowIdx: see comment in evaluate()
sb.append(" VALUES (?__rowIdx");
for (String bName : relevantBindingNames) {
sb.append(" ?").append(bName);
}
sb.append(") { ");
int rowIdx = 0;
for (BindingSet b : bindings) {
sb.append(" (");
// identification of
sb.append("\"").append(rowIdx++).append("\" ");
// processing
for (String bName : relevantBindingNames) {
QueryStringUtil.appendValueAsString(sb, b.getValue(bName)).append(" ");
}
sb.append(")");
}
sb.append(" }");
return sb.toString();
}
use of org.eclipse.rdf4j.query.BindingSet in project rdf4j by eclipse.
the class HTTPRepository method isWritable.
@Override
public boolean isWritable() throws RepositoryException {
if (!isInitialized()) {
throw new IllegalStateException("HTTPRepository not initialized.");
}
boolean isWritable = false;
try (RDF4JProtocolSession client = createHTTPClient()) {
final String repositoryURL = client.getRepositoryURL();
final TupleQueryResult repositoryList = client.getRepositoryList();
try {
while (repositoryList.hasNext()) {
final BindingSet bindingSet = repositoryList.next();
final Value uri = bindingSet.getValue("uri");
if (uri != null && uri.stringValue().equals(repositoryURL)) {
isWritable = Literals.getBooleanValue(bindingSet.getValue("writable"), false);
break;
}
}
} finally {
repositoryList.close();
}
} catch (QueryEvaluationException e) {
throw new RepositoryException(e);
} catch (IOException e) {
throw new RepositoryException(e);
}
return isWritable;
}
Aggregations