Skip to content

Commit ecc2cdb

Browse files
committed
feat: smallint[] support through ListArrayType
1 parent a533c18 commit ecc2cdb

5 files changed

Lines changed: 382 additions & 265 deletions

File tree

‎hypersistence-utils-hibernate-63/src/main/java/io/hypersistence/utils/hibernate/type/array/internal/ListArrayTypeDescriptor.java‎

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,22 @@
1414
import java.time.LocalDate;
1515
import java.time.LocalDateTime;
1616
import java.util.*;
17+
import java.util.ArrayList;
18+
import java.util.Arrays;
19+
import java.util.Collection;
20+
import java.util.Collections;
21+
import java.util.Date;
22+
import java.util.LinkedHashSet;
23+
import java.util.List;
24+
import java.util.Properties;
25+
import java.util.Set;
26+
import java.util.SortedSet;
27+
import java.util.TreeSet;
28+
import java.util.UUID;
1729

1830
/**
1931
* @author Vlad Mihalcea
32+
* @author Baptiste Masoud
2033
*/
2134
public class ListArrayTypeDescriptor extends AbstractArrayTypeDescriptor<Collection> {
2235

@@ -106,14 +119,16 @@ public void setParameterValues(Properties parameters) {
106119
}
107120
Class arrayElementClass = ReflectionUtils.getClass(genericType.getTypeName());
108121
setArrayObjectClass(
109-
arrayElementClass.isArray() ?
110-
arrayElementClass :
111-
ArrayUtil.toArrayClass(arrayElementClass)
122+
arrayElementClass.isArray() ?
123+
arrayElementClass :
124+
ArrayUtil.toArrayClass(arrayElementClass)
112125
);
113126
sqlArrayType = parameters.getProperty(AbstractArrayType.SQL_ARRAY_TYPE);
114127
if (sqlArrayType == null) {
115128
if (Integer.class.isAssignableFrom(arrayElementClass)) {
116129
sqlArrayType = "integer";
130+
} else if (Short.class.isAssignableFrom(arrayElementClass)) {
131+
sqlArrayType = "smallint";
117132
} else if (Long.class.isAssignableFrom(arrayElementClass)) {
118133
sqlArrayType = "bigint";
119134
} else if (Double.class.isAssignableFrom(arrayElementClass)) {
@@ -137,7 +152,7 @@ public void setParameterValues(Properties parameters) {
137152
} else {
138153
throw new UnsupportedOperationException("The property " + propertyName + " in the " + entityClass + " entity is not parameterized!");
139154
}
140-
}
155+
}
141156

142157
private Collection newPropertyCollectionInstance() {
143158
if (propertyClass == null || List.class.isAssignableFrom(propertyClass)) {
@@ -149,4 +164,4 @@ private Collection newPropertyCollectionInstance() {
149164
}
150165
throw new UnsupportedOperationException("The property " + propertyName + " in the " + entityClass + " entity is not supported by the ListArrayType!");
151166
}
152-
}
167+
}

‎hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/DefaultEmptyListArrayTypeTest.java‎

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,23 @@
99
import org.hibernate.annotations.Type;
1010
import org.junit.Test;
1111

12-
import javax.sql.DataSource;
13-
import java.sql.Connection;
14-
import java.sql.SQLException;
15-
import java.sql.Statement;
1612
import java.util.ArrayList;
1713
import java.util.Date;
1814
import java.util.List;
1915
import java.util.UUID;
2016

2117
import static org.junit.Assert.assertArrayEquals;
22-
import static org.junit.Assert.fail;
2318

2419
/**
2520
* @author Vlad Mihalcea
21+
* @author Baptiste Masoud
2622
*/
2723
public class DefaultEmptyListArrayTypeTest extends AbstractPostgreSQLIntegrationTest {
2824

2925
@Override
3026
protected Class<?>[] entities() {
3127
return new Class<?>[]{
32-
Event.class,
28+
Event.class,
3329
};
3430
}
3531

@@ -59,6 +55,7 @@ public void testEmptyArrays() {
5955
assertArrayEquals(new UUID[]{}, event.getSensorIds().toArray());
6056
assertArrayEquals(new String[]{}, event.getSensorNames().toArray());
6157
assertArrayEquals(new Integer[]{}, event.getSensorValues().toArray());
58+
assertArrayEquals(new Short[]{}, event.getSensorShortValues().toArray());
6259
assertArrayEquals(new Long[]{}, event.getSensorLongValues().toArray());
6360
assertArrayEquals(new SensorState[]{}, event.getSensorStates().toArray());
6461
assertArrayEquals(new Date[]{}, event.getDateValues().toArray());
@@ -75,30 +72,34 @@ public static class Event extends BaseEntity {
7572

7673
@Type(ListArrayType.class)
7774
@Column(name = "sensor_names", columnDefinition = "text[]")
78-
private List<String> sensorNames = new ArrayList<>();;
75+
private List<String> sensorNames = new ArrayList<>();
7976

8077
@Type(ListArrayType.class)
8178
@Column(name = "sensor_values", columnDefinition = "integer[]")
82-
private List<Integer> sensorValues = new ArrayList<>();;
79+
private List<Integer> sensorValues = new ArrayList<>();
80+
81+
@Type(ListArrayType.class)
82+
@Column(name = "sensor_short_values", columnDefinition = "smallint[]")
83+
private List<Short> sensorShortValues = new ArrayList<>();
8384

8485
@Type(ListArrayType.class)
8586
@Column(name = "sensor_long_values", columnDefinition = "bigint[]")
86-
private List<Long> sensorLongValues = new ArrayList<>();;
87+
private List<Long> sensorLongValues = new ArrayList<>();
8788

8889
@Type(
89-
value = ListArrayType.class,
90-
parameters = @Parameter(name = ListArrayType.SQL_ARRAY_TYPE, value = "sensor_state")
90+
value = ListArrayType.class,
91+
parameters = @Parameter(name = ListArrayType.SQL_ARRAY_TYPE, value = "sensor_state")
9192
)
9293
@Column(name = "sensor_states", columnDefinition = "sensor_state[]")
93-
private List<SensorState> sensorStates = new ArrayList<>();;
94+
private List<SensorState> sensorStates = new ArrayList<>();
9495

9596
@Type(ListArrayType.class)
9697
@Column(name = "date_values", columnDefinition = "date[]")
97-
private List<Date> dateValues = new ArrayList<>();;
98+
private List<Date> dateValues = new ArrayList<>();
9899

99100
@Type(ListArrayType.class)
100101
@Column(name = "timestamp_values", columnDefinition = "timestamp[]")
101-
private List<Date> timestampValues = new ArrayList<>();;
102+
private List<Date> timestampValues = new ArrayList<>();
102103

103104
public List<UUID> getSensorIds() {
104105
return sensorIds;
@@ -124,6 +125,14 @@ public void setSensorValues(List<Integer> sensorValues) {
124125
this.sensorValues = sensorValues;
125126
}
126127

128+
public List<Short> getSensorShortValues() {
129+
return sensorShortValues;
130+
}
131+
132+
public void setSensorShortValues(List<Short> sensorShortValues) {
133+
this.sensorShortValues = sensorShortValues;
134+
}
135+
127136
public List<Long> getSensorLongValues() {
128137
return sensorLongValues;
129138
}
@@ -160,4 +169,4 @@ public void setTimestampValues(List<Date> timestampValues) {
160169
public enum SensorState {
161170
ONLINE, OFFLINE, UNKNOWN;
162171
}
163-
}
172+
}

‎hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/EhcacheListArrayTypeTest.java‎

Lines changed: 55 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,38 @@
22

33
import io.hypersistence.utils.hibernate.type.model.BaseEntity;
44
import io.hypersistence.utils.hibernate.util.AbstractPostgreSQLIntegrationTest;
5-
import jakarta.persistence.*;
5+
import jakarta.persistence.Cacheable;
6+
import jakarta.persistence.Column;
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.Table;
9+
import jakarta.persistence.Tuple;
610
import org.hibernate.annotations.CacheConcurrencyStrategy;
711
import org.hibernate.annotations.Parameter;
812
import org.hibernate.annotations.Type;
913
import org.junit.Test;
1014

11-
import javax.sql.DataSource;
12-
import java.sql.Connection;
13-
import java.sql.SQLException;
14-
import java.sql.Statement;
1515
import java.time.LocalDate;
1616
import java.time.ZoneId;
17-
import java.util.*;
17+
import java.util.Arrays;
18+
import java.util.Collections;
19+
import java.util.Date;
20+
import java.util.List;
21+
import java.util.Properties;
22+
import java.util.UUID;
1823

19-
import static org.junit.Assert.*;
24+
import static org.junit.Assert.assertArrayEquals;
25+
import static org.junit.Assert.assertEquals;
2026

2127
/**
2228
* @author Vlad Mihalcea
29+
* @author Baptiste Masoud
2330
*/
2431
public class EhcacheListArrayTypeTest extends AbstractPostgreSQLIntegrationTest {
2532

2633
@Override
2734
protected Class<?>[] entities() {
2835
return new Class<?>[]{
29-
Event.class,
36+
Event.class,
3037
};
3138
}
3239

@@ -59,6 +66,7 @@ public void test() {
5966
event.setSensorIds(Arrays.asList(UUID.fromString("c65a3bcb-8b36-46d4-bddb-ae96ad016eb1"), UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800")));
6067
event.setSensorNames(Arrays.asList("Temperature", "Pressure"));
6168
event.setSensorValues(Arrays.asList(12, 756));
69+
event.setSensorShortValues(Arrays.asList((short) 42, (short) 69));
6270
event.setSensorLongValues(Arrays.asList(42L, 9223372036854775800L));
6371
event.setSensorStates(Arrays.asList(SensorState.ONLINE, SensorState.OFFLINE, SensorState.ONLINE, SensorState.UNKNOWN));
6472
event.setDateValues(Arrays.asList(date1, date2));
@@ -72,6 +80,7 @@ public void test() {
7280
assertArrayEquals(new UUID[]{UUID.fromString("c65a3bcb-8b36-46d4-bddb-ae96ad016eb1"), UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800")}, event.getSensorIds().toArray());
7381
assertArrayEquals(new String[]{"Temperature", "Pressure"}, event.getSensorNames().toArray());
7482
assertArrayEquals(new Integer[]{12, 756}, event.getSensorValues().toArray());
83+
assertArrayEquals(new Short[]{42, 69}, event.getSensorShortValues().toArray());
7584
assertArrayEquals(new Long[]{42L, 9223372036854775800L}, event.getSensorLongValues().toArray());
7685
assertArrayEquals(new SensorState[]{SensorState.ONLINE, SensorState.OFFLINE, SensorState.ONLINE, SensorState.UNKNOWN}, event.getSensorStates().toArray());
7786
assertArrayEquals(new Date[]{date1, date2}, event.getDateValues().toArray());
@@ -80,19 +89,19 @@ public void test() {
8089

8190
doInJPA(entityManager -> {
8291
List<Tuple> events = entityManager.createNativeQuery(
83-
"select " +
84-
" id, " +
85-
" sensor_ids, " +
86-
" sensor_names, " +
87-
" sensor_values " +
88-
"from event " +
89-
"where id >= :id", Tuple.class)
90-
.setParameter("id", 0)
91-
.unwrap(org.hibernate.query.NativeQuery.class)
92-
.addScalar("sensor_ids", UUID[].class)
93-
.addScalar("sensor_names", String[].class)
94-
.addScalar("sensor_values", int[].class)
95-
.getResultList();
92+
"select " +
93+
" id, " +
94+
" sensor_ids, " +
95+
" sensor_names, " +
96+
" sensor_values " +
97+
"from event " +
98+
"where id >= :id", Tuple.class)
99+
.setParameter("id", 0)
100+
.unwrap(org.hibernate.query.NativeQuery.class)
101+
.addScalar("sensor_ids", UUID[].class)
102+
.addScalar("sensor_names", String[].class)
103+
.addScalar("sensor_values", int[].class)
104+
.getResultList();
96105

97106
assertEquals(2, events.size());
98107
});
@@ -113,6 +122,7 @@ public void testMixingNullValues() {
113122
event.setSensorIds(Arrays.asList(null, UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800")));
114123
event.setSensorNames(Arrays.asList("Temperature", null));
115124
event.setSensorValues(Arrays.asList(null, 756));
125+
event.setSensorShortValues(Arrays.asList(null, (short) 69));
116126
event.setSensorLongValues(Arrays.asList(null, 9223372036854775800L));
117127
event.setSensorStates(Arrays.asList(null, SensorState.OFFLINE, SensorState.ONLINE, null));
118128
event.setDateValues(Arrays.asList(null, date));
@@ -126,16 +136,17 @@ public void testMixingNullValues() {
126136
assertArrayEquals(new UUID[]{null, UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800")}, event.getSensorIds().toArray());
127137
assertArrayEquals(new String[]{"Temperature", null}, event.getSensorNames().toArray());
128138
assertArrayEquals(new Integer[]{null, 756}, event.getSensorValues().toArray());
139+
assertArrayEquals(new Short[]{null, 69}, event.getSensorShortValues().toArray());
129140
assertArrayEquals(new Long[]{null, 9223372036854775800L}, event.getSensorLongValues().toArray());
130141
assertArrayEquals(new SensorState[]{null, SensorState.OFFLINE, SensorState.ONLINE, null}, event.getSensorStates().toArray());
131142
assertArrayEquals(new Date[]{null, date}, event.getDateValues().toArray());
132143
assertArrayEquals(new Date[]{null, date}, event.getTimestampValues().toArray());
133144
});
134145
}
135-
146+
136147
@Test
137148
public void testNullValues() {
138-
149+
139150
doInJPA(entityManager -> {
140151
Event nullEvent = new Event();
141152
nullEvent.setId(0L);
@@ -146,6 +157,7 @@ public void testNullValues() {
146157
event.setSensorIds(Arrays.asList(null, null));
147158
event.setSensorNames(Arrays.asList(null, null));
148159
event.setSensorValues(Arrays.asList(null, null));
160+
event.setSensorShortValues(Arrays.asList(null, null));
149161
event.setSensorLongValues(Arrays.asList(null, null));
150162
event.setSensorStates(Arrays.asList(null, null));
151163
event.setDateValues(Arrays.asList(null, null));
@@ -159,6 +171,7 @@ public void testNullValues() {
159171
assertArrayEquals(new UUID[]{null, null}, event.getSensorIds().toArray());
160172
assertArrayEquals(new String[]{null, null}, event.getSensorNames().toArray());
161173
assertArrayEquals(new Integer[]{null, null}, event.getSensorValues().toArray());
174+
assertArrayEquals(new Short[]{null, null}, event.getSensorShortValues().toArray());
162175
assertArrayEquals(new Long[]{null, null}, event.getSensorLongValues().toArray());
163176
assertArrayEquals(new SensorState[]{null, null}, event.getSensorStates().toArray());
164177
assertArrayEquals(new Date[]{null, null}, event.getDateValues().toArray());
@@ -179,6 +192,7 @@ public void testEmptyArrays() {
179192
event.setSensorIds(Collections.emptyList());
180193
event.setSensorNames(Collections.emptyList());
181194
event.setSensorValues(Collections.emptyList());
195+
event.setSensorShortValues(Collections.emptyList());
182196
event.setSensorLongValues(Collections.emptyList());
183197
event.setSensorStates(Collections.emptyList());
184198
event.setDateValues(Collections.emptyList());
@@ -192,6 +206,7 @@ public void testEmptyArrays() {
192206
assertArrayEquals(new UUID[]{}, event.getSensorIds().toArray());
193207
assertArrayEquals(new String[]{}, event.getSensorNames().toArray());
194208
assertArrayEquals(new Integer[]{}, event.getSensorValues().toArray());
209+
assertArrayEquals(new Short[]{}, event.getSensorShortValues().toArray());
195210
assertArrayEquals(new Long[]{}, event.getSensorLongValues().toArray());
196211
assertArrayEquals(new SensorState[]{}, event.getSensorStates().toArray());
197212
assertArrayEquals(new Date[]{}, event.getDateValues().toArray());
@@ -217,6 +232,8 @@ public void testNullArrays() {
217232

218233
assertEquals(null, event.getSensorIds());
219234
assertEquals(null, event.getSensorNames());
235+
assertEquals(null, event.getSensorValues());
236+
assertEquals(null, event.getSensorShortValues());
220237
assertEquals(null, event.getSensorLongValues());
221238
assertEquals(null, event.getSensorStates());
222239
assertEquals(null, event.getDateValues());
@@ -241,13 +258,17 @@ public static class Event extends BaseEntity {
241258
@Column(name = "sensor_values", columnDefinition = "integer[]")
242259
private List<Integer> sensorValues;
243260

261+
@Type(ListArrayType.class)
262+
@Column(name = "sensor_short_values", columnDefinition = "smallint[]")
263+
private List<Short> sensorShortValues;
264+
244265
@Type(ListArrayType.class)
245266
@Column(name = "sensor_long_values", columnDefinition = "bigint[]")
246267
private List<Long> sensorLongValues;
247268

248269
@Type(
249-
value = ListArrayType.class,
250-
parameters = @Parameter(name = ListArrayType.SQL_ARRAY_TYPE, value = "sensor_state")
270+
value = ListArrayType.class,
271+
parameters = @Parameter(name = ListArrayType.SQL_ARRAY_TYPE, value = "sensor_state")
251272
)
252273
@Column(name = "sensor_states", columnDefinition = "sensor_state[]")
253274
private List<SensorState> sensorStates;
@@ -284,6 +305,14 @@ public void setSensorValues(List<Integer> sensorValues) {
284305
this.sensorValues = sensorValues;
285306
}
286307

308+
public List<Short> getSensorShortValues() {
309+
return sensorShortValues;
310+
}
311+
312+
public void setSensorShortValues(List<Short> sensorShortValues) {
313+
this.sensorShortValues = sensorShortValues;
314+
}
315+
287316
public List<Long> getSensorLongValues() {
288317
return sensorLongValues;
289318
}
@@ -320,4 +349,4 @@ public void setTimestampValues(List<Date> timestampValues) {
320349
public enum SensorState {
321350
ONLINE, OFFLINE, UNKNOWN;
322351
}
323-
}
352+
}

0 commit comments

Comments
 (0)