[#6411] Code generator should generate VARCHAR(length) and NUMBER(precision, scale) method

This commit is contained in:
lukaseder 2017-07-12 17:25:23 +02:00
parent ab65e8d532
commit 97b3c857d3

View File

@ -160,6 +160,17 @@ public class JavaGenerator extends AbstractGenerator {
*/
private static final Map<DataType<?>, String> SQLDATATYPE_LITERAL_LOOKUP;
/**
* [#6411] A set providing access to SQLDataTypes that can have length.
*/
private static final Set<String> SQLDATATYPE_WITH_LENGTH;
/**
* [#6411] A set providing access to SQLDataTypes that can have precision
* (and scale).
*/
private static final Set<String> SQLDATATYPE_WITH_PRECISION;
/**
* An overall stop watch to measure the speed of source code generation
*/
@ -202,6 +213,8 @@ public class JavaGenerator extends AbstractGenerator {
static {
SQLDATATYPE_LITERAL_LOOKUP = new IdentityHashMap<DataType<?>, String>();
SQLDATATYPE_WITH_LENGTH = new HashSet<String>();
SQLDATATYPE_WITH_PRECISION = new HashSet<String>();
try {
for (java.lang.reflect.Field f : SQLDataType.class.getFields()) {
@ -210,6 +223,21 @@ public class JavaGenerator extends AbstractGenerator {
Modifier.isFinal(f.getModifiers()))
SQLDATATYPE_LITERAL_LOOKUP.put((DataType<?>) f.get(SQLDataType.class), f.getName());
}
for (java.lang.reflect.Method m : SQLDataType.class.getMethods()) {
if (Modifier.isPublic(m.getModifiers()) &&
Modifier.isStatic(m.getModifiers()) &&
m.getParameterCount() == 2)
SQLDATATYPE_WITH_PRECISION.add(m.getName());
}
for (java.lang.reflect.Method m : SQLDataType.class.getMethods()) {
if (Modifier.isPublic(m.getModifiers()) &&
Modifier.isStatic(m.getModifiers()) &&
m.getParameterCount() == 1 &&
!SQLDATATYPE_WITH_PRECISION.contains(m.getName()))
SQLDATATYPE_WITH_LENGTH.add(m.getName());
}
}
catch (Exception e) {
log.warn(e);
@ -5657,16 +5685,26 @@ public class JavaGenerator extends AbstractGenerator {
sb.append(sqlDataTypeRef);
if (dataType.hasPrecision() && p > 0) {
sb.append(".precision(").append(p);
// [#6411] Call static method if available, rather than instance method
if (SQLDATATYPE_WITH_PRECISION.contains(literal))
sb.append('(').append(p);
else
sb.append(".precision(").append(p);
if (dataType.hasScale() && s > 0)
sb.append(", ").append(s);
sb.append(")");
sb.append(')');
}
if (dataType.hasLength() && l > 0)
sb.append(".length(").append(l).append(")");
// [#6411] Call static method if available, rather than instance method
if (SQLDATATYPE_WITH_LENGTH.contains(literal))
sb.append("(").append(l).append(")");
else
sb.append(".length(").append(l).append(")");
if (!dataType.nullable())
sb.append(".nullable(false)");