6

我想从一个柜子(称为“袋熊保险公司”)中检索所有文件。目前我正在使用这个 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

4 回答 4

3

您已经接受了使用 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_basedserver.ini 文件中的参数进行配置。

所有这些更改都是针对 documentum 服务器端的,而不是针对您的 DFC/DQL 客户端的。

于 2014-03-19T10:12:46.380 回答
2

啊哈,我想通了。将 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变量以获得所有结果。

于 2014-01-21T20:43:19.397 回答
2

好吧,提示使用正确。从 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排序将按您的预期工作。

最后,请注意,添加(all)不仅会找到所有符合指定条件的文档,还会找到每个文档的所有版本。如果这是你的意图,那很好。

于 2014-02-06T22:50:15.940 回答
0

我使用 DFC API(使用 Java)已经有一段时间了,但我不记得查询的任何默认限制,IIRC 我们总是得到所有文档,没有任何限制。实际上(根据我的笔记)我们必须明确设置限制,例如enable (return_top 2000). (据我所知,语法可能取决于 EMC Documentum 背后的 DBMS。)

只是一个猜测:检查你的dfc.properties文件。

于 2014-01-21T07:00:54.633 回答