IBM Domino Java - оптимизируйте поиск в представлении $ (Rooms) для указанного c inte rnet адреса - PullRequest
2 голосов
/ 19 февраля 2020

Я довольно новичок в IBM Domino. У меня есть приложение XPages Java, которое работает как расширенный API для стандартной базы данных управления Rooms & Resoruce (позволяет мне легко управлять встречами и предлагает больше функциональных возможностей, чем стандартный API, например, для изменения встреч других людей).

Когда я хочу получить список всех встреч для определенной комнаты c, я передаю inte rnet (mail) адрес комнаты моему API, а в приложении Java я выполняю итерации по $(Rooms) просмотр в names.nsf поиск документов, пока я не найду документ с нужным элементом InternetAddress. Затем я получаю другую интересную информацию из документа, такую ​​как настройки автоматической обработки.

Это работает, но я уверен, что это вообще не эффективно, и я запрашиваю более 50 комнат, получая встречи для всех из них занимает около 18 секунд, и я не очень доволен этим результатом. Как я мог оптимизировать это? Я почти уверен, что смогу выполнить простой поиск по представлению, который сделает все под капотом более оптимизированным способом, но у меня недостаточно опыта, чтобы это сработало. Мой текущий код:

        Session session = ExtLibUtil.getCurrentSession();
        Database names = session.getDatabase(session.getServerName(), "names.nsf");
        View vw = names.getView("($Rooms)");
        lotus.domino.ViewNavigator nav = vw.createViewNav();

        ViewEntry nextEntry = nav.getFirst();
        Document docRoom = null;
        while (nextEntry != null) {
            ViewEntry processEntry = nextEntry;
            nextEntry = nav.getNext();

            if (processEntry.isDocument() && processEntry.isValid()) {
                docRoom = processEntry.getDocument();
                // found
                if(docRoom.getItemValueString("InternetAddress").equals(mail)) {
                    processEntry.recycle();
                    break;
                } else { // not found
                    processEntry.recycle();
                    docRoom.recycle();
                    docRoom = null;
                }
            } else processEntry.recycle();
        }
        if(docRoom == null)
            return null;
        nav.recycle();

        String fileName = docRoom.getItemValueString("MailFile");
        String fileServer = docRoom.getItemValueString("MailServer");
        String fullName = docRoom.getItemValueString("FullName");

1 Ответ

3 голосов
/ 19 февраля 2020

Вы работаете в 50 раз за все доступные записи просмотра. Из-за этого это занимает слишком много времени. Временная сложность вашего подхода составляет O(N*M).

. Существует более эффективный способ получить документ из вида по ключу.

Document doc = view.getDocumentByKey(yourKeyValue);

Он работает намного быстрее (O(LogN) сложность времени) , но требует, чтобы представление содержало первый отсортированный столбец со значениями yourKeyValue. В нашем случае у нас должно быть представление, которое имеет InternetAddress в качестве первого отсортированного столбца.

К сожалению, представление ($Rooms) не применяется к этому правилу. Первый столбец этого представления содержит данные, отличные от необходимых.

Я бы создал в представлении names.nsf новое представление для задачи.

Давайте назовем его (RoomsByInternetAddress) и поместим следующая формула в качестве формулы выбора для созданного представления:

SELECT ((Type = "Database") &(ResourceFlag="1") & (ResourceType="1") & (AutoProcessType != "D")) & (Form="Resource":"Database") & @IsUnavailable($Conflict)

Это фактическая формула для ($Rooms) представления.

Сделайте первый столбец вида отсортированным и установите значение первого столбца в поле InternetAddress.

Затем сохраните его и закройте. В закрытом виде в свойствах представления (в списке представлений дизайнера) включите «Запретить проект refre sh или изменить». Он защитит вновь созданный вид от удаления при обновлении с исходного сервера names.nsf шаблона.

view properties setting

После этого в вашем коде он вам не понадобится просмотреть все записи.

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
}

Обновление

Для случаев, когда вы не авторизованы для изменения names.nsf сервера, существует другая опция.

IBM Domino Java API Database класс поддерживает метод search () .

Вот информация о синтаксисе формулы поиска: { ссылка }

...