
Alex
18.09.2017
07:17:47
ну по идее да, если просто сделать БД с новым именем ?

Nick
18.09.2017
14:31:19
Ребята, а как правильно делать запрос с Ecto.Query, Так чтобы брать строку из таблицы, и количество его детей.
Пытаюсь делать так.
query =
from(r in Room)
|> preload(:messages)
|> join(:left, [r], m in assoc(r, :messages), m.receiver_id == ^user.id)
|> group_by([r], r.id)
|> select([r, m], {r, count(m.id)})
Пишет argument error

Dmitry
18.09.2017
14:33:16
Детей строки?

Andrey
18.09.2017
14:33:46
его - запроса?

Google

Nick
18.09.2017
14:33:50
Ну например у меня, room имеет много messages
хочу брать room и количество сообщений в нем

Dmitry
18.09.2017
14:34:37
Preload и join точно не должны быть вместе

Marsel
18.09.2017
14:35:05
у message есть room_id?

Dmitry
18.09.2017
14:35:17
Как иначе то?
Там receiver_id
Написано

Nick
18.09.2017
14:36:44
room_id тоже есть, assoc(r, :messages) он добавляет по room_id. Просто дополнительно еще одно условие добавил про receiver_id

Dmitry
18.09.2017
14:37:21
Какая то хрень в запросе, вот реальная
Тебе надо строку или все строки?
Зачем это условие с receiver?

Nick
18.09.2017
14:37:41
да

Google

Dmitry
18.09.2017
14:38:08
да
Это ты подтвердил, что хрень :)?

Nick
18.09.2017
14:38:18
и то и то)
Условие с receiver чтобы отфильтровать сообщения этого рума
если убрать все равно ошибка

Marsel
18.09.2017
14:40:45
from(m in Message, group_by: :room, select: {m.room, count(m.id)})
не такое надо?

Dmitry
18.09.2017
14:41:50
И возможно нужен прелоад
Но это неточно

Marsel
18.09.2017
14:42:54
я пока не понял зачем тут receiver_id, если только сгруппировать по room
или "выбрать количество сообщений этого receiver в каждой room"?

Nick
18.09.2017
14:43:45

Dmitry
18.09.2017
14:43:59

Marsel
18.09.2017
14:44:43
from(
m in Message,
group_by: :room,
where: m.receiver_id == ^user_id,
select: {m.room, count(m.id)}
)
предположение, не запускал)

Dmitry
18.09.2017
14:58:13
Мне кажется m.room не сработает без прелоада
Но я тоже не запускал

Nick
18.09.2017
15:02:35
С прелоадом и без прелоада пишет
Message.room` in select does not exist in the schema in query
если джойнить и группировать по r.id, все нормально работает

Marsel
18.09.2017
15:03:37
ну там room заменить на room_id наверн

Nick
18.09.2017
15:04:22
не помогло, пишет
column "r1.id" must appear in the GROUP BY clause or be used in an aggregate function

Google

Nick
18.09.2017
15:04:45
ну если писать room_id вместо room

Alexey
18.09.2017
16:00:51

Nikolay
18.09.2017
16:01:12
вот это респект!

Alexey
18.09.2017
16:01:58
по картинке видно, что отдельные процессы вызывают долгие и быстрые calls и все получают результаты. но долгие calls не блокируют вызовы быстрых

Nikolay
18.09.2017
16:07:01
я чуть позже гляну и обязон отпишу ?

Alexey
18.09.2017
16:15:58

Dmitry
18.09.2017
17:34:22
Кто-то использовал библиотеку locker?

Nikolay
19.09.2017
07:22:44
обычной же кейс такой, что тебе надо посчитать что-то долгое (твой spawn), и вернуть результат именного этого spawn
а ты тут как бы жульничаешь, заранее делая +1 в noreply

Alexey
19.09.2017
07:23:54
ну в стейте я храню номер запроса. и его возвращаю
а в репли мог бы возвращать {номер запроса, результат вычисления}. сам пример кода именно чтоб показать отложенный репли.
осмысленности в его действиях особой нет.

Nikolay
19.09.2017
07:31:45
угу, я просто пытаюсь придумать примеры из жизни где так удобно юзать)
тут получается "теряется" механика защиты state аля mutex'ом...и если запустить 4 таких long'a то они каждый перетрут результат предыдущего т.к. spawn запускается на старом state (если у тебя результат long'a зависит от изначального state)

Alexey
19.09.2017
07:57:34
я может к вечеру сделаю еще пример. где в стейте будет запоминаться каждый запрос и его статус. а результат будет именно результатом
сначала я хотел посложнее пример сделать. но решил для начала вот такой по проще, где вычислений нет, а просто показано, как оно не блокируется. вот ошибся )


Andrey
19.09.2017
08:03:55
Можно сделать что-нибудь типа:
к gen_server-у приходят запросы на какую-то долгоиграющую операцию, мы запоминаем запросивщего и параметры с которыми он запросил и инициируем операцию. Все новые запросы с уже запомнеными параметрами просто запоминаем. Когда вычислим результат ответим сразу всем.

Alexey
19.09.2017
08:14:19
да. вот такой пример хотел с самого начала сделать

Alex
19.09.2017
09:06:22

Google

Alex
19.09.2017
09:08:54
да можно еще какие-нибудь интересные штуки придумать, а самое главное тут что такой механизм работы доступен "из коробки"
ну или надо выполнить какую задачу состоящую из нескольких задач, сервер так же получает синхронный запрос на выполнение задачи, он разбивает ее на подзадачи и раскидывает их по воркерам, воркеры в, данном случае, сообщают результат серверу и когда тот соберет все подзадачи сам пошлет клиенту reply

Nikolay
19.09.2017
09:43:39
> gen-server содерждит пул потоков воркеров
а кто контролирует их лайв цикл?
тот же spawn, который "long" может отстрелиться, и клиент ничего не получит?

Alex
19.09.2017
09:50:44
или вот еще. к примеру у нас есть БД в ETS. При этом нам нам надо сделать запись сразу в несколько таблиц по определенным айдишникам. Чтобы не нарушить консистентность, мы пулям запрос в gen-srver, тот хранит в стейте имена ETS таблицы и у каждой таблицы список id записей, которые сейчас заняты в каких то операциях. Если при запросе сложной операции (транзакции) сервер не нашел нужных нам айдишников в списках соотв таблиц, то запускает нужную нам операцию и ids кладет в список соотв таблицы и в стей . Если придет любой другой запрос в котором нужны эти же ids то сервер посылает этот запрос сам себе в handle_info - откладывая его пока "не освободятся ids"


Fey
19.09.2017
09:51:16
жизненный пример: есть орграф для обработки данных, где каждая вершина работает асинхронно, но запустить следующую можно только, когда все предыдущие отработают. каждая вершина – это генсервер, который по завершении шлёт депешу следующему. тот в свою очередь хранит в стейте какие из инцидентных вершин уже отработали. когда окажется, что все – запускает обработку.

Alex
19.09.2017
09:51:42

Nikolay
19.09.2017
09:52:36
может, конечно, я у вас спрашиваю, я то сам так не делал)

Alex
19.09.2017
09:57:23

Fey
19.09.2017
10:04:45
изобретаем, но отдельно от логики

Alexey
19.09.2017
10:16:32
вот как раз для пулов, врооде бы, и есть пулбой. он для всего. а для сокетов есть ranch. ну и в принципе все вот эти count+-1 это велосипед. для параллельных запросов в эликсире есть Flow. целью было показать отложенные reply, а для чего - это уж каждый сам решает.

Alex
19.09.2017
10:28:47
ну или так

Alexey
19.09.2017
10:31:54
вообще я тут Лапшина почитал - он там использование call применяет в качестве паттерна back pressure для ограничения поступления данных, чтоб задержать отправителя на call'е пока гс думает. ну и в этих целях может пригодиться как раз вот этот отложенный reply. но в целом, имхо, это всё выглядит как хак. Иожев Валимов для back pressure запилил для нас GenStage и Flow
поэтому, я и спросил, кто-то пользует или нет ))) оказалось, что пользует

Nikolay
19.09.2017
10:35:33

Fey
19.09.2017
10:36:14
да, так и есть

Nikolay
19.09.2017
10:39:11
или можно попробовать сделать аля звезду - когда в центре есть генсервер, который инициирует обработку вершин, а ответ от них получается через отложенный :gen_server.reply (как Alexey показывал)..а получив ответ инициирует обработку следующей вершины и т.д...тем самым генверсеры вроде как друг об друге знать не будут лишнего...хотя это всё решение "на словах")

Fey
19.09.2017
10:57:40
можно просто на уровень логики это делегировать

Fedor
19.09.2017
14:36:58
не нравится мне эта Светочка

Google

Fedor
19.09.2017
14:37:21
в кристал чатик тоже пришла...

Nikolay
19.09.2017
14:37:25
*удалил*

Aldar
19.09.2017
14:45:08

Max
19.09.2017
16:21:18
и в чатик по Go
и в Python beginners

Maxim
19.09.2017
16:21:57
И в скалу

Max
19.09.2017
16:22:51
ясно, видать во все чатикис поста от Библиотеки программиста подобавлялась

Tigran
19.09.2017
21:26:29
Привет, господа. Есть тут кто?

عاصم بن حارث
19.09.2017
21:27:07
доброго времени.

Tigran
19.09.2017
21:27:27
Я вообще из мира джаваскрипта и тут мне мой товарищ-бэкендщик накидал своих штук, а я смотрю и ничего не понимаю.
Вы таких с вопросами сразу баните или можно попробовать поинтересоваться? Возможно именно Вы сможете мне помочь :)

عاصم بن حارث
19.09.2017
21:29:11
задавай...

Tigran
19.09.2017
21:29:56
Есть штука которая аплоадит на s3 файлы и возвращает линк на скачивание. Эликсир мне возвращает чисто хэш и типо все клево. Все это работает.
Случаи:
1) Человек зааплоадил файл, перешел по ссылке и даунлоад начался через 10 секунд
2) Человек скопировал ссылку и открыл ее в новой вкладке, даунлоад начался через 10 секунд
Во-первых из этого не реализовано то, что даунлоад начинается через 10 секунд. Я собирался показывать на фронте страницу и потом просто делать ручками редирект по таймеру.
Первый случай так реализовать получится. С этим проблем нет.
Но дело во втором случае: если я сразу перейду по нужной ссылке, оно сразу начнет аплоад и не покажет даже страницу
Сейчас это выглядит вот так, насколько я понял: