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

Reply via email to