Skip to content

Commit a63f495

Browse files
committed
Merge remote-tracking branch 'origin/dev' into dev
2 parents 4ea3b03 + abe4f8b commit a63f495

File tree

4 files changed

+48
-9
lines changed

4 files changed

+48
-9
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package org.javawebstack.orm;
22

33
import org.javawebstack.orm.query.Query;
4+
import org.javawebstack.orm.query.QueryGroup;
45

56
public interface Accessible {
6-
<T extends Model> Query<T> access(Query<T> query, Object accessor);
7+
<T extends Model> QueryGroup<T> access(Query<T> query, QueryGroup<T> accessChecks, Object accessor);
78
}

src/main/java/org/javawebstack/orm/Repo.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@ public Query<T> whereId(Object right) {
7171
}
7272

7373
public Query<T> accessible(Object accessor) {
74-
return accessible(query(), accessor);
74+
return query().accessible(accessor);
7575
}
7676

77-
public Query<T> accessible(Query<T> query, Object accessor) {
78-
return accessible == null ? query : accessible.access(query, accessor);
77+
public Accessible getAccessible() {
78+
return accessible;
7979
}
8080

8181
public void save(T entry) {

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public class Query<T extends Model> {
3030
private boolean withDeleted = false;
3131
private final List<QueryColumn> groupBy = new ArrayList<>();
3232
private QueryGroup<T> having;
33+
private boolean applyAccessible = false;
34+
private Object accessor;
3335

3436
public Query(Class<T> model) {
3537
this(Repo.get(model), model);
@@ -53,6 +55,14 @@ public boolean isWithDeleted() {
5355
return withDeleted;
5456
}
5557

58+
public boolean shouldApplyAccessible() {
59+
return applyAccessible;
60+
}
61+
62+
public Object getAccessor() {
63+
return accessor;
64+
}
65+
5666
public QueryGroup<T> getWhereGroup() {
5767
return where;
5868
}
@@ -318,7 +328,9 @@ public Query<T> has(Query<?> relation) {
318328
}
319329

320330
public Query<T> accessible(Object accessor) {
321-
return repo.accessible(this, accessor);
331+
this.applyAccessible = true;
332+
this.accessor = accessor;
333+
return this;
322334
}
323335

324336
public Query<T> filter(Map<String, String> filter) {

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

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package org.javawebstack.orm.wrapper.builder;
22

3-
import org.javawebstack.orm.Repo;
4-
import org.javawebstack.orm.SQLMapper;
5-
import org.javawebstack.orm.TableInfo;
3+
import org.javawebstack.orm.*;
4+
import org.javawebstack.orm.exception.ORMQueryException;
65
import org.javawebstack.orm.query.*;
76

7+
import java.lang.reflect.Field;
8+
import java.lang.reflect.InvocationTargetException;
9+
import java.lang.reflect.Method;
810
import java.sql.Timestamp;
911
import java.time.Instant;
1012
import java.util.ArrayList;
@@ -18,6 +20,16 @@ public class MySQLQueryStringBuilder implements QueryStringBuilder {
1820

1921
public static final MySQLQueryStringBuilder INSTANCE = new MySQLQueryStringBuilder();
2022

23+
private static Method accessibleAccessMethod;
24+
25+
static {
26+
try {
27+
accessibleAccessMethod = Accessible.class.getDeclaredMethod("access", Query.class, QueryGroup.class, Object.class);
28+
} catch (NoSuchMethodException e) {
29+
e.printStackTrace();
30+
}
31+
}
32+
2133
public SQLQueryString buildInsert(TableInfo info, Map<String, Object> values) {
2234
List<Object> params = new ArrayList<>();
2335
StringBuilder sb = new StringBuilder("INSERT INTO `");
@@ -49,8 +61,22 @@ public SQLQueryString buildQuery(Query<?> query) {
4961
.append(" FROM `")
5062
.append(repo.getInfo().getTableName())
5163
.append('`');
52-
QueryGroup<?> where = query.getWhereGroup();
64+
QueryGroup<Model> where = (QueryGroup<Model>) query.getWhereGroup();
5365
checkWithDeleted(repo, query.isWithDeleted(), where);
66+
if(query.shouldApplyAccessible()) {
67+
QueryGroup<Model> accessChecks;
68+
try {
69+
accessChecks = (QueryGroup<Model>) accessibleAccessMethod.invoke(repo.getAccessible(), query, new QueryGroup<>(), query.getAccessor());
70+
} catch (IllegalAccessException | InvocationTargetException e) {
71+
throw new ORMQueryException(e);
72+
}
73+
QueryGroup<Model> actualWhere = where;
74+
where = new QueryGroup<>();
75+
if(!actualWhere.getQueryElements().isEmpty())
76+
where.and(q -> actualWhere);
77+
if(!accessChecks.getQueryElements().isEmpty())
78+
where.and(q -> accessChecks);
79+
}
5480
if (!where.getQueryElements().isEmpty()) {
5581
SQLQueryString qs = convertGroup(repo.getInfo(), where);
5682
sb.append(" WHERE ").append(qs.getQuery());

0 commit comments

Comments
 (0)