Hi Helen,

You can use xdmp:modules-root() to give you the root of the App Server.  Then 
you can use fn:concat to make the string that combines the root and the module 
relative path.  Then you have to use that when constructing the string for your 
eval.

-Danny

From: [email protected] 
[mailto:[email protected]] On Behalf Of helen chen
Sent: Wednesday, July 07, 2010 7:41 AM
To: General Mark Logic Developer Discussion
Subject: Re: [MarkLogic Dev General] how to do multi-transaction in afunction

Hi Danny and Geert,

Thanks for all the helping. I almost made it work. The only thing I have here 
is: when I do the eval, I need to call a function in a module. The module file 
is really the same file that I'm building the xdmp:eval query, but I couldn't 
make eval know the current path this module is, so I have to specify the full 
path.
For example, I have module file at the path  /dev/newsci/helen.xqy , and then 
you can see I put full path    import module namespace 
oit=""http://www.aip.org/helen.xqy";;  at "/dev/newsci/helen.xqy"; in my 
xdmp:eval, this is going to be a problem because the app server's path on our 
production server will be different.

Does anyone know how I can make the path dynamic? or how to avoid this problem?


my code piece is like the following:

xquery version "1.0-ml";

module namespace oit = "http://www.aip.org/helen.xqy";;

declare function oit:mytest()
{
let $c1 := "http://py";
let $c2 := "http://mytest";
let $cvi := <cvi>
                    <coden>ABC</coden>
                    <volume>90</volume>
                    <issue>1</issue>
                </cvi>
let $oi-state := "PROD"
return
(
xdmp:eval('xdmp:document-insert("/aa.xml", <foo/>)')
,
xdmp:eval('xquery version "1.0-ml";
           declare variable $e1 as xs:string external;
           declare variable $e2 as xs:string  external;
           xdmp:document-set-collections( "/aa.xml", ($e1))
           ,
           xdmp:document-get-collections("/aa.xml")
           ,
           xdmp:document-add-collections( "/aa.xml", ($e2))'
          ,
          (xs:QName("e1"), $c1, xs:QName("e2"), $c2)

         )
,
xdmp:eval( 'xquery version "1.0-ml";
                   import module namespace oit=""http://www.aip.org/helen.xqy";; 
 at "/dev/newsci/helen.xqy";
                   declare variable $cvi as  element(cvi) external;
                   declare variable $state as xs:string  external;
                   oit:create-online-issue-table($cvi/coden/text(), 
$cvi/volume/text(), $cvi/issue/text(), $state)'
                   ,
                   (xs:QName("cvi"), $cvi, xs:QName("state"), $oi-state)
                )

)
};

then I call

oit:mytest()





On Jul 7, 2010, at 2:42 AM, Geert Josten wrote:


Hi Helen,

It is a subtle typo. It sometimes helps to take the query from inside the eval, 
and test it all by itself in CQ. If you do so, you see the same 'unexpected 
token' message as you would get when it is inside the eval, but you get a 
better focus on which line it concerns. In this case it concerns your external 
variable declarations. There should be no 'as' before the external keyword..

Kind regards,
Geert





drs. G.P.H. (Geert) Josten
Consultant

Daidalos BV
Hoekeindsehof 1-4
2665 JZ Bleiswijk

T +31 (0)10 850 1200
F +31 (0)10 850 1199

mailto:[email protected]
http://www.daidalos.nl/

KvK 27164984


De informatie - verzonden in of met dit e-mailbericht - is afkomstig van 
Daidalos BV en is uitsluitend bestemd voor de geadresseerde. Indien u dit 
bericht onbedoeld hebt ontvangen, verzoeken wij u het te verwijderen. Aan dit 
bericht kunnen geen rechten worden ontleend.


From: [email protected]
[mailto:[email protected]] On Behalf Of
Helen Chen
Sent: woensdag 7 juli 2010 4:03
To: General Mark Logic Developer Discussion
Subject: Re: [MarkLogic Dev General] how to do
multi-transaction in a function

Hi Danny,

it works with plain query. usually in my function I have some
variables and I need to use these variables for eval. I tried
the following and I couldn't make it work. Can you help me?

xquery version "1.0-ml";

declare function local:mytest()
{
let $c1 := "http://py";
let $c2 := "http://mytest";
return
(
xdmp:eval('xdmp:document-insert("/aa.xml", <foo/>)') ,
xdmp:eval('xquery version "1.0-ml";
          declare variable $e1 as external;
          declare variable $e2 as external;
          xdmp:document-set-collections( "/aa.xml", ($e1))
          ,
          xdmp:document-get-collections("/aa.xml")
          ,
          xdmp:document-add-collections( "/aa.xml", ($e2))'
         ,
         (xs:QName("e1"), $c1, xs:QName("e2"), $c2)

        )
,
xdmp:eval('xdmp:document-get-collections("/aa.xml")')
)
};

local:mytest()





On Jul 6, 2010, at 5:18 PM, Danny Sokolsky wrote:


     You need to make the updates happen in a separate
transaction and then make the get-collections happen in a
separate transaction that has a timestamp later than the
update.  One way to do that is by making them each do evals.
SOmething like:

     xquery version "1.0-ml";
     declare function local:mytest()
     {
     (
     xdmp:eval('xdmp:document-insert("/aa.xml", <foo/>)'),
     xdmp:eval('xdmp:document-set-collections( "/aa.xml",
("http://py";))
     ,
     xdmp:document-get-collections("/aa.xml")
     ,
     xdmp:document-add-collections( "/aa.xml", ("http://mytest";))')
     ,
     xdmp:eval('xdmp:document-get-collections("/aa.xml")')
     )
     };

     local:mytest()

     -Danny

     From: [email protected]
[mailto:[email protected]] On Behalf Of
helen chen
     Sent: Tuesday, July 06, 2010 2:03 PM
     To: General Mark Logic Developer Discussion
     Subject: [MarkLogic Dev General] how to do
multi-transaction in a function

     I want to do an update to a document and then see the
update immediately. I did a test like the following:
     I add a collection to a document, then try to get it,
within the same transaction I cannot see the new collection.
That means I have to be in the seperate transaction.

     declare function local:mytest()
     {
     (
     xdmp:document-set-collections( "/aa.xml", ("http://py";))
     ,
     xdmp:document-get-collections("/aa.xml")
     ,
     xdmp:document-add-collections( "/aa.xml", ("http://mytest";))
     ,
     xdmp:document-get-collections("/aa.xml")
     )
     };

     local:mytest()


     How can I make the last line
xdmp:document-get-collections("/aa.xml") as seperate
transaction so I can see the change?

     Thanks, Helen
     _______________________________________________
     General mailing list
     [email protected]
     http://developer.marklogic.com/mailman/listinfo/general




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

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

Reply via email to