Depot's caching strategy relies on every clause and all its subexpressions constructing deterministic toString()'s. We do it by requesting that each function implementation returns an identifying string. We could use StringUtil.shortClassName() as things stand now, but I think perhaps MDB wants to get rid of the named classes.

This commit is contained in:
Par Winzell
2009-09-10 15:26:54 +00:00
parent 8a57bd2461
commit aa29b143af
8 changed files with 112 additions and 129 deletions
@@ -22,6 +22,7 @@ package com.samskivert.depot.impl.expression;
import com.samskivert.depot.expression.SQLExpression;
import com.samskivert.depot.impl.ExpressionVisitor;
import com.samskivert.depot.impl.expression.Function.OneArgFun;
public abstract class AggregateFun extends OneArgFun
{
@@ -35,6 +36,9 @@ public abstract class AggregateFun extends OneArgFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "average";
}
}
public static class Count extends AggregateFun {
@@ -47,6 +51,9 @@ public abstract class AggregateFun extends OneArgFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "count";
}
}
public static class Every extends AggregateFun {
@@ -59,6 +66,9 @@ public abstract class AggregateFun extends OneArgFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "every";
}
}
public static class Max extends AggregateFun {
@@ -71,6 +81,9 @@ public abstract class AggregateFun extends OneArgFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "max";
}
}
public static class Min extends AggregateFun {
@@ -83,6 +96,9 @@ public abstract class AggregateFun extends OneArgFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "min";
}
}
public static class Sum extends AggregateFun {
@@ -95,6 +111,9 @@ public abstract class AggregateFun extends OneArgFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "sum";
}
}
public AggregateFun (SQLExpression argument, boolean distinct)
@@ -108,6 +127,11 @@ public abstract class AggregateFun extends OneArgFun
return _distinct;
}
public String toString ()
{
return getCanonicalFunctionName() + "(" + (_distinct ? "distinct " : "") + _arg + ")";
}
protected boolean _distinct;
}
@@ -22,33 +22,43 @@ package com.samskivert.depot.impl.expression;
import com.samskivert.depot.expression.SQLExpression;
import com.samskivert.depot.impl.ExpressionVisitor;
import com.samskivert.depot.impl.expression.Function.ManyArgFun;
public abstract class ConditionalFun
{
public static class Coalesce extends ArgumentExp {
public static class Coalesce extends ManyArgFun {
public Coalesce (SQLExpression... args) {
super(args);
}
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "coalesce";
}
}
public static class Greatest extends ArgumentExp {
public static class Greatest extends ManyArgFun {
public Greatest (SQLExpression... args) {
super(args);
}
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "greatest";
}
}
public static class Least extends ArgumentExp {
public static class Least extends ManyArgFun {
public Least (SQLExpression... args) {
super(args);
}
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "least";
}
}
}
@@ -22,6 +22,8 @@ package com.samskivert.depot.impl.expression;
import com.samskivert.depot.expression.SQLExpression;
import com.samskivert.depot.impl.ExpressionVisitor;
import com.samskivert.depot.impl.expression.Function.NoArgFun;
import com.samskivert.depot.impl.expression.Function.OneArgFun;
public abstract class DateFun
{
@@ -40,6 +42,9 @@ public abstract class DateFun
public Part getPart () {
return _part;
}
public String getCanonicalFunctionName () {
return "datePart_" + _part;
}
protected Part _part;
}
@@ -65,6 +70,9 @@ public abstract class DateFun
public Truncation getTruncation () {
return _truncation;
}
public String getCanonicalFunctionName () {
return "dateTrunc_" + _truncation;
}
protected Truncation _truncation;
}
@@ -72,5 +80,8 @@ public abstract class DateFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "now";
}
}
}
@@ -1,34 +0,0 @@
//
// $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.impl.expression;
import java.util.Collection;
import com.samskivert.depot.PersistentRecord;
import com.samskivert.depot.expression.FluentExp;
public abstract class NoArgFun extends FluentExp
{
public void addClasses (Collection<Class<? extends PersistentRecord>> classSet)
{
// nothing to add
}
}
@@ -22,6 +22,9 @@ package com.samskivert.depot.impl.expression;
import com.samskivert.depot.expression.SQLExpression;
import com.samskivert.depot.impl.ExpressionVisitor;
import com.samskivert.depot.impl.expression.Function.NoArgFun;
import com.samskivert.depot.impl.expression.Function.OneArgFun;
import com.samskivert.depot.impl.expression.Function.TwoArgFun;
public abstract class NumericalFun
{
@@ -32,6 +35,9 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "abs";
}
}
public static class Ceil extends OneArgFun {
@@ -41,6 +47,9 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "ceil";
}
}
public static class Exp extends OneArgFun {
@@ -50,6 +59,9 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "exp";
}
}
public static class Floor extends OneArgFun {
@@ -59,6 +71,9 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "floor";
}
}
public static class Ln extends OneArgFun {
@@ -68,6 +83,9 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "ln";
}
}
public static class Log10 extends OneArgFun {
@@ -77,12 +95,18 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "log10";
}
}
public static class Pi extends NoArgFun {
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "pi";
}
}
public static class Power extends TwoArgFun {
@@ -92,6 +116,9 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "Power";
}
public SQLExpression getValue () {
return _arg1;
}
@@ -104,6 +131,9 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "random";
}
}
public static class Round extends OneArgFun {
@@ -113,6 +143,9 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "round";
}
}
public static class Sign extends OneArgFun {
@@ -122,6 +155,9 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "sign";
}
}
public static class Sqrt extends OneArgFun {
@@ -131,6 +167,9 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "sqrt";
}
}
public static class Trunc extends OneArgFun {
@@ -140,5 +179,8 @@ public abstract class NumericalFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "trunc";
}
}
}
@@ -1,47 +0,0 @@
//
// $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.impl.expression;
import java.util.Collection;
import com.samskivert.depot.PersistentRecord;
import com.samskivert.depot.expression.FluentExp;
import com.samskivert.depot.expression.SQLExpression;
public abstract class OneArgFun extends FluentExp
{
protected OneArgFun (SQLExpression argument)
{
_argument = argument;
}
public void addClasses (Collection<Class<? extends PersistentRecord>> classSet)
{
_argument.addClasses(classSet);
}
public SQLExpression getArg ()
{
return _argument;
}
protected SQLExpression _argument;
}
@@ -22,6 +22,9 @@ package com.samskivert.depot.impl.expression;
import com.samskivert.depot.expression.SQLExpression;
import com.samskivert.depot.impl.ExpressionVisitor;
import com.samskivert.depot.impl.expression.Function.ManyArgFun;
import com.samskivert.depot.impl.expression.Function.OneArgFun;
import com.samskivert.depot.impl.expression.Function.TwoArgFun;
public abstract class StringFun
{
@@ -32,6 +35,9 @@ public abstract class StringFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "length";
}
}
public static class Lower extends OneArgFun {
@@ -41,6 +47,9 @@ public abstract class StringFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "lower";
}
}
public static class Position extends TwoArgFun {
@@ -50,6 +59,9 @@ public abstract class StringFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "position";
}
public SQLExpression getSubString () {
return _arg1;
}
@@ -58,13 +70,16 @@ public abstract class StringFun
}
}
public static class Substring extends ArgumentExp {
public static class Substring extends ManyArgFun {
public Substring (SQLExpression string, SQLExpression from, SQLExpression count) {
super(string, from, count);
}
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "substring";
}
}
public static class Trim extends OneArgFun {
@@ -74,6 +89,9 @@ public abstract class StringFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "trim";
}
}
public static class Upper extends OneArgFun {
@@ -83,5 +101,8 @@ public abstract class StringFun
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
public String getCanonicalFunctionName () {
return "upper";
}
}
}
@@ -1,44 +0,0 @@
//
// $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.impl.expression;
import java.util.Collection;
import com.samskivert.depot.PersistentRecord;
import com.samskivert.depot.expression.FluentExp;
import com.samskivert.depot.expression.SQLExpression;
public abstract class TwoArgFun extends FluentExp
{
protected TwoArgFun (SQLExpression arg1, SQLExpression arg2)
{
_arg1 = arg1;
_arg2 = arg2;
}
public void addClasses (Collection<Class<? extends PersistentRecord>> classSet)
{
_arg1.addClasses(classSet);
_arg2.addClasses(classSet);
}
protected SQLExpression _arg1, _arg2;
}