[MarkLogic Dev General] simple cts constructor for variable check
Michael Blakeley
mike at blakeley.com
Mon Apr 16 09:18:30 PDT 2012
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-bounces at developer.marklogic.com
> [mailto:general-bounces at 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 at developer.marklogic.com
>> http://developer.marklogic.com/mailman/listinfo/general
>
> _______________________________________________
> General mailing list
> General at developer.marklogic.com
> http://developer.marklogic.com/mailman/listinfo/general
>
> _______________________________________________
> General mailing list
> General at developer.marklogic.com
> http://developer.marklogic.com/mailman/listinfo/general
>
More information about the General
mailing list