getColumnValues vs循环通过一个NotesViewNavigator



在这篇文章中,当使用阅读器字段时,从分类视图的第一列返回,我提出了一个问题,如果我在分类视图上做getColumnValue(0),我只是唯一的类别值,但是由于阅读器字段,可能有用户无法访问其下的文档的类别。另一种选择是创建NotesViewNavigator并遍历该导航器并构建值的treeMap。我担心的是视图可能包含数千个条目,并且它必须循环遍历所有条目来构建通常可能有10 -12个条目的类别列表。

所以我的问题是,NotesViewNavigator进程的性能和可伸缩性是什么,或者是否有更好的方法来获得视图中的类别并识别用户的Reader权限。

新编辑

似乎不能让这个工作。我有一个单独的分类视图,并使用以下代码WFSUtils.sysOut()简单地打印到控制台。

vw.setAutoUpdate(false);
var nav:NotesViewNavigator = vw.createViewNav();
nav.setEntryOptions(NotesViewNavigator.VN_ENTRYOPT_NOCOUNTDATA);
nav.setBufferMaxEntries(400);
nav.setMaxLevel(0);
var rtn:java.util.TreeMap=new java.util.TreeMap();
var entry:NotesViewEntry = nav.getFirst();
try{
while (entry != null){
    WFSUtils.sysOut("Entry not null");
    var thisCat:String = entry.getColumnValues().firstElement().toString();
    WFSUtils.sysOut("thisCat = " + thisCat);
    rtn.put(thisCat,"Nothing");
    WFSUtils.sysOut("did put " + thisCat)
    var tEntry:NotesViewEntry = nav.getNextCategory(entry);
    entry.recycle();
    entry = tEntry;
    tEntry.recycle();
}
viewScope.put("vsCats", rtn.keySet());
}catch(e){
    WFSUtils.sysOut("Error in getCategory " + e.toString())
}

控制台打印结果如下:

25/08/2014 11:47:36 AM HTTP JVM: Get Navigator25/08/2014 11:47:36 AM HTTP JVM: Entry not null25/08/2014 11:47:36 AM HTTP JVM: thisCat = Approved~Bill Fox^WFS自动化后端流程示例25/08/2014 11:47:36 AM HTTP JVM: did put Approved~Bill Fox^WFS自动化后端流程示例25/08/2014 11:47:36 AM HTTP JVM: getCategory方法错误NotesViewNavigator.getNextCategory(lotus.domino.local.ViewEntry)没有找到,或非法参数

视图有9个类别,所以我希望它做9个getNextCategories。我将其更改为getNext,控制台输出为:

25/08/2014 11:52:42 AM HTTP JVM: Get Navigator25/08/2014 11:52:43 AM HTTP JVM: Entry not null25/08/2014 11:52:43 AM HTTP JVM: thisCat = Approved~Bill Fox^WFS自动化后端流程示例25/08/2014 11:52:43 AM HTTP JVM: did put Approved~Bill Fox^WFS自动化后端流程示例25/08/2014 11:52:43 AM HTTP JVM: Entry not null25/08/2014 11:52:43 AM HTTP JVM:调用NotesViewEntry.getColumnValues()方法时发生getCategory Exception错误25/08/2014 11:52:43 AM HTTP JVM: null

所以它在getColumnValues上失败了,这在第一次通过但不是第二次-不确定JVM: null来自哪里。

看起来View-design-level选项"Don't show empty categories"为您做到了这一点——我之前认为这只是提示客户端隐藏它们,但它看起来也影响了ViewNavigator的行为(否则它也会显示完整的类别)。

一旦你选中了这个,像这样的东西可能会奏效:

List<String> categories = new ArrayList<String>();
View view = database.getView("Some View");
view.setAutoUpdate(false);
ViewNavigator nav = view.createViewNav();
nav.setEntryOptions(ViewNavigator.VN_ENTRYOPT_NOCOUNTDATA);
nav.setBufferMaxEntries(400);
nav.setMaxLevel(0);
ViewEntry entry = nav.getFirst();
while (entry != null) {
    Vector<?> columnValues = entry.getColumnValues();
    String category = String.valueOf(columnValues.get(0));
    categories.add(category);
    entry.recycle(columnValues);
    ViewEntry tempEntry = entry;
    entry = nav.getNext();
    tempEntry.recycle();
}

我相信那应该是在那个时候最快/最安全的方法。setMaxLevel(0)意味着第一/下一个操作将只包括类别(或任何是你的顶层),而其他ViewNavigator设置是为了性能调整。

不,我认为你不必遍历所有条目。现在手头没有Domino Designer,这只是一个粗略的猜测(通常我在回答这里之前会做一个快速的测试驱动),但是我很有信心它应该是这样工作的:
只要进入第一个条目,在您的情况下必须是一个类别,然后使用.getNextSibling.getNextCategory(如果视图有多个类别级别,请小心!)从一个类别跳到另一个类别,并跳过所有其他条目。
根据视图索引的设置方式,还可以检查是否有可用的子节点。

只是为了完成:确保你设置父视图的autouupdate属性为false;根据视图的大小,你可能还想尝试不同的缓存大小;当然,别忘了回收,但你知道的,我猜;)

请参阅此处(= AutoUpdate),此处(= recycle proper)和此处(= performance tip)。

希望能有所帮助

最新更新