diff --git a/querydsl-core/src/main/java/com/mysema/query/types/Expr.java b/querydsl-core/src/main/java/com/mysema/query/types/Expr.java index 7cc22b214..b312ff5bd 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/Expr.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/Expr.java @@ -44,6 +44,8 @@ public abstract class Expr implements Serializable{ public abstract R accept(Visitor v, @Nullable C context); public abstract Expr as(Path alias); + + public abstract Expr as(String alias); /** * Get the count(this) expression diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/EBoolean.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/EBoolean.java index f18959fa3..1b2a80e26 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/EBoolean.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/EBoolean.java @@ -10,6 +10,7 @@ import javax.annotation.Nullable; import com.mysema.query.types.Operator; import com.mysema.query.types.Ops; import com.mysema.query.types.Path; +import com.mysema.query.types.path.PSimple; /** * EBoolean represents boolean expressions @@ -52,6 +53,12 @@ public abstract class EBoolean extends EComparable { public EBoolean as(Path alias) { return OBoolean.create((Operator)Ops.ALIAS, this, alias.asExpr()); } + + @SuppressWarnings("unchecked") + @Override + public EBoolean as(String alias) { + return OBoolean.create((Operator)Ops.ALIAS, this, new PSimple(getType(), alias)); + } /** * Get an intersection of this and the given expression diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/EComparable.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/EComparable.java index 2099769e4..327f2e08b 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/EComparable.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/EComparable.java @@ -9,6 +9,7 @@ import com.mysema.query.types.Expr; import com.mysema.query.types.Operator; import com.mysema.query.types.Ops; import com.mysema.query.types.Path; +import com.mysema.query.types.path.PSimple; /** * EComparable extends EComparableBase to provide comparison methods. @@ -25,11 +26,16 @@ public abstract class EComparable extends EComparableBase< public EComparable(Class type) { super(type); } - + @Override public EComparable as(Path alias) { return OComparable.create(getType(),(Operator)Ops.ALIAS, this, alias.asExpr()); } + + @Override + public EComparable as(String alias) { + return OComparable.create(getType(),(Operator)Ops.ALIAS, this, new PSimple(getType(), alias)); + } /** * Get a from < this < to expression diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/EDate.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/EDate.java index 11550be56..616b49ffe 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/EDate.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/EDate.java @@ -12,6 +12,7 @@ import javax.annotation.Nullable; import com.mysema.query.types.Operator; import com.mysema.query.types.Ops; import com.mysema.query.types.Path; +import com.mysema.query.types.path.PSimple; /** * EDate represents Date expressions @@ -65,6 +66,11 @@ public abstract class EDate extends EDateOrTime { return ODate.create(getType(),(Operator)Ops.ALIAS, this, alias.asExpr()); } + @Override + public EDate as(String alias) { + return ODate.create(getType(), (Operator)Ops.ALIAS, this, new PSimple(getType(), alias)); + } + /** * Get a day of month expression (range 1-31) * diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/EDateTime.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/EDateTime.java index 4959f0bf7..b73266f33 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/EDateTime.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/EDateTime.java @@ -12,6 +12,7 @@ import javax.annotation.Nullable; import com.mysema.query.types.Operator; import com.mysema.query.types.Ops; import com.mysema.query.types.Path; +import com.mysema.query.types.path.PSimple; /** * EDateTime represents Date / Time expressions @@ -81,6 +82,11 @@ public abstract class EDateTime extends EDate { public EDateTime as(Path alias) { return ODateTime.create(getType(),(Operator)Ops.ALIAS, this, alias.asExpr()); } + + @Override + public EDateTime as(String alias) { + return ODateTime.create(getType(), (Operator)Ops.ALIAS, this, new PSimple(getType(), alias)); + } /** * Get a hours expression (range 0-23) diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/EEnum.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/EEnum.java index 45641e5c0..8b2d828d5 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/EEnum.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/EEnum.java @@ -5,7 +5,10 @@ */ package com.mysema.query.types.expr; +import com.mysema.query.types.Operator; import com.mysema.query.types.Ops; +import com.mysema.query.types.Path; +import com.mysema.query.types.path.PSimple; /** * @author tiwe @@ -19,6 +22,18 @@ public abstract class EEnum> extends EComparable { public EEnum(Class type) { super(type); } + + @SuppressWarnings("unchecked") + @Override + public EEnum as(Path alias) { + return OEnum.create(getType(),(Operator)Ops.ALIAS, this, alias.asExpr()); + } + + @SuppressWarnings("unchecked") + @Override + public EEnum as(String alias) { + return OEnum.create(getType(),(Operator)Ops.ALIAS, this, new PSimple(getType(), alias)); + } /** * @return diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/ENumber.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/ENumber.java index edc59d814..e7a7796cf 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/ENumber.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/ENumber.java @@ -17,6 +17,7 @@ import com.mysema.query.types.Operator; import com.mysema.query.types.Ops; import com.mysema.query.types.Path; import com.mysema.query.types.Ops.MathOps; +import com.mysema.query.types.path.PSimple; import com.mysema.util.MathUtils; /** @@ -81,6 +82,12 @@ public abstract class ENumber> extends ECompara public ENumber as(Path alias) { return ONumber.create(getType(),(Operator)Ops.ALIAS, this, alias.asExpr()); } + + @SuppressWarnings("unchecked") + @Override + public ENumber as(String alias) { + return ONumber.create(getType(),(Operator)Ops.ALIAS, this, new PSimple(getType(), alias)); + } /** * Get the absolute value of this expression diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/ESimple.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/ESimple.java index 6c8bb093f..8b84aaa35 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/ESimple.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/ESimple.java @@ -14,6 +14,7 @@ import com.mysema.query.types.Expr; import com.mysema.query.types.Operator; import com.mysema.query.types.Ops; import com.mysema.query.types.Path; +import com.mysema.query.types.path.PSimple; /** * ESimple is the base class for Expr implementations. It provides default implementations @@ -134,13 +135,23 @@ public abstract class ESimple extends Expr { } /** - * Create an alias for the operation + * Create an alias for the expression * * @return */ @SuppressWarnings("unchecked") - public Expr as(Path alias) { + public ESimple as(Path alias) { return OSimple.create(getType(),(Operator)Ops.ALIAS, this, alias.asExpr()); } + + /** + * Create an alias for the expression + * + * @return + */ + @SuppressWarnings("unchecked") + public ESimple as(String alias) { + return OSimple.create(getType(),(Operator)Ops.ALIAS, this, new PSimple(getType(), alias)); + } } diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/EString.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/EString.java index a9ca365e9..98fefc2af 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/EString.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/EString.java @@ -11,6 +11,7 @@ import com.mysema.query.types.Expr; import com.mysema.query.types.Operator; import com.mysema.query.types.Ops; import com.mysema.query.types.Path; +import com.mysema.query.types.path.PSimple; /** * EString represents String expressions @@ -40,6 +41,12 @@ public abstract class EString extends EComparable { public EString as(Path alias) { return OString.create((Operator)Ops.ALIAS, this, alias.asExpr()); } + + @SuppressWarnings("unchecked") + @Override + public EString as(String alias) { + return OString.create((Operator)Ops.ALIAS, this, new PSimple(getType(), alias)); + } /** * Get the concatenation of this and str diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/ETime.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/ETime.java index 7d1b1deef..2b37278da 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/ETime.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/ETime.java @@ -12,6 +12,7 @@ import javax.annotation.Nullable; import com.mysema.query.types.Operator; import com.mysema.query.types.Ops; import com.mysema.query.types.Path; +import com.mysema.query.types.path.PSimple; /** * ETime represents Time expressions @@ -38,6 +39,11 @@ public abstract class ETime extends EDateOrTime { public ETime as(Path alias) { return OTime.create(getType(),(Operator)Ops.ALIAS, this, alias.asExpr()); } + + @Override + public ETime as(String alias) { + return OTime.create(getType(), (Operator)Ops.ALIAS, this, new PSimple(getType(), alias)); + } /** * Get a hours expression (range 0-23) diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/OSimple.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/OSimple.java index 00d385190..297da77e5 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/expr/OSimple.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/OSimple.java @@ -33,7 +33,7 @@ public class OSimple extends ESimple implements Operation { * @param args * @return */ - public static Expr create(Class type, Operator op, Expr... args){ + public static ESimple create(Class type, Operator op, Expr... args){ return new OSimple(type, op, args); } diff --git a/querydsl-core/src/test/java/com/mysema/query/types/expr/ESimpleTest.java b/querydsl-core/src/test/java/com/mysema/query/types/expr/ESimpleTest.java new file mode 100644 index 000000000..a15a95afe --- /dev/null +++ b/querydsl-core/src/test/java/com/mysema/query/types/expr/ESimpleTest.java @@ -0,0 +1,45 @@ +package com.mysema.query.types.expr; + +import static org.junit.Assert.assertEquals; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +import com.mysema.query.types.Path; +import com.mysema.query.types.path.PString; + +public class ESimpleTest { + + @Test + public void as_usage(){ + ESimple str = new PString("str"); + assertEquals("str as alias", str.as("alias").toString()); + assertEquals("str as alias", str.as(new PString("alias")).toString()); + } + + @Test + public void Subclasses_Override_As() throws SecurityException, NoSuchMethodException{ + List> classes = Arrays.>asList( + EBoolean.class, + EComparable.class, + EDate.class, + EDateTime.class, + EEnum.class, + ENumber.class, + ESimple.class, + EString.class, + ETime.class); + + for (Class cl : classes){ + Method asPath = cl.getDeclaredMethod("as", Path.class); + assertEquals(cl, asPath.getReturnType()); + + Method asString = cl.getDeclaredMethod("as", String.class); + assertEquals(cl, asString.getReturnType()); + } + } + +} diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java index afade67fa..a7faa1d7a 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java @@ -32,6 +32,8 @@ import com.mysema.query.types.expr.ExprConst; * @version $Id$ */ public class SQLSerializer extends SerializerBase { + + enum Stage {SELECT, FROM, WHERE, GROUP_BY, HAVING, ORDER_BY} private final SerializationContext context = new SerializationContext(){ @@ -65,6 +67,8 @@ public class SQLSerializer extends SerializerBase { private final List constants = new ArrayList(); private final boolean dml; + + private Stage stage = Stage.SELECT; private boolean skipParent; @@ -152,10 +156,13 @@ public class SQLSerializer extends SerializerBase { } } + // start serialize(Position.START, flags); // select + Stage oldStage = stage; + stage = Stage.SELECT; if (forCountRow) { append(templates.getSelect()); serialize(Position.AFTER_SELECT, flags); @@ -185,9 +192,11 @@ public class SQLSerializer extends SerializerBase { serialize(Position.AFTER_PROJECTION, flags); // from + stage = Stage.FROM; serializeSources(joins); - - // where + + // where + stage = Stage.WHERE; serialize(Position.BEFORE_FILTERS, flags); if (where != null) { append(templates.getWhere()).handle(where); @@ -195,6 +204,7 @@ public class SQLSerializer extends SerializerBase { } // group by + stage = Stage.GROUP_BY; serialize(Position.BEFORE_GROUP_BY, flags); if (!groupBy.isEmpty()) { append(templates.getGroupBy()).handle(COMMA, groupBy); @@ -202,6 +212,7 @@ public class SQLSerializer extends SerializerBase { } // having + stage = Stage.HAVING; serialize(Position.BEFORE_HAVING, flags); if (having != null) { if (groupBy.isEmpty()) { @@ -212,6 +223,7 @@ public class SQLSerializer extends SerializerBase { } // order by + stage = Stage.ORDER_BY; serialize(Position.BEFORE_ORDER, flags); if (!orderBy.isEmpty() && !forCountRow) { append(templates.getOrderBy()); @@ -229,6 +241,9 @@ public class SQLSerializer extends SerializerBase { // end serialize(Position.END, flags); + + // reset stage + stage = oldStage; } @@ -503,6 +518,14 @@ public class SQLSerializer extends SerializerBase { String typeName = templates.getTypeForClass(targetType); visitOperation(targetType, SQLTemplates.CAST, Arrays.>asList(args.get(0), ExprConst.create(typeName))); + } else if (operator.equals(Ops.ALIAS)){ + if (stage == Stage.SELECT || stage == Stage.FROM){ + super.visitOperation(type, operator, args); + }else{ + // handle only target + handle(args.get(1)); + } + } else { super.visitOperation(type, operator, args); } diff --git a/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java b/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java index 12cca24e7..fb8b00a2e 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java @@ -65,7 +65,7 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ public static class SimpleProjection { - public SimpleProjection(String str, String str2) { + public SimpleProjection(String str, String str2) { } } @@ -74,30 +74,30 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ @Override protected Pair>> createQuery() { return Pair.of( - (Projectable)query().from(employee, employee2), - Collections.>emptyList()); + (Projectable)query().from(employee, employee2), + Collections.>emptyList()); } @Override protected Pair>> createQuery(EBoolean filter) { return Pair.of( - (Projectable)query().from(employee, employee2).where(filter), - Collections.>singletonList(employee.firstname)); + (Projectable)query().from(employee, employee2).where(filter), + Collections.>singletonList(employee.firstname)); } }; - + @Test public void wildcardAll() { expectedQuery = "select * from EMPLOYEE2 e"; query().from(employee).uniqueResult(Wildcard.all); } - + @Test public void countAll() { expectedQuery = "select count(*) as rowCount from EMPLOYEE2 e"; PNumber rowCount = new PNumber(Long.class, "rowCount"); query().from(employee).uniqueResult(Wildcard.count().as(rowCount)); } - + @Test public void aggregate(){ int min = 30000, avg = 65000, max = 160000; @@ -171,7 +171,7 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ @Test public void join() throws Exception { for (String name : query().from(survey, survey2) - .where(survey.id.eq(survey2.id)).list(survey.name)) { + .where(survey.id.eq(survey2.id)).list(survey.name)) { System.out.println(name); } } @@ -190,13 +190,13 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ public void compactJoin(){ // verbose query().from(employee).innerJoin(employee2) - .on(employee.superiorId.eq(employee2.id)) - .list(employee.id, employee2.id); + .on(employee.superiorId.eq(employee2.id)) + .list(employee.id, employee2.id); // compact query().from(employee) - .innerJoin(employee.superiorIdKey, employee2) - .list(employee.id, employee2.id); + .innerJoin(employee.superiorIdKey, employee2) + .list(employee.id, employee2.id); } @@ -204,13 +204,13 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ public void limitAndOffset() throws SQLException { // limit query().from(employee) - .orderBy(employee.firstname.asc()) - .limit(4).list(employee.id); + .orderBy(employee.firstname.asc()) + .limit(4).list(employee.id); // limit and offset query().from(employee) - .orderBy(employee.firstname.asc()) - .limit(4).offset(3).list(employee.id); + .orderBy(employee.firstname.asc()) + .limit(4).offset(3).list(employee.id); } @Test @@ -225,7 +225,7 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ query().from(employee).limit(4).offset(3).list(employee.id); } - + @Test public void limitAndOffsetAndOrder(){ // limit @@ -243,34 +243,34 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ .list(employee.firstname)); } -// @SuppressWarnings("unchecked") -// @Test -// @ExcludeIn({DERBY}) -// public void mathFunctions() throws SQLException { -// Expr d = ENumberConst.create(1.0); -// for (Expr e : Arrays.> asList( -// MathFunctions.acos(d), -// MathFunctions.asin(d), -// MathFunctions.atan(d), -// MathFunctions.cos(d), -// MathFunctions.tan(d), -// MathFunctions.sin(d), -// ENumber.random(), -// MathFunctions.pow(d, d), -// MathFunctions.log10(d), -// MathFunctions.log(d), -// MathFunctions.exp(d))) { -// query().from(employee).list((Expr) e); -// } -// } + // @SuppressWarnings("unchecked") + // @Test + // @ExcludeIn({DERBY}) + // public void mathFunctions() throws SQLException { + // Expr d = ENumberConst.create(1.0); + // for (Expr e : Arrays.> asList( + // MathFunctions.acos(d), + // MathFunctions.asin(d), + // MathFunctions.atan(d), + // MathFunctions.cos(d), + // MathFunctions.tan(d), + // MathFunctions.sin(d), + // ENumber.random(), + // MathFunctions.pow(d, d), + // MathFunctions.log10(d), + // MathFunctions.log(d), + // MathFunctions.exp(d))) { + // query().from(employee).list((Expr) e); + // } + // } @Test @ExcludeIn({HSQLDB, H2, MYSQL}) public void offsetOnly(){ // offset query().from(employee) - .orderBy(employee.firstname.asc()) - .offset(3).list(employee.id); + .orderBy(employee.firstname.asc()) + .offset(3).list(employee.id); } @Test @@ -392,11 +392,11 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ public void subQueries() throws SQLException { // subquery in where block expectedQuery = "select e.ID from EMPLOYEE2 e " - + "where e.ID = (select max(e.ID) " - + "from EMPLOYEE2 e)"; + + "where e.ID = (select max(e.ID) " + + "from EMPLOYEE2 e)"; List list = query().from(employee) - .where(employee.id.eq(sq().from(employee).unique(employee.id.max()))) - .list(employee.id); + .where(employee.id.eq(sq().from(employee).unique(employee.id.max()))) + .list(employee.id); assertFalse(list.isEmpty()); } @@ -413,17 +413,21 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ PNumber sal = new PNumber(BigDecimal.class, "sal"); PathBuilder sq = new PathBuilder(Object[].class, "sq"); SQLSerializer serializer = new SQLSerializer(SQLTemplates.DEFAULT); - serializer.handle(sq().from(employee) - .list(employee.salary.add(employee.salary).add(employee.salary).as(sal)).as(sq)); + + serializer.handle( + sq() + .from(employee) + .list(employee.salary.add(employee.salary).add(employee.salary).as(sal)) + .as(sq)); assertEquals("(select (e.SALARY + e.SALARY + e.SALARY) as sal\nfrom EMPLOYEE2 e) as sq", serializer.toString()); } @Test public void complexSubQuery(){ -// query.from( -// subQuery.from(Table.table) -// .list(Table.table.field1.add(Table.table.field2).add(Table.table.field3).as("myCalculation"))). -// list(myCalculation.avg(), myCalculation.min(). myCalculation.max()); + // query.from( + // subQuery.from(Table.table) + // .list(Table.table.field1.add(Table.table.field2).add(Table.table.field3).as("myCalculation"))). + // list(myCalculation.avg(), myCalculation.min(). myCalculation.max()); // alias for the salary PNumber sal = new PNumber(BigDecimal.class, "sal"); @@ -433,9 +437,9 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ query().from( sq().from(employee) .list(employee.salary.add(employee.salary).add(employee.salary).as(sal)).as(sq) - ).list(sq.get(sal).avg(), sq.get(sal).min(), sq.get(sal).max()); + ).list(sq.get(sal).avg(), sq.get(sal).min(), sq.get(sal).max()); -// select avg(sq.sal), min(sq.sal), max(sq.sal) from (select (e.SALARY + e.SALARY + e.SALARY) as sal from EMPLOYEE2 e) as sq + // select avg(sq.sal), min(sq.sal), max(sq.sal) from (select (e.SALARY + e.SALARY + e.SALARY) as sal from EMPLOYEE2 e) as sq } @Test @@ -451,29 +455,29 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ // right join // FIXME -// query().from(employee).rightJoin(sq, sqEmp).on(sqEmp.id.eq(employee.id)).list(employee.id); + // query().from(employee).rightJoin(sq, sqEmp).on(sqEmp.id.eq(employee.id)).list(employee.id); // FIXME // full join -// query().from(employee).fullJoin(sq, sqEmp).on(sqEmp.id.eq(employee.id)).list(employee.id); + // query().from(employee).fullJoin(sq, sqEmp).on(sqEmp.id.eq(employee.id)).list(employee.id); } @Test public void syntaxForEmployee() throws SQLException { query().from(employee).groupBy(employee.superiorId) - .orderBy(employee.superiorId.asc()) - .list(employee.salary.avg(),employee.id.max()); + .orderBy(employee.superiorId.asc()) + .list(employee.salary.avg(),employee.id.max()); query().from(employee).groupBy(employee.superiorId) - .having(employee.id.max().gt(5)) - .orderBy(employee.superiorId.asc()) - .list(employee.salary.avg(), employee.id.max()); + .having(employee.id.max().gt(5)) + .orderBy(employee.superiorId.asc()) + .list(employee.salary.avg(), employee.id.max()); query().from(employee).groupBy(employee.superiorId) - .having(employee.superiorId.isNotNull()) - .orderBy(employee.superiorId.asc()) - .list(employee.salary.avg(),employee.id.max()); + .having(employee.superiorId.isNotNull()) + .orderBy(employee.superiorId.asc()) + .list(employee.salary.avg(),employee.id.max()); } @SuppressWarnings("unchecked") @@ -497,19 +501,19 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ List list2 = query().union(sq3, sq4).list(); assertFalse(list2.isEmpty()); } - + @SuppressWarnings("unchecked") @Test public void union_single_column_projections() throws IOException{ SubQueryExpression sq1 = sq().from(employee).unique(employee.id.max()); SubQueryExpression sq2 = sq().from(employee).unique(employee.id.min()); - + // list List list = query().union(sq1, sq2).list(); assertEquals(2, list.size()); assertTrue(list.get(0) != null); assertTrue(list.get(1) != null); - + // iterator CloseableIterator iterator = query().union(sq1,sq2).iterate(); try{ @@ -521,18 +525,18 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ iterator.close(); } } - + @Test public void union_multi_column_projection() throws IOException{ SubQueryExpression sq1 = sq().from(employee).unique(employee.id.max(), employee.id.max().subtract(1)); SubQueryExpression sq2 = sq().from(employee).unique(employee.id.min(), employee.id.min().subtract(1)); - + // list List list = query().union(sq1, sq2).list(); assertEquals(2, list.size()); assertTrue(list.get(0) != null); assertTrue(list.get(1) != null); - + // iterator CloseableIterator iterator = query().union(sq1,sq2).iterate(); try{ @@ -599,7 +603,7 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ assertNotNull(row[1]); } - + @Test public void all(){ for (Expr expr : survey.all()){ @@ -618,18 +622,18 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ } // column and wildcard -// for (Object[] row : query().from(survey).list(survey.id, survey.all())){ -// assertEquals(3, row.length); -// assertEquals(Integer.class, row[0].getClass()); -// assertNotNull(row[1]); -// assertNotNull(row[2]); -// } + // for (Object[] row : query().from(survey).list(survey.id, survey.all())){ + // assertEquals(3, row.length); + // assertEquals(Integer.class, row[0].getClass()); + // assertNotNull(row[1]); + // assertNotNull(row[2]); + // } // projection and wildcard -// for (Object[] row : query().from(survey).list(new QIdName(survey.id, survey.name), survey.all())){ -// assertEquals(3, row.length); -// assertEquals(IdName.class, row[0].getClass()); -// } + // for (Object[] row : query().from(survey).list(new QIdName(survey.id, survey.name), survey.all())){ + // assertEquals(3, row.length); + // assertEquals(IdName.class, row[0].getClass()); + // } // projection and two columns for (Object[] row : query().from(survey).list(new QIdName(survey.id, survey.name), survey.id, survey.name)){ @@ -646,14 +650,14 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ assertEquals(String.class, row[1].getClass()); assertEquals(IdName.class, row[2].getClass()); } - + // wildcard and QTuple for (Tuple tuple : query().from(survey).list(new QTuple(survey.all()))){ assertNotNull(tuple.get(survey.id)); assertNotNull(tuple.get(survey.name)); } - - + + } @Test @@ -667,43 +671,43 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ @Test public void tupleProjection(){ - List tuples = query().from(employee).list(new QTuple(employee.firstname, employee.lastname)); - assertFalse(tuples.isEmpty()); - for (Tuple tuple : tuples){ - assertNotNull(tuple.get(employee.firstname)); - assertNotNull(tuple.get(employee.lastname)); - } + List tuples = query().from(employee).list(new QTuple(employee.firstname, employee.lastname)); + assertFalse(tuples.isEmpty()); + for (Tuple tuple : tuples){ + assertNotNull(tuple.get(employee.firstname)); + assertNotNull(tuple.get(employee.lastname)); + } } @Test public void customProjection(){ - List tuples = query().from(employee).list(new QProjection(employee.firstname, employee.lastname)); - assertFalse(tuples.isEmpty()); - for (Projection tuple : tuples){ - assertNotNull(tuple.get(employee.firstname)); - assertNotNull(tuple.get(employee.lastname)); - assertNotNull(tuple.getExpr(employee.firstname)); - assertNotNull(tuple.getExpr(employee.lastname)); - } + List tuples = query().from(employee).list(new QProjection(employee.firstname, employee.lastname)); + assertFalse(tuples.isEmpty()); + for (Projection tuple : tuples){ + assertNotNull(tuple.get(employee.firstname)); + assertNotNull(tuple.get(employee.lastname)); + assertNotNull(tuple.getExpr(employee.firstname)); + assertNotNull(tuple.getExpr(employee.lastname)); + } } @SuppressWarnings("unchecked") @Test public void arrayProjection(){ - List results = query().from(employee).list(new EArrayConstructor(String[].class, employee.firstname)); - assertFalse(results.isEmpty()); - for (String[] result : results){ - assertNotNull(result[0]); - } + List results = query().from(employee).list(new EArrayConstructor(String[].class, employee.firstname)); + assertFalse(results.isEmpty()); + for (String[] result : results){ + assertNotNull(result[0]); + } } @Test public void constructorProjection(){ - List projections =query().from(employee).list(EConstructor.create(SimpleProjection.class, employee.firstname, employee.lastname)); - assertFalse(projections.isEmpty()); - for (SimpleProjection projection : projections){ - assertNotNull(projection); - } + List projections =query().from(employee).list(EConstructor.create(SimpleProjection.class, employee.firstname, employee.lastname)); + assertFalse(projections.isEmpty()); + for (SimpleProjection projection : projections){ + assertNotNull(projection); + } } @Test @@ -739,9 +743,21 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ assertEquals(2, query().from(employee).where(first.or(second)).count()); assertEquals(0, query().from(employee).where( - employee.firstname.eq("Mike"), - employee.lastname.eq("Smith").or(employee.firstname.eq("Joe")), - employee.lastname.eq("Divis") + employee.firstname.eq("Mike"), + employee.lastname.eq("Smith").or(employee.firstname.eq("Joe")), + employee.lastname.eq("Divis") ).count()); } + + @Test + @ExcludeIn({DERBY,HSQLDB}) + public void path_alias(){ + expectedQuery = "select e.LASTNAME, sum(e.SALARY) as salarySum from EMPLOYEE2 e group by e.LASTNAME having salarySum > ?"; + + ENumber salarySum = employee.salary.sum().as("salarySum"); + query().from(employee) + .groupBy(employee.lastname) + .having(salarySum.gt(10000)) + .list(employee.lastname, salarySum); + } } diff --git a/querydsl-sql/src/test/java/com/mysema/query/_derby/SelectDerbyQuotedTest.java b/querydsl-sql/src/test/java/com/mysema/query/_derby/SelectDerbyQuotedTest.java index b1bb6a7b7..e2b24a0d3 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/_derby/SelectDerbyQuotedTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/_derby/SelectDerbyQuotedTest.java @@ -9,6 +9,7 @@ import java.sql.SQLException; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Test; import com.mysema.query.Connections; import com.mysema.query.SelectBaseTest; @@ -43,5 +44,20 @@ public class SelectDerbyQuotedTest extends SelectBaseTest { public void subQueries() throws SQLException { } + + @Test + public void wildcardAll() { + + } + + @Test + public void countAll() { + + } + + @Test + public void path_alias(){ + + } } diff --git a/querydsl-sql/src/test/java/com/mysema/query/_h2/SelectH2QuotedTest.java b/querydsl-sql/src/test/java/com/mysema/query/_h2/SelectH2QuotedTest.java index f5161f281..ea7789843 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/_h2/SelectH2QuotedTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/_h2/SelectH2QuotedTest.java @@ -5,15 +5,20 @@ */ package com.mysema.query._h2; +import static com.mysema.query.Constants.employee; + import java.sql.SQLException; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Test; import com.mysema.query.Connections; import com.mysema.query.SelectBaseTest; import com.mysema.query.Target; import com.mysema.query.sql.H2Templates; +import com.mysema.query.sql.Wildcard; +import com.mysema.query.types.path.PNumber; import com.mysema.testutil.Label; @Label(Target.H2) @@ -43,5 +48,20 @@ public class SelectH2QuotedTest extends SelectBaseTest { public void subQueries() throws SQLException { } + + @Test + public void wildcardAll() { + + } + + @Test + public void countAll() { + + } + + @Test + public void path_alias(){ + + } } diff --git a/querydsl-sql/src/test/java/com/mysema/query/_hsqldb/SelectHsqldbQuotedTest.java b/querydsl-sql/src/test/java/com/mysema/query/_hsqldb/SelectHsqldbQuotedTest.java index 1b7b57c14..1a77fdc72 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/_hsqldb/SelectHsqldbQuotedTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/_hsqldb/SelectHsqldbQuotedTest.java @@ -9,6 +9,7 @@ import java.sql.SQLException; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Test; import com.mysema.query.Connections; import com.mysema.query.SelectBaseTest; @@ -43,4 +44,20 @@ public class SelectHsqldbQuotedTest extends SelectBaseTest { public void subQueries() throws SQLException { } + + @Test + public void wildcardAll() { + + } + + @Test + public void countAll() { + + } + + @Test + public void path_alias(){ + + } + } diff --git a/querydsl-sql/src/test/java/com/mysema/query/_mssql/SelectMSSQLQuotedTest.java b/querydsl-sql/src/test/java/com/mysema/query/_mssql/SelectMSSQLQuotedTest.java index 47a58a876..9a63a6805 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/_mssql/SelectMSSQLQuotedTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/_mssql/SelectMSSQLQuotedTest.java @@ -9,6 +9,7 @@ import java.sql.SQLException; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Test; import com.mysema.query.Connections; import com.mysema.query.SelectBaseTest; @@ -45,5 +46,20 @@ public class SelectMSSQLQuotedTest extends SelectBaseTest { public void subQueries() throws SQLException { } + + @Test + public void wildcardAll() { + + } + + @Test + public void countAll() { + + } + + @Test + public void path_alias(){ + + } } diff --git a/querydsl-sql/src/test/java/com/mysema/query/_mysql/SelectMySQLQuotedTest.java b/querydsl-sql/src/test/java/com/mysema/query/_mysql/SelectMySQLQuotedTest.java index 6b230a236..8419d2f8b 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/_mysql/SelectMySQLQuotedTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/_mysql/SelectMySQLQuotedTest.java @@ -9,6 +9,7 @@ import java.sql.SQLException; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Test; import com.mysema.query.Connections; import com.mysema.query.SelectBaseTest; @@ -45,5 +46,20 @@ public class SelectMySQLQuotedTest extends SelectBaseTest{ public void subQueries() throws SQLException { } + + @Test + public void wildcardAll() { + + } + + @Test + public void countAll() { + + } + + @Test + public void path_alias(){ + + } } diff --git a/querydsl-sql/src/test/java/com/mysema/query/_oracle/SelectOracleQuotedTest.java b/querydsl-sql/src/test/java/com/mysema/query/_oracle/SelectOracleQuotedTest.java index 43d8c903a..7121c376b 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/_oracle/SelectOracleQuotedTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/_oracle/SelectOracleQuotedTest.java @@ -9,6 +9,7 @@ import java.sql.SQLException; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Test; import com.mysema.query.Connections; import com.mysema.query.SelectBaseTest; @@ -45,5 +46,19 @@ public class SelectOracleQuotedTest extends SelectBaseTest { public void subQueries() throws SQLException { } + + @Test + public void wildcardAll() { + } + + @Test + public void countAll() { + + } + + @Test + public void path_alias(){ + + } } diff --git a/querydsl-sql/src/test/java/com/mysema/query/_postgres/SelectPostgresQuotedTest.java b/querydsl-sql/src/test/java/com/mysema/query/_postgres/SelectPostgresQuotedTest.java index d49a844b1..a25e3b3f6 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/_postgres/SelectPostgresQuotedTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/_postgres/SelectPostgresQuotedTest.java @@ -9,6 +9,7 @@ import java.sql.SQLException; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Test; import com.mysema.query.Connections; import com.mysema.query.SelectBaseTest; @@ -45,4 +46,19 @@ public class SelectPostgresQuotedTest extends SelectBaseTest { public void subQueries() throws SQLException { } + + @Test + public void wildcardAll() { + + } + + @Test + public void countAll() { + + } + + @Test + public void path_alias(){ + + } }