Hi Doug,

I believe you are running into a wildcard bug in 4.0-3, and it is fixed in 
4.0-5.

In 4.0-5, your query works as expected, and when the cts:contains returns true 
the corresponding cts:search returns the node (and vice versa).

-Danny

From: [email protected] 
[mailto:[email protected]] On Behalf Of Glidden, Douglass 
A
Sent: Wednesday, June 10, 2009 12:29 PM
To: [email protected]
Subject: RE: [MarkLogic Dev 
General]element-value-queryvs.element-attribute-value-query behavior difference

Danny,

I executed both the cts:contains and the cts:search queries against the same 
data, these four documents that are in ML:

 *   <testNode insertDate="10JUN2009"/>
 *   <testNode insertDate="10JUN2009-0849"/>
 *   <testNode><insertDate>10JUN2009</insertDate></testNode>
 *   <testNode><insertDate>10JUN2009-0855</insertDate></testNode>

Here is the query I executed (with some XML to format the results nicely):



xquery version "1.0-ml";



let $queries := (

  cts:element-attribute-value-query(xs:QName("testNode"),

      xs:QName("insertDate"), "10JUN2009*"),

  cts:element-attribute-value-query(xs:QName("testNode"),

      xs:QName("insertDate"), "10JUN2009*", ("wildcarded", "case-sensitive",

      "punctuation-sensitive")),

  cts:element-value-query(xs:QName("insertDate"), "10JUN2009*"),

  cts:element-value-query(xs:QName("insertDate"), "10JUN2009*", ("wildcarded",

      "case-sensitive", "punctuation-sensitive"))

)



return <results>{

  for $i in (1 to fn:count($queries))

  return

    element {fn:concat("query_", $i)} {

      <contains_result>{

        cts:contains(/testNode, $queries[$i])

      }</contains_result>,

      <search_result>{

        cts:search(/testNode, $queries[$i])

      }</search_result>

    }

}</results>



The results returned are:



<results>

  <query_1>

    <contains_result>true</contains_result>

    <search_result />

  </query_1>

  <query_2>

    <contains_result>true</contains_result>

    <search_result />

  </query_2>

  <query_3>

    <contains_result>true</contains_result>

    <search_result>

      <testNode>

        <insertDate>10JUN2009</insertDate>

      </testNode>

    </search_result>

  </query_3>

  <query_4>

    <contains_result>true</contains_result>

    <search_result>

      <testNode>

        <insertDate>10JUN2009</insertDate>

      </testNode>

    </search_result>

  </query_4>

</results>



So as you can see, regardless of whether the options are specified (in my 
particular configuration), the cts:contains query against the attribute returns 
true but the cts:search query (using exactly the same inner query and running 
against exactly the same data), returns an empty sequence.



On the subject of the UID, it's all in a single attribute (I included the 
element version to show that the behavior was different).  The first part 
(before the hyphen) is always present, can take one of several formats, and may 
contain another hyphen in addition to letters and numbers (in reality the first 
part consists of two or three independent sub-parts, but from the perspective 
of the DB it can be considered a single string); the second part (after the 
hyphen) is optional-used only for revisions to an existing item-but follows a 
single format when it is present.  I'd be interested in knowing how you would 
use a range query in this situation.  Also note that the query string is being 
parsed from a more-or-less Google-like search box, and I can't guarantee that 
there won't be wildcards at the beginning or somewhere in the middle rather 
than just at the end.



Finally, I'm running MarkLogic Server 4.0-3.



Thanks for all your attempts,

Doug Glidden


________________________________
From: Danny Sokolsky [mailto:[email protected]]
Sent: Wednesday, June 10, 2009 13:52
To: General Mark Logic Developer Discussion
Subject: RE: [MarkLogic Dev 
General]element-value-queryvs.element-attribute-value-query behavior difference
Hi Doug,

That fact that your environment is showing different results from mine for the 
queries with no options illustrates my point: the defaults will change 
depending on your environment.  Notice that the queries that explicitly set the 
defaults return the same (the 2nd and 4th return true) in your environment and 
mine.

As for the cts:search results, what exactly is the query you ran to get those 
results?  It might be that the data I constructed in the cts:contains example 
does not exactly match your data?

And when you say the data represents a two-part string UID, is this value all 
in the same element or attribute?  Or are they in different 
elements/attributes?  If they are in a single value, then I think the 
range-queries can work for you.  If so, you will have to choose a collation 
that makes sense to you.

Also, what version of MarkLogic Server are you running?

-Danny
_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general

Reply via email to