Операция умножения столбцов в группе по запросу в Slick

Я столкнулся с использованием группы по адресу суммирования/агрегирования объекта Scala Slick в другой

Хотите пойти дальше, умножив два или более столбца (_.countA*_countB) перед применением функции суммирования, как показано ниже, но она возвращает ошибку «Ожидается тип коллекции, найдено {s2:Int/Number(10... .". Любые предложения по обработке такого сценария.

        Query(Things).filter(_.date > date).groupBy(x => (x.labelOne, x.labelTwo)).map
       {
        case ((labelOne, labelTwo), things) => {
                   (labelOne, labelTwo, things.map(_.countA*_.countB).sum)
        }
       }.run.map(SummarizedThing.tupled)

Спасибо.


person Mkt281001    schedule 08.01.2014    source источник
comment
Также опубликовано здесь: groups.google.com/forum/#!topic/scalaquery/ Iq6GaslpSNc Если вы будете публиковать одну и ту же тему в Stack Overflow и списке рассылки Slick, пожалуйста, делайте перекрестные ссылки на темы в будущем. Это поможет всем в сообществе найти ответы легче!   -  person cvogt    schedule 09.01.2014


Ответы (1)


Вы должны быть в состоянии сделать это следующим образом:

Вне вашего запроса определите операцию

//multiplication operator 
val multiply = SimpleBinaryOperator.apply[Int]("*")

Убедитесь, что тип (Int) соответствует значениям ваших столбцов, а символ оператора соответствует оператору, который используется в нашем языке базы данных SQL.

Теперь вы должны иметь возможность использовать

things.map{case (thingA,thingB) => multiply(thingA, thingB)}.sum

Чтобы делать то, что вы хотите.

См. также: http://slick.typesafe.com/doc/1.0.1/lifted-embedding.html#user-defined-functions-and-types

По-видимому, арифметика не может быть выполнена внутри groupBy из-за ошибки. Вы можете обойти это, обернув свой запрос в другой запрос:

(for{
  product <- (for{
    intA <- A
    intB <- B
  } yield multiply(intA,intB))
} yield product).groupby(...).map(...)
person Wellingr    schedule 08.01.2014
comment
Я пробовал, как было предложено, но я считаю, что это работает только с объектом TableQuery, а не внутри группы, нашел эту ошибку в slick (github.com/slick/slick/issues/511), см. также ссылку groups.google.com/forum/#!topic/scalaquery/Ppf1QOv1b58 - person Mkt281001; 09.01.2014
comment
Возможно, вы можете обойти это, заключив свой запрос в другой запрос. - person Wellingr; 09.01.2014