Execution Context in MarkLogic

| Comments

Have you ever needed to know the location of the actual file that houses the code that’s currently executing? Well, if you have then you’re not alone. I have been there myself. The answer might not be as interesting as some of life’s deeper mysteries unveiled, but I was excited about it nonetheless.

This information seems especially useful in cases where an absolute path to the code is required but you want to avoid hard-coding context information into your app. Your app really shouldn’t care where it is deployed to afterall. My love for Django increased when I discovered os.path.dirname(file). Here’s an equivalent goody in MarkLogic.

If I have the following directory structure:

1
2
3
4
code
  cutlass
   test
    unit.xqy

And I want to find the context of my unit.xqy from within the unit.xqy code as it’s executing, I can call this:

1
fn:concat(xdmp:modules-root(), fn:substring(xdmp:get-request-path(), 2))

What’s happening?

  • xdmp:modules-root() points to the Modules DB (which happens to be where the code is running). This also works if you’re running modules on the filesystem.
  • xdmp:get-request-path() is giving you path from your domain root
  • The substring is to strip the / (slash) prepended to the request path, because the modules-root also ends with a slash

Finally, that line of code yields the full path to the context of execution, boom!:

1
/code/cutlass/test/

As a side note to the above solution, I was thinking from this MarkMail thread that this would work:

1
 resolve-uri(".", xdmp:get-request-path())

But this is all I ever got:

1
/test/

Anyone know what I was doing wrong?

Well, it’s good to know where you came from, why you are here, and where you are going – in many contexts, I guess. :)

Comments