Bonjour Giuseppe,

My first guess is that count($p) is a very very huge number ?

In the first query you will scan the $p sequence at each iteration.
In the second one you will directly access the text index.

Hoping it helps

Best regards,
Fabrice

-----Message d'origine-----
De : [email protected] 
[mailto:[email protected]] De la part de Giuseppe 
Celano
Envoyé : mardi 19 septembre 2017 15:35
À : BaseX
Objet : [basex-talk] db:text() vs XPath

I am using BaseX 8.6.4 and I am trying to do a group-by/order-by operation, and 
I see that two logically equivalent queries perform very differently: one 
cannot see the end, while the other can (and fast). I can provide further 
details if necessary, but these are the queries (look at the last line of both, 
where the difference is):

(This does not work:)

declare variable $p := db:open("db2")/text/line/text(); (: returns a list of 
values like ΠΕΡΙ#n-s---mv- :)

for $u in db:open("db1")/text/s/t
let $a := $u/f/text()                                                       (: 
returns one value like ΠΕΡΙ :)
let $b := $u/@o/data(.)                                                (: 
returns one value like n-s---mv- :)
group by $k := $a || "#" || $b                                        (: builds 
a value like ΠΕΡΙ#n-s---mv- :)
let $n := count($u)
order by $n descending
return
if ($p = $k) then $k || " " || $n  else ()

(This works:)

for $u in db:open("db1")/text/s/t
let $a := $u/f/text()                                                       (: 
returns one value like ΠΕΡΙ :)
let $b := $u/@o/data(.)                                                (: 
returns one value like n-s---mv- :)
group by $k := $a || "#" || $b                                        (: builds 
a value like ΠΕΡΙ#n-s---mv- :)
let $n := count($u)
order by $n descending
return
if (db:text("db2", $k)) then $k || " " || $n  else ()

The problem is with directly accessing the database with db:text() or 
indirectly using XPATH. I would tend to use XPATH and expect to get an 
underlying translation into db:text(), but this seems not to happen: why?

Best,
Giuseppe 

Reply via email to