Skip to content

Commit

Permalink
Merge pull request #106 from slick/tmp/irrefutable-filter-conditions
Browse files Browse the repository at this point in the history
Remove Filter nodes with a LiteralNode(true) as the filter condition using additional Filter.ifRefutable constructor.
  • Loading branch information
cvogt committed Feb 25, 2013
2 parents 2451ed2 + 237306c commit d847994
Show file tree
Hide file tree
Showing 6 changed files with 11 additions and 8 deletions.
2 changes: 1 addition & 1 deletion src/main/scala/scala/slick/ast/Dump.scala
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class DumpContext(val out: PrintWriter, val typed: Boolean = true) {
case _ =>
out.println(prefix + name + tree + typeInfo)
for((chg, n) <- tree.nodeChildren.zip(tree.nodeChildNames))
dump(Node(chg), prefix + " ", n+": ")
dump(chg, prefix + " ", n+": ")
}
}
}
9 changes: 6 additions & 3 deletions src/main/scala/scala/slick/ast/Node.scala
Original file line number Diff line number Diff line change
Expand Up @@ -291,12 +291,15 @@ final case class Filter(generator: Symbol, from: Node, where: Node) extends Filt
def right = where
override def nodeChildNames = Seq("from "+generator, "where")
protected[this] def nodeRebuild(left: Node, right: Node) = copy(from = left, where = right)
override def nodeDelegate =
if(where match { case LiteralNode(true) => true; case _ => false }) left
else super.nodeDelegate
protected[this] def nodeRebuildWithGenerators(gen: IndexedSeq[Symbol]) = copy(generator = gen(0))
}

object Filter {
def ifRefutable(generator: Symbol, from: Node, where: Node): Node =
if(where match { case LiteralNode(true) => true; case _ => false }) from
else Filter(generator, from, where)
}

/** A .sortBy call of type
* (CollectionType(c, t), _) => CollectionType(c, t). */
final case class SortBy(generator: Symbol, from: Node, by: Seq[(Node, Ordering)]) extends FilteredQuery {
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/scala/slick/direct/SlickBackend.scala
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ class SlickBackend( val driver: JdbcDriver, mapper:Mapper ) extends QueryableBac
val new_scope = scope+(arg.symbol -> sq.Ref(sq_symbol))
val sq_rhs = s2sq(body, new_scope).node
new Query( term.decoded match {
case "filter" => sq.Filter( sq_symbol, sq_lhs, sq_rhs )
case "filter" => sq.Filter.ifRefutable( sq_symbol, sq_lhs, sq_rhs )
case "sortBy" => sq.SortBy( sq_symbol, sq_lhs, flattenAndPrepareForSortBy(sq_rhs) )
case "map" => sq.Bind( sq_symbol, sq_lhs, sq.Pure(sq_rhs) )
case "flatMap" => sq.Bind( sq_symbol, sq_lhs, sq_rhs )
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/scala/slick/lifted/AbstractTable.scala
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ abstract class AbstractTable[T](val schemaName: Option[String], val tableName: S
val fv = Library.==.typed[Boolean](Node(targetColumns(aliased.value)), Node(sourceColumns))
val fk = ForeignKey(name, this, q.unpackable.asInstanceOf[ShapedValue[TT, _]],
targetTable, unpackp, sourceColumns, targetColumns, onUpdate, onDelete)
new ForeignKeyQuery[TT, U](Filter(generator, Node(q), fv), q.unpackable, IndexedSeq(fk), q, generator, aliased.value)
new ForeignKeyQuery[TT, U](Filter.ifRefutable(generator, Node(q), fv), q.unpackable, IndexedSeq(fk), q, generator, aliased.value)
}

def primaryKey[T](name: String, sourceColumns: T)(implicit shape: Shape[T, _, _]): PrimaryKey = PrimaryKey(name, ExtraUtil.linearizeFieldRefs(Node(shape.pack(sourceColumns))))
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/scala/slick/lifted/Constraint.scala
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class ForeignKeyQuery[E <: TableNode, U](
val conditions =
newFKs.map(fk => Library.==.typed[Boolean](Node(fk.targetColumns(aliasedValue)), Node(fk.sourceColumns))).
reduceLeft[Node]((a, b) => Library.And.typed[Boolean](a, b))
val newDelegate = Filter(generator, Node(targetBaseQuery), conditions)
val newDelegate = Filter.ifRefutable(generator, Node(targetBaseQuery), conditions)
new ForeignKeyQuery[E, U](newDelegate, base, newFKs, targetBaseQuery, generator, aliasedValue)
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/scala/slick/lifted/Query.scala
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ abstract class Query[+E, U] extends Rep[Seq[U]] with EncodeRef { self =>
val generator = new AnonSymbol
val aliased = unpackable.encodeRef(generator)
val fv = f(aliased.value)
new WrappingQuery[E, U](Filter(generator, Node(this), Node(wt(fv))), unpackable)
new WrappingQuery[E, U](Filter.ifRefutable(generator, Node(this), Node(wt(fv))), unpackable)
}

def withFilter[T : CanBeQueryCondition](f: E => T) = filter(f)
Expand Down

0 comments on commit d847994

Please sign in to comment.