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
