Hi Helen, David, Import statements within eval expressions start looking for files from modules-root as specified in the app server. You need xdmp:get-request-path to make it work, there are currently no alternatives, except passing in the request path as an external var when calling the xdbc server.
Xdmp:apply and xdmp:invoke are indeed the best alternatives for relative paths, but the xdmp:apply doesn't make the function run in a separate transaction. I personally dislike having many main modules, but unless you are willing to send the request path as external var yourself there are only little alternatives.. Kind regards, Geert > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of > Lee, David > Sent: donderdag 8 juli 2010 21:46 > To: General Mark Logic Developer Discussion > Subject: Re: [MarkLogic Dev General] how to do > multi-transaction in afunction > > You are right, I think. > Inside eval it starts from scratch. > Maybe this can help ???? > > http://developer.marklogic.com/pubs/4.1/apidocs/Ext-8.html#xdm > p:function > -module > > > If you can get ahold of a function thats already imported > maybe you can find its path and pass that to eval. > > > > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of > helen chen > Sent: Thursday, July 08, 2010 3:19 PM > To: General Mark Logic Developer Discussion > Subject: Re: [MarkLogic Dev General] how to do > multi-transaction in afunction > > Hi David, > > Maybe my test was not right. I feel inside xdmp:eval, it does > not know the caller module's path, inside eval, the path > start from app server root. I'll do another test again and > see if I can get relative path. > > Thanks, Helen > > On Jul 8, 2010, at 2:44 PM, Lee, David wrote: > > > There's probably a way ! > > But what I do in similar cases is use relative paths > > > > import module namespace="mine" at "../../common/module.xqy" ; > > > > > > > > > > -----Original Message----- > > From: [email protected] > > [mailto:[email protected]] On Behalf Of helen > chen > > Sent: Thursday, July 08, 2010 2:41 PM > > To: General Mark Logic Developer Discussion > > Subject: Re: [MarkLogic Dev General] how to do multi-transaction in > > afunction > > > > Hi David, > > > > our path is two part: > > > > first path is the app server root, like /data/marklogic, this one I > can > > use xdmp:modules-root( ) to get it > > > > for second part, (this is where the marklogic path start), > usually we > > put code under newsci/helen.xqy, but for our dev machine or test > > machine, we prefix the path with /dev/ or /test, so the path may be > > /dev/newsci/helen.xqy or /test/newsci/helen.xqy. > > > > if I use xdmp:eval, I need to create xqy string. when I do > an import, > > it will be like import module namespace > > oit=""http://www.aip.org/helen.xqy"; at > "/dev/newsci/helen.xqy"; but > > in production, it will be import module namespace > > oit=""http://www.aip.org/helen.xqy"; at "/newsci/helen.xqy"; > > > > I don't know how to get the path "/dev/newsci/" or just "/newsci/" > > dynamically, and I don't want to do any hardcode like /dev or /test. > > > > > > Thanks, Helen > > > > > > On Jul 8, 2010, at 2:20 PM, Lee, David wrote: > > > >> xdmp:get-request-path() wont return anything for XDBC connections > > (only > >> HTTP). > >> > >> You can use : > >> > >> xdmp:modules-root( ) as xs:string > >> > >> > > > http://developer.marklogic.com/pubs/4.1/apidocs/Ext-7.html#xdm > p:modules- > >> root > >> > >> To get the root path for modules from XDBC > >> > >> > >> ---------------------------------------- > >> David A. Lee > >> Senior Principal Software Engineer > >> Epocrates, Inc. > >> [email protected] > >> 812-482-5224 > >> > >> > >> > >> > >> > >> > >> > >> -----Original Message----- > >> From: [email protected] > >> [mailto:[email protected]] On Behalf Of helen > > chen > >> Sent: Wednesday, July 07, 2010 5:04 PM > >> To: General Mark Logic Developer Discussion > >> Subject: Re: [MarkLogic Dev General] how to do > multi-transaction in > >> afunction > >> > >> Hi Danny and Geert, > >> > >> I'm using xdbc server, the xdmp:get-request-path() does > not seem to > >> return value for me. And also both of our module root path and > module > >> path can be different with prefix for different server, if I build > the > >> module path string, I have to hardcode some part of path. > Finally I > >> figured out to change xdmp:eval to be xdmp:invoke, and I > put the code > >> for eval into another file. This way the xdmp:invoke can > use relative > >> module path and I don't need to hardcode anything. > >> > >> Let me know if you see anything wrong with my idea. Thanks for all > > the > >> help. > >> > >> Helen > >> > >> > >> On Jul 7, 2010, at 12:04 PM, Geert Josten wrote: > >> > >>> Hi Helen, > >>> > >>> I think you are looking for fn:resolve-uri(".", > >> xdmp:get-request-path()).. > >>> > >>> Kind regards, > >>> Geert > >>> > >>>> -----Original Message----- > >>>> From: [email protected] > >>>> [mailto:[email protected]] On > Behalf Of helen > >>>> chen > >>>> Sent: woensdag 7 juli 2010 16:41 > >>>> 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 > >> > >> _______________________________________________ > >> 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 > > _______________________________________________ > > 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 > _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
