Revamp OrderBy.random() for postgres compatibility.

This commit is contained in:
Ray J. Greenwell
2014-12-16 19:36:05 -08:00
parent a4356d6c56
commit c9930244dd
5 changed files with 23 additions and 1 deletions
@@ -11,6 +11,7 @@ import com.samskivert.util.ArrayUtil;
import com.samskivert.depot.expression.SQLExpression; import com.samskivert.depot.expression.SQLExpression;
import com.samskivert.depot.impl.FragmentVisitor; import com.samskivert.depot.impl.FragmentVisitor;
import com.samskivert.depot.impl.expression.LiteralExp; import com.samskivert.depot.impl.expression.LiteralExp;
import com.samskivert.depot.impl.expression.RandomExp;
/** /**
* Represents an ORDER BY clause. * Represents an ORDER BY clause.
@@ -48,7 +49,7 @@ public class OrderBy implements QueryClause
*/ */
public static OrderBy random () public static OrderBy random ()
{ {
return ascending(new LiteralExp<Object>("rand()")); return ascending(RandomExp.INSTANCE);
} }
/** /**
@@ -48,6 +48,7 @@ import com.samskivert.depot.impl.clause.UpdateClause;
import com.samskivert.depot.impl.expression.AggregateFun; import com.samskivert.depot.impl.expression.AggregateFun;
import com.samskivert.depot.impl.expression.IntervalExp; import com.samskivert.depot.impl.expression.IntervalExp;
import com.samskivert.depot.impl.expression.LiteralExp; import com.samskivert.depot.impl.expression.LiteralExp;
import com.samskivert.depot.impl.expression.RandomExp;
import com.samskivert.depot.impl.expression.ValueExp; import com.samskivert.depot.impl.expression.ValueExp;
import com.samskivert.depot.impl.expression.AggregateFun.Average; import com.samskivert.depot.impl.expression.AggregateFun.Average;
import com.samskivert.depot.impl.expression.AggregateFun.Count; import com.samskivert.depot.impl.expression.AggregateFun.Count;
@@ -323,6 +324,12 @@ public abstract class BuildVisitor implements FragmentVisitor<Void>
return null; return null;
} }
public Void visit (RandomExp randomExp)
{
_builder.append("rand()");
return null;
}
public Void visit (ValueExp<?> valueExp) public Void visit (ValueExp<?> valueExp)
{ {
bindValue(valueExp.getValue()); bindValue(valueExp.getValue());
@@ -33,6 +33,7 @@ import com.samskivert.depot.impl.clause.DropIndexClause;
import com.samskivert.depot.impl.clause.UpdateClause; import com.samskivert.depot.impl.clause.UpdateClause;
import com.samskivert.depot.impl.expression.IntervalExp; import com.samskivert.depot.impl.expression.IntervalExp;
import com.samskivert.depot.impl.expression.LiteralExp; import com.samskivert.depot.impl.expression.LiteralExp;
import com.samskivert.depot.impl.expression.RandomExp;
import com.samskivert.depot.impl.expression.ValueExp; import com.samskivert.depot.impl.expression.ValueExp;
import com.samskivert.depot.impl.expression.AggregateFun.Average; import com.samskivert.depot.impl.expression.AggregateFun.Average;
import com.samskivert.depot.impl.expression.AggregateFun.Count; import com.samskivert.depot.impl.expression.AggregateFun.Count;
@@ -199,6 +200,11 @@ public class ExpressionEvaluator
return new NoValue("Cannot evaluate LiteralExp: " + literalExp); return new NoValue("Cannot evaluate LiteralExp: " + literalExp);
} }
public Object visit (RandomExp randomExp)
{
return new NoValue("Cannot evaluate RandomExp");
}
public Object visit (ValueExp<?> valueExp) public Object visit (ValueExp<?> valueExp)
{ {
return valueExp.getValue(); return valueExp.getValue();
@@ -28,6 +28,7 @@ import com.samskivert.depot.impl.clause.DropIndexClause;
import com.samskivert.depot.impl.clause.UpdateClause; import com.samskivert.depot.impl.clause.UpdateClause;
import com.samskivert.depot.impl.expression.IntervalExp; import com.samskivert.depot.impl.expression.IntervalExp;
import com.samskivert.depot.impl.expression.LiteralExp; import com.samskivert.depot.impl.expression.LiteralExp;
import com.samskivert.depot.impl.expression.RandomExp;
import com.samskivert.depot.impl.expression.ValueExp; import com.samskivert.depot.impl.expression.ValueExp;
import com.samskivert.depot.impl.expression.AggregateFun.Average; import com.samskivert.depot.impl.expression.AggregateFun.Average;
import com.samskivert.depot.impl.expression.AggregateFun.Count; import com.samskivert.depot.impl.expression.AggregateFun.Count;
@@ -89,6 +90,7 @@ public interface FragmentVisitor<T>
public T visit (Join join); public T visit (Join join);
public T visit (Limit limit); public T visit (Limit limit);
public T visit (LiteralExp<?> literal); public T visit (LiteralExp<?> literal);
public T visit (RandomExp random);
public T visit (ValueExp<?> value); public T visit (ValueExp<?> value);
public T visit (IntervalExp interval); public T visit (IntervalExp interval);
public T visit (WhereClause where); public T visit (WhereClause where);
@@ -29,6 +29,7 @@ import com.samskivert.depot.impl.expression.DateFun.DatePart.Part;
import com.samskivert.depot.impl.expression.DateFun.DatePart; import com.samskivert.depot.impl.expression.DateFun.DatePart;
import com.samskivert.depot.impl.expression.DateFun.DateTruncate; import com.samskivert.depot.impl.expression.DateFun.DateTruncate;
import com.samskivert.depot.impl.expression.IntervalExp; import com.samskivert.depot.impl.expression.IntervalExp;
import com.samskivert.depot.impl.expression.RandomExp;
public class PostgreSQLBuilder public class PostgreSQLBuilder
extends SQLBuilder extends SQLBuilder
@@ -39,6 +40,11 @@ public class PostgreSQLBuilder
public class PGBuildVisitor extends BuildVisitor public class PGBuildVisitor extends BuildVisitor
{ {
@Override public Void visit (RandomExp randomExp) {
_builder.append("random()");
return null;
}
@Override public Void visit (IntervalExp interval) { @Override public Void visit (IntervalExp interval) {
_builder.append("interval '").append(interval.amount); _builder.append("interval '").append(interval.amount);
_builder.append(" ").append(interval.unit).append("'"); _builder.append(" ").append(interval.unit).append("'");