2014-01-13 100 views
1

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

有展示如何列出文件夹中的项目,使用的OperationContext设置maxItemsPerPage一个例子,但似乎的OperationContext可以getChilder方法内部使用:

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(); 

这是确定的,当涉及到上市ü文件夹。但我的情况是关于从自定义搜索查询中获取结果。基本的做法是:

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)); 
} 

这种方法将检索queryResult中的所有文件,但我想包括startIndex和limit。这个想法是键入这样的东西:

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

我不知道这部分:getPage(限制)。这是寻呼的正确方法吗?此外,我想检索项目总数,所以我可以知道如何设置我的项目将显示在网格中的最大项目。有一种方法,但有些奇怪的东西是用文档编写的,就像仓库不知道最大项目一样。这是一个方法:

results.getTotalNumItems(); 

我已经试过类似:

SELECT COUNT(*)... 

,但没有这样的伎俩:)

请,你能不能给我一些建议怎么办从查询结果中正确分页?

在此先感谢。

回答

6

查询返回getChildren返回的相同ItemIterable,因此您可以页面查询返回的结果集,就像您可以页面getChildren返回的结果集一样。

假设您有一个显示页面上20项的结果页面。考虑一下这个片段,我感到在Groovy的控制台对149个文件的文件夹命名为testN.txt运行在OpenCMIS工作台:

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页面的工作搜索页面,看看在SearchServlet类The Blend,该随书附赠CMIS &阿帕奇化学行动的样本Web应用程序。

+0

非常感谢您的解释。 – Banana