From aa29b143affc61c548d5841b2f16dedc1e106b5d Mon Sep 17 00:00:00 2001 From: Par Winzell Date: Thu, 10 Sep 2009 15:26:54 +0000 Subject: [PATCH] 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. --- .../depot/impl/expression/AggregateFun.java | 24 ++++++++++ .../depot/impl/expression/ConditionalFun.java | 16 +++++-- .../depot/impl/expression/DateFun.java | 11 +++++ .../depot/impl/expression/NoArgFun.java | 34 -------------- .../depot/impl/expression/NumericalFun.java | 42 +++++++++++++++++ .../depot/impl/expression/OneArgFun.java | 47 ------------------- .../depot/impl/expression/StringFun.java | 23 ++++++++- .../depot/impl/expression/TwoArgFun.java | 44 ----------------- 8 files changed, 112 insertions(+), 129 deletions(-) diff --git a/src/java/com/samskivert/depot/impl/expression/AggregateFun.java b/src/java/com/samskivert/depot/impl/expression/AggregateFun.java index eb55683..6e6278e 100644 --- a/src/java/com/samskivert/depot/impl/expression/AggregateFun.java +++ b/src/java/com/samskivert/depot/impl/expression/AggregateFun.java @@ -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; } diff --git a/src/java/com/samskivert/depot/impl/expression/ConditionalFun.java b/src/java/com/samskivert/depot/impl/expression/ConditionalFun.java index 802d2cb..e278b40 100644 --- a/src/java/com/samskivert/depot/impl/expression/ConditionalFun.java +++ b/src/java/com/samskivert/depot/impl/expression/ConditionalFun.java @@ -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"; + } } } diff --git a/src/java/com/samskivert/depot/impl/expression/DateFun.java b/src/java/com/samskivert/depot/impl/expression/DateFun.java index 84bae36..6c65283 100644 --- a/src/java/com/samskivert/depot/impl/expression/DateFun.java +++ b/src/java/com/samskivert/depot/impl/expression/DateFun.java @@ -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"; + } } } diff --git a/src/java/com/samskivert/depot/impl/expression/NoArgFun.java b/src/java/com/samskivert/depot/impl/expression/NoArgFun.java index 0f6b562..e69de29 100644 --- a/src/java/com/samskivert/depot/impl/expression/NoArgFun.java +++ b/src/java/com/samskivert/depot/impl/expression/NoArgFun.java @@ -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> classSet) - { - // nothing to add - } -} diff --git a/src/java/com/samskivert/depot/impl/expression/NumericalFun.java b/src/java/com/samskivert/depot/impl/expression/NumericalFun.java index 438da97..6d7a452 100644 --- a/src/java/com/samskivert/depot/impl/expression/NumericalFun.java +++ b/src/java/com/samskivert/depot/impl/expression/NumericalFun.java @@ -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"; + } } } diff --git a/src/java/com/samskivert/depot/impl/expression/OneArgFun.java b/src/java/com/samskivert/depot/impl/expression/OneArgFun.java index 9a0dc7d..e69de29 100644 --- a/src/java/com/samskivert/depot/impl/expression/OneArgFun.java +++ b/src/java/com/samskivert/depot/impl/expression/OneArgFun.java @@ -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> classSet) - { - _argument.addClasses(classSet); - } - - public SQLExpression getArg () - { - return _argument; - } - - protected SQLExpression _argument; -} diff --git a/src/java/com/samskivert/depot/impl/expression/StringFun.java b/src/java/com/samskivert/depot/impl/expression/StringFun.java index 1a06265..05c8237 100644 --- a/src/java/com/samskivert/depot/impl/expression/StringFun.java +++ b/src/java/com/samskivert/depot/impl/expression/StringFun.java @@ -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"; + } } } diff --git a/src/java/com/samskivert/depot/impl/expression/TwoArgFun.java b/src/java/com/samskivert/depot/impl/expression/TwoArgFun.java index f4a18e5..e69de29 100644 --- a/src/java/com/samskivert/depot/impl/expression/TwoArgFun.java +++ b/src/java/com/samskivert/depot/impl/expression/TwoArgFun.java @@ -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> classSet) - { - _arg1.addClasses(classSet); - _arg2.addClasses(classSet); - } - - protected SQLExpression _arg1, _arg2; -}