2015-06-30 5 views
0

В моем веб-приложении вся страница поиска написана в XQuery. Запрос не просто находит и отображает результаты, но также записывает поисковый запрос в файл протокола (в eXist db это возможно с помощью функции file:serialize).XQuery: вернуть что-то до завершения запроса

Однако может случиться так, что запись протокола занимает некоторое время. И, конечно, на эту задержку не должно влиять пользователь. Итак, я хотел бы сначала выводить результаты поиска, а затем обновлять протокол.

Я пытался поставить функцию протокола после возвращения содержания, как: (. Функция localfunction:write_protocol() всегда возвращает пустую последовательность ())

return $search_results,localfunction:write_protocol() 

Но это не работает , Содержимое $search_results выводится только после завершения localfunction:write_protocol().

Есть ли что-нибудь, что я могу здесь сделать? (Я знаю, такие вещи проблематичны и на более процессуальных языках, таких как PHP.)

+1

Если я правильно понимаю, это не совсем специфично для XQuery. Вы можете разделить свою страницу на два запроса, сначала вернуть быстрый, а вторую страницу - через AJAX. – wst

ответ

0

Вместо того, чтобы писать внешний файл, вы могли бы записать соответствующие данные протокола в коллекцию в базе данных?

Затем вы можете использовать триггер XQuery для обработки этой коллекции и записи данных во внешний файл.

Существует также опция настраиваемого файла журнала с использованием утилиты: log-app.

+0

Несомненно, запись записей протокола в базу данных вместо внешнего файла возможна и, возможно, даже более удобна. Однако проблема остается прежней: XQuery вернет результаты поиска только после завершения выполнения. Таким образом, пользователю придется дождаться записи протокола в базу данных, прежде чем он увидит результаты своего поиска. – cis

2

Я бы предложил использовать модуль Scheduler в eXist, чтобы запланировать задачу XQuery для записи файла протокола. Модуль планировщика предоставляет несколько функций XQuery, которые можно использовать из основного запроса для планирования подзадачи; Затем это будет выполнено асинхронно с остальной частью вашего запроса.

Смежные вопросы