Sachin Kainth
Sachin Kainth

Reputation: 46750

Pass a map to External function

I have the following module

xquery version "1.0-ml";

declare variable $datasets as map:map external;

...

I want to call this so I do an xdmp:invoke like this

...
let $update := xdmp:invoke("/app/lib/my-module.xqy", (xs:QName("datasets"), $map),   <options xmlns="xdmp:eval">
              <modules>{xdmp:modules-database()}</modules>
            </options>)
...

$map is of type map:map.

Running this gives me the following error

[1.0-ml] XDMP-ARG: xdmp:invoke("/app/lib/20140527-0916-copy-y-axis-labels-from-chart-to-dataset-...", fn:QName("", "datasets"), <options xmlns="xdmp:eval"><modules>0</modules></options>) -- Invalid argument

Why is that?

Upvotes: 1

Views: 674

Answers (1)

joemfb
joemfb

Reputation: 3056

It's hard to know for sure from the limited code samples you've posted, but I think that your $map variable is bound to the empty sequence (the rough analogue of null in XPath/XQuery).

I've created the following main module, that simply returns the external variable $datasets:

xquery version "1.0-ml";
declare variable $datasets as map:map external;
$datasets

Invoking it as follows works correctly:

let $map := map:entry("key", "value")
return
  xdmp:invoke("/test.xqy",
    (xs:QName("datasets"), $map),
      <options xmlns="xdmp:eval">
        <modules>{xdmp:modules-database()}</modules>
      </options>)

This results in the "invalid argument" error:

let $map := ()
return
  xdmp:invoke("/test.xqy",
    (xs:QName("datasets"), $map),
      <options xmlns="xdmp:eval">
        <modules>{xdmp:modules-database()}</modules>
      </options>)

XQuery flattens sequences (they don't nest like s-expressions), so when $map is the empty sequence, the <options/> element becomes the value of the $datasets param, which is an invalid value for the external variable.

Update: Doh! @mblakele's comments below explain the error conditions ...

TL;DR: () is not an instance of map:map.

Upvotes: 2

Related Questions