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

Reply via email to