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.

  1. Объект на основе
  2. На основе строки

Вы должны настроить это с помощью параметра return_top_results_row_based в файле server.ini.

Все эти изменения для серверной части documentum, а не для вашего клиента DFC/DQL.

Я работал с DFC API (с Java) некоторое время, но я не помню никаких ограничений по умолчанию для запросов, IIRC, мы всегда получали все документы, ограничений не было. На самом деле (согласно моим заметкам) мы должны установить ограничение явно, например, enable (return_top 2000), (Насколько я знаю, синтаксис может зависеть от СУБД, стоящей за EMC Documentum.)

Просто предположение: проверьте свой dfc.properties файл.

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