Skip to content

Commit 83f3f97

Browse files
committed
refines loadSchema
1 parent f8eb7fb commit 83f3f97

9 files changed

Lines changed: 92 additions & 61 deletions

File tree

hyperquery/src/main/java/org/slowcoders/hyperquery/core/QInlineView.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import org.slowcoders.hyperquery.impl.HSchema;
55
import org.slowcoders.hyperquery.impl.ViewResolver;
66

7+
import java.sql.Connection;
8+
79
public class QInlineView extends HModel {
810

911
private final String viewDefinition;
@@ -13,8 +15,8 @@ public QInlineView(String query) {
1315
}
1416

1517
@Override
16-
protected HSchema loadSchema() {
17-
return HSchema.loadSchema((Class)QEntity.class, false);
18+
protected HSchema loadSchema(Connection dbConn) {
19+
return HSchema.loadSchema((Class)QEntity.class, false, dbConn);
1820
}
1921

2022
@Override

hyperquery/src/main/java/org/slowcoders/hyperquery/core/QJoin.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import org.slowcoders.hyperquery.impl.HModel;
55
import org.slowcoders.hyperquery.impl.HSchema;
66

7+
import java.sql.Connection;
8+
79
public class QJoin extends AliasNode {
810

911
public enum JoinType {
@@ -37,9 +39,9 @@ public String getJoinCriteria() {
3739
}
3840
public boolean isToUnique() { return toUnique; }
3941

40-
public HModel getTargetRelation() {
42+
public HModel getTargetRelation(Connection dbConn) {
4143
if (model == null) {
42-
model = HSchema.loadSchema(viewType, false);
44+
model = HSchema.loadSchema(viewType, false, dbConn);
4345
}
4446
return model;
4547
}

hyperquery/src/main/java/org/slowcoders/hyperquery/core/QMapperView.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.slowcoders.hyperquery.impl.HSchema;
55
import org.slowcoders.hyperquery.impl.ViewResolver;
66

7+
import java.sql.Connection;
78
import java.util.Map;
89

910
public class QMapperView<R extends QRecord<?>> extends HModel {
@@ -36,9 +37,9 @@ public QMapperView(Class<R> recordType, String namespace, String sqlId, Map<Stri
3637
}
3738

3839
@Override
39-
protected HSchema loadSchema() {
40+
protected HSchema loadSchema(Connection dbConn) {
4041
if (schema == null) {
41-
schema = HSchema.loadSchema(recordType, false);
42+
schema = HSchema.loadSchema(recordType, false, dbConn);
4243
}
4344
return schema;
4445
}

hyperquery/src/main/java/org/slowcoders/hyperquery/impl/HModel.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
import org.slowcoders.hyperquery.core.*;
44

5+
import java.sql.Connection;
6+
57
public abstract class HModel {
68

79
public void initialize() {
810
}
911

10-
protected abstract HSchema loadSchema();
12+
protected abstract HSchema loadSchema(Connection dbConn);
1113

1214
protected abstract String getTableName();
1315

@@ -17,7 +19,7 @@ protected QAttribute getAttribute(String property) {
1719
return null;
1820
}
1921

20-
protected QJoin getJoin(String alias) {
22+
protected QJoin getJoin(String alias, Connection dbConn) {
2123
return null;
2224
}
2325

hyperquery/src/main/java/org/slowcoders/hyperquery/impl/HSchema.java

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -105,49 +105,54 @@ else if (QAttribute.class.isAssignableFrom(propertyType)) {
105105
this.attributes = attributes;
106106
}
107107

108-
public static HSchema loadSchema(Class<?> clazz, boolean isEntity) {
108+
public static HSchema loadSchema(Class<?> clazz, boolean isEntity, Connection dbConn) {
109109
synchronized (relations) {
110110
HSchema schema = relations.get(clazz);
111111
if (schema != null) return schema;
112+
}
112113

113-
Class<?> genericClass = clazz;
114-
while (!QEntity.class.isAssignableFrom(genericClass)) {
115-
if (QFilter.class.isAssignableFrom(genericClass)) {
116-
Type type = genericClass.getGenericSuperclass();
117-
if (type instanceof ParameterizedType) {
118-
genericClass = (Class<?>) ((ParameterizedType) type).getActualTypeArguments()[0];
119-
} else {
120-
type = type.getClass();
121-
}
122-
continue;
114+
Class<?> genericClass = clazz;
115+
while (!QEntity.class.isAssignableFrom(genericClass)) {
116+
if (QFilter.class.isAssignableFrom(genericClass)) {
117+
Type type = genericClass.getGenericSuperclass();
118+
if (type instanceof ParameterizedType) {
119+
genericClass = (Class<?>) ((ParameterizedType) type).getActualTypeArguments()[0];
120+
} else {
121+
type = type.getClass();
123122
}
123+
continue;
124+
}
124125

125-
Type[] interfaces = genericClass.getGenericInterfaces();
126-
genericClass = null;
127-
for (Type iface : interfaces) {
128-
if (iface instanceof ParameterizedType) {
129-
Type[] params = ((ParameterizedType) iface).getActualTypeArguments();
130-
if (QRecord.class.isAssignableFrom((Class<?>) params[0])) {
131-
genericClass = (Class<?>) params[0];
132-
break;
133-
}
126+
Type[] interfaces = genericClass.getGenericInterfaces();
127+
genericClass = null;
128+
for (Type iface : interfaces) {
129+
if (iface instanceof ParameterizedType) {
130+
Type[] params = ((ParameterizedType) iface).getActualTypeArguments();
131+
if (QRecord.class.isAssignableFrom((Class<?>) params[0])) {
132+
genericClass = (Class<?>) params[0];
133+
break;
134134
}
135135
}
136-
if (genericClass == null) {
137-
throw new IllegalArgumentException(clazz.getName() + " is not valid a model(QEntity, QRecord or QFilter)");
138-
}
139136
}
137+
if (genericClass == null) {
138+
throw new IllegalArgumentException(clazz.getName() + " is not valid a model(QEntity, QRecord or QFilter)");
139+
}
140+
}
140141

141-
schema = new HSchema((Class<? extends QEntity<?>>) genericClass, isEntity);
142-
relations.put(genericClass, schema);
142+
synchronized (relations) {
143+
HSchema schema = relations.get(genericClass);
144+
if (schema == null) {
145+
schema = new HSchema((Class<? extends QEntity<?>>) genericClass, isEntity);
146+
relations.put(genericClass, schema);
147+
}
143148
return schema;
144149
}
145150
}
146151

147152

148153

149154
@Override
150-
protected HSchema loadSchema() {
155+
protected HSchema loadSchema(Connection dbConn) {
151156
return this;
152157
}
153158

@@ -156,25 +161,24 @@ protected String getTableName() {
156161
return this.tableName;
157162
}
158163

159-
public QJoin getJoin(String join) {
164+
public QJoin getJoin(String join, Connection dbConn) {
160165
this.initialize();
161166
int next = join.indexOf('@', 1);
162167
String nextJoin = null;
163168
if (next > 0) {
164169
nextJoin = join.substring(next);
165170
join = join.substring(0, next);
166-
QJoin subJoin = getJoin(join);
167-
return subJoin.getTargetRelation().getJoin(nextJoin);
171+
QJoin subJoin = getJoin(join, dbConn);
172+
return subJoin.getTargetRelation(dbConn).getJoin(nextJoin, dbConn);
168173
}
169174
return joins.get(join);
170175
}
171176

172-
static String getColumnExpr(HModel model, Field f) {
177+
String getColumnExpr(Field f) {
173178
String columnExpr = Helper.getColumnName(f);
174179
if (columnExpr != null) return columnExpr;
175-
HSchema schema = model.loadSchema();
176-
if (schema != null && schema.attributes != null) {
177-
QAttribute attr = schema.attributes.get(f.getName());
180+
if (this.attributes != null) {
181+
QAttribute attr = this.attributes.get(f.getName());
178182
if (attr != null) return attr.getEncodedExpr();
179183
}
180184
return null;

hyperquery/src/main/java/org/slowcoders/hyperquery/impl/QStore.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ public <E extends QEntity<E>, R extends QRecord<E>> R selectOne(Class<R> resultT
3737

3838

3939
public <E extends QEntity<E>, R extends QRecord<E>> List<R> selectList(HModel view, Class<R> resultType, QFilter<E> filter) {
40-
if (filter != null && HSchema.loadSchema(filter.getClass(), false) != view.loadSchema()) {
40+
HSchema viewSchema = view.loadSchema(sqlSessionTemplate.getConnection());
41+
if (filter != null && loadSchema(filter.getClass(), false) != viewSchema) {
4142
throw new IllegalArgumentException("Filter type is not related to result type.");
4243
}
4344

44-
SqlBuilder gen = new SqlBuilder(view, this);
45+
SqlBuilder gen = new SqlBuilder(viewSchema, this);
4546
HQuery query = gen.buildSelect(resultType, filter);
4647

4748
String id = registerMapper(query.with, resultType);
@@ -60,11 +61,11 @@ public <E extends QEntity<E>, R extends QRecord<E>> List<R> selectList(HModel vi
6061
}
6162

6263
public <E extends QEntity<E>, R extends QRecord<E>> List<R> selectList(Class<R> resultType, QFilter<E> filter) {
63-
return selectList(HSchema.loadSchema(resultType, false), resultType, filter);
64+
return selectList(loadSchema(resultType, false), resultType, filter);
6465
}
6566

6667
public <E extends QEntity<E>> int insert(QEntity<E> entity, boolean updateOnConflict) {
67-
HSchema schema = HSchema.loadSchema(entity.getClass(), false);
68+
HSchema schema = loadSchema(entity.getClass(), false);
6869
SqlBuilder gen = new SqlBuilder(schema, this);
6970
String query = gen.buildInsert(entity, updateOnConflict);
7071

@@ -82,8 +83,23 @@ public <E extends QEntity<E>> int insert(QEntity<E> entity, boolean updateOnConf
8283
}
8384
}
8485

86+
@Override
87+
public HSchema loadSchema(Class<?> entityType, boolean isEntity) {
88+
return HSchema.loadSchema(entityType, isEntity, sqlSessionTemplate.getConnection());
89+
}
90+
91+
@Override
92+
public HSchema getTargetSchema(QJoin join) {
93+
return join.getTargetRelation(sqlSessionTemplate.getConnection()).loadSchema(sqlSessionTemplate.getConnection());
94+
}
95+
96+
@Override
97+
public QJoin getJoin(HModel model, String alias) {
98+
return model.getJoin(alias, sqlSessionTemplate.getConnection());
99+
}
100+
85101
public <E extends QEntity<E>> int update(QUniqueRecord<E> entity) {
86-
HSchema schema = HSchema.loadSchema(entity.getClass(), false);
102+
HSchema schema = loadSchema(entity.getClass(), false);
87103
SqlBuilder gen = new SqlBuilder(schema, this);
88104
String query = gen.buildUpdate(entity);
89105

hyperquery/src/main/java/org/slowcoders/hyperquery/impl/SqlBuilder.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,8 @@
1111
import java.util.regex.Pattern;
1212

1313
public class SqlBuilder extends ViewNode {
14-
private final HModel rootSchema;
15-
// private final List<ColumnMapping> columnMappings = new ArrayList<>();
16-
// private final Class<? extends QRecord<?>> resultType;
17-
// private final QFilter<?> filter;
18-
14+
private final HSchema rootSchema;
1915
private final ViewResolver viewResolver;
20-
2116
private ViewNode currView = this;
2217
private JoinNode currNode;
2318

@@ -40,7 +35,7 @@ public class SqlBuilder extends ViewNode {
4035
4136
""";
4237

43-
public SqlBuilder(HModel schema, ViewResolver viewResolver ) {
38+
public SqlBuilder(HSchema schema, ViewResolver viewResolver ) {
4439
this.rootSchema = schema;
4540
this.viewResolver = viewResolver;
4641
this.currNode = new JoinNode(rootSchema, "t_0");
@@ -95,8 +90,8 @@ JoinNode pushNamespace(String alias) {
9590
String aliasQualifier = currNode.aliasQualifier + alias.replaceAll("@", "\\$");
9691
JoinNode node = currView.getJoin(aliasQualifier);
9792
if (node == null) {
98-
QJoin join = currNode.getModel().getJoin(alias);
99-
node = new JoinNode(join.getTargetRelation(), aliasQualifier);
93+
QJoin join = viewResolver.getJoin(currNode.getModel(), alias);
94+
node = new JoinNode(viewResolver.getTargetSchema(join), aliasQualifier);
10095
currView.addJoin(aliasQualifier, node);
10196
int orgLevel = node.setAttrLevel(0);
10297
node.joinCriteria = PredicateTranslator.translate(this, alias, join.getJoinCriteria());
@@ -242,16 +237,16 @@ private String genTableView(String alias, JoinNode node) {
242237
}
243238

244239
static Pattern ColumnNameOnly = Pattern.compile("[a-zA-Z_][a-zA-Z0-9_]*");
245-
List<ColumnMapping> parseColumnMappings(HModel view, Class<?> recordType, String propertyPrefix) {
240+
List<ColumnMapping> parseColumnMappings(HSchema view, Class<?> recordType, String propertyPrefix) {
246241
try {
247242
List<ColumnMapping> columnMappings = new ArrayList<>();
248243
for (Field f : recordType.getDeclaredFields()) {
249-
String columnExpr = HSchema.getColumnExpr(view, f);
244+
String columnExpr = view.getColumnExpr(f);
250245
if (columnExpr == null) continue;
251246
Class<? extends QRecord<?>> elementType = HSchema.Helper.getElementType(f);
252247
if (QRecord.class.isAssignableFrom(elementType)) {
253248
JoinNode node = pushNamespace(columnExpr);
254-
HSchema subSchema = HSchema.loadSchema(elementType, false);
249+
HSchema subSchema = viewResolver.loadSchema(elementType, false);
255250
parseColumnMappings(subSchema, elementType, propertyPrefix + f.getName() + '.');
256251
setNamespace(node);
257252
} else {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
package org.slowcoders.hyperquery.impl;
22

3+
import org.slowcoders.hyperquery.core.QJoin;
4+
import org.slowcoders.hyperquery.core.QRecord;
5+
36
import java.util.Map;
47

58
public interface ViewResolver {
69
Object resolveView(String namespace, String sqlFragmentId, Map<String, String> properties);
10+
11+
HSchema loadSchema(Class<?> recordType, boolean isEntity);
12+
13+
HSchema getTargetSchema(QJoin join);
14+
15+
QJoin getJoin(HModel model, String alias);
716
}

sample-app/src/main/java/org/slowcoders/hyperql/sample/hq/bookstore/BookDto.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ public class BookDto implements QRecord<Book> {
2020

2121
private String title;
2222

23-
@QColumn("@author_.name")
23+
@QColumn("@author.name")
2424
private String author;
2525

26-
@QColumn("@weeklySales")
27-
private List<HqBookController.BookSalesFilter> weeklySales;
26+
// @QColumn("@weeklySales")
27+
// private List<HqBookController.BookSalesFilter> weeklySales;
2828

2929
@Getter @Setter
3030
public static class Filter extends QFilter<Book> {

0 commit comments

Comments
 (0)