Hi Iwan,
The prof:variables and prof:dump functions [1] give you some more freedom to look into your running code. A prof:debug function would be nice, and an additional debug() method could be a possible entry point. The drawback is that there are hundreds of iter(), item() and value() implementations in the code, and it would require rather big efforts to make it happen. Another option would be to set a debug flag and react on it every time an item is in the code is evaluated, but this could slow execution time (we already lost some time when we introduced a way to stop running queries via the QueryContext.checkStop function).
More suggestions are welcome, Christian
[1] http://docs.basex.org/wiki/Profiling_Module
On Wed, Jun 27, 2018 at 11:03 PM Iwan Briquemont tracnar@gmail.com wrote:
Hello,
I use BaseX mostly for boolean queries, I have a hardware database and I check if specific hardware support features I need.
It works great but when something is not as expected, it's hard to find out the reason.
E.g. given an expression like:
$some-value = $some-list and (custom:predicate() or $x > $y)
I would like to know why it's true or false. For now I add trace() manually on the subexpressions, rerun, add trace to more specific parts, etc.
Ideally I would want to break down the query execution so it shows the values of subparts of the query to pinpoint why it is false, e.g. have an output like:
$some-value = $some-list and (custom:predicate() or $x > $y) -> false()
$some-value = $some-list -> true()
$some-value -> 1
$some-list -> (1, 2, ..., 10)
custom:predicate() or $x > $y -> false()
custom:predicate() -> false()
... # It should also go inside the function
$x > $y -> false()
$x -> 10
$y -> 11
Any ideas how it could be achieved? Looking at the code, maybe a debug() (like iter() or item()) method could be added to Expr objects which would trace the expression query, file, line and the result of the expression (or probably the first x characters of the result to avoid huge output)? With an xquery function which would trigger it.
I also thought of modifying the query programmatically to add trace() calls but that seems overly complicated.
Best regards, Iwan