Difference between revisions of "Lazy Module"

From BaseX Documentation
Jump to navigation Jump to search
m (Text replacement - "</syntaxhighlight>" to "</pre>")
Tags: Mobile web edit Mobile edit
 
(9 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
This [[Module Library|XQuery Module]] contains functions for handling ''lazy'' items.
 
This [[Module Library|XQuery Module]] contains functions for handling ''lazy'' items.
  
In contrast to standard XQuery items, a lazy item contains a reference to the actual data, and the data itself will only be retrieved if it is requested. Hence, possible errors will be postponed, and no memory will be occupied by a lazy item as long as its content has not been requested yet.
+
In contrast to standard XQuery items, a lazy item contains a reference to the actual data, and the data itself will only be retrieved if it is processed. Hence, possible errors will be postponed, and no memory will be occupied by a lazy item as long as its content has not been requested yet.
  
 
The following BaseX functions return lazy items:
 
The following BaseX functions return lazy items:
Line 24: Line 24:
 
The XQuery expression below serves as an example on how large files can be downloaded and written to a file with constant memory consumption:
 
The XQuery expression below serves as an example on how large files can be downloaded and written to a file with constant memory consumption:
  
<syntaxhighlight lang="xquery">
+
<pre lang='xquery'>
 
file:write-binary('output.data', fetch:binary('http://files.basex.org/xml/xmark111mb.zip'))
 
file:write-binary('output.data', fetch:binary('http://files.basex.org/xml/xmark111mb.zip'))
</syntaxhighlight>
+
</pre>
  
 
If lazy items are serialized, they will be streamed as well.
 
If lazy items are serialized, they will be streamed as well.
Line 40: Line 40:
 
{| width='100%'
 
{| width='100%'
 
|- valign="top"
 
|- valign="top"
| width='120' | '''Signatures'''
+
| width='120' | '''Signature'''
|{{Func|lazy:cache|$items as item()*|item()*}}<br/>{{Func|lazy:cache|$items as item()*, $lazy as xs:boolean|item()*}}
+
|<pre>lazy:cache(
 +
  $input  as item()*,
 +
  $lazy   as xs:boolean?  := false()
 +
) as item()*</pre>
 
|- valign="top"
 
|- valign="top"
 
| '''Summary'''
 
| '''Summary'''
|Caches the data of lazy {{Code|$items}} in a sequence:<br />
+
|Caches the data of lazy {{Code|$input}} items:<br/>
* data of lazy items will be retrieved and cached inside the item.
+
* data of lazy items are retrieved and cached inside the item.
* non-lazy items, or lazy items with cached data, will simply be passed through.
+
* non-lazy items, or lazy items with cached data, are simply passed through.
* If {{Code|$lazy}} is set to {{Code|true()}}, caching will be deferred until the data is eventually requested. Streaming will be disabled: Data will always be cached before a stream is returned.
+
* If {{Code|$lazy}} is set to {{Code|true()}}, caching is deferred until the data is eventually requested. Streaming will be disabled: Data will be cached before a stream is returned.
Caching is advisable if an item will be processed more than once, or if the data may not be available anymore at a later stage.
+
Caching is advisable if an item is processed more than once, or if the data may not be available anymore at a later stage.
 
|- valign="top"
 
|- valign="top"
 
| '''Example'''
 
| '''Example'''
|In the following example, a file will be deleted before its content is returned. To avoid a “file not found” error when serializing the result, the content must be cached:
+
|In the following example, a file is deleted before its content is returned. To avoid a “file not found” error when serializing the result, the content must be cached:
<syntaxhighlight lang="xquery">
+
<pre lang='xquery'>
 
let $file := 'data.txt'
 
let $file := 'data.txt'
 
let $text := lazy:cache(file:read-text($file))
 
let $text := lazy:cache(file:read-text($file))
 
return (file:delete($file), $text)
 
return (file:delete($file), $text)
</syntaxhighlight>
+
</pre>
 
|}
 
|}
  
Line 63: Line 66:
 
{| width='100%'
 
{| width='100%'
 
|- valign="top"
 
|- valign="top"
| width='120' | '''Signatures'''
+
| width='120' | '''Signature'''
|{{Func|lazy:is-lazy|$item as item()|xs:boolean}}
+
|<pre>lazy:is-lazy(
 +
  $item as item()
 +
) as xs:boolean</pre>
 
|- valign="top"
 
|- valign="top"
 
| '''Summary'''
 
| '''Summary'''
Line 74: Line 79:
 
{| width='100%'
 
{| width='100%'
 
|- valign="top"
 
|- valign="top"
| width='120' | '''Signatures'''
+
| width='120' | '''Signature'''
|{{Func|lazy:is-cached|$item as item()|xs:boolean}}
+
|<pre>lazy:is-cached(
 +
  $item as item()
 +
) as xs:boolean</pre>
 
|- valign="top"
 
|- valign="top"
 
| '''Summary'''
 
| '''Summary'''

Latest revision as of 18:33, 1 December 2023

This XQuery Module contains functions for handling lazy items.

In contrast to standard XQuery items, a lazy item contains a reference to the actual data, and the data itself will only be retrieved if it is processed. Hence, possible errors will be postponed, and no memory will be occupied by a lazy item as long as its content has not been requested yet.

The following BaseX functions return lazy items:

Some functions are capable of consuming the contents of lazy items in a streamable fashion: data will not be cached, but instead passed on to another target (file, the calling expression, etc.). The following streaming functions are currently available:

The XQuery expression below serves as an example on how large files can be downloaded and written to a file with constant memory consumption:

file:write-binary('output.data', fetch:binary('http://files.basex.org/xml/xmark111mb.zip'))

If lazy items are serialized, they will be streamed as well.

Conventions[edit]

All functions and errors in this module are assigned to the http://basex.org/modules/lazy namespace, which is statically bound to the lazy prefix.

Functions[edit]

lazy:cache[edit]

Signature
lazy:cache(
  $input  as item()*,
  $lazy   as xs:boolean?  := false()
) as item()*
Summary Caches the data of lazy $input items:
  • data of lazy items are retrieved and cached inside the item.
  • non-lazy items, or lazy items with cached data, are simply passed through.
  • If $lazy is set to true(), caching is deferred until the data is eventually requested. Streaming will be disabled: Data will be cached before a stream is returned.

Caching is advisable if an item is processed more than once, or if the data may not be available anymore at a later stage.

Example In the following example, a file is deleted before its content is returned. To avoid a “file not found” error when serializing the result, the content must be cached:
let $file := 'data.txt'
let $text := lazy:cache(file:read-text($file))
return (file:delete($file), $text)

lazy:is-lazy[edit]

Signature
lazy:is-lazy(
  $item  as item()
) as xs:boolean
Summary Checks whether the specified $item is lazy.

lazy:is-cached[edit]

Signature
lazy:is-cached(
  $item  as item()
) as xs:boolean
Summary Checks whether the contents of the specified $item are cached. The function will always return true for non-lazy items.

Changelog[edit]

Version 9.1
  • Updated: lazy:cache: $lazy argument added; support for sequences.
Version 9.0
  • Updated: Renamed from Streaming Module to Lazy Module.
  • Added: lazy:is-cached
Version 8.0

This module was introduced with Version 7.7.