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

时间:2015-07-15 10:38:04

标签: xpages lotus-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搜索视图选项不可接受,因为它仅返回5.000个文档。

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

你有什么想法我怎么能做到这一点?

3 个答案:

答案 0 :(得分:2)

正如Frantisek所说,我认为关键在于用户想要对输出做些什么。

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

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

此外,如果它是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。这实际上取决于用户想要做什么,可能需要在框外思考,快速让他们访问目标文档集他们想要采取行动。

答案 1 :(得分:1)

我会为您的视图优化数据结构。例如,制作一个ArrayList<view entry>,代表您视图中的最小信息。它模仿了索引。 &#34;查看条目&#34;不是Notes对象(Document,ViewEntry),而是一个简化的POJO,它将保存足够的信息以对其进行排序(通过比较器)并显示或查找实际数据 - 例如要显示的Subject列和UNID以建立一个打开的链接文献。 这种结构应该适合每个文档几百个字节。麻烦的部分是填充该结构 - 即使使用ViewNavigator,构建此类列表可能需要几分钟。

答案 2 :(得分:0)

如果过滤基于第一个排序列的部分匹配,那么就有一个基于Domino的纯解决方案。它要求Domino服务器是8.5.3或更高版本(8.5.3中引入了view.resortView),并且implements_date列已经点击进行排序。

  1. 使用getAllEntriesByKey(键,false)&lt; - 部分匹配

  2. 创建过滤后的集合
  3. 调用view.resortView(&#34; name_of_realization_date_column&#34;)

  4. 创建所有条目的集合,现在按realize_date

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

  7. 伪代码:

    ..
    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
    ..
    

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