Skip to content

Commit b066f9c

Browse files
committed
#3536 kotlin-querybean-generator update for filterMany() changes
Brings the kotlin-querybean-generator up to date with the [java] querybean-generator in terms of how it has specific "associated beans" for ToOne and ToMany type relationships
1 parent 1e38ed9 commit b066f9c

File tree

9 files changed

+177
-247
lines changed

9 files changed

+177
-247
lines changed

kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/Constants.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,15 @@ interface Constants {
1111
String ENTITY = "jakarta.persistence.Entity";
1212
String EMBEDDABLE = "jakarta.persistence.Embeddable";
1313
String CONVERTER = "jakarta.persistence.Converter";
14+
String ONE_TO_MANY = "jakarta.persistence.OneToMany";
15+
String MANY_TO_MANY = "jakarta.persistence.ManyToMany";
1416
String EBEAN_COMPONENT = "io.ebean.annotation.EbeanComponent";
1517

1618
String DBARRAY = "io.ebean.annotation.DbArray";
1719
String DBJSON = "io.ebean.annotation.DbJson";
1820
String DBJSONB = "io.ebean.annotation.DbJsonB";
1921
String DBNAME = "io.ebean.annotation.DbName";
2022

21-
String TQASSOC = "io.ebean.typequery.TQAssoc";
22-
String TQASSOCBEAN = "io.ebean.typequery.TQAssocBean";
23-
String TQPROPERTY = "io.ebean.typequery.TQProperty";
24-
2523
String MODULEINFO = "io.ebean.config.ModuleInfo";
2624
String METAINF_MANIFEST = "META-INF/ebean-generated-info.mf";
2725
String METAINF_SERVICES_MODULELOADER = "META-INF/services/io.ebean.config.EntityClassRegister";
Lines changed: 14 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package io.ebean.querybean.generator;
22

3-
class KotlinLangAdapter implements LangAdapter {
3+
final class KotlinLangAdapter {
44

5-
@Override
6-
public void alias(Append writer, String shortName, String fullName) {
5+
void alias(Append writer, String shortName, String fullName) {
76
writer.append(" companion object {").eol();
87
writer.append(" /**").eol();
98
writer.append(" * shared 'Alias' instance used to provide").eol();
@@ -20,87 +19,38 @@ public void alias(Append writer, String shortName, String fullName) {
2019
writer.append(" }").eol().eol();
2120
}
2221

23-
@Override
24-
public void assocBeanConstructor(Append writer, String shortName) {
25-
writer.append(" constructor(name: String, root: R) : super(name, root)").eol();
26-
writer.eol();
27-
writer.append(" constructor(name: String, root: R, prefix: String) : super(name, root, prefix)").eol();
28-
}
29-
30-
@Override
31-
public void fetch(Append writer, String origShortName) {
32-
writeAssocBeanFetch(writer, origShortName, "", "Eagerly fetch this association loading the specified properties.");
33-
writeAssocBeanFetch(writer, origShortName, "Query", "Eagerly fetch this association using a 'query join' loading the specified properties.");
34-
writeAssocBeanFetch(writer, origShortName, "Cache", "Eagerly fetch this association using L2 cache.");
35-
writeAssocBeanFetch(writer, origShortName, "Lazy", "Use lazy loading for this association loading the specified properties.");
36-
}
37-
38-
private void writeAssocBeanFetch(Append writer, String origShortName, String fetchType, String comment) {
39-
// fun fetch(vararg properties: TQProperty<QContact,?>): R {
40-
// return fetchProperties(*properties)
41-
// }
42-
writer.append(" /**").eol();
43-
writer.append(" * ").append(comment).eol();
44-
writer.append(" */").eol();
45-
writer.append(" fun fetch%s(vararg properties: TQProperty<Q%s,Any>) : R {", fetchType, origShortName).eol();
46-
writer.append(" return fetch%sProperties(*properties)", fetchType).eol();
47-
writer.append(" }").eol();
48-
writer.eol();
49-
}
50-
51-
@Override
52-
public void rootBeanConstructor(Append writer, String shortName, String dbName, String fullName) {
22+
void rootBeanConstructor(Append writer, String shortName, String dbName, String fullName) {
5323
String name = (dbName == null) ? "default" : dbName;
54-
writer.append(" /**").eol();
55-
writer.append(" * Construct using the %s Database.", name).eol();
56-
writer.append(" */").eol();
24+
writer.append(" /** Construct using the %s Database. */", name).eol();
5725
if (dbName == null) {
5826
writer.append(" constructor() : super(%s::class.java)", fullName).eol().eol();
5927
} else {
6028
writer.append(" constructor() : super(%s::class.java, io.ebean.DB.byName(\"%s\"))", fullName, dbName).eol().eol();
6129
}
6230

63-
writer.append(" /**").eol();
64-
writer.append(" * @deprecated migrate to query.usingTransaction()", name).eol();
65-
writer.append(" */").eol();
66-
writer.append(" @Deprecated(message=\"migrate to query.usingTransaction()\")").eol();
31+
writer.append(" /** @deprecated migrate to query.usingTransaction() */", name).eol();
32+
writer.append(" @Deprecated(message=\"migrate to query.usingTransaction()\")").eol();
6733
if (dbName == null) {
6834
writer.append(" constructor(transaction: io.ebean.Transaction) : super(%s::class.java, transaction)", fullName).eol().eol();
6935
} else {
7036
writer.append(" constructor(transaction: io.ebean.Transaction) : super(%s::class.java, io.ebean.DB.byName(\"%s\"), transaction)", fullName, dbName).eol().eol();
7137
}
7238

73-
writer.eol();
74-
writer.append(" /**").eol();
75-
writer.append(" * Construct with a given Database.").eol();
76-
writer.append(" */").eol();
39+
writer.append(" /** Construct with a given Database. */").eol();
7740
writer.append(" constructor(database: io.ebean.Database) : super(%s::class.java, database)", fullName).eol().eol();
7841

79-
writer.append(" /**").eol();
80-
writer.append(" * Construct for Alias.").eol();
81-
writer.append(" */").eol();
42+
writer.append(" /** Construct for Alias. */").eol();
8243
writer.append(" private constructor(dummy: Boolean) : super(dummy)").eol().eol();
8344

84-
writer.append(" /**").eol();
85-
writer.append(" * Private constructor for FetchGroup building.").eol();
86-
writer.append(" */").eol();
87-
writer.append(" private constructor(fetchGroupQuery: io.ebean.Query<%s>) : super(fetchGroupQuery)", fullName).eol();
45+
writer.append(" /** Private constructor for FetchGroup building. */").eol();
46+
writer.append(" private constructor(fetchGroupQuery: io.ebean.Query<%s>) : super(fetchGroupQuery)", fullName).eol().eol();
47+
48+
writer.append(" /** Private constructor for filterMany */").eol();
49+
writer.append(" private constructor(filter: io.ebean.ExpressionList<%s>) : super(filter)", fullName).eol().eol();
8850

89-
writer.eol();
9051
writer.append(" /** Return a copy of the query. */").eol();
9152
writer.append(" override fun copy() : Q%s {", shortName).eol();
9253
writer.append(" return Q%s(query().copy())", shortName).eol();
93-
writer.append(" }").eol();
94-
writer.eol();
95-
}
96-
97-
@Override
98-
public void fieldDefn(Append writer, String propertyName, String typeDefn) {
99-
writer.append(" lateinit var %s: ", propertyName);
100-
if (typeDefn.endsWith(",Integer>")) {
101-
typeDefn = typeDefn.replace(",Integer>", ",Int>");
102-
}
103-
writer.append(typeDefn);
54+
writer.append(" }").eol().eol();
10455
}
105-
10656
}

kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/LangAdapter.java

Lines changed: 0 additions & 16 deletions
This file was deleted.

kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java

Lines changed: 53 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,10 @@ boolean isEmbeddable(Element element) {
239239
return hasAnnotations(element, EMBEDDABLE);
240240
}
241241

242+
private static boolean dbToMany(Element field) {
243+
return hasAnnotations(field, ONE_TO_MANY, MANY_TO_MANY);
244+
}
245+
242246
/**
243247
* Find the DbName annotation and return name if found.
244248
*/
@@ -261,6 +265,7 @@ private static boolean dbArrayField(Element field) {
261265
}
262266

263267
PropertyType getPropertyType(VariableElement field) {
268+
boolean toMany = dbToMany(field);
264269
if (dbJsonField(field)) {
265270
return propertyTypeMap.getDbJsonType();
266271
}
@@ -301,36 +306,30 @@ PropertyType getPropertyType(VariableElement field) {
301306
if (targetEntity != null) {
302307
final TypeElement element = elementUtils.getTypeElement(targetEntity);
303308
if (isEntityOrEmbedded(element)) {
304-
return createPropertyTypeAssoc(typeDef(element.asType()));
309+
boolean embeddable = isEmbeddable(element);
310+
return createPropertyTypeAssoc(embeddable, toMany, typeDef(element.asType()));
305311
}
306312
}
307313
if (isEntityOrEmbedded(fieldType)) {
308-
// public QAssocContact<QCustomer> contacts;
309-
return createPropertyTypeAssoc(typeDef(typeMirror));
314+
boolean embeddable = isEmbeddable(fieldType);
315+
return createPropertyTypeAssoc(embeddable, toMany, typeDef(typeMirror));
310316
}
311317

318+
final PropertyType result;
312319
if (typeMirror.getKind() == TypeKind.DECLARED) {
313-
DeclaredType declaredType = (DeclaredType) typeMirror;
314-
List<? extends TypeMirror> typeArguments = declaredType.getTypeArguments();
315-
if (typeArguments.size() == 1) {
316-
TypeMirror argType = typeArguments.get(0);
317-
Element argElement = asElement(argType);
318-
if (isEntityOrEmbedded(argElement)) {
319-
return createPropertyTypeAssoc(typeDef(argElement.asType()));
320-
}
321-
} else if (typeArguments.size() == 2) {
322-
TypeMirror argType = typeArguments.get(1);
323-
Element argElement = asElement(argType);
324-
if (isEntityOrEmbedded(argElement)) {
325-
return createPropertyTypeAssoc(typeDef(argElement.asType()));
326-
}
327-
}
320+
result = createManyTypeAssoc(field, (DeclaredType) typeMirror);
321+
} else {
322+
result = null;
328323
}
329324

330-
if (typeInstanceOf(typeMirror, "java.lang.Comparable")) {
331-
return new PropertyTypeScalarComparable(trimAnnotations(typeMirror.toString()));
325+
if (result != null) {
326+
return result;
332327
} else {
333-
return new PropertyTypeScalar(trimAnnotations(typeMirror.toString()));
328+
if (typeInstanceOf(typeMirror, "java.lang.Comparable")) {
329+
return new PropertyTypeScalarComparable(trimAnnotations(typeMirror.toString()));
330+
} else {
331+
return new PropertyTypeScalar(trimAnnotations(typeMirror.toString()));
332+
}
334333
}
335334
}
336335

@@ -357,6 +356,25 @@ private boolean typeInstanceOf(final TypeMirror typeMirror, final CharSequence d
357356
.anyMatch(t -> typeInstanceOf(t, desiredInterface));
358357
}
359358

359+
private PropertyType createManyTypeAssoc(VariableElement field, DeclaredType declaredType) {
360+
boolean toMany = dbToMany(field);
361+
List<? extends TypeMirror> typeArguments = declaredType.getTypeArguments();
362+
if (typeArguments.size() == 1) {
363+
Element argElement = typeUtils.asElement(typeArguments.get(0));
364+
if (isEntityOrEmbedded(argElement)) {
365+
boolean embeddable = isEmbeddable(argElement);
366+
return createPropertyTypeAssoc(embeddable, toMany, typeDef(argElement.asType()));
367+
}
368+
} else if (typeArguments.size() == 2) {
369+
Element argElement = typeUtils.asElement(typeArguments.get(1));
370+
if (isEntityOrEmbedded(argElement)) {
371+
boolean embeddable = isEmbeddable(argElement);
372+
return createPropertyTypeAssoc(embeddable, toMany, typeDef(argElement.asType()));
373+
}
374+
}
375+
return null;
376+
}
377+
360378
private String readTargetEntity(Element declaredType) {
361379
for (AnnotationMirror annotation : declaredType.getAnnotationMirrors()) {
362380
final Object targetEntity = readTargetEntityFromAnnotation(annotation);
@@ -386,11 +404,20 @@ private String langShortType(String shortName) {
386404
/**
387405
* Create the QAssoc PropertyType.
388406
*/
389-
private PropertyType createPropertyTypeAssoc(String fullName) {
390-
String[] split = Split.split(fullName);
391-
String propertyName = "QAssoc" + split[1];
392-
String packageName = packageAppend(split[0]);
393-
return new PropertyTypeAssoc(propertyName, packageName);
407+
private PropertyType createPropertyTypeAssoc(boolean embeddable, boolean toMany, String fullName) {
408+
TypeElement typeElement = elementUtils.getTypeElement(fullName);
409+
String type;
410+
if (typeElement.getNestingKind().isNested()) {
411+
type = typeElement.getEnclosingElement().toString() + "$" + typeElement.getSimpleName();
412+
} else {
413+
type = typeElement.getQualifiedName().toString();
414+
}
415+
416+
String suffix = toMany ? "Many" : embeddable ? "": "One";
417+
String[] split = Split.split(type);
418+
String propertyName = "Q" + split[1] + ".Assoc" + suffix;
419+
String importName = split[0] + ".query.Q" + split[1];
420+
return new PropertyTypeAssoc(propertyName, importName);
394421
}
395422

396423
/**

kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/Processor.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,7 @@ private void writeModuleInfoBean() {
109109
private void generateQueryBeans(Element element) {
110110
try {
111111
SimpleQueryBeanWriter beanWriter = new SimpleQueryBeanWriter((TypeElement) element, processingContext);
112-
beanWriter.writeRootBean();
113-
beanWriter.writeAssocBean();
112+
beanWriter.writeBean();
114113
} catch (Throwable e) {
115114
processingContext.logError(element, "Error generating query beans: " + e);
116115
}

kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeAssoc.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,16 @@
77
*/
88
class PropertyTypeAssoc extends PropertyType {
99

10-
/**
11-
* The package name for this associated query bean.
12-
*/
13-
private final String assocPackage;
10+
private final String importName;
1411

15-
/**
16-
* Construct given the associated bean type name and package.
17-
*
18-
* @param qAssocTypeName the associated bean type name.
19-
* @param assocPackage the associated bean package.
20-
*/
21-
PropertyTypeAssoc(String qAssocTypeName, String assocPackage) {
12+
PropertyTypeAssoc(String qAssocTypeName, String importName) {
2213
super(qAssocTypeName);
23-
this.assocPackage = assocPackage;
14+
this.importName = importName;
2415
}
2516

2617
@Override
2718
void addImports(Set<String> allImports) {
28-
allImports.add(assocPackage + "." + propertyType);
19+
allImports.add(importName);
2920
}
3021

3122
}

0 commit comments

Comments
 (0)