Hi Ron,<div><br></div><div>Thanks. </div><div><br></div><div>I have element range indexes for userId and productId now, but I&#39;m not sure I explained well what I needed.</div><div><br></div><div>I&#39;m trying to get :</div>

<div><br></div><div>1. all the unique userId&#39;s of users who have registrations for particular books. </div><div>2. all the unique userId&#39;s of users whose book registrations have not expired yet.</div><div><br></div>

<div>Each user is represented like this :</div><div><br></div><div>&lt;user&gt;</div><div>    &lt;userId&gt;12345&lt;/userId&gt;</div><div>    ...</div><div>    &lt;registeredBooks&gt;</div><div>                    &lt;registration&gt;</div>

<div>                             &lt;productId&gt;ABCDEFG&lt;/productId&gt;</div><div>                             &lt;startDate&gt;&lt;/startDate&gt;</div><div>                             &lt;endDate&gt;&lt;/endDate&gt;</div>

<div>                             ...</div><div>                    &lt;/registration&gt;</div><div><div><br></div><div>                    &lt;registration&gt;</div><div>                             &lt;productId&gt;TUVWXY&lt;/productId&gt;</div>

<div>                             &lt;startDate&gt;&lt;/startDate&gt;</div><div>                             &lt;endDate&gt;&lt;/endDate&gt;</div><div>                             ...</div><div>                    &lt;/registration&gt;</div>

</div><div>    &lt;/registeredBooks&gt;</div><div>&lt;/user&gt;</div><div><br></div><div>As you can see, a user can have more than 1 book registration, and he can also have more than 1 book registration for the same book (i.e. his previous registration expired and he bought some more time to read it again).</div>

<div><br></div><div>So given the above business rules, my queries (to give me all users who registered for specific books) can return the same userId more than once. That&#39;s why I need to get the distinct values of the userId&#39;s returned.</div>

<div><br></div><div>The queries I showed earlier (simplified versions of the actual query) work fast but don&#39;t eliminate the duplicate userId&#39;s returned by the queries.</div><div><br></div><div>Your suggested query returns the unique userId&#39;s in the index, but not the unique userId&#39;s returned by the query.</div>

<div><br></div><div>I&#39;m pretty new to cts stuff so I&#39;d really appreciate all the assistance I could get. First off, how do I express in cts the query <font color="#ff0000">/user[registeredBooks/registration/productId=$myBooks]/userId</font> ? Next,  how do I get the distinct userId&#39;s returned ?</div>

<div><br>Regards,<br>Danny</div><div><br><div class="gmail_quote">On Sat, Aug 4, 2012 at 7:46 AM, Ron Hitchens <span dir="ltr">&lt;<a href="mailto:ron@ronsoft.com" target="_blank">ron@ronsoft.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
   Put an element range index on both userId and productId.<br>
Then you can do (also untested):<br>
<br>
    fn:count (cts:element-values (xs:QName(&quot;userId&quot;), (), (),<br>
       cts:element-value-query (xs:QName(&quot;productId&quot;), $myBooks, &quot;exact&quot;)))<br>
<br>
   This fn:count should be fast because it will only count the<br>
values in the range index (those that survive the filter that<br>
selects matching productId&#39;s, which can be resolved from the<br>
range index on productId).<br>
<br>
   The slowdown comes when a query cannot answer the question<br>
you&#39;re asking from the indexes and has to look inside the documents<br>
to test the values.  Range indexes store the unique values in the<br>
index and correlate them back to the fragment those values occur in.<br>
<br>
   Just be careful that you define the proper type when creating<br>
the element range indexes and that you provide the same collation<br>
if the indexes are strings.<br>
<br>
   You may also get a boost from creating appropriate dateTime<br>
range indexes and applying similar filter queries for those.<br>
<br>
On Aug 4, 2012, at 11:28 AM, David Lee wrote:<br>
<br>
&gt; Untested Suggestion.<br>
&gt; Put userId into a element range index then use   estimate (cts:values())<br>
&gt;<br>
&gt;<br>
&gt; -----------------------------------------------------------------------------<br>
&gt; David Lee<br>
&gt; Lead Engineer<br>
&gt; MarkLogic Corporation<br>
&gt; <a href="mailto:dlee@marklogic.com">dlee@marklogic.com</a><br>
&gt; Phone: <a href="tel:%2B1%20650-287-2531" value="+16502872531">+1 650-287-2531</a><br>
&gt; Cell:  <a href="tel:%2B1%20812-630-7622" value="+18126307622">+1 812-630-7622</a><br>
&gt; <a href="http://www.marklogic.com" target="_blank">www.marklogic.com</a><br>
&gt;<br>
&gt; This e-mail and any accompanying attachments are confidential. The information is intended solely for the use of the individual to whom it is addressed. Any review, disclosure, copying, distribution, or use of this e-mail communication by others is strictly prohibited. If you are not the intended recipient, please notify us immediately by returning this message to the sender and delete all copies. Thank you for your cooperation.<br>


&gt;<br>
&gt; From: <a href="mailto:general-bounces@developer.marklogic.com">general-bounces@developer.marklogic.com</a> [mailto:<a href="mailto:general-bounces@developer.marklogic.com">general-bounces@developer.marklogic.com</a>] On Behalf Of Danny Sinang<br>


&gt; Sent: Friday, August 03, 2012 10:38 PM<br>
&gt; To: general<br>
&gt; Subject: [MarkLogic Dev General] xdmp:estimate() and fn:distinct-values()<br>
&gt;<br>
&gt; Hello,<br>
&gt;<br>
&gt; The query below runs quite fast (i.e. below 1 second).<br>
&gt;<br>
&gt; let $totalCount := xdmp:estimate(/user[reg/productId=$myBooks]/userId)<br>
&gt; let $numUnexpired := xdmp:estimate(/user[reg[productId=$myBooks and (endDate = 0 or endDate &gt;= $current-epoch-time)]]/userId)<br>
&gt; return ($totalCount, $numUnexpired, xdmp:elapsed-time())<br>
&gt;<br>
&gt; Problem is, what I really need is to get the number of distinct values of &quot;userId&quot;.<br>
&gt;<br>
&gt; Doing xdmp:estimate(fn:distinct-values()) results in in XDMP:UNSEARCHABLE error.<br>
&gt;<br>
&gt; Using fn:count() instead of xdmp:estimate() works, but takes so long (i.e. 30 seconds).<br>
&gt;<br>
&gt; Is there a workaround for this ?<br>
&gt;<br>
&gt; Regards,<br>
&gt; Danny<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; General mailing list<br>
&gt; <a href="mailto:General@developer.marklogic.com">General@developer.marklogic.com</a><br>
&gt; <a href="http://developer.marklogic.com/mailman/listinfo/general" target="_blank">http://developer.marklogic.com/mailman/listinfo/general</a><br>
<br>
---<br>
Ron Hitchens {mailto:<a href="mailto:ron@ronsoft.com">ron@ronsoft.com</a>}   Ronsoft Technologies<br>
     <a href="tel:%2B44%207879%20358%20212" value="+447879358212">+44 7879 358 212</a> (voice)          <a href="http://www.ronsoft.com" target="_blank">http://www.ronsoft.com</a><br>
     <a href="tel:%2B1%20707%20924%203878" value="+17079243878">+1 707 924 3878</a> (fax)              Bit Twiddling At Its Finest<br>
&quot;No amount of belief establishes any fact.&quot; -Unknown<br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
General mailing list<br>
<a href="mailto:General@developer.marklogic.com">General@developer.marklogic.com</a><br>
<a href="http://developer.marklogic.com/mailman/listinfo/general" target="_blank">http://developer.marklogic.com/mailman/listinfo/general</a><br>
</blockquote></div><br></div>