
Boris
21.11.2016
08:56:40

Mikhail
21.11.2016
08:57:05

Artem
21.11.2016
08:58:42
тестировать кластер без тестирования сетки не имеет особого смысла, как мне кажется
скидываешь пласт возможных проблем и все

Google

Artem
21.11.2016
08:59:32
> чтобы не ебаться с локальными роутами в оси
да, поэтому поднимаешь виртуалку и тестируешь комплексно e2e тестами

Mikhail
21.11.2016
08:59:48
вот после таких тестов и появляются статьи - "100500 ошибок которые мы сделали и в чем обманулись при тестировании"

Artem
21.11.2016
09:01:20
лол :)

Anatoliy
21.11.2016
09:21:18
Всем привет)
Народ, может кто подсказать, надо сделать автоматическую сортировку по полям таблицы в Slick.
Нужно это что бы был полноценный rest. Т.е. ... user?sort=+family,-name
Я сейчас перевожу это в формат seq(string, boolean), но теперь на основе этого надо через slick сформировать корректно запрос, на этом и стопнулся. Может кто подсказать куда смотреть?

Mikhail
21.11.2016
09:26:01
а он не позволяет цепочку сделать? q.sortBy().sortBy() ?

Anatoliy
21.11.2016
09:38:18
это можно, но у меня есть seq(string, boolean)
Из string я могу вытащить собственно название поля по которому надо сортировать, по boolean - как сортировать.
Но sortBy() работает по типу sortBy(_.family.asc) и вот как это сделать - я не знаю... ведь в seq() family - это string. Как это правильно надо делать тчо бы получилось?

Vladimir
21.11.2016
09:40:55
нужно этот seq конвертнуть в Seq[slick.lifted.ColumnOrdered[T]]
*маппер написать то бишь
и потом можно будет зафолдить ее уже в Query, думаю

Anatoliy
21.11.2016
09:43:23
Хм... щас буду пробовать, правда не уверен что всё верно понял...
Но - спасибо, попробую)
Эм.. а под "зафолдить" вы что имели в виду? Потому что я сейчас вижу вариант прогнать всё через foreach при этом используя var...

Vladimir
21.11.2016
09:53:56
Можно на "ты" :)
val query: Query[...] = ...
val sortedQuery = resultSeq.foldLeft(query)((sort, q) => q.sortBy(sort))
тож самое в целом

Google

Sergey Tolmachev
21.11.2016
10:32:47

Nikolay
21.11.2016
10:43:41
отдельный Thread Pool + jdbc Connection Pool?

Sergey Tolmachev
21.11.2016
10:44:38
синхронный scalikejdbc
там какой-то другой по-умолчанию пул вроде
как люди этот slick используют, там шаг в сторону от crud и ты попадаешь в бассейн с крокодилами
в scalikejdbc в худшем самом сложном случае можно plaintext sql написать

Nikolay
21.11.2016
10:47:00
в принципе там можно sql”select * from foo” писать
в слике можно. в некоторых случаях так и делал

Sergey Tolmachev
21.11.2016
10:48:05
там можно эти sql"..." компоновать?
в scalikejdbc можно и очень удобно строить запросы из разных кусочков полу plaintext запросов
а вообще не хочу начинать новый холивар :)
я хочу собрать deb, о чем писал в четверг! сегодня я буду всем надоедать здесь этим :D

Nikolay
21.11.2016
10:50:31

Sergey Tolmachev
21.11.2016
10:50:33

Sergey
21.11.2016
11:05:36
Scalikejdbc, насколько я помню, норовит под все сделать prepared statements... Поэтому использовать его с каким-то пулером коннектов надо осторожно. Например, для случая postgresql + pgbouncer.

Anatoliy
21.11.2016
11:06:26

Nirland
21.11.2016
11:13:09
Парни подскажите пожалуйста какую нибудь дельную книгу по распределенным системам, ну чтоб там начиная с кап теоремы звканчивая рафтом

Sergey Tolmachev
21.11.2016
11:13:15

Vladimir
21.11.2016
11:25:12

folex
21.11.2016
11:34:01
@Nirland http://book.mixu.net/distsys/single-page.html

Google

Sergey
21.11.2016
11:35:05
> Sergey Tolmachev
а что в этом плохого, если использовать запросы с параметрами?
На уровне протокола постгреса вызов prepared query - это в упрощенном виде передача по протоколу идентификатора запроса и списка параметров. Соответственно, если bouncer отдаст коннект, где запроса с таким id не будет - это приведет к понятным последствиям.

Anatoliy
21.11.2016
11:43:15

Sergey Tolmachev
21.11.2016
11:50:09
типа препаред стейтмент на уровне коннекта существует?

Sergey
21.11.2016
11:51:08

Sergey Tolmachev
21.11.2016
11:51:32
я не знаю, как это работает под капотом, но как-то это работает с этим :)

Vladimir
21.11.2016
11:57:10

Anatoliy
21.11.2016
11:59:09
но собирается?
неа, я тут вот такой вариант нашел:
http://scadiddle.blogspot.ru/2013/06/paging-and-sorting-with-slick-and-scala.html
Сейчас думаю как бы его переделать под вариант с одним общим методом, но тут уже не так сложно.
Осталось придумать вариант с передачей не только как сортирвоать, но и функции с тем как искать :) И будет всё хорошо)
ужас, ну так его переделать надо что бы ужаса не было)

Timothy
21.11.2016
12:01:21
https://github.com/fcomb/fcomb/blob/develop/fcomb-persist/src/main/scala/io/fcomb/persist/PaginationActions.scala#L28-L45 у меня такой generic метод
q.sortBy { t =>
val c = f(t).applyOrElse(column, unknownSortColumnPF)
val sortOrder = order match {
case SortOrder.Asc => Ordering(Ordering.Asc)
case SortOrder.Desc => Ordering(Ordering.Desc)
}
ColumnOrdered(c, sortOrder)
}

Anatoliy
21.11.2016
12:01:58
на самом деле хороший пример в примере Play REST в Activator'е, но вот именно его я и пытаюсь на слик переложить, уже все остальное переложил, только сортировка осталась

Timothy
21.11.2016
12:06:54
т.е. применяет .sortBy
https://github.com/fcomb/fcomb/blob/develop/fcomb-persist/src/main/scala/io/fcomb/persist/OrganizationGroupsRepo.scala#L103-L107 вот пример сортировки по колонкам
не нужно писать проверку на каждое поле и на asc/desc
лучше способ без макросов я не нашел

Anatoliy
21.11.2016
12:08:37
Вот я примерно это и хотел... только мозгов не хватает видимо пока самому такое делать. Буду изучать тогда ваш пример)

Timothy
21.11.2016
12:10:06
если что, могу помочь ибо там все без доки

Google

Anatoliy
21.11.2016
12:11:55
Буду благодарен, ибо разбираюсь я на... достаточно низком уровне по моему мнению..)

Timothy
21.11.2016
12:15:27
это все работает из play?

Anatoliy
21.11.2016
12:15:38
да
Собственно начинал я с play-api-rest который можно взять через Activator.
Но я хочу это видеть в работе через slick. Как идут данные внутри - я разобрался. А вот с самим сликом пока не могу.
Собственно что делаю:
Для каждой таблички есть подобные методы:
val sortingFields = Seq("id", "login")
def sortingFunc(fieldsWithOrder: (String, Boolean)): (UserTableDef) => ColumnOrdered[_] = {
fieldsWithOrder match {
case ("id", ASC) => _.id.asc
case ("id", DESC) => _.id.desc
case ("login", ASC) => _.login.asc
case ("login", DESC) => _.login.desc
}
}
т.е. я смотрю какие поля разрешены к сортировке и выдаю их в формате seq(string, boolean)
Если там косяк - значит выдаю косяк

Mikhail
21.11.2016
12:18:00
case ("id", ASC) => _.id.asc
case ("id", DESC) => _.id.desc
не ужели нельзя взять колумн и потом к нему применить asc || desc ?

Timothy
21.11.2016
12:19:18
ASC|DESC это что за тип?

Anatoliy
21.11.2016
12:19:19
Можно, но я пока делаю по примеру, и просто хочу сделать что бы оно работало
Boolean

Timothy
21.11.2016
12:19:32
а

Mikhail
21.11.2016
12:19:41
лучше енум

Timothy
21.11.2016
12:19:42
я думал там enum

Mikhail
21.11.2016
12:20:00
или в виде обжектов, но не бул

Anatoliy
21.11.2016
12:20:11
object Sorting {
final val ASC = false
final val DESC = true
}
пока там так

Timothy
21.11.2016
12:20:19
sealed trait SortOrder
object SortOrder {
final case object Asc extends SortOrder
final case object Desc extends SortOrder
}

Mikhail
21.11.2016
12:21:05
fieldsWithOrder: (String, Boolean) - над названиями как всегда поработать надо. тупл называть "поля" во множественном числе - странновато

Timothy
21.11.2016
12:22:09

Anatoliy
21.11.2016
12:22:34
Соглашусь про названия, но я опять же пока беру названия из примеров, целые куски кода оттуда беру

Google


Anatoliy
21.11.2016
12:22:46
А так да, проблемы всегда проблемы
Собственно что дергаю в методе котроллера:
Users.page(1L, sortingFields, p, s)
//Сортировка
def page(id: Long, sortingFields: Seq[(String, Boolean)], p: Int, s: Int) = Future.successful {
val tbl = table
//Тут по идее условие для filter должно быть
val filterFunc: UserTableDef => Rep[Boolean] = { u =>
(u.id === id)
}
//Тут дергаем уже общий для всех моделей метод и скармливаем ему функцию с фильтров и данные по сортировке
super.page(p, s)(filterFunc)(sortingFields.map(sortingFunc): _*)
Page(Seq(User(1, "login", "passwd", Some("email"),false)),1,1,1)
}
Вот этот общий метод:
`
def page[T](p: Int, s: Int)(filterFunc: T => Rep[Boolean])(sortFuncs: Seq[slick.lifted.ColumnOrdered[T]]*) = {
var res = table
sortFuncs.foldLeft(res)((r,q) =>
r.sortBy(q)
)
res.filter(filterFunc)
//Ну и тут по идее надо вернуть Page где sorted уже запрос с сортировкой и фильтрами
// Page(
// items = (sorted.drop((p - 1) * s).take(s)),
// page = p,
// size = s,
// total = (sorted.size)
// )
}
Вот примерно как-то так. Где-то я не туда завернул, а где - понять не могу


Aleksei
21.11.2016
12:31:25
а есть же какие то веб сервисы для шаринга кода прямо вот в реальном времени да?

Mikhail
21.11.2016
12:32:08
ага, даже в идею плагинчиком цепляется
и можно краудсорсингом в лайве заниматься
но честно говоря быстро надоедает, не функционально

Aleksei
21.11.2016
12:32:57
ну сюда копипастить код тоже не очень крутая практика
ну или хотя бы моноспейсед если немного кода
или ссылка на пастбин

Timothy
21.11.2016
12:34:09
c9 умеет

Mikhail
21.11.2016
12:35:51
если сюда вставить то и скалафиддл всякие есть) я что-то про коллаборацию вспомнил - парное программирование удаленное)
https://floobits.com/

Timothy
21.11.2016
12:37:29
wow, даже имакс есть

Mikhail
21.11.2016
12:38:13
вот этот как-то давно пользовал, для опенсорса шарить и водить чела по коду удаленно вполне удобно, но не более) выделяешь кусок кода - у него тоже выделяется, болтаете обсуждаете туда сюда гуляете)

Grigory
21.11.2016
12:41:37
Рябят по спарку вопрос; как получить адрес локальной директории воркеров для конретного джоба?
чтото типа по дефолту это /tmp/spark/app-appid
вообще даже драйвера

Iaroslav
21.11.2016
12:46:22
spark.local.dir из конфига вытащить?
аа, конкретной джобы/экзекьютора?