diff --git a/src/java/com/samskivert/jdbc/depot/BindVisitor.java b/src/java/com/samskivert/jdbc/depot/BindVisitor.java index cf46fa3..672cf09 100644 --- a/src/java/com/samskivert/jdbc/depot/BindVisitor.java +++ b/src/java/com/samskivert/jdbc/depot/BindVisitor.java @@ -43,6 +43,7 @@ import com.samskivert.jdbc.depot.expression.FunctionExp; import com.samskivert.jdbc.depot.expression.LiteralExp; import com.samskivert.jdbc.depot.expression.SQLExpression; import com.samskivert.jdbc.depot.expression.ValueExp; +import com.samskivert.jdbc.depot.operator.Conditionals.Exists; import com.samskivert.jdbc.depot.operator.Conditionals.In; import com.samskivert.jdbc.depot.operator.Conditionals.IsNull; import com.samskivert.jdbc.depot.operator.Conditionals.FullTextMatch; @@ -191,6 +192,12 @@ public class BindVisitor implements ExpressionVisitor } } + public void visit (Exists exists) + throws Exception + { + exists.getSubClause().accept(this); + } + public void visit (SelectClause selectClause) throws Exception { diff --git a/src/java/com/samskivert/jdbc/depot/BuildVisitor.java b/src/java/com/samskivert/jdbc/depot/BuildVisitor.java index b092414..c55409d 100644 --- a/src/java/com/samskivert/jdbc/depot/BuildVisitor.java +++ b/src/java/com/samskivert/jdbc/depot/BuildVisitor.java @@ -47,6 +47,7 @@ import com.samskivert.jdbc.depot.expression.FunctionExp; import com.samskivert.jdbc.depot.expression.LiteralExp; import com.samskivert.jdbc.depot.expression.SQLExpression; import com.samskivert.jdbc.depot.expression.ValueExp; +import com.samskivert.jdbc.depot.operator.Conditionals.Exists; import com.samskivert.jdbc.depot.operator.Conditionals.In; import com.samskivert.jdbc.depot.operator.Conditionals.IsNull; import com.samskivert.jdbc.depot.operator.Conditionals.FullTextMatch; @@ -312,6 +313,13 @@ public abstract class BuildVisitor implements ExpressionVisitor _builder.append("?"); } + public void visit (Exists exists) + throws Exception + { + _builder.append("exists "); + exists.getSubClause().accept(this); + } + public void visit (SelectClause selectClause) throws Exception { diff --git a/src/java/com/samskivert/jdbc/depot/expression/ExpressionVisitor.java b/src/java/com/samskivert/jdbc/depot/expression/ExpressionVisitor.java index 7c08059..3245ea0 100644 --- a/src/java/com/samskivert/jdbc/depot/expression/ExpressionVisitor.java +++ b/src/java/com/samskivert/jdbc/depot/expression/ExpressionVisitor.java @@ -38,6 +38,7 @@ import com.samskivert.jdbc.depot.clause.SelectClause; import com.samskivert.jdbc.depot.clause.UpdateClause; import com.samskivert.jdbc.depot.clause.Where; +import com.samskivert.jdbc.depot.operator.Conditionals.Exists; import com.samskivert.jdbc.depot.operator.Conditionals.In; import com.samskivert.jdbc.depot.operator.Conditionals.IsNull; import com.samskivert.jdbc.depot.operator.Conditionals.FullTextMatch; @@ -92,6 +93,8 @@ public interface ExpressionVisitor throws Exception; public void visit (ValueExp valueExp) throws Exception; + public void visit (Exists exists) + throws Exception; public void visit (SelectClause selectClause) throws Exception; public void visit (UpdateClause updateClause) diff --git a/src/java/com/samskivert/jdbc/depot/operator/Conditionals.java b/src/java/com/samskivert/jdbc/depot/operator/Conditionals.java index 692dfab..7316c7f 100644 --- a/src/java/com/samskivert/jdbc/depot/operator/Conditionals.java +++ b/src/java/com/samskivert/jdbc/depot/operator/Conditionals.java @@ -23,6 +23,7 @@ package com.samskivert.jdbc.depot.operator; import java.util.Collection; import com.samskivert.jdbc.depot.PersistentRecord; +import com.samskivert.jdbc.depot.clause.SelectClause; import com.samskivert.jdbc.depot.expression.ColumnExp; import com.samskivert.jdbc.depot.expression.ExpressionVisitor; import com.samskivert.jdbc.depot.expression.SQLExpression; @@ -247,6 +248,32 @@ public abstract class Conditionals } } + /** The SQL ' exists' operator. */ + public static class Exists implements SQLOperator + { + public Exists (SelectClause clause) + { + _clause = clause; + } + + public void accept (ExpressionVisitor builder) throws Exception + { + builder.visit(this); + } + + public void addClasses (Collection> classSet) + { + _clause.addClasses(classSet); + } + + public SelectClause getSubClause () + { + return _clause; + } + + protected SelectClause _clause; + } + /** * An attempt at a dialect-agnostic full-text search condition, such as MySQL's MATCH() and * PostgreSQL's @@ TO_TSQUERY(...) abilities. @@ -265,7 +292,7 @@ public abstract class Conditionals { return _pClass; } - + public String getQuery () { return _query;