Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IBMDominoJava-优化在$(Rooms)视图上搜索特定internet地址_Java_Xpages_Lotus Notes_Lotus Domino - Fatal编程技术网

IBMDominoJava-优化在$(Rooms)视图上搜索特定internet地址

IBMDominoJava-优化在$(Rooms)视图上搜索特定internet地址,java,xpages,lotus-notes,lotus-domino,Java,Xpages,Lotus Notes,Lotus Domino,我对IBM Domino相当陌生。我有一个XPages Java应用程序,它可以作为标准Rooms&Resource管理数据库的扩展API(允许我轻松地操作约会,并提供比标准API更多的功能,例如修改其他人的约会) 当我想获得一个特定房间的所有预约列表时,我会将房间的互联网(邮件)地址传递给我的API,然后在Java应用程序中,我在names.nsf中的$(房间)视图中迭代,直到找到一个带有我要查找的InternetAddress项的文档。然后,我从文档中获得一些其他有趣的信息,例如自动处理设置

我对IBM Domino相当陌生。我有一个XPages Java应用程序,它可以作为标准Rooms&Resource管理数据库的扩展API(允许我轻松地操作约会,并提供比标准API更多的功能,例如修改其他人的约会)

当我想获得一个特定房间的所有预约列表时,我会将房间的互联网(邮件)地址传递给我的API,然后在Java应用程序中,我在
names.nsf
中的
$(房间)
视图中迭代,直到找到一个带有我要查找的
InternetAddress
项的文档。然后,我从文档中获得一些其他有趣的信息,例如自动处理设置

它是有效的,但我很确定它根本没有效率,我查询了50多个房间,所有房间的预约都需要18秒,我对这个结果并不满意。 我如何优化这个?我很确定我可以在视图上做一些简单的搜索,这将以一种更优化的方式完成引擎盖下的所有工作,但我没有足够的经验来让它工作。 我当前的代码:

会话会话=ExtLibUtil.getCurrentSession(); 数据库名称=session.getDatabase(session.getServerName(),“names.nsf”); View vw=names.getView(“($Rooms)”); lotus.domino.ViewNavigator nav=vw.createViewNav(); ViewEntry nextEntry=nav.getFirst(); 文档docRoom=null; while(nextEntry!=null){ ViewEntry processEntry=nextEntry; nextEntry=nav.getNext(); if(processEntry.isDocument()&&processEntry.isValid()){ docRoom=processEntry.getDocument(); //发现 if(docRoom.getItemValueString(“InternetAddress”).equals(mail)){ processEntry.recycle(); 打破 }否则{//找不到 processEntry.recycle(); docRoom.recycle(); docRoom=null; } }else processEntry.recycle(); } if(docRoom==null) 返回null; 回收资产(); 字符串文件名=docRoom.getItemValueString(“邮件文件”); String fileServer=docRoom.getItemValueString(“邮件服务器”); 字符串fullName=docRoom.getItemValueString(“fullName”);
您在所有可用的视图条目上运行了50次。正因为如此,它花费了太多的时间。您的方法的时间复杂度是
O(N*M)

有一种更有效的方法可以通过键从视图中获取文档

Document doc = view.getDocumentByKey(yourKeyValue);
它运行得更快(
O(LogN)
time complexity),但它要求视图应该包含第一个排序列,其中包含
yourKeyValue
值。在我们的例子中,应该有一个视图,它将
InternetAddress
作为第一个排序列

不幸的是,
($Rooms)
视图不适用于此规则。此视图的第一列包含不同于我们需要的数据

我将在任务的
names.nsf
中创建一个新视图

让我们将其命名为
(RoomsByInternetAddress)
,并将以下公式作为所创建视图的选择公式:

SELECT ((Type = "Database") &(ResourceFlag="1") & (ResourceType="1") & (AutoProcessType != "D")) & (Form="Resource":"Database") & @IsUnavailable($Conflict)
这是
($Rooms)
视图的实际公式

对视图的第一列进行排序,并将第一列值设置为
InternetAddress
字段

然后保存并关闭它。关闭后,在视图属性(设计器视图列表中)中启用“禁止设计刷新或修改”。它将保护新创建的视图在从原始服务器
names.nsf
模板刷新时不会被删除

之后,在代码中不需要遍历所有条目

View vw = names.getView("(RoomsByInternetAddress)");

String InternetAddressIWantToFind = "someroom@company.com";
Document foundDoc = vw.getDocumentByKey(InternetAddressIWantToFind, true);
if (foundDoc != null) {
   // you've found the document by InternetAddress
}

更新

对于您无权更改服务器的
名称.nsf
的情况,还有另一个选项

IBMDominoJavaAPI
数据库


以下是有关搜索公式语法的信息:

很遗憾,我想我无法在数据库中创建新视图,它可以在我自己的服务器上工作,但如果我想将其部署到某个客户端,那么我需要拥有在服务器目录数据库中创建新视图的权限。还有别的办法吗?例如,以编程方式发布选择公式?如果数据库由服务器id签名(在许多部署中是自定义的),则代码可以使用服务器权限运行,并且可以创建该视图。但更有趣的是:从R10开始,您就有了超快速的DQL查询语言