diff --git a/querydsl-core/src/main/java/com/mysema/query/JoinExpression.java b/querydsl-core/src/main/java/com/mysema/query/JoinExpression.java new file mode 100644 index 000000000..3a8f3a71e --- /dev/null +++ b/querydsl-core/src/main/java/com/mysema/query/JoinExpression.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2008 Mysema Ltd. + * All rights reserved. + * + */ +package com.mysema.query; + +import com.mysema.query.grammar.Types.ExprBoolean; +import com.mysema.query.grammar.Types.ExprEntity; + +public class JoinExpression { + public ExprBoolean[] conditions; + public final ExprEntity target; + public final JoinType type; + JoinExpression(JoinType type, ExprEntity target) { + this.type = type; + this.target = target; + } +} \ No newline at end of file diff --git a/querydsl-core/src/main/java/com/mysema/query/JoinType.java b/querydsl-core/src/main/java/com/mysema/query/JoinType.java new file mode 100644 index 000000000..5c7f5491f --- /dev/null +++ b/querydsl-core/src/main/java/com/mysema/query/JoinType.java @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2008 Mysema Ltd. + * All rights reserved. + * + */ +package com.mysema.query; + +public enum JoinType { + DEFAULT, IJ, J, LJ +} \ No newline at end of file diff --git a/querydsl-core/src/main/java/com/mysema/query/Query.java b/querydsl-core/src/main/java/com/mysema/query/Query.java index b2b842402..2d80cb8d4 100644 --- a/querydsl-core/src/main/java/com/mysema/query/Query.java +++ b/querydsl-core/src/main/java/com/mysema/query/Query.java @@ -8,7 +8,7 @@ package com.mysema.query; import com.mysema.query.grammar.Types.ExprBoolean; import com.mysema.query.grammar.Types.ExprEntity; import com.mysema.query.grammar.Types.Expr; -import com.mysema.query.grammar.Types.OrderSpecifier; +import com.mysema.query.grammar.OrderSpecifier; /** * Query provides a the query interface of the fluent query DSL 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 2db8af24b..99a032936 100644 --- a/querydsl-core/src/main/java/com/mysema/query/QueryBase.java +++ b/querydsl-core/src/main/java/com/mysema/query/QueryBase.java @@ -12,7 +12,7 @@ import java.util.List; import com.mysema.query.grammar.Types.Expr; import com.mysema.query.grammar.Types.ExprBoolean; import com.mysema.query.grammar.Types.ExprEntity; -import com.mysema.query.grammar.Types.OrderSpecifier; +import com.mysema.query.grammar.OrderSpecifier; /** * QueryBase provides a basic implementation of the Query interface * @@ -53,17 +53,18 @@ public class QueryBase> implements Query { having.addAll(Arrays.asList(o)); return (A) this; } - @Deprecated + + @Deprecated public A innerJoin(ExprEntity o) { joins.add(new JoinExpression(JoinType.IJ,o)); return (A) this; } - @Deprecated + @Deprecated public A join(ExprEntity o) { joins.add(new JoinExpression(JoinType.J,o)); return (A) this; } - @Deprecated + @Deprecated public A leftJoin(ExprEntity o) { joins.add(new JoinExpression(JoinType.LJ,o)); return (A) this; @@ -83,27 +84,12 @@ public class QueryBase> implements Query { where.addAll(Arrays.asList(o)); return (A) this; } - - @Deprecated + @Deprecated public A with(ExprBoolean... o) { if (!joins.isEmpty()){ joins.get(joins.size()-1).conditions = o; } return (A) this; } - - public static class JoinExpression{ - public ExprBoolean[] conditions; - public final ExprEntity target; - public final JoinType type; - JoinExpression(JoinType type, ExprEntity target){ - this.type = type; - this.target = target; - } - } - - public enum JoinType{ - DEFAULT,IJ,J,LJ - } } 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 470d35f03..73c5e4725 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 @@ -107,10 +107,10 @@ public class Grammar { return new AliasEntity(from, to); } - static AliasCollection as(PathEntityCollection from, PathEntity to) { + static AliasEntityCollection as(PathEntityCollection from, PathEntity to) { _check("from",from); _check("to",to); - return new AliasCollection(from, to); + return new AliasEntityCollection(from, to); } static > OrderSpecifier asc(Expr target) { @@ -141,10 +141,14 @@ public class Grammar { return _boolean(OpComparable.BETWEEN, left, start, end); } - public static ExprNoEntity concat(Expr left, Expr right) { + static ExprString concat(Expr left, Expr right) { return _string(OpString.CONCAT, left, right); } + static ExprString concat(Expr left, String right) { + return _string(OpString.CONCAT, left, _const(right)); + } + static > OrderSpecifier desc( Expr target) { return _orderDesc(target); @@ -166,21 +170,21 @@ public class Grammar { return _boolean(Op.EQ, left, right); } - public static > ExprBoolean goe(Expr left, + static > ExprBoolean goe(Expr left, A right) { return _boolean(OpComparable.GOE, left, _const(right)); } - public static > ExprBoolean goe(Expr left, + static > ExprBoolean goe(Expr left, Expr right) { return _boolean(OpComparable.GOE, left, right); } - public static > ExprBoolean gt(Expr left, A right) { + static > ExprBoolean gt(Expr left, A right) { return _boolean(OpComparable.GT, left, _const(right)); } - public static > ExprBoolean gt(Expr left, + static > ExprBoolean gt(Expr left, Expr right) { return _boolean(OpComparable.GT, left, right); } @@ -256,7 +260,11 @@ public class Grammar { static ExprBoolean or(ExprBoolean left, ExprBoolean right) { return _boolean(OpBoolean.OR, left, right); } - + + public static SubQuery select(Expr select){ + return new SubQuery(select); + } + public static > ExprComparable sub(Expr left, A right) { return _number(OpNumber.SUB, left, _const(right)); } diff --git a/querydsl-core/src/main/java/com/mysema/query/grammar/Order.java b/querydsl-core/src/main/java/com/mysema/query/grammar/Order.java new file mode 100644 index 000000000..e07ca50c0 --- /dev/null +++ b/querydsl-core/src/main/java/com/mysema/query/grammar/Order.java @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2008 Mysema Ltd. + * All rights reserved. + * + */ +package com.mysema.query.grammar; + +public enum Order { + ASC, DESC +} \ No newline at end of file diff --git a/querydsl-core/src/main/java/com/mysema/query/grammar/OrderSpecifier.java b/querydsl-core/src/main/java/com/mysema/query/grammar/OrderSpecifier.java new file mode 100644 index 000000000..8dbf0ac75 --- /dev/null +++ b/querydsl-core/src/main/java/com/mysema/query/grammar/OrderSpecifier.java @@ -0,0 +1,11 @@ +/* + * Copyright (c) 2008 Mysema Ltd. + * All rights reserved. + * + */ +package com.mysema.query.grammar; + +public class OrderSpecifier> { + public Order order; + public Types.Expr target; +} \ No newline at end of file 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 bd58a75ab..c70a21b94 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 @@ -5,7 +5,9 @@ */ package com.mysema.query.grammar; +import java.util.Arrays; import java.util.Collection; +import java.util.List; import com.mysema.query.grammar.Ops.Op; @@ -23,10 +25,10 @@ public class Types { String getTo(); } - public static class AliasCollection extends ExprEntity implements Alias{ + public static class AliasEntityCollection extends ExprEntity implements Alias{ private final Expr from; private final String to; - AliasCollection(PathEntityCollection from, Path to) { + AliasEntityCollection(PathEntityCollection from, Path to) { super(null); this.from = from; this.to = to.toString(); @@ -39,12 +41,12 @@ public class Types { private final Expr from; private final String to; AliasEntity(PathEntity from, PathEntity to) { - super(from._type()); + super(from.getType()); this.from = from; this.to = to.toString(); } AliasEntity(PathEntity from, String to) { - super(from._type()); + super(from.getType()); this.from = from; this.to = to; } @@ -80,11 +82,11 @@ public class Types { public static abstract class Expr{ private final Class type; Expr(Class type){this.type = type;} - public ExprBoolean eq(B right){return Grammar.eq(this, right);} + protected Class getType(){ return type;} + public ExprBoolean eq(B right){return Grammar.eq(this, right);} public ExprBoolean eq(Expr right){return Grammar.eq(this, right);} public ExprBoolean ne(B right){return Grammar.ne(this, right);} public ExprBoolean ne(Expr right){return Grammar.ne(this, right);} - protected Class _type(){ return type;} } public static abstract class ExprBoolean extends ExprNoEntity{ @@ -125,6 +127,8 @@ public class Types { public static abstract class ExprString extends ExprComparable{ ExprString() {super(String.class);} + public ExprString concat(Expr str) {return Grammar.concat(this, str);} + public ExprString concat(String str) {return Grammar.concat(this, str);} public ExprBoolean like(String str) { return Grammar.like(this, str); } public ExprString lower() { return Grammar.lower(this); } public ExprString substring(int beginIndex) { return Grammar.substring(this, beginIndex);} @@ -178,74 +182,97 @@ public class Types { public Op getOperator() {return op;} } - public enum Order{ ASC,DESC } - - public static class OrderSpecifier>{ - public Order order; - public Expr target; + public static final class PathMetadata{ + private final Path parent; + private final String localName; + private final String path; + PathMetadata(Path parent, String localName){ + this.parent = parent; + this.path = parent.getMetadata().path + "." + localName; + this.localName = localName; + } + PathMetadata(String localName) { + this.parent = null; + this.path = localName; + this.localName = localName; + } + public Path parent(){ return parent; } + public String localName(){ return localName; } + public String path(){ return path;} + public String toString(){ return path; } } - + public interface Path{ - Path _parent(); + PathMetadata getMetadata(); ExprBoolean isnotnull(); ExprBoolean isnull(); } public static class PathBoolean extends ExprBoolean implements PathNoEntity{ - private final Path parent; - private final String path; - PathBoolean(Path parent,String path) { - this.parent = parent; - this.path = parent.toString()+"."+path; + private final PathMetadata metadata; + PathBoolean(Path parent,String localName) { + metadata = new PathMetadata(parent, localName); } - public Path _parent() {return parent;} public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} public ExprBoolean isnull() {return Grammar.isnull(this);} - public String toString(){ return path;} + public String toString(){ return metadata.path;} + public PathMetadata getMetadata() {return metadata;} } public static class PathComparable> extends ExprComparable implements PathNoEntity{ - private final Path parent; - private final String path; - public PathComparable(Class type, Path parent, String path) { + private final PathMetadata metadata; + public PathComparable(Class type, Path parent, String localName) { super(type); - this.parent = parent; - this.path = parent.toString()+"."+path; + metadata = new PathMetadata(parent, localName); } - public Path _parent() {return parent;} public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} public ExprBoolean isnull() {return Grammar.isnull(this);} - public String toString() {return path;} + public String toString() {return metadata.path;} + public PathMetadata getMetadata() {return metadata;} + } + + public static class PathComponentCollection extends ExprNoEntity> implements Path>{ + private final PathMetadata metadata; + private final Class type; + PathComponentCollection(Class type, Path parent, String localName) { + super(null); + this.type = type; + metadata = new PathMetadata(parent, localName); + } + public ExprNoEntity get(int index) {return new PathNoEntitySimple(type, metadata.parent, metadata.localName + "["+index+"]");} + public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} + public ExprBoolean isnull() {return Grammar.isnull(this);} + public String toString() {return metadata.path;} + public PathMetadata getMetadata() {return metadata;} } public static class PathEntity extends ExprEntity implements Path{ - private final Path parent; - private final String path; - protected PathEntity(Class type, String path) { + private final PathMetadata metadata; + protected PathEntity(Class type, Path parent, String localName) { super(type); - this.parent = null; - this.path = path; + metadata = new PathMetadata(parent, localName); } - protected PathEntity(Class type, Path parent, String path) { + protected PathEntity(Class type, String localName) { super(type); - this.parent = parent; - this.path = parent.toString()+"."+path; + metadata = new PathMetadata(localName); } protected PathBoolean _boolean(String path){ return new PathBoolean(this, path); } - protected PathEntityCollection _collection(String path,Class type) { - return new PathEntityCollection(type, this, path); - } protected > PathComparable _comparable(String path,Class type) { return new PathComparable(type, this, path); } protected PathEntityRenamable _entity(String path, Class type){ return new PathEntityRenamable(type, this, path); + } + protected PathEntityCollection _entitycol(String path,Class type) { + return new PathEntityCollection(type, this, path); } - public Path _parent() {return parent;} protected PathNoEntitySimple _simple(String path, Class type){ return new PathNoEntitySimple(type, this, path); + } + protected PathComponentCollection _simplecol(String path,Class type) { + return new PathComponentCollection(type, this, path); } protected PathString _string(String path){ return new PathString(this, path); @@ -253,28 +280,25 @@ public class Types { public ExprBoolean in(ExprEntity> right){return Grammar.in(this, right);} public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} public ExprBoolean isnull() {return Grammar.isnull(this);} - public String toString() {return path;} + public String toString() {return metadata.path;} public ExprBoolean typeOf(Class type) {return Grammar.typeOf(this, type);} + public PathMetadata getMetadata() {return metadata;} } public static class PathEntityCollection extends ExprEntity> implements Path>{ - private final Path parent; - private final String property, path; + private final PathMetadata metadata; private final Class type; - PathEntityCollection(Class type, Path parent, String path) { + PathEntityCollection(Class type, Path parent, String localName) { super(null); this.type = type; - this.parent = parent; - this.property = path; - this.path = parent.toString()+"."+path; + metadata = new PathMetadata(parent, localName); } - public Path _parent() {return parent;} - public AliasCollection as(PathEntity to) {return Grammar.as(this, to);} - public ExprEntity get(int index) {return new PathEntity(type, _parent(), property + "["+index+"]");} + public AliasEntityCollection as(PathEntity to) {return Grammar.as(this, to);} + public ExprEntity get(int index) {return new PathEntity(type, metadata.parent, metadata.localName + "["+index+"]");} public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} public ExprBoolean isnull() {return Grammar.isnull(this);} - public String toString() {return path;} - + public String toString() {return metadata.path;} + public PathMetadata getMetadata() {return metadata;} } public static class PathEntityRenamable extends PathEntity{ @@ -287,30 +311,41 @@ public class Types { } public static class PathNoEntitySimple extends ExprNoEntity implements PathNoEntity{ - private final Path parent; - private final String path; - public PathNoEntitySimple(Class type, Path parent, String path) { + private final PathMetadata metadata; + public PathNoEntitySimple(Class type, Path parent, String localName) { super(type); - this.parent = parent; - this.path = parent.toString()+"."+path; + metadata = new PathMetadata(parent, localName); } - public Path _parent() {return parent;} public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} public ExprBoolean isnull() {return Grammar.isnull(this);} - public String toString() {return path;} + public String toString() {return metadata.path;} + public PathMetadata getMetadata() {return metadata;} } public static class PathString extends ExprString implements PathNoEntity{ - private final Path parent; - private final String path; - public PathString(Path parent, String path) { - this.parent = parent; - this.path = parent.toString()+"."+path; + private final PathMetadata metadata; + public PathString(Path parent, String localName) { + metadata = new PathMetadata(parent, localName); } - public Path _parent() {return parent;} public ExprBoolean isnotnull() {return Grammar.isnotnull(this);} public ExprBoolean isnull() {return Grammar.isnull(this);} - public String toString() {return path;} + public String toString() {return metadata.path;} + public PathMetadata getMetadata() {return metadata;} + } + + 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 1d35da259..2ceb1afec 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 @@ -62,7 +62,7 @@ public abstract class Visitor> { protected abstract void visit(Alias expr); - protected abstract void visit(AliasCollection expr); + protected abstract void visit(AliasEntityCollection expr); protected abstract void visit(AliasEntity expr); @@ -85,6 +85,8 @@ public abstract class Visitor> { protected abstract void visit(PathBoolean expr); protected abstract void visit(PathComparable expr); + + protected abstract void visit(PathComponentCollection expr); protected abstract void visit(PathEntity expr); @@ -97,5 +99,7 @@ public abstract class Visitor> { protected abstract void visit(PathNoEntitySimple expr); 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 a3bc7b107..c7d5db5f9 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,7 +18,7 @@ public abstract class VisitorAdapter> extends Visitor { @Override - protected void visit(AliasCollection expr) { + protected void visit(AliasEntityCollection expr) { visit((Alias) expr); } @Override @@ -52,6 +52,10 @@ public abstract class VisitorAdapter> extends @Override protected void visit(PathComparable expr) { visit((Path) expr); + } + @Override + protected void visit(PathComponentCollection expr) { + visit((Path) expr); } @Override protected void visit(PathString expr) {