Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Таблица:
- relation_id integer ,
- receiver_id integer,
- sender_id integer,
- receiver_type_id integer,
- sender_type_id integer,
- relation_type_id integer
- Пример:
- 12770 301325 235572 2 0 1
- 9339 301325 261515 2 1 1
- 25625 301325 262040 2 1 1
- 8106 301327 235472 2 0 1
- 8107 301327 235473 2 0 1
- 1116 301327 289462 2 1 1
- 1277 301329 1 3 1 1
- 9340 301336 222726 13 1 1
- 9341 301336 261522 13 1 1
- 12776 301339 6232 2 1 1
- 11361 301341 261615 2 1 1
- 8109 301341 273539 2 1 1
- 12784 301353 301295 13 2 1
- 1044 301355 286316 2 1 1
- 12788 301359 13573 13 1 1
- 12790 301359 73831 13 1 1
- 9346 301359 263083 13 1 1
- 9347 301359 278275 13 1 1
- 28953 301363 222808 2 1 1
- 30508 301363 261345 2 1 1
- 415 301367 199425 2 0 1
- 9351 301377 6484 2 1 1
- 12799 301377 23169 2 1 1
- 12801 301377 25294 2 1 1
- 12804 301377 27345 2 1 1
- ищем путь от rootID до targetID
- bool not_found = true // нашли ли искомый ID
- int depth = 10 // максимальная глубина рекурсии (уровень соседей от которых ищем соседей)
- Allrelations[] // все найденые связи в ширину
- while (flag_found!=true)
- {
- //получаем все связи первого уровня от rootID (только тех типов связей которые в rel_list_id).
- //Сам обьект root ID и targetID может быть типа который запрещен поскольку свзи идут К нему и ОТ него то фильтр по receiver_type_id и sender_type_id не применяем
- rows = "select sender_id,receiver_id,sender_type_id,receiver_type_id from relations where (sender_id=rootID or receiver_id=rootID) and relation_type_id in (rel_list_id)"
- поскольку мы уже выбрали все обьекты где есть rootID нужно проверить есть ли искомый обьект targetID в этой выборке
- temp1= select count(*) from rows where sender_id=targetID or receiver_id=targetID
- if(temp1>0)
- {
- значит в первой выборке мы нашли искомый обьект и между ними прямая связ без посредников дальше нам искать не интересно
- not_found = false;
- break; //выходим, мы знаем что между ними прямая связь первого уровня
- }
- //поскольку мы не отфильтровали на шаге 1 обьекты по типу нужно их исключить из rows для дальнейшего поиска т.к. фильтр накладывается на все типы обьектов между двумя А->B->C->D на B и С соответственно
- То отсекаем все обьекты не выходящие в type_list c которыми связан rootID (например А)
- A->B
- A<-C
- A->D
- A<-E
- temp2 = select distinct sender_id,receiver_id from rows where (sender_type_id in(type_list) and sender_id != rootID) or (receiver_type_id in(type_list) and receiver != rootID) // не уверен в правильности запроса но мы берем всех сендеров и ресиверов кроме rootID, и проверяем по фильтру подходят ли они
- на выходе получаем всех соседей 1 уровня с фильтром по типу обьекта и типу связи (без самого rootID)
- Allrelations[0] = temp2; помещаем соседей первого уровня в массив результатов
- for int i=1; i<depth; i++ // на один уровень мы уже углубились теперь максимум глубина обхода это depth-1 (если не найдем раньше)
- {
- //теперь все просто шагаем в ширь с известными фильтрами проверяем на каждом шагу нашли ли искомы targetID
- //Allrelations[i-1] = полученные результаты выборки предыдущего шага (соседи N уровня от которых мы ищем новых)
- temp3 = select sender_id,receiver_id from relations where (sender_id in (Allrelations[i-1]) or receiver_id in (Allrelations[i-1])) and relation_type_id in (rel_list_id) and sender_type_id in(type_list) and receiver_type_id in(type_list)
- temp4= select count(*) from temp3 where sender_id=targetID or receiver_id=targetID
- if(temp4>0)
- {
- значит в N выборке мы нашли искомый обьект дальше нам искать не интересно
- Allrelations[i] = temp3; помещаем выбранных соседей N уровня в массив результатов
- not_found = false;
- break; //выходим, мы знаем что между ними прямая связь первого уровня
- }
- }
- мы прошли по циклу, если мы нашли на шаге N нужный узел, мы выйдем выше по условию и вернем Allrelations для дальнейшей обработки
- если мы не вышли выше, значит в искоммом массиве данных глубиной N обьекта нет и обрабатывать нам дальше нечего, возвращаем пустой Allrelations = ""
Add Comment
Please, Sign In to add comment