Or this one:

 

let $query :=
    cts:and-query((
        cts:element-value-query(xs:QName("title"),"foobar"),
        cts:element-value-query(xs:QName("lastname"),"touissant")
    ))
return
    cts:search(
        xdmp:directory("/test/"),
        $query
    )
    //*:author

 

From: [email protected] 
[mailto:[email protected]] On Behalf Of Geert Josten
Sent: Wednesday, May 25, 2011 9:00 AM
To: General MarkLogic Developer Discussion
Subject: Re: [MarkLogic Dev General] How to specified a result root node ?

 

Hi Stephane,

 

Might be worth to compare the performance of your search with this one (which 
should produce the same results as far as I can see):

 

let $gq := cts:element-value-query(xs:QName("title"), "foobar")
let $fq := cts:element-value-query(xs:QName("lastname"), "toussaint")
return
cts:search(
  xdmp:directory("/test/"),
  $gq
)//*:author[cts:contains(. , $fq)]

 

Kind regards,

Geert

 

Van: [email protected] 
[mailto:[email protected]] Namens Stephane Toussaint
Verzonden: woensdag 25 mei 2011 14:35
Aan: General MarkLogic Developer Discussion
Onderwerp: Re: [MarkLogic Dev General] How to specified a result root node ?

 

Damon,

 

Thank you for your answer. The use of cts:contains is a nice way of doing 
filter operation. Thank you for that.

 

To answer my last use case, I need to separate query in 2 parts. A global and a 
filtering one. Both are combined to produce the search query, and finally the 
last one is use alone for filtering

 

let $gq := cts:element-value-query(xs:QName("title"), "foobar")
let $fq := cts:element-value-query(xs:QName("lastname"), "toussaint")
let $jq := cts:and-query(($gq, $fq))
return
cts:search(
  xdmp:directory("/test/"),
  $jq
)//*:author[cts:contains(. , $fq)]

 

It is the only way I found to retrieve only the author node that match both the 
title and the lastname author. This may seem weird here because I only propose 
one doc in sample, but say I need to filter on the title too.

I would like to not need to know which part of the query is effective for 
filtering and which not, but I think that in my case I can handle it (this 
Xquery is build from the value set by a user in a form way).

 

Anyway thank you for the hint.

 

Thanks

Stephane

 

Le 24 mai 2011 à 18:30, Damon Feldman a écrit :

 

Stephane,

 

You are on the right track. To search the entire document, use the 
xdmp:directory() expression as the "searchable expression" but you will get 
entire documents back from that search.

 

To find the author you want you may use cts:contains(). This is the function 
that performs the "filtering" check referenced in our documentation, where it 
checks an in-memory XML structure to see if a query condition holds rather than 
checking the DB indexes for the query condition.  This example (namespace 
removed for convenience) should help:

 

xquery version "1.0-ml";

 

let $d :=

<doc docId="1">

    <title>foobar</title>

    <authors>

        <author>

            <firstname>stephane</firstname>

            <lastname>toussaint</lastname>

        </author>

        <author>

            <firstname>my</firstname>

            <lastname>self</lastname>

        </author>

    </authors>

</doc>  

 

return xdmp:document-insert("/test/text.xml", $d)

;

 

let $q := cts:word-query("stephane")  (: "stephane" is a shorthand for this 
word query :)

return cts:search(/doc, $q)//author[cts:contains(., $q)]

 

For more precision, you may also use cts:element-query(xs:QName("author"), 
cts:word-query("stephane")).

 

Yours,

Damon

 

From: [email protected] 
[mailto:[email protected]] On Behalf Of Stephane Toussaint
Sent: Tuesday, May 24, 2011 8:28 AM
To: General MarkLogic Developer Discussion
Subject: [MarkLogic Dev General] How to specified a result root node ?

 

Hi,

 

I'm trying to specified a result root node for my query in a customizable 
context.

 

Take this documents for instance ("/test/doc1.xml") :

 

<?xml version="1.0" encoding="UTF-8"?>
<doc docId="1" xmlns="sto:test">
    <title>foobar</title>
    <authors>
        <author>
            <firstname>stephane</firstname>
            <lastname>toussaint</lastname>
        </author>
        <author>
            <firstname>my</firstname>
            <lastname>self</lastname>
        </author>
    </authors>

</doc>   

 

I'd like to retrieve for instance doc which contains title "foobar". Easy 
enough the query will be :

 

cts:search(
  xdmp:directory("/test/"),
  cts:element-value-query(fn:QName("sto:test", "title"), "foobar")
)

 

Now if I want to retrieve docs written by toussaint.

 

cts:search(
  xdmp:directory("/test/"),
  cts:element-value-query(fn:QName("sto:test", "lastname"), "toussaint")
)

 

Ok, so far so good. Now I want to change the root of the element to return. I'd 
like to return authors instead of the doc directly.

Retrieving the authors of a particular doc is easy :

 

cts:search(
  xdmp:directory("/test/"),
  cts:element-value-query(fn:QName("sto:test", "title"), "foobar")
)//*:author

 

But now if I want only authors with 'toussaint' has lastname

 

cts:search(
  xdmp:directory("/test/"),
  cts:element-value-query(fn:QName("sto:test", "

lastname

"), "toussaint")
)//*:author

 

This query doesn't work because it return every authors for the document with 
an author named toussaint (return 2 results instead of one).

 

The thing is to change the root node of the search query :

 

cts:search(
  xdmp:directory("/test/")//*:author,
  cts:element-value-query(fn:QName("sto:test", "lastname"), "toussaint")
)

 

But how could I combined for instance title with lastname and return only the 
author ?

 

cts:search(
  xdmp:directory("/test/")//*:author,
  cts:and-query((
    cts:element-value-query(fn:QName("sto:test", "title"), "foobar"),
    cts:element-value-query(fn:QName("sto:test", "lastname"), "toussaint")
  ))
)

 

This return nothing because there is no 'title' element under 'author'

 

cts:search(
  xdmp:directory("/test/"),
  cts:and-query((
    cts:element-value-query(fn:QName("sto:test", "title"), "foobar"),
    cts:element-value-query(fn:QName("sto:test", "lastname"), "toussaint")
  ))
)//*:author

 

This returns 2 authors instead of only the matching one.

 

So briefly the question is,  whatever the constraint part of my query I want to 
be able to retrieve the closet element of the root element I choose to return 
(I hope I'm clear enough).

Is there something that can be done with the cts api ?

 

Thanks,

 

Stéphane

 

_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general

 

_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general

Reply via email to