Optimization issue?

Thursday, 24 October 2019 · 4 messages · last reply 25 Oct 2019
JE
Johannes Echterhoff24 Oct 2019 10:54 #
Hello, I'm experiencing some strange behavior when executing the following query in the BaseX 9.2.4 GUI (nevermind the awkward query structure - that is just to be able to inspect the results of the individual evaluation steps):
let $t := <x>200.0000</x>
let $num := number($t)
let $gt5000 := $num gt 5000
let $ltMinus5000 := $num lt -5000
return $gt5000 or $ltMinus5000
The result is true, although it should be false. The compilation and optimization logs for this query in the GUI tell us the following: ---------- Compiling: - rewrite > comparison to range comparison: ($num_1 > 5000) -> ($num_1 >= 5000.000000000001) - rewrite 'gt' comparison to range comparison: ($num_1 gt 5000) -> ($num_1 >= 5000.000000000001) - pre-evaluate unary expression to xs:integer item: -5000 - rewrite < comparison to range comparison: ($num_1 < -5000) -> ($num_1 <= -5000.000000000001) - rewrite 'lt' comparison to range comparison: ($num_1 lt -5000) -> ($num_1 <= -5000.000000000001) - inline $gt5000_2 - inline $ltMinus5000_3 - simplify or: (true()) - pre-evaluate or to xs:boolean item: (true()) -> true() - remove unused variable $num_1 - remove unused variable $t_0 - simplify FLWOR expression: true() Optimized Query: true() ---------- When the return statement is changed to "return ($num,$gt5000,$ltMinus5000,$gt5000 or $ltMinus5000)" then the result of the boolean operation (last element of the result sequence) is false, as expected. The GUI log then is: ---------- Compiling: - rewrite > comparison to range comparison: ($num_1 > 5000) -> ($num_1 >= 5000.000000000001) - rewrite 'gt' comparison to range comparison: ($num_1 gt 5000) -> ($num_1 >= 5000.000000000001) - pre-evaluate unary expression to xs:integer item: -5000 - rewrite < comparison to range comparison: ($num_1 < -5000) -> ($num_1 <= -5000.000000000001) - rewrite 'lt' comparison to range comparison: ($num_1 lt -5000) -> ($num_1 <= -5000.000000000001) Optimized Query: let $t_0 := element x { ("200.0000") } let $num_1 := number($t_0) let $gt5000_2 := ($num_1 >= 5000.000000000001) let $ltMinus5000_3 := ($num_1 <= -5000.000000000001) return ($num_1, $gt5000_2, $ltMinus5000_3, ($gt5000_2 or $ltMinus5000_3)) ---------- Am I missing something, or could this be a bug in BaseX 9.2.4? With BaseX 9.0.2, both queries (with the different return statements) returned the expected value false for the boolean operation. Best regards, Johannes
CG
Christian Grün24 Oct 2019 12:41 #
Dear Johannes, Thanks for the reproducible test case. The bug (a too eager merge of combined range expressions) was fixed and a new snapshot is available [1,2]. Cheers Christian [1] https://github.com/BaseXdb/basex/issues/1744 [2] http://files.basex.org/releases/latest/
Quoted text · Johannes Echterhoff · 100 lines
On Thu, Oct 24, 2019 at 10:54 AM Johannes Echterhoff <echterhoff at interactive-instruments.de> wrote: > > Hello, > > I’m experiencing some strange behavior when executing the following query in the BaseX 9.2.4 GUI (nevermind the awkward query structure – that is just to be able to inspect the results of the individual evaluation steps): > > > > let $t := <x>200.0000</x> > > let $num := number($t) > > let $gt5000 := $num gt 5000 > > let $ltMinus5000 := $num lt -5000 > > return $gt5000 or $ltMinus5000 > > > > The result is true, although it should be false. > > > > The compilation and optimization logs for this query in the GUI tell us the following: > > ---------- > > Compiling: > > - rewrite > comparison to range comparison: ($num_1 > 5000) -> ($num_1 >= 5000.000000000001) > > - rewrite 'gt' comparison to range comparison: ($num_1 gt 5000) -> ($num_1 >= 5000.000000000001) > > - pre-evaluate unary expression to xs:integer item: -5000 > > - rewrite < comparison to range comparison: ($num_1 < -5000) -> ($num_1 <= -5000.000000000001) > > - rewrite 'lt' comparison to range comparison: ($num_1 lt -5000) -> ($num_1 <= -5000.000000000001) > > - inline $gt5000_2 > > - inline $ltMinus5000_3 > > - simplify or: (true()) > > - pre-evaluate or to xs:boolean item: (true()) -> true() > > - remove unused variable $num_1 > > - remove unused variable $t_0 > > - simplify FLWOR expression: true() > > Optimized Query: > > true() > > ---------- > > > > When the return statement is changed to “return ($num,$gt5000,$ltMinus5000,$gt5000 or $ltMinus5000)” then the result of the boolean operation (last element of the result sequence) is false, as expected. > > The GUI log then is: > > ---------- > > Compiling: > > - rewrite > comparison to range comparison: ($num_1 > 5000) -> ($num_1 >= 5000.000000000001) > > - rewrite 'gt' comparison to range comparison: ($num_1 gt 5000) -> ($num_1 >= 5000.000000000001) > > - pre-evaluate unary expression to xs:integer item: -5000 > > - rewrite < comparison to range comparison: ($num_1 < -5000) -> ($num_1 <= -5000.000000000001) > > - rewrite 'lt' comparison to range comparison: ($num_1 lt -5000) -> ($num_1 <= -5000.000000000001) > > Optimized Query: > > let $t_0 := element x { ("200.0000") } let $num_1 := number($t_0) let $gt5000_2 := ($num_1 >= 5000.000000000001) let $ltMinus5000_3 := ($num_1 <= -5000.000000000001) return ($num_1, $gt5000_2, $ltMinus5000_3, ($gt5000_2 or $ltMinus5000_3)) > > ---------- > > > > Am I missing something, or could this be a bug in BaseX 9.2.4? With BaseX 9.0.2, both queries (with the different return statements) returned the expected value false for the boolean operation. > > > > Best regards, > > Johannes > > > >
JE
Johannes Echterhoff25 Oct 2019 11:23 #
Dear Christian, Tested the snapshot yesterday, and now the expression works as expected. Thank you. Do you have a target date for the release of BaseX 9.3? Best regards, Johannes
Quoted text · Christian Grün · 122 lines
-----Ursprüngliche Nachricht----- Von: Christian Grün [mailto:christian.gruen at gmail.com] Gesendet: Donnerstag, 24. Oktober 2019 12:41 An: Johannes Echterhoff <echterhoff at interactive-instruments.de> Cc: BaseX <basex-talk at mailman.uni-konstanz.de> Betreff: Re: [basex-talk] Optimization issue? Dear Johannes, Thanks for the reproducible test case. The bug (a too eager merge of combined range expressions) was fixed and a new snapshot is available [1,2]. Cheers Christian [1] https://github.com/BaseXdb/basex/issues/1744 [2] http://files.basex.org/releases/latest/ On Thu, Oct 24, 2019 at 10:54 AM Johannes Echterhoff <echterhoff at interactive-instruments.de> wrote: > > Hello, > > I’m experiencing some strange behavior when executing the following query in the BaseX 9.2.4 GUI (nevermind the awkward query structure – that is just to be able to inspect the results of the individual evaluation steps): > > > > let $t := <x>200.0000</x> > > let $num := number($t) > > let $gt5000 := $num gt 5000 > > let $ltMinus5000 := $num lt -5000 > > return $gt5000 or $ltMinus5000 > > > > The result is true, although it should be false. > > > > The compilation and optimization logs for this query in the GUI tell us the following: > > ---------- > > Compiling: > > - rewrite > comparison to range comparison: ($num_1 > 5000) -> ($num_1 > >= 5000.000000000001) > > - rewrite 'gt' comparison to range comparison: ($num_1 gt 5000) -> > ($num_1 >= 5000.000000000001) > > - pre-evaluate unary expression to xs:integer item: -5000 > > - rewrite < comparison to range comparison: ($num_1 < -5000) -> > ($num_1 <= -5000.000000000001) > > - rewrite 'lt' comparison to range comparison: ($num_1 lt -5000) -> > ($num_1 <= -5000.000000000001) > > - inline $gt5000_2 > > - inline $ltMinus5000_3 > > - simplify or: (true()) > > - pre-evaluate or to xs:boolean item: (true()) -> true() > > - remove unused variable $num_1 > > - remove unused variable $t_0 > > - simplify FLWOR expression: true() > > Optimized Query: > > true() > > ---------- > > > > When the return statement is changed to “return ($num,$gt5000,$ltMinus5000,$gt5000 or $ltMinus5000)” then the result of the boolean operation (last element of the result sequence) is false, as expected. > > The GUI log then is: > > ---------- > > Compiling: > > - rewrite > comparison to range comparison: ($num_1 > 5000) -> ($num_1 > >= 5000.000000000001) > > - rewrite 'gt' comparison to range comparison: ($num_1 gt 5000) -> > ($num_1 >= 5000.000000000001) > > - pre-evaluate unary expression to xs:integer item: -5000 > > - rewrite < comparison to range comparison: ($num_1 < -5000) -> > ($num_1 <= -5000.000000000001) > > - rewrite 'lt' comparison to range comparison: ($num_1 lt -5000) -> > ($num_1 <= -5000.000000000001) > > Optimized Query: > > let $t_0 := element x { ("200.0000") } let $num_1 := number($t_0) let > $gt5000_2 := ($num_1 >= 5000.000000000001) let $ltMinus5000_3 := > ($num_1 <= -5000.000000000001) return ($num_1, $gt5000_2, > $ltMinus5000_3, ($gt5000_2 or $ltMinus5000_3)) > > ---------- > > > > Am I missing something, or could this be a bug in BaseX 9.2.4? With BaseX 9.0.2, both queries (with the different return statements) returned the expected value false for the boolean operation. > > > > Best regards, > > Johannes > > > >
CG
Christian Grün25 Oct 2019 11:46 #
Thanks for the confirmation. BaseX should have been released in October; I think we’ll eventually have to target November.
Quoted text · Johannes Echterhoff · 140 lines
On Fri, Oct 25, 2019 at 11:23 AM Johannes Echterhoff <echterhoff at interactive-instruments.de> wrote: > > Dear Christian, > Tested the snapshot yesterday, and now the expression works as expected. Thank you. > Do you have a target date for the release of BaseX 9.3? > Best regards, > Johannes > > > -----Ursprüngliche Nachricht----- > Von: Christian Grün [mailto:christian.gruen at gmail.com] > Gesendet: Donnerstag, 24. Oktober 2019 12:41 > An: Johannes Echterhoff <echterhoff at interactive-instruments.de> > Cc: BaseX <basex-talk at mailman.uni-konstanz.de> > Betreff: Re: [basex-talk] Optimization issue? > > Dear Johannes, > > Thanks for the reproducible test case. The bug (a too eager merge of combined range expressions) was fixed and a new snapshot is available [1,2]. > > Cheers > Christian > > [1] https://github.com/BaseXdb/basex/issues/1744 > [2] http://files.basex.org/releases/latest/ > > > > > On Thu, Oct 24, 2019 at 10:54 AM Johannes Echterhoff <echterhoff at interactive-instruments.de> wrote: > > > > Hello, > > > > I’m experiencing some strange behavior when executing the following query in the BaseX 9.2.4 GUI (nevermind the awkward query structure – that is just to be able to inspect the results of the individual evaluation steps): > > > > > > > > let $t := <x>200.0000</x> > > > > let $num := number($t) > > > > let $gt5000 := $num gt 5000 > > > > let $ltMinus5000 := $num lt -5000 > > > > return $gt5000 or $ltMinus5000 > > > > > > > > The result is true, although it should be false. > > > > > > > > The compilation and optimization logs for this query in the GUI tell us the following: > > > > ---------- > > > > Compiling: > > > > - rewrite > comparison to range comparison: ($num_1 > 5000) -> ($num_1 > > >= 5000.000000000001) > > > > - rewrite 'gt' comparison to range comparison: ($num_1 gt 5000) -> > > ($num_1 >= 5000.000000000001) > > > > - pre-evaluate unary expression to xs:integer item: -5000 > > > > - rewrite < comparison to range comparison: ($num_1 < -5000) -> > > ($num_1 <= -5000.000000000001) > > > > - rewrite 'lt' comparison to range comparison: ($num_1 lt -5000) -> > > ($num_1 <= -5000.000000000001) > > > > - inline $gt5000_2 > > > > - inline $ltMinus5000_3 > > > > - simplify or: (true()) > > > > - pre-evaluate or to xs:boolean item: (true()) -> true() > > > > - remove unused variable $num_1 > > > > - remove unused variable $t_0 > > > > - simplify FLWOR expression: true() > > > > Optimized Query: > > > > true() > > > > ---------- > > > > > > > > When the return statement is changed to “return ($num,$gt5000,$ltMinus5000,$gt5000 or $ltMinus5000)” then the result of the boolean operation (last element of the result sequence) is false, as expected. > > > > The GUI log then is: > > > > ---------- > > > > Compiling: > > > > - rewrite > comparison to range comparison: ($num_1 > 5000) -> ($num_1 > > >= 5000.000000000001) > > > > - rewrite 'gt' comparison to range comparison: ($num_1 gt 5000) -> > > ($num_1 >= 5000.000000000001) > > > > - pre-evaluate unary expression to xs:integer item: -5000 > > > > - rewrite < comparison to range comparison: ($num_1 < -5000) -> > > ($num_1 <= -5000.000000000001) > > > > - rewrite 'lt' comparison to range comparison: ($num_1 lt -5000) -> > > ($num_1 <= -5000.000000000001) > > > > Optimized Query: > > > > let $t_0 := element x { ("200.0000") } let $num_1 := number($t_0) let > > $gt5000_2 := ($num_1 >= 5000.000000000001) let $ltMinus5000_3 := > > ($num_1 <= -5000.000000000001) return ($num_1, $gt5000_2, > > $ltMinus5000_3, ($gt5000_2 or $ltMinus5000_3)) > > > > ---------- > > > > > > > > Am I missing something, or could this be a bug in BaseX 9.2.4? With BaseX 9.0.2, both queries (with the different return statements) returned the expected value false for the boolean operation. > > > > > > > > Best regards, > > > > Johannes > > > > > > > >

⚡Generated with XQuery