Skip to content

Commit 276bf59

Browse files
authored
Merge pull request #422 from domaframework/optimize-generation-code
Optimize generation code
2 parents 3cecbbb + 2007ac0 commit 276bf59

File tree

52 files changed

+1215
-608
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1215
-608
lines changed

doma-core/src/main/java/org/seasar/doma/internal/jdbc/scalar/BasicScalar.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ public class BasicScalar<BASIC> implements Scalar<BASIC, BASIC> {
99

1010
protected final Wrapper<BASIC> wrapper;
1111

12+
public BasicScalar(Wrapper<BASIC> wrapper) {
13+
AssertionUtil.assertNotNull(wrapper);
14+
this.wrapper = wrapper;
15+
}
16+
1217
public BasicScalar(Supplier<Wrapper<BASIC>> supplier) {
1318
AssertionUtil.assertNotNull(supplier);
1419
this.wrapper = supplier.get();

doma-core/src/main/java/org/seasar/doma/internal/jdbc/scalar/OptionalBasicScalar.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ public class OptionalBasicScalar<BASIC> implements Scalar<BASIC, Optional<BASIC>
99

1010
protected final Wrapper<BASIC> wrapper;
1111

12+
public OptionalBasicScalar(Wrapper<BASIC> wrapper) {
13+
AssertionUtil.assertNotNull(wrapper);
14+
this.wrapper = wrapper;
15+
AssertionUtil.assertNotNull(wrapper);
16+
}
17+
1218
public OptionalBasicScalar(Supplier<Wrapper<BASIC>> supplier) {
1319
AssertionUtil.assertNotNull(supplier);
1420
this.wrapper = supplier.get();

doma-core/src/main/java/org/seasar/doma/jdbc/entity/EmbeddedPropertyType.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static java.util.stream.Collectors.toMap;
44

5+
import java.util.LinkedHashMap;
56
import java.util.List;
67
import java.util.Map;
78
import java.util.function.Function;
@@ -35,7 +36,14 @@ public EmbeddedPropertyType(
3536
this.embeddablePropertyTypes = embeddablePropertyType;
3637
this.embeddablePropertyTypeMap =
3738
this.embeddablePropertyTypes.stream()
38-
.collect(toMap(EntityPropertyType::getName, Function.identity()));
39+
.collect(
40+
toMap(
41+
EntityPropertyType::getName,
42+
Function.identity(),
43+
(u, v) -> {
44+
throw new IllegalStateException(String.format("Duplicate key %s", u));
45+
},
46+
LinkedHashMap::new));
3947
this.field = new PropertyField<>(name, entityClass);
4048
}
4149

doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/BasicCtType.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ public Code getWrapperSupplierCode() {
3434
});
3535
}
3636

37+
public Code getWrapperCode() {
38+
return new Code(
39+
p -> {
40+
if (isEnum()) {
41+
p.print("new %1$s(%2$s.class)", wrapperType, getQualifiedName());
42+
} else {
43+
p.print("new %1$s()", wrapperType);
44+
}
45+
});
46+
}
47+
3748
@Override
3849
public <R, P, TH extends Throwable> R accept(CtTypeVisitor<R, P, TH> visitor, P p) throws TH {
3950
return visitor.visitBasicCtType(this, p);

doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityTypeGenerator.java

Lines changed: 105 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.seasar.doma.internal.apt.meta.id.TableIdGeneratorMeta;
2323
import org.seasar.doma.jdbc.Naming;
2424
import org.seasar.doma.jdbc.entity.AbstractEntityType;
25+
import org.seasar.doma.jdbc.entity.EmbeddedPropertyType;
2526
import org.seasar.doma.jdbc.entity.EntityPropertyType;
2627
import org.seasar.doma.jdbc.entity.GeneratedIdPropertyType;
2728
import org.seasar.doma.jdbc.entity.NamingType;
@@ -87,7 +88,6 @@ private void printFields() {
8788
printOriginalStatesAccessorField();
8889
printNamingTypeField();
8990
printIdGeneratorField();
90-
printPropertyTypeFields();
9191
printListenerSupplierField();
9292
printImmutableField();
9393
printCatalogNameField();
@@ -98,6 +98,7 @@ private void printFields() {
9898
printIdPropertyTypesField();
9999
printEntityPropertyTypesField();
100100
printEntityPropertyTypeMapField();
101+
printEmbeddedPropertyTypeMapField();
101102
}
102103

103104
private void printSingletonField() {
@@ -127,15 +128,6 @@ private void printIdGeneratorField() {
127128
}
128129
}
129130

130-
private void printPropertyTypeFields() {
131-
for (EntityPropertyMeta pm : entityMeta.getAllPropertyMetas()) {
132-
EntityTypePropertyGenerator propertyGenerator =
133-
new EntityTypePropertyGenerator(ctx, className, printer, entityMeta, pm);
134-
propertyGenerator.generate();
135-
print("%n");
136-
}
137-
}
138-
139131
private void printListenerSupplierField() {
140132
if (entityMeta.isGenericEntityListener()) {
141133
iprint(
@@ -210,6 +202,16 @@ private void printEntityPropertyTypeMapField() {
210202
print("%n");
211203
}
212204

205+
private void printEmbeddedPropertyTypeMapField() {
206+
if (!entityMeta.hasEmbeddedProperties()) {
207+
iprint("@SuppressWarnings(\"unused\")%n");
208+
}
209+
iprint(
210+
"private final java.util.Map<String, %1$s<%2$s, ?>> __embeddedPropertyTypeMap;%n",
211+
EmbeddedPropertyType.class, entityMeta.getType());
212+
print("%n");
213+
}
214+
213215
private void printConstructor() {
214216
iprint("private %1$s() {%n", simpleName);
215217
iprint(" __listenerSupplier = () -> ListenerHolder.listener;%n");
@@ -228,30 +230,31 @@ private void printConstructor() {
228230
/* 2 */ entityMeta.getType(),
229231
/* 3 */ entityMeta.getAllPropertyMetas().size());
230232
iprint(
231-
" java.util.Map<String, %1$s<%2$s, ?>> __map = new java.util.HashMap<>(%3$s);%n",
233+
" java.util.Map<String, %1$s<%2$s, ?>> __map = new java.util.LinkedHashMap<>(%3$s);%n",
232234
/* 1 */ EntityPropertyType.class,
233235
/* 2 */ entityMeta.getType(),
234236
/* 3 */ entityMeta.getAllPropertyMetas().size());
235-
for (EntityPropertyMeta pm : entityMeta.getAllPropertyMetas()) {
236-
if (pm.isEmbedded()) {
237-
iprint(" __list.addAll(%1$s.getEmbeddablePropertyTypes());%n", pm.getFieldName());
238-
iprint(" __map.putAll(%1$s.getEmbeddablePropertyTypeMap());%n", pm.getFieldName());
239-
} else {
240-
if (pm.isId()) {
241-
iprint(" __idList.add(%1$s);%n", pm.getFieldName());
242-
}
243-
iprint(" __list.add(%1$s);%n", pm.getFieldName());
244-
iprint(" __map.put(\"%1$s\", %2$s);%n", pm.getName(), pm.getFieldName());
245-
}
246-
}
237+
iprint(
238+
" java.util.Map<String, %1$s<%2$s, ?>> __embeddedMap = new java.util.LinkedHashMap<>(%3$s);%n",
239+
/* 1 */ EmbeddedPropertyType.class,
240+
/* 2 */ entityMeta.getType(),
241+
/* 3 */ entityMeta.getAllPropertyMetas().size());
242+
iprint(" initializeMaps(__map, __embeddedMap);%n");
243+
iprint(" initializeIdList(__map, __idList);%n");
244+
iprint(" initializeList(__map, __list);%n");
247245
iprint(" __idPropertyTypes = java.util.Collections.unmodifiableList(__idList);%n");
248246
iprint(" __entityPropertyTypes = java.util.Collections.unmodifiableList(__list);%n");
249247
iprint(" __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map);%n");
248+
iprint(
249+
" __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap);%n");
250250
iprint("}%n");
251251
print("%n");
252252
}
253253

254254
private void printMethods() {
255+
printInitializeMapsMethod();
256+
printInitializeIdListMethod();
257+
printInitializeListMethod();
255258
printGetNamingTypeMethod();
256259
printIsImmutableMethod();
257260
printGetNameMethod();
@@ -279,6 +282,58 @@ private void printMethods() {
279282
printNewInstanceMethod();
280283
}
281284

285+
private void printInitializeMapsMethod() {
286+
iprint(
287+
"private void initializeMaps(java.util.Map<String, %1$s<%2$s, ?>> __map, java.util.Map<String, %3$s<%2$s, ?>> __embeddedMap) {%n",
288+
/* 1 */ EntityPropertyType.class,
289+
/* 2 */ entityMeta.getType(),
290+
/* 3 */ EmbeddedPropertyType.class);
291+
indent();
292+
for (EntityPropertyMeta pm : entityMeta.getAllPropertyMetas()) {
293+
EntityTypePropertyGenerator propertyGenerator =
294+
new EntityTypePropertyGenerator(ctx, className, printer, entityMeta, pm);
295+
if (pm.isEmbedded()) {
296+
iprint("__embeddedMap.put(\"%1$s\", ", pm.getName());
297+
propertyGenerator.generate();
298+
print(");%n");
299+
iprint(
300+
"__map.putAll(__embeddedMap.get(\"%1$s\").getEmbeddablePropertyTypeMap());%n",
301+
pm.getName());
302+
} else {
303+
iprint("__map.put(\"%1$s\", ", pm.getName());
304+
propertyGenerator.generate();
305+
print(");%n");
306+
}
307+
}
308+
unindent();
309+
iprint("}%n");
310+
print("%n");
311+
}
312+
313+
private void printInitializeIdListMethod() {
314+
iprint(
315+
"private void initializeIdList(java.util.Map<String, %1$s<%2$s, ?>> __map, java.util.List<%1$s<%2$s, ?>> __idList) {%n",
316+
EntityPropertyType.class, entityMeta.getType());
317+
indent();
318+
for (EntityPropertyMeta pm : entityMeta.getIdPropertyMetas()) {
319+
iprint("__idList.add(__map.get(\"%1$s\"));%n", pm.getName());
320+
}
321+
unindent();
322+
iprint("}%n");
323+
print("%n");
324+
}
325+
326+
private void printInitializeListMethod() {
327+
iprint(
328+
"private void initializeList(java.util.Map<String, %1$s<%2$s, ?>> __map, java.util.List<%1$s<%2$s, ?>> __list) {%n",
329+
EntityPropertyType.class, entityMeta.getType());
330+
indent();
331+
iprint("__list.addAll(__map.values());%n");
332+
unindent();
333+
iprint("}%n");
334+
print("%n");
335+
}
336+
282337
private void printGetNamingTypeMethod() {
283338
iprint("@Override%n");
284339
iprint("public %1$s getNamingType() {%n", NamingType.class);
@@ -451,13 +506,16 @@ private void printGetGeneratedIdPropertyTypeMethod() {
451506
String idName = "null";
452507
if (entityMeta.hasGeneratedIdPropertyMeta()) {
453508
EntityPropertyMeta pm = entityMeta.getGeneratedIdPropertyMeta();
454-
idName = pm.getFieldName();
509+
idName = pm.getName();
455510
}
511+
iprint("@SuppressWarnings(\"unchecked\")%n");
456512
iprint("@Override%n");
457513
iprint(
458514
"public %1$s<%2$s, ?, ?> getGeneratedIdPropertyType() {%n",
459515
GeneratedIdPropertyType.class, entityMeta.getType());
460-
iprint(" return %1$s;%n", idName);
516+
iprint(
517+
" return (%1$s<%2$s, ?, ?>)__entityPropertyTypeMap.get(\"%3$s\");%n",
518+
GeneratedIdPropertyType.class, entityMeta.getType(), idName);
461519
iprint("}%n");
462520
print("%n");
463521
}
@@ -466,13 +524,16 @@ private void printGetVersionPropertyTypeMethod() {
466524
String versionName = "null";
467525
if (entityMeta.hasVersionPropertyMeta()) {
468526
EntityPropertyMeta pm = entityMeta.getVersionPropertyMeta();
469-
versionName = pm.getFieldName();
527+
versionName = pm.getName();
470528
}
529+
iprint("@SuppressWarnings(\"unchecked\")%n");
471530
iprint("@Override%n");
472531
iprint(
473532
"public %1$s<%2$s, ?, ?> getVersionPropertyType() {%n",
474533
VersionPropertyType.class, entityMeta.getType());
475-
iprint(" return %1$s;%n", versionName);
534+
iprint(
535+
" return (%1$s<%2$s, ?, ?>)__entityPropertyTypeMap.get(\"%3$s\");%n",
536+
VersionPropertyType.class, entityMeta.getType(), versionName);
476537
iprint("}%n");
477538
print("%n");
478539
}
@@ -481,19 +542,23 @@ private void printGetTenantIdPropertyTypeMethod() {
481542
String tenantIdName = "null";
482543
if (entityMeta.hasTenantIdPropertyMeta()) {
483544
EntityPropertyMeta pm = entityMeta.getTenantIdPropertyMeta();
484-
tenantIdName = pm.getFieldName();
545+
tenantIdName = pm.getName();
485546
}
547+
iprint("@SuppressWarnings(\"unchecked\")%n");
486548
iprint("@Override%n");
487549
iprint(
488550
"public %1$s<%2$s, ?, ?> getTenantIdPropertyType() {%n",
489551
TenantIdPropertyType.class, entityMeta.getType());
490-
iprint(" return %1$s;%n", tenantIdName);
552+
iprint(
553+
" return (%1$s<%2$s, ?, ?>)__entityPropertyTypeMap.get(\"%3$s\");%n",
554+
TenantIdPropertyType.class, entityMeta.getType(), tenantIdName);
491555
iprint("}%n");
492556
print("%n");
493557
}
494558

495559
private void printNewEntityMethod() {
496-
if (hasGenericTypeProperty()) {
560+
if (hasGenericTypeProperty()
561+
|| (!entityMeta.isImmutable() && entityMeta.hasEmbeddedProperties())) {
497562
iprint("@SuppressWarnings(\"unchecked\")%n");
498563
}
499564
iprint("@Override%n");
@@ -547,10 +612,13 @@ protected Void defaultAction(CtType ctType, Void aVoid)
547612
public Void visitEmbeddableCtType(EmbeddableCtType ctType, Void aVoid)
548613
throws RuntimeException {
549614
iprint(
550-
" %1$s.save(entity, %2$s.newEmbeddable(\"%3$s\", __args));%n",
551-
propertyMeta.getFieldName(),
552-
ctType.getDescCode(),
553-
propertyMeta.getName());
615+
" ((%4$s<%5$s, %6$s>)__embeddedPropertyTypeMap.get(\"%1$s\")).save(entity, %2$s.newEmbeddable(\"%3$s\", __args));%n",
616+
/* 1 */ propertyMeta.getName(),
617+
/* 2 */ ctType.getDescCode(),
618+
/* 3 */ propertyMeta.getName(),
619+
/* 4 */ EmbeddedPropertyType.class,
620+
/* 5 */ entityMeta.getType(),
621+
/* 6 */ ctType.getType());
554622
return null;
555623
}
556624

@@ -612,7 +680,9 @@ private void printSaveCurrentStatesMethod() {
612680
if (!entityMeta.isAbstract() && entityMeta.hasOriginalStatesMeta()) {
613681
iprint(" %1$s __currentStates = new %1$s();%n", entityMeta.getType());
614682
for (EntityPropertyMeta pm : entityMeta.getAllPropertyMetas()) {
615-
iprint(" %1$s.copy(__currentStates, __entity);%n", pm.getFieldName());
683+
iprint(
684+
" (__entityPropertyTypeMap.get(\"%1$s\")).copy(__currentStates, __entity);%n",
685+
pm.getName());
616686
}
617687
iprint(" __originalStatesAccessor.set(__entity, __currentStates);%n");
618688
}

0 commit comments

Comments
 (0)