
Valery
13.03.2017
12:23:37
фух

Sergey
13.03.2017
12:23:39
слик неплох

Aleksey
13.03.2017
12:24:59
в серьезных приложения как тогда делают?
не пишут же методы для каждого критерия или это нормальная практика?
Ну твое решение нормальное вполне, хоть и попахиват.
def findBy(name: String = null, owner: String = null): Future[Option[models.Project]] = {
val query = projects find { project =>
Seq(
Option(name).map(project.name === _),
Option(owner).map(project.owner === _)
) foldLeft(false) {
case (acc, Some(res)) => acc || res
case (acc, None) => acc
}
}
db.run(query.result)
}
Наверно есдиственный случай, когда использование null оправдано. В принципе такие вещи можно макросами генерить. Тогда вообще норм.

Sergey
13.03.2017
12:27:12
В слике очень плохо с наборными фильтрами

Google

Sergey
13.03.2017
12:27:25
Lifted запрос с опциональными фильтрами невозможно читать, а Plain не композируется

Viktor
13.03.2017
12:27:27
мде
переизобрел active-slick
ошибки в тех же местах
видимо это косяк org.postgresql

Nick
13.03.2017
12:30:41
Oleg правда я и в doobie уже вляпался в неочень красивый batchupdate

Nikolay
13.03.2017
12:32:04

Nick
13.03.2017
12:32:18
точно, забыл ж

Grigory
13.03.2017
12:32:50
и акку

Viktor
13.03.2017
12:33:13
java и сюда свои кривые ручонки дотянула

Valery
13.03.2017
12:34:00
val projectGen = LabelledGeneric[ProjectDAO.this.dbTables.ProjectTable]
def findBy234(criteria: (Symbol, String)*): Future[Option[models.Project]] = {
val query = projects.filter { project =>
val rec = projectGen.to(project)
criteria contains {
case (key, value) =>
rec(key) === value
// ^^^ - error: Application does not take parameters
}
}
db.run(query.result)
}
тут что-то базовое видимо

Aleksey
13.03.2017
12:36:03
ух. он небось только в компайлтайме доступен.

Oleg
13.03.2017
12:36:16
rec(key) === value
вот это не скомпилится

Google

Aleksey
13.03.2017
12:36:16
позабыл я шеплес, да.

Oleg
13.03.2017
12:36:39
key здесь чистый Symbol, а нужен синглтон

Valery
13.03.2017
12:37:28
val currentPrice = rec('price)
price - здесь синглтон?

Oleg
13.03.2017
12:37:35
да
там имплицитная конверсия в Witness.Lt

Nick
13.03.2017
12:38:06

Oleg
13.03.2017
12:39:20
т.е. тебе нужно на этапе компиляции доказать, что любой символ из твоего Seq[(Symbol, String)] является полем твоего рекорда, что, как мне видится, невозможно

Valery
13.03.2017
12:39:47
то есть получается - что это впринципе невозможно

Oleg
13.03.2017
12:39:56
возможно в принципе

Valery
13.03.2017
12:39:59
динамически фильтровать таблицу?
дааа, просто так не заедешь в скалу)

Oleg
13.03.2017
12:41:20
динамически фильтровать таблицу?
плюс, я насколько помню в слике же столбцы простыми def ами у класса, а не полями case class т.е. всё упадёт ещё тогда, когда не найдётся LabelledGeneric

Valery
13.03.2017
12:42:08
ага def owner = column[String]("owner")

Kirill
13.03.2017
12:42:33
не знаю насколько адекватное решение, но работает
def findBy(criteria: (String, String)*) = db.run {
projects
.filter(project => criteria.foldLeft(LiteralColumn(false).bind) {
case (query, (k, v)) => query && (project .column[String](k) === v)
})
.result
}
findBy("name" -> "project", "owner" -> "vasya")

Oleg
13.03.2017
12:42:37
LabelledGeneric по дефолту не ищет такое, нужно свой материалайзер писать

Valery
13.03.2017
12:43:12
как код зеленым цветом отправлять? или он только для меня зеленый

Nikolay
13.03.2017
12:43:22
в ` таких штуках

Valery
13.03.2017
12:43:34
у меня красный

Oleg
13.03.2017
12:43:39

Google

Aleksey
13.03.2017
12:43:40

Oleg
13.03.2017
12:43:49
как в markdown

Aleksey
13.03.2017
12:43:53
Вот в таких ```

Mikhail
13.03.2017
12:43:58

Valery
13.03.2017
12:43:59
test
точно :)

Kirill
13.03.2017
12:45:16
боюсь на не строковых колонках оно упадет в рантайме
у нас пишут все фильтры ручками
особой боли не испытываем

Valery
13.03.2017
12:47:10
о
скомпилилось

Valery
13.03.2017
12:47:37
спасибо

Nick
13.03.2017
12:47:54
@fomkin а ты шеиплесс то юзаешь в своих проектах?

Valery
13.03.2017
12:48:05
да похоже ручками написать более правильно

Aleksey
13.03.2017
12:48:26

Valery
13.03.2017
12:53:07

Oleg
13.03.2017
12:55:13

Nick
13.03.2017
17:08:05
А у scalatest fixtures насколько глобальны?

Евгений
13.03.2017
19:09:10

Google

Nikolay
13.03.2017
21:59:07
https://twitter.com/contrarivariant/status/841406364891119617
https://github.com/scala/scala/pull/5774 круто если это будет в 2.12

Aleksey
14.03.2017
05:24:27

Oleg
14.03.2017
05:59:04

Nick
14.03.2017
07:01:20
https://twitter.com/scaladays/status/841293753260339203

Андрей
14.03.2017
07:07:49

Andrey
14.03.2017
07:09:10

Artem
14.03.2017
09:32:35
был ли у кого опыт использования http://async-io.org/?
точнее кластеризации этой штуки
или может быть добрые люди посоветуют что-то для поддержки множества WS соединений с fallback и кластеризацией, т.к. придется держать в одним момент времени 100к+ сокетов
https://github.com/Atmosphere/atmosphere про вот это речь

Admin
ERROR: S client not available

Nikolay
14.03.2017
10:48:11
как идиоматично в akka-streams делать периодическое(по времени или количеству элементов) логирование? Мутабельный GraphStage с счетчиком и таймером? или как-то иначе?

Dmitry
14.03.2017
10:58:11
собрать из стандартных компонентов

Oleg
14.03.2017
11:05:39

Mikhail
14.03.2017
11:06:58

Nikolay
14.03.2017
11:08:14

Oleg
14.03.2017
11:09:11
http://doc.akka.io/docs/akka/2.4.17/scala/stream/stages-overview.html#groupedWithin
+
http://doc.akka.io/docs/akka/2.4.17/scala/stream/stages-overview.html#log

Mikhail
14.03.2017
11:11:52

Nikolay
14.03.2017
11:12:56
а, логирование по таймеру не стоит - ты про это?
в одном stage

Google

Mikhail
14.03.2017
11:15:25
в одном stage
да, про таймер. но побочный таймер не влияющий на сам ран стрима я бы вобще не вставлял в стейджи
представь, что у тебя стрим это водопад - постоянно что-то течет(или не течет - всяко бывает, то течет, то нетечет). если хочется счетчик - тебе конечно его надо вставить прям в водопад (колесико которое будет отщелкивать пропущенный через себя обьем). но если тебе по таймеру надо брать показания этого счетчика - нет смысла таймер пихать внутрь водопада

Nikolay
14.03.2017
11:19:24
в таком случае куда?

Борис
14.03.2017
11:20:14
GraphStage все еще описывается кучей бойлерплейта же? Тогда отсылка в независимый актор-счетчик куда более простое решение

Mikhail
14.03.2017
11:20:53
дальше это только от тебя и от общей архитектуры зависит. главное чтобы у тебя была возможность в любой момент времени считать показания счетчика. разделяй и влавствуй)

Oleg
14.03.2017
11:22:03
А мы все проигнорировали меня?

Mikhail
14.03.2017
11:23:04

Oleg
14.03.2017
11:23:31
чему не соответствует?

Aleksei
14.03.2017
11:24:29
тому, что он описал в хотелках, видимо

Борис
14.03.2017
11:24:33

Oleg
14.03.2017
11:25:49
если не хотите хранить Seq, можно использовать batch
короче, тут нет такой проблемы, чтобы разводить дискас

Mikhail
14.03.2017
11:26:53
ну мы же про случай с какой то агрегацией по времени говорим?
отправляя во внешний актор 1(единичку, поскольку для счетчика отправлять целиком пришедший элемент - наверное уже совсем зашкварчик будет) - ты тем самым заставляешь акку менеджить поток сообщений этих единичек. но зачем? у тебя стримы и так уже шуруют, зачем еще параллельно заставлять менеджить очереди?
если не хотите хранить Seq, можно использовать batch
моя твоя вобще не понимать какую задачу ты решаешь. Насколько я понял Николая, он хочет по времени или по счетчику снимать какое-то агрегированное значение (видимо для подсчитывания какого-либо throughput в том или ином виде с учетом времени) и отвечал ему исходя из этих соображений. Что именно ты пытаешься донести и о чем - не понима

Oleg
14.03.2017
11:32:39

Artem
14.03.2017
11:33:26
groupedWithin затормозит стоим, не?

Борис
14.03.2017
11:33:29
Дык если речь только про метрики можно map{ x => meter.mark(); x} просто делать)

Mikhail
14.03.2017
11:33:30
именно эту работу и делает groupedWithin
"Chunk up the stream into groups of elements received within a time window, or limited by the given number of elements, whichever happens first." - это влияет на водопад

Oleg
14.03.2017
11:33:47