Isn't this code meant to be deployed? If the root option can't help, then how
can the code work in a deployment?
In the case you describe, I would invoke 'a/main.xqy' with the root set to
'/code/'. That means you have to calculate the relative path at invoke time,
but I don't see that as much of an obstacle.
xdmp:invoke(
'a/main.xqy',
(),
<options xmlns="xdmp:eval">
{
element root { '/tmp/code/' },
element static-check { true() }
}
</options>)
=>
()
Here is the directory layout I created:
$ for f in `find /tmp/code -name "*.xqy"`; do echo '(:' $f ':)' ; cat $f; echo;
done
(: /tmp/code/a/main.xqy :)
import module "urn:mod2" at "../imp.xqy";
import module "urn:mod2" at "/b/imp.xqy";
1
(: /tmp/code/b/imp.xqy :)
module namespace m="urn:mod2" ;
(: /tmp/code/imp.xqy :)
module namespace m="urn:mod2" ;
-- Mike
On 1 Mar 2012, at 23:27 , Alex Jitianu wrote:
> Hi,
>
> Thank you for taking the time to think about my problem. I am aware of the
> 'root' option but there are some cases where it can't help me. For example
> let's assume my modules root is '/code' and I open a module with the URI
> '/code/a/main.xqy'. This module has an import relative to that URI but also
> an import relative to the modules root :
>
> import module "urn:mod2" at "../imp.xqy";
> import module "urn:mod2" at "/b/imp2.xqy";
>
> How can I use xdmp:eval so that both modules "/code/imp.xqy" and
> "/code/b/imp2.xqy" are found by the server ? If I set 'root' to '/code' than
> "/code/b/imp2.xqy" import will be found but not the other. If I set 'root' to
> '/root/a' than the first import is found but not the second. I don't see any
> solution that will compensate for the missing URI information of the
> evaluated query ( '/code/a/main.xqy'). Am I missing something?
>
> Thanks,
> Alex
>
> On 3/1/2012 5:58 PM, Michael Blakeley wrote:
>> To resolve imports via xdmp:eval, set the 'root' option - just as you would
>> do to invoke a module. Take a look at how cq does it. The code is
>> Apache-licensed.
>>
>> If the imports aren't available on the server at all, you will have to make
>> them available. That is where the Modules database might come it. You could
>> use the server filesystem too, but using a database is cleaner. And you
>> would have to copy everything that your module(s) need.
>>
>> -- Mike
>>
>> On 1 Mar 2012, at 07:35 , Alex Jitianu wrote:
>>
>>> Hi,
>>>
>>> Unfortunately if a query is submitted through xdmp:eval you can't give a
>>> base URI for resolving any relative imports that that query might have. Or
>>> can you? So I kind of require a mix between xdmp:invoke and xdmp:eval. The
>>> "module URI"->"updated module content" mapping to be passed to the
>>> xdmp:invoke was my idea of such a mix. The server first looks for a module
>>> in the Modules database? And are you suggesting that I create a temporary
>>> structure in the Modules database in which the server will find my updated
>>> version of the modules before finding them in their real location?
>>>
>>> Thanks,
>>> Alex
>>>
>>> On 3/1/2012 5:12 PM, [email protected] wrote:
>>>> xdmp:eval has the static-check option too. You could send the module to it
>>>> as a string.
>>>>
>>>> Beyond that, the Modules database makes a dandy persistent uri->content
>>>> repository. You could have a hierarchy of temp files, perhaps something
>>>> like
>>>> /sync.ro/
>>>> .sessions/{$SESSION}/{$RELATIVE-PATH}. Use a scheduled task to clean out
>>>> anything older than N hours or days.
>>>>
>>>> -- Mike
>>>>
>>>>
>
_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general