2014-09-04 4 views
0

MarkLogic 7, Windows 7.MarkLogic - xdmp: Eval порождает ошибки, такие как «недопустимые опции узла»

Я пытаюсь написать XQUERY изменить идентификаторы URI документов (локальная версия ML) с помощью xdmp:load и xdmp:delete работает в одной транзакции.

Я, наконец, решил использовать xdmp:eval. Что порождает ошибку?

кода следующим образом: -

for $SrcFileNode in xdmp:directory("/Abstracts/", "infinity") [position() lt 10] 
(: get filename from path string :) 
let $Filename := (if (fn:contains(fn:document-uri($SrcFileNode),".zip/")) 
        then fn:substring-after(document-uri($SrcFileNode),".zip/") 
        else fn:substring-after(document-uri($SrcFileNode),"Loadrecords/") 
       ) 

(: create new URI would "document{...}" be better? :) 
let $newURInode := xdmp:unquote(
           fn:concat('<options xmlns="xdmp:document-load"><uri>/Abstracts/' 
              ,$Filename,'</uri><repair>none</repair><permissions>' 
              ,xdmp:default-permissions(),'</permissions><collections><collection>' 
              ,'Abstracts','</collection></collections></options>') 
           ) 

(: get string of node's name :) 
let $SrcFileStr := xdmp:quote(fn:document-uri($SrcFileNode)) 

(: build a string of the copy + delete actions in a single transaction as applied to the current file. Implement the action using "xdmp:eval" :) 
let $LoadDelCMD := 'xquery version "1.0-ml"; 
        declare option xdmp:transaction-mode "update"; 
        xdmp:document-load($SrcFileStr,$newURInode); 
        xdmp:document-delete($SrcFileStr); 
        xdmp:commit()' 

(: execute the copy/delete for the current document :) 

(: 1st attempt... 
return xdmp:eval($LoadDelCMD,(),<options xmlns="xdmp:eval"> <isolation>different-transaction</isolation> <prevent-deadlocks>true</prevent-deadlocks></options>) 
:) 

(: 2nd attempt... 
let $Option := document{<options xmlns="xdmp:eval"><isolation>different-transaction</isolation> <prevent-deadlocks>true</prevent-deadlocks></options>} 
return xdmp:eval($LoadDelCMD,(),$Option) 
:) 

(: 3rd attempt... 
let $Option2 := xdmp:unquote('<options xmlns="xdmp:eval"> <isolation>different-transaction</isolation> <prevent-deadlocks>true</prevent-deadlocks></options>') 
return xdmp:eval($LoadDelCMD,(),$Option2) 
:) 
+0

Ошибки .... "[1,0 мл] XDMP-INVOPTNOD: xdmp: Eval (" XQuery версия " 1,0 мл "; ... ",(), документ {<опции xmlns = "xdmp: eval"> разная транзакция<предотвращение-блокировки> t ...}) - Неверный узел опций: fn: doc ("") "ИЛИ" [1.0-ml] XDMP-BADCHAR: (ошибка: XPST0003) Неожиданный символ найденный «» (0x0022) В строке 3 колонка 58 « В строке 48 столбца 8 –

ответ

3

О самой ошибке, он жалуется на $Option, который содержит опцию элемент, обернутый в узле документа. Избавьтесь от узла документа, удалив конструктор узла документа. Вы вытаскиваете опции из файла, вы можете развернуть его, добавив /* за ним.

Кроме того, я думаю, что вы делаете вещи более сложными, чем необходимо. Если вы просто хотите обновить документ, тогда нет необходимости в удалении, просто вставьте или загрузите тот же uri снова. Если вы хотите переместить документ в другое место, просто выполните вставку/загрузку в той же транзакции, что и удаление. Пока нет вложений/нагрузок/удалений, примененных к одному и тому же uri, никаких конфликтующих обновлений не произойдет, и все будет сохранено в то же самое время в успешном завершении кода.

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

http://markmail.org/message/2e5wu3sqgpiwnu5m

О, кстати, ваша Eval загружается и удаление же URI. Это не похоже на изменение документа документов.

HTH!

+0

« grtn ». Спасибо за ссылку. Единственная цель кода - перенести документы с uri 1 на uri 2. Причина использования eval заключалась в том, чтобы запускать задачи вставки и удаления в качестве конс (идея, извлеченная из более раннего StackOverflow). Все 3 'возвратные' опции, похоже, генерируют ошибки, даже если использовать xdmp: eval ($ LoadCmd,(), ...) синтаксис. Я более подробно рассмотрю элемент, обернутый в проблеме узла, о которой вы говорили. У меня будет другой вариант без eval и посмотреть, смогу ли я получить этот «мяч для игры». –

+0

Использование функции переименования, о которой я упоминал выше, вероятно, является самым быстрым и безопасным способом переноса документов на разные ури. И, как объяснялось, вам не нужно удалять и вставлять в разные инструкции, поэтому нет необходимости в явной транзакционной стычке. Один оператор уже полностью связан с ACID транзакцией. – grtjn

+0

Ссылка будет делать то, что мне нужно для этого. Большое спасибо. –