Support for more operators and functions from Zell.
This commit is contained in:
@@ -0,0 +1,72 @@
|
|||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// samskivert library - useful routines for java programs
|
||||||
|
// Copyright (C) 2006 Michael Bayne, Pär Winzell
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or modify it
|
||||||
|
// under the terms of the GNU Lesser General Public License as published
|
||||||
|
// by the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
package com.samskivert.jdbc.depot.expression;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
import com.samskivert.jdbc.depot.Query;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An expression for a function, e.g. FLOOR(blah).
|
||||||
|
*/
|
||||||
|
public class FunctionExp
|
||||||
|
implements SQLExpression
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create a new FunctionExp with the given function and arguments.
|
||||||
|
*/
|
||||||
|
public FunctionExp (String function, SQLExpression... arguments)
|
||||||
|
{
|
||||||
|
_function = function;
|
||||||
|
_arguments = arguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
// from SQLExpression
|
||||||
|
public void appendExpression (Query query, StringBuilder builder)
|
||||||
|
{
|
||||||
|
builder.append(_function);
|
||||||
|
builder.append("(");
|
||||||
|
for (int ii = 0; ii < _arguments.length; ii ++) {
|
||||||
|
if (ii > 0) {
|
||||||
|
builder.append(", ");
|
||||||
|
}
|
||||||
|
_arguments[ii].appendExpression(query, builder);
|
||||||
|
}
|
||||||
|
builder.append(")");
|
||||||
|
}
|
||||||
|
|
||||||
|
// from SQLExpression
|
||||||
|
public int bindArguments (PreparedStatement pstmt, int argIdx)
|
||||||
|
throws SQLException
|
||||||
|
{
|
||||||
|
for (int ii = 0; ii < _arguments.length; ii ++) {
|
||||||
|
argIdx = _arguments[ii].bindArguments(pstmt, argIdx);
|
||||||
|
}
|
||||||
|
return argIdx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The literal name of this function, e.g. FLOOR */
|
||||||
|
protected String _function;
|
||||||
|
|
||||||
|
/** The arguments to this function */
|
||||||
|
protected SQLExpression[] _arguments;
|
||||||
|
}
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// samskivert library - useful routines for java programs
|
||||||
|
// Copyright (C) 2006 Michael Bayne, Pär Winzell
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or modify it
|
||||||
|
// under the terms of the GNU Lesser General Public License as published
|
||||||
|
// by the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
package com.samskivert.jdbc.depot.operator;
|
||||||
|
|
||||||
|
import com.samskivert.jdbc.depot.expression.ColumnExp;
|
||||||
|
import com.samskivert.jdbc.depot.expression.SQLExpression;
|
||||||
|
import com.samskivert.jdbc.depot.operator.SQLOperator.BinaryOperator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A convenient container for implementations of arithmetic operators. Classes that value brevity
|
||||||
|
* over disambiguation will import Arithmetic.* and construct queries with Add() and Sub(); classes
|
||||||
|
* that feel otherwise will use Arithmetic.Add() and Arithmetic.Sub().
|
||||||
|
*/
|
||||||
|
public abstract class Arithmetic
|
||||||
|
{
|
||||||
|
/** The SQL '+' operator. */
|
||||||
|
public static class Add extends BinaryOperator
|
||||||
|
{
|
||||||
|
public Add (String pColumn, Comparable value)
|
||||||
|
{
|
||||||
|
super(new ColumnExp(pColumn), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Add (SQLExpression column, Comparable value)
|
||||||
|
{
|
||||||
|
super(column, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Add (SQLExpression column, SQLExpression value)
|
||||||
|
{
|
||||||
|
super(column, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String operator()
|
||||||
|
{
|
||||||
|
return "+";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The SQL '-' operator. */
|
||||||
|
public static class Sub extends BinaryOperator
|
||||||
|
{
|
||||||
|
public Sub (String pColumn, Comparable value)
|
||||||
|
{
|
||||||
|
super(new ColumnExp(pColumn), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Sub (SQLExpression column, Comparable value)
|
||||||
|
{
|
||||||
|
super(column, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Sub (SQLExpression column, SQLExpression value)
|
||||||
|
{
|
||||||
|
super(column, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String operator()
|
||||||
|
{
|
||||||
|
return "-";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The SQL '*' operator. */
|
||||||
|
public static class Mul extends BinaryOperator
|
||||||
|
{
|
||||||
|
public Mul (String pColumn, Comparable value)
|
||||||
|
{
|
||||||
|
super(new ColumnExp(pColumn), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Mul (SQLExpression column, Comparable value)
|
||||||
|
{
|
||||||
|
super(column, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Mul (SQLExpression column, SQLExpression value)
|
||||||
|
{
|
||||||
|
super(column, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String operator()
|
||||||
|
{
|
||||||
|
return "*";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The SQL '/' operator. */
|
||||||
|
public static class Div extends BinaryOperator
|
||||||
|
{
|
||||||
|
public Div (String pColumn, Comparable value)
|
||||||
|
{
|
||||||
|
super(new ColumnExp(pColumn), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Div (SQLExpression column, Comparable value)
|
||||||
|
{
|
||||||
|
super(column, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Div (SQLExpression column, SQLExpression value)
|
||||||
|
{
|
||||||
|
super(column, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String operator()
|
||||||
|
{
|
||||||
|
return "/";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,7 +26,7 @@ import java.sql.SQLException;
|
|||||||
import com.samskivert.jdbc.depot.Query;
|
import com.samskivert.jdbc.depot.Query;
|
||||||
import com.samskivert.jdbc.depot.expression.ColumnExp;
|
import com.samskivert.jdbc.depot.expression.ColumnExp;
|
||||||
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.operator.SQLOperator.BinaryOperator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A convenient container for implementations of conditional operators. Classes that value brevity
|
* A convenient container for implementations of conditional operators. Classes that value brevity
|
||||||
@@ -196,46 +196,4 @@ public abstract class Conditionals
|
|||||||
protected ColumnExp _column;
|
protected ColumnExp _column;
|
||||||
protected Comparable[] _values;
|
protected Comparable[] _values;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Does the real work for simple binary operators such as Equals.
|
|
||||||
*/
|
|
||||||
protected abstract static class BinaryOperator implements SQLOperator
|
|
||||||
{
|
|
||||||
public BinaryOperator (SQLExpression lhs, SQLExpression rhs)
|
|
||||||
{
|
|
||||||
_lhs = lhs;
|
|
||||||
_rhs = rhs;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BinaryOperator (SQLExpression lhs, Comparable rhs)
|
|
||||||
{
|
|
||||||
this(lhs, new ValueExp(rhs));
|
|
||||||
}
|
|
||||||
|
|
||||||
// from SQLExpression
|
|
||||||
public void appendExpression (Query query, StringBuilder builder)
|
|
||||||
{
|
|
||||||
_lhs.appendExpression(query, builder);
|
|
||||||
builder.append(operator());
|
|
||||||
_rhs.appendExpression(query, builder);
|
|
||||||
}
|
|
||||||
|
|
||||||
// from SQLExpression
|
|
||||||
public int bindArguments (PreparedStatement pstmt, int argIdx)
|
|
||||||
throws SQLException
|
|
||||||
{
|
|
||||||
argIdx = _lhs.bindArguments(pstmt, argIdx);
|
|
||||||
argIdx = _rhs.bindArguments(pstmt, argIdx);
|
|
||||||
return argIdx;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the string representation of the operator.
|
|
||||||
*/
|
|
||||||
protected abstract String operator();
|
|
||||||
|
|
||||||
protected SQLExpression _lhs;
|
|
||||||
protected SQLExpression _rhs;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import java.sql.PreparedStatement;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
import com.samskivert.jdbc.depot.Query;
|
import com.samskivert.jdbc.depot.Query;
|
||||||
|
import com.samskivert.jdbc.depot.operator.SQLOperator.MultiOperator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A convenient container for implementations of logical operators. Classes that value brevity
|
* A convenient container for implementations of logical operators. Classes that value brevity
|
||||||
@@ -95,47 +96,4 @@ public abstract class Logic
|
|||||||
|
|
||||||
protected SQLOperator _condition;
|
protected SQLOperator _condition;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents an operator with any number of operands.
|
|
||||||
*/
|
|
||||||
protected abstract static class MultiOperator
|
|
||||||
implements SQLOperator
|
|
||||||
{
|
|
||||||
public MultiOperator (SQLOperator... conditions)
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
_conditions = conditions;
|
|
||||||
}
|
|
||||||
|
|
||||||
// from SQLExpression
|
|
||||||
public void appendExpression (Query query, StringBuilder builder)
|
|
||||||
{
|
|
||||||
for (int ii = 0; ii < _conditions.length; ii++) {
|
|
||||||
if (ii > 0) {
|
|
||||||
builder.append(" ").append(operator()).append(" ");
|
|
||||||
}
|
|
||||||
builder.append("(");
|
|
||||||
_conditions[ii].appendExpression(query, builder);
|
|
||||||
builder.append(")");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// from SQLExpression
|
|
||||||
public int bindArguments (PreparedStatement pstmt, int argIdx)
|
|
||||||
throws SQLException
|
|
||||||
{
|
|
||||||
for (int ii = 0; ii < _conditions.length; ii++) {
|
|
||||||
argIdx = _conditions[ii].bindArguments(pstmt, argIdx);
|
|
||||||
}
|
|
||||||
return argIdx;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the text infix to be used to join expressions together.
|
|
||||||
*/
|
|
||||||
protected abstract String operator ();
|
|
||||||
|
|
||||||
protected SQLOperator[] _conditions;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,12 @@
|
|||||||
|
|
||||||
package com.samskivert.jdbc.depot.operator;
|
package com.samskivert.jdbc.depot.operator;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
import com.samskivert.jdbc.depot.Query;
|
||||||
import com.samskivert.jdbc.depot.expression.SQLExpression;
|
import com.samskivert.jdbc.depot.expression.SQLExpression;
|
||||||
|
import com.samskivert.jdbc.depot.expression.ValueExp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A common interface for operator hierarchies in SQL. The main purpose of breaking this out from
|
* A common interface for operator hierarchies in SQL. The main purpose of breaking this out from
|
||||||
@@ -29,4 +34,88 @@ import com.samskivert.jdbc.depot.expression.SQLExpression;
|
|||||||
*/
|
*/
|
||||||
public interface SQLOperator extends SQLExpression
|
public interface SQLOperator extends SQLExpression
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Represents an operator with any number of operands.
|
||||||
|
*/
|
||||||
|
public abstract static class MultiOperator
|
||||||
|
implements SQLOperator
|
||||||
|
{
|
||||||
|
public MultiOperator (SQLOperator... conditions)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
_conditions = conditions;
|
||||||
|
}
|
||||||
|
|
||||||
|
// from SQLExpression
|
||||||
|
public void appendExpression (Query query, StringBuilder builder)
|
||||||
|
{
|
||||||
|
for (int ii = 0; ii < _conditions.length; ii++) {
|
||||||
|
if (ii > 0) {
|
||||||
|
builder.append(" ").append(operator()).append(" ");
|
||||||
|
}
|
||||||
|
builder.append("(");
|
||||||
|
_conditions[ii].appendExpression(query, builder);
|
||||||
|
builder.append(")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// from SQLExpression
|
||||||
|
public int bindArguments (PreparedStatement pstmt, int argIdx)
|
||||||
|
throws SQLException
|
||||||
|
{
|
||||||
|
for (int ii = 0; ii < _conditions.length; ii++) {
|
||||||
|
argIdx = _conditions[ii].bindArguments(pstmt, argIdx);
|
||||||
|
}
|
||||||
|
return argIdx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the text infix to be used to join expressions together.
|
||||||
|
*/
|
||||||
|
protected abstract String operator ();
|
||||||
|
|
||||||
|
protected SQLOperator[] _conditions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does the real work for simple binary operators such as Equals.
|
||||||
|
*/
|
||||||
|
public abstract static class BinaryOperator implements SQLOperator
|
||||||
|
{
|
||||||
|
public BinaryOperator (SQLExpression lhs, SQLExpression rhs)
|
||||||
|
{
|
||||||
|
_lhs = lhs;
|
||||||
|
_rhs = rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BinaryOperator (SQLExpression lhs, Comparable rhs)
|
||||||
|
{
|
||||||
|
this(lhs, new ValueExp(rhs));
|
||||||
|
}
|
||||||
|
|
||||||
|
// from SQLExpression
|
||||||
|
public void appendExpression (Query query, StringBuilder builder)
|
||||||
|
{
|
||||||
|
_lhs.appendExpression(query, builder);
|
||||||
|
builder.append(operator());
|
||||||
|
_rhs.appendExpression(query, builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
// from SQLExpression
|
||||||
|
public int bindArguments (PreparedStatement pstmt, int argIdx)
|
||||||
|
throws SQLException
|
||||||
|
{
|
||||||
|
argIdx = _lhs.bindArguments(pstmt, argIdx);
|
||||||
|
argIdx = _rhs.bindArguments(pstmt, argIdx);
|
||||||
|
return argIdx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the string representation of the operator.
|
||||||
|
*/
|
||||||
|
protected abstract String operator();
|
||||||
|
|
||||||
|
protected SQLExpression _lhs;
|
||||||
|
protected SQLExpression _rhs;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user