5

我有以下 Marklogic 查询,当在查询控制台中运行时,它允许我检索具有管理员权限的系统用户:

xquery version "1.0-ml";
import schema namespace bfa="http://bitfood.org/auth" at "schema/auth/bitfood-auth.xsd";
cts:search(/bfa:AppUser[bfa:appAccess/@appRole = "ROLE_SYS_ADMIN"], cts:and-query(()))

请原谅我的无知,但是否可以仅使用 Java 客户端 API 来实现此查询?

我知道我可以通过 XCC 使用原始查询,但我试图尽可能避免这种情况。

我一直在研究 Java 客户端 API 的文档,不幸的是,它简要地处理了其他搜索方法,但没有发现任何暗示这是可能的。

更新 1:伙计们,我想我在这里大获全胜。

根据这个问题,Java 客户端 API 的查询选项构建工具被标记为已弃用。

@ehennum 建议使用 XML 或 JSON 查询选项的替代方案。但是,此类查询选项规范本质上仍定义为代码中的原始字符串

String xmlOptions =
  "<search:options "+
        "xmlns:search='http://marklogic.com/appservices/search'>"+
      "<search:constraint name='industry'>"+
        "<search:value>"+
          "<search:element name='industry' ns=''/>"+
        "</search:value>"+
      "</search:constraint>"+
  "</search:options>";

当然,我可以使用 JAXB、JDOM、文件或其他一些工具来创建 XML,但我个人的看法是,我们仍然在使用代码中的资源文件中存储查询,这本身并不是一件坏事,但没有仔细考虑可能会导致代码维护的噩梦。

此外,这些选项需要在服务器上通过 REST 持久化这一事实引入了一层潜在的问题,以防这是强制性的,因为这些选项可能需要与每个旨在使用代码库的数据库实例同步。

因此,如果 Marklogic 开发人员正在倾听,我认为 Java 客户端 API 并不像我预期的那样成熟或文档化。

到目前为止,我有两个选择:

1) 我可以在字符串文件中硬编码我的 XCC 查询,并尝试使用参数占位符插入我需要的数据并通过 XCC 会话检索。或者。

2) 查看命名空间是否有任何 XSD 文件,http://marklogic.com/appservices/search并从中创建静态 JAXB 对象,以便构建某种“标准”类,如 HibernateQueryDSL,遗憾的是,我必须说,它们已经支持某种级别的 MongoDB 查询。

伙计们,真的,将某种流畅的查询工具(如 QueryDSL)带到 Marklogic 并摆脱这个Rube Goldberg 查询机器

更新 2:似乎这可以在 ML7 中解决。期待它。

谢谢!

4

1 回答 1

4

背景: Java API 是 REST API 上的一层,是 Search API 上的一层,API 是 cts:search 上的一层

您可以在 Search API 中表达此查询。

使用 Java API,您可以使用查询选项和结构化查询作为 RawCombinedQueryDefinition 进行搜索。

综上所述,您还可以在 bfa:AppUser 上搜索一个元素查询,其中包含对“ROLE_SYS_ADMIN”的 bfa:appAccess/@appRole 的值约束查询

虽然 XPath 很方便,但熟悉查询表达式以了解数据库的全部功能和灵活性是一个好主意。

更新1:

有几点需要考虑:

  • Search API 中的查询有两部分:查询(用 Google 风格的字符串搜索或 JSON 或 XML 结构化搜索表示)和查询选项。StructuredQueryBuilder 构建结构化搜索。QueryOptionsBuilder 仅构建查询选项。

  • 在 ML 6.0-3 中,REST API 引入了对组合搜索的支持,它在单个请求中提供了这两个部分。Java API 通过 RawCombinedQueryDefinition 类增加了对此类请求的支持。

  • ML7 正在扩展结构化搜索,以减少或消除对结构化搜索查询选项的需求。StructuredQueryBuilder 在 ML7 中得到了增强,以支持结构化搜索的新功能。在 ML7 中,您将能够完全在 StructuredQueryBuilder 中编写上面的示例查询,而无需任何查询选项。

  • 当我们将构建查询选项的代码与 QueryOptionsBuilder 以及 JDOM 或 XOM 进行比较时,很难在构建器中看到很多 LOC 优势。

  • 您不必在字符串中硬编码查询选项。为了分离关注点,您可以从文件或许多其他来源中读取 JSON 或 XML 查询选项。(请参阅http://docs.marklogic.com/javadoc/client/com/marklogic/client/io/marker/QueryOptionsReadHandle.html标记接口的实现。)

  • 查询选项提供声明而不是可执行代码。并行将与 Spring 配置文件而不是与 SPL 文件。

顺便说一句,虽然 JAXB 非常适合源自 Java 类的设计,但 JAXB 对于源自复杂 XML 模式的设计可能会非常痛苦。搜索模式利用了 XML 模式的强大功能。当我们探索这条路线时,我们得出结论,JAXB 不会帮助提供查询选项的接口。

于 2013-08-28T20:12:38.193 回答