It turns out PostgreSQL supports LN(exp) and LOG(exp) in double precision, but not LOG(base, exp). So we're adding an explicit LOG10. I wonder how useful the two-argument one is... maybe we should delete it.

This commit is contained in:
Par Winzell
2009-09-09 19:51:33 +00:00
parent 32bccc3dd7
commit 9c68929213
5 changed files with 27 additions and 6 deletions
+8 -5
View File
@@ -68,7 +68,8 @@ public class Funs
} }
/** /**
* Creates an expression that computes the natural logarithm of the supplied expression. * Creates an expression that computes the natural logarithm of the supplied expression,
* which may be double-precision.
*/ */
public static Ln ln (SQLExpression exp) public static Ln ln (SQLExpression exp)
{ {
@@ -76,16 +77,18 @@ public class Funs
} }
/** /**
* Creates an expression that computes the base-10 logarithm of the supplied expression. * Creates an expression that computes the base-10 logarithm of the supplied expression,
* which may be double-precision.
*/ */
public static LogN log10 (SQLExpression value) public static Log10 log10 (SQLExpression value)
{ {
return new LogN(Exps.value(10), value); return new Log10(value);
} }
/** /**
* Creates an expression that computes the logarithm of the supplied value expression * Creates an expression that computes the logarithm of the supplied value expression
* in the supplied base expression. * in the supplied base expression. Note: Under PostgreSQL, this must evaluate to a simple
* numerical, not double precision.
*/ */
public static LogN logN (SQLExpression base, SQLExpression value) public static LogN logN (SQLExpression base, SQLExpression value)
{ {
@@ -70,6 +70,15 @@ public abstract class NumericalFun
} }
} }
public static class Log10 extends OneArgFun {
public Log10 (SQLExpression value) {
super(value);
}
public Object accept (ExpressionVisitor<?> visitor) {
return visitor.visit(this);
}
}
public static class LogN extends TwoArgFun { public static class LogN extends TwoArgFun {
public LogN (SQLExpression base, SQLExpression value) { public LogN (SQLExpression base, SQLExpression value) {
super(base, value); super(base, value);
@@ -68,6 +68,7 @@ import com.samskivert.depot.function.NumericalFun.Ceil;
import com.samskivert.depot.function.NumericalFun.Exp; import com.samskivert.depot.function.NumericalFun.Exp;
import com.samskivert.depot.function.NumericalFun.Floor; import com.samskivert.depot.function.NumericalFun.Floor;
import com.samskivert.depot.function.NumericalFun.Ln; import com.samskivert.depot.function.NumericalFun.Ln;
import com.samskivert.depot.function.NumericalFun.Log10;
import com.samskivert.depot.function.NumericalFun.LogN; import com.samskivert.depot.function.NumericalFun.LogN;
import com.samskivert.depot.function.NumericalFun.Pi; import com.samskivert.depot.function.NumericalFun.Pi;
import com.samskivert.depot.function.NumericalFun.Power; import com.samskivert.depot.function.NumericalFun.Power;
@@ -617,6 +618,11 @@ public abstract class BuildVisitor implements ExpressionVisitor<Void>
return appendFunctionCall("ln", exp.getArg()); return appendFunctionCall("ln", exp.getArg());
} }
public Void visit (Log10 exp)
{
return appendFunctionCall("log", exp.getArg());
}
public Void visit (LogN exp) public Void visit (LogN exp)
{ {
return appendFunctionCall("log", exp.getBase(), exp.getValue()); return appendFunctionCall("log", exp.getBase(), exp.getValue());
@@ -51,6 +51,7 @@ import com.samskivert.depot.function.NumericalFun.Ceil;
import com.samskivert.depot.function.NumericalFun.Exp; import com.samskivert.depot.function.NumericalFun.Exp;
import com.samskivert.depot.function.NumericalFun.Floor; import com.samskivert.depot.function.NumericalFun.Floor;
import com.samskivert.depot.function.NumericalFun.Ln; import com.samskivert.depot.function.NumericalFun.Ln;
import com.samskivert.depot.function.NumericalFun.Log10;
import com.samskivert.depot.function.NumericalFun.LogN; import com.samskivert.depot.function.NumericalFun.LogN;
import com.samskivert.depot.function.NumericalFun.Pi; import com.samskivert.depot.function.NumericalFun.Pi;
import com.samskivert.depot.function.NumericalFun.Power; import com.samskivert.depot.function.NumericalFun.Power;
@@ -123,6 +124,7 @@ public interface ExpressionVisitor<T>
public T visit (Exp exp); public T visit (Exp exp);
public T visit (Floor exp); public T visit (Floor exp);
public T visit (Ln exp); public T visit (Ln exp);
public T visit (Log10 exp);
public T visit (LogN exp); public T visit (LogN exp);
public T visit (Pi exp); public T visit (Pi exp);
public T visit (Power exp); public T visit (Power exp);
@@ -86,7 +86,8 @@ public class PostgreSQLBuilder
return null; return null;
} }
@Override public Void visit (DatePart exp) { @Override public Void visit (DatePart exp)
{
return appendFunctionCall( return appendFunctionCall(
"date_part", Exps.value(translateDatePart(exp.getPart())), exp.getArg()); "date_part", Exps.value(translateDatePart(exp.getPart())), exp.getArg());
} }