Difference between revisions of "Job Module"
Jump to navigation
Jump to search
m (moved Async Module to Jobs Module) |
|||
| Line 1: | Line 1: | ||
| − | This [[Module Library|XQuery Module]] provides functions for | + | This [[Module Library|XQuery Module]] provides functions for organizing running commands and queries (mor to come). |
=Conventions= | =Conventions= | ||
| − | All functions in this module are assigned to the <code><nowiki>http://basex.org/modules/ | + | All functions in this module are assigned to the <code><nowiki>http://basex.org/modules/jobs</nowiki></code> namespace, which is statically bound to the {{Code|jobs}} prefix. Errors will be bound to the same prefix. |
=Asynchronous Execution= | =Asynchronous Execution= | ||
| Line 9: | Line 9: | ||
Asynchronous query execution is recommendable if a client does not, or cannot, wait until a request is fully processed. This is e. g. the case with web browsers, which will usually cancel a request after a specific timeout. In such cases, you can use asynchronous execution to trigger another server-side process, which will start the time-consuming process, and fetch the result later on as soon as it is available. | Asynchronous query execution is recommendable if a client does not, or cannot, wait until a request is fully processed. This is e. g. the case with web browsers, which will usually cancel a request after a specific timeout. In such cases, you can use asynchronous execution to trigger another server-side process, which will start the time-consuming process, and fetch the result later on as soon as it is available. | ||
| − | == | + | ==jobs:eval== |
{| width='100%' | {| width='100%' | ||
|- | |- | ||
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
| − | |{{Func| | + | |{{Func|jobs:eval|$query as xs:string|xs:string}}<br />{{Func|jobs:eval|$query as xs:string, $bindings as map(*)|xs:string}}<br />{{Func|jobs:eval|$query as xs:string, $bindings as map(*), $options as map(xs:string, xs:string)|xs:string}}<br /> |
|- | |- | ||
| '''Summary''' | | '''Summary''' | ||
| − | |Prepares the supplied {{Code|$query}} string for asynchronous execution and returns a query id. The query will be queued as described in the article on [[Transaction Management]], and the result will be cached in main-memory until it is fetched via [[# | + | |Prepares the supplied {{Code|$query}} string for asynchronous execution and returns a query id. The query will be queued as described in the article on [[Transaction Management]], and the result will be cached in main-memory until it is fetched via [[#jobs:result|jobs:result]], or until {{Option|ASYNCTIMEOUT}} is exceeded. Queries may be updating.<br/>Variables and context items can be declared via {{Code|$bindings}} (see [[XQuery Module#xquery:eval|xquery:eval]] for more details). The {{Code|$options}} parameter contains evaluation options: |
* {{Code|cache}}: indicates if the query result will be cached or ignored (default: <code>true</code>). If the query result will not be cached, the query id will immediately be discarded after query execution, too. | * {{Code|cache}}: indicates if the query result will be cached or ignored (default: <code>true</code>). If the query result will not be cached, the query id will immediately be discarded after query execution, too. | ||
* {{Code|base-uri}}: set [https://www.w3.org/TR/xquery-31/#dt-static-base-uri base-uri property] for the query. This URI will be used when resolving relative URIs by functions such as {{Code|fn:doc}} (default: ''empty string''). | * {{Code|base-uri}}: set [https://www.w3.org/TR/xquery-31/#dt-static-base-uri base-uri property] for the query. This URI will be used when resolving relative URIs by functions such as {{Code|fn:doc}} (default: ''empty string''). | ||
| Line 26: | Line 26: | ||
| '''Examples''' | | '''Examples''' | ||
| | | | ||
| − | * {{Code| | + | * {{Code|jobs:eval("1+3")}} returns a query id, e.g. {{Code|Query-abc}}. The result can be retrieved via a second query in the same BaseX context: {{Code|jobs:result("Query-abc")}}<br /> |
* The following [[RESTXQ]] function will return the id of the query thread, which evaluates the query that has been specified in the body of a POST request: | * The following [[RESTXQ]] function will return the id of the query thread, which evaluates the query that has been specified in the body of a POST request: | ||
<pre class='brush:xquery'> | <pre class='brush:xquery'> | ||
declare %rest:POST("{$query}") %rest:path('/eval') function local:eval($query) { | declare %rest:POST("{$query}") %rest:path('/eval') function local:eval($query) { | ||
| − | + | jobs:eval($query) | |
}; | }; | ||
</pre> | </pre> | ||
|} | |} | ||
| − | == | + | ==jobs:result== |
{| width='100%' | {| width='100%' | ||
|- | |- | ||
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
| − | |{{Func| | + | |{{Func|jobs:result|$id as xs:string|item()*}} |
|- | |- | ||
| '''Summary''' | | '''Summary''' | ||
| Line 48: | Line 48: | ||
|- | |- | ||
| '''Errors''' | | '''Errors''' | ||
| − | |{{Error| | + | |{{Error|running|#Errors}} the query is still running.<br/>{{Error|unknown|#Errors}} the supplied query id is unknown: The query result may already have been retrieved, or query execution may have been stopped.<br/> |
|- | |- | ||
| '''Examples''' | | '''Examples''' | ||
| Line 55: | Line 55: | ||
<pre class='brush:xquery'> | <pre class='brush:xquery'> | ||
declare %rest:path('/result/{$id}') function local:result($id) { | declare %rest:path('/result/{$id}') function local:result($id) { | ||
| − | + | jobs:result($id) | |
}; | }; | ||
</pre> | </pre> | ||
* The following query demonstrates how the results of an asynchronously executed query can be returned in a single query. Please remember that this is not the common way how these functions are used in practice: | * The following query demonstrates how the results of an asynchronously executed query can be returned in a single query. Please remember that this is not the common way how these functions are used in practice: | ||
<pre class='brush:xquery'> | <pre class='brush:xquery'> | ||
| − | let $query := | + | let $query := jobs:eval('(1 to 10000000)[. = 1]') |
return ( | return ( | ||
hof:until( | hof:until( | ||
| − | function($result) { | + | function($result) { jobs:finished($query) }, |
function($curr) { prof:sleep(10) }, | function($curr) { prof:sleep(10) }, | ||
() | () | ||
), | ), | ||
| − | + | jobs:result($query) | |
) | ) | ||
</pre> | </pre> | ||
|} | |} | ||
| − | == | + | ==jobs:finished== |
{| width='100%' | {| width='100%' | ||
|- | |- | ||
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
| − | |{{Func| | + | |{{Func|jobs:finished|$id as xs:string|xs:boolean}} |
|- | |- | ||
| '''Summary''' | | '''Summary''' | ||
| Line 86: | Line 86: | ||
|} | |} | ||
| − | == | + | ==jobs:stop== |
{| width='100%' | {| width='100%' | ||
|- | |- | ||
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
| − | |{{Func| | + | |{{Func|jobs:stop|$id as xs:string|empty-sequence()}} |
|- | |- | ||
| '''Summary''' | | '''Summary''' | ||
| Line 100: | Line 100: | ||
|} | |} | ||
| − | == | + | ==jobs:ids== |
{| width='100%' | {| width='100%' | ||
|- | |- | ||
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
| − | |{{Func| | + | |{{Func|jobs:ids||xs:string*}} |
|- | |- | ||
| '''Summary''' | | '''Summary''' | ||
| Line 112: | Line 112: | ||
| '''Examples''' | | '''Examples''' | ||
| | | | ||
| − | * <code> | + | * <code>jobs:ids() ! jobs:stop(.)</code> stops and invalidates all asynchronous queries and results. |
|} | |} | ||
| Line 120: | Line 120: | ||
! width="110"|Code | ! width="110"|Code | ||
|Description | |Description | ||
| − | |||
| − | |||
| − | |||
|- | |- | ||
|{{Code|unknown}} | |{{Code|unknown}} | ||
| The supplied query id is unknown or not available anymore. | | The supplied query id is unknown or not available anymore. | ||
|- | |- | ||
| − | |{{Code| | + | |{{Code|running}} |
| A query is still running. | | A query is still running. | ||
|- | |- | ||
Revision as of 11:46, 26 June 2016
This XQuery Module provides functions for organizing running commands and queries (mor to come).
Contents
Conventions
All functions in this module are assigned to the http://basex.org/modules/jobs namespace, which is statically bound to the jobs prefix. Errors will be bound to the same prefix.
Asynchronous Execution
Asynchronous query execution is recommendable if a client does not, or cannot, wait until a request is fully processed. This is e. g. the case with web browsers, which will usually cancel a request after a specific timeout. In such cases, you can use asynchronous execution to trigger another server-side process, which will start the time-consuming process, and fetch the result later on as soon as it is available.
jobs:eval
| Signatures | jobs:eval($query as xs:string) as xs:stringjobs:eval($query as xs:string, $bindings as map(*)) as xs:stringjobs:eval($query as xs:string, $bindings as map(*), $options as map(xs:string, xs:string)) as xs:string |
| Summary | Prepares the supplied $query string for asynchronous execution and returns a query id. The query will be queued as described in the article on Transaction Management, and the result will be cached in main-memory until it is fetched via jobs:result, or until ASYNCTIMEOUT is exceeded. Queries may be updating.Variables and context items can be declared via $bindings (see xquery:eval for more details). The $options parameter contains evaluation options:
|
| Errors | overflow: Too many queries or query results are queued. To fix this, the query results should be retrieved. |
| Examples |
declare %rest:POST("{$query}") %rest:path('/eval') function local:eval($query) {
jobs:eval($query)
};
|
jobs:result
| Signatures | jobs:result($id as xs:string) as item()*
|
| Summary | Returns the result of an asynchronously executed query with the specified query $id:
|
| Errors | running: the query is still running.unknown: the supplied query id is unknown: The query result may already have been retrieved, or query execution may have been stopped. |
| Examples |
declare %rest:path('/result/{$id}') function local:result($id) {
jobs:result($id)
};
let $query := jobs:eval('(1 to 10000000)[. = 1]')
return (
hof:until(
function($result) { jobs:finished($query) },
function($curr) { prof:sleep(10) },
()
),
jobs:result($query)
)
|
jobs:finished
| Signatures | jobs:finished($id as xs:string) as xs:boolean
|
| Summary | Indicates if the evaluation of a query with the specified query $id has finished. If false is returned, the query is still running. An error will be raised if the query result was not cached or has already been retrieved.
|
| Errors | unknown: the supplied query id is unknown: The query result may already have been retrieved, or query execution may have been stopped. |
jobs:stop
| Signatures | jobs:stop($id as xs:string) as empty-sequence()
|
| Summary | Cancels the execution of a query with the specified query $id, or drops the query result if it has already been executed.
|
| Errors | unknown: the supplied query id is unknown: The query result may already have been retrieved, or query execution may have been stopped. |
jobs:ids
| Signatures | jobs:ids() as xs:string*
|
| Summary | Returns the ids of all queries that are either being executed asynchronously, or that have been executed and the results of which have been cached. |
| Examples |
|
Errors
| Code | Description |
|---|---|
unknown
|
The supplied query id is unknown or not available anymore. |
running
|
A query is still running. |
overflow
|
Too many queries or query results are queued. |
Changelog
The module was introduced with Version 8.5.