Implement the SQL 'exists' operator. I think this is our first serious subquery clause. Seems to work well.

This commit is contained in:
Par Winzell
2007-11-05 16:05:06 +00:00
parent 3789164dae
commit 934d7a28be
4 changed files with 46 additions and 1 deletions
@@ -43,6 +43,7 @@ import com.samskivert.jdbc.depot.expression.FunctionExp;
import com.samskivert.jdbc.depot.expression.LiteralExp; import com.samskivert.jdbc.depot.expression.LiteralExp;
import com.samskivert.jdbc.depot.expression.SQLExpression; import com.samskivert.jdbc.depot.expression.SQLExpression;
import com.samskivert.jdbc.depot.expression.ValueExp; 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.In;
import com.samskivert.jdbc.depot.operator.Conditionals.IsNull; import com.samskivert.jdbc.depot.operator.Conditionals.IsNull;
import com.samskivert.jdbc.depot.operator.Conditionals.FullTextMatch; import com.samskivert.jdbc.depot.operator.Conditionals.FullTextMatch;
@@ -191,6 +192,12 @@ public class BindVisitor implements ExpressionVisitor
} }
} }
public void visit (Exists<? extends PersistentRecord> exists)
throws Exception
{
exists.getSubClause().accept(this);
}
public void visit (SelectClause<? extends PersistentRecord> selectClause) public void visit (SelectClause<? extends PersistentRecord> selectClause)
throws Exception throws Exception
{ {
@@ -47,6 +47,7 @@ import com.samskivert.jdbc.depot.expression.FunctionExp;
import com.samskivert.jdbc.depot.expression.LiteralExp; import com.samskivert.jdbc.depot.expression.LiteralExp;
import com.samskivert.jdbc.depot.expression.SQLExpression; import com.samskivert.jdbc.depot.expression.SQLExpression;
import com.samskivert.jdbc.depot.expression.ValueExp; 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.In;
import com.samskivert.jdbc.depot.operator.Conditionals.IsNull; import com.samskivert.jdbc.depot.operator.Conditionals.IsNull;
import com.samskivert.jdbc.depot.operator.Conditionals.FullTextMatch; import com.samskivert.jdbc.depot.operator.Conditionals.FullTextMatch;
@@ -312,6 +313,13 @@ public abstract class BuildVisitor implements ExpressionVisitor
_builder.append("?"); _builder.append("?");
} }
public void visit (Exists<? extends PersistentRecord> exists)
throws Exception
{
_builder.append("exists ");
exists.getSubClause().accept(this);
}
public void visit (SelectClause<? extends PersistentRecord> selectClause) public void visit (SelectClause<? extends PersistentRecord> selectClause)
throws Exception throws Exception
{ {
@@ -38,6 +38,7 @@ import com.samskivert.jdbc.depot.clause.SelectClause;
import com.samskivert.jdbc.depot.clause.UpdateClause; import com.samskivert.jdbc.depot.clause.UpdateClause;
import com.samskivert.jdbc.depot.clause.Where; 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.In;
import com.samskivert.jdbc.depot.operator.Conditionals.IsNull; import com.samskivert.jdbc.depot.operator.Conditionals.IsNull;
import com.samskivert.jdbc.depot.operator.Conditionals.FullTextMatch; import com.samskivert.jdbc.depot.operator.Conditionals.FullTextMatch;
@@ -92,6 +93,8 @@ public interface ExpressionVisitor
throws Exception; throws Exception;
public void visit (ValueExp valueExp) public void visit (ValueExp valueExp)
throws Exception; throws Exception;
public void visit (Exists<? extends PersistentRecord> exists)
throws Exception;
public void visit (SelectClause<? extends PersistentRecord> selectClause) public void visit (SelectClause<? extends PersistentRecord> selectClause)
throws Exception; throws Exception;
public void visit (UpdateClause<? extends PersistentRecord> updateClause) public void visit (UpdateClause<? extends PersistentRecord> updateClause)
@@ -23,6 +23,7 @@ package com.samskivert.jdbc.depot.operator;
import java.util.Collection; import java.util.Collection;
import com.samskivert.jdbc.depot.PersistentRecord; 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.ColumnExp;
import com.samskivert.jdbc.depot.expression.ExpressionVisitor; import com.samskivert.jdbc.depot.expression.ExpressionVisitor;
import com.samskivert.jdbc.depot.expression.SQLExpression; import com.samskivert.jdbc.depot.expression.SQLExpression;
@@ -247,6 +248,32 @@ public abstract class Conditionals
} }
} }
/** The SQL ' exists' operator. */
public static class Exists<T extends PersistentRecord> implements SQLOperator
{
public Exists (SelectClause<T> clause)
{
_clause = clause;
}
public void accept (ExpressionVisitor builder) throws Exception
{
builder.visit(this);
}
public void addClasses (Collection<Class<? extends PersistentRecord>> classSet)
{
_clause.addClasses(classSet);
}
public SelectClause<T> getSubClause ()
{
return _clause;
}
protected SelectClause<T> _clause;
}
/** /**
* An attempt at a dialect-agnostic full-text search condition, such as MySQL's MATCH() and * An attempt at a dialect-agnostic full-text search condition, such as MySQL's MATCH() and
* PostgreSQL's @@ TO_TSQUERY(...) abilities. * PostgreSQL's @@ TO_TSQUERY(...) abilities.
@@ -265,7 +292,7 @@ public abstract class Conditionals
{ {
return _pClass; return _pClass;
} }
public String getQuery () public String getQuery ()
{ {
return _query; return _query;