Xpages如何从视图中对预选的大量数据进行排序

Xpages how to sort preselected large amount data from view

我有一个具有以下视图的 domino 数据库:

Project_no    Realization_date    Author
1/2005        2015-01-02          Alex/Acme
3/2015        2015-02-20          John/Acme
33/2015       2016-06-20          Henry/Acme
44/2015       2015-02-13          John/Acme
...

现在我想从这个视图中获取所有以“3”(部分匹配)开头的项目,按 Realization_date 降序排列并在 Xpage 上显示其中的前 1000 个。

视图很大 - 一些选择可以给我 500.000 个文档。

FT 搜索视图选项不可接受,因为它 returns 只有 5.000 个文档。

创建 ArrayList 或 ListMap 导致 java 内存不足异常(java Domino 对象被回收)。超出内存当然会有所帮助,但我们有 30k 用户,所以它可能不够用。

您有什么想法可以实现吗?

正确回收应该没问题,但是...

您还可以 "revert" 到经典的 Domino URLS for ex ?yourviewname?ReadViewEntries&startkey=3&outputformat=JSON 并通过 Javascript UI 呈现 JSON某种成分

我会为您的视图优化数据结构。例如,制作一个 ArrayList<view entry>,它将代表您视图中的 minimum 信息。它模仿索引。 "view entry" 不是 Notes 对象(Document、ViewEntry),而是一个简化的 POJO,它将保存足够的信息来对其进行排序(通过比较器)并显示或查找真实数据——例如要显示的主题列和要显示的 UNID制作 link 以打开该文档。 这个结构应该适合每个文档几百个字节。麻烦的部分是填充该结构 - 即使使用 ViewNavigator,构建此类列表也可能需要几分钟。

我认为关键在于用户希望如何处理输出,正如 Frantisek 所说。

如果是导出,我会不排序导出数据,然后在电子表格中排序。

如果是为了显示,我希望有一些分页,否则从服务器推送到浏览器需要很长时间HTML,所以我建议做一个FT搜索在 Project_no 和 Realization_date 之间的某些范围和 "chunking" 您的请求。您将需要一个手动寻呼机来加载下一组结果,但如果您期望有那么多结果,您将不会得到一个可以计算总页数的寻呼机。

此外,如果它是 XAgent 或一次性显示所有内容,请在相关 XPage 上设置 viewState="nostate"。否则,每个请求都将序列化到磁盘。所以你的搜索结果被序列化到磁盘/内存,这可能是导致你看到的 Java 内存问题的原因。

记住 FT_MAX_SEARCH_RESULTS notes.ini 变量可以在服务器上修改以增加(默认)最大值 5000。

500,000 是一组非常高的结果,可能不会使其对用户进行任何后续操作都非常友好。我可能还建议限制搜索,例如强制单独输入“2015”部分或阻止输入一个数字,因此它必须是例如“30”而不是“3”。这也可能意味着修改您的视图,使 Project_no 格式显示为 @Right("0000" + @Left(Project_no,"/"), 4),这样用户就不会得到 3、30、31、32....300、301、302....,但可以搜索“003”并仅找到 30、31、32...、39。这实际上取决于用户想要做什么,并且可能需要跳出框框进行一些思考,以便快速让他们访问他们想要采取行动的目标文件集。

如果过滤是基于第一个排序列的部分匹配,则有一个纯基于 Domino 的解决方案。它要求 Domino 服务器是 8.5.3 或更高版本(view.resortView 是在 8.5.3 中引入的),并且 realization_date 列具有点击排序。

  1. 使用 getAllEntriesByKey( key, false ) 创建过滤集合 <-- 部分匹配

  2. 呼叫view.resortView("name_of_realization_date_column")

  3. 创建所有条目的集合,现在按 realization_date

  4. 排序
  5. 将已排序的集合与已过滤的集合相交。这将为您提供要按 realization_date 排序的条目。例如。 sortedCollection.intersect(过滤集合)

伪代码:

..
View view = currentDb.getView( "projectsView" );
view.setAutoUpdate( false );

ViewEntryCollection filteredCollection = view.getAllEntriesByKey( userFilter, False );
// Use index where view is sorted by realization_date
view.resortView( "realization_date" );

// All entries sorted by realization_date
ViewEntryCollection resortedCollection = view.getAllEntries();

resortedCollection.intersect( filteredCollection );
// resortedCollection now contains only the entries in filteredCollection, sorted by realization_date
..

我不确定这是否比创建自定义数据结构更快,但我认为值得测试:)