Need a unique gift idea?
A Pastebin account makes a great Christmas gift
SHARE
TWEET

Untitled

a guest May 16th, 2018 101 Never
Upgrade to PRO!
ENDING IN00days00hours00mins00secs
 
  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 = ""
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top