Using BaseX 9.3.2, why does a query
collection('/test-db-1/bib')//Q{}libro
return 6 items while
collection('/test-db-1/bib')//libro
gives 0 items?
If I run
collection('/test-db-1/bib')//Q{}libro, collection('/test-db-1/bib')//libro
the info window shows
Compiling: - rewrite fn:collection([uri]) to document-node() item: collection("/test-db-1/bib") -> db:open-pre("test-db-1", 12000002) - merge steps: descendant::element(libro) - rewrite fn:collection([uri]) to document-node() item: collection("/test-db-1/bib") -> db:open-pre("test-db-1", 12000002) - remove step without results: element(libro) - rewrite iter step to empty sequence: element(libro) -> () - rewrite cached path to empty sequence: db:open-pre("test-db-1", 12000002)/descendant-or-self::node()/() -> () - rewrite expression list to iter path: (db:open-pre("test-db-1", 12000002)/descendant::element(libro), ()) -> db:open-pre("test-db-1", 12000002)/descendant::element(libro) Optimized Query: db:open-pre("test-db-1", 12000002)/descendant::element(libro) Query: collection('/test-db-1/bib')//Q{}libro, collection('/test-db-1/bib')//libro Result: - Hit(s): 6 Items - Updated: 0 Items - Printed: 1455 b - Read Locking: test-db-1 - Write Locking: (none)
Am 29.03.2020 um 16:26 schrieb Martin Honnen:
Using BaseX 9.3.2, why does a query
collection('/test-db-1/bib')//Q{}libro
return 6 items while
collection('/test-db-1/bib')//libro
gives 0 items?
If I run
collection('/test-db-1/bib')//Q{}libro, collection('/test-db-1/bib')//libro
the info window shows
Compiling:
- rewrite fn:collection([uri]) to document-node() item:
collection("/test-db-1/bib") -> db:open-pre("test-db-1", 12000002)
- merge steps: descendant::element(libro)
- rewrite fn:collection([uri]) to document-node() item:
collection("/test-db-1/bib") -> db:open-pre("test-db-1", 12000002)
- remove step without results: element(libro)
- rewrite iter step to empty sequence: element(libro) -> ()
- rewrite cached path to empty sequence: db:open-pre("test-db-1",
12000002)/descendant-or-self::node()/() -> ()
- rewrite expression list to iter path: (db:open-pre("test-db-1",
12000002)/descendant::element(libro), ()) -> db:open-pre("test-db-1", 12000002)/descendant::element(libro) Optimized Query: db:open-pre("test-db-1", 12000002)/descendant::element(libro) Query: collection('/test-db-1/bib')//Q{}libro, collection('/test-db-1/bib')//libro Result:
- Hit(s): 6 Items
- Updated: 0 Items
- Printed: 1455 b
- Read Locking: test-db-1
- Write Locking: (none)
It seems the problems occurs if I have one document in the db that has elements in a namespace and one with elements in no namespace.
So if there is only one document with no namespaces then both collection('/test-db-3/ex2')//foo and collection('/test-db-3/ex2')//Q{}foo select the `foo` elements in no namespace but if there is a document using a namespace as well in the db then collection('/test-db-3/ex2')//foo does not select the `foo` elements in no namespace.
Are there any db/namespace related settings in BaseX that cause that behaviour?
Hi Martin,
Thanks for the analysis. As you’ve already indicated, the combination of documents with and without namespaces triggered an optimization that should only take effect if all documents of a database have the same default namespace
The bug has been fixed; a new snapshot is online [1,2].
Best, Christian
[1] https://github.com/BaseXdb/basex/issues/1831 [2] http://files.basex.org/releases/latest/
On Mon, Mar 30, 2020 at 11:26 AM Martin Honnen martin.honnen@gmx.de wrote:
Am 29.03.2020 um 16:26 schrieb Martin Honnen:
Using BaseX 9.3.2, why does a query
collection('/test-db-1/bib')//Q{}libro
return 6 items while
collection('/test-db-1/bib')//libro
gives 0 items?
If I run
collection('/test-db-1/bib')//Q{}libro, collection('/test-db-1/bib')//libro
the info window shows
Compiling:
- rewrite fn:collection([uri]) to document-node() item:
collection("/test-db-1/bib") -> db:open-pre("test-db-1", 12000002)
- merge steps: descendant::element(libro)
- rewrite fn:collection([uri]) to document-node() item:
collection("/test-db-1/bib") -> db:open-pre("test-db-1", 12000002)
- remove step without results: element(libro)
- rewrite iter step to empty sequence: element(libro) -> ()
- rewrite cached path to empty sequence: db:open-pre("test-db-1",
12000002)/descendant-or-self::node()/() -> ()
- rewrite expression list to iter path: (db:open-pre("test-db-1",
12000002)/descendant::element(libro), ()) -> db:open-pre("test-db-1", 12000002)/descendant::element(libro) Optimized Query: db:open-pre("test-db-1", 12000002)/descendant::element(libro) Query: collection('/test-db-1/bib')//Q{}libro, collection('/test-db-1/bib')//libro Result:
- Hit(s): 6 Items
- Updated: 0 Items
- Printed: 1455 b
- Read Locking: test-db-1
- Write Locking: (none)
It seems the problems occurs if I have one document in the db that has elements in a namespace and one with elements in no namespace.
So if there is only one document with no namespaces then both collection('/test-db-3/ex2')//foo and collection('/test-db-3/ex2')//Q{}foo select the `foo` elements in no namespace but if there is a document using a namespace as well in the db then collection('/test-db-3/ex2')//foo does not select the `foo` elements in no namespace.
Are there any db/namespace related settings in BaseX that cause that behaviour?
basex-talk@mailman.uni-konstanz.de