From ff250b2edd827a818041de9ff1cefb91663255fa Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Thu, 10 Sep 2009 03:35:03 +0000 Subject: [PATCH] Extracted BinaryOperator and MultiOperator into top-level classes in preparation for possibly nixing SQLOperator, which appears to me to be unused if not unnecessary. --- .../samskivert/depot/impl/BuildVisitor.java | 4 +- .../depot/impl/ExpressionEvaluator.java | 4 +- .../depot/impl/ExpressionVisitor.java | 4 +- .../samskivert/depot/impl/HSQLBuilder.java | 2 +- .../samskivert/depot/impl/operator/And.java | 2 +- .../depot/impl/operator/Arithmetic.java | 1 - .../depot/impl/operator/BaseOperator.java | 73 ++++++++ .../depot/impl/operator/BinaryOperator.java | 56 ++++++ .../depot/impl/operator/Equals.java | 6 +- .../depot/impl/operator/GreaterThan.java | 6 +- .../impl/operator/GreaterThanEquals.java | 6 +- .../depot/impl/operator/LessThan.java | 6 +- .../depot/impl/operator/LessThanEquals.java | 6 +- .../samskivert/depot/impl/operator/Like.java | 6 +- .../depot/impl/operator/MultiOperator.java | 58 +++++++ .../depot/impl/operator/NotEquals.java | 6 +- .../samskivert/depot/impl/operator/Or.java | 2 +- .../depot/impl/operator/SQLOperator.java | 159 ------------------ 18 files changed, 217 insertions(+), 190 deletions(-) create mode 100644 src/java/com/samskivert/depot/impl/operator/BaseOperator.java create mode 100644 src/java/com/samskivert/depot/impl/operator/BinaryOperator.java create mode 100644 src/java/com/samskivert/depot/impl/operator/MultiOperator.java diff --git a/src/java/com/samskivert/depot/impl/BuildVisitor.java b/src/java/com/samskivert/depot/impl/BuildVisitor.java index 5d8fc45..48511db 100644 --- a/src/java/com/samskivert/depot/impl/BuildVisitor.java +++ b/src/java/com/samskivert/depot/impl/BuildVisitor.java @@ -91,12 +91,12 @@ import com.samskivert.depot.impl.expression.StringFun.Position; import com.samskivert.depot.impl.expression.StringFun.Substring; import com.samskivert.depot.impl.expression.StringFun.Trim; import com.samskivert.depot.impl.expression.StringFun.Upper; +import com.samskivert.depot.impl.operator.BinaryOperator; import com.samskivert.depot.impl.operator.Exists; import com.samskivert.depot.impl.operator.In; import com.samskivert.depot.impl.operator.IsNull; +import com.samskivert.depot.impl.operator.MultiOperator; import com.samskivert.depot.impl.operator.Not; -import com.samskivert.depot.impl.operator.SQLOperator.BinaryOperator; -import com.samskivert.depot.impl.operator.SQLOperator.MultiOperator; /** * Implements the base functionality of the SQL-building pass of {@link SQLBuilder}. Dialectal diff --git a/src/java/com/samskivert/depot/impl/ExpressionEvaluator.java b/src/java/com/samskivert/depot/impl/ExpressionEvaluator.java index d69db92..acf1619 100644 --- a/src/java/com/samskivert/depot/impl/ExpressionEvaluator.java +++ b/src/java/com/samskivert/depot/impl/ExpressionEvaluator.java @@ -81,12 +81,12 @@ import com.samskivert.depot.impl.expression.StringFun.Position; import com.samskivert.depot.impl.expression.StringFun.Substring; import com.samskivert.depot.impl.expression.StringFun.Trim; import com.samskivert.depot.impl.expression.StringFun.Upper; +import com.samskivert.depot.impl.operator.BinaryOperator; import com.samskivert.depot.impl.operator.Exists; import com.samskivert.depot.impl.operator.In; import com.samskivert.depot.impl.operator.IsNull; +import com.samskivert.depot.impl.operator.MultiOperator; import com.samskivert.depot.impl.operator.Not; -import com.samskivert.depot.impl.operator.SQLOperator.BinaryOperator; -import com.samskivert.depot.impl.operator.SQLOperator.MultiOperator; import com.samskivert.util.ArrayUtil; import com.samskivert.util.Tuple; diff --git a/src/java/com/samskivert/depot/impl/ExpressionVisitor.java b/src/java/com/samskivert/depot/impl/ExpressionVisitor.java index 115af2a..541ad9e 100644 --- a/src/java/com/samskivert/depot/impl/ExpressionVisitor.java +++ b/src/java/com/samskivert/depot/impl/ExpressionVisitor.java @@ -75,12 +75,12 @@ import com.samskivert.depot.impl.expression.StringFun.Position; import com.samskivert.depot.impl.expression.StringFun.Substring; import com.samskivert.depot.impl.expression.StringFun.Trim; import com.samskivert.depot.impl.expression.StringFun.Upper; +import com.samskivert.depot.impl.operator.BinaryOperator; import com.samskivert.depot.impl.operator.Exists; import com.samskivert.depot.impl.operator.In; import com.samskivert.depot.impl.operator.IsNull; +import com.samskivert.depot.impl.operator.MultiOperator; import com.samskivert.depot.impl.operator.Not; -import com.samskivert.depot.impl.operator.SQLOperator.BinaryOperator; -import com.samskivert.depot.impl.operator.SQLOperator.MultiOperator; /** * Enumerates visitation methods for every possible SQL expression type. diff --git a/src/java/com/samskivert/depot/impl/HSQLBuilder.java b/src/java/com/samskivert/depot/impl/HSQLBuilder.java index ab0ec7e..01b4d0f 100644 --- a/src/java/com/samskivert/depot/impl/HSQLBuilder.java +++ b/src/java/com/samskivert/depot/impl/HSQLBuilder.java @@ -54,8 +54,8 @@ import com.samskivert.depot.impl.expression.StringFun.Lower; import com.samskivert.depot.impl.operator.BitAnd; import com.samskivert.depot.impl.operator.BitOr; import com.samskivert.depot.impl.operator.Like; +import com.samskivert.depot.impl.operator.MultiOperator; import com.samskivert.depot.impl.operator.Or; -import com.samskivert.depot.impl.operator.SQLOperator.MultiOperator; public class HSQLBuilder extends SQLBuilder diff --git a/src/java/com/samskivert/depot/impl/operator/And.java b/src/java/com/samskivert/depot/impl/operator/And.java index 40335ee..27170e0 100644 --- a/src/java/com/samskivert/depot/impl/operator/And.java +++ b/src/java/com/samskivert/depot/impl/operator/And.java @@ -27,7 +27,7 @@ import com.samskivert.depot.expression.SQLExpression; /** * Represents a condition that is true iff all its subconditions are true. */ -public class And extends SQLOperator.MultiOperator +public class And extends MultiOperator { public And (Collection conditions) { diff --git a/src/java/com/samskivert/depot/impl/operator/Arithmetic.java b/src/java/com/samskivert/depot/impl/operator/Arithmetic.java index 91d99aa..3810bda 100644 --- a/src/java/com/samskivert/depot/impl/operator/Arithmetic.java +++ b/src/java/com/samskivert/depot/impl/operator/Arithmetic.java @@ -22,7 +22,6 @@ package com.samskivert.depot.impl.operator; import com.samskivert.depot.expression.SQLExpression; import com.samskivert.depot.impl.expression.ValueExp; -import com.samskivert.depot.impl.operator.SQLOperator.MultiOperator; /** * A convenient container for implementations of arithmetic operators. diff --git a/src/java/com/samskivert/depot/impl/operator/BaseOperator.java b/src/java/com/samskivert/depot/impl/operator/BaseOperator.java new file mode 100644 index 0000000..7d0e066 --- /dev/null +++ b/src/java/com/samskivert/depot/impl/operator/BaseOperator.java @@ -0,0 +1,73 @@ +// +// $Id$ + +package com.samskivert.depot.impl.operator; + +import java.util.Arrays; +import java.util.Date; + +import com.google.common.base.Function; +import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; +import com.samskivert.depot.expression.SQLExpression; +import com.samskivert.depot.impl.expression.ArgumentExp; + +/** + * A base class for all operators. + */ +public abstract class BaseOperator extends ArgumentExp + implements SQLOperator +{ + public static Function INTEGRAL = new Function() { + public Long apply (Object o) { + if ((o instanceof Integer) || (o instanceof Long)) { + return ((Number) o).longValue(); + } + return null; + } + }; + + public static Function NUMERICAL = new Function() { + public Double apply (Object o) { + return (o instanceof Number) ? ((Number) o).doubleValue() : null; + } + }; + + public static Function STRING = new Function() { + public String apply (Object o) { + return (o instanceof String) ? (String) o : null; + } + }; + + public static Function DATE = new Function() { + public Date apply (Object o) { + return (o instanceof Date) ? (Date) o : null; + } + }; + + public static boolean all (Function fun, S... obj) { + return Iterables.all(Arrays.asList(obj), Predicates.compose(Predicates.isNull(), fun)); + } + + public static > int compare (Function fun, S lhs, S rhs) { + return fun.apply(lhs).compareTo(fun.apply(rhs)); + } + + public static T accumulate (Function fun, S[] ops, T v, + BaseOperator.Accumulator acc) { + for (S op : ops) { + v = acc.accumulate(v, fun.apply(op)); + } + return v; + } + + protected BaseOperator (SQLExpression... operands) + { + super(operands); + } + + protected static interface Accumulator + { + T accumulate (T left, T right); + } +} diff --git a/src/java/com/samskivert/depot/impl/operator/BinaryOperator.java b/src/java/com/samskivert/depot/impl/operator/BinaryOperator.java new file mode 100644 index 0000000..ea2f653 --- /dev/null +++ b/src/java/com/samskivert/depot/impl/operator/BinaryOperator.java @@ -0,0 +1,56 @@ +// +// $Id$ + +package com.samskivert.depot.impl.operator; + +import com.samskivert.depot.expression.SQLExpression; +import com.samskivert.depot.impl.ExpressionVisitor; +import com.samskivert.depot.impl.expression.ValueExp; + +/** + * Does the real work for simple binary operators such as Equals. + */ +public abstract class BinaryOperator extends BaseOperator +{ + public BinaryOperator (SQLExpression lhs, SQLExpression rhs) + { + super(lhs, rhs); + } + + public BinaryOperator (SQLExpression lhs, Comparable rhs) + { + this(lhs, new ValueExp(rhs)); + } + + /** + * Returns the string representation of the operator. + */ + public abstract String operator(); + + /** + * Calculates our value. + */ + public abstract Object evaluate (Object left, Object right); + + // from SQLExpression + public Object accept (ExpressionVisitor builder) + { + return builder.visit(this); + } + + public SQLExpression getLeftHandSide () + { + return _args[0]; + } + + public SQLExpression getRightHandSide () + { + return _args[1]; + } + + @Override // from Object + public String toString () + { + return "(" + _args[0] + operator() + _args[1] + ")"; + } +} diff --git a/src/java/com/samskivert/depot/impl/operator/Equals.java b/src/java/com/samskivert/depot/impl/operator/Equals.java index efbc9ac..2b5478c 100644 --- a/src/java/com/samskivert/depot/impl/operator/Equals.java +++ b/src/java/com/samskivert/depot/impl/operator/Equals.java @@ -25,7 +25,7 @@ import com.samskivert.depot.expression.SQLExpression; /** * The SQL '=' operator. */ -public class Equals extends SQLOperator.BinaryOperator +public class Equals extends BinaryOperator { public Equals (SQLExpression column, Comparable value) { @@ -37,13 +37,13 @@ public class Equals extends SQLOperator.BinaryOperator super(column, value); } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public String operator() { return "="; } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public Object evaluate (Object left, Object right) { if (left == null || right == null) { diff --git a/src/java/com/samskivert/depot/impl/operator/GreaterThan.java b/src/java/com/samskivert/depot/impl/operator/GreaterThan.java index e7130ea..a72241e 100644 --- a/src/java/com/samskivert/depot/impl/operator/GreaterThan.java +++ b/src/java/com/samskivert/depot/impl/operator/GreaterThan.java @@ -25,7 +25,7 @@ import com.samskivert.depot.expression.SQLExpression; /** * The SQL '>' operator. */ -public class GreaterThan extends SQLOperator.BinaryOperator +public class GreaterThan extends BinaryOperator { public GreaterThan (SQLExpression column, Comparable value) { @@ -37,13 +37,13 @@ public class GreaterThan extends SQLOperator.BinaryOperator super(column, value); } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public String operator() { return ">"; } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public Object evaluate (Object left, Object right) { if (all(NUMERICAL, left, right)) { diff --git a/src/java/com/samskivert/depot/impl/operator/GreaterThanEquals.java b/src/java/com/samskivert/depot/impl/operator/GreaterThanEquals.java index fcc7a31..e6e0e66 100644 --- a/src/java/com/samskivert/depot/impl/operator/GreaterThanEquals.java +++ b/src/java/com/samskivert/depot/impl/operator/GreaterThanEquals.java @@ -25,7 +25,7 @@ import com.samskivert.depot.expression.SQLExpression; /** * The SQL '>=' operator. */ -public class GreaterThanEquals extends SQLOperator.BinaryOperator +public class GreaterThanEquals extends BinaryOperator { public GreaterThanEquals (SQLExpression column, Comparable value) { @@ -37,13 +37,13 @@ public class GreaterThanEquals extends SQLOperator.BinaryOperator super(column, value); } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public String operator() { return ">="; } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public Object evaluate (Object left, Object right) { if (all(NUMERICAL, left, right)) { diff --git a/src/java/com/samskivert/depot/impl/operator/LessThan.java b/src/java/com/samskivert/depot/impl/operator/LessThan.java index 5b9a377..8646f29 100644 --- a/src/java/com/samskivert/depot/impl/operator/LessThan.java +++ b/src/java/com/samskivert/depot/impl/operator/LessThan.java @@ -25,7 +25,7 @@ import com.samskivert.depot.expression.SQLExpression; /** * The SQL '<' operator. */ -public class LessThan extends SQLOperator.BinaryOperator +public class LessThan extends BinaryOperator { public LessThan (SQLExpression column, Comparable value) { @@ -37,13 +37,13 @@ public class LessThan extends SQLOperator.BinaryOperator super(column, value); } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public String operator() { return "<"; } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public Object evaluate (Object left, Object right) { if (all(NUMERICAL, left, right)) { diff --git a/src/java/com/samskivert/depot/impl/operator/LessThanEquals.java b/src/java/com/samskivert/depot/impl/operator/LessThanEquals.java index e5dc9fd..1e574af 100644 --- a/src/java/com/samskivert/depot/impl/operator/LessThanEquals.java +++ b/src/java/com/samskivert/depot/impl/operator/LessThanEquals.java @@ -25,7 +25,7 @@ import com.samskivert.depot.expression.SQLExpression; /** * The SQL '<=' operator. */ -public class LessThanEquals extends SQLOperator.BinaryOperator +public class LessThanEquals extends BinaryOperator { public LessThanEquals (SQLExpression column, Comparable value) { @@ -37,13 +37,13 @@ public class LessThanEquals extends SQLOperator.BinaryOperator super(column, value); } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public String operator() { return "<="; } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public Object evaluate (Object left, Object right) { if (all(NUMERICAL, left, right)) { diff --git a/src/java/com/samskivert/depot/impl/operator/Like.java b/src/java/com/samskivert/depot/impl/operator/Like.java index a57e357..a3e6ab4 100644 --- a/src/java/com/samskivert/depot/impl/operator/Like.java +++ b/src/java/com/samskivert/depot/impl/operator/Like.java @@ -25,7 +25,7 @@ import com.samskivert.depot.expression.SQLExpression; /** * The SQL 'like' operator. */ -public class Like extends SQLOperator.BinaryOperator +public class Like extends BinaryOperator { public Like (SQLExpression column, Comparable value) { @@ -37,13 +37,13 @@ public class Like extends SQLOperator.BinaryOperator super(column, value); } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public String operator() { return " like "; } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public Object evaluate (Object left, Object right) { return new NoValue("Like operator not implemented"); diff --git a/src/java/com/samskivert/depot/impl/operator/MultiOperator.java b/src/java/com/samskivert/depot/impl/operator/MultiOperator.java new file mode 100644 index 0000000..905fb65 --- /dev/null +++ b/src/java/com/samskivert/depot/impl/operator/MultiOperator.java @@ -0,0 +1,58 @@ +// +// $Id$ + +package com.samskivert.depot.impl.operator; + +import java.util.Collection; + +import com.samskivert.depot.PersistentRecord; +import com.samskivert.depot.expression.SQLExpression; +import com.samskivert.depot.impl.ExpressionVisitor; + +/** + * Represents an operator with any number of operands. + */ +public abstract class MultiOperator extends BaseOperator +{ + public MultiOperator (SQLExpression ... operands) + { + super(operands); + } + + /** + * Returns the text infix to be used to join expressions together. + */ + public abstract String operator (); + + /** + * Calculates our value. + */ + public abstract Object evaluate (Object[] values); + + // from SQLExpression + public Object accept (ExpressionVisitor builder) + { + return builder.visit(this); + } + + @Override // from SQLExpression + public void addClasses (Collection> classSet) + { + for (SQLExpression operand : _args) { + operand.addClasses(classSet); + } + } + + @Override // from Object + public String toString () + { + StringBuilder builder = new StringBuilder("("); + for (SQLExpression operand : _args) { + if (builder.length() > 1) { + builder.append(operator()); + } + builder.append(operand); + } + return builder.append(")").toString(); + } +} diff --git a/src/java/com/samskivert/depot/impl/operator/NotEquals.java b/src/java/com/samskivert/depot/impl/operator/NotEquals.java index 1f5cc88..13cfcc1 100644 --- a/src/java/com/samskivert/depot/impl/operator/NotEquals.java +++ b/src/java/com/samskivert/depot/impl/operator/NotEquals.java @@ -25,7 +25,7 @@ import com.samskivert.depot.expression.SQLExpression; /** * The SQL '!=' operator. */ -public class NotEquals extends SQLOperator.BinaryOperator +public class NotEquals extends BinaryOperator { public NotEquals (SQLExpression column, Comparable value) { @@ -37,13 +37,13 @@ public class NotEquals extends SQLOperator.BinaryOperator super(column, value); } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public String operator() { return "!="; } - @Override // from SQLOperator.BinaryOperator + @Override // from BinaryOperator public Object evaluate (Object left, Object right) { if (left == null || right == null) { diff --git a/src/java/com/samskivert/depot/impl/operator/Or.java b/src/java/com/samskivert/depot/impl/operator/Or.java index f11512d..f3509e9 100644 --- a/src/java/com/samskivert/depot/impl/operator/Or.java +++ b/src/java/com/samskivert/depot/impl/operator/Or.java @@ -27,7 +27,7 @@ import com.samskivert.depot.expression.SQLExpression; /** * Represents a condition that is false iff all its subconditions are false. */ -public class Or extends SQLOperator.MultiOperator +public class Or extends MultiOperator { public Or (Collection conditions) { diff --git a/src/java/com/samskivert/depot/impl/operator/SQLOperator.java b/src/java/com/samskivert/depot/impl/operator/SQLOperator.java index bea0594..d8200ac 100644 --- a/src/java/com/samskivert/depot/impl/operator/SQLOperator.java +++ b/src/java/com/samskivert/depot/impl/operator/SQLOperator.java @@ -20,18 +20,8 @@ package com.samskivert.depot.impl.operator; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import com.google.common.base.Function; -import com.google.common.base.Predicates; -import com.google.common.collect.Iterables; -import com.samskivert.depot.PersistentRecord; import com.samskivert.depot.expression.SQLExpression; -import com.samskivert.depot.impl.ExpressionVisitor; -import com.samskivert.depot.impl.expression.ArgumentExp; -import com.samskivert.depot.impl.expression.ValueExp; /** * A common interface for operator hierarchies in SQL. The main purpose of breaking this out from @@ -40,153 +30,4 @@ import com.samskivert.depot.impl.expression.ValueExp; */ public interface SQLOperator extends SQLExpression { - /** - * Represents an operator with any number of operands. - */ - public abstract static class MultiOperator extends BaseOperator - { - public MultiOperator (SQLExpression ... operands) - { - super(operands); - } - - // from SQLExpression - public Object accept (ExpressionVisitor builder) - { - return builder.visit(this); - } - - - @Override // from SQLExpression - public void addClasses (Collection> classSet) - { - for (SQLExpression operand : _args) { - operand.addClasses(classSet); - } - } - - /** - * Returns the text infix to be used to join expressions together. - */ - public abstract String operator (); - - /** - * Calculates a value - */ - public abstract Object evaluate (Object[] values); - - @Override // from Object - public String toString () - { - StringBuilder builder = new StringBuilder("("); - for (SQLExpression operand : _args) { - if (builder.length() > 1) { - builder.append(operator()); - } - builder.append(operand); - } - return builder.append(")").toString(); - } - } - - /** - * Does the real work for simple binary operators such as Equals. - */ - public abstract static class BinaryOperator extends BaseOperator - { - public BinaryOperator (SQLExpression lhs, SQLExpression rhs) - { - super(lhs, rhs); - } - - public BinaryOperator (SQLExpression lhs, Comparable rhs) - { - this(lhs, new ValueExp(rhs)); - } - - // from SQLExpression - public Object accept (ExpressionVisitor builder) - { - return builder.visit(this); - } - - public abstract Object evaluate (Object left, Object right); - - /** - * Returns the string representation of the operator. - */ - public abstract String operator(); - - public SQLExpression getLeftHandSide () - { - return _args[0]; - } - - public SQLExpression getRightHandSide () - { - return _args[1]; - } - - @Override // from Object - public String toString () - { - return "(" + _args[0] + operator() + _args[1] + ")"; - } - } - - public static abstract class BaseOperator extends ArgumentExp - implements SQLOperator - { - public static Function INTEGRAL = new Function() { - public Long apply (Object o) { - if ((o instanceof Integer) || (o instanceof Long)) { - return ((Number) o).longValue(); - } - return null; - } - }; - - public static Function NUMERICAL = new Function() { - public Double apply (Object o) { - return (o instanceof Number) ? ((Number) o).doubleValue() : null; - } - }; - - public static Function STRING = new Function() { - public String apply (Object o) { - return (o instanceof String) ? (String) o : null; - } - }; - - public static Function DATE = new Function() { - public Date apply (Object o) { - return (o instanceof Date) ? (Date) o : null; - } - }; - - public static boolean all (Function fun, S... obj) { - return Iterables.all(Arrays.asList(obj), Predicates.compose(Predicates.isNull(), fun)); - } - - public static > int compare (Function fun, S lhs, S rhs) { - return fun.apply(lhs).compareTo(fun.apply(rhs)); - } - - public static T accumulate (Function fun, S[] ops, T v, Accumulator acc) { - for (S op : ops) { - v = acc.accumulate(v, fun.apply(op)); - } - return v; - } - - protected BaseOperator (SQLExpression... operands) - { - super(operands); - } - - protected static interface Accumulator - { - T accumulate (T left, T right); - } -} }