Thanks everyone for your input on this.

I ended up separating my code into two transactions using semicolons.

I have to loop through the same data twice, but it's a very small loop so not a 
big deal.

So rather than:

let $var ...
for ...
where ...
return
                let $a ...
               let $b ...
                let $save := saveFunction($param)
                return ($a, anotherFunction($b)...)

I now have:

(: This loop creates the document(s) :)
let $var ...
for ...
let $a ...
let $b ...
let $save := saveFunction($param)
where ...
return $save;

(: This loop uses the documents :)
let $var ...
for ...
let $a...
let $b...
where ...
return ($a, anotherFunction($b)...);

Thanks much,

-Chad

From: [email protected] 
[mailto:[email protected]] On Behalf Of David Lee
Sent: Tuesday, April 16, 2013 3:16 PM
To: MarkLogic Developer Discussion
Subject: Re: [MarkLogic Dev General] Document insert

semicolons (;) can be useful too.
But the important part is to realize you will never "see" document updates in 
the same transaction.
XQuery life is "frozen in time" to the point of the start of the query so all 
code "sees" the same view of the database until a transaction is complete.

(This is different than typical RDBMS transactions where you will see changes 
made on the same connection in an open transaction)

-----------------------------------------------------------------------------
David Lee
Lead Engineer
MarkLogic Corporation
[email protected]<mailto:[email protected]>
Phone: +1 812-482-5224
Cell:  +1 812-630-7622
www.marklogic.com<http://www.marklogic.com/>

From: 
[email protected]<mailto:[email protected]>
 [mailto:[email protected]] On Behalf Of Dave Cassel
Sent: Tuesday, April 16, 2013 4:13 PM
To: MarkLogic Developer Discussion
Subject: Re: [MarkLogic Dev General] Document insert

For more details, the Understanding Transactions 
chapter<http://docs.marklogic.com/guide/app-dev/transactions#chapter> of the 
Application Developer's Guide is a good resource. What you'll probably need to 
do is have saveFunction run in an eval statement as a separate transaction.

David Cassel
Vanguard Technical Manager
MarkLogic<http://www.marklogic.com>


From: David Lee <[email protected]<mailto:[email protected]>>
Reply-To: MarkLogic Developer Discussion 
<[email protected]<mailto:[email protected]>>
Date: Tuesday, April 16, 2013 3:03 PM
To: MarkLogic Developer Discussion 
<[email protected]<mailto:[email protected]>>
Subject: Re: [MarkLogic Dev General] Document insert

saveFunction and anotherFunction are run in the same transaction so 
anotherFunction will not "see" the new document until you commit the 
transaction.


-----------------------------------------------------------------------------
David Lee
Lead Engineer
MarkLogic Corporation
[email protected]<mailto:[email protected]>
Phone: +1 812-482-5224
Cell:  +1 812-630-7622
www.marklogic.com<http://www.marklogic.com/>


From: 
[email protected]<mailto:[email protected]>
 [mailto:[email protected]] On Behalf Of Chad Bishop
Sent: Tuesday, April 16, 2013 2:57 PM
To: [email protected]<mailto:[email protected]>
Subject: [MarkLogic Dev General] Document insert

Greetings,

I have the following situation:

let $var ...
for ...
where ...
return
                let $a ...
                let $b ...
                let $save := saveFunction($param)
                return ($a, anotherFunction($b)...)

That saveFunction is inserting a document...or supposed to.

What I've found is it doesn't actually insert the document unless I:

return $save

Why is that?  It matters in this situation because anotherFunction() depends on 
the document existing.

Thank you for any help,

-Chad
_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general

Reply via email to