getColumnValues vs循环通过NotesViewNavigator

时间:2014-08-24 22:57:33

标签: xpages lotus-notes xpages-ssjs

在这篇文章中Return from first column of a categorized view when using readers fields我提出的问题是,如果我在分类视图上执行getColumnValue(0),我只是唯一的类别值,但由于Reader字段,可能存在用户无法访问的类别到它下面的文件。另一个选项是创建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:获取导航器 25/08/2014 11:47:36 AM HTTP JVM:条目不为空 25/08/2014 11:47:36 AM HTTP JVM:thisCat = Approved~Bill Fox ^ WFS自动后端流程示例 25/08/2014 11:47:36 AM HTTP JVM:确实放了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:获取导航器 25/08/2014 11:52:43 AM HTTP JVM:条目不为空 25/08/2014 11:52:43 AM HTTP JVM:thisCat = Approved~Bill Fox ^ WFS自动后端流程示例 25/08/2014 11:52:43 AM HTTP JVM:确实放了Approved~Bill Fox ^ WFS自动后端流程示例 25/08/2014 11:52:43 AM HTTP JVM:条目不为空 25/08/2014 11:52:43 AM HTTP JVM:getCategory中出现错误调用方法NotesViewEntry.getColumnValues() 25/08/2014 11:52:43 AM HTTP JVM:null

所以它在第一次工作但不是第二次工作的getColumnValues上失败 - 不确定JVM:null的来源。 任何想法都非常感激。

2 个答案:

答案 0 :(得分:5)

看起来像View-design-level选项“不显示空类别”为你做了这个 - 我之前认为这只是客户隐藏它们的一个提示,但它看起来像它也影响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设置则用于性能调整。

答案 1 :(得分:3)

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

要完成:请确保将父视图的AutoUpdate属性设置为 false ;根据视图的大小,您可能还想尝试各种缓存大小;当然不要忘记回收,但你知道,我猜;)

另请参阅here (= AutoUpdate)here (= recycle properly)here (= performance tip)

希望这有帮助

相关问题