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
