2016-05-13 2 views
3

Почему функция fn:last() не работает во время нереста?last() in incwned functions

Это не удалось:

xquery version "1.0-ml"; 
let $items := (1, 2, 3) 
return xdmp:spawn-function(function() { 
    $items[3 to fn:last()] 
}) 

Через некоторое время я отменить работу, потому что он ничего не делает.

Выход: Отменяя завершается с функцией индикации сообщения должна быть остановлена ​​вручную.

Это работает просто отлично:

xquery version "1.0-ml"; 
let $items := (1, 2, 3)[3 to fn:last()] 
return xdmp:spawn-function(function() { 
    $items 
}) 

Выход: запрос успешно

+0

«Failed» на самом деле не является разумным описанием проблемы. Как это произошло, есть ли сообщение об ошибке? –

+0

Первый возвращает XDMP-MEMORY на моем конце. Я считаю, что стоит отметить ошибку в поддержке MarkLogic. Нужна помощь с этим? – grtjn

+0

В этом случае я сообщу об этом. Благодарю. – chriskelly

ответ

4

Пример завершен для Документов fn:last() показывает очень сходный использование этой функции. Недостатком использования функций в предикатах является то, что они оцениваются для каждого элемента в последовательности. Использование fn:subsequence и необязательно fn:count оба должны быть более эффективными, и миновать ваш вопрос:

let $items := (1, 2, 3) 
return xdmp:spawn-function(function() { 
    xdmp:log(subsequence($items, 3, count($items))) (: you can omit 3rd param with same effect :) 
}) 

HTH!

+0

Это решит мою проблему точно. Я сообщу об этом в любом случае, так как это неожиданное поведение. Благодаря! – chriskelly