2014-01-13 2 views
1

Недавно я начал использовать Apache CMIS и прочитал официальную документацию и примеры. Я ничего не заметил о результатах поискового запроса.Apache CMIS: Результат запроса подкачки

Существует пример, показывающий, как элементы списка папок, установка maxItemsPerPage с помощью OperationContext, но мне кажется, что 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 и предел. Идея заключалась бы в следующем:

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

Я не уверен в этой части: getPage (limit). Это правильный подход для подкачки? Также я хотел бы получить общее количество элементов, поэтому я мог бы знать, как настроить максимальные элементы в сетке, где будут отображаться мои элементы. Существует метод, но что-то странное написано в документах, например, иногда репозиторий не может знать о максимальных элементах. Это тот метод:

results.getTotalNumItems(); 

Я пытался что-то вроде:

SELECT COUNT(*)... 

, но это не сделать трюк :)

Пожалуйста, не могли бы вы дать мне несколько советов, как это сделать правильный пейджинг из результата запроса?

Заранее спасибо.

ответ

6

Query возвращает тот же ItemIterable, что и getChildren, поэтому вы можете вывести на экран результат, возвращаемый запросом, так же, как вы можете создать результирующий набор, возвращенный getChildren.

Предположим, у вас есть страница результатов, которая показывает 20 элементов на странице. Рассмотрим этот фрагмент, который я бегу в Groovy консоли в OpenCMIS Workbench против папки с 149 файлами под названием testN.txt:

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 и простые сервлеты и страницы JSP, посмотрите на класс SearchServlet в The Blend, веб-приложение образец, который поставляется с книгой КМИС & Apache Химия в действии.

+0

спасибо, что получил. – Banana

Смежные вопросы