You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jena.apache.org by "Andy Seaborne (Jira)" <ji...@apache.org> on 2021/09/11 14:04:00 UTC
[jira] [Resolved] (JENA-2154) Custom SERVICE executors
[ https://issues.apache.org/jira/browse/JENA-2154?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andy Seaborne resolved JENA-2154.
---------------------------------
Fix Version/s: Jena 4.2.0
Assignee: Andy Seaborne
Resolution: Done
> Custom SERVICE executors
> ------------------------
>
> Key: JENA-2154
> URL: https://issues.apache.org/jira/browse/JENA-2154
> Project: Apache Jena
> Issue Type: New Feature
> Components: ARQ
> Affects Versions: Jena 4.1.0
> Reporter: Claus Stadler
> Assignee: Andy Seaborne
> Priority: Major
> Fix For: Jena 4.2.0
>
>
> While Jena features many extension points for SPARQL query processing, such as for custom functions and property functions, there is no dedicated extension point for custom SERVICE executors.
> The relevant classes are OpExecutor and QueryIterService:
> While it is possible to configure a custom OpExecutor's in a Context which provides SERVICE extensions, it is not possible to combine the functionality of two different OpExecutors.
> Concrete use case: The following two projects use their own OpExecutor implementation for providing service extensions:
> * [RDF Processing Toolkit|https://github.com/SmartDataAnalytics/RdfProcessingToolkit/tree/develop/doc#federating-to-sorted-bzip2-encoded-n-triples] supports a service executor for doing binary search over remote sorted (bzip2 encoded) ntriples files
> * [SPARQL Anything|https://github.com/SPARQL-Anything/sparql.anything] provides service extensions for ingesting non-RDF data as RDF
> Proposed solution:
> * Introduce a ServiceExecutorFactory that serves as the extension point for supplying custom QueryIterators if the request can be handled
> {code:java}
> public interface ServiceExecutorFactory {
> Supplier<QueryIterator> createExecutor(OpService op, Binding binding, ExecutionContext context);
> }
> {code}
> * Introduce a Symbol for referring to a List<ServiceExecutorFactory> in the Context
> * Extend QueryIterService such that it consults the Context for custom ServiceExecutorFactories - and invokes the first match from the list before falling back to the standard implementation.
> * Example usage:
> {code:java}
> try (QueryExecution qe = QueryExecutionFactory.create(...)) {
> qe.getContext().put(ARQ.customServiceExecutors,
> Arrays.asList(/* ServiceExecutorFactories */));
> }
> {code}
>
> This way, SERVICE extensions do not require custom OpExecutor implementations (because it would be handled by QueryIterService) - and conversely, such extensions would also work with any custom OpExecutor that yields the original QueryIterService implementation.
>
> I could provide my [implementation|https://github.com/SmartDataAnalytics/jena-sparql-api/tree/develop/jena-sparql-api-arq-parent/jena-sparql-api-arq-core/src/main/java/org/aksw/jena_sparql_api/arq/core/service] as a PR.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)