Как вернуть результаты вместе с операциями обновления в BaseX?

Я узнал, что (insert/delete)-XQueries, выполняемые клиентом BaseX, всегда возвращают пустую строку. Я нахожу это очень запутанным или неинтуитивным.

Есть ли способ узнать, был ли запрос «успешным», без повторного запроса к базе данных (и с использованием потенциально ошибочной «транзитивной» логики, такой как «если я удалил узел, в XML должны быть узлы «oldNodeCount-1»)) ?


person Jan    schedule 30.04.2016    source источник
comment
почему вы не верите, что удаление или вставка будут успешными?   -  person Mads Hansen    schedule 01.05.2016
comment
Я не могу говорить за OP, но причина, по которой я никогда не хочу верить, что удаление или вставка будут успешными, и то, что я намеревался, - это годы горького опыта.   -  person C. M. Sperberg-McQueen    schedule 01.05.2016
comment
если, например, кортеж уже был удален до другой попытки удаления. Это может быть то, о чем вы хотите получить информацию. XQuery (выражение пути) просто возвращает пустую строку. Idk существует FLWOR-выражение, которое могло бы справиться с этим.. Хотя это может быть достигнуто с помощью некоторых if-then-else, безусловно, есть случаи, когда это не так просто.. на мой взгляд, это следует изменить.. даже целое число состояния было бы лучше, чем ничего не говорящая пустая строка   -  person Jan    schedule 01.05.2016


Ответы (1)


Операторы XQuery Update ничего не возвращают — так они определены. Но вы не единственный, кому не нравятся эти ограничения, и BaseX добавила два способа обойти это ограничение. ограничение:

Возврат результатов

По умолчанию невозможно смешивать разные типы выражений в результатах запроса. Самое внешнее выражение запроса должно быть набором обновляемых или необновляемых выражений. Но есть два выхода:

  • Специфическая для BaseX функция update:output() устраняет этот пробел: она кэширует результаты своей аргументы во время выполнения и возвращает их после обработки всех обновлений. В следующем примере выполняется обновление и возвращается сообщение об успешном выполнении:

    update:output("Update successful."), insert node <c/> into doc('factbook')/mondial
    
  • При выборе параметра MIXUPDATES все ограничения обновления будут отключены. Возвращаемые узлы будут скопированы до того, как они будут изменены путем обновления выражений. Ошибка возникает, если элементы возвращаются в выражении преобразования.

Если вы хотите изменить узлы в основной памяти, вы можете использовать выражение transform.

Выражение преобразования вам не поможет, так как вы, похоже, изменяете данные на диске. Включение MIXUPDATES позволяет одновременно обновлять документ и что-то возвращать, например, запускать что-то вроде

let $node := <c/>
return ($node, insert node $node into doc('factbook')/mondial)

MIXUPDATES позволяет вам вернуть что-то, что может быть дополнительно обработано. Результаты копируются перед возвратом. Если вы выполняете несколько операций обновления и не получаете ожидаемых результатов, убедитесь, что вы поняли концепцию список ожидающих обновлений.

Функция db:output() намеренно нарушает свой интерфейсный контракт: она определена как функция обновления (не имеющая никакого вывода), но в то же время она выводит некоторую информацию в информацию запроса. Вы не можете дальше обрабатывать эти результаты, но вывод может помочь вам отладить некоторые проблемы.

Список ожидающих обновлений

В обоих случаях вы не сможете получить немедленный результат от обновления, вы должны добавить что-то самостоятельно - и помните, что обновления не видны, пока не будет применен список ожидающих обновлений, т.е. . после завершения запроса.

Совместимость

Очевидно, что эти параметры специфичны для BaseX. Если вам настоятельно требуется совместимый и стандартный XQuery, вы не можете использовать эти выражения.

person Jens Erat    schedule 01.05.2016
comment
думаю этого будет достаточно. я посмотрю на это позже. благодарю вас - person Jan; 01.05.2016