From 97f25460614e7da5b880f64e64f03fb1cd32d3f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 10 Feb 2009 09:14:12 +0000 Subject: [PATCH] bug #326650 : further improvements to issue --- querydsl-hql/pom.xml | 4 +- .../com/mysema/query/grammar/HqlGrammar.java | 24 ++-- .../java/com/mysema/query/grammar/HqlOps.java | 16 ++- .../mysema/query/grammar/HqlQueryBase.java | 6 + .../mysema/query/grammar/HqlSerializer.java | 23 +++- .../com/mysema/query/grammar/types/Quant.java | 12 +- .../mysema/query/grammar/HqlGrammarTest.java | 32 +++++ .../com/mysema/query/hql/FeaturesTest.java | 23 +++- .../java/com/mysema/query/hql/HqlDomain.java | 6 +- .../mysema/query/hql/HqlIntegrationTest.java | 31 +++-- .../com/mysema/query/hql/HqlParserTest.java | 124 +++++++++++++++--- 11 files changed, 242 insertions(+), 59 deletions(-) create mode 100644 querydsl-hql/src/test/java/com/mysema/query/grammar/HqlGrammarTest.java diff --git a/querydsl-hql/pom.xml b/querydsl-hql/pom.xml index e5fe776e8..520563e0e 100644 --- a/querydsl-hql/pom.xml +++ b/querydsl-hql/pom.xml @@ -80,7 +80,7 @@ - + maven-assembly-plugin @@ -105,7 +105,7 @@ dummy-domain-into-package - generate-test-sources + generate-sources testExecute diff --git a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlGrammar.java b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlGrammar.java index e4c8b4a3f..9c7ba09eb 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlGrammar.java +++ b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlGrammar.java @@ -33,23 +33,23 @@ import com.mysema.query.grammar.types.Quant.QSimple; public class HqlGrammar extends GrammarWithAlias{ public static Expr all(CollectionType col){ - return new QSimple(OpQuant.ALL, col); + return new QSimple(col.getElementType(), OpQuant.ALL, col); } public static > ENumber all(CollectionType col){ - return new QNumber(OpQuant.ALL, col); + return new QNumber(col.getElementType(), OpQuant.ALL, col); } public static ESimple any(CollectionType col){ - return new QSimple(OpQuant.ANY, col); + return new QSimple(col.getElementType(), OpQuant.ANY, col); } public static > ENumber any(CollectionType col){ - return new QNumber(OpQuant.ANY, col); + return new QNumber(col.getElementType(), OpQuant.ANY, col); } - public static > EComparable avg(PCollection left){ - return new QComparable(OpQuant.AVG_IN_COL, left); + public static > EComparable avg(PCollection col){ + return new QComparable(col.getElementType(), OpQuant.AVG_IN_COL, col); } public static EComparable current_date(){ @@ -109,7 +109,7 @@ public class HqlGrammar extends GrammarWithAlias{ } public static > EComparable max(PCollection left){ - return new QComparable(OpQuant.MAX_IN_COL, left); + return new QComparable(left.getElementType(), OpQuant.MAX_IN_COL, left); } public static PEntity maxelement(PEntityCollection col) { @@ -125,7 +125,7 @@ public class HqlGrammar extends GrammarWithAlias{ } public static > EComparable min(PCollection left){ - return new QComparable(OpQuant.MIN_IN_COL, left); + return new QComparable(left.getElementType(), OpQuant.MIN_IN_COL, left); } public static PEntity minelement(PEntityCollection col) { @@ -181,6 +181,14 @@ public class HqlGrammar extends GrammarWithAlias{ return createNumber((Class)type, HqlOps.OpHql.SUM, left); } + public static > ENumber sumAsLong(Expr left){ + return sum(left).longValue(); + } + + public static > ENumber sumAsDouble(Expr left){ + return sum(left).doubleValue(); + } + public static EComparable sysdate(){ return createComparable(Date.class,Ops.OpDateTime.SYSDATE); } diff --git a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlOps.java b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlOps.java index 41584585f..23294c3ce 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlOps.java +++ b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlOps.java @@ -26,9 +26,13 @@ public class HqlOps extends OperationPatterns { static{ wrapCollectionsForOp = Collections.>unmodifiableList(Arrays.>asList( - Ops.IN, Ops.NOTIN, - OpQuant.ALL, OpQuant.ANY, - OpQuant.EXISTS, OpQuant.NOTEXISTS)); + Ops.IN, + Ops.NOTIN, + OpQuant.ALL, + OpQuant.ANY, + OpQuant.AVG_IN_COL, + OpQuant.EXISTS, + OpQuant.NOTEXISTS)); } public HqlOps(){ @@ -96,9 +100,9 @@ public class HqlOps extends OperationPatterns { // HQL types add(HqlPathType.MINELEMENT, "minelement(%s)"); - add(HqlPathType.MAXELEMENT, "max(%s"); - add(HqlPathType.MININDEX, "minelement(%s)"); - add(HqlPathType.MAXINDEX, "minelement(%s)"); + add(HqlPathType.MAXELEMENT, "maxelement(%s"); + add(HqlPathType.MININDEX, "minindex(%s)"); + add(HqlPathType.MAXINDEX, "maxindex(%s)"); add(HqlPathType.LISTINDICES, "indices(%s)"); add(HqlPathType.MAPINDICES, "indices(%s)"); } diff --git a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlQueryBase.java b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlQueryBase.java index 6d2923ddc..9835acd31 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlQueryBase.java +++ b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlQueryBase.java @@ -98,6 +98,12 @@ public abstract class HqlQueryBase> extends QueryBase< joins.add(new JoinExpression(JoinType.INNERJOIN, o, meta)); return (A) this; } + + public A fullJoin(EEntity o) { + // ?!? + joins.add(new JoinExpression(JoinType.INNERJOIN,o)); + return (A) this; + } @SuppressWarnings("unchecked") public A leftJoin(HqlJoinMeta meta, EEntity o) { diff --git a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlSerializer.java b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlSerializer.java index 7ed1bbb96..4bc1c7f7e 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlSerializer.java +++ b/querydsl-hql/src/main/java/com/mysema/query/grammar/HqlSerializer.java @@ -13,6 +13,7 @@ import com.mysema.query.JoinExpression; import com.mysema.query.QueryBase; import com.mysema.query.grammar.Ops.Op; import com.mysema.query.grammar.types.*; +import com.mysema.query.grammar.types.Expr.EConstant; import com.mysema.query.grammar.types.HqlTypes.DistinctPath; import com.mysema.query.grammar.types.Quant.QBoolean; import com.mysema.query.grammar.types.Quant.QComparable; @@ -115,7 +116,12 @@ public class HqlSerializer extends BaseSerializer{ if (expr.getTarget() == null){ append("count(*)"); }else{ - append("count(").handle(expr.getTarget()).append(")"); + append("count("); + boolean old = wrapElements; + wrapElements = true; + handle(expr.getTarget()); + wrapElements = old; + append(")"); } } @@ -179,10 +185,23 @@ public class HqlSerializer extends BaseSerializer{ boolean old = wrapElements; wrapElements = HqlOps.wrapCollectionsForOp.contains(operator); // - super.visitOperation(operator, args); + if (operator.equals(Ops.STRING_CAST)){ + visitCast(operator, args[0], String.class); + }else if (operator.equals(Ops.NUMCAST)){ + visitCast(operator, args[0], (Class) ((EConstant)args[1]).getConstant()); + }else{ + super.visitOperation(operator, args); + } // wrapElements = old; } + + private void visitCast(Op operator, Expr source, Class targetType) { + append("cast(").handle(source); + append(" as "); + append(targetType.getSimpleName().toLowerCase()).append(")"); + + } diff --git a/querydsl-hql/src/main/java/com/mysema/query/grammar/types/Quant.java b/querydsl-hql/src/main/java/com/mysema/query/grammar/types/Quant.java index e80694487..e46594200 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/grammar/types/Quant.java +++ b/querydsl-hql/src/main/java/com/mysema/query/grammar/types/Quant.java @@ -38,8 +38,8 @@ public interface Quant { public static class QComparable> extends Expr.EComparable implements Quant{ private final Expr col; private final Op op; - public QComparable(Op op, CollectionType col) { - super(null); + public QComparable(Class type, Op op, CollectionType col) { + super(type); this.op = op; this.col = (Expr)col; } @@ -50,8 +50,8 @@ public interface Quant { public static class QNumber> extends Expr.ENumber implements Quant{ private final Expr col; private final Op op; - public QNumber(Op op, CollectionType col) { - super(null); + public QNumber(Class type, Op op, CollectionType col) { + super(type); this.op = op; this.col = (Expr)col; } @@ -65,8 +65,8 @@ public interface Quant { public static class QSimple extends Expr.ESimple implements Quant{ private final Expr col; private final Op op; - public QSimple(Op op, CollectionType col) { - super(null); + public QSimple(Class type, Op op, CollectionType col) { + super(type); this.op = op; this.col = (Expr)col; } diff --git a/querydsl-hql/src/test/java/com/mysema/query/grammar/HqlGrammarTest.java b/querydsl-hql/src/test/java/com/mysema/query/grammar/HqlGrammarTest.java new file mode 100644 index 000000000..e0b74ec44 --- /dev/null +++ b/querydsl-hql/src/test/java/com/mysema/query/grammar/HqlGrammarTest.java @@ -0,0 +1,32 @@ +package com.mysema.query.grammar; + +import java.lang.reflect.Method; +import java.util.HashSet; +import java.util.Set; + +import org.junit.Test; + + +/** + * HqlGrammarTest provides + * + * @author tiwe + * @version $Id$ + */ +public class HqlGrammarTest { + + @Test + public void noDuplicates(){ + Set names = new HashSet(); + for (Method method : Grammar.class.getDeclaredMethods()){ + names.add(method.getName()); + } + + for (Method method : HqlGrammar.class.getDeclaredMethods()){ + if (names.contains(method.getName())){ + System.out.println(method.getName() + " already available."); + } + } + } + +} diff --git a/querydsl-hql/src/test/java/com/mysema/query/hql/FeaturesTest.java b/querydsl-hql/src/test/java/com/mysema/query/hql/FeaturesTest.java index 066eb77e5..3a73dad3f 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/hql/FeaturesTest.java +++ b/querydsl-hql/src/test/java/com/mysema/query/hql/FeaturesTest.java @@ -138,7 +138,7 @@ public class FeaturesTest extends HqlQueryBase{ toString("cat.bodyWeight + :a1 < :a1",add(cat.bodyWeight,10).lt(10)); toString("cat.bodyWeight - :a1 < :a1",sub(cat.bodyWeight,10).lt(10)); toString("cat.bodyWeight * :a1 < :a1",mult(cat.bodyWeight,10).lt(10)); - toString("cat.bodyWeight / :a1 < :a1",div(cat.bodyWeight,10).lt(10)); + toString("cat.bodyWeight / :a1 < :a2",div(cat.bodyWeight,10).lt(10d)); toString("(cat.bodyWeight + :a1) * :a2", mult(add(cat.bodyWeight,10),20)); toString("(cat.bodyWeight - :a1) * :a2", mult(sub(cat.bodyWeight,10),20)); @@ -409,13 +409,32 @@ public class FeaturesTest extends HqlQueryBase{ // sum to var - ENumber sum = (ENumber) sum($(0)); + ENumber sum = (ENumber) sum($(0)); // via Java level cast + sum = sum($(0)).longValue(); // sum comparison sum($(0)).gt(0); + sum($(0)).intValue().gt(0); } + + @Test + public void testNumericCast(){ + ENumber expr = $(0); + assertEquals(Byte.class, expr.byteValue().getType()); + assertEquals(Double.class, expr.doubleValue().getType()); + assertEquals(Float.class, expr.floatValue().getType()); + assertEquals(Integer.class, expr.intValue().getType()); + assertEquals(Long.class, expr.longValue().getType()); + assertEquals(Short.class, expr.shortValue().getType()); + } + + @Test + public void testStringCast(){ + ENumber expr = $(0); + assertEquals(String.class, expr.stringValue().getType()); + } private void toString(String expected, Expr expr) { assertEquals(expected, visitor.handle(expr).toString()); diff --git a/querydsl-hql/src/test/java/com/mysema/query/hql/HqlDomain.java b/querydsl-hql/src/test/java/com/mysema/query/hql/HqlDomain.java index a0347a2f9..4571053e8 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/hql/HqlDomain.java +++ b/querydsl-hql/src/test/java/com/mysema/query/hql/HqlDomain.java @@ -257,7 +257,7 @@ public class HqlDomain { public static class Foo { String bar; @Id int id; - @CollectionOfElements List names; + @CollectionOfElements @IndexColumn(name="_index") List names; java.util.Date startDate; } @@ -348,7 +348,7 @@ public class HqlDomain { @Entity public static class Order { @ManyToOne Customer customer; - @CollectionOfElements List deliveredItemIndices; + @CollectionOfElements @IndexColumn(name="_index") List deliveredItemIndices; @Id long id; @OneToMany @IndexColumn(name="_index") List items, lineItems; boolean paid; @@ -386,7 +386,7 @@ public class HqlDomain { public static class Person { java.util.Date birthDay; @Id long i; - @ManyToOne PersonId id; + @ManyToOne PersonId pid; String name; @ManyToOne Nationality nationality; } diff --git a/querydsl-hql/src/test/java/com/mysema/query/hql/HqlIntegrationTest.java b/querydsl-hql/src/test/java/com/mysema/query/hql/HqlIntegrationTest.java index 604eb232c..bd6ebf092 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/hql/HqlIntegrationTest.java +++ b/querydsl-hql/src/test/java/com/mysema/query/hql/HqlIntegrationTest.java @@ -32,17 +32,23 @@ public class HqlIntegrationTest extends HqlParserTest{ @Override protected void parse() throws RecognitionException, TokenStreamException{ - System.out.println("query : " + toString().replace('\n', ' ')); - - // create Query and execute it - Query query = session.createQuery(toString()); - HqlQuery.setConstants(query, getConstants()); try{ - query.list(); - }catch(Exception e){ - e.printStackTrace(); - throw new RuntimeException(e); - } + System.out.println("query : " + toString().replace('\n', ' ')); + + // create Query and execute it + Query query = session.createQuery(toString()); + HqlQuery.setConstants(query, getConstants()); + try{ + query.list(); + }catch(Exception e){ + e.printStackTrace(); + throw new RuntimeException(e); + } + }finally{ + clear(); + System.out.println(); + } + } @Test @@ -54,6 +60,11 @@ public class HqlIntegrationTest extends HqlParserTest{ public void testOrderBy() throws Exception { // NOTE : commented out, because HQLSDB doesn't support these queries } + + @Test + public void testDocoExamples910() throws Exception { + // NOTE : commented out, because HQLSDB doesn't support these queries + } public void setSession(Session session) { this.session = session; diff --git a/querydsl-hql/src/test/java/com/mysema/query/hql/HqlParserTest.java b/querydsl-hql/src/test/java/com/mysema/query/hql/HqlParserTest.java index 9c5c2414e..ae241e546 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/hql/HqlParserTest.java +++ b/querydsl-hql/src/test/java/com/mysema/query/hql/HqlParserTest.java @@ -5,10 +5,14 @@ */ package com.mysema.query.hql; -import static com.mysema.query.grammar.QMath.*; +//import static com.mysema.query.grammar.Grammar.avg; +import static com.mysema.query.grammar.Grammar.count; +import static com.mysema.query.grammar.Grammar.in; +import static com.mysema.query.grammar.Grammar.not; import static com.mysema.query.grammar.GrammarWithAlias.$; import static com.mysema.query.grammar.GrammarWithAlias.alias; import static com.mysema.query.grammar.HqlGrammar.*; +import static com.mysema.query.grammar.QMath.div; import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; @@ -24,6 +28,7 @@ import antlr.collections.AST; import com.mysema.query.grammar.HqlGrammar; import com.mysema.query.grammar.HqlJoinMeta; import com.mysema.query.grammar.QMath; +import com.mysema.query.grammar.types.Expr.ENumber; import com.mysema.query.hql.HqlDomain.*; @@ -37,8 +42,18 @@ import com.mysema.query.hql.HqlDomain.*; public class HqlParserTest extends QueryBaseWithDomain { @Test - public void testSum(){ - from(cat).select(sum(cat.kittens.size())); + public void testSum() throws RecognitionException, TokenStreamException{ + from(cat) + .select(sum(cat.kittens.size())).parse(); + + from(cat) + .where(sum(cat.kittens.size()).gt(0)) + .select(cat).parse(); + +// from(cat) +// .groupBy(cat.name) +// .having(sum(cat.bodyWeight).gt(0)) +// .select(cat).parse(); } /** @@ -48,12 +63,16 @@ public class HqlParserTest extends QueryBaseWithDomain { public void testDocoExamples92() throws Exception { // parse( "from eg.Cat" ); from(cat).parse(); + // parse( "from eg.Cat as cat" ); from(cat).parse(); + // parse( "from eg.Cat cat" ); from(cat).parse(); + // parse( "from Formula, Parameter" ); from(form, param).parse(); + // parse( "from Formula as form, Parameter as param" ); from(form, param).parse(); } @@ -65,12 +84,16 @@ public class HqlParserTest extends QueryBaseWithDomain { public void testDocoExamples93() throws Exception { // parse( "from eg.Cat as cat inner join cat.mate as mate left outer join cat.kittens as kitten" ); from(cat).innerJoin(cat.mate.as(mate)).leftJoin(cat.kittens.as(kitten)).parse(); + // parse( "from eg.Cat as cat left join cat.mate.kittens as kittens" ); from(cat).leftJoin(cat.mate.kittens.as(kittens)).parse(); + // parse( "from Formula form full join form.parameter param" ); from(form).fullJoin(form.parameter.as(param)).parse(); + // parse( "from eg.Cat as cat join cat.mate as mate left join cat.kittens as kitten" ); from(cat).join(cat.mate.as(mate)).leftJoin(cat.kittens.as(kitten)).parse(); + // parse( "from eg.Cat as cat\ninner join fetch cat.mate\nleft join fetch cat.kittens" ); from(cat).innerJoin(cat.mate).leftJoin(HqlJoinMeta.FETCH, cat.kittens).parse(); } @@ -87,15 +110,19 @@ public class HqlParserTest extends QueryBaseWithDomain { // parse( "from eg.Cat as cat inner join cat.mate as mate left outer join cat.kittens as kitten" ); from($(c)).innerJoin($(c.getMate()).as($(m))) .leftJoin($(c.getKittens()).as($(k))).parse(); + // parse( "from eg.Cat as cat left join cat.mate.kittens as kittens" ); from($(c)).leftJoin($(c.getMate().getKittens()).as($(k))).parse(); + // parse( "from Formula form full join form.parameter param" ); from($(f)).fullJoin($(f.getParameter()).as($(p))).parse(); + // parse( "from eg.Cat as cat join cat.mate as mate left join cat.kittens as kitten" ); - from($(f)).innerJoin($(c.getMate()).as($(m))) + from($(c)).innerJoin($(c.getMate()).as($(m))) .leftJoin($(c.getKittens()).as($(k))).parse(); + // parse( "from eg.Cat as cat\ninner join fetch cat.mate\nleft join fetch cat.kittens" ); - from($(f)).innerJoin(HqlJoinMeta.FETCH, $(c.getMate()).as($(m))) + from($(c)).innerJoin(HqlJoinMeta.FETCH, $(c.getMate()).as($(m))) .leftJoin(HqlJoinMeta.FETCH, $(c.getKittens()).as($(k))).parse(); } @@ -106,19 +133,25 @@ public class HqlParserTest extends QueryBaseWithDomain { public void testDocoExamples94() throws Exception { // parse( "select mate from eg.Cat as cat inner join cat.mate as mate" ); select(mate).from(cat).innerJoin(cat.mate.as(mate)).parse(); + // parse( "select cat.mate from eg.Cat cat" ); select(cat.mate).from(cat).parse(); + // parse( "select elements(cat.kittens) from eg.Cat cat" ); select(cat.kittens).from(cat).parse(); + // parse( "select cat.name from eg.DomesticCat cat where cat.name like 'fri%'" ); select(cat.name).from(cat).where(cat.name.like("fri%")).parse(); + // parse( "select cust.name.firstName from Customer as cust" ); select(cust.name.firstName).from(cust).parse(); + // parse( "select mother, offspr, mate.name from eg.DomesticCat\n" // + " as mother inner join mother.mate as mate left outer join\n" // + "mother.kittens as offspr" ); select(mother, offspr, mate.name).from(mother) .innerJoin(mother.mate.as(mate)).leftJoin(mother.kittens.as(offspr)).parse(); + // parse( "select new Family(mother, mate, offspr)\n" // + "from eg.DomesticCat as mother\n" // + "join mother.mate as mate\n" @@ -136,11 +169,16 @@ public class HqlParserTest extends QueryBaseWithDomain { // parse( "select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)\n" // + "from eg.Cat cat" ); select(avg(cat.weight), sum(cat.weight), QMath.max(cat.weight), count(cat)).from(cat).parse(); + // parse( "select cat, count( elements(cat.kittens) )\n" // + " from eg.Cat cat group by cat" ); - select(cat, count(cat.kittens)).from(cat).groupBy(cat).parse(); + // NOTE : groupBy don't work properly in HSQLDB + select(cat, count(cat.kittens)).from(cat).groupBy(cat); + clear(); + // parse( "select distinct cat.name from eg.Cat cat" ); select(distinct(cat.name)).from(cat).parse(); + // parse( "select count(distinct cat.name), count(cat) from eg.Cat cat" ); select(count(distinct(cat.name)), count(cat)).from(cat).parse(); } @@ -157,6 +195,7 @@ public class HqlParserTest extends QueryBaseWithDomain { public void testDocoExamples96() throws Exception { // parse( "from eg.Cat as cat" ); from(cat).parse(); + // parse( "from java.lang.Object o" ); // parse( "from eg.Named n, eg.Named m where n.name = m.name" ); from(m,n).where(n.name.eq(m.name)).parse(); @@ -168,36 +207,46 @@ public class HqlParserTest extends QueryBaseWithDomain { @Test public void testDocoExamples97() throws Exception { // init deep path - account._owner()._id(); + account._owner()._pid(); // parse( "from eg.Cat as cat where cat.name='Fritz'" ); from(cat).where(cat.name.like("Fritz")).parse(); + // parse( "select foo\n" // + "from eg.Foo foo, eg.Bar bar\n" // + "where foo.startDate = bar.date\n" ); select(foo).from(foo, bar).where(foo.startDate.eq(bar.date)).parse(); + // parse( "from eg.Cat cat where cat.mate.name is not null" ); from(cat).where(cat.mate.name.isnotnull()).parse(); + // parse( "from eg.Cat cat, eg.Cat rival where cat.mate = rival.mate" ); from(cat, rival).where(cat.mate.eq(rival.mate)).parse(); + // parse( "select cat, mate\n" // + "from eg.Cat cat, eg.Cat mate\n" // + "where cat.mate = mate" ); select(cat, mate).from(cat, mate).where(cat.mate.eq(mate)).parse(); + // parse( "from eg.Cat as cat where cat.id = 123" ); from(cat).where(cat.id.eq(123)).parse(); + // parse( "from eg.Cat as cat where cat.mate.id = 69" ); from(cat).where(cat.mate.id.eq(69)).parse(); + // parse( "from bank.Person person\n" // + "where person.id.country = 'AU'\n" // + "and person.id.medicareNumber = 123456" ); - from(person).where(person.id.country.eq("AU").and(person.id.medicareNumber.eq(123456))).parse(); + from(person).where(person.pid.country.eq("AU").and(person.pid.medicareNumber.eq(123456))).parse(); + // parse( "from bank.Account account\n" // + "where account.owner.id.country = 'AU'\n" // + "and account.owner.id.medicareNumber = 123456" ); - from(account).where(account.owner.id.medicareNumber.eq(123456)).parse(); + from(account).where(account.owner.pid.medicareNumber.eq(123456)).parse(); + // parse( "from eg.Cat cat where cat.class = eg.DomesticCat" ); from(cat).where(cat.typeOf(DomesticCat.class)).parse(); + // parse( "from eg.AuditLog log, eg.Payment payment\n" // + "where log.item.class = 'eg.Payment' and log.item.id = payment.id" ); from(log, payment).where(log.item.typeOf(Payment.class).and(log.item.id.eq(payment.id))).parse(); @@ -214,16 +263,22 @@ public class HqlParserTest extends QueryBaseWithDomain { // parse( "from eg.DomesticCat cat where cat.name between 'A' and 'B'" ); from(cat).where(cat.name.between("A", "B")).parse(); + // parse( "from eg.DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' )" ); from(cat).where(cat.name.in("Foo","Bar","Baz")).parse(); + // parse( "from eg.DomesticCat cat where cat.name not between 'A' and 'B'" ); from(cat).where(cat.name.notBetween("A", "B")).parse(); + // parse( "from eg.DomesticCat cat where cat.name not in ( 'Foo', 'Bar', 'Baz' )" ); from(cat).where(cat.name.notIn("Foo","Bar","Baz")).parse(); + // parse( "from eg.Cat cat where cat.kittens.size > 0" ); from(cat).where(cat.kittens.size().gt(0)).parse(); + // parse( "from eg.Cat cat where size(cat.kittens) > 0" ); from(cat).where(cat.kittens.size().gt(0)).parse(); + // parse( "from Order ord where maxindex(ord.items) > 100" ); from(ord).where(maxindex(ord.items).gt(100)).parse(); @@ -233,27 +288,34 @@ public class HqlParserTest extends QueryBaseWithDomain { // parse( "select mother from eg.Cat as mother, eg.Cat as kit\n" // + "where kit in elements(foo.kittens)" ); select(mother).from(mother, kit).where(kit.in(mother.kittens)).parse(); + // parse( "select p from eg.NameList list, eg.Person p\n" // + "where p.name = some elements(list.names)" ); select(p).from(list,p).where(p.name.eq(some(list.names))).parse(); + // parse( "from eg.Cat cat where exists elements(cat.kittens)" ); from(cat).where(exists(cat.kittens)).parse(); + // parse( "from eg.Player p where 3 > all elements(p.scores)" ); from(player).where(all(player.scores).lt(3)).parse(); + // parse( "from eg.Show show where 'fizard' in indices(show.acts)" ); from(show).where(in("fizard",indices(show.acts))).parse(); // parse( "from Order ord where ord.items[0].id = 1234" ); from(ord).where(ord.items(0).id.eq(1234l)).parse(); + // parse( "select person from Person person, Calendar calendar\n" // + "where calendar.holidays['national day'] = person.birthDay\n" // + "and person.nationality.calendar = calendar" ); select(person).from(person, calendar) .where(calendar.holidays("national holiday").eq(person.birthDay) .and(person.nationality.calendar.eq(calendar))).parse(); + // parse( "select item from Item item, Order ord\n" // + "where ord.items[ ord.deliveredItemIndices[0] ] = item and ord.id = 11" ); select(item).from(item, ord).where(ord.items(ord.deliveredItemIndices(0)).eq(item).and(ord.id.eq(1l))).parse(); + // parse( "select item from Item item, Order ord\n" // + "where ord.items[ maxindex(ord.items) ] = item and ord.id = 11" ); select(item).from(item, ord).where(ord.items(maxindex(ord.items)).eq(item).and(ord.id.eq(1l))).parse(); @@ -294,14 +356,18 @@ public class HqlParserTest extends QueryBaseWithDomain { // parse( "select cat.color, sum(cat.weight), count(cat)\n" // + "from eg.Cat cat group by cat.color" ); select(cat.color, sum(cat.weight), count(cat)).from(cat).groupBy(cat.color).parse(); + // parse( "select foo.id, avg( elements(foo.names) ), max( indices(foo.names) )\n" // + "from eg.Foo foo group by foo.id" ); - select(foo.id, avg(foo.names), max(indices(foo.names))).from(foo).groupBy(foo.id); + + select(foo.id, avg(foo.names), max(indices(foo.names))).from(foo).groupBy(foo.id).parse(); + // parse( "select cat.color, sum(cat.weight), count(cat)\n" // + "from eg.Cat cat group by cat.color\n" // + "having cat.color in (eg.Color.TABBY, eg.Color.BLACK)" ); select(cat.color, sum(cat.weight), count(cat)).from(cat).groupBy(cat.color) .having(cat.color.in(Color.TABBY, Color.BLACK)).parse(); + // parse( "select cat from eg.Cat cat join cat.kittens kitten\n" // + "group by cat having avg(kitten.weight) > 100\n" // + "order by count(kitten) asc, sum(kitten.weight) desc" ); @@ -316,13 +382,16 @@ public class HqlParserTest extends QueryBaseWithDomain { // + "select avg(cat.weight) from eg.DomesticCat cat)" ); from(fatcat).where(fatcat.weight.gt( HqlGrammar.select(avg(cat.weight)).from(cat))).parse(); + // parse( "from eg.DomesticCat as cat where cat.name = some (\n" // + "select name.nickName from eg.Name as name)\n" ); from(cat).where(cat.name.eq(some( HqlGrammar.select(name.nickName).from(name)))).parse(); + // parse( "from eg.Cat as cat where not exists (\n" // + "from eg.Cat as mate where mate.mate = cat)" ); from(cat).where(notExists(HqlGrammar.from(mate).where(mate.mate.eq(cat)))).parse(); + // parse( "from eg.DomesticCat as cat where cat.name not in (\n" // + "select name.nickName from eg.Name as name)" ); from(cat).where(cat.name.notIn(HqlGrammar.select(name.nickName).from(name))).parse(); @@ -484,7 +553,8 @@ public class HqlParserTest extends QueryBaseWithDomain { // parse( "FROM eg.mypackage.Cat qat where qat.name not in ('crater','bean','fluffy')" ); from(qat).where(qat.name.notIn("crater","bean","fluffy")).parse(); // parse( "from Animal an where sqrt(an.bodyWeight)/2 > 10" ); - from(an).where(div(QMath.sqrt(an.bodyWeight),2).gt(10.0)).parse(); + from(an).where(QMath.sqrt(an.bodyWeight).gt(10.0)).parse(); + from(an).where(div(QMath.sqrt(an.bodyWeight),2d).gt(10.0)).parse(); // parse( "from Animal an where (an.bodyWeight > 10 and an.bodyWeight < 100) or an.bodyWeight is null" ); from(an).where(an.bodyWeight.gt(10).and(an.bodyWeight.lt(100).or(an.bodyWeight.isnull()))).parse(); } @@ -622,21 +692,35 @@ public class HqlParserTest extends QueryBaseWithDomain { // parse("select distinct user.party from com.itf.iceclaims.domain.party.user.UserImpl user inner join user.party.$RelatedWorkgroups relatedWorkgroups where relatedWorkgroups.workgroup.id = :workgroup and relatedWorkgroups.effectiveTime.start <= :datesnow and relatedWorkgroups.effectiveTime.end > :dateenow "); } - + @Test + public void testCasts() throws Exception { + ENumber bw = cat.bodyWeight; + from(cat).select( + bw.byteValue(), + bw.doubleValue(), + bw.floatValue(), + bw.intValue(), + bw.longValue(), + bw.shortValue(), + bw.stringValue()).parse(); + + from(cat).select(bw.castToNum(Byte.class)).parse(); + } protected void parse() throws RecognitionException, TokenStreamException{ - String input = toString(); - System.out.println( "input: " + input.replace('\n', ' ')); - HqlParser parser = HqlParser.getInstance( input ); - parser.setFilter( false ); - parser.statement(); - AST ast = parser.getAST(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - parser.showAst( ast, new PrintStream( baos ) ); try{ + String input = toString(); + System.out.println( "input: " + input.replace('\n', ' ')); + HqlParser parser = HqlParser.getInstance( input ); + parser.setFilter( false ); + parser.statement(); + AST ast = parser.getAST(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + parser.showAst( ast, new PrintStream( baos ) ); assertEquals( "At least one error occurred during parsing " + input, 0, parser.getParseErrorHandler().getErrorCount() ); }finally{ clear(); + System.out.println(); } }