diff --git a/querydsl-core/src/main/java/com/mysema/query/CascadingBoolean.java b/querydsl-core/src/main/java/com/mysema/query/CascadingBoolean.java index bd9f892f6..231bd5d8c 100644 --- a/querydsl-core/src/main/java/com/mysema/query/CascadingBoolean.java +++ b/querydsl-core/src/main/java/com/mysema/query/CascadingBoolean.java @@ -1,3 +1,8 @@ +/* + * Copyright (c) 2008 Mysema Ltd. + * All rights reserved. + * + */ package com.mysema.query; import com.mysema.query.grammar.Grammar; diff --git a/querydsl-core/src/main/java/com/mysema/query/JoinExpression.java b/querydsl-core/src/main/java/com/mysema/query/JoinExpression.java index 7a65ac202..5fefa8003 100644 --- a/querydsl-core/src/main/java/com/mysema/query/JoinExpression.java +++ b/querydsl-core/src/main/java/com/mysema/query/JoinExpression.java @@ -5,11 +5,11 @@ */ package com.mysema.query; -import com.mysema.query.grammar.Types.ExprBoolean; +import com.mysema.query.grammar.Types.Expr; import com.mysema.query.grammar.Types.ExprEntity; public class JoinExpression { - private ExprBoolean[] conditions; + private Expr[] conditions; private final ExprEntity target; private final JoinType type; @@ -18,11 +18,11 @@ public class JoinExpression { this.target = target; } - public ExprBoolean[] getConditions() { + public Expr[] getConditions() { return conditions; } - public void setConditions(ExprBoolean[] conditions) { + public void setConditions(Expr[] conditions) { this.conditions = conditions; } diff --git a/querydsl-core/src/main/java/com/mysema/query/QueryBase.java b/querydsl-core/src/main/java/com/mysema/query/QueryBase.java index 8fbbb4a28..3a6f11f5c 100644 --- a/querydsl-core/src/main/java/com/mysema/query/QueryBase.java +++ b/querydsl-core/src/main/java/com/mysema/query/QueryBase.java @@ -37,6 +37,9 @@ public class QueryBase> implements Query { select.clear(); where.clear(); } + + private final Metadata metadata = new Metadata(); + public A from(ExprEntity... o) { for (ExprEntity expr : o){ joins.add(new JoinExpression(JoinType.DEFAULT,expr)); @@ -95,6 +98,30 @@ public class QueryBase> implements Query { } return (A) this; } - + public Metadata getMetadata(){ + return metadata; + } + + public class Metadata{ + public List> getGroupBy() { + return groupBy; + } + public List getHaving() { + return having; + } + public List getJoins() { + return joins; + } + public List> getOrderBy() { + return orderBy; + } + public List> getSelect() { + return select; + } + public List getWhere() { + return where; + } + } + } 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 7cbf1f0dc..d576b79f8 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 @@ -187,29 +187,25 @@ public class Grammar { static > ExprBoolean gt(Expr left, A right) { return _boolean(OpComparable.GT, left, _const(right)); } - + static > ExprBoolean gt(Expr left, Expr right) { return _boolean(OpComparable.GT, left, right); } - - static ExprBoolean in(A left, ExprEntity> right){ - return _boolean(Op.INELEMENTS, _const(left), right); - } - + static > ExprBoolean in(Expr left, A... rest) { - return _boolean(Op.INARRAY, left, _const(rest)); + return _boolean(Op.IN, left, _const(rest)); } - static ExprBoolean in(ExprEntity left, ExprEntity> right){ - return _boolean(Op.INELEMENTS, left, right); + static ExprBoolean in(Expr left, CollectionType right){ + return _boolean(Op.IN, left, (Expr)right); } - + static ExprBoolean isnotnull(Expr left) { return _boolean(Op.ISNOTNULL, left); } - + static ExprBoolean isnull(Expr left) { return _boolean(Op.ISNULL, left); } @@ -244,7 +240,7 @@ public class Grammar { public static > ExprComparable max(Expr left){ return _number(OpNumber.MAX, left); } - + public static > ExprComparable min(Expr left){ return _number(OpNumber.MIN, left); } @@ -252,23 +248,23 @@ public class Grammar { public static > ExprComparable mult(Expr left, A right) { return _number(OpNumber.MULT, left, _const(right)); } - + public static > ExprComparable mult(Expr left, Expr right) { return _number(OpNumber.MULT, left, right); } - + static ExprBoolean ne(Expr left, B right) { return _boolean(Op.NE, left, _const(right)); } static ExprBoolean ne(Expr left, Expr right) { return _boolean(Op.NE, left, right); - } + } public static ExprBoolean not(ExprBoolean left) { return _boolean(OpBoolean.NOT, left); } - + static > ExprBoolean notBetween(Expr left, A start, A end) { return _boolean(OpComparable.NOTBETWEEN, left, _const(start), _const(end)); @@ -278,20 +274,20 @@ public class Grammar { Expr start, Expr end) { return _boolean(OpComparable.NOTBETWEEN, left, start, end); } - + static > ExprBoolean notIn(Expr left, A... rest) { - return _boolean(Op.NOTINARRAY, left, _const(rest)); + return _boolean(Op.NOTIN, left, _const(rest)); } + static ExprBoolean notIn(Expr left, CollectionType right){ + return _boolean(Op.NOTIN, left, (Expr)right); + } + static ExprBoolean or(ExprBoolean left, ExprBoolean right) { return _boolean(OpBoolean.OR, left, right); } - - public static SubQuery select(Expr select){ - return new SubQuery(select); - } - + static ExprComparable size(Expr> col){ return _number(Op.SIZE, col); } 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 02dd755c0..924ef65fa 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 @@ -18,15 +18,13 @@ public class Ops { */ public interface Op { Op EQ = new OpImpl(); - Op INARRAY = new OpImpl(); - Op INELEMENTS = new OpImpl(); + Op IN = new OpImpl(); Op ISNOTNULL = new OpImpl(); Op ISNULL = new OpImpl(); Op ISTYPEOF = new OpImpl(); Op NE = new OpImpl(); - Op NOTINARRAY = new OpImpl(); + Op NOTIN = new OpImpl(); Op SIZE = new OpImpl(); - Op MAPGET = new OpImpl(); } /** diff --git a/querydsl-core/src/main/java/com/mysema/query/grammar/PathMetadata.java b/querydsl-core/src/main/java/com/mysema/query/grammar/PathMetadata.java index 49c553ee8..07b086d87 100644 --- a/querydsl-core/src/main/java/com/mysema/query/grammar/PathMetadata.java +++ b/querydsl-core/src/main/java/com/mysema/query/grammar/PathMetadata.java @@ -5,61 +5,90 @@ */ package com.mysema.query.grammar; -import static com.mysema.query.grammar.Grammar.*; +import static com.mysema.query.grammar.Grammar._const; + import com.mysema.query.grammar.Types.Expr; import com.mysema.query.grammar.Types.Path; +import com.mysema.query.grammar.Types.PathCollection; +import com.mysema.query.grammar.Types.PathMap; /** * * PathMetadata provides - * + * * @author tiwe * @version $Id$ - * + * */ -public final class PathMetadata{ +public final class PathMetadata { private final Expr expression; + private final Path parent; - private final Type type; - - private PathMetadata(Path parent, Expr expression, Type type){ + + private final Type type; + + private PathMetadata(Path parent, Expr expression, Type type) { this.parent = parent; this.expression = expression; this.type = type; } - - public static PathMetadata forListAccess(Path parent, Expr index){ - return new PathMetadata(parent,index,Type.LISTACCESS); + + public static PathMetadata forListAccess(PathCollection parent, + Expr index) { + return new PathMetadata(parent, index, Type.LISTACCESS); + } + + public static PathMetadata forListAccess(PathCollection parent, + int index) { + return new PathMetadata(parent, _const(index), + Type.LISTACCESSC); + } + + public static PathMetadata forMinElement(PathCollection parent) { + return new PathMetadata(parent, null, Type.MINELEMENT); } - public static PathMetadata forListAccess(Path parent, int index){ - return new PathMetadata(parent,_const(index),Type.LISTACCESSC); + public static PathMetadata forSize(PathCollection parent) { + return new PathMetadata(parent, null, Type.SIZE); } - - public static PathMetadata forMapAccess(Path parent, Expr key){ - return new PathMetadata(parent,key,Type.MAPACCESS); + + public static PathMetadata forMaxElement(PathCollection parent) { + return new PathMetadata(parent, null, Type.MAXELEMENT); } - - public static PathMetadata forMapAccess(Path parent, KT key){ - return new PathMetadata(parent,_const(key),Type.MAPACCESSC); + + public static PathMetadata forMapAccess(PathMap parent, + Expr key) { + return new PathMetadata(parent, key, Type.MAPACCESS); } - - public static PathMetadata forProperty(Path parent, String property){ - return new PathMetadata(parent,_const(property),Type.PROPERTY); + + public static PathMetadata forMapAccess(PathMap parent, + KT key) { + return new PathMetadata(parent, _const(key), Type.MAPACCESSC); } - - public static PathMetadata forVariable(String variable){ - return new PathMetadata(null,_const(variable),Type.VARIABLE); + + public static PathMetadata forProperty(Path parent, + String property) { + return new PathMetadata(parent, _const(property), Type.PROPERTY); } - - public Expr getExpression() {return expression;} - - public Path getParent(){ return parent; } - - public Type getType() {return type;} - - public enum Type{ - LISTACCESS,LISTACCESSC,MAPACCESS,MAPACCESSC,PROPERTY,VARIABLE - } - + + public static PathMetadata forVariable(String variable) { + return new PathMetadata(null, _const(variable), Type.VARIABLE); + } + + public Expr getExpression() { + return expression; + } + + public Path getParent() { + return parent; + } + + public Type getType() { + return type; + } + + public enum Type { + LISTACCESS, LISTACCESSC, MAPACCESS, MAPACCESSC, PROPERTY, VARIABLE, MINELEMENT, MAXELEMENT, SIZE + } + } diff --git a/querydsl-core/src/main/java/com/mysema/query/grammar/Types.java b/querydsl-core/src/main/java/com/mysema/query/grammar/Types.java index 9d0e51663..c550ec8b5 100644 --- a/querydsl-core/src/main/java/com/mysema/query/grammar/Types.java +++ b/querydsl-core/src/main/java/com/mysema/query/grammar/Types.java @@ -6,12 +6,11 @@ package com.mysema.query.grammar; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; import static com.mysema.query.grammar.PathMetadata.*; +import java.util.Collection; +import java.util.Map; + import com.mysema.query.grammar.Ops.Op; /** @@ -50,7 +49,7 @@ public class Types { private final Expr from; private final String to; AliasNoEntity(Expr from, String to) { - super(from.type); + super(from.getType()); this.from = from; this.to = to; } @@ -87,7 +86,7 @@ public class Types { Expr(Class type){this.type = type;} public ExprBoolean eq(B right){return Grammar.eq(this, right);} public ExprBoolean eq(Expr right){return Grammar.eq(this, right);} - protected Class getType(){ return type;} + public Class getType(){ return type;} public ExprBoolean ne(B right){return Grammar.ne(this, right);} public ExprBoolean ne(Expr right){return Grammar.ne(this, right);} } @@ -113,6 +112,7 @@ public class Types { public ExprBoolean gt(D right) {return Grammar.gt(this,right);} public ExprBoolean gt(Expr right) {return Grammar.gt(this,right);} public ExprBoolean in(D... args) {return Grammar.in(this,args);} + public ExprBoolean in(CollectionType arg) {return Grammar.in(this, arg);} public ExprBoolean loe(D right) {return Grammar.loe(this,right);} public ExprBoolean loe(Expr right) {return Grammar.loe(this,right);} public ExprBoolean lt(D right) {return Grammar.lt(this,right);} @@ -120,8 +120,17 @@ public class Types { public ExprBoolean notBetween(D first, D second) {return Grammar.notBetween(this, first, second);} public ExprBoolean notBetween(Expr first, Expr second) {return Grammar.notBetween(this,first,second);} public ExprBoolean notIn(D...args) {return Grammar.notIn(this, args);} + public ExprBoolean notIn(CollectionType arg) {return Grammar.notIn(this, arg);} } +// *, +// /, +// DIV, +// %, +// MOD +// -, +// + + public static abstract class ExprEntity extends Expr{ ExprEntity(Class type) {super(type);} } @@ -204,6 +213,18 @@ public class Types { public ExprBoolean isnull() {return Grammar.isnull(this);} } + public interface CollectionType{ + + } + + public interface PathCollection extends Path>, CollectionType{ + Expr get(Expr index); + Expr get(int index); + Expr maxelement(); + Expr minelement(); + ExprComparable size(); + } + public static class PathComparable> extends ExprComparable implements PathNoEntity{ private final PathMetadata metadata; public PathComparable(Class type, PathMetadata metadata) { @@ -215,7 +236,7 @@ public class Types { public ExprBoolean isnull() {return Grammar.isnull(this);} } - public static class PathComponentCollection extends ExprNoEntity> implements Path>{ + public static class PathComponentCollection extends ExprNoEntity> implements PathCollection{ private final PathMetadata metadata; private final Class type; PathComponentCollection(Class type, PathMetadata metadata) { @@ -223,15 +244,25 @@ public class Types { this.type = type; this.metadata = metadata; } + public ExprNoEntity get(Expr index) { + return new PathNoEntitySimple(type, forListAccess(this, index)); + } public ExprNoEntity get(int index) { - return new PathNoEntitySimple(type, forListAccess(this, index));} + return new PathNoEntitySimple(type, forListAccess(this, index)); + } public PathMetadata getMetadata() {return metadata;} public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} public ExprBoolean isnull() {return Grammar.isnull(this);} + public ExprEntity maxelement() { + return new PathEntity(type, forMaxElement(this)); + } + public ExprEntity minelement() { + return new PathEntity(type, forMinElement(this)); + } public ExprComparable size() { return Grammar.size(this);} } - public static class PathComponentMap extends ExprNoEntity> implements Path>{ + public static class PathComponentMap extends ExprNoEntity> implements PathMap{ private final PathMetadata metadata; private final Class type; PathComponentMap(Class type, PathMetadata metadata) { @@ -242,6 +273,9 @@ public class Types { public ExprNoEntity get(Expr key) { return new PathNoEntitySimple(type, forMapAccess(this, key)); } + public ExprNoEntity get(K key) { + return new PathNoEntitySimple(type, forMapAccess(this, key)); + } public PathMetadata getMetadata() {return metadata;} public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} public ExprBoolean isnull() {return Grammar.isnull(this);} @@ -282,13 +316,13 @@ public class Types { return new PathString(forProperty(this, path)); } public PathMetadata getMetadata() {return metadata;} - public ExprBoolean in(ExprEntity> right){return Grammar.in(this, right);} + public ExprBoolean in(CollectionType right){return Grammar.in(this, right);} public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} public ExprBoolean isnull() {return Grammar.isnull(this);} public ExprBoolean typeOf(Class type) {return Grammar.typeOf(this, type);} } - public static class PathEntityCollection extends ExprEntity> implements Path>{ + public static class PathEntityCollection extends ExprEntity> implements PathCollection{ private final PathMetadata metadata; private final Class type; PathEntityCollection(Class type, PathMetadata metadata) { @@ -297,15 +331,25 @@ public class Types { this.metadata = metadata; } public AliasEntityCollection as(PathEntity to) {return Grammar.as(this, to);} + public ExprEntity get(Expr index) { + return new PathEntity(type, forListAccess(this,index)); + } public ExprEntity get(int index) { - return new PathEntity(type, forListAccess(this,index));} + return new PathEntity(type, forListAccess(this,index)); + } public PathMetadata getMetadata() {return metadata;} public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} public ExprBoolean isnull() {return Grammar.isnull(this);} - public ExprComparable size() { return Grammar.size(this);} + public ExprEntity maxelement() { + return new PathEntity(type, forMaxElement(this)); + } + public ExprEntity minelement() { + return new PathEntity(type, forMinElement(this)); + } + public ExprComparable size() { return Grammar.size(this); } } - public static class PathEntityMap extends ExprEntity> implements Path>{ + public static class PathEntityMap extends ExprEntity> implements PathMap{ private final PathMetadata metadata; private final Class type; PathEntityMap(Class type, PathMetadata metadata) { @@ -313,9 +357,15 @@ public class Types { this.type = type; this.metadata = metadata; } - public PathMetadata getMetadata() {return metadata;} + public ExprEntity get(Expr key) { + return new PathEntity(type, forMapAccess(this, key)); + } + public ExprEntity get(K key) { + return new PathEntity(type, forMapAccess(this, key)); + } + public PathMetadata getMetadata() {return metadata;} public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} - public ExprBoolean isnull() {return Grammar.isnull(this);} + public ExprBoolean isnull() {return Grammar.isnull(this);} } public static class PathEntityRenamable extends PathEntity{ @@ -323,6 +373,11 @@ public class Types { public AliasEntity as(PathEntity to) {return Grammar.as(this, to);} } + public interface PathMap extends Path>{ + Expr get(Expr key); + Expr get(K key); + } + public interface PathNoEntity extends Path{ Expr as(String to); } @@ -347,20 +402,5 @@ public class Types { public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} public ExprBoolean isnull() {return Grammar.isnull(this);} } - - public static class SubQuery extends Expr>{ - private List> from; - private final Expr select; - private List where; - SubQuery(Expr select) { - super(null); - this.select = select; - } - List> _from() {return from;} - Expr _select() {return select;} - List _where() {return where;} - public SubQuery from(ExprEntity... o){this.from = Arrays.asList(o); return this;} - public SubQuery where(ExprBoolean... o){this.where = Arrays.asList(o); return this;} - } - + } diff --git a/querydsl-core/src/main/java/com/mysema/query/grammar/Visitor.java b/querydsl-core/src/main/java/com/mysema/query/grammar/Visitor.java index fa8f64c4d..8b99e790e 100644 --- a/querydsl-core/src/main/java/com/mysema/query/grammar/Visitor.java +++ b/querydsl-core/src/main/java/com/mysema/query/grammar/Visitor.java @@ -106,6 +106,4 @@ public abstract class Visitor> { protected abstract void visit(PathString expr); - protected abstract void visit(SubQuery subQuery); - } diff --git a/querydsl-core/src/main/java/com/mysema/query/grammar/VisitorAdapter.java b/querydsl-core/src/main/java/com/mysema/query/grammar/VisitorAdapter.java index 7bcebdd3e..671dbed40 100644 --- a/querydsl-core/src/main/java/com/mysema/query/grammar/VisitorAdapter.java +++ b/querydsl-core/src/main/java/com/mysema/query/grammar/VisitorAdapter.java @@ -18,11 +18,11 @@ public abstract class VisitorAdapter> extends Visitor { @Override - protected void visit(AliasEntityCollection expr) { + protected void visit(AliasEntity expr) { visit((AliasToPath) expr); } @Override - protected void visit(AliasEntity expr) { + protected void visit(AliasEntityCollection expr) { visit((AliasToPath) expr); } @Override @@ -49,36 +49,38 @@ public abstract class VisitorAdapter> extends protected void visit(PathBoolean expr) { visit((Path) expr); } + protected void visit(PathCollection expr){ + visit((Path) expr); + } @Override protected void visit(PathComparable expr) { visit((Path) expr); } @Override protected void visit(PathComponentCollection expr) { - visit((Path) expr); - } - @Override - protected void visit(PathComponentMap expr) { - visit((Path) expr); + visit((PathCollection) expr); } @Override - protected void visit(PathString expr) { - visit((Path) expr); + protected void visit(PathComponentMap expr) { + visit((PathMap) expr); } @Override protected void visit(PathEntity expr) { visit((Path) expr); } @Override - protected void visit(PathEntityRenamable expr) { - visit((PathEntity) expr); - } - @Override protected void visit(PathEntityCollection expr) { - visit((Path) expr); + visit((PathCollection) expr); } @Override protected void visit(PathEntityMap expr) { + visit((PathMap) expr); + } + @Override + protected void visit(PathEntityRenamable expr) { + visit((PathEntity) expr); + } + protected void visit(PathMap expr){ visit((Path) expr); } @Override @@ -89,4 +91,8 @@ public abstract class VisitorAdapter> extends protected void visit(PathNoEntitySimple expr) { visit((Path) expr); } + @Override + protected void visit(PathString expr) { + visit((Path) expr); + } }