
Vladimir
21.09.2016
13:16:39
чтоб дважды не пробегать по результату)

Anatoliy
21.09.2016
13:16:43
Цепочки будут, уже сталкивались, я на yield смотрел - там это сделать было можно, но делали напрямую через Sql, потому что были проблемы с составлением запроса через yield

Vladimir
21.09.2016
13:16:53
например?
да сам yield тут и не мешает и не помогает

Google

Anatoliy
21.09.2016
13:17:18
db.run(
(for {
(company, user) <- table joinLeft Users.table on (_.user_id === _.id)
} yield (company, user))
).result
вот так что ли?
так тоже не работает)

Vladimir
21.09.2016
13:17:51
а что пишет?
ну это всё возвращает Future
по нему потом надо map/flatMap делать
вот пример
// GET /payments
def list = ApiLogging {
Action.async {
ServiceLocator.db.run((for { (payment, participant) <- TableQuery[TblPayment] join TableQuery[TblParticipant] on (_.participantId === _.id) } yield (payment, participant)).result).map ( pairs => {
jsonOkResult(Json.obj(
"payments" -> pairs.map( pair => {
val (payment, participant) = pair
Json.obj(
"id" -> payment.id,
"participant" -> participant.name,
"status" -> payment.status.v,
"value" -> payment.value
)
})
))
})
}
}

Anatoliy
21.09.2016
13:19:19
например?
https://gist.github.com/Visteras/d04a4b12eb22923b3c7ab67191657dc6 - вот это например, но это из другого проектаи там... страшно)


Vladimir
21.09.2016
13:20:18
^ надо всё в цепочку дейсвтий вот пример
// GET /payments/:id
def view(id:Int) = ApiLogging {
Action.async {
ServiceLocator.db.run((for {
payment <- TableQuery[TblPayment].filter(_.id === id).result.head
participant <- TableQuery[TblParticipant].filter(_.id === payment.participantId).result.head
executedBmo <- TableQuery[TblBankMoneyOrder].filter(_.id === payment.bankMoneyOrderId).result.headOption
tx <- TableQuery[TblMoneyTransaction].filter(_.paymentId === id).filter(_.`type` === MoneyTransactionType.PAYMENT_LOCKED).result.head
txs <- sql"""
WITH cur_tx AS (
SELECT oper_time AS oper_time FROM tbl_money_transaction WHERE id = ${tx.id.get} LIMIT 1
)
, prev_tx AS (
SELECT oper_time AS oper_time FROM tbl_money_transaction WHERE oper_time < (SELECT oper_time FROM cur_tx) AND id != ${tx.id} AND type = ${MoneyTransactionType.PAYMENT_LOCKED} ORDER BY oper_time DESC LIMIT 1
)
SELECT tx.type, tx.value, o.origin_id, wh.origin_id
FROM tbl_money_transaction AS tx
LEFT JOIN tbl_order AS o ON o.id = tx.order_id
LEFT JOIN tbl_withholding AS wh ON wh.id = tx.withholding_id
WHERE tx.oper_time <= (SELECT oper_time FROM cur_tx)
AND (CASE
WHEN (SELECT oper_time FROM prev_tx) IS NULL THEN TRUE
ELSE tx.oper_time > (SELECT oper_time FROM prev_tx)
END)
AND tx.participant_id = ${tx.participantId}
AND tx.type IN (${MoneyTransactionType.ORDER}, ${MoneyTransactionType.WITHHOLDING})
""".as[(String,BigDecimal,String,String)]
} yield (payment, participant, executedBmo, txs)).transactionally).map ( row => {
// Обработка
аа у вас там просто SQL динамически генерится


Anatoliy
21.09.2016
13:21:04
Не нравится мне как он там генерится

Vladimir
21.09.2016
13:21:33
ну вы бы могли TableQuery[] обработать
в зависимости от условий

Google

Vladimir
21.09.2016
13:21:42
и его в slick уже отдать
а потом в тот сложный SQL отдать список IDS из первого допустим

Anatoliy
21.09.2016
13:22:44
надо будет попробовать, но есть ощущение что там будет выглядет ьвсе еще хуже

Vladimir
21.09.2016
13:22:58
не правда )
хотя
а че за база такая вообще? )
так же нельзя группировать

Anatoliy
21.09.2016
13:24:10
Просто чистый Sql хоть он и не очень там удобен - видно прекрасно, а так - далеко не факт что будет понятно что там за такое

Vladimir
21.09.2016
13:24:29
у в вас в группировке 3 колонки, а в запросе их куча

Anatoliy
21.09.2016
13:24:31
https://poeinfo.ru - вот эта там база. Она уже не работает, русскоязычная версия игры закрылась(

Vladimir
21.09.2016
13:24:32
и это не агрегатки
я про движоу

Anatoliy
21.09.2016
13:24:43
Точнее ушло все на евро сервера

Vladimir
21.09.2016
13:24:45
Mysql?

Anatoliy
21.09.2016
13:24:49
mariadb

Vladimir
21.09.2016
13:25:09
ну почто тоже самое
ну ладно это уже тема SQL )

Anatoliy
21.09.2016
13:25:54
а по поводу группировки - да, там были с этим косяки, но в ечм проблема сгруппировать по 3 колонкам а вывести больше?

Vladimir
21.09.2016
13:26:04
ну это не однозначная выбора
выборка*

Google

Alexander
21.09.2016
13:26:07
нормальный SQL такого не позволяет )

Vladimir
21.09.2016
13:26:09
да
&

Anatoliy
21.09.2016
13:26:14
там группировка была нужна что бы сгруппировать всю доступную игроку валюту что бы вывести ее общее количество

Vladimir
21.09.2016
13:26:16
в MYSQL есть флаг для этого

Alexander
21.09.2016
13:26:19
а mysql просто рандомные значения для отсальных колонок веррнет

Anatoliy
21.09.2016
13:26:32
были там рандомные значения одно время, победил их все же)
правда рандом был не для остальных колонок а длу сгруппированных

Vladimir
21.09.2016
13:26:53
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
вот этот флаг
не гуд в общем его отключать)

Anatoliy
21.09.2016
13:27:31
так вроде и не отключал?

Vladimir
21.09.2016
13:27:41
ну по дефолту отключен значит

Anatoliy
21.09.2016
13:28:01
не знаю) там докер контейнер со стандартными значениями)
я туда особо не смотрел)

Vladimir
21.09.2016
13:28:06
> а mysql просто рандомные значения для отсальных колонок веррнет
вот в этом проблема

Alexander
21.09.2016
13:28:11
с 5.7 вроде по дефолту включен

Vladimir
21.09.2016
13:28:19
^ это хорошо

Anatoliy
21.09.2016
13:28:20

Vladimir
21.09.2016
13:28:25
ну да

Google

Vladimir
21.09.2016
13:28:30
явными агрегатками

Alexander
21.09.2016
13:28:33
смотря что тебе хочется получить :)

Vladimir
21.09.2016
13:28:36
а не на усмотрения БД

Anatoliy
21.09.2016
13:28:55
ну то что мне хотелось получить - я получил) хоть и с извратами) ну как по мне с извратами

Vladimir
21.09.2016
13:29:23
ну советую таки углубиться) понять почему это не комильфо)

Anatoliy
21.09.2016
13:29:46
вообще - стоит, тем более как раз пока время есть на работе свободное

Alexander
21.09.2016
13:30:36
я так понимаю, что mysql до сих пор не саппортит window functions?(

Vladimir
21.09.2016
13:30:40
нет

Alexander
21.09.2016
13:30:45
с ними такие вопросы легко решаются

Admin
ERROR: S client not available

Vladimir
21.09.2016
13:30:48
да
печаль)
там только выход подзапросы

Alexander
21.09.2016
13:31:34
а в mariadb кстати некоторые функции запилили https://www.fromdual.com/mariadb-10-2-window-function-examples

Vladimir
21.09.2016
13:32:00
да это уже сильно
нам даже свои агрегатки приходилось писать )
про проблему group by колонок
tbl_user:
id | status | gender
1 | active | male
2 | active | female
3 | active | male
4 | banned | male
5 | banned | female
и запрос в MySQL
SELECT status, gender, COUNT(*) FROM tbl_user
GROUP BY status
Выведет полную чепуху
надо либо все пихать в group by, либо убирать из SELECT gender

James Tiberius Kirk ?
21.09.2016
13:37:19
Кто-нибудь на курсере Одерского смотрел?

Google

James Tiberius Kirk ?
21.09.2016
13:37:26
Сложно там?

Alexander
21.09.2016
13:37:43
обсуждалось уже :)

Daniel
21.09.2016
14:17:47

Andrew
21.09.2016
14:19:01
во время прохождения или после?

Daniel
21.09.2016
14:19:50
во время

guga
21.09.2016
14:21:08
И ещё сбивает его постоянное сравнивание с java \ c#

Ivan
21.09.2016
14:22:04
Вначале сложновато потом норм если с непривычки

Nikolay
21.09.2016
14:22:32

guga
21.09.2016
14:22:43
в генериках точно было
в коллекциях

Nikolay
21.09.2016
14:23:07
это какой именно курс?

guga
21.09.2016
14:23:27
первый в специализации.

Юрий
21.09.2016
15:15:59
а чем сбивает сравнение?
по мне так наоборот удобно - рассуждение отталкивается от чего-то, что уже известно

D
21.09.2016
15:27:33
и чьи?

Daniel
21.09.2016
15:31:27
собственные, многим довольно трудно писать на первых порах в функциональном подходе

D
21.09.2016
15:33:04
А, это. Я уже точно не помню, очень давно было дело, но вроде бы мне функциональщина сразу зашла.
Кстати в этом и печаль, я так и не смог найти нормального курса по Скале для «неджавистов».