2013-11-18 3 views
2

Я использую Slick versio 2.0.0-M3. Если у меня два Query s, представляющие отношения одного и того же типа, я вижу, что есть оператор union, чтобы включить их в разъединение, но я не вижу сопоставимого оператора для получения их пересечения или их разности. Не существуют ли такие операторы в Slick?Могу ли я получить реляционное пересечение или разницу с помощью Slick 2?

Я думаю, что вышеизложенное объясняет, что я ищу, но если нет, вот пример. Я имею поставщиков таблицы:

case class Supplier(snum: String, sname: String, status: Int, city: String) 

class Suppliers(tag: Tag) extends Table[Supplier](tag, "suppliers") { 
    def snum = column[String]("snum") 
    def sname = column[String]("sname") 
    def status = column[Int]("status") 
    def city  = column[String]("city") 
    def * = (snum, sname, status, city) <> (Supplier.tupled, Supplier.unapply _) 
} 
val suppliers = TableQuery[Suppliers] 

Если я хочу знать о поставщиках, которые либо находятся в определенном городе или имеют особый статус, я вижу, как использовать Query.union для этого:

scala> val thirtySuppliers = suppliers.filter(_.status === 30) 
thirtySuppliers: scala.slick.lifted.Query[Suppliers,Suppliers#TableElementType] = [email protected] 

scala> val londonSuppliers = suppliers.filter(_.city === "London") 
londonSuppliers: scala.slick.lifted.Query[Suppliers,Suppliers#TableElementType] = [email protected] 

scala> (thirtySuppliers union londonSuppliers).foreach(println) 
Supplier(S1,Smith,20,London) 
Supplier(S4,Clark,20,London) 
Supplier(S3,Blake,30,Paris) 
Supplier(S5,Adams,30,Athens) 

Нет проблема. Но что, если я хочу только поставщиков, которые являются и в определенном городе и имеют особый статус? Кажется, как будто я должен быть в состоянии сделать что-то вроде:

(thirtySuppliers intersect londonSuppliers).foreach(println) 

Или если я хочу поставщиков в конкретном городе кроме те, которые имеют особый статус. Могу ли я не делать что-то вроде:

(thirtySuppliers except londonSuppliers).foreach(println) 

SQL имеет UNION, INTERSECT и EXCEPT операции, и Query класс Slick имеет в union метод, который строит запрос SQL с помощью SQL-х UNION, но я не вижу Query методы Slick для получения пересечений и различий. Я скучаю по ним?

ответ

1

Существует запрос выдвижная, который реализует это. Вероятно, он составит 2.0 или 2.1. https://github.com/slick/slick/pull/242 Нам еще нужно выяснить некоторые детали и немного почистить.

0

Операции в значительной степени сложны в том, что пересечение может быть всего лишь двумя фильтрами. Например

val intersect = suppliers.filter(_.status === 30).filter(_.city === "London") 

или исключением:

val except= suppliers.filter(_.city === "London").filterNot(_.status === 30) 
+0

То, что вы говорите, истинно в этом случае, так как мои два отношения операндов являются ограничениями одной и той же базовой таблицы. Тем не менее, я заинтересован в возможности выполнять операции в общем случае любых двух запросов Query (с соответствующими столбцами). Возможно, в моем примере я должен был использовать две отдельные базовые таблицы. –