Class RepositoryFederatedService
- java.lang.Object
-
- org.eclipse.rdf4j.repository.sparql.federation.RepositoryFederatedService
-
- All Implemented Interfaces:
FederatedService
- Direct Known Subclasses:
RepositoryFederatedService
,SPARQLFederatedService
public class RepositoryFederatedService extends java.lang.Object implements FederatedService
Federated Service wrapping theRepository
to communicate with a SPARQL endpoint.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private class
RepositoryFederatedService.BatchingServiceIteration
A convenience iteration for SERVICE expression which evaluates intermediate results in batches and manages all results.private static class
RepositoryFederatedService.CloseConnectionIteration
Wrapper iteration which closes aRepositoryConnection
uponRepositoryFederatedService.CloseConnectionIteration.close()
private class
RepositoryFederatedService.FallbackServiceIteration
Helper iteration to evaluate a block ofBindingSet
s using the simpleselect(Service, Set, BindingSet, String)
routine.
-
Field Summary
Fields Modifier and Type Field Description protected int
boundJoinBlockSize
The number of bindings sent in a single subquery inevaluate(Service, CloseableIteration, String)
If blockSize is set to 0, the entire input stream is used as block input the block size effectively determines the number of remote requests(package private) static org.slf4j.Logger
logger
private RepositoryConnection
managedConn
private Repository
rep
private static java.lang.String
ROW_IDX_VAR
protected boolean
shutDown
private boolean
useFreshConnection
Whether to use a fresh repository connection for individual queries
-
Constructor Summary
Constructors Constructor Description RepositoryFederatedService(Repository repo)
RepositoryFederatedService(Repository repo, boolean shutDown)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
ask(Service service, BindingSet bindings, java.lang.String baseUri)
Evaluate the provided sparqlQueryString at the initializedRepository
of thisFederatedService
.private java.lang.String
buildVALUESClause(java.util.List<BindingSet> bindings, java.util.List<java.lang.String> relevantBindingNames)
Computes the VALUES clause for the set of relevant input bindings.private static void
closeQuietly(RepositoryConnection conn)
CloseableIteration<BindingSet,QueryEvaluationException>
evaluate(Service service, CloseableIteration<BindingSet,QueryEvaluationException> bindings, java.lang.String baseUri)
Evaluate the provided SPARQL query at this federated service, possibilities for vectored evaluation.protected CloseableIteration<BindingSet,QueryEvaluationException>
evaluateInternal(Service service, CloseableIteration<BindingSet,QueryEvaluationException> bindings, java.lang.String baseUri)
Evaluate the SPARQL query that can be constructed from the SERVICE node at the initializedRepository
of thisFederatedService
.private CloseableIteration<BindingSet,QueryEvaluationException>
evaluateInternalFallback(Service service, java.util.List<BindingSet> allBindings, java.lang.String baseUri)
Evaluate the service expression for the given lists of bindings usingRepositoryFederatedService.FallbackServiceIteration
, i.e.private RepositoryConnection
freshConnection()
Return a freshRepositoryConnection
from the configured repository.int
getBoundJoinBlockSize()
protected RepositoryConnection
getConnection()
Retrieve a (re-usable) connection.private java.util.List<java.lang.String>
getRelevantBindingNames(java.util.List<BindingSet> bindings, java.util.Set<java.lang.String> serviceVars)
Compute the relevant binding names using the variables occurring in the service expression and the input bindings.void
initialize()
Method to perform any initializations, invoked after construction.protected java.lang.String
insertValuesClause(java.lang.String queryString, java.lang.String valuesClause)
Insert the constructed VALUES clause in the beginning of the WHERE block.boolean
isInitialized()
Method to check ifFederatedService.initialize()
had been called.CloseableIteration<BindingSet,QueryEvaluationException>
select(Service service, java.util.Set<java.lang.String> projectionVars, BindingSet bindings, java.lang.String baseUri)
Evaluate the provided sparqlQueryString at the initializedRepository
of thisFederatedService
.void
setBoundJoinBlockSize(int boundJoinBlockSize)
void
setUseFreshConnection(boolean flag)
void
shutdown()
Method to perform any shutDown code, invoked at unregistering.
-
-
-
Field Detail
-
ROW_IDX_VAR
private static final java.lang.String ROW_IDX_VAR
- See Also:
- Constant Field Values
-
logger
static final org.slf4j.Logger logger
-
rep
private final Repository rep
-
boundJoinBlockSize
protected int boundJoinBlockSize
The number of bindings sent in a single subquery inevaluate(Service, CloseableIteration, String)
If blockSize is set to 0, the entire input stream is used as block input the block size effectively determines the number of remote requests
-
useFreshConnection
private boolean useFreshConnection
Whether to use a fresh repository connection for individual queries
-
shutDown
protected boolean shutDown
-
managedConn
private RepositoryConnection managedConn
-
-
Constructor Detail
-
RepositoryFederatedService
public RepositoryFederatedService(Repository repo)
- Parameters:
repo
- the repository to be used
-
RepositoryFederatedService
public RepositoryFederatedService(Repository repo, boolean shutDown)
- Parameters:
repo
- the repository to be usedshutDown
- a flag indicating whether the repository shall be closed inshutdown()
-
-
Method Detail
-
select
public CloseableIteration<BindingSet,QueryEvaluationException> select(Service service, java.util.Set<java.lang.String> projectionVars, BindingSet bindings, java.lang.String baseUri) throws QueryEvaluationException
Evaluate the provided sparqlQueryString at the initializedRepository
of thisFederatedService
. Insert bindings into SELECT query and evaluate- Specified by:
select
in interfaceFederatedService
- Parameters:
service
- the reference to the service node, contains additional meta information (vars, prefixes)projectionVars
- The variables with unknown value that should be projected from this evaluationbindings
- the bindings serving as additional constraints- Returns:
- an iteration over the results of the query
- Throws:
QueryEvaluationException
- If there was an exception generated while evaluating the query.
-
ask
public boolean ask(Service service, BindingSet bindings, java.lang.String baseUri) throws QueryEvaluationException
Evaluate the provided sparqlQueryString at the initializedRepository
of thisFederatedService
. Insert bindings, send ask query and return final result- Specified by:
ask
in interfaceFederatedService
- Parameters:
service
- the reference to the service node, contains additional meta information (vars, prefixes)bindings
- the bindings serving as additional constraints- Returns:
true
if at least one result exists- Throws:
QueryEvaluationException
- If there was an exception generated while evaluating the query.
-
evaluate
public CloseableIteration<BindingSet,QueryEvaluationException> evaluate(Service service, CloseableIteration<BindingSet,QueryEvaluationException> bindings, java.lang.String baseUri) throws QueryEvaluationException
Description copied from interface:FederatedService
Evaluate the provided SPARQL query at this federated service, possibilities for vectored evaluation.Contracts:
- The original bindings need to be inserted into the result
- SILENT service must be dealt with in the method
Compare
SPARQLFederatedService
for a reference implementation- Specified by:
evaluate
in interfaceFederatedService
- Parameters:
service
- the reference to the service node, contains information to construct the querybindings
- the bindings serving as additional constraints (for vectored evaluation)baseUri
- the baseUri- Returns:
- the result of evaluating the query using bindings as constraints, the original bindings need to be inserted into the results!
- Throws:
QueryEvaluationException
- If there was an exception generated while evaluating the query.
-
evaluateInternal
protected CloseableIteration<BindingSet,QueryEvaluationException> evaluateInternal(Service service, CloseableIteration<BindingSet,QueryEvaluationException> bindings, java.lang.String baseUri) throws QueryEvaluationException
Evaluate the SPARQL query that can be constructed from the SERVICE node at the initializedRepository
of thisFederatedService
. Use specified bindings as constraints to the query. Try to evaluate using VALUES clause, if this yields an exception fall back to the naive implementation. This method deals with SILENT SERVICEs.- Throws:
QueryEvaluationException
-
evaluateInternalFallback
private CloseableIteration<BindingSet,QueryEvaluationException> evaluateInternalFallback(Service service, java.util.List<BindingSet> allBindings, java.lang.String baseUri)
Evaluate the service expression for the given lists of bindings usingRepositoryFederatedService.FallbackServiceIteration
, i.e. basically as a simple join without VALUES clause.- Parameters:
service
- the SERVICEallBindings
- all bindings to be processedbaseUri
- the base URI- Returns:
- resulting iteration
-
insertValuesClause
protected java.lang.String insertValuesClause(java.lang.String queryString, java.lang.String valuesClause)
Insert the constructed VALUES clause in the beginning of the WHERE block. Also adds theROW_IDX_VAR
projection if it is not already present.- Parameters:
queryString
- the SELECT query string from the SERVICE nodevaluesClause
- the constructed VALUES clause- Returns:
- the final String
-
initialize
public void initialize() throws QueryEvaluationException
Description copied from interface:FederatedService
Method to perform any initializations, invoked after construction.- Specified by:
initialize
in interfaceFederatedService
- Throws:
QueryEvaluationException
- If there was an exception generated while initializing the service.
-
isInitialized
public boolean isInitialized()
Description copied from interface:FederatedService
Method to check ifFederatedService.initialize()
had been called.- Specified by:
isInitialized
in interfaceFederatedService
-
getBoundJoinBlockSize
public int getBoundJoinBlockSize()
-
setBoundJoinBlockSize
public void setBoundJoinBlockSize(int boundJoinBlockSize)
- Parameters:
boundJoinBlockSize
- the bound join block size, 0 to evaluate all in a single request
-
setUseFreshConnection
public void setUseFreshConnection(boolean flag)
- Parameters:
flag
- whether to use a freshRepositoryConnection
for each individual query
-
shutdown
public void shutdown() throws QueryEvaluationException
Description copied from interface:FederatedService
Method to perform any shutDown code, invoked at unregistering.- Specified by:
shutdown
in interfaceFederatedService
- Throws:
QueryEvaluationException
- If there was an exception generated while shutting down the service.
-
freshConnection
private RepositoryConnection freshConnection() throws RepositoryException
Return a freshRepositoryConnection
from the configured repository.- Returns:
- connection
- Throws:
RepositoryException
-
getConnection
protected RepositoryConnection getConnection() throws RepositoryException
Retrieve a (re-usable) connection. If it is not yet created, open a fresh connection. Note that this connection is closed automatically when shutting this service.- Returns:
- connection
- Throws:
RepositoryException
-
getRelevantBindingNames
private java.util.List<java.lang.String> getRelevantBindingNames(java.util.List<BindingSet> bindings, java.util.Set<java.lang.String> serviceVars)
Compute the relevant binding names using the variables occurring in the service expression and the input bindings. The idea is find all variables which need to be projected in the subquery, i.e. those that will not be bound by an input binding.If the resulting list is empty, the cross product needs to be formed.
- Parameters:
bindings
-serviceVars
-- Returns:
- the list of relevant bindings (if empty: the cross product needs to be formed)
-
buildVALUESClause
private java.lang.String buildVALUESClause(java.util.List<BindingSet> bindings, java.util.List<java.lang.String> relevantBindingNames) throws QueryEvaluationException
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.- Parameters:
bindings
-relevantBindingNames
-- Returns:
- a string with the VALUES clause for the given set of relevant input bindings
- Throws:
QueryEvaluationException
-
closeQuietly
private static void closeQuietly(RepositoryConnection conn)
-
-