Using the attribute index to get attribute values

Wednesday, 12 June 2019 · 4 messages
FB
France Baril12 Jun 2019 09:07 #

Hi,

I have been implementing more queries that use the attribute indexes lately. However a lot of my queries require getting values to offer selectable items in user forms (GUI). I have not found a good way to do that.

For example, I tried changing : let $account-types := distinct-values(db:open($db-name)//account/@type) to let $account-types := distinct-values(db:attribute-range($db-name, 'a', 'zzzzzzzzzz', 'type')[parent::*/name() = 'account'])

I looked for a function that would be more like let $account-types := db:attribute-values($db-name, 'type')[parent::*/name() = 'account]

I'm not getting any performance improvements with the db:attribute-range compared to the regular db:open($db-name). and I am assuming that the issue is that since I provide a range, it has to check every value individually as opposed to just grabbing everything in the named attribute.

Any chance we can get values at some point? Or do you have a suggestion to improve this type of query?

-- France Baril Architecte documentaire / Documentation architect france.baril at architextus.com
MS
Michael Seiferle12 Jun 2019 16:34 #

Hi France,

that’s just a wild guess, but maybe the index:facets() might be of help here? It works directly on the index information, so the queries should be sufficiently fast if the results of index:facets() fulfill your needs.

http://docs.basex.org/wiki/Index_Module#index:facets

The idea of db:attribute-values() is an idea worth discussing as well.

Best from Konstanz

Michael

Quoted text · France Baril · 35 lines
> Am 12.06.2019 um 09:07 schrieb France Baril <france.baril at architextus.com>: > > Hi, > > > > I have been implementing more queries that use the attribute indexes lately. However a lot of my queries require getting values to offer selectable items in user forms (GUI). I have not found a good way to do that. > > > For example, I tried changing : > let $account-types := distinct-values(db:open($db-name)//account/@type) > to > let $account-types := distinct-values(db:attribute-range($db-name, 'a', 'zzzzzzzzzz', 'type')[parent::*/name() = 'account']) > > > I looked for a function that would be more like > let $account-types := db:attribute-values($db-name, 'type')[parent::*/name() = 'account] > > > I'm not getting any performance improvements with the db:attribute-range compared to the regular db:open($db-name). and I am assuming that the issue is that since I provide a range, it has to check every value individually as opposed to just grabbing everything in the named attribute. > > > Any chance we can get values at some point? Or do you have a suggestion to improve this type of query? > > > > > > > > > -- > France Baril > Architecte documentaire / Documentation architect > france.baril at architextus.com
FB
France Baril12 Jun 2019 16:48 #

But facets would return @type values for all @type and I need only those on <account>.

Quoted text · Michael Seiferle · 57 lines
On Wed, Jun 12, 2019 at 4:34 PM Michael Seiferle <ms at basex.org> wrote: > Hi France, > > that’s just a wild guess, but maybe the index:facets() might be of help > here? > It works directly on the index information, so the queries should be > sufficiently fast if the results of index:facets() fulfill your needs. > > http://docs.basex.org/wiki/Index_Module#index:facets > > > The idea of db:attribute-values() is an idea worth discussing as well. > > Best from Konstanz > > Michael > > > > Am 12.06.2019 um 09:07 schrieb France Baril <france.baril at architextus.com > >: > > Hi, > > I have been implementing more queries that use the attribute indexes > lately. However a lot of my queries require getting values to offer > selectable items in user forms (GUI). I have not found a good way to do > that. > > For example, I tried changing : > let $account-types := distinct-values(db:open($db-name)//account/@type) > to > let $account-types := distinct-values(db:attribute-range($db-name, 'a', > 'zzzzzzzzzz', 'type')[parent::*/name() = 'account']) > > I looked for a function that would be more like > let $account-types := db:attribute-values($db-name, > 'type')[parent::*/name() = 'account] > > I'm not getting any performance improvements with the db:attribute-range > compared to the regular db:open($db-name). and I am assuming that the issue > is that since I provide a range, it has to check every value individually > as opposed to just grabbing everything in the named attribute. > > Any chance we can get values at some point? Or do you have a suggestion to > improve this type of query? > > > > > -- > France Baril > Architecte documentaire / Documentation architect > france.baril at architextus.com > > >
-- France Baril Architecte documentaire / Documentation architect france.baril at architextus.com
MS
Michael Seiferle12 Jun 2019 17:07 #

I am not sure about your data exactly, but, the element hierarchy can be preserved:

Quoted text · France Baril · 2 lines
> (: http://files.basex.org/xml/factbook.xml :) > index:facets('factbook')//element[@name="continent"]/attribute[@name="id“]

Will return only the id values of elements named continent :-)

Or in your example you might want to change this to „element[@name='country‘]“

One thing to consider, the maximum number of distinct-values that will be added to the index is defined by the maxcats option: http://docs.basex.org/wiki/Options#MAXCATS

Best Michael

Quoted text · France Baril · 75 lines
> Am 12.06.2019 um 16:48 schrieb France Baril <france.baril at architextus.com>: > > But facets would return @type values for all @type and I need only those on <account>. > > > On Wed, Jun 12, 2019 at 4:34 PM Michael Seiferle <ms at basex.org> wrote: > > > > Hi France, > > > > that’s just a wild guess, but maybe the index:facets() might be of help here? > > It works directly on the index information, so the queries should be sufficiently fast if the results of index:facets() fulfill your needs. > > > > > > http://docs.basex.org/wiki/Index_Module#index:facets > > > > > > > > > > The idea of db:attribute-values() is an idea worth discussing as well. > > > > > > Best from Konstanz > > > > > > Michael > > > > > > > > > > > > > > > Am 12.06.2019 um 09:07 schrieb France Baril <france.baril at architextus.com>: > > > > > > Hi, > > > > > > > > > > > > I have been implementing more queries that use the attribute indexes lately. However a lot of my queries require getting values to offer selectable items in user forms (GUI). I have not found a good way to do that. > > > > > > > > > For example, I tried changing : > > > let $account-types := distinct-values(db:open($db-name)//account/@type) > > > to > > > let $account-types := distinct-values(db:attribute-range($db-name, 'a', 'zzzzzzzzzz', 'type')[parent::*/name() = 'account']) > > > > > > > > > I looked for a function that would be more like > > > let $account-types := db:attribute-values($db-name, 'type')[parent::*/name() = 'account] > > > > > > > > > I'm not getting any performance improvements with the db:attribute-range compared to the regular db:open($db-name). and I am assuming that the issue is that since I provide a range, it has to check every value individually as opposed to just grabbing everything in the named attribute. > > > > > > > > > Any chance we can get values at some point? Or do you have a suggestion to improve this type of query? > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > France Baril > > > Architecte documentaire / Documentation architect > > > france.baril at architextus.com > > > > > -- > France Baril > Architecte documentaire / Documentation architect > france.baril at architextus.com

⚡Generated with XQuery