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 и limit. Идея состоит в том, чтобы напечатать что-то вроде этого:

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

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

results.getTotalNumItems();

Я пробовал что-то вроде:

SELECT COUNT(*)...

но это не сработало:)

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

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

1 ответ

Решение

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

Предположим, у вас есть страница результатов, которая показывает 20 элементов на странице. Рассмотрим этот фрагмент, который я запускаю в Groovy Console в 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, пример веб-приложения, которое поставляется с книгой CMIS & Apache Chemistry in Action.

Другие вопросы по тегам