Guest User

Untitled

a guest
May 16th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.41 KB | None | 0 0
  1. Таблица:
  2.  
  3. relation_id integer ,
  4. receiver_id integer,
  5. sender_id integer,
  6. receiver_type_id integer,
  7. sender_type_id integer,
  8. relation_type_id integer
  9.  
  10. Пример:
  11.  
  12. 12770 301325 235572 2 0 1
  13. 9339 301325 261515 2 1 1
  14. 25625 301325 262040 2 1 1
  15. 8106 301327 235472 2 0 1
  16. 8107 301327 235473 2 0 1
  17. 1116 301327 289462 2 1 1
  18. 1277 301329 1 3 1 1
  19. 9340 301336 222726 13 1 1
  20. 9341 301336 261522 13 1 1
  21. 12776 301339 6232 2 1 1
  22. 11361 301341 261615 2 1 1
  23. 8109 301341 273539 2 1 1
  24. 12784 301353 301295 13 2 1
  25. 1044 301355 286316 2 1 1
  26. 12788 301359 13573 13 1 1
  27. 12790 301359 73831 13 1 1
  28. 9346 301359 263083 13 1 1
  29. 9347 301359 278275 13 1 1
  30. 28953 301363 222808 2 1 1
  31. 30508 301363 261345 2 1 1
  32. 415 301367 199425 2 0 1
  33. 9351 301377 6484 2 1 1
  34. 12799 301377 23169 2 1 1
  35. 12801 301377 25294 2 1 1
  36. 12804 301377 27345 2 1 1
  37.  
  38. ищем путь от rootID до targetID
  39.  
  40. bool not_found = true // нашли ли искомый ID
  41. int depth = 10 // максимальная глубина рекурсии (уровень соседей от которых ищем соседей)
  42.  
  43. Allrelations[] // все найденые связи в ширину
  44.  
  45. while (flag_found!=true)
  46. {
  47. //получаем все связи первого уровня от rootID (только тех типов связей которые в rel_list_id).
  48. //Сам обьект root ID и targetID может быть типа который запрещен поскольку свзи идут К нему и ОТ него то фильтр по receiver_type_id и sender_type_id не применяем
  49. 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)"
  50.  
  51. поскольку мы уже выбрали все обьекты где есть rootID нужно проверить есть ли искомый обьект targetID в этой выборке
  52.  
  53. temp1= select count(*) from rows where sender_id=targetID or receiver_id=targetID
  54.  
  55. if(temp1>0)
  56. {
  57. значит в первой выборке мы нашли искомый обьект и между ними прямая связ без посредников дальше нам искать не интересно
  58. not_found = false;
  59. break; //выходим, мы знаем что между ними прямая связь первого уровня
  60. }
  61.  
  62. //поскольку мы не отфильтровали на шаге 1 обьекты по типу нужно их исключить из rows для дальнейшего поиска т.к. фильтр накладывается на все типы обьектов между двумя А->B->C->D на B и С соответственно
  63. То отсекаем все обьекты не выходящие в type_list c которыми связан rootID (например А)
  64. A->B
  65. A<-C
  66. A->D
  67. A<-E
  68.  
  69. 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, и проверяем по фильтру подходят ли они
  70.  
  71. на выходе получаем всех соседей 1 уровня с фильтром по типу обьекта и типу связи (без самого rootID)
  72.  
  73. Allrelations[0] = temp2; помещаем соседей первого уровня в массив результатов
  74.  
  75. for int i=1; i<depth; i++ // на один уровень мы уже углубились теперь максимум глубина обхода это depth-1 (если не найдем раньше)
  76. {
  77.  
  78. //теперь все просто шагаем в ширь с известными фильтрами проверяем на каждом шагу нашли ли искомы targetID
  79. //Allrelations[i-1] = полученные результаты выборки предыдущего шага (соседи N уровня от которых мы ищем новых)
  80. 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)
  81. temp4= select count(*) from temp3 where sender_id=targetID or receiver_id=targetID
  82.  
  83. if(temp4>0)
  84. {
  85. значит в N выборке мы нашли искомый обьект дальше нам искать не интересно
  86.  
  87. Allrelations[i] = temp3; помещаем выбранных соседей N уровня в массив результатов
  88.  
  89. not_found = false;
  90. break; //выходим, мы знаем что между ними прямая связь первого уровня
  91. }
  92. }
  93.  
  94. мы прошли по циклу, если мы нашли на шаге N нужный узел, мы выйдем выше по условию и вернем Allrelations для дальнейшей обработки
  95. если мы не вышли выше, значит в искоммом массиве данных глубиной N обьекта нет и обрабатывать нам дальше нечего, возвращаем пустой Allrelations = ""
Add Comment
Please, Sign In to add comment