Регистрация  |  Вход

Выстроить дерево

Всем привет. Интересная задачка.
Есть такая схема.

Объект А
Джанкш объект Б
Объект А
Джанкш объект Б
Объект А
Джанкш объект Б
Объект А
Джанкш объект Б
Объект А
и т.д

Тоесть Объект А соединяется с друг с другом через Джанкш объект Б.
Мы находимя на верхнем уровне. Вниз может идти давольно много уровней.
Как получить это все дерево и не упасть по лимитам?

Всем привет. Интересная задачка.
Есть такая схема.
[code]
Объект А
 Джанкш объект Б
  Объект А
   Джанкш объект Б
    Объект А
     Джанкш объект Б
      Объект А
       Джанкш объект Б
        Объект А
          и т.д
[/code]

Тоесть Объект А соединяется с друг с другом через Джанкш объект Б.
Мы находимя на верхнем уровне. Вниз может идти давольно много уровней.
Как получить это все дерево и не упасть по лимитам? 

Либо доставать все записи и строить дерево рекурсивно - лимит простой - 50000 записей или heapsize. Если у тебя дерево не будет содержать больше пары тысяч элементов - то это не проблема.

Можно делать это асинхронно - показывать свернутое дерево с элементами верхнего уровня, а при открытии ветки кверить ветку (на один уровень вниз) и так дальше в глубь.

Если данные относительно статичные - дерево меняется раз в 100 лет, то можно замутить какой нибудь батч для построения дерева в виде json, сохранить и использовать его, а не тянуть каждый раз все данные.

Либо доставать все записи и строить дерево рекурсивно - лимит простой - 50000 записей или heapsize. Если у тебя дерево не будет содержать больше пары тысяч элементов - то это не проблема.

Можно делать это асинхронно - показывать свернутое дерево с элементами верхнего уровня, а при открытии ветки кверить ветку (на один уровень вниз) и так дальше в глубь.

Если данные относительно статичные - дерево меняется раз в 100 лет, то можно замутить какой нибудь батч для построения дерева в виде json, сохранить и использовать его, а не тянуть каждый раз все данные.

Данные все время меняются. Их может быть более 1000000. "Дерево" это образное слово, имееся в виду получить иерархию. Да бонально получить все id Объект А с верхнего уровня вниз.

Данные все время меняются. Их может быть более 1000000. "Дерево" это образное слово, имееся в виду получить иерархию. Да бонально получить все id Объект А с верхнего уровня вниз. 

Тогда только асинхронное получение уровней подойдет.

Тогда только асинхронное получение уровней подойдет. 

DevNull
Объект А
Джанкш объект Б
Объект А
Джанкш объект Б
Объект А
Джанкш объект Б
Объект А
Джанкш объект Б
Объект А
и т.д

я из этой схемы понял только то что это какой-то пздц
простыми словами - не понял ничего

[quote="DevNull"]Объект А
 Джанкш объект Б
  Объект А
   Джанкш объект Б
    Объект А
     Джанкш объект Б
      Объект А
       Джанкш объект Б
        Объект А
          и т.д[/quote]

 я из этой схемы понял только то что это какой-то пздц
простыми словами - не понял ничего

У тебя, по ходу, все упирается в 100 SOQL запросов (т.е. ты вычитал первый объект, взял его ID, читаешь следующий с этим ID, берешь следующий ID и читаешь для него). Ну вложенность больше 50 - это перебор. Думаю, не стоит такое скопом пытаться выгрузить и тем более показывать.

У тебя, по ходу, все упирается в 100 SOQL запросов (т.е. ты вычитал первый объект, взял его ID, читаешь следующий с этим ID, берешь следующий ID и читаешь для него). Ну вложенность больше 50 - это перебор. Думаю, не стоит такое скопом пытаться выгрузить и тем более показывать.

согласен, рекурсивный подход тут будет самым оптимальным - вряд ли ты пользователь захочет просматривать более 50 уровней вложенности. учитывая что на каждом уровне ты будешь запрашивать связи ко списку идентификаторов на текущем уровне, то в лимиты ты должен влезть.

плюс. вряд ли ты будешь визуализировать это в vf - проще юзать одну из кучи js-библиотек и лучше уж юзать lazy load, нежели грузить весь скоп.

согласен, рекурсивный подход тут будет самым оптимальным - вряд ли ты пользователь захочет просматривать более 50 уровней вложенности. учитывая что на каждом уровне ты будешь запрашивать связи ко списку идентификаторов на текущем уровне, то в лимиты ты должен влезть.

плюс. вряд ли ты будешь визуализировать это в vf - проще юзать одну из кучи js-библиотек и лучше уж юзать lazy load, нежели грузить весь скоп. 

А может кто нить спросит - какая задача стоит?
Вдруг человек подошел к решению не стой стороны?

А может кто нить спросит - какая задача стоит?
Вдруг человек подошел к решению не стой стороны?

Рекурсивно у меня и было выстрено, а вложеность была большая. Плюс надо у дочернего элемента могут быть несколько родительских(тоесть могли два дерева сходится в какомто месте) и надо пересчитывать филды от этого. Тоесть по сути сделать все так как заказчик захотел можно сказать невозможно.
Пришли к решению что это будет делать батч и считать по одному уровню вниз(плюс адейтить записи). Долго, зато выполнит задачу. Проблема из-за кривого бизнес процесса, который делали без учета лимитов SF.

Рекурсивно у меня и было выстрено, а вложеность была большая. Плюс надо у дочернего элемента могут быть несколько родительских(тоесть могли два дерева сходится в какомто месте) и надо пересчитывать филды от этого. Тоесть по сути сделать все так как заказчик захотел можно сказать невозможно.  
Пришли к решению что это будет делать батч и считать по одному уровню вниз(плюс адейтить записи). Долго, зато выполнит задачу. Проблема из-за кривого бизнес процесса, который делали без учета лимитов SF.