XQuery中的操作符"=> "是什么作用?

7
当我查找XQuery示例时,有时会看到使用运算符=>
我试图搜索它的含义,但是没有找到任何信息。由于我正在使用MarkLogic,它可能仅适用于MarkLogic,但我怀疑这一点。
从示例中,我知道它以某种方式将函数链接在一起,但我想知道正在发生什么。
以下是我找到的一些示例:
let $map := map:map()
  =>map:with("some-key",<info>45683</info>)
return <result>{$map}</result>

let $employees := op:from-view("main", "employees")
let $expenses  := op:from-view("main", "expenses")
let $totalexpenses  := op:col("totalexpenses")
return $employees
   => op:join-inner($expenses, op:on(
                    op:view-col("employees", "EmployeeID"),
                    op:view-col("expenses", "EmployeeID")))
   => op:group-by(op:view-col("employees", "EmployeeID"),
                 ("FirstName", "LastName", 
                  op:view-col("expenses", "Category"),
                  op:sum($totalexpenses, 
                  op:view-col("expenses", "Amount"))))
   => op:order-by(op:view-col("employees", "EmployeeID")) 
   => op:result() 
1个回答

9

这是箭头运算符,它允许你从外部提供函数调用的第一个参数。因此,如果你有一个函数调用foo($a, $b, $c),你可以等价地写成$a => foo($b, $c)。如果第一个参数是嵌套的函数调用,则此方法很方便:

string-join(reverse(tokenize(upper-case('a;b;c'), ';')), '_')

使用箭头运算符,可以将其写成漂亮的管道。

'a;b;c' => upper-case() => tokenize(';') => reverse() => string-join('_')

给定相同的输入,将得到相同的结果"C_B_A"

箭头操作符的一个缺点是,当想要一眼找出 XQuery 代码中函数调用引用哪个函数时,必须考虑它。如果您声明了两个函数 local:foo($seq) {...}local:foo($seq, $accum) {...},那么 $asdf => local:foo($x) 看起来像是调用单参数版本,但实际上是调用了双参数版本。


4
这也容易与感叹号运算符混淆,例如//x ! upper-case(.)。区别在于:(a) 感叹号运算符将RHS应用于LHS序列中的每个项目,(b) 你不能省略参数:注意upper-case(.)。此外,(c) 感叹号运算符可以在RHS上使用任何表达式,而箭头运算符只能使用函数调用。 - Michael Kay
有些人可能会将其识别为流畅编程中的方法链。请记住,在链接时,您将继续使用结果,因此自定义链接函数应返回可以链接的内容。光学功能是为此而设计的。它们都返回一个更改后的计划,可用于链接。这在MarkLogic Server的管理功能上也非常有效。 - grtjn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接