Keith,

$etag-map can never be an empty sequence so I do not think that is what we are 
seeing here. To be certain, I have tried with function mapping turned on and 
off, and yet we still see the same issue. So I think we can rule that out.

I have tried to create a re-producible self-contained test case. Unfortunately 
when I start copying code into a single Main module all works as would be 
expected. Unfortunately this call-graph for this is across several modules, and 
trying to isolate it seems to make the problem vanish.


Thanks Adam.

-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Keith L. Breinholt
Sent: 19 June 2014 17:57
To: MarkLogic Developer Discussion
Cc: Sahay, Saurabh (RBI-UK)
Subject: Re: [MarkLogic Dev General] Evaluation of `declare variable` vs `let`

If your other variable $etag-map is the empty sequence you may have run into 
function mapping behavior.

Look for a good explanation of function mapping here: 
http://nelsonwells.net/2013/05/two-reasons-your-marklogic-code-is-failing-silently-part-2/

And here: http://docs.marklogic.com/guide/xquery/enhanced#id_55459

An easy way to know if function mapping is causing this behavior is to turn it 
off at the top of your module with this statement.

declare option xdmp:mapping "false";

Unless you understand all the intricacies of function mapping I highly suggest 
you turn it off.

As to the usage of declare vs. let I agree with Danny that it is mostly a 
matter of preference.

 The only distinguishing ... declare variables are lazily evaluated and let 
variables are executed in parallel unless a let variable's definition 
expression uses another let variable which will force sequential evaluation of 
any parent variables in the definition expression.

-Keith

-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Retter, Adam 
(RBI-UK)
Sent: Thursday, June 19, 2014 9:29 AM
To: MarkLogic Developer Discussion
Cc: Sahay, Saurabh (RBI-UK)
Subject: [MarkLogic Dev General] Evaluation of `declare variable` vs `let`

Given a main module with no user defined functions, is it considered better 
practice to use `declare variable` as opposed to `let`, the reason I ask is 
twofold:

1) I have started on a large code-base that seems to eschew `let` in favour of 
using `declare variable`. This seems somewhat strange to me.

2) We have seen different evaluation strategies, whereby a function which 
returns an empty-sequence which is bound in a declare variable clause, is never 
executed. Yet when we re-write that as a let binding, the code is executed. I 
think perhaps the query optimiser in ML is being too aggressive here?


For example -

declare variable $content-type as xs:string := 
slib:validated-bulk-load-content-type();

and then a few lines later we have -

slib:normal-bulk-load-response ($etag-map, fn:count 
($etag-map/store:etag-entry), $content-type)

Subsequently the `slib:normal-bulk-load-response` calls 
xdmp:set-response-content-type($content-type). However the 
`slib:validated-bulk-content-type()` function is never evaluated, we are 
certain of this because it eventually calls `fn:error`, yet the error never 
occurs!

If we switch the `declare variable $content-type` for a `let $content-type` 
then we do see the error occurring!

Cheers Adam.

DISCLAIMER
This message is intended only for the use of the person(s) ("Intended 
Recipient") to whom it is addressed. It may contain information, which is 
privileged and confidential. Accordingly any dissemination, distribution, 
copying or other use of this message or any of its content by any person other 
than the Intended Recipient may constitute a breach of civil or criminal law 
and is strictly prohibited. If you are not the Intended Recipient, please 
contact the sender as soon as possible.
Reed Business Information Limited. Registered Office: Quadrant House, The 
Quadrant, Sutton, Surrey, SM2 5AS, UK. 
Registered in England under Company No. 151537

_______________________________________________
General mailing list
[email protected]
https://urldefense.proofpoint.com/v1/url?u=http://developer.marklogic.com/mailman/listinfo/general&k=wlPCrglRP6kzT4RbABWMaw%3D%3D%0A&r=2FOxwjXkcRFP9Zb5gsGqutGbMyYaH6V5O1y2qyDOE%2Bw%3D%0A&m=I10j%2FLAEJ46Ln0PGkynObVI4344UZ9ymM1GdOCR3qJ4%3D%0A&s=bd54b2326bd1675b33cd525bc93f0d07e5f8ff9aae9a427ec8a593bfcafff7a6


 NOTICE: This email message is for the sole use of the intended recipient(s) 
and may contain confidential and privileged information. Any unauthorized 
review, use, disclosure or distribution is prohibited. If you are not the 
intended recipient, please contact the sender by reply email and destroy all 
copies of the original message.

_______________________________________________
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