Never mind ... figured it out. The app was hanging because I had a query to the same document just before the xdmp:invoke-function which updates the same document.
I've now placed that initial query inside xdmp:invoke-function as well. On Fri, Jul 17, 2015 at 4:16 PM, Danny Sinang <[email protected]> wrote: > Hi Erik, > > I got this error when I ran the code below : > > XDMP-UPEXTNODES: > xdmp:node-replace(fn:doc("/release-tracking/components/2.xml")/component/environments/environment[2], > <environment><name>QA</name><version>9</version><version-date>2015-07-17T16:0...</environment>) > -- Cannot update external nodes > > *xdmp:invoke-function* ( > *function* () { > *xdmp:node-replace*(*$environment*, > *$new-environment*) > }, > <options *xmlns*=*"xdmp:eval"*> > <transaction-mode>update-auto-commit > </transaction-mode> > </options> > ) > > > So I did this instead : > > xdmp:invoke-function ( > function () { > let $component := fn:doc > ($component-uri)/node() > let $environment := > $component/environments/environment[name eq $environment-name] > let $new-environment := element > environment { > for $elem in > $environment/child::* > return > switch > ($elem/name()) > case > "version" return <version>{$new-version-number}</version> > case > "version-date" return <version-date>{fn:current-dateTime()}</version-date> > > default return $elem > } > return > xdmp:node-replace($environment, > $new-environment) > }, > <options xmlns="xdmp:eval"> > > <transaction-mode>update-auto-commit</transaction-mode> > </options> > ) > > > but the app just hung. > > If I go with the code below (which uses xdmp:spawn-function), the > node-replace works, but the document displayed is the one before the update > was applied. > > *let **$_* := > *xdmp:spawn-function* ( > *function* () { > *let **$component* := *fn:doc* ( > *$component-uri*)/*node*() > *let* *$environment* := > *$component*/*environments*/*environment*[*name* eq *$environment-name*] > *let* *$new-environment* := > *element* *environment* { > *for * > *$elem* *in **$environment*/child::* > > *return* > > *switch* (*$elem*/*name*()) > > *case *"version" *return *<version>{*$new-version-number*}</version> > > *case *"version-date" *return *<version-date>{*fn:current-dateTime*()} > </version-date> > > *default* *return **$elem* > } > *return* > *xdmp:node-replace*( > *$environment*, *$new-environment*) > }, > <options *xmlns*=*"xdmp:eval"*> > <transaction-mode> > update-auto-commit</transaction-mode> > > <result>{*fn:true*()}</result> > > </options> > ) > *return* > *xdmp:invoke-function* ( > *function* () { > *fn:doc*(*$component-uri*) > } > ) > > Of course, this is likely due to xdmp-spawn-function running off the Task > Server, not the current app server. > > But then, how do I get xdmp:invoke-function to work ? > > Regards, > Danny > > On Fri, Jul 17, 2015 at 2:12 PM, Erik Hennum <[email protected]> > wrote: > >> Hi, Danny: >> >> One technique is to execute xdmp:eval(), xdmp:invoke(), or >> xdmp:invoke-function() in separate transactions to write and read the >> result. >> >> The main routine is the choreographer for the write and read requests and >> can keep program state. >> >> Using inline functions and closures, xdmp:invoke-function() is especially >> convenient. >> >> >> Hoping that helps, >> >> >> Erik Hennum >> >> ------------------------------ >> *From:* [email protected] [ >> [email protected]] on behalf of Danny Sinang [ >> [email protected]] >> *Sent:* Friday, July 17, 2015 10:51 AM >> *To:* general >> *Subject:* [MarkLogic Dev General] Displaying document after an update >> >> I need to display a document right after a call to xdmp:node-replace() >> is made, and I'm able to achieve this by using a semi-colon to place them >> in separate transactions. >> >> *xdmp:node-replace*(*$environment*, >> *$new-environment*); >> >> >> *fn:doc*("/release-tracking/components/2.xml" >> ) >> >> Problem is, only the first transaction has enough data to derive the URI >> of the document to be displayed. >> >> Thus my hardcoding the path in the second transaction. >> >> Is there a way to pass this URI from the first to the second transaction ? >> >> Or is there another / better way of displaying the doc after the update ? >> >> Regards, >> >> Danny >> >> >> >> >> >> _______________________________________________ >> General mailing list >> [email protected] >> Manage your subscription at: >> http://developer.marklogic.com/mailman/listinfo/general >> >> >
_______________________________________________ General mailing list [email protected] Manage your subscription at: http://developer.marklogic.com/mailman/listinfo/general
