Unless I'm missing something, you shouldn't need the eval. Constructors for 
cts:query are already fully composable. See the if-then-else expression that I 
outlined below.

-- Mike

On 16 Apr 2012, at 09:04 , Gary Larsen wrote:

> I'm worried about scalability in a large database and other xquery
> conversions have really increased performance.
> 
> What I'm trying now is to build the cts query string dynamically where I can
> use 'if then else' to add the necessary cts syntax, and then do xdmp:eval()
> on the string in cts:search.
> 
> A simple test seemed to work ok. Does that make sense?
> 
> Gary 
> 
> -----Original Message-----
> From: general-boun...@developer.marklogic.com
> [mailto:general-boun...@developer.marklogic.com] On Behalf Of Michael
> Blakeley
> Sent: Monday, April 16, 2012 11:53 AM
> To: MarkLogic Developer Discussion
> Subject: Re: [MarkLogic Dev General] simple cts constructor for variable
> check
> 
> The quick answer is something like:
> 
>  if ($oc) then () else cts:element-value-query(xs:QName(nv:objectClass),
> $oc)
> 
> When $oc is empty, there is no need to include that query term at all. So it
> can be empty too.
> 
> However, the long answer is that converting an XPath expression to cts:query
> won't necessarily improve performance. If you don't need composability or
> relevance ranking, you might as well stick with XPath.
> 
> But trying to express an XPath as a cts:query can be a useful exercise,
> because anything that won't map easily is likely to be expensive and
> anything that can be expressed in cts:query is likely to be efficient. It is
> tricky to say exactly what is going on without profiler output, but I
> imagine that the expensive bits of your XPath are probably the nested steps.
> For example:
> 
>  $oc = nv:lookupInfo/nv:objectClass
> 
>  nvdiff:diff/nv:content/nv:crnData8[nv:policies or nv:members]
> 
> Wherever possible you want to rearrange the XPath steps so that they are
> searchable and flat. Here's a slightly more efficient version:
> 
>  xdmp:directory("/db/netvisn/audit_history/", "infinity")/
>    nv:auditHistory[not($oc) or $oc = nv:lookupInfo/nv:objectClass]/
>    nv:audit[
>       $effect ne "spec" or nv:sync/nv:archived]
>      [$effect ne "security" or
>       nvdiff:diff/nv:content/nv:crnData8/(nv:policies | nv:members)]
> 
> -- Mike
> 
> On 16 Apr 2012, at 08:21 , Gary Larsen wrote:
> 
>> Hi
>> 
>> I'm trying to convert a query to use cts for performance.  Is there a cts
> constructor that I can use the check a variable?
>> 
>> Here's a portion of the query:
>> 
>>       xdmp:directory('/db/netvisn/audit_history/','infinity')
>>              /nv:auditHistory
>>                     [fn:not(fn:exists($oc)) or $oc =
> nv:lookupInfo/nv:objectClass]
>>              /nv:audit
>>                     [$effect ne 'spec' or nv:sync/nv:archived]
>>                     [$effect ne 'security'
> ornvdiff:diff/nv:content/nv:crnData8[nv:policies or nv:members]]
>> 
>> 
>> For example I would like to turn this portion into a cts:or-query
> 
>> 
>>                $effect ne 'spec' or nv:sync/nv:archived
>> 
>> For second part I can use a cts:element-value-query().  I need something
> for the first part.
>> 
>> Or maybe I'm looking at this all wrong.  Thanks for any suggestions.
>> 
>> Gary
>> 
>> _______________________________________________
>> General mailing list
>> General@developer.marklogic.com
>> http://developer.marklogic.com/mailman/listinfo/general
> 
> _______________________________________________
> General mailing list
> General@developer.marklogic.com
> http://developer.marklogic.com/mailman/listinfo/general
> 
> _______________________________________________
> General mailing list
> General@developer.marklogic.com
> http://developer.marklogic.com/mailman/listinfo/general
> 

_______________________________________________
General mailing list
General@developer.marklogic.com
http://developer.marklogic.com/mailman/listinfo/general

Reply via email to