[ 
https://issues.apache.org/jira/browse/JENA-2154?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17413536#comment-17413536
 ] 

ASF subversion and git services commented on JENA-2154:
-------------------------------------------------------

Commit 7f63917be2df1e168fee3045fbfb676335a88099 in jena's branch 
refs/heads/main from Andy Seaborne
[ https://gitbox.apache.org/repos/asf?p=jena.git;h=7f63917 ]

Merge pull request #1070 from afs/service

JENA-2154: Custom SERVICE executors (additional)

> 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
>            Priority: Major
>
> 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)

Reply via email to