Assigning incrementing number to 100ks of elements
Tuesday, 24 November 2015 · 2 messages
CB
Chuck Bearden24 Nov 2015 22:29 #
BaseX 8.3.1, installed on Linux today from zip archive.
I have about 137,000 target elements, each having an average of 550 descendant elements, and each taking about 45k of space on disk. The target elements each have an @uuid value, and I'd like to extract each @uuid value and assign it a unique number from an incrementing sequence of integers. I'd like to be able to start the sequence at an arbitrary value.
I tried a recursive function I borrowed and modified from a StackOverflow post:
declare function local:loop($seq, $count) {
if(empty($seq)) then ()
else
let $prod := $seq[1],
$count := $count + 1
return (
<result>
<id>{$count}</id>
<uuid>{data($prod)}</uuid>
</result>,
local:loop(tail($seq), $count)
)
};and calling it like so:
return
<results>{
local:loop($pubs, 0)
}</results>where $prod is a sequence of all the @uuid attributes (not the values, and not the whole elements).
My query fails with the error:
[bxerr:BASX0005] Stack Overflow: Try tail recursion?
I'm using -Xmx6g and -Xss4m as flags for Java in the basexgui script.
Is there some way to get BaseX to use tail recursion? Or is there another approach to doing what I want?
Many thanks,
Chuck
CG
Christian Grün24 Nov 2015 23:01 #
Hi Chuck,
Quoted text · Chuck Bearden · 3 lines
> target elements each have an @uuid value, and I'd like to extract each > @uuid value and assign it a unique number from an incrementing > sequence of integers.
There has recently been a thread on generating consecutive ids, it should answer some of your questions [1].
Quoted text · Chuck Bearden · 5 lines
> I tried a recursive function I borrowed and modified from a StackOverflow post: > [...] > I'm using -Xmx6g and -Xss4m as flags for Java in the basexgui script. > > Is there some way to get BaseX to use tail recursion?
Absolutely. You can rewrite function calls in recursive code to tail calls (but it’s hardly possible to do this automatically); see [2] for some examples.
Hope this helps,
Christian
[1] https://www.mail-archive.com/basex-talk%40mailman.uni-konstanz.de/msg07120.html [2] https://en.wikipedia.org/wiki/Tail_call
Written for BaseX 8.3. BaseX may have changed since: please check the current documentation.
⚡Generated with XQuery