Skip to content

Commit 607c2ed

Browse files
authored
Merge pull request #6 from JavaWebStack/TimothyGillespie/adjustTypeMapping
Add byte, short, char and char array support and fix some errors
2 parents a717fb8 + 73b2589 commit 607c2ed

File tree

5 files changed

+107
-16
lines changed

5 files changed

+107
-16
lines changed

src/main/java/org/javawebstack/orm/SQLMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ private static Object getValue(ResultSet rs, Class<?> sqlType, String tableName,
9898
}
9999
if (sqlType.equals(String.class))
100100
return rs.getString(columnName);
101+
if (sqlType.equals(Short.class))
102+
return rs.getShort(columnName);
101103
if (sqlType.equals(Integer.class))
102104
return rs.getInt(columnName);
103105
if (sqlType.equals(Boolean.class))

src/main/java/org/javawebstack/orm/SQLType.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,33 @@
33
import java.sql.Date;
44
import java.sql.Timestamp;
55

6+
// The class passed as constructor determines
67
public enum SQLType {
78

8-
VARCHAR(String.class),
9-
BIGINT(Long.class),
10-
INT(Integer.class),
9+
// Divided by category and ordered by byte size (MySQL sizes)
1110
TINYINT(Boolean.class),
12-
DOUBLE(Double.class),
11+
SMALLINT(Short.class),
12+
MEDIUMINT(Integer.class),
13+
INT(Integer.class),
14+
BIGINT(Long.class),
15+
1316
FLOAT(Float.class),
17+
DOUBLE(Double.class),
18+
19+
// No native char method except for a char stream
20+
CHAR(String.class),
21+
22+
VARCHAR(String.class),
23+
TINYTEXT(String.class),
1424
TEXT(String.class),
15-
TIMESTAMP(Timestamp.class),
25+
MEDIUMTEXT(String.class),
26+
LONGTEXT(String.class),
27+
1628
DATE(Date.class),
29+
TIMESTAMP(Timestamp.class),
30+
1731
ENUM(String.class),
32+
1833
VARBINARY(byte[].class);
1934

2035
private final Class<?> javaType;

src/main/java/org/javawebstack/orm/TableInfo.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.javawebstack.orm.util.Helper;
66
import org.javawebstack.orm.util.KeyType;
77

8+
import java.lang.reflect.Array;
89
import java.lang.reflect.Constructor;
910
import java.lang.reflect.Field;
1011
import java.lang.reflect.Modifier;
@@ -32,6 +33,11 @@ public class TableInfo {
3233
private final Map<String, String> filterable = new HashMap<>();
3334
private final List<String> searchable = new ArrayList<>();
3435

36+
private static final Class<?>[] appliesDefaultSize = {
37+
String.class,
38+
char[].class,
39+
};
40+
3541
public TableInfo(Class<? extends Model> model, ORMConfig config) throws ORMConfigurationException {
3642
this.config = config;
3743
this.modelClass = model;
@@ -71,10 +77,17 @@ public TableInfo(Class<? extends Model> model, ORMConfig config) throws ORMConfi
7177
}
7278
fields.put(fieldName, field);
7379
fieldConfigs.put(fieldName, fieldConfig);
74-
SQLType sqlType = config.getType(field.getType(), fieldConfig.size());
80+
81+
int fieldSize;
82+
if (Arrays.stream(appliesDefaultSize).anyMatch(type -> type.equals(field.getType())) && fieldConfig.size() == -1)
83+
fieldSize = config.getDefaultSize();
84+
else
85+
fieldSize = fieldConfig.size();
86+
87+
SQLType sqlType = config.getType(field.getType(), fieldSize);
7588
if (sqlType != null) {
7689
sqlTypes.put(fieldName, sqlType);
77-
sqlTypeParameters.put(fieldName, config.getTypeParameters(field.getType(), fieldConfig.size()));
90+
sqlTypeParameters.put(fieldName, config.getTypeParameters(field.getType(), fieldSize));
7891
}
7992
if (!sqlTypes.containsKey(fieldName))
8093
throw new ORMConfigurationException("Couldn't find type-mapper for '" + fieldName + "'!");

src/main/java/org/javawebstack/orm/mapper/DefaultMapper.java

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,22 @@
1010

1111
public class DefaultMapper implements TypeMapper {
1212

13+
// SOURCES:
14+
// TEXT Datatypes: https://www.mysqltutorial.org/mysql-text/
15+
private static final int BYTES_OVERHEAD_VARCHAR = 4;
16+
private static final int BYTES_OVERHEAD_TINYTEXT = 1;
17+
private static final int BYTES_OVERHEAD_TEXT = 2;
18+
private static final int BYTES_OVERHEAD_MEDIUMTEXT = 3;
19+
private static final int BYTES_OVERHEAD_LONGTEXT = 4;
20+
21+
// The max sizes given in the manual are in bytes. There are overheads which need to be subtracted.
22+
// The following values assume utf8mb4 encoding which uses 4 bytes per character and
23+
// further quarters the maximum column length accordingly.
24+
private static final long MAX_SIZE_VARCHAR = (long) Math.floor((65535 - BYTES_OVERHEAD_VARCHAR) / 4);
25+
private static final long MAX_SIZE_MEDIUMTEXT = (long) Math.floor((16777215 - BYTES_OVERHEAD_MEDIUMTEXT) / 4);
26+
private static final long MAX_SIZE_LONGTEXT = (long) Math.floor((4294967295L - BYTES_OVERHEAD_LONGTEXT) / 4);
27+
28+
1329
public Object mapToSQL(Object source, Class<?> type) {
1430
if (source == null)
1531
return null;
@@ -19,6 +35,10 @@ public Object mapToSQL(Object source, Class<?> type) {
1935
return Integer.valueOf(((Boolean) source) ? 1 : 0);
2036
if (type.equals(boolean.class))
2137
return Integer.valueOf(((boolean) source) ? 1 : 0);
38+
if (type.equals(byte.class))
39+
return Byte.valueOf((byte) source);
40+
if (type.equals(short.class))
41+
return Short.valueOf((short) source);
2242
if (type.equals(int.class))
2343
return Integer.valueOf((int) source);
2444
if (type.equals(long.class))
@@ -27,8 +47,15 @@ public Object mapToSQL(Object source, Class<?> type) {
2747
return Double.valueOf((double) source);
2848
if (type.equals(float.class))
2949
return Float.valueOf((float) source);
50+
if (type.equals(char[].class))
51+
return String.valueOf((char[]) source);
3052
if (type.equals(UUID.class))
3153
return source.toString();
54+
if (type.equals(Timestamp.class))
55+
return ((Timestamp) source).toString();
56+
if (type.equals(char.class))
57+
return String.valueOf((char) source);
58+
3259
return source;
3360
}
3461

@@ -41,26 +68,51 @@ public Object mapToJava(Object source, Class<?> type) {
4168
return UUID.fromString((String) source);
4269
if (type.equals(boolean.class))
4370
return ((Boolean) source).booleanValue();
44-
if (type.equals(long.class))
45-
return ((Long) source).longValue();
71+
if (type.equals(byte.class))
72+
return ((Byte) source).byteValue();
73+
if (type.equals(short.class))
74+
return ((Short) source).shortValue();
4675
if (type.equals(int.class))
4776
return ((Integer) source).intValue();
77+
if (type.equals(long.class))
78+
return ((Long) source).longValue();
4879
if (type.equals(double.class))
4980
return ((Double) source).doubleValue();
5081
if (type.equals(float.class))
5182
return ((Float) source).floatValue();
83+
if (type.equals(char[].class))
84+
return ((String) source).toCharArray();
85+
if (type.equals(char.class)) {
86+
String stringSource = (String) source;
87+
if (stringSource.length() != 1)
88+
return ' ';
89+
else
90+
return stringSource.charAt(0);
91+
}
5292
return source;
5393
}
5494

5595
public SQLType getType(Class<?> type, int size) {
56-
if (type.equals(String.class))
57-
return size > 255 || size < 1 ? SQLType.TEXT : SQLType.VARCHAR;
96+
if (type.equals(String.class) || type.equals(char[].class))
97+
// Upper limit of 4294967295 exceeds the int boundaries
98+
if (size > MAX_SIZE_MEDIUMTEXT)
99+
return SQLType.LONGTEXT;
100+
if (size > MAX_SIZE_VARCHAR)
101+
return SQLType.MEDIUMTEXT;
102+
if (size > 1)
103+
return SQLType.VARCHAR;
104+
if (size == 1)
105+
return SQLType.CHAR;
58106
if (type.equals(UUID.class))
59107
return SQLType.VARCHAR;
108+
if (type.equals(char.class))
109+
return SQLType.CHAR;
60110
if (type.isEnum())
61111
return SQLType.ENUM;
62-
if (type.equals(Boolean.class) || type.equals(boolean.class))
112+
if (type.equals(boolean.class) || type.equals(Boolean.class) || type.equals(byte.class) || type.equals(Byte.class))
63113
return SQLType.TINYINT;
114+
if (type.equals(short.class) || type.equals(Short.class))
115+
return SQLType.SMALLINT;
64116
if (type.equals(int.class) || type.equals(Integer.class))
65117
return SQLType.INT;
66118
if (type.equals(double.class) || type.equals(Double.class))
@@ -81,12 +133,14 @@ public SQLType getType(Class<?> type, int size) {
81133
public String getTypeParameters(Class<?> type, int size) {
82134
if (type.isEnum())
83135
return Arrays.stream(((Class<? extends Enum<?>>) type).getEnumConstants()).map(c -> "'" + c.name() + "'").collect(Collectors.joining(","));
84-
if (type.equals(String.class))
85-
return size > 255 || size < 1 ? null : String.valueOf(size);
136+
if (type.equals(String.class) || type.equals(char[].class))
137+
return size > MAX_SIZE_VARCHAR || size < 1 ? null : String.valueOf(size);
86138
if (type.equals(byte[].class))
87139
return String.valueOf(size > 0 ? size : 255);
88140
if (type.equals(UUID.class))
89141
return "36";
142+
if (type.equals(boolean.class) || type.equals(Boolean.class) || type.equals(char.class))
143+
return "1";
90144
return null;
91145
}
92146

src/test/java/org/javawebstack/orm/test/TypesTest.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public void testFields() throws ORMConfigurationException {
4040
model.exampleBoolean = true;
4141

4242
model.timestampTest = timestamp;
43+
44+
model.exampleCharPrimitive = 'C';
4345
model.save();
4446

4547
int id = model.id;
@@ -59,8 +61,10 @@ public void testFields() throws ORMConfigurationException {
5961
assertEquals(model.exampleLong, 999999999999999999L);
6062
assertEquals(model.exampleLongPrimitive, 999999999999999999L);
6163

62-
// TODO: Use
63-
assertNotNull(model.timestampTest);
64+
65+
assertEquals(model.timestampTest.getTime() / 1000, timestamp.getTime() / 1000);
66+
67+
assertEquals(model.exampleCharPrimitive, 'C');
6468

6569
model.exampleNull = "Text";
6670
model.save();
@@ -109,6 +113,9 @@ public static class ExampleModel extends Model {
109113
@Column
110114
public Timestamp timestampTest;
111115

116+
@Column
117+
public char exampleCharPrimitive;
118+
112119
public enum Type {
113120
ADMIN, USER, GUEST
114121
}

0 commit comments

Comments
 (0)