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) {