Skip to content

Commit 416f36f

Browse files
committed
Implemented select and has
1 parent c101c93 commit 416f36f

File tree

6 files changed

+46
-23
lines changed

6 files changed

+46
-23
lines changed

src/main/java/org/javawebstack/orm/query/Query.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,7 @@
1010
import java.sql.SQLException;
1111
import java.sql.Timestamp;
1212
import java.time.Instant;
13-
import java.util.ArrayList;
14-
import java.util.HashMap;
15-
import java.util.List;
16-
import java.util.Map;
13+
import java.util.*;
1714
import java.util.function.Consumer;
1815
import java.util.function.Function;
1916
import java.util.stream.Stream;
@@ -22,12 +19,12 @@ public class Query<T extends Model> {
2219

2320
private final Repo<T> repo;
2421
private final Class<T> model;
22+
private List<String> select = new ArrayList<>();
2523
private final QueryGroup<T> where;
2624
private Integer offset;
2725
private Integer limit;
2826
private QueryOrderBy order;
2927
private boolean withDeleted = false;
30-
private final List<QueryWith> withs = new ArrayList<>();
3128
private final List<QueryColumn> groupBy = new ArrayList<>();
3229
private QueryGroup<T> having;
3330

@@ -50,8 +47,8 @@ public QueryGroup<T> getWhereGroup() {
5047
return where;
5148
}
5249

53-
public List<QueryWith> getWiths() {
54-
return withs;
50+
public List<String> getSelect() {
51+
return select;
5552
}
5653

5754
public List<QueryColumn> getGroupBy() {
@@ -82,12 +79,8 @@ public Class<T> getModel() {
8279
return model;
8380
}
8481

85-
public Query<T> with(String extra) {
86-
return with(extra, null);
87-
}
88-
89-
public Query<T> with(String extra, String as) {
90-
withs.add(new QueryWith(extra, as));
82+
public Query<T> select(String... columns) {
83+
this.select = Arrays.asList(columns);
9184
return this;
9285
}
9386

@@ -305,6 +298,15 @@ public Query<T> having(Consumer<QueryGroup<T>> consumer) {
305298
return this;
306299
}
307300

301+
public Query<T> has(Query<?> relation, String operator, int count) {
302+
where.has(relation, operator, count);
303+
return this;
304+
}
305+
306+
public Query<T> has(Query<?> relation) {
307+
return has(relation, ">=", 1);
308+
}
309+
308310
public Query<T> accessible(Object accessor) {
309311
return repo.accessible(this, accessor);
310312
}
@@ -416,7 +418,7 @@ public void restore() {
416418
}
417419

418420
public T refresh(T entity) {
419-
SQLQueryString qs = repo.getConnection().builder().buildQuery(this, false);
421+
SQLQueryString qs = repo.getConnection().builder().buildQuery(this);
420422
try {
421423
ResultSet rs = repo.getConnection().read(qs.getQuery(), qs.getParameters().toArray());
422424
SQLMapper.mapBack(repo, rs, entity);
@@ -441,7 +443,7 @@ public void update(Map<String, Object> values) {
441443
}
442444

443445
public List<T> all() {
444-
SQLQueryString qs = repo.getConnection().builder().buildQuery(this, false);
446+
SQLQueryString qs = repo.getConnection().builder().buildQuery(this);
445447
try {
446448
ResultSet rs = repo.getConnection().read(qs.getQuery(), qs.getParameters().toArray());
447449
List<T> list = SQLMapper.map(repo, rs, new ArrayList<>());
@@ -468,7 +470,7 @@ public Stream<T> stream() {
468470
}
469471

470472
public int count() {
471-
SQLQueryString qs = repo.getConnection().builder().buildQuery(this, true);
473+
SQLQueryString qs = repo.getConnection().builder().buildQuery(this.select("count(*)"));
472474
try {
473475
ResultSet rs = repo.getConnection().read(qs.getQuery(), qs.getParameters().toArray());
474476
int c = 0;

src/main/java/org/javawebstack/orm/query/QueryGroup.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.ArrayList;
99
import java.util.Arrays;
1010
import java.util.List;
11+
import java.util.function.Consumer;
1112
import java.util.function.Function;
1213

1314
/**
@@ -197,6 +198,14 @@ public <M extends Model> QueryGroup<T> orWhereNotExists(Class<M> model, Function
197198
return this;
198199
}
199200

201+
public QueryGroup<T> has(Query<?> relation, String operator, int count) {
202+
return where(relation.select("count(*)"), operator, count);
203+
}
204+
205+
public QueryGroup<T> has(Query<?> relation) {
206+
return has(relation, ">=", 1);
207+
}
208+
200209
public QueryGroup<T> whereIn(Object left, Object... values) {
201210
return where(left, "IN", values);
202211
}

src/main/java/org/javawebstack/orm/wrapper/builder/MySQLQueryStringBuilder.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,15 @@ public SQLQueryString buildInsert(TableInfo info, Map<String, Object> values) {
3434
return new SQLQueryString(sb.toString(), params);
3535
}
3636

37-
public SQLQueryString buildQuery(Query<?> query, boolean count) {
37+
public SQLQueryString buildQuery(Query<?> query) {
3838
Repo<?> repo = query.getRepo();
3939
List<Object> parameters = new ArrayList<>();
40-
StringBuilder sb = new StringBuilder("SELECT ")
41-
.append(count ? "COUNT(*)" : "*")
40+
StringBuilder sb = new StringBuilder("SELECT ");
41+
if(query.getSelect().size() == 0)
42+
sb.append("*");
43+
else
44+
sb.append(String.join(",", query.getSelect()));
45+
sb
4246
.append(" FROM `")
4347
.append(repo.getInfo().getTableName())
4448
.append('`');
@@ -138,7 +142,7 @@ private SQLQueryString convertElement(TableInfo info, QueryElement element) {
138142
return new SQLQueryString(((QueryConjunction) element).name());
139143
if(element instanceof QueryExists) {
140144
QueryExists<?> queryExists = (QueryExists<?>) element;
141-
SQLQueryString qs = buildQuery(queryExists.getQuery(), false);
145+
SQLQueryString qs = buildQuery(queryExists.getQuery());
142146
return new SQLQueryString((queryExists.isNot() ? "NOT " : "") + "EXISTS (" + qs.getQuery() + ")", qs.getParameters());
143147
}
144148
if(element instanceof QueryGroup)
@@ -167,6 +171,10 @@ private SQLQueryString convertCondition(TableInfo info, QueryCondition condition
167171
List<Object> parameters = new ArrayList<>();
168172
if (condition.getLeft() instanceof QueryColumn) {
169173
sb.append(((QueryColumn) condition.getLeft()).toString(info));
174+
} else if(condition.getLeft() instanceof Query) {
175+
SQLQueryString qs = buildQuery((Query<?>) condition.getLeft());
176+
sb.append("(").append(qs.getQuery()).append(")");
177+
parameters.addAll(qs.getParameters());
170178
} else {
171179
sb.append('?');
172180
parameters.add(condition.getLeft());
@@ -181,6 +189,10 @@ private SQLQueryString convertCondition(TableInfo info, QueryCondition condition
181189
parameters.addAll(Arrays.asList(values));
182190
} else if (condition.getRight() instanceof QueryColumn) {
183191
sb.append(((QueryColumn) condition.getRight()).toString(info));
192+
} else if(condition.getRight() instanceof Query) {
193+
SQLQueryString qs = buildQuery((Query<?>) condition.getRight());
194+
sb.append("(").append(qs.getQuery()).append(")");
195+
parameters.addAll(qs.getParameters());
184196
} else {
185197
sb.append('?');
186198
parameters.add(condition.getRight());

src/main/java/org/javawebstack/orm/wrapper/builder/QueryStringBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
public interface QueryStringBuilder {
99

1010
SQLQueryString buildInsert(TableInfo info, Map<String, Object> values);
11-
SQLQueryString buildQuery(Query<?> query, boolean count);
11+
SQLQueryString buildQuery(Query<?> query);
1212
SQLQueryString buildUpdate(Query<?> query, Map<String, Object> values);
1313
SQLQueryString buildDelete(Query<?> query);
1414

src/test/java/org/javawebstack/orm/test/querybuilding/FromClauseTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,6 @@ void testOverwrittenTableName() throws ORMConfigurationException {
6868
*/
6969
private String getBaseQuery(Class<? extends Model> clazz) throws ORMConfigurationException {
7070
ORM.register(clazz, sql());
71-
return Repo.get(clazz).getConnection().builder().buildQuery(Repo.get(clazz).query(), false).getQuery();
71+
return Repo.get(clazz).getConnection().builder().buildQuery(Repo.get(clazz).query()).getQuery();
7272
}
7373
}

src/test/java/org/javawebstack/orm/test/shared/verification/QueryVerification.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public String getSection(String topLevelKeyword, int sectionIndex) throws Sectio
145145
* @return The order sensitive string list of inner sections.
146146
*/
147147
public List<String> getSectionList(String topLevelKeyword) {
148-
return new QueryStringUtil(this.query.getRepo().getConnection().builder().buildQuery(this.query, false).getQuery())
148+
return new QueryStringUtil(this.query.getRepo().getConnection().builder().buildQuery(this.query).getQuery())
149149
.getTopLevelSectionsByKeyword(topLevelKeyword);
150150
}
151151

0 commit comments

Comments
 (0)