1
14 package com.querydsl.core.support;
15
16 import java.util.Arrays;
17 import java.util.Collection;
18
19 import com.querydsl.core.QueryMetadata;
20 import com.querydsl.core.types.*;
21 import com.querydsl.core.types.dsl.BooleanExpression;
22 import com.querydsl.core.types.dsl.BooleanOperation;
23 import com.querydsl.core.types.dsl.Expressions;
24
25
31 public abstract class FetchableSubQueryBase<T, Q extends FetchableSubQueryBase<T, Q>> extends FetchableQueryBase<T, Q>
32 implements ExtendedSubQuery<T> {
33
34
35 private final SubQueryExpression<T> mixin;
36
37 @SuppressWarnings("unchecked")
38 public FetchableSubQueryBase(QueryMixin<Q> queryMixin) {
39 super(queryMixin);
40 mixin = new SubQueryExpressionImpl<T>((Class) Object.class, queryMixin.getMetadata());
41 }
42
43 @Override
44 public BooleanExpression contains(Expression<? extends T> right) {
45 return Expressions.predicate(Ops.IN, right, this);
46 }
47
48 @Override
49 public BooleanExpression contains(T constant) {
50 return contains(Expressions.constant(constant));
51 }
52
53 @Override
54 public BooleanExpression exists() {
55 QueryMetadata metadata = getMetadata();
56 if (metadata.getProjection() == null) {
57 queryMixin.setProjection(Expressions.ONE);
58 }
59 return Expressions.predicate(Ops.EXISTS, this);
60 }
61
62 @Override
63 public BooleanExpression eq(Expression<? extends T> expr) {
64 return Expressions.predicate(Ops.EQ, this, expr);
65 }
66
67 @Override
68 public BooleanExpression eq(T constant) {
69 return eq(Expressions.constant(constant));
70 }
71
72 @Override
73 public BooleanExpression ne(Expression<? extends T> expr) {
74 return Expressions.predicate(Ops.NE, this, expr);
75 }
76
77 @Override
78 public BooleanExpression ne(T constant) {
79 return ne(Expressions.constant(constant));
80 }
81
82
83 @Override
84 public BooleanExpression notExists() {
85 return exists().not();
86 }
87
88 @Override
89 public BooleanExpression lt(Expression<? extends T> expr) {
90 return Expressions.predicate(Ops.LT, this, expr);
91 }
92
93 @Override
94 public BooleanExpression lt(T constant) {
95 return lt(Expressions.constant(constant));
96 }
97
98 @Override
99 public BooleanExpression gt(Expression<? extends T> expr) {
100 return Expressions.predicate(Ops.GT, this, expr);
101 }
102
103 @Override
104 public BooleanExpression gt(T constant) {
105 return gt(Expressions.constant(constant));
106 }
107
108 @Override
109 public BooleanExpression loe(Expression<? extends T> expr) {
110 return Expressions.predicate(Ops.LOE, this, expr);
111 }
112
113 @Override
114 public BooleanExpression loe(T constant) {
115 return loe(Expressions.constant(constant));
116 }
117
118 @Override
119 public BooleanExpression goe(Expression<? extends T> expr) {
120 return Expressions.predicate(Ops.GOE, this, expr);
121 }
122
123 @Override
124 public BooleanExpression goe(T constant) {
125 return goe(Expressions.constant(constant));
126 }
127
128 @Override
129 public BooleanOperation isNull() {
130 return Expressions.booleanOperation(Ops.IS_NULL, mixin);
131 }
132
133 @Override
134 public BooleanOperation isNotNull() {
135 return Expressions.booleanOperation(Ops.IS_NOT_NULL, mixin);
136 }
137
138 @Override
139 public final int hashCode() {
140 return mixin.hashCode();
141 }
142
143 @Override
144 public final QueryMetadata getMetadata() {
145 return queryMixin.getMetadata();
146 }
147
148 @Override
149 public <R, C> R accept(Visitor<R, C> v, C context) {
150 return mixin.accept(v, context);
151 }
152
153 @SuppressWarnings("unchecked")
154 @Override
155 public Class<T> getType() {
156 Expression<?> projection = queryMixin.getMetadata().getProjection();
157 return (Class) (projection != null ? projection.getType() : Void.class);
158 }
159
160 @Override
161 public BooleanExpression in(Collection<? extends T> right) {
162 if (right.size() == 1) {
163 return eq(right.iterator().next());
164 } else {
165 return Expressions.booleanOperation(Ops.IN, mixin, ConstantImpl.create(right));
166 }
167 }
168
169 @Override
170 public BooleanExpression in(T... right) {
171 return this.in(Arrays.asList(right));
172 }
173 }
174