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#xdmp: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
