Size: a a a

2018 November 23

МБ

Максим Барулин in pro.elixir
так работает
from(
     m in module,
     select: m,
     where: fragment("md5(Исполнитель) = ?", ^hash)
   )

а так нет
from(
     p in Population,
     select: {p."Исполнитель", count(p."Номер")},
     left_join: m in module,
     on: m."Исполнитель" == p.name and p.population >= 200_000,
     group_by: :Исполнитель,
     order_by: [desc: count(m."Номер")],
     limit: 5
   )
источник

РП

Рома Пак in pro.elixir
ну так а ошибка какая?
источник

МБ

Максим Барулин in pro.elixir
** (Ecto.Query.CompileError) malformed join `module` in query expression
   lib/ecto/query.ex:594: Ecto.Query.from/5
   expanding macro: Ecto.Query.from/2
   lib/dobrobot/repos/data/api.ex:27: Dobrobot.Model.Data.getAllByPopulation/1
   (elixir) lib/kernel/parallel_compiler.ex:198: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/6
источник

РП

Рома Пак in pro.elixir
module - переменная? если да, то надо ее интерполировать(хз правильно назвал или нет)
источник

РП

Рома Пак in pro.elixir
left_join: m in ^module,
источник

МБ

Максим Барулин in pro.elixir
👍
источник

МБ

Максим Барулин in pro.elixir
Хотя до конца не ясно почему в первом варианте не надо
источник

x

xhajag in pro.elixir
Добрый день! Я начинающий в elixir/erlang после java и многих вещей еще не понимаю.
Есть gen_server который, например. в своем стейте хранит, например, клиент для доступа к внешнему http сервису. В java я бы просто описал класс и одно поле класса было бы как раз этим клиентом, все запросы к этому клиенту могли бы быть из разных потоков и проблем бы не было.
Но gen_server обрабатывает запросы по очереди внутри себя и мутирует свое состояние по необходимости.
Так вот - если необходимости мутировать состояние нет, а желание выполнять запросы к внешним сервисам в разных потоках есть - как быть?
Немного сумбурно, надеюсь смог донести свой вопрос.
источник

BB

Boris Beginin in pro.elixir
Есть gen_server который, например. в своем стейте хранит, например, клиент для доступа к внешнему http сервису. Либо ты наверное не так как то написал либо можно начать с этого)
источник

BB

Boris Beginin in pro.elixir
Почему бы просто не иметь обычный модуль с функциям? если тебе нужен стейт(незнаю там логин пассы) то вот их уже лучше хранить в генсервере
источник

BB

Boris Beginin in pro.elixir
я наверное не совсем что то понял)
источник

(

( in pro.elixir
Boris Beginin
Есть gen_server который, например. в своем стейте хранит, например, клиент для доступа к внешнему http сервису. Либо ты наверное не так как то написал либо можно начать с этого)
персистентное подключение к чему-нибудь (например, к рэббиту) создается один раз, не на каждый запрос, и становится состоянием
источник

(

( in pro.elixir
Например, amqp коннекшн приходится кидать как стейт в генсервере
источник

(

( in pro.elixir
xhajag
Добрый день! Я начинающий в elixir/erlang после java и многих вещей еще не понимаю.
Есть gen_server который, например. в своем стейте хранит, например, клиент для доступа к внешнему http сервису. В java я бы просто описал класс и одно поле класса было бы как раз этим клиентом, все запросы к этому клиенту могли бы быть из разных потоков и проблем бы не было.
Но gen_server обрабатывает запросы по очереди внутри себя и мутирует свое состояние по необходимости.
Так вот - если необходимости мутировать состояние нет, а желание выполнять запросы к внешним сервисам в разных потоках есть - как быть?
Немного сумбурно, надеюсь смог донести свой вопрос.
И про потоки не совсем так. В джаббе все равно все это дело блокирующее, просто его можно сделать асинхронным, точно также можно и в эликсире, просто коллы нужно заменять на касты
источник

(

( in pro.elixir
А также Agent и Task вам в помощь
источник

x

xhajag in pro.elixir
Про джаву не совсем так - например создаем класс у которого есть метод doGet(url) и внутри этого класса есть http клиент. Создаем экземпляр класса и даже при условии того, что каждый конкретный http вызов будет блокирующим мы не будем синхронизироваться на этом методе, т.е. каждый вызывающий поток войдет в этот метод и будет ждать ответа, но не будет стоять в очереди на вход doGet(url).
источник

DT

Dmitry Tyuterev in pro.elixir
если у тебя есть сущность, которую надо создавать, отслеживать потери и пересоздавать, а также использовать в разных процессах - не логично ли дежрать процесс-менеджер, который сможет этим заниматься ? (один или пулл) . Если у вас соединение представляет из себя пид отвечающего за обмен процесса - кидая его процессам в стейты - теряешь возможность восстановления (обновления этого пида) при разрыве. Проще ген-серверам обращатся к менеджеру, который выполнит задачу или отдаст нужный для этого ресурс
источник

(

( in pro.elixir
xhajag
Про джаву не совсем так - например создаем класс у которого есть метод doGet(url) и внутри этого класса есть http клиент. Создаем экземпляр класса и даже при условии того, что каждый конкретный http вызов будет блокирующим мы не будем синхронизироваться на этом методе, т.е. каждый вызывающий поток войдет в этот метод и будет ждать ответа, но не будет стоять в очереди на вход doGet(url).
Ну да. А если у вас этот клиент пишет куда-нибудь логи? Тут и наступает рейс-кондишен
источник

x

xhajag in pro.elixir
ну если есть побочные эффекты - да, проблема)
источник

(

( in pro.elixir
Dmitry Tyuterev
если у тебя есть сущность, которую надо создавать, отслеживать потери и пересоздавать, а также использовать в разных процессах - не логично ли дежрать процесс-менеджер, который сможет этим заниматься ? (один или пулл) . Если у вас соединение представляет из себя пид отвечающего за обмен процесса - кидая его процессам в стейты - теряешь возможность восстановления (обновления этого пида) при разрыве. Проще ген-серверам обращатся к менеджеру, который выполнит задачу или отдаст нужный для этого ресурс
Но какой в этом смысл? Если у вас потерялось соединение, просто запушьте в генсервер новый пид или инфу о том, что нужного процесса больше не существует
источник