diff --git a/querydsl-core/src/main/java/com/mysema/query/alias/ManagedObject.java b/querydsl-core/src/main/java/com/mysema/query/alias/ManagedObject.java index eaba60fd7..8ca7e0b74 100644 --- a/querydsl-core/src/main/java/com/mysema/query/alias/ManagedObject.java +++ b/querydsl-core/src/main/java/com/mysema/query/alias/ManagedObject.java @@ -14,10 +14,4 @@ package com.mysema.query.alias; */ public interface ManagedObject { - void setElementType(Class type); - - void setKeyType(Class type); - - void setValueType(Class type); - } diff --git a/querydsl-core/src/main/java/com/mysema/query/alias/PropertyAccessInvocationHandler.java b/querydsl-core/src/main/java/com/mysema/query/alias/PropertyAccessInvocationHandler.java index 141b2d638..ffdc70093 100644 --- a/querydsl-core/src/main/java/com/mysema/query/alias/PropertyAccessInvocationHandler.java +++ b/querydsl-core/src/main/java/com/mysema/query/alias/PropertyAccessInvocationHandler.java @@ -38,12 +38,9 @@ class PropertyAccessInvocationHandler implements MethodInterceptor{ private final AliasFactory aliasFactory; -// private final JavaSerializer serializer = new JavaSerializer(new JavaOps()); - +// private final JavaSerializer serializer = new JavaSerializer(new JavaOps()); private String toString; - private Class elementType, keyType, valueType; - private final Map> propToExpr = new HashMap>(); private final Map propToObj = new HashMap(); @@ -98,11 +95,13 @@ class PropertyAccessInvocationHandler implements MethodInterceptor{ aliasFactory.setCurrent(propToExpr.get(ptyName)); }else if (isListElementAccess(method)){ + // TODO : manage cases where the argument is based on a property invocation String ptyName = "_get" + args[0]; if (propToObj.containsKey(ptyName)){ rv = propToObj.get(ptyName); }else{ PathMetadata pm = PathMetadata.forListAccess((PList)path, (Integer)args[0]); + Class elementType = ((PCollection)path).getElementType(); if (elementType != null){ rv = newInstance(elementType, elementType, proxy, ptyName, pm); }else{ @@ -119,18 +118,7 @@ class PropertyAccessInvocationHandler implements MethodInterceptor{ aliasFactory.setCurrent(Grammar.in(args[0], (CollectionType)path)); }else if (isToString(method)){ -// TODO -// if (toString == null) toString = serializer.handle(path).toString(); -// rv = toString; - - }else if (method.getName().equals("setElementType")){ - elementType = (Class) args[0]; - - }else if (method.getName().equals("setKeyType")){ - keyType = (Class) args[0]; - - }else if (method.getName().equals("setValueType")){ - valueType = (Class) args[0]; + rv = path.toString(); }else{ // rv = methodProxy.invokeSuper(proxy, args); diff --git a/querydsl-core/src/main/java/com/mysema/query/grammar/Grammar.java b/querydsl-core/src/main/java/com/mysema/query/grammar/Grammar.java index 6167047e2..7f36eed6e 100644 --- a/querydsl-core/src/main/java/com/mysema/query/grammar/Grammar.java +++ b/querydsl-core/src/main/java/com/mysema/query/grammar/Grammar.java @@ -25,6 +25,8 @@ import com.mysema.query.grammar.types.Expr.EComparable; */ public class Grammar { + protected Grammar(){}; + public static > Expr.EComparable add(Expr left, A right) { return createNumber(Ops.ADD, left, createConstant(right)); } @@ -360,10 +362,6 @@ public class Grammar { return createStringArray(Ops.SPLIT, left, createConstant(regex)); } - public static > Expr.EComparable sqrt(Expr left) { - return createNumber(Ops.SQRT, left); - } - public static EBoolean startsWith(Expr left, Expr right) { return createBoolean(Ops.STARTSWITH, left, right); } diff --git a/querydsl-core/src/main/java/com/mysema/query/grammar/Ops.java b/querydsl-core/src/main/java/com/mysema/query/grammar/Ops.java index 7e81c3cd8..5c84038f0 100644 --- a/querydsl-core/src/main/java/com/mysema/query/grammar/Ops.java +++ b/querydsl-core/src/main/java/com/mysema/query/grammar/Ops.java @@ -53,7 +53,7 @@ public interface Ops { Op DIV = new Op(); Op MOD = new Op(); Op MULT = new Op(); - Op SQRT = new Op(); +// Op SQRT = new Op(); Op SUB = new Op(); // String @@ -83,8 +83,31 @@ public interface Ops { * The Interface OpNumberAgg. */ public interface OpNumberAgg{ - Op AVG = new Op(); - Op MAX = new Op(); - Op MIN = new Op(); + Op AVG = new Op(); + Op MAX = new Op(); + Op MIN = new Op(); + } + + public interface OpMath{ + Op ABS = new Op(); + Op ACOS = new Op(); + Op ASIN = new Op(); + Op ATAN = new Op(); + Op CEIL = new Op(); + Op COS = new Op(); + Op TAN = new Op(); + Op SQRT = new Op(); + Op SIN = new Op(); + Op ROUND = new Op(); + Op RANDOM = new Op(); + Op POWER = new Op(); + Op MIN = new Op(); + Op MAX = new Op(); + Op MOD = new Op(); + Op LOG10 = new Op(); + Op LOG = new Op(); + Op FLOOR = new Op(); + Op EXP = new Op(); + } } diff --git a/querydsl-core/src/main/java/com/mysema/query/grammar/QMath.java b/querydsl-core/src/main/java/com/mysema/query/grammar/QMath.java new file mode 100644 index 000000000..7517f11d1 --- /dev/null +++ b/querydsl-core/src/main/java/com/mysema/query/grammar/QMath.java @@ -0,0 +1,91 @@ +package com.mysema.query.grammar; + +import com.mysema.query.grammar.Ops.OpMath; +import com.mysema.query.grammar.types.Expr; + +import static com.mysema.query.grammar.types.Factory.*; + +/** + * QMath provides + * + * @author tiwe + * @version $Id$ + */ +public class QMath { + + public static > Expr.EComparable abs(Expr left){ + return createNumber(OpMath.ABS, left); + } + + public static > Expr.EComparable acos(Expr left){ + return createNumber(OpMath.ACOS, left); + } + + public static > Expr.EComparable asin(Expr left){ + return createNumber(OpMath.ASIN, left); + } + + public static > Expr.EComparable atan(Expr left){ + return createNumber(OpMath.ATAN, left); + } + + public static > Expr.EComparable ceil(Expr left){ + return createNumber(OpMath.CEIL, left); + } + + public static > Expr.EComparable cos(Expr left){ + return createNumber(OpMath.COS, left); + } + + public static > Expr.EComparable exp(Expr left){ + return createNumber(OpMath.EXP, left); + } + + public static > Expr.EComparable floor(Expr left){ + return createNumber(OpMath.FLOOR, left); + } + + public static > Expr.EComparable log(Expr left){ + return createNumber(OpMath.LOG, left); + } + + public static > Expr.EComparable log10(Expr left){ + return createNumber(OpMath.LOG10, left); + } + + public static > Expr.EComparable max(Expr left, Expr right){ + return createNumber(OpMath.MAX, left, right); + } + + public static > Expr.EComparable min(Expr left, Expr right){ + return createNumber(OpMath.MIN, left, right); + } + + public static > Expr.EComparable mod(Expr left, Expr right){ + return createNumber(OpMath.MOD, left, right); + } + + public static > Expr.EComparable pow(Expr left, Expr right){ + return createNumber(OpMath.POWER, left, right); + } + + public static > Expr.EComparable random(){ + return createNumber(OpMath.RANDOM); + } + + public static > Expr.EComparable round(Expr left){ + return createNumber(OpMath.ROUND, left); + } + + public static > Expr.EComparable sin(Expr left){ + return createNumber(OpMath.SIN, left); + } + + public static > Expr.EComparable sqrt(Expr left){ + return createNumber(OpMath.SQRT, left); + } + + public static > Expr.EComparable tan(Expr left){ + return createNumber(OpMath.TAN, left); + } +} diff --git a/querydsl-core/src/main/java/com/mysema/query/grammar/types/ExtTypes.java b/querydsl-core/src/main/java/com/mysema/query/grammar/types/ExtTypes.java index 5711675d7..1d1d139cc 100644 --- a/querydsl-core/src/main/java/com/mysema/query/grammar/types/ExtTypes.java +++ b/querydsl-core/src/main/java/com/mysema/query/grammar/types/ExtTypes.java @@ -5,7 +5,10 @@ */ package com.mysema.query.grammar.types; +import com.mysema.query.Query; +import com.mysema.query.QueryBase; import com.mysema.query.grammar.Grammar; +import com.mysema.query.grammar.OrderSpecifier; /** @@ -87,5 +90,5 @@ public class ExtTypes { public EString toLowerCase(){ return lower(); } public EString toUpperCase(){ return upper(); } } - + } diff --git a/querydsl-core/src/main/java/com/mysema/query/grammar/types/SubQuery.java b/querydsl-core/src/main/java/com/mysema/query/grammar/types/SubQuery.java new file mode 100644 index 000000000..92829ca7b --- /dev/null +++ b/querydsl-core/src/main/java/com/mysema/query/grammar/types/SubQuery.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2008 Mysema Ltd. + * All rights reserved. + * + */ +package com.mysema.query.grammar.types; + +import com.mysema.query.Query; +import com.mysema.query.QueryBase; +import com.mysema.query.grammar.OrderSpecifier; + +/** + * + * SubQuery provides + * + * @author tiwe + * @version $Id$ + * + * @param + */ +public class SubQuery extends Expr implements Query>, CollectionType{ + @SuppressWarnings("unchecked") + private QueryWithPublicSelect query = new QueryWithPublicSelect(); + public SubQuery(Expr select) { + super(null); + query.s(select); + } + public SubQuery(){ + super(null); + } + @SuppressWarnings("unchecked") + public SubQuery from(EEntity... o) {query.from(o); return this;} + public SubQuery fullJoin(EEntity o) {query.fullJoin(o); return this;} + public QueryBase getQuery(){ return query;} + public SubQuery groupBy(Expr... o) {query.groupBy(o); return this;} + public SubQuery having(EBoolean... o) {query.having(o); return this;} + public SubQuery innerJoin(EEntity o) {query.innerJoin(o); return this;} + public SubQuery join(EEntity o) {query.join(o); return this;} + public SubQuery leftJoin(EEntity o) {query.leftJoin(o); return this;} + public SubQuery orderBy(OrderSpecifier... o) {query.orderBy(o); return this;} + public SubQuery select(Expr... o) {query.s(o); return this;} + public SubQuery where(EBoolean... o) {query.where(o); return this;} + public SubQuery with(EBoolean o) {query.with(o); return this;} + + private static class QueryWithPublicSelect extends QueryBase>{ + public void s(Expr... expr){ + select(expr); + } + } +} \ No newline at end of file diff --git a/querydsl-core/src/main/java/com/mysema/query/serialization/BaseSerializer.java b/querydsl-core/src/main/java/com/mysema/query/serialization/BaseSerializer.java index 7509269af..4742ccf2d 100644 --- a/querydsl-core/src/main/java/com/mysema/query/serialization/BaseSerializer.java +++ b/querydsl-core/src/main/java/com/mysema/query/serialization/BaseSerializer.java @@ -49,7 +49,7 @@ public abstract class BaseSerializer> extends Visito } return (A)this; } - + @SuppressWarnings("unchecked") protected final A _append(String sep, List> expressions) { boolean first = true; diff --git a/querydsl-core/src/main/java/com/mysema/query/serialization/OperationPatterns.java b/querydsl-core/src/main/java/com/mysema/query/serialization/OperationPatterns.java index b3cbc5d94..2f926d32e 100644 --- a/querydsl-core/src/main/java/com/mysema/query/serialization/OperationPatterns.java +++ b/querydsl-core/src/main/java/com/mysema/query/serialization/OperationPatterns.java @@ -51,7 +51,7 @@ public abstract class OperationPatterns{ add(Ops.MOD, "%s % %s",10); add(Ops.MULT,"%s * %s",7); add(Ops.SUB, "%s - %s",12); - add(Ops.SQRT, "sqrt(%s)"); +// add(Ops.SQRT, "sqrt(%s)"); // various add(Ops.EQ_PRIMITIVE, "%s = %s",18); @@ -72,6 +72,27 @@ public abstract class OperationPatterns{ add(Ops.SUBSTR2ARGS, "substring(%s,%s,%s)"); add(Ops.TRIM, "trim(%s)"); add(Ops.UPPER, "upper(%s)"); + + // math + add(Ops.OpMath.ABS,"abs(%s)"); + add(Ops.OpMath.ACOS,"acos(%s)"); + add(Ops.OpMath.ASIN,"asin(%s)"); + add(Ops.OpMath.ATAN,"atan(%s)"); + add(Ops.OpMath.CEIL,"ceil(%s)"); + add(Ops.OpMath.COS,"cos(%s)"); + add(Ops.OpMath.TAN,"tan(%s)"); + add(Ops.OpMath.SQRT,"sqrt(%s)"); + add(Ops.OpMath.SIN,"sin(%s)"); + add(Ops.OpMath.ROUND,"round(%s)"); + add(Ops.OpMath.RANDOM,"random(%s)"); + add(Ops.OpMath.POWER,"%s^%s"); + add(Ops.OpMath.MIN,"min(%s,%s)"); + add(Ops.OpMath.MAX,"max(%s,%s)"); + add(Ops.OpMath.MOD,"mod(%s,%s)"); + add(Ops.OpMath.LOG10,"log(%s)"); + add(Ops.OpMath.LOG,"log(%s)"); + add(Ops.OpMath.FLOOR,"floor(%s)"); + add(Ops.OpMath.EXP,"exp(%s)"); // path types for (PathType type : new PathType[]{PathMetadata.LISTVALUE, PathMetadata.LISTVALUE_CONSTANT, PathMetadata.MAPVALUE, PathMetadata.MAPVALUE_CONSTANT}){