Skip to content

Instantly share code, notes, and snippets.

View line-o's full-sized avatar
🌱
weeding the garden

Juri Leino line-o

🌱
weeding the garden
View GitHub Profile
@line-o
line-o / index-usage.md
Created December 18, 2024 13:03
eXist-db Query Optimizer and Index usage

eXist-db Query Optimizer and Index usage

I put together some findings I gathered over the years on how small adjustements to XPath queries can lead to better performance. These are not definitive and should be tested if they apply to specific slow running queries you have issues with. I assume you have profiled your queries before in the bundled monex application. Here is a bit of documentation on this topic to help you get started: http://exist-db.org/exist/apps/doc/indexing.xml?field=all&id=D3.19#check-usage On a typical local instance this is available at: http://localhost:8080/exist/apps/monex/profiling.html

General rules on predicates

@line-o
line-o / inspect-sequence-types.xq
Last active November 6, 2024 16:41
proof of concept to use the output of the proposed function fn:type to find the most specific shared type among a sequence of items
(:
explore if the proposed XQuery 4 function fn:type can be used
to inspect sequences of items to find the most specific shared
type among them
:)
declare namespace ist="//line-o.de/ns/inspect-sequence-types";
declare function ist:find-shared-type ($acc as xs:string*, $next as xs:string*) as xs:string* {
let $count-a := count($acc)
let $count-n := count($next)
@line-o
line-o / enc.xq
Last active October 9, 2024 15:55
xquery version "3.1";
declare namespace enc="//-o/ns/xquery/encoding";
import module namespace bin="http://expath.org/ns/binary";
declare function enc:fix ($string as xs:string) as xs:string {
analyze-string($string, "(\\u00([0-9a-z]{2})\\u00([0-9a-z]{2}))")/element()
=> for-each(enc:process#1)
=> string-join("")
@line-o
line-o / emt.xq
Last active July 2, 2024 14:08
Preserve namespaces when traversing trees (see also the clean solution that works in Saxon https://xqueryfiddle.liberty-development.net/6qVSgfh/6)
xquery version "3.1";
module namespace emt="//external-module-test";
declare function emt:transform($node as node()) as node()+ {
typeswitch ($node)
case document-node() return document { emt:transform($node/element()) }
case attribute(xml:id) return (
attribute old-id { $node/string() },
attribute xml:id { "s" || $node }
@line-o
line-o / zip.xq
Last active December 5, 2023 19:48
Python like zip function in Xquery
import module namespace array="http://www.w3.org/2005/xpath-functions/array";
import module namespace map="http://www.w3.org/2005/xpath-functions/map";
declare namespace _="//line-o.de/ns/underline";
declare function _:nth-item ($sequence as item()*, $pos as xs:integer) as item()* {
$sequence[$pos]
};
declare function _:reduce-sequences (
@line-o
line-o / prob.xqm
Last active September 22, 2023 19:17
Selecting items skewed by weights was an interesting problem to solve
module namespace prob = "//line-o.de/ns/prob";
declare namespace map = "http://www.w3.org/2005/xpath-functions/map";
declare namespace array = "http://www.w3.org/2005/xpath-functions/array";
(: select by p from prepared sequence of options :)
declare
function prob:select-by-p($options as array(*)+, $p as xs:double) as item()* {
fold-left($options, (),
prob:select(?, ?, $p)
@line-o
line-o / has-cdata.html
Last active February 11, 2023 19:58
Illustrate a bug in existdb that leads to exist.log polluted with error messages
<html>
<body>
<script type="text/javascript"><![CDATA[ console.log(true && 1 < 2) ]]></script>
</body>
</html>
@line-o
line-o / orcid.xqm
Last active February 10, 2023 09:46
Validate ORCIDs (both format and checksum)
xquery version "3.1";
module namespace orcid="orcid/validate";
declare variable $orcid:R := 2;
declare variable $orcid:M := 11;
declare variable $orcid:format := '^(\d{4}-\d{4}-\d{4}-\d{3}|\d{15})[0-9X]$';
declare variable $orcid:is-valid-format := matches(?, $orcid:format);
declare variable $orcid:expected-sum := map{
'1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'X':10
@line-o
line-o / expected-output.txt
Last active January 19, 2023 14:47
fun with permissions
0600 (.rw-------) -> 0700 (.rwx------)
0755 (.rwxr-xr-x) -> 0755 (.rwxr-xr-x)
0660 (.rw-rw----) -> 0770 (.rwxrwx---)
0664 (.rw-rw-r--) -> 0775 (.rwxrwxr-x)
0666 (.rw-rw-rw-) -> 0777 (.rwxrwxrwx)
0622 (.rw--w--w-) -> 0733 (.rwx-wx-wx)
0777 (.rwxrwxrwx) -> 0777 (.rwxrwxrwx)
@line-o
line-o / safe-ebv.xq
Last active March 2, 2023 19:23
A safe way to evaluate the effective boolean value of a sequence of items -> anything that cannot be evaluated is false
xquery version "3.1";
declare function local:safe-effective-boolean-value-if (
$result as item()*
) as xs:boolean {
try {
if ($result)
then true()
else false()
} catch err:FORG0006 {