Ben Flowers
Ben Flowers

Reputation: 1554

JSONiq console.log or print

Is it possible to print to console for debugging purposes in a JSONiq/Zorba script?

e.g.

declare function utils:lowerCaseKey($obj as item) as item{
   print($obj)
  {|
    for $k in  distinct-values(keys( $obj ))
    return { lower-case($k) : $obj.$k } (: note the ',' to create a sequence :)
  |}
};

Upvotes: 1

Views: 166

Answers (1)

Ghislain Fourny
Ghislain Fourny

Reputation: 7279

Yes: the trace function serves this purpose. It can be called on any expression of which one needs to see the output, together with a label of your choice.

declare function utils:lowerCaseKey($obj as item) as item
{
  {|
    for $k in  distinct-values(keys( trace($obj, "obj") ))
    return { lower-case($k) : $obj.$k }
    (: note the ',' to create a sequence :)
  |}
};

This will cause output such as:

obj [1]: { "foo" : "bar" }
obj [2]: { "foo" : "bar2" }

Where exactly (on the command line, in a log file...) this output is sent should be documented in each engine. Zorba will by default output to stderr.

Note that this is a declarative language, so that trace behaves differently than print. Some expressions may be optimized away if not needed, in which case it generates no trace. For example,

(1, trace(2, "foo"))[1]

may not generate a trace. Likewise, the order in which traces are generated may be implementation-dependent, because JSONiq, like XQuery, leaves each engine the freedom how to evaluate best an expression, as long as its results conform to the specification.

Upvotes: 0

Related Questions