2017-10-26 9 views
1

map:get($context,"collections")パラメータをMLCP変換関数(MLCPガイドhereに記載されている入力パラメータ)で使用しようとしています。 -output_collectionsパラメータで指定されたコレクションを使用して、insert-update()関数に挿入できるようにします。MLCP変換モジュールのoutput_collectionsキーを使用

文書がデータベースにロードされます& mlcp出力はエラーを示しませんが、クエリコンソールを見ると、COLLTESTの代わりに(コレクションなし)表示されます。 コレクションは(私がしたくない)コレクションをハードコードするときに変換も正しく動作します。マップキーを間違って使用していますか?

MLCP-コンテキスト・変換・test.xqy

xquery version "1.0-ml"; 
module namespace tx = "http://transform-test"; 
import module namespace dls = 'http://marklogic.com/xdmp/dls' at '/MarkLogic/dls.xqy'; 

(:Function to Add document to DLS Library Services:) 
declare function tx:insert-update($filename,$doc,$coll) { 
let $i := dls:document-is-managed($filename) 
return 
if ($i = fn:false()) then  
    dls:document-insert-and-manage($filename,fn:true(),$doc/*,(), 
(xdmp:permission('rest-reader', 'read'), xdmp:permission('rest-writer', 'insert')),($coll)) 
else  
    if ($i = fn:true()) then 
     dls:document-checkout-update-checkin(
     $filename, 
     $doc/*, 
     'CHECKIN-UPDATE-CHECKOUT', 
     fn:true(), 
     (xdmp:permission('rest-reader', 'read'), xdmp:permission('rest-writer', 'insert')), 
     ($coll)) 
else  
    () 
}; 

declare function tx:transform(
$content as map:map, 
$context as map:map 
) as map:map* { 

let $docnode := map:get($content, "value") 
let $collections := map:get($context, "collections") 
return 
if (fn:empty($docnode/element())) 
    then $content 
    else 
     let $root := $docnode/* 
     let $_:= 
      map:put($content, "value", 
      document {$root/preceding-sibling::node(), 
      element {fn:name($root)} { 
      $root/@*, 
      $root/node(), 
      element { xs:QName("metadata")} { 
        namespace {"docprop"} {"http://mynamespace"}, 
        'foobarfoo' 
        } 
      }, 
      $root/following-sibling::node() 
      })   

    return (map:put($content,"uri", 
    tx:insert-update(map:get($content, "uri"),map:get($content,"value"), 
    map:get($context, "collections")) 
      ), 
      $content 
      ) 
}; 

MLCPコマンド:

mlcp.sh IMPORT -mode local \ 
-host localhost \ 
-port 8007 \ 
-username admin -password **** \ 
-input_file_path /MLCP-testdocs/testdocname.xml \ 
-output_uri_replace "/MLCP-testdocs,''" \ 
-output_uri_prefix /content/docs \ 
-output_uri_suffix .xml \ 
-output_collections COLLTEST \ 
-output_permissions rest-reader,read,rest-writer,insert \ 
-database top-songs \ 
-xml_repair_level full \ 
-transform_module /mlcp-context-transform-test.xqy \ 
-transform_namespace "http://transform-test" \ 
-document_type xml 

私もmap:get($context,"output_collections")を試してみました。私のために今まで働いていた$contextパラメータは"transform_param"です。 私はmlcp 8.0.6.3を使用しています。

+0

正しいアプローチのようです。 MLCPの最新バージョンを試すことはできますか? MLCP 9をMarkLogic 8以下で使うことができます。 – grtjn

+0

@grtjn MLCP 9を使ってみましたが、それでも動作しませんでした。私は '/ MarkLogic/hadoop.xqy'の' hadoop.xqy'モジュールを見て、$ collectionsが '$ context'マップに含まれていないことに気付きました。そこでhadoop.xqyに 'let $ dummy:= map:put($ context、" collections "、fn:tokenize($ collections、 '、')[。ne ''])'を追加しようとしました。正しいアプローチか、このモジュールを編集しても大丈夫かどうかはわかりません。 – finchmontana

+0

あなたはMakLogicのどのバージョンをお持ちですか?おそらくあなたのバージョンの最新のパッチリリースにアップグレードしようとしています。 – grtjn

答えて

4

mlcp 8.0-6.3では、ユーザーがトランスフォーム内でドキュメントコレクションにアクセスしたり変更したりすることを許可していません。

https://github.com/marklogic/marklogic-contentpump/issues/34

修正は、サーバーに依存しています。したがって、mlcp 9.0-xを使ってこれを行う場合、8.0-6.4以上のサーバに接続する必要があります。

8.0-6.3の回避策は、変換関数内でドキュメントの挿入を行い、変換関数から空のシーケンスを返すことです。

+0

この回避策は 'dls:document-insert-and-manage()'関数で動作することができますか?おそらく、私は空のシーケンスを正しく返さないでしょう... – finchmontana

+0

あなたの文書をどのように挿入するかは関係ありません。 dls:document-insert-and-manage()はうまくいくはずです。現在のバージョンでは、コレクションをtransform_paramで設定します。これは、変換関数に渡される唯一のコマンドラインパラメータです。 –

関連する問題