【问题标题】:Apache CMIS: Paging query resultApache CMIS:分页查询结果
【发布时间】:2014-01-15 10:11:54
【问题描述】:

最近我开始使用 Apache CMIS 并阅读官方文档和示例。我没有注意到任何关于分页查询结果的事情。

有一个示例显示如何列出文件夹项目,使用 operationContext 设置 maxItemsPerPage,但似乎可以在 getChilder 方法中使用 operationContext:

int maxItemsPerPage = 5;
int skipCount = 10;
CmisObject object = session.getObject(session.createObjectId(folderId));
Folder folder = (Folder) object;
OperationContext operationContext = session.createOperationContext();
operationContext.setMaxItemsPerPage(maxItemsPerPage);
ItemIterable<CmisObject> children = folder.getChildren(operationContext);
ItemIterable<CmisObject> page = children.skipTo(skipCount).getPage();

在列出 u 文件夹时这是可以的。但我的案例是关于从自定义搜索查询中获取结果。基本做法是:

String myType = "my:documentType";
ObjectType type = session.getTypeDefinition(myType);
PropertyDefinition<?> objectIdPropDef = type.getPropertyDefinitions().get(PropertyIds.OBJECT_ID);
String objectIdQueryName = objectIdPropDef.getQueryName();
String queryString = "SELECT " + objectIdQueryName + " FROM " + type.getQueryName();
ItemIterable<QueryResult> results = session.query(queryString, false);
for (QueryResult qResult : results) {
    String objectId = qResult.getPropertyValueByQueryName(objectIdQueryName);
    Document doc = (Document) session.getObject(session.createObjectId(objectId));
}

这种方法将检索查询结果中的所有文档,但我想包括 startIndex 和限制。我们的想法是输入如下内容:

ItemIterable<QueryResult> results = session.query(queryString, false).skipTo(startIndex).getPage(limit);

我不确定这部分:getPage(limit)。这是正确的分页方法吗?另外我想检索项目总数,所以我可以知道如何在网格中设置最大项目,我的项目将显示在该网格中。有一种方法,但在文档中写了一些奇怪的东西,比如有时存储库无法知道最大项目。就是这个方法:

results.getTotalNumItems();

我尝试过类似的方法:

SELECT COUNT(*)...

但这并没有成功:)

请问,您能给我一些建议吗?如何从查询结果中进行适当的分页?

提前致谢。

【问题讨论】:

    标签: cmis opencmis apache-chemistry cmis-workbench


    【解决方案1】:

    Query 返回的 ItemIterable 与 getChildren 返回的相同,因此您可以对查询返回的结果集进行分页,就像对 getChildren 返回的结果集进行分页一样。

    假设您有一个结果页面,该页面上显示了 20 个项目。考虑一下我在 OpenCMIS Workbench 的 Groovy 控制台中针对一个包含 149 个名为 testN.txt 的文件的文件夹运行的 sn-p:

    int PAGE_NUM = 1
    int PAGE_SIZE = 20
    String queryString = "SELECT cmis:name FROM cmis:document where cmis:name like 'test%.txt'"
    
    ItemIterable<QueryResult> results = session.query(queryString, false, operationContext).skipTo(PAGE_NUM * PAGE_SIZE).getPage(PAGE_SIZE)
    
    println "Total items:" + results.getTotalNumItems()
    
    for (QueryResult result : results) {
       println result.getPropertyValueByQueryName("cmis:name")
    }
    
    println results.getHasMoreItems()
    

    当您使用 PAGE_NUM = 1 运行它时,您将获得 20 个结果,并且最后一个 println 语句将返回 true。另请注意,第一个 println 将打印 149,即与搜索查询匹配的文档总数,但正如您所指出的,并非所有服务器都知道如何返回。

    如果你用 PAGE_NUM = 7 重新运行它,你会得到 9 个结果,最后一个 println 返回 false,因为你在列表的末尾。

    如果您想查看一个利用 OpenCMIS 和普通 servlet 和 JSP 页面的工作搜索页面,请查看 The Blend 中的 SearchServlet 类,这是 CMIS & Apache Chemistry in Action 一书随附的示例 Web 应用程序。

    【讨论】:

    • 非常感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 2021-09-11
    • 2011-03-14
    • 1970-01-01
    • 2013-07-15
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多