DQL-запрос для возврата всех файлов в кабинете в Documentum?
Я хочу получить все файлы из кабинета (называемого "Wombat Insurance Co"). В настоящее время я использую этот запрос DQL:
select r_object_id, object_name from dm_document(all)
where folder('/Wombat Insurance Co', descend);
Это нормально, за исключением того, что возвращает только максимум 100 результатов. Если в кабинете 5000 файлов, я хочу получить все 5000 результатов. Есть ли способ использовать нумерацию страниц, чтобы получить все результаты?
Я пробовал этот запрос:
select r_object_id, object_name from dm_document(all)
where folder('/Wombat Insurance Co', descend)
ENABLE (RETURN_RANGE 0 100 'r_object_id DESC');
с целью получения результатов с шагом в 100 файлов, но этот запрос выдает ошибку, когда я пытаюсь его выполнить. Ошибка говорит это:
com.emc.documentum.fs.services.core.CoreServiceException: "QUERY" action failed.
java.lang.Exception: [DM_QUERY2_E_UNRECOGNIZED_HINT]error:
"RETURN_RANGE is an unknown hint or is being used incorrectly."
Я думаю, что правильно использую подсказку RETURN_RANGE, но, возможно, это не так. Любая помощь будет оценена!
Я также пытался использовать подсказку ENABLE(FETCH_ALL_RESULTS 0)
но это все еще только возвращает максимум 100 результатов.
Чтобы уточнить, мой вопрос: как я могу получить все файлы из кабинета?
4 ответа
Ага, я понял это. Используя DFS с Java (уровень абстракции поверх DFC), вы можете установить начальный индекс для результатов запроса:
String queryStr = "select r_object_id, object_name from dm_document(all)
where folder('/Wombat Insurance Co', descend);"
PassthroughQuery query = new PassthroughQuery();
query.setQueryString(queryStr);
query.addRepository(repositoryStr);
QueryExecution queryEx = new QueryExecution();
queryEx.setCacheStrategyType(CacheStrategyType.DEFAULT_CACHE_STRATEGY);
queryEx.setStartingIndex(currentIndex); // set start index here
OperationOptions operationOptions = null;
// will return 100 results starting from currentIndex
QueryResult queryResult = queryService.execute(query, queryEx, operationOptions);
Вы можете просто увеличить currentIndex
переменная, чтобы получить все результаты.
Ну, подсказка используется неправильно. Начните с 1, а не с 0.
В самом DQLнет встроенного ограничения. Все результаты возвращаются по умолчанию. Причина, по которой вы получаете только 100 результатов, должна быть связана с тем, как вы используете DFC (или с любым другим клиентом, который вы используете). Использование IDfCollection следующим образом обязательно вернет все:
IDfQuery query = new DfQuery("SELECT r_object_id, object_name "
+ "FROM dm_document(all) WHERE FOLDER('/System', DESCEND)");
IDfCollection coll = query.execute(session, IDfQuery.DF_READ_QUERY);
int i = 0;
while (coll.next()) i++;
System.out.println("Number of results: " + i);
В тестовой среде (CS 6.7 SP1 x64, MS SQL) это выводит:
Количество результатов: 37162
Теперь есть доказательства. Однако использование подкачки - хорошая идея, если вы хотите улучшить общую производительность вашего приложения. Как уже упоминалось, начните считать с числа 1:
ENABLE(RETURN_RANGE 1 100 'r_object_id DESC')
Этот способ разбиения на страницы требует, чтобы сортировка была указана в подсказке, а не как оператор DQL. Если вам нужны только первые 100 записей, попробуйте этот совет:
ENABLE(RETURN_TOP 100)
В этом случае сортировка с ORDER BY будет работать так, как вы ожидаете.
Наконец, обратите внимание, что при добавлении (всех) будут найдены не только все документы, соответствующие указанной квалификации, но и все версии каждого документа. Если это было ваше намерение, это нормально.
Вы уже приняли ответ, который использует DFS.
Поскольку вы играете с DFC, эта информация может вам помочь.
ДФС:
Если вы используете DFS, вы должны знать о количестве одновременных сеансов, которые вы можете использовать с DFS. Я думаю, что это 100 или 150.
DFC:
На самом деле есть предел, который вы можете получить через DFC (я не уверен, с DFS).
Перейдите в свое приложение DFC (webtop или da или что-нибудь) и проверьте файл dfc.properties.
# Maximum number of results to retrieve by a query search.
# min value: 1, max value: 10000000
#
dfc.search.max_results = 100
# Maximum number of results to retrieve per source by a query search.
# min value: 1, max value: 10000000
#
dfc.search.max_results_per_source = 400
dfc.properties.full
или аналогичный файл есть, и вы можете проверить эти значения в соответствии с вашей системой.
И я говорю о стороне ContentServer, а не о файле dfc.properties на стороне клиента.
Если вы используете ENABLE (RETURN_TOP)
Подсказка для DFC: есть два способа получить результаты из ContentServer.
- Объект на основе
- На основе строки
Вы должны настроить это с помощью параметра return_top_results_row_based
в файле server.ini.
Все эти изменения для серверной части documentum, а не для вашего клиента DFC/DQL.
Я работал с DFC API (с Java) некоторое время, но я не помню никаких ограничений по умолчанию для запросов, IIRC, мы всегда получали все документы, ограничений не было. На самом деле (согласно моим заметкам) мы должны установить ограничение явно, например, enable (return_top 2000)
, (Насколько я знаю, синтаксис может зависеть от СУБД, стоящей за EMC Documentum.)
Просто предположение: проверьте свой dfc.properties
файл.