Added support for intervals which would almost be exactly the same except that
Postgres insists that you quote: interval '7 day' and MySQL insists that you not quote: interval 7 day. Frawesome!
This commit is contained in:
@@ -0,0 +1,65 @@
|
|||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// Depot library - a Java relational persistence library
|
||||||
|
// Copyright (C) 2006-2009 Michael Bayne and 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.depot.expression;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import com.samskivert.depot.PersistentRecord;
|
||||||
|
import com.samskivert.depot.impl.ExpressionVisitor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A code for representing a date interval.
|
||||||
|
*/
|
||||||
|
public class IntervalExp
|
||||||
|
implements SQLExpression
|
||||||
|
{
|
||||||
|
/** The units that can be used for an interval. */
|
||||||
|
public enum Unit { YEAR, MONTH, DAY, HOUR, MINUTE, SECOND };
|
||||||
|
|
||||||
|
/** The unit for this interval. */
|
||||||
|
public final Unit unit;
|
||||||
|
|
||||||
|
/** The number of units for this interval. */
|
||||||
|
public final int amount;
|
||||||
|
|
||||||
|
public IntervalExp (Unit unit, int amount)
|
||||||
|
{
|
||||||
|
this.unit = unit;
|
||||||
|
this.amount = amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
// from SQLExpression
|
||||||
|
public Object accept (ExpressionVisitor<?> builder)
|
||||||
|
{
|
||||||
|
return builder.visit(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// from SQLExpression
|
||||||
|
public void addClasses (Collection<Class<? extends PersistentRecord>> classSet)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString ()
|
||||||
|
{
|
||||||
|
return amount + " " + unit;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -51,6 +51,7 @@ import com.samskivert.depot.clause.WhereClause;
|
|||||||
import com.samskivert.depot.expression.ColumnExp;
|
import com.samskivert.depot.expression.ColumnExp;
|
||||||
import com.samskivert.depot.expression.EpochSeconds;
|
import com.samskivert.depot.expression.EpochSeconds;
|
||||||
import com.samskivert.depot.expression.FunctionExp;
|
import com.samskivert.depot.expression.FunctionExp;
|
||||||
|
import com.samskivert.depot.expression.IntervalExp;
|
||||||
import com.samskivert.depot.expression.LiteralExp;
|
import com.samskivert.depot.expression.LiteralExp;
|
||||||
import com.samskivert.depot.expression.SQLExpression;
|
import com.samskivert.depot.expression.SQLExpression;
|
||||||
import com.samskivert.depot.expression.ValueExp;
|
import com.samskivert.depot.expression.ValueExp;
|
||||||
@@ -320,6 +321,12 @@ public abstract class BuildVisitor implements ExpressionVisitor<Void>
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Void visit (IntervalExp interval)
|
||||||
|
{
|
||||||
|
_builder.append("interval ").append(interval.amount).append(" ").append(interval.unit);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public Void visit (Exists<? extends PersistentRecord> exists)
|
public Void visit (Exists<? extends PersistentRecord> exists)
|
||||||
{
|
{
|
||||||
_builder.append("exists ");
|
_builder.append("exists ");
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import com.samskivert.depot.clause.WhereClause;
|
|||||||
import com.samskivert.depot.expression.ColumnExp;
|
import com.samskivert.depot.expression.ColumnExp;
|
||||||
import com.samskivert.depot.expression.EpochSeconds;
|
import com.samskivert.depot.expression.EpochSeconds;
|
||||||
import com.samskivert.depot.expression.FunctionExp;
|
import com.samskivert.depot.expression.FunctionExp;
|
||||||
|
import com.samskivert.depot.expression.IntervalExp;
|
||||||
import com.samskivert.depot.expression.LiteralExp;
|
import com.samskivert.depot.expression.LiteralExp;
|
||||||
import com.samskivert.depot.expression.SQLExpression;
|
import com.samskivert.depot.expression.SQLExpression;
|
||||||
import com.samskivert.depot.expression.SQLExpression.NoValue;
|
import com.samskivert.depot.expression.SQLExpression.NoValue;
|
||||||
@@ -214,6 +215,11 @@ public class ExpressionEvaluator
|
|||||||
return valueExp.getValue();
|
return valueExp.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Object visit (IntervalExp interval)
|
||||||
|
{
|
||||||
|
return new NoValue("Cannot evaluate IntervalExp: " + interval);
|
||||||
|
}
|
||||||
|
|
||||||
public Object visit (WhereClause where)
|
public Object visit (WhereClause where)
|
||||||
{
|
{
|
||||||
Object result = where.getWhereExpression().accept(this);
|
Object result = where.getWhereExpression().accept(this);
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import com.samskivert.depot.clause.WhereClause;
|
|||||||
import com.samskivert.depot.expression.ColumnExp;
|
import com.samskivert.depot.expression.ColumnExp;
|
||||||
import com.samskivert.depot.expression.EpochSeconds;
|
import com.samskivert.depot.expression.EpochSeconds;
|
||||||
import com.samskivert.depot.expression.FunctionExp;
|
import com.samskivert.depot.expression.FunctionExp;
|
||||||
|
import com.samskivert.depot.expression.IntervalExp;
|
||||||
import com.samskivert.depot.expression.LiteralExp;
|
import com.samskivert.depot.expression.LiteralExp;
|
||||||
import com.samskivert.depot.expression.ValueExp;
|
import com.samskivert.depot.expression.ValueExp;
|
||||||
|
|
||||||
@@ -76,8 +77,9 @@ public interface ExpressionVisitor<T>
|
|||||||
public T visit (OrderBy orderBy);
|
public T visit (OrderBy orderBy);
|
||||||
public T visit (Join join);
|
public T visit (Join join);
|
||||||
public T visit (Limit limit);
|
public T visit (Limit limit);
|
||||||
public T visit (LiteralExp literalExp);
|
public T visit (LiteralExp literal);
|
||||||
public T visit (ValueExp valueExp);
|
public T visit (ValueExp value);
|
||||||
|
public T visit (IntervalExp interval);
|
||||||
public T visit (WhereClause where);
|
public T visit (WhereClause where);
|
||||||
public T visit (Key.Expression<? extends PersistentRecord> key);
|
public T visit (Key.Expression<? extends PersistentRecord> key);
|
||||||
public T visit (Exists<? extends PersistentRecord> exists);
|
public T visit (Exists<? extends PersistentRecord> exists);
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import com.samskivert.depot.PersistentRecord;
|
|||||||
import com.samskivert.depot.annotation.FullTextIndex.Configuration;
|
import com.samskivert.depot.annotation.FullTextIndex.Configuration;
|
||||||
import com.samskivert.depot.annotation.FullTextIndex;
|
import com.samskivert.depot.annotation.FullTextIndex;
|
||||||
import com.samskivert.depot.expression.EpochSeconds;
|
import com.samskivert.depot.expression.EpochSeconds;
|
||||||
|
import com.samskivert.depot.expression.IntervalExp;
|
||||||
import com.samskivert.depot.operator.FullText;
|
import com.samskivert.depot.operator.FullText;
|
||||||
|
|
||||||
import static com.samskivert.Log.log;
|
import static com.samskivert.Log.log;
|
||||||
@@ -53,6 +54,12 @@ public class PostgreSQLBuilder
|
|||||||
|
|
||||||
public class PGBuildVisitor extends BuildVisitor
|
public class PGBuildVisitor extends BuildVisitor
|
||||||
{
|
{
|
||||||
|
@Override public Void visit (IntervalExp interval) {
|
||||||
|
_builder.append("interval '").append(interval.amount);
|
||||||
|
_builder.append(" ").append(interval.unit).append("'");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override public Void visit (FullText.Match match) {
|
@Override public Void visit (FullText.Match match) {
|
||||||
appendIdentifier("ftsCol_" + match.getDefinition().getName());
|
appendIdentifier("ftsCol_" + match.getDefinition().getName());
|
||||||
_builder.append(" @@ to_tsquery('").
|
_builder.append(" @@ to_tsquery('").
|
||||||
|
|||||||
Reference in New Issue
Block a user