Alban

thanks for your response. I understand what you are saying .....

>Your previous query wasn't about attributes in any specific position - it
returned documents that contained >more than zero attributes matching a
given name. What are you trying to do this time?

And that is exactly my problem, only if the first attribute in the
Attributes is a match the query returns successful.
Please see my example below

Thanks
Chris


CREATE INDEX xml_index
  ON time_series
  USING btree
  ((
  (xpath('/AttributeList/Attributes/Attribute/Name/text()',
external_attributes))[1]::text));


SELECT id FROM time_series t1 WHERE EXISTS (
        SELECT 1
          FROM time_series t2
         WHERE (xpath('/AttributeList/Attributes/Attribute/Name/text()',
external_attributes))[1]::text = 'xxxxx'
           AND t2.id = t1.id
 );

When I run the select it uses the index.

The first query I run is with 'xxxxx' = 'Attribute102021' this works like a
champ.
The second query is run with 'xxxx' = 'Attribute202021' and returns null. (
this is the second Attribute )


---- XML example

<AttributeList>
    <Attributes>
        <Attribute>
            <Name>Attribute102021</Name>
            <Value>111111111</Value>
            <LastChanged>2010-03-05T05:44:36.796-05:00</LastChanged>
            <ChangedBy>Chris</ChangedBy>
        </Attribute>
        <Attribute>
            <Name>Attribute202021</Name>
            <Value>222222222</Value>
            <LastChanged>2010-03-05T05:44:36.796-05:00</LastChanged>
            <ChangedBy>Maya</ChangedBy>
        </Attribute>
    </Attributes>
</AttributeList>

On Mon, Mar 8, 2010 at 1:27 PM, Alban Hertroys <
dal...@solfertje.student.utwente.nl> wrote:

> On 8 Mar 2010, at 11:39, Chris Roffler wrote:
>
> > Alban
> >
> > Thanks for your help, your suggestion worked.
> >
> > I need another xpath expression to find any Attribute with  Name ="xxxx"
> under the Attributes node. (not just if it is in a specific position)
> > see   query below.
>
> Your previous query wasn't about attributes in any specific position - it
> returned documents that contained more than zero attributes matching a given
> name. What are you trying to do this time?
>
> > How do I create an index for this xpath expression ?
>
> You don't need to create another index (although one w/o the
> external_attributes column would probably be more convenient); the index you
> have contains those names already.
>
> Just make sure you use the same expression you used to create the index to
> match the part in your xml and compare it to the text you're looking for.
>
> If you want to use indexes on your xml, then you'll need to stop putting
> the variable parts of your queries inside your xpath expressions - you make
> them unindexable that way. So move those [Name='xxxx']'s out of your xpath
> expressions. Instead have the expressions result in the names so that you
> can compare them to the names stored in your index(es).
>
> It won't be as fast as looking for those names using xpath in an xml
> document, as every attribute name is a candidate for comparison now, but at
> least it's indexable.
>
> Alternatively you could try to build an index from the names contained in
> each xml document. Something like:
>
> CREATE INDEX xml_attribute_names
>    ON time_series
>  USING btree (xpath('/AttributeList/Attributes/Attribute/Name/text()'));
>
> This stores the array of all attribute names in an index. You can query for
> existence of specific attributes using the ANY operator on the resulting
> array (see archives and docs for how to do that).
>
> I believe (I've never needed to use arrays) the syntax is:
>
> SELECT * FROM time_series WHERE 'xxxx' = ANY
> (xpath('/AttributeList/Attributes/Attribute/text()'));
>
> It'll probably be faster than the previous solution, but use more disk
> space and memory.
>
> >  SELECT * FROM time_series
> >         WHERE
> array_upper((xpath('/AttributeList/Attributes/Attribute[Name="xxxxx"]',
> external_attributes)),1) > 0
> >
> >
> > On Sun, Mar 7, 2010 at 1:11 PM, Alban Hertroys <
> dal...@solfertje.student.utwente.nl> wrote:
> ...
> > You seem to want to test for the existence of nodes with a specific name,
> maybe this is what you're looking for?:
> >
> > SELECT id FROM time_series t1 WHERE EXISTS (
> >        SELECT 1
> >          FROM time_series t2
> >         WHERE (xpath('/AttributeList/Attributes/Attribute/Name/text()',
> external_attributes))[1]::text = ('Attribute122021', external_attributes)
> >           AND t2.id = t1.id
> > );
>
> For clarity, if you would have an index on just that xpath expression -
> without the external_attributes column - this query would look simpler:
>
> SELECT id FROM time_series t1 WHERE EXISTS (
>       SELECT 1
>         FROM time_series t2
>         WHERE
> xpath('/AttributeList/Attributes/Attribute/Name/text()')[1]::text =
> 'Attribute122021'
>           AND t2.id = t1.id
> );
>
> Alban Hertroys
>
> --
> If you can't see the forest for the trees,
> cut the trees and you'll see there is no forest.
>
>
> !DSPAM:1034,4b94df38296921956520267!
>
>
>

Reply via email to