From f1dd34e4b3cc1e042774150620d796cdef6785ba Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Mon, 8 Sep 2008 17:54:11 +0000 Subject: [PATCH] We need Key to export a Key.Expression which we can use inside the SQL for a KeySet so that the "where" keyword is not repeated every time we bind a key. --- .../samskivert/jdbc/depot/BindVisitor.java | 2 +- .../samskivert/jdbc/depot/BuildVisitor.java | 3 +-- src/java/com/samskivert/jdbc/depot/Key.java | 20 ++++++++++++++++++- .../com/samskivert/jdbc/depot/KeySet.java | 2 +- .../depot/expression/ExpressionVisitor.java | 2 +- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/java/com/samskivert/jdbc/depot/BindVisitor.java b/src/java/com/samskivert/jdbc/depot/BindVisitor.java index ec10ea7..abc2249 100644 --- a/src/java/com/samskivert/jdbc/depot/BindVisitor.java +++ b/src/java/com/samskivert/jdbc/depot/BindVisitor.java @@ -71,7 +71,7 @@ public class BindVisitor implements ExpressionVisitor // nothing needed } - public void visit (Key key) + public void visit (Key.Expression key) { for (Comparable value : key.getValues()) { if (value != null) { diff --git a/src/java/com/samskivert/jdbc/depot/BuildVisitor.java b/src/java/com/samskivert/jdbc/depot/BuildVisitor.java index f14f363..de8d74d 100644 --- a/src/java/com/samskivert/jdbc/depot/BuildVisitor.java +++ b/src/java/com/samskivert/jdbc/depot/BuildVisitor.java @@ -94,9 +94,8 @@ public abstract class BuildVisitor implements ExpressionVisitor where.getWhereExpression().accept(this); } - public void visit (Key key) + public void visit (Key.Expression key) { - _builder.append(" where "); Class pClass = key.getPersistentClass(); String[] keyFields = KeyUtil.getKeyFields(pClass); List> values = key.getValues(); diff --git a/src/java/com/samskivert/jdbc/depot/Key.java b/src/java/com/samskivert/jdbc/depot/Key.java index 8fb5ca6..fb153c0 100644 --- a/src/java/com/samskivert/jdbc/depot/Key.java +++ b/src/java/com/samskivert/jdbc/depot/Key.java @@ -41,6 +41,24 @@ import com.samskivert.util.StringUtil; public class Key extends WhereClause implements SQLExpression, CacheKey, ValidatingCacheInvalidator, Serializable { + /** Handles the matching of the key columns to its bound values. This is needed so that we can + * combine a buncy of keys into a {@link KeySet}. */ + public class Expression implements SQLExpression + { + public Class getPersistentClass () { + return Key.this.getPersistentClass(); + } + public List> getValues () { + return Key.this.getValues(); + } + public void accept (ExpressionVisitor builder) { + builder.visit(this); + } + public void addClasses (Collection> classSet) { + classSet.add(getPersistentClass()); + } + } + /** * Constructs a new single-column {@code Key} with the given value. */ @@ -130,7 +148,7 @@ public class Key extends WhereClause // from WhereClause public SQLExpression getWhereExpression () { - throw new UnsupportedOperationException("Key is bound specially."); + return new Expression(); } // from SQLExpression diff --git a/src/java/com/samskivert/jdbc/depot/KeySet.java b/src/java/com/samskivert/jdbc/depot/KeySet.java index 1fd0f4c..442f0df 100644 --- a/src/java/com/samskivert/jdbc/depot/KeySet.java +++ b/src/java/com/samskivert/jdbc/depot/KeySet.java @@ -72,7 +72,7 @@ public class KeySet extends WhereClause SQLExpression[] keyArray = new SQLExpression[keys.size()]; int ii = 0; for (Key key : keys) { - keyArray[ii++] = key; + keyArray[ii++] = key.getWhereExpression(); } _condition = new Logic.Or(keyArray); } diff --git a/src/java/com/samskivert/jdbc/depot/expression/ExpressionVisitor.java b/src/java/com/samskivert/jdbc/depot/expression/ExpressionVisitor.java index 99d9437..65f9216 100644 --- a/src/java/com/samskivert/jdbc/depot/expression/ExpressionVisitor.java +++ b/src/java/com/samskivert/jdbc/depot/expression/ExpressionVisitor.java @@ -69,7 +69,7 @@ public interface ExpressionVisitor public void visit (LiteralExp literalExp); public void visit (ValueExp valueExp); public void visit (WhereClause where); - public void visit (Key key); + public void visit (Key.Expression key); public void visit (MultiKey key); public void visit (Exists exists); public void visit (SelectClause selectClause);