【问题标题】:Marklogic DMSDK Transform Module?Marklogic DMSDK 转换模块?
【发布时间】:2018-02-14 06:44:37
【问题描述】:

用例:我想在数据库中获取我的文档的所有内容并将其存储在一个 zip 文件中。

我使用ml-java-util 将内容转换为 zip 文件。我的服务器端转换模块逻辑如下:

  1. 我进入每个文档并使用节点 Xpath 仅提取必填字段。
  2. 但是当我执行时,它在我打开时创建了一个 zip 文件,它有一组基于 Uri 名称和提取内容的文件。它不是将所有文件内容合并为一个,而是为每个 URI 创建新文件。

如何覆盖该行为?我希望所有文档中的所有内容(即提取的值)都在一个也转换为 zip 的文件中。

尝试应用 For 循环,但认为它没有用,因为函数本身会一一获取 uri(即 context.uri)。

感谢任何帮助。

谢谢

【问题讨论】:

  • 基于“而不是将所有文件内容合并为一个,而是为每个 URI 创建新文件”,我认为您需要澄清您的用例。您是否想要一个包含一个文件的 zip,该文件将所有匹配的文档连接在一起?还是您想要一个包含每个匹配文档的文件的 zip?
  • 是的,我想要一个包含一个文件的 zip,其中所有匹配的文档内容连接在一起

标签: marklogic java


【解决方案1】:

您可以使用ExportToWriterListener! ExportToWriterListener 导出 QueryBatcher 检索到的所有内容并写入文件。

DatabaseClient client = DatabaseClientFactory.newClient("localhost", 8012,
    new DatabaseClientFactory.DigestAuthContext("admin", "admin"));
DataMovementManager moveMgr = client.newDataMovementManager();
ServerTransform transform = new ServerTransform("transformName");
File outputFile = new File("output.txt"); // pass in your file here
String collection = "customers";
StructuredQueryDefinition query = new  StructuredQueryBuilder().collection(collection); // Substitute your query here
try (FileWriter writer = new FileWriter(outputFile)) {
  ExportToWriterListener exportListener = new ExportToWriterListener(writer)
    .withRecordSuffix("\n")
    .withTransform(transform) // pass in your Server Transform here
    .onGenerateOutput(
      record -> {
        String contents = record.getContentAs(String.class); 
        return contents; // return the content as it is which is the server transformed documents' content
      }
    );

  QueryBatcher queryJob =
    moveMgr.newQueryBatcher(query)
      .withThreadCount(5)
      .withBatchSize(10)
      .onUrisReady(exportListener)
      .onQueryFailure( throwable -> throwable.printStackTrace() );
  moveMgr.startJob( queryJob );
  queryJob.awaitCompletion();
  moveMgr.stopJob(queryJob);
}

然后您可以从文件中创建一个 zip。

【讨论】:

  • 我认为这不能解决将文档写入 zip 文件的用例。我对 DMSDK 的经验是,应该将 ExportListener 与将每个文档添加到 zip 的消费者一起使用。这就是 ml-javaclient-util 支持的 - github.com/marklogic-community/ml-javaclient-util/blob/master/…
  • 你是对的。这并没有解决将文档写入 zip 文件的用例。他希望从服务器中提取的所有内容都放入一个文件中,然后想单独从该文件中创建一个 zip,并且他希望当他使用 ml-javaclient-util 作业转换为 zip 时会发生这种情况。我已经创建了上面应该满足客户用例的代码。
  • 感谢@Vivek 转换为 zip 我可以在您上面的代码中实现writetozipconsumer 类吗?
  • 不,WriteToZipConsumer 接收 DocumentRecord。创建文件后,就是正常的java代码了。您可以看到此链接stackoverflow.com/questions/1091788/… 将输出文件转换为 zip 文件。
猜你喜欢
  • 2020-03-17
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 2019-06-03
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
相关资源
最近更新 更多