Skip to content

Commit 162e988

Browse files
committed
Tried to implement left joins, hope this doesn't break anything
1 parent 2e419d5 commit 162e988

File tree

7 files changed

+81
-13
lines changed

7 files changed

+81
-13
lines changed

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

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import java.lang.reflect.Field;
77
import java.lang.reflect.InvocationTargetException;
88
import java.lang.reflect.Method;
9+
import java.util.HashMap;
910
import java.util.List;
11+
import java.util.Map;
1012
import java.util.stream.Collectors;
1113

1214
public class Model {
@@ -29,14 +31,27 @@ public class Model {
2931
}
3032
}
3133

32-
private boolean entryExists = false;
34+
private boolean internalEntryExists = false;
35+
private final Map<Class<? extends Model>, Object> internalJoinedModels = new HashMap<>();
36+
37+
void internalAddJoinedModel(Class<? extends Model> type, Object entity){
38+
internalJoinedModels.put(type, entity);
39+
}
40+
41+
public <T extends Model> T getJoined(Class<T> model){
42+
return (T) internalJoinedModels.get(model);
43+
}
44+
45+
public boolean hasJoined(Class<? extends Model> model){
46+
return internalJoinedModels.containsKey(model);
47+
}
3348

3449
boolean doesEntryExist(){
35-
return entryExists;
50+
return internalEntryExists;
3651
}
3752

3853
void setEntryExists(boolean exists){
39-
this.entryExists = exists;
54+
this.internalEntryExists = exists;
4055
}
4156

4257
public void save(){

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

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,16 @@ public static <T extends Model> Map<String, Object> map(Repo<T> repo, T entity){
2121
return values;
2222
}
2323

24-
public static <T extends Model> List<T> map(Repo<T> repo, ResultSet rs){
24+
public static <T extends Model> List<T> map(Repo<T> repo, ResultSet rs, List<Class<? extends Model>> joinedModels){
2525
List<T> list = new ArrayList<>();
2626
try {
2727
while (rs.next()){
2828
T t = (T) repo.getInfo().getModelConstructor().newInstance();
29+
for(Class<? extends Model> model : joinedModels){
30+
Repo<Model> r = Repo.get((Class<Model>) model);
31+
Model o = (Model) r.getInfo().getModelConstructor().newInstance();
32+
t.internalAddJoinedModel(model, mapBack(r, rs, o));
33+
}
2934
list.add(mapBack(repo, rs, t));
3035
}
3136
}catch (SQLException | InstantiationException | IllegalAccessException | InvocationTargetException ex){
@@ -36,8 +41,9 @@ public static <T extends Model> List<T> map(Repo<T> repo, ResultSet rs){
3641

3742
public static <T extends Model> T mapBack(Repo<T> repo, ResultSet rs, T t){
3843
t.setEntryExists(true);
39-
for(String fieldName : repo.getInfo().getFields())
40-
setValue(repo, fieldName, t, getValue(rs, repo.getInfo().getType(fieldName).getJavaType(), repo.getInfo().getColumnName(fieldName)));
44+
for(String fieldName : repo.getInfo().getFields()){
45+
setValue(repo, fieldName, t, getValue(rs, repo.getInfo().getType(fieldName).getJavaType(), repo.getInfo().getTableName(), repo.getInfo().getColumnName(fieldName)));
46+
}
4147
return t;
4248
}
4349

@@ -59,8 +65,18 @@ private static <T extends Model> Object getValue(Repo<T> repo, String fieldName,
5965
}
6066
}
6167

62-
private static Object getValue(ResultSet rs, Class<?> sqlType, String columnName) {
68+
private static Object getValue(ResultSet rs, Class<?> sqlType, String tableName, String columnName) {
6369
try {
70+
try {
71+
rs.findColumn(columnName);
72+
}catch (SQLException ex){
73+
columnName = tableName + "." + columnName;
74+
}
75+
try {
76+
rs.findColumn(columnName);
77+
}catch (SQLException ex){
78+
return null;
79+
}
6480
if(sqlType.equals(String.class))
6581
return rs.getString(columnName);
6682
if(sqlType.equals(Integer.class))

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ public Field getField(String fieldName){
143143
}
144144

145145
public String getColumnName(String fieldName){
146+
String[] spl = fieldName.split("\\.");
147+
fieldName = spl[spl.length-1];
146148
if(fieldToColumn.containsKey(fieldName))
147149
return fieldToColumn.get(fieldName);
148150
return fieldName;

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class Query<T extends Model> {
2626
private String order;
2727
private boolean desc = false;
2828
private boolean withDeleted = false;
29+
private final Map<Class<? extends Model>, QueryCondition> leftJoins = new HashMap<>();
2930

3031
public Query(Class<T> model){
3132
this(Repo.get(model), model);
@@ -41,6 +42,11 @@ public Class<T> getModel() {
4142
return model;
4243
}
4344

45+
public Query<T> leftJoin(Class<? extends Model> model, String self, String other){
46+
leftJoins.put(model, new QueryCondition(new QueryColumn(repo.getInfo().getTableName()+"."+self), "=", new QueryColumn(Repo.get(model).getInfo().getTableName()+"."+other)));
47+
return this;
48+
}
49+
4450
public Query<T> and(Consumer<QueryGroup<T>> group){
4551
where.and(group);
4652
return this;
@@ -161,6 +167,12 @@ public QueryString getQueryString(boolean count) {
161167
.append(" FROM `")
162168
.append(repo.getInfo().getTableName())
163169
.append('`');
170+
for(Class<? extends Model> type : leftJoins.keySet()){
171+
sb.append(" LEFT JOIN `")
172+
.append(Repo.get(type).getInfo().getTableName())
173+
.append("` ON ")
174+
.append(leftJoins.get(type).getQueryString(repo.getInfo()).getQuery());
175+
}
164176
considerSoftDelete();
165177
if(where.getQueryElements().size() > 0){
166178
QueryString qs = where.getQueryString(repo.getInfo());
@@ -277,7 +289,9 @@ public List<T> all(){
277289
QueryString qs = getQueryString(false);
278290
try {
279291
ResultSet rs = repo.getConnection().read(qs.getQuery(), SQLMapper.mapParams(repo, qs.getParameters()).toArray());
280-
List<T> list = SQLMapper.map(repo, rs);
292+
List<Class<? extends Model>> joinedModels = new ArrayList<>();
293+
joinedModels.addAll(leftJoins.keySet());
294+
List<T> list = SQLMapper.map(repo, rs, joinedModels);
281295
repo.getConnection().close(rs);
282296
return list;
283297
} catch (SQLException throwables) {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.javawebstack.orm.query;
2+
3+
public class QueryColumn {
4+
5+
private final String name;
6+
7+
public QueryColumn(String name){
8+
this.name = name;
9+
}
10+
11+
public String getName() {
12+
return name;
13+
}
14+
15+
}

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ private boolean hasRight(){
3636
public QueryString getQueryString(TableInfo info){
3737
StringBuilder sb = new StringBuilder();
3838
List<Object> parameters = new ArrayList<>();
39-
if(left instanceof String){
39+
if(left instanceof QueryColumn){
4040
String fieldName = (String) left;
4141
sb.append('`').append(info.getColumnName(fieldName)).append('`');
4242
}else{
@@ -46,8 +46,14 @@ public QueryString getQueryString(TableInfo info){
4646
sb.append(' ');
4747
sb.append(operator);
4848
if(hasRight()){
49-
sb.append(" ?");
50-
parameters.add(right);
49+
sb.append(' ');
50+
if(right instanceof QueryColumn){
51+
String fieldName = (String) right;
52+
sb.append('`').append(info.getColumnName(fieldName)).append('`');
53+
}else{
54+
sb.append('?');
55+
parameters.add(right);
56+
}
5157
}
5258
return new QueryString(sb.toString(), parameters);
5359
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public QueryGroup<T> or(Consumer<QueryGroup<T>> group){
4141
public QueryGroup<T> where(Object left, String condition, Object right){
4242
if(queryElements.size()>0)
4343
queryElements.add(QueryConjunction.AND);
44-
queryElements.add(new QueryCondition(left, condition, right));
44+
queryElements.add(new QueryCondition(left instanceof String ? new QueryColumn((String) left) : left, condition, right));
4545
return this;
4646
}
4747

@@ -68,7 +68,7 @@ public QueryGroup<T> greaterThan(Object left, Object right){
6868
public QueryGroup<T> orWhere(Object left, String condition, Object right){
6969
if(queryElements.size() > 0)
7070
queryElements.add(QueryConjunction.OR);
71-
queryElements.add(new QueryCondition(left, condition, right));
71+
queryElements.add(new QueryCondition(left instanceof String ? new QueryColumn((String) left) : left, condition, right));
7272
return this;
7373
}
7474

0 commit comments

Comments
 (0)