diff --git a/src/java/com/samskivert/depot/Ops.java b/src/java/com/samskivert/depot/Ops.java index 114febc..e1facd4 100644 --- a/src/java/com/samskivert/depot/Ops.java +++ b/src/java/com/samskivert/depot/Ops.java @@ -123,7 +123,7 @@ public class Ops */ public static FluentExp like (SQLExpression source, Comparable value) { - return new Like(source, value); + return new Like(source, value, true); } /** @@ -131,9 +131,26 @@ public class Ops */ public static FluentExp like (SQLExpression source, SQLExpression expr) { - return new Like(source, expr); + return new Like(source, expr, true); } + /** + * Returns an expression that matches when the source is NOT like the supplied value. + */ + public static FluentExp notLike (SQLExpression source, Comparable value) + { + return new Like(source, value, false); + } + + /** + * Returns an expression that matches when the source is NOT like the supplied expression. + */ + public static FluentExp notLike (SQLExpression source, SQLExpression expr) + { + return new Like(source, expr, false); + } + + /** * Creates an EXISTS expression with the supplied select clause. */ diff --git a/src/java/com/samskivert/depot/expression/ColumnExp.java b/src/java/com/samskivert/depot/expression/ColumnExp.java index 560ae5d..e35353b 100644 --- a/src/java/com/samskivert/depot/expression/ColumnExp.java +++ b/src/java/com/samskivert/depot/expression/ColumnExp.java @@ -25,8 +25,6 @@ import java.util.Collection; import com.samskivert.depot.PersistentRecord; import com.samskivert.depot.clause.Join; import com.samskivert.depot.impl.FragmentVisitor; -import com.samskivert.depot.impl.operator.In; -import com.samskivert.depot.impl.operator.Like; /** * An expression that unambiguously identifies a field of a class, for example @@ -54,30 +52,12 @@ public class ColumnExp extends FluentExp return new ColumnExp(oClass, name); } - /** Returns an {@link In} with this column and the supplied values. */ - public In in (Iterable> values) - { - return new In(this, values); - } - /** Returns a {@link Join} on this column and the supplied target. */ public Join join (ColumnExp join) { return new Join(this, join); } - /** Returns a {@link Like} on this column and the supplied target. */ - public Like like (Comparable value) - { - return new Like(this, value); - } - - /** Returns a {@link Like} on this column and the supplied target. */ - public Like like (SQLExpression expr) - { - return new Like(this, expr); - } - // from SQLExpression public Object accept (FragmentVisitor builder) { diff --git a/src/java/com/samskivert/depot/expression/FluentExp.java b/src/java/com/samskivert/depot/expression/FluentExp.java index f9b084b..3f4d58f 100644 --- a/src/java/com/samskivert/depot/expression/FluentExp.java +++ b/src/java/com/samskivert/depot/expression/FluentExp.java @@ -32,6 +32,7 @@ import com.samskivert.depot.impl.operator.In; import com.samskivert.depot.impl.operator.IsNull; import com.samskivert.depot.impl.operator.LessThan; import com.samskivert.depot.impl.operator.LessThanEquals; +import com.samskivert.depot.impl.operator.Like; import com.samskivert.depot.impl.operator.Mul; import com.samskivert.depot.impl.operator.NotEquals; import com.samskivert.depot.impl.operator.Sub; @@ -78,6 +79,12 @@ public abstract class FluentExp return new In(this, values); } + /** Returns an {@link In} with this column and the supplied values. */ + public In in (Iterable> values) + { + return new In(this, values); + } + /** Returns a {@link GreaterThan} with this expression and the supplied target. */ public FluentExp greaterThan (Comparable value) { @@ -209,4 +216,29 @@ public abstract class FluentExp { return new Div(this, expr); } + + /** Returns a {@link Like} on this column and the supplied target. */ + public Like like (Comparable value) + { + return new Like(this, value, true); + } + + /** Returns a {@link Like} on this column and the supplied target. */ + public Like like (SQLExpression expr) + { + return new Like(this, expr, true); + } + + /** Returns a negated {@link Like} on this column and the supplied target. */ + public Like notLike (Comparable value) + { + return new Like(this, value, false); + } + + /** Returns a negated {@link Like} on this column and the supplied target. */ + public Like notLike (SQLExpression expr) + { + return new Like(this, expr, false); + } + } diff --git a/src/java/com/samskivert/depot/impl/HSQLBuilder.java b/src/java/com/samskivert/depot/impl/HSQLBuilder.java index 4a819a4..1b4a2e6 100644 --- a/src/java/com/samskivert/depot/impl/HSQLBuilder.java +++ b/src/java/com/samskivert/depot/impl/HSQLBuilder.java @@ -86,7 +86,8 @@ public class HSQLBuilder for (String field : fields) { for (String ftsWord : ftsWords) { // build comparisons between each word and column - bits.add(new Like(new Lower(new ColumnExp(pClass, field)), "%"+ftsWord+"%")); + bits.add(new Like(new Lower( + new ColumnExp(pClass, field)), "%"+ftsWord+"%", true)); } } // then just OR them all together and we have our query diff --git a/src/java/com/samskivert/depot/impl/operator/Like.java b/src/java/com/samskivert/depot/impl/operator/Like.java index a3e6ab4..4fd328a 100644 --- a/src/java/com/samskivert/depot/impl/operator/Like.java +++ b/src/java/com/samskivert/depot/impl/operator/Like.java @@ -23,24 +23,26 @@ package com.samskivert.depot.impl.operator; import com.samskivert.depot.expression.SQLExpression; /** - * The SQL 'like' operator. + * The SQL 'like' (and 'not like') operator. */ public class Like extends BinaryOperator { - public Like (SQLExpression column, Comparable value) + public Like (SQLExpression column, Comparable value, boolean like) { super(column, value); + _like = like; } - public Like (SQLExpression column, SQLExpression value) + public Like (SQLExpression column, SQLExpression value, boolean like) { super(column, value); + _like = like; } @Override // from BinaryOperator public String operator() { - return " like "; + return _like ? " like " : " not like "; } @Override // from BinaryOperator @@ -48,4 +50,6 @@ public class Like extends BinaryOperator { return new NoValue("Like operator not implemented"); } + + protected boolean _like; }