Thank you Eric. I had also a similar kind of requirement however I was first retrieving full document from db and manipulating in the memory then replacing whole document and returning the document that is in the memory to API.
I will try this and see if it gives better performance. Though my document size is very small. Regards, Indy On Sat, Jul 18, 2015 at 2:43 AM, Erik Hennum <[email protected]> wrote: > Hi, Danny: > > Good that you puzzled it out. > > In case anyone is curious about the details, the solution would be similar > to: > > let $uri := "/some/text.xml" > return ( > xdmp:invoke-function(function () { > xdmp:node-replace(doc($uri)/some/path/text(), > text{'replacement'}) > }, > <options xmlns="xdmp:eval"> > <transaction-mode>update-auto-commit</transaction-mode> > </options> > ), > > xdmp:invoke-function(function () { > doc($uri) > }) > ) > > > Erik Hennum > > ------------------------------ > *From:* [email protected] [ > [email protected]] on behalf of Danny Sinang [ > [email protected]] > *Sent:* Friday, July 17, 2015 2:02 PM > *To:* MarkLogic Developer Discussion > *Subject:* Re: [MarkLogic Dev General] Displaying document after an update > > 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 > >
_______________________________________________ General mailing list [email protected] Manage your subscription at: http://developer.marklogic.com/mailman/listinfo/general
