[jOOQ/jOOQ#5412] Generate a Record from POJO unmapper on generated

records
This commit is contained in:
Lukas Eder 2019-06-18 17:04:54 +02:00
parent 45c298a4bc
commit 5aee8a9b5d
6 changed files with 108 additions and 0 deletions

View File

@ -76,6 +76,7 @@ abstract class AbstractGenerator implements Generator {
boolean generateRecords = true;
boolean generateRecordsImplementingRecordN = true;
boolean generateRecordToPojoMappers = true;
boolean generateRecordFromPojoUnmappers = true;
boolean generatePojos = false;
boolean generatePojosEqualsAndHashCode = false;
boolean generatePojosToString = true;
@ -400,6 +401,16 @@ abstract class AbstractGenerator implements Generator {
this.generateRecordToPojoMappers = generateRecordToPojoMappers;
}
@Override
public boolean generateRecordFromPojoUnmappers() {
return generateRecords() && generatePojos() && generateRecordFromPojoUnmappers;
}
@Override
public void setGenerateRecordFromPojoUnmappers(boolean generateRecordFromPojoUnmappers) {
this.generateRecordFromPojoUnmappers = generateRecordFromPojoUnmappers;
}
@Override
public boolean generatePojos() {

View File

@ -670,6 +670,8 @@ public class GenerationTool {
generator.setGenerateRecordsImplementingRecordN(g.getGenerate().isRecordsImplementingRecordN());
if (g.getGenerate().isRecordToPojoMappers() != null)
generator.setGenerateRecordToPojoMappers(g.getGenerate().isRecordToPojoMappers());
if (g.getGenerate().isRecordFromPojoUnmappers() != null)
generator.setGenerateRecordFromPojoUnmappers(g.getGenerate().isRecordFromPojoUnmappers());
if (g.getGenerate().isPojos() != null)
generator.setGeneratePojos(g.getGenerate().isPojos());
if (g.getGenerate().isImmutablePojos() != null)

View File

@ -242,6 +242,16 @@ public interface Generator {
*/
void setGenerateRecordToPojoMappers(boolean generateRecordToPojoMappers);
/**
* Whether out of the box record from POJO unmappers should be generated.
*/
boolean generateRecordFromPojoUnmappers();
/**
* Whether out of the box record from POJO unmappers should be generated.
*/
void setGenerateRecordFromPojoUnmappers(boolean generateRecordFromPojoUnmappers);
/**
* Whether POJO's should be generated in addition to records
*/

View File

@ -95,6 +95,7 @@ import org.jooq.Package;
import org.jooq.Parameter;
import org.jooq.Record;
import org.jooq.RecordMapper;
import org.jooq.RecordUnmapper;
import org.jooq.Result;
import org.jooq.Row;
import org.jooq.Schema;
@ -1637,6 +1638,40 @@ public class JavaGenerator extends AbstractGenerator {
}
}
if (generateRecordFromPojoUnmappers()) {
final String pojoName = out.ref(getStrategy().getFullJavaClassName(tableUdtOrEmbeddable, Mode.POJO));
// Feature not supported in the Scala generator
if (scala) {
}
else {
out.println();
out.tab(1).println("public %s<%s, %s> unmapper() {", RecordUnmapper.class, pojoName, className);
out.tab(2).println("return new %s<%s, %s>() {", RecordUnmapper.class, pojoName, className);
out.tab(3).override();
out.tab(3).println("public %s unmap(%s pojo) {", className, pojoName);
out.tab(4).println("%s result = new %s();", className, className);
out.println();
for (int i = 0; i < degree; i++) {
final TypedElementDefinition<?> column = columns.get(i);
final String columnGetter = getStrategy().getJavaGetterName(column, Mode.POJO);
final String columnSetter = getStrategy().getJavaSetterName(column, Mode.RECORD);
out.tab(4).println("result.%s(pojo.%s());", columnSetter, columnGetter);
}
out.println();
out.tab(4).println("result.attach(configuration());");
out.tab(4).println("return result;");
out.tab(3).println("}");
out.tab(2).println("};");
out.tab(1).println("}");
}
}
if (tableUdtOrEmbeddable instanceof TableDefinition)
generateRecordClassFooter((TableDefinition) tableUdtOrEmbeddable, out);
else if (tableUdtOrEmbeddable instanceof EmbeddableDefinition)

View File

@ -67,6 +67,8 @@ public class Generate implements Serializable
protected Boolean recordsImplementingRecordN = true;
@XmlElement(defaultValue = "true")
protected Boolean recordToPojoMappers = true;
@XmlElement(defaultValue = "true")
protected Boolean recordFromPojoUnmappers = true;
@XmlElement(defaultValue = "false")
protected Boolean pojos = false;
@XmlElement(defaultValue = "false")
@ -627,6 +629,30 @@ public class Generate implements Serializable
this.recordToPojoMappers = value;
}
/**
* If both {@link #records} and {@link #pojos} are generated, then an auxiliary default {@link org.jooq.RecordUnmapper} can be generated as well, that bypasses reflection.
*
* @return
* possible object is
* {@link Boolean }
*
*/
public Boolean isRecordFromPojoUnmappers() {
return recordFromPojoUnmappers;
}
/**
* Sets the value of the recordFromPojoUnmappers property.
*
* @param value
* allowed object is
* {@link Boolean }
*
*/
public void setRecordFromPojoUnmappers(Boolean value) {
this.recordFromPojoUnmappers = value;
}
/**
* Generate POJOs.
*
@ -1900,6 +1926,11 @@ public class Generate implements Serializable
return this;
}
public Generate withRecordFromPojoUnmappers(Boolean value) {
setRecordFromPojoUnmappers(value);
return this;
}
public Generate withPojos(Boolean value) {
setPojos(value);
return this;
@ -2238,6 +2269,11 @@ public class Generate implements Serializable
sb.append(recordToPojoMappers);
sb.append("</recordToPojoMappers>");
}
if (recordFromPojoUnmappers!= null) {
sb.append("<recordFromPojoUnmappers>");
sb.append(recordFromPojoUnmappers);
sb.append("</recordFromPojoUnmappers>");
}
if (pojos!= null) {
sb.append("<pojos>");
sb.append(pojos);
@ -2664,6 +2700,15 @@ public class Generate implements Serializable
return false;
}
}
if (recordFromPojoUnmappers == null) {
if (other.recordFromPojoUnmappers!= null) {
return false;
}
} else {
if (!recordFromPojoUnmappers.equals(other.recordFromPojoUnmappers)) {
return false;
}
}
if (pojos == null) {
if (other.pojos!= null) {
return false;
@ -3122,6 +3167,7 @@ public class Generate implements Serializable
result = ((prime*result)+((records == null)? 0 :records.hashCode()));
result = ((prime*result)+((recordsImplementingRecordN == null)? 0 :recordsImplementingRecordN.hashCode()));
result = ((prime*result)+((recordToPojoMappers == null)? 0 :recordToPojoMappers.hashCode()));
result = ((prime*result)+((recordFromPojoUnmappers == null)? 0 :recordFromPojoUnmappers.hashCode()));
result = ((prime*result)+((pojos == null)? 0 :pojos.hashCode()));
result = ((prime*result)+((pojosEqualsAndHashCode == null)? 0 :pojosEqualsAndHashCode.hashCode()));
result = ((prime*result)+((pojosToString == null)? 0 :pojosToString.hashCode()));

View File

@ -1079,6 +1079,10 @@ jOOQ version used for source code.]]></jxb:javadoc></jxb:property></appinfo></an
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[If both {@link #records} and {@link #pojos} are generated, then an auxiliary default {@link org.jooq.RecordMapper} can be generated as well, that bypasses reflection.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="recordFromPojoUnmappers" type="boolean" default="true" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[If both {@link #records} and {@link #pojos} are generated, then an auxiliary default {@link org.jooq.RecordUnmapper} can be generated as well, that bypasses reflection.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="pojos" type="boolean" default="false" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>