Extracted BinaryOperator and MultiOperator into top-level classes in

preparation for possibly nixing SQLOperator, which appears to me to be unused
if not unnecessary.
This commit is contained in:
Michael Bayne
2009-09-10 03:35:03 +00:00
parent 03008f6168
commit ff250b2edd
18 changed files with 217 additions and 190 deletions
@@ -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
@@ -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;
@@ -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.
@@ -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
@@ -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<? extends SQLExpression> conditions)
{
@@ -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.
@@ -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<Object, Long> INTEGRAL = new Function<Object, Long>() {
public Long apply (Object o) {
if ((o instanceof Integer) || (o instanceof Long)) {
return ((Number) o).longValue();
}
return null;
}
};
public static Function<Object, Double> NUMERICAL = new Function<Object, Double>() {
public Double apply (Object o) {
return (o instanceof Number) ? ((Number) o).doubleValue() : null;
}
};
public static Function<Object, String> STRING = new Function<Object, String>() {
public String apply (Object o) {
return (o instanceof String) ? (String) o : null;
}
};
public static Function<Object, Date> DATE = new Function<Object, Date>() {
public Date apply (Object o) {
return (o instanceof Date) ? (Date) o : null;
}
};
public static <S, T> boolean all (Function<S, T> fun, S... obj) {
return Iterables.all(Arrays.asList(obj), Predicates.compose(Predicates.isNull(), fun));
}
public static <S, T extends Comparable<T>> int compare (Function<S, T> fun, S lhs, S rhs) {
return fun.apply(lhs).compareTo(fun.apply(rhs));
}
public static <S, T> T accumulate (Function<S, T> fun, S[] ops, T v,
BaseOperator.Accumulator<T> 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>
{
T accumulate (T left, T right);
}
}
@@ -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] + ")";
}
}
@@ -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) {
@@ -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)) {
@@ -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)) {
@@ -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)) {
@@ -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)) {
@@ -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");
@@ -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<Class<? extends PersistentRecord>> 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();
}
}
@@ -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) {
@@ -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<? extends SQLExpression> conditions)
{
@@ -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<Class<? extends PersistentRecord>> 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<Object, Long> INTEGRAL = new Function<Object, Long>() {
public Long apply (Object o) {
if ((o instanceof Integer) || (o instanceof Long)) {
return ((Number) o).longValue();
}
return null;
}
};
public static Function<Object, Double> NUMERICAL = new Function<Object, Double>() {
public Double apply (Object o) {
return (o instanceof Number) ? ((Number) o).doubleValue() : null;
}
};
public static Function<Object, String> STRING = new Function<Object, String>() {
public String apply (Object o) {
return (o instanceof String) ? (String) o : null;
}
};
public static Function<Object, Date> DATE = new Function<Object, Date>() {
public Date apply (Object o) {
return (o instanceof Date) ? (Date) o : null;
}
};
public static <S, T> boolean all (Function<S, T> fun, S... obj) {
return Iterables.all(Arrays.asList(obj), Predicates.compose(Predicates.isNull(), fun));
}
public static <S, T extends Comparable<T>> int compare (Function<S, T> fun, S lhs, S rhs) {
return fun.apply(lhs).compareTo(fun.apply(rhs));
}
public static <S, T> T accumulate (Function<S, T> fun, S[] ops, T v, Accumulator<T> 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>
{
T accumulate (T left, T right);
}
}
}