Запрос Для Ftsearch

  • Автор темы Автор темы ezhov
  • Дата начала Дата начала
вот тут написано часть:
Эта ссылка на форуме постоянно мелькает. Можешь почитать все или сразу смотреть {Какие методы самые быстрые?}
А если еще подробнее, то в Lotus базе есть TableID (индекс-хэш всей базы, все документы и stub'ы) по этой таблице происходит поиск методом GetDocumentByUNID, если я не путаю.
Есть ViewIndex, это хэш-индекс каждого представления, только документов которые в него попадают. Соответственно он меньше и поиск в нем быстрее, это как раз GetDocumentByKey у NotexView.
А вот Search, кажись, берет просто все документ и перебирая их по одному проверяет на формулу, если не подходит - выбрасывает из обработки.
Вот такая забавная архитектура. Если я не прав, то надеюсь формучане меня поправят.
 
происходит синхронизация департаментов и сотрудников, их xml берется тот самый parentID, ищется в базе лотуса и обновляется и т.д., в xmlке куча этих parentID, циклом пробегаемся по всем и для каждого делаем такой поиск,поэтому parentID в каждой итерации цикла разный, он передается в метод, в котором и вызывается поиск по базе, который нужно оптимизировать,что б быстрее искал

Я так и думал)
В данной ситуации не нужно делать 100500 поисков, xlm будет обрабатываться быстрее, делайте наоборот. Получаете все документы которые требуется обработать а потом ищите нужные данные в xml
 
А получиться ли создать представление с такими выборками?

"Form =\"Person\" & met!=\"1\" & @IsUnavailable($Conflict) & TabNum= \"" + tabNum + "\""
"Form =\"Department\" | Form =\"Subdivision\") & @IsUnavailable($Conflict) & met!=\"1\"& ID= \"" + depID + "\""

Т.е. с использованием в запросе фунций @IsUnavailable($Conflict)?

Просто в коде используется 3 метода search с разными запросами, и это 2 из них, если нельзя создать представление с такими выборками то имеет ли смысл переделывать 1 метод ? будет какой то прирост в скорости ?
 
Отлично! Тогда надо создавать вьюхи.
Получается мне нужно в лотусе создать 3 view(каждую на свой запрос),как я понял они создаются в Domino Designer или Lotus Notes с помощью меню, и в разделе Selection conditions или Select by formula написать выборки,они будут такими же ?:

Select Form="Department" | Form="Subdivision" & [met]!="1", сюда передается parentID
Select Form ="Person" & met!="1" & @IsUnavailable($Conflict) , сюда передается tabNum
Select Form ="Department" | Form ="Subdivision" & @IsUnavailable($Conflict) & met!="1", сюда передается depID

и потом в коде заменить

DocumentCollection dc = database.search ("(Form =\"Department\" | Form = \"Subdivision\" )& ID=\""+parentId+"\" & met!=\"1\""); и т.д.
на
DocumentCollection dc = view.GetAllDocumentbyKey(parentId);
DocumentCollection dc = view.GetAllDocumentbyKey(tabNum);
DocumentCollection dc = view.GetAllDocumentbyKey(depID);

Так? я раньше не работал с этими делами, поэтому поправьте пожалуйста синтаксис кода ;) ;)
 
Да, и первую колонку сделать сортированной с нужным параметром (parentID, tabNum).
Если по ключу должен быть один документ то используйте
public Document getDocumentByKey(java.util.Vector keys)
throws NotesException
 
судя по первоначальным формулам поиска, тебе нужны 2 вьюхи с отбором Select (Form="Department" | Form="Subdivision") & met!="1" и Select (Form ="Department" | Form ="Subdivision") & @IsUnavailable($Conflict) & met!="1" и сортировкой по ID (нельзя ли их в одну объединить, кстати? - отличие только в условии @IsUnavailable($Conflict)) и еще одна вьюха с отбором Select Form ="Person" & met!="1" & @IsUnavailable($Conflict) и сортировкой по TabNum
 
Так? я раньше не работал с этими делами, поэтому поправьте пожалуйста синтаксис кода
Посмотри скрины. ViewXXX как создать вьюху, ViewXXX_ColumnKey - как задать колонку ключ.
 

Вложения

  • viewDeptID.png
    viewDeptID.png
    10,4 КБ · Просмотры: 646
  • viewDeptID_ColumnKey.png
    viewDeptID_ColumnKey.png
    9,8 КБ · Просмотры: 315
  • viewParentId.png
    viewParentId.png
    12,3 КБ · Просмотры: 662
  • viewParentID_ColumnKey.png
    viewParentID_ColumnKey.png
    10 КБ · Просмотры: 640
  • viewPersonbyTabNum.png
    viewPersonbyTabNum.png
    9,8 КБ · Просмотры: 459
  • viewPersonbyTabNum_ColumnKey.png
    viewPersonbyTabNum_ColumnKey.png
    9 КБ · Просмотры: 317
savl не путай человека, сам же писал: "Первая колонка, сортированная, ключ колонки ID".Просто исходя из первого поста, сортированной колонкой должна быть колонка именно с полем ID: depID и parentId это вроде значения, получаемые из xml:
DocumentCollection dc = database.search( "(Form =\"Department\" | Form =\"Subdivision\") & @IsUnavailable($Conflict) & met!=\"1\"& ID= \"" + depID + "\"");
DocumentCollection dc = database.search ("(Form =\"Department\" | Form = \"Subdivision\" )& ID=\""+parentId+"\" & met!=\"1\"");
 
OKEN
Не путаю, я писал для одного примера. Если он будет создавать 3 представления (хотя двух достаточно) и использовать их для того чтобы найти документ, то могут возникнуть еще вопросы, вот я и выложил картинки с пояснением: где и как задать формулу отбора, как задать ключ колонки, как сделать ее отсортированной.
 
Да, и первую колонку сделать сортированной с нужным параметром (parentID, tabNum).
Если по ключу должен быть один документ то используйте
public Document getDocumentByKey(java.util.Vector keys)
throws NotesException

в коде идет проверка на количество совпадений:

<!--shcode--><pre><code class='java'>private lotus.domino.Document findByTabNum(String tabNum) throws NotesException {
DocumentCollection dc = database.search(
"Form =\"Person\" & met!=\"1\" & @IsUnavailable($Conflict) & TabNum= \"" + tabNum + "\"");


lotus.domino.Document tmpdoc = null;
lotus.domino.Document doc = dc.getFirstDocument();
int notNull = 0;
if(dc.getCount() == 0) {
return null;
}

if (dc.getCount() == 1)
return dc.getFirstDocument();
else if (dc.getCount() > 1) {
while (doc != null) {
if (!doc.isDeleted()) {
tmpdoc = doc;
notNull++;
continue;
}
doc = dc.getNextDocument();
}
}
if(notNull==1) {
return tmpdoc;
} else {
throw new RuntimeException(
"Error. There are more than one employee in DB with TabNum = " + tabNum + "and they have \"isDeleted=true\" flag");
}

}[/CODE]

Добавлено:
savl не путай человека, сам же писал: "Первая колонка, сортированная, ключ колонки ID".Просто исходя из первого поста, сортированной колонкой должна быть колонка именно с полем ID: depID и parentId это вроде значения, получаемые из xml:
DocumentCollection dc = database.search( "(Form =\"Department\" | Form =\"Subdivision\") & @IsUnavailable($Conflict) & met!=\"1\"& ID= \"" + depID + "\"");
DocumentCollection dc = database.search ("(Form =\"Department\" | Form = \"Subdivision\" )& ID=\""+parentId+"\" & met!=\"1\"");

Правильно подмечено, у меня как раз такой вопрос возник, depID и parentId это значения, получаемые из xml, они передаются в формулу поиска,но исчутся по полю ID(это в 2х запросах) и по tabNum тут :
database.search( "Form =\"Person\" & met!=\"1\" & @IsUnavailable($Conflict) & TabNum= \"" + tabNum + "\"");
 
Да, недоглядел.
По поводу того, что идет проверка на совпадения, то смотри метод у View class:
<!--shcode--><pre><code class='java'>public DocumentCollection getAllDocumentsByKey(...)
throws NotesException[/CODE]
как раз вернет коллекцию
 
А чем один единственный view не устраивает?
С одной колонкой типа:
q1:=@If((Form="Department" | Form="Subdivision") & met!="1";"q1~"+parentID;"");
q2:=@If("Person" & met!="1" & @IsUnavailable($Conflict);"q2~"+tabNum;"");
q3:=@If((Form ="Department" | Form ="Subdivision") & @IsUnavailable($Conflict) & met!="1";"q3~"+depID;"");
@Trim(q1:q2:q3)
 
Да, недоглядел.
По поводу того, что идет проверка на совпадения, то смотри метод у View class:
<!--shcode--><pre><code class='java'>public DocumentCollection getAllDocumentsByKey(...)
throws NotesException[/CODE]
как раз вернет коллекцию

Значит там где на скриншотах ViewXXX_ColumnKey в окне Formula указано deptID, parentID и tabNum, надо изменить соответственно на ID, ID, а tabNum оставить ?

И по синтаксису DocumentCollection dc = view.GetAllDocumentbyKey(); вопрос, в него передается только 1 параметр: deptID, parentID или tabNum ? по которому мы и будем искать
 
А чем один единственный view не устраивает?
С одной колонкой типа:
q1:=@If((Form="Department" | Form="Subdivision") & met!="1";"q1~"+parentID;"");
q2:=@If("Person" & met!="1" & @IsUnavailable($Conflict);"q2~"+tabNum;"");
q3:=@If((Form ="Department" | Form ="Subdivision") & @IsUnavailable($Conflict) & met!="1";"q3~"+depID;"");
@Trim(q1:q2:q3)

Повторюсь еще, я не работал никогда с этим, поэтому не в курсе как вообще можно сделать это все) И тогда такой вопрос, как лучше реализовать, 3 вьюхи, каждая на свой запрос, и соответсвенно как в методе view.GetAllDocumentbyKey() указывать что бы оно искало по нужной мне вьюхе ? и если сделать 1 вьюху,то как в ней сделать что бы искало по нужному параметру? передается 3 разных параметра, 2 из них ищутся в поле ID, один в поле tabNum
 
ezhov
Одна большая тогда будет,но все же эффективнее. rinsk, спасибо за наводку.
В формулу колонки (так где ID или TabNum) делаешь так:
@Trim(@If(Form="Department"| Form ="Subdivision"; ID; Form = "Person";tabNum;""))
А формулу отбора представления так:
Select (Form="Department" | Form="Subdivision" | Form = "Person") & met != "1" & @IsUnavailable($Conflict)
 
Огромное всем спасибо !!! буду пробовать. Если все заработает напишу на сколько быстрее стало работать
 
Еще вопрос, View создавать надо в Domino Designer или Lotus Notes ?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!