Execution Context in MarkLogic

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:

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:

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!:

/code/cutlass/test/

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

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

But this is all I ever got:

/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. :)