IBMDominoJava-优化在$(Rooms)视图上搜索特定internet地址
我对IBM Domino相当陌生。我有一个XPages Java应用程序,它可以作为标准Rooms&Resource管理数据库的扩展API(允许我轻松地操作约会,并提供比标准API更多的功能,例如修改其他人的约会) 当我想获得一个特定房间的所有预约列表时,我会将房间的互联网(邮件)地址传递给我的API,然后在Java应用程序中,我在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项的文档。然后,我从文档中获得一些其他有趣的信息,例如自动处理设置
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查询语言