From ecc2cdb9bae7f6281f4dbb238486937ec11f392b Mon Sep 17 00:00:00 2001 From: Baptiste Masoud <66852473+tizba@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:40:26 +0100 Subject: [PATCH] feat: smallint[] support through ListArrayType --- .../internal/ListArrayTypeDescriptor.java | 25 +- .../array/DefaultEmptyListArrayTypeTest.java | 39 +- .../type/array/EhcacheListArrayTypeTest.java | 81 ++- .../type/array/ListArrayTypeTest.java | 477 ++++++++++-------- .../MappedSuperclassListArrayTypeTest.java | 25 +- 5 files changed, 382 insertions(+), 265 deletions(-) diff --git a/hypersistence-utils-hibernate-63/src/main/java/io/hypersistence/utils/hibernate/type/array/internal/ListArrayTypeDescriptor.java b/hypersistence-utils-hibernate-63/src/main/java/io/hypersistence/utils/hibernate/type/array/internal/ListArrayTypeDescriptor.java index 70d088c20..2184750fd 100644 --- a/hypersistence-utils-hibernate-63/src/main/java/io/hypersistence/utils/hibernate/type/array/internal/ListArrayTypeDescriptor.java +++ b/hypersistence-utils-hibernate-63/src/main/java/io/hypersistence/utils/hibernate/type/array/internal/ListArrayTypeDescriptor.java @@ -14,9 +14,22 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Properties; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.UUID; /** * @author Vlad Mihalcea + * @author Baptiste Masoud */ public class ListArrayTypeDescriptor extends AbstractArrayTypeDescriptor { @@ -106,14 +119,16 @@ public void setParameterValues(Properties parameters) { } Class arrayElementClass = ReflectionUtils.getClass(genericType.getTypeName()); setArrayObjectClass( - arrayElementClass.isArray() ? - arrayElementClass : - ArrayUtil.toArrayClass(arrayElementClass) + arrayElementClass.isArray() ? + arrayElementClass : + ArrayUtil.toArrayClass(arrayElementClass) ); sqlArrayType = parameters.getProperty(AbstractArrayType.SQL_ARRAY_TYPE); if (sqlArrayType == null) { if (Integer.class.isAssignableFrom(arrayElementClass)) { sqlArrayType = "integer"; + } else if (Short.class.isAssignableFrom(arrayElementClass)) { + sqlArrayType = "smallint"; } else if (Long.class.isAssignableFrom(arrayElementClass)) { sqlArrayType = "bigint"; } else if (Double.class.isAssignableFrom(arrayElementClass)) { @@ -137,7 +152,7 @@ public void setParameterValues(Properties parameters) { } else { throw new UnsupportedOperationException("The property " + propertyName + " in the " + entityClass + " entity is not parameterized!"); } - } + } private Collection newPropertyCollectionInstance() { if (propertyClass == null || List.class.isAssignableFrom(propertyClass)) { @@ -149,4 +164,4 @@ private Collection newPropertyCollectionInstance() { } throw new UnsupportedOperationException("The property " + propertyName + " in the " + entityClass + " entity is not supported by the ListArrayType!"); } -} +} \ No newline at end of file diff --git a/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/DefaultEmptyListArrayTypeTest.java b/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/DefaultEmptyListArrayTypeTest.java index 3123232ad..b16003b6b 100644 --- a/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/DefaultEmptyListArrayTypeTest.java +++ b/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/DefaultEmptyListArrayTypeTest.java @@ -9,27 +9,23 @@ import org.hibernate.annotations.Type; import org.junit.Test; -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Statement; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.fail; /** * @author Vlad Mihalcea + * @author Baptiste Masoud */ public class DefaultEmptyListArrayTypeTest extends AbstractPostgreSQLIntegrationTest { @Override protected Class[] entities() { return new Class[]{ - Event.class, + Event.class, }; } @@ -59,6 +55,7 @@ public void testEmptyArrays() { assertArrayEquals(new UUID[]{}, event.getSensorIds().toArray()); assertArrayEquals(new String[]{}, event.getSensorNames().toArray()); assertArrayEquals(new Integer[]{}, event.getSensorValues().toArray()); + assertArrayEquals(new Short[]{}, event.getSensorShortValues().toArray()); assertArrayEquals(new Long[]{}, event.getSensorLongValues().toArray()); assertArrayEquals(new SensorState[]{}, event.getSensorStates().toArray()); assertArrayEquals(new Date[]{}, event.getDateValues().toArray()); @@ -75,30 +72,34 @@ public static class Event extends BaseEntity { @Type(ListArrayType.class) @Column(name = "sensor_names", columnDefinition = "text[]") - private List sensorNames = new ArrayList<>();; + private List sensorNames = new ArrayList<>(); @Type(ListArrayType.class) @Column(name = "sensor_values", columnDefinition = "integer[]") - private List sensorValues = new ArrayList<>();; + private List sensorValues = new ArrayList<>(); + + @Type(ListArrayType.class) + @Column(name = "sensor_short_values", columnDefinition = "smallint[]") + private List sensorShortValues = new ArrayList<>(); @Type(ListArrayType.class) @Column(name = "sensor_long_values", columnDefinition = "bigint[]") - private List sensorLongValues = new ArrayList<>();; + private List sensorLongValues = new ArrayList<>(); @Type( - value = ListArrayType.class, - parameters = @Parameter(name = ListArrayType.SQL_ARRAY_TYPE, value = "sensor_state") + value = ListArrayType.class, + parameters = @Parameter(name = ListArrayType.SQL_ARRAY_TYPE, value = "sensor_state") ) @Column(name = "sensor_states", columnDefinition = "sensor_state[]") - private List sensorStates = new ArrayList<>();; + private List sensorStates = new ArrayList<>(); @Type(ListArrayType.class) @Column(name = "date_values", columnDefinition = "date[]") - private List dateValues = new ArrayList<>();; + private List dateValues = new ArrayList<>(); @Type(ListArrayType.class) @Column(name = "timestamp_values", columnDefinition = "timestamp[]") - private List timestampValues = new ArrayList<>();; + private List timestampValues = new ArrayList<>(); public List getSensorIds() { return sensorIds; @@ -124,6 +125,14 @@ public void setSensorValues(List sensorValues) { this.sensorValues = sensorValues; } + public List getSensorShortValues() { + return sensorShortValues; + } + + public void setSensorShortValues(List sensorShortValues) { + this.sensorShortValues = sensorShortValues; + } + public List getSensorLongValues() { return sensorLongValues; } @@ -160,4 +169,4 @@ public void setTimestampValues(List timestampValues) { public enum SensorState { ONLINE, OFFLINE, UNKNOWN; } -} +} \ No newline at end of file diff --git a/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/EhcacheListArrayTypeTest.java b/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/EhcacheListArrayTypeTest.java index e4fc9e912..9125bae44 100644 --- a/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/EhcacheListArrayTypeTest.java +++ b/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/EhcacheListArrayTypeTest.java @@ -2,31 +2,38 @@ import io.hypersistence.utils.hibernate.type.model.BaseEntity; import io.hypersistence.utils.hibernate.util.AbstractPostgreSQLIntegrationTest; -import jakarta.persistence.*; +import jakarta.persistence.Cacheable; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jakarta.persistence.Tuple; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Parameter; import org.hibernate.annotations.Type; import org.junit.Test; -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Statement; import java.time.LocalDate; import java.time.ZoneId; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Properties; +import java.util.UUID; -import static org.junit.Assert.*; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; /** * @author Vlad Mihalcea + * @author Baptiste Masoud */ public class EhcacheListArrayTypeTest extends AbstractPostgreSQLIntegrationTest { @Override protected Class[] entities() { return new Class[]{ - Event.class, + Event.class, }; } @@ -59,6 +66,7 @@ public void test() { event.setSensorIds(Arrays.asList(UUID.fromString("c65a3bcb-8b36-46d4-bddb-ae96ad016eb1"), UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800"))); event.setSensorNames(Arrays.asList("Temperature", "Pressure")); event.setSensorValues(Arrays.asList(12, 756)); + event.setSensorShortValues(Arrays.asList((short) 42, (short) 69)); event.setSensorLongValues(Arrays.asList(42L, 9223372036854775800L)); event.setSensorStates(Arrays.asList(SensorState.ONLINE, SensorState.OFFLINE, SensorState.ONLINE, SensorState.UNKNOWN)); event.setDateValues(Arrays.asList(date1, date2)); @@ -72,6 +80,7 @@ public void test() { assertArrayEquals(new UUID[]{UUID.fromString("c65a3bcb-8b36-46d4-bddb-ae96ad016eb1"), UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800")}, event.getSensorIds().toArray()); assertArrayEquals(new String[]{"Temperature", "Pressure"}, event.getSensorNames().toArray()); assertArrayEquals(new Integer[]{12, 756}, event.getSensorValues().toArray()); + assertArrayEquals(new Short[]{42, 69}, event.getSensorShortValues().toArray()); assertArrayEquals(new Long[]{42L, 9223372036854775800L}, event.getSensorLongValues().toArray()); assertArrayEquals(new SensorState[]{SensorState.ONLINE, SensorState.OFFLINE, SensorState.ONLINE, SensorState.UNKNOWN}, event.getSensorStates().toArray()); assertArrayEquals(new Date[]{date1, date2}, event.getDateValues().toArray()); @@ -80,19 +89,19 @@ public void test() { doInJPA(entityManager -> { List events = entityManager.createNativeQuery( - "select " + - " id, " + - " sensor_ids, " + - " sensor_names, " + - " sensor_values " + - "from event " + - "where id >= :id", Tuple.class) - .setParameter("id", 0) - .unwrap(org.hibernate.query.NativeQuery.class) - .addScalar("sensor_ids", UUID[].class) - .addScalar("sensor_names", String[].class) - .addScalar("sensor_values", int[].class) - .getResultList(); + "select " + + " id, " + + " sensor_ids, " + + " sensor_names, " + + " sensor_values " + + "from event " + + "where id >= :id", Tuple.class) + .setParameter("id", 0) + .unwrap(org.hibernate.query.NativeQuery.class) + .addScalar("sensor_ids", UUID[].class) + .addScalar("sensor_names", String[].class) + .addScalar("sensor_values", int[].class) + .getResultList(); assertEquals(2, events.size()); }); @@ -113,6 +122,7 @@ public void testMixingNullValues() { event.setSensorIds(Arrays.asList(null, UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800"))); event.setSensorNames(Arrays.asList("Temperature", null)); event.setSensorValues(Arrays.asList(null, 756)); + event.setSensorShortValues(Arrays.asList(null, (short) 69)); event.setSensorLongValues(Arrays.asList(null, 9223372036854775800L)); event.setSensorStates(Arrays.asList(null, SensorState.OFFLINE, SensorState.ONLINE, null)); event.setDateValues(Arrays.asList(null, date)); @@ -126,16 +136,17 @@ public void testMixingNullValues() { assertArrayEquals(new UUID[]{null, UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800")}, event.getSensorIds().toArray()); assertArrayEquals(new String[]{"Temperature", null}, event.getSensorNames().toArray()); assertArrayEquals(new Integer[]{null, 756}, event.getSensorValues().toArray()); + assertArrayEquals(new Short[]{null, 69}, event.getSensorShortValues().toArray()); assertArrayEquals(new Long[]{null, 9223372036854775800L}, event.getSensorLongValues().toArray()); assertArrayEquals(new SensorState[]{null, SensorState.OFFLINE, SensorState.ONLINE, null}, event.getSensorStates().toArray()); assertArrayEquals(new Date[]{null, date}, event.getDateValues().toArray()); assertArrayEquals(new Date[]{null, date}, event.getTimestampValues().toArray()); }); } - + @Test public void testNullValues() { - + doInJPA(entityManager -> { Event nullEvent = new Event(); nullEvent.setId(0L); @@ -146,6 +157,7 @@ public void testNullValues() { event.setSensorIds(Arrays.asList(null, null)); event.setSensorNames(Arrays.asList(null, null)); event.setSensorValues(Arrays.asList(null, null)); + event.setSensorShortValues(Arrays.asList(null, null)); event.setSensorLongValues(Arrays.asList(null, null)); event.setSensorStates(Arrays.asList(null, null)); event.setDateValues(Arrays.asList(null, null)); @@ -159,6 +171,7 @@ public void testNullValues() { assertArrayEquals(new UUID[]{null, null}, event.getSensorIds().toArray()); assertArrayEquals(new String[]{null, null}, event.getSensorNames().toArray()); assertArrayEquals(new Integer[]{null, null}, event.getSensorValues().toArray()); + assertArrayEquals(new Short[]{null, null}, event.getSensorShortValues().toArray()); assertArrayEquals(new Long[]{null, null}, event.getSensorLongValues().toArray()); assertArrayEquals(new SensorState[]{null, null}, event.getSensorStates().toArray()); assertArrayEquals(new Date[]{null, null}, event.getDateValues().toArray()); @@ -179,6 +192,7 @@ public void testEmptyArrays() { event.setSensorIds(Collections.emptyList()); event.setSensorNames(Collections.emptyList()); event.setSensorValues(Collections.emptyList()); + event.setSensorShortValues(Collections.emptyList()); event.setSensorLongValues(Collections.emptyList()); event.setSensorStates(Collections.emptyList()); event.setDateValues(Collections.emptyList()); @@ -192,6 +206,7 @@ public void testEmptyArrays() { assertArrayEquals(new UUID[]{}, event.getSensorIds().toArray()); assertArrayEquals(new String[]{}, event.getSensorNames().toArray()); assertArrayEquals(new Integer[]{}, event.getSensorValues().toArray()); + assertArrayEquals(new Short[]{}, event.getSensorShortValues().toArray()); assertArrayEquals(new Long[]{}, event.getSensorLongValues().toArray()); assertArrayEquals(new SensorState[]{}, event.getSensorStates().toArray()); assertArrayEquals(new Date[]{}, event.getDateValues().toArray()); @@ -217,6 +232,8 @@ public void testNullArrays() { assertEquals(null, event.getSensorIds()); assertEquals(null, event.getSensorNames()); + assertEquals(null, event.getSensorValues()); + assertEquals(null, event.getSensorShortValues()); assertEquals(null, event.getSensorLongValues()); assertEquals(null, event.getSensorStates()); assertEquals(null, event.getDateValues()); @@ -241,13 +258,17 @@ public static class Event extends BaseEntity { @Column(name = "sensor_values", columnDefinition = "integer[]") private List sensorValues; + @Type(ListArrayType.class) + @Column(name = "sensor_short_values", columnDefinition = "smallint[]") + private List sensorShortValues; + @Type(ListArrayType.class) @Column(name = "sensor_long_values", columnDefinition = "bigint[]") private List sensorLongValues; @Type( - value = ListArrayType.class, - parameters = @Parameter(name = ListArrayType.SQL_ARRAY_TYPE, value = "sensor_state") + value = ListArrayType.class, + parameters = @Parameter(name = ListArrayType.SQL_ARRAY_TYPE, value = "sensor_state") ) @Column(name = "sensor_states", columnDefinition = "sensor_state[]") private List sensorStates; @@ -284,6 +305,14 @@ public void setSensorValues(List sensorValues) { this.sensorValues = sensorValues; } + public List getSensorShortValues() { + return sensorShortValues; + } + + public void setSensorShortValues(List sensorShortValues) { + this.sensorShortValues = sensorShortValues; + } + public List getSensorLongValues() { return sensorLongValues; } @@ -320,4 +349,4 @@ public void setTimestampValues(List timestampValues) { public enum SensorState { ONLINE, OFFLINE, UNKNOWN; } -} +} \ No newline at end of file diff --git a/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/ListArrayTypeTest.java b/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/ListArrayTypeTest.java index 8ad0916ad..f30e7258a 100644 --- a/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/ListArrayTypeTest.java +++ b/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/ListArrayTypeTest.java @@ -1,7 +1,11 @@ package io.hypersistence.utils.hibernate.type.array; import io.hypersistence.utils.hibernate.util.AbstractPostgreSQLIntegrationTest; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.Tuple; import jakarta.persistence.metamodel.ManagedType; import org.hibernate.annotations.Parameter; import org.hibernate.annotations.Type; @@ -12,19 +16,33 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.*; - -import static org.junit.Assert.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Properties; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.UUID; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; /** * @author Vlad Mihalcea + * @author Baptiste Masoud */ public class ListArrayTypeTest extends AbstractPostgreSQLIntegrationTest { @Override protected Class[] entities() { return new Class[]{ - Event.class, + Event.class, }; } @@ -38,94 +56,95 @@ protected void beforeInit() { @Override protected void additionalProperties(Properties properties) { properties.put("hibernate.type_contributors", - (TypeContributorList) () -> Collections.singletonList( - (typeContributions, serviceRegistry) -> { - typeContributions.contributeType(new EnumArrayType(SensorState[].class, "sensor_state")); - } - )); + (TypeContributorList) () -> Collections.singletonList( + (typeContributions, serviceRegistry) -> { + typeContributions.contributeType(new EnumArrayType(SensorState[].class, "sensor_state")); + } + )); } @Override protected void afterInit() { doInJPA(entityManager -> { entityManager.persist( - new Event() - .setId(0L) + new Event() + .setId(0L) ); entityManager.persist( - new Event() - .setId(1L) - .setSensorIds( - Arrays.asList( - UUID.fromString("c65a3bcb-8b36-46d4-bddb-ae96ad016eb1"), - UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800") - ) - ) - .setSensorNames(Arrays.asList("Temperature", "Pressure")) - .setSensorValues(Arrays.asList(12, 756)) - .setSensorLongValues(Arrays.asList(42L, 9223372036854775800L)) - .setSensorBooleanValues(Arrays.asList(true, false)) - .setSensorDoubleValues(Arrays.asList(0.123D, 456.789D)) - .setSensorStates( - Arrays.asList( - SensorState.ONLINE, SensorState.OFFLINE, - SensorState.ONLINE, SensorState.UNKNOWN - ) - ) - .setDateValues( - Arrays.asList( - java.sql.Date.valueOf(LocalDate.of(1991, 12, 31)), - java.sql.Date.valueOf(LocalDate.of(1990, 1, 1)) - ) - ) - .setTimestampValues( - Arrays.asList( - Date.from( - LocalDate.of(1991, 12, 31) - .atStartOfDay() - .atZone(ZoneId.systemDefault()) - .toInstant() - ), - Date.from( - LocalDate.of(1990, 1, 1) - .atStartOfDay() - .atZone(ZoneId.systemDefault()) - .toInstant() + new Event() + .setId(1L) + .setSensorIds( + Arrays.asList( + UUID.fromString("c65a3bcb-8b36-46d4-bddb-ae96ad016eb1"), + UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800") + ) ) - ) - ) - .setDecimalValues( - Arrays.asList( - BigDecimal.ONE, - BigDecimal.ZERO, - BigDecimal.TEN - ) - ) - .setLocalDateValues( - Arrays.asList( - LocalDate.of(2022, 3, 22), - LocalDate.of(2021, 4, 21) - ) - ) - .setLocalDateTimeValues( - Arrays.asList( - LocalDateTime.of(2022, 3, 22, 11, 22, 33), - LocalDateTime.of(2021, 4, 21, 22, 33, 44) - ) - ) - .setLocalDateTimeSetValues( - new LinkedHashSet<>( - Arrays.asList( - LocalDateTime.of(2022, 3, 22, 11, 22, 33), - LocalDateTime.of(2022, 3, 22, 11, 22, 33), - LocalDateTime.of(2021, 4, 21, 22, 33, 44) + .setSensorNames(Arrays.asList("Temperature", "Pressure")) + .setSensorValues(Arrays.asList(12, 756)) + .setSensorShortValues(Arrays.asList((short) 42, (short) 69)) + .setSensorLongValues(Arrays.asList(42L, 9223372036854775800L)) + .setSensorBooleanValues(Arrays.asList(true, false)) + .setSensorDoubleValues(Arrays.asList(0.123D, 456.789D)) + .setSensorStates( + Arrays.asList( + SensorState.ONLINE, SensorState.OFFLINE, + SensorState.ONLINE, SensorState.UNKNOWN + ) + ) + .setDateValues( + Arrays.asList( + java.sql.Date.valueOf(LocalDate.of(1991, 12, 31)), + java.sql.Date.valueOf(LocalDate.of(1990, 1, 1)) + ) + ) + .setTimestampValues( + Arrays.asList( + Date.from( + LocalDate.of(1991, 12, 31) + .atStartOfDay() + .atZone(ZoneId.systemDefault()) + .toInstant() + ), + Date.from( + LocalDate.of(1990, 1, 1) + .atStartOfDay() + .atZone(ZoneId.systemDefault()) + .toInstant() + ) + ) + ) + .setDecimalValues( + Arrays.asList( + BigDecimal.ONE, + BigDecimal.ZERO, + BigDecimal.TEN + ) + ) + .setLocalDateValues( + Arrays.asList( + LocalDate.of(2022, 3, 22), + LocalDate.of(2021, 4, 21) + ) + ) + .setLocalDateTimeValues( + Arrays.asList( + LocalDateTime.of(2022, 3, 22, 11, 22, 33), + LocalDateTime.of(2021, 4, 21, 22, 33, 44) + ) + ) + .setLocalDateTimeSetValues( + new LinkedHashSet<>( + Arrays.asList( + LocalDateTime.of(2022, 3, 22, 11, 22, 33), + LocalDateTime.of(2022, 3, 22, 11, 22, 33), + LocalDateTime.of(2021, 4, 21, 22, 33, 44) + ) + ) + ) + .setSortedNumbers( + new TreeSet<>(Arrays.asList(2, 4, 1)) ) - ) - ) - .setSortedNumbers( - new TreeSet<>(Arrays.asList(2, 4, 1)) - ) ); }); } @@ -136,125 +155,129 @@ public void test() { Event event = entityManager.find(Event.class, 1L); assertEquals( - Arrays.asList( - UUID.fromString("c65a3bcb-8b36-46d4-bddb-ae96ad016eb1"), - UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800") - ), - event.getSensorIds() + Arrays.asList( + UUID.fromString("c65a3bcb-8b36-46d4-bddb-ae96ad016eb1"), + UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800") + ), + event.getSensorIds() ); assertEquals( - Arrays.asList("Temperature", "Pressure"), - event.getSensorNames() + Arrays.asList("Temperature", "Pressure"), + event.getSensorNames() ); assertEquals( - Arrays.asList(12, 756), - event.getSensorValues() + Arrays.asList(12, 756), + event.getSensorValues() ); assertEquals( - Arrays.asList(42L, 9223372036854775800L), - event.getSensorLongValues() + Arrays.asList((short) 42, (short) 69), + event.getSensorShortValues() ); assertEquals( - Arrays.asList(true, false), - event.getSensorBooleanValues() + Arrays.asList(42L, 9223372036854775800L), + event.getSensorLongValues() ); assertEquals( - Arrays.asList(0.123D, 456.789D), - event.getSensorDoubleValues() + Arrays.asList(true, false), + event.getSensorBooleanValues() ); assertEquals( - Arrays.asList( - SensorState.ONLINE, SensorState.OFFLINE, - SensorState.ONLINE, SensorState.UNKNOWN - ), - event.getSensorStates() + Arrays.asList(0.123D, 456.789D), + event.getSensorDoubleValues() ); assertEquals( - Arrays.asList( - java.sql.Date.valueOf(LocalDate.of(1991, 12, 31)), - java.sql.Date.valueOf(LocalDate.of(1990, 1, 1)) - ), - event.getDateValues() + Arrays.asList( + SensorState.ONLINE, SensorState.OFFLINE, + SensorState.ONLINE, SensorState.UNKNOWN + ), + event.getSensorStates() ); assertEquals( - Arrays.asList( - Date.from( - LocalDate.of(1991, 12, 31) - .atStartOfDay() - .atZone(ZoneId.systemDefault()) - .toInstant() + Arrays.asList( + java.sql.Date.valueOf(LocalDate.of(1991, 12, 31)), + java.sql.Date.valueOf(LocalDate.of(1990, 1, 1)) ), - Date.from( - LocalDate.of(1990, 1, 1) - .atStartOfDay() - .atZone(ZoneId.systemDefault()) - .toInstant() - ) - ), - event.getTimestampValues() + event.getDateValues() ); assertEquals( - Arrays.asList( - BigDecimal.ONE, - BigDecimal.ZERO, - BigDecimal.TEN - ), - event.getDecimalValues() + Arrays.asList( + Date.from( + LocalDate.of(1991, 12, 31) + .atStartOfDay() + .atZone(ZoneId.systemDefault()) + .toInstant() + ), + Date.from( + LocalDate.of(1990, 1, 1) + .atStartOfDay() + .atZone(ZoneId.systemDefault()) + .toInstant() + ) + ), + event.getTimestampValues() ); assertEquals( - Arrays.asList( - LocalDate.of(2022, 3, 22), - LocalDate.of(2021, 4, 21) - ), - event.getLocalDateValues() + Arrays.asList( + BigDecimal.ONE, + BigDecimal.ZERO, + BigDecimal.TEN + ), + event.getDecimalValues() ); assertEquals( - Arrays.asList( - LocalDateTime.of(2022, 3, 22, 11, 22, 33), - LocalDateTime.of(2021, 4, 21, 22, 33, 44) - ), - event.getLocalDateTimeValues() + Arrays.asList( + LocalDate.of(2022, 3, 22), + LocalDate.of(2021, 4, 21) + ), + event.getLocalDateValues() ); assertEquals( - new HashSet<>( Arrays.asList( - LocalDateTime.of(2022, 3, 22, 11, 22, 33), - LocalDateTime.of(2021, 4, 21, 22, 33, 44) - ) - ), - event.getLocalDateTimeSetValues() + LocalDateTime.of(2022, 3, 22, 11, 22, 33), + LocalDateTime.of(2021, 4, 21, 22, 33, 44) + ), + event.getLocalDateTimeValues() ); assertEquals( - new TreeSet<>( - Arrays.asList( - 2, 4, 1 - ) - ), - event.getSortedNumbers() + new HashSet<>( + Arrays.asList( + LocalDateTime.of(2022, 3, 22, 11, 22, 33), + LocalDateTime.of(2021, 4, 21, 22, 33, 44) + ) + ), + event.getLocalDateTimeSetValues() + ); + assertEquals( + new TreeSet<>( + Arrays.asList( + 2, 4, 1 + ) + ), + event.getSortedNumbers() ); }); doInJPA(entityManager -> { List events = entityManager.createNativeQuery( - "select " + - " id, " + - " sensor_ids, " + - " sensor_names, " + - " sensor_values " + - "from event " + - "where id >= :id", Tuple.class) - .setParameter("id", 0) - .unwrap(org.hibernate.query.NativeQuery.class) - .addScalar("sensor_ids", UUID[].class) - .addScalar("sensor_names", String[].class) - .addScalar("sensor_values", int[].class) - .getResultList(); + "select " + + " id, " + + " sensor_ids, " + + " sensor_names, " + + " sensor_values " + + "from event " + + "where id >= :id", Tuple.class) + .setParameter("id", 0) + .unwrap(org.hibernate.query.NativeQuery.class) + .addScalar("sensor_ids", UUID[].class) + .addScalar("sensor_names", String[].class) + .addScalar("sensor_values", int[].class) + .getResultList(); assertEquals(2, events.size()); }); Event _event = doInJPA(entityManager -> { - return entityManager.find(Event.class, 1L); + return entityManager.find(Event.class, 1L); }); String newString = "New"; @@ -282,21 +305,21 @@ public void test() { public void testScalarEnumArray() { doInJPA(entityManager -> { List events = entityManager.createNativeQuery( - "select " + - " id, " + - " sensor_ids, " + - " sensor_names, " + - " sensor_values, " + - " sensor_states " + - "from event " + - "where id >= :id", Tuple.class) - .setParameter("id", 0) - .unwrap(org.hibernate.query.NativeQuery.class) - .addScalar("sensor_ids", UUID[].class) - .addScalar("sensor_names", String[].class) - .addScalar("sensor_values", int[].class) - .addScalar("sensor_states", SensorState[].class) - .getResultList(); + "select " + + " id, " + + " sensor_ids, " + + " sensor_names, " + + " sensor_values, " + + " sensor_states " + + "from event " + + "where id >= :id", Tuple.class) + .setParameter("id", 0) + .unwrap(org.hibernate.query.NativeQuery.class) + .addScalar("sensor_ids", UUID[].class) + .addScalar("sensor_names", String[].class) + .addScalar("sensor_values", int[].class) + .addScalar("sensor_states", SensorState[].class) + .getResultList(); assertEquals(2, events.size()); }); @@ -317,6 +340,7 @@ public void testMixingNullValues() { event.setSensorIds(Arrays.asList(null, UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800"))); event.setSensorNames(Arrays.asList("Temperature", null)); event.setSensorValues(Arrays.asList(null, 756)); + event.setSensorShortValues(Arrays.asList(null, (short) 69)); event.setSensorLongValues(Arrays.asList(null, 9223372036854775800L)); event.setSensorBooleanValues(Arrays.asList(null, false)); event.setSensorDoubleValues(Arrays.asList(null, 456.789D)); @@ -335,6 +359,7 @@ public void testMixingNullValues() { assertArrayEquals(new UUID[]{null, UUID.fromString("72e95717-5294-4c15-aa64-a3631cf9a800")}, event.getSensorIds().toArray()); assertArrayEquals(new String[]{"Temperature", null}, event.getSensorNames().toArray()); assertArrayEquals(new Integer[]{null, 756}, event.getSensorValues().toArray()); + assertArrayEquals(new Short[]{null, (short) 69}, event.getSensorShortValues().toArray()); assertArrayEquals(new Long[]{null, 9223372036854775800L}, event.getSensorLongValues().toArray()); assertArrayEquals(new Boolean[]{null, false}, event.getSensorBooleanValues().toArray()); assertArrayEquals(new Double[]{null, 456.789D}, event.getSensorDoubleValues().toArray()); @@ -360,6 +385,7 @@ public void testNullValues() { event.setSensorIds(Arrays.asList(null, null)); event.setSensorNames(Arrays.asList(null, null)); event.setSensorValues(Arrays.asList(null, null)); + event.setSensorShortValues(Arrays.asList(null, null)); event.setSensorLongValues(Arrays.asList(null, null)); event.setSensorBooleanValues(Arrays.asList(null, null)); event.setSensorDoubleValues(Arrays.asList(null, null)); @@ -378,6 +404,7 @@ public void testNullValues() { assertArrayEquals(new UUID[]{null, null}, event.getSensorIds().toArray()); assertArrayEquals(new String[]{null, null}, event.getSensorNames().toArray()); assertArrayEquals(new Integer[]{null, null}, event.getSensorValues().toArray()); + assertArrayEquals(new Short[]{null, null}, event.getSensorShortValues().toArray()); assertArrayEquals(new Long[]{null, null}, event.getSensorLongValues().toArray()); assertArrayEquals(new Boolean[]{null, null}, event.getSensorBooleanValues().toArray()); assertArrayEquals(new Double[]{null, null}, event.getSensorDoubleValues().toArray()); @@ -403,6 +430,7 @@ public void testEmptyArrays() { event.setSensorIds(Collections.emptyList()); event.setSensorNames(Collections.emptyList()); event.setSensorValues(Collections.emptyList()); + event.setSensorShortValues(Collections.emptyList()); event.setSensorLongValues(Collections.emptyList()); event.setSensorBooleanValues(Collections.emptyList()); event.setSensorDoubleValues(Collections.emptyList()); @@ -421,6 +449,7 @@ public void testEmptyArrays() { assertArrayEquals(new UUID[]{}, event.getSensorIds().toArray()); assertArrayEquals(new String[]{}, event.getSensorNames().toArray()); assertArrayEquals(new Integer[]{}, event.getSensorValues().toArray()); + assertArrayEquals(new Short[]{}, event.getSensorShortValues().toArray()); assertArrayEquals(new Long[]{}, event.getSensorLongValues().toArray()); assertArrayEquals(new Boolean[]{}, event.getSensorBooleanValues().toArray()); assertArrayEquals(new Double[]{}, event.getSensorDoubleValues().toArray()); @@ -438,8 +467,8 @@ public void testAttributeType() { doInJPA(entityManager -> { ManagedType eventManagedType = entityManager.getMetamodel().managedType(Event.class); assertEquals( - Collection.class, - eventManagedType.getAttribute("sensorIds").getJavaType() + Collection.class, + eventManagedType.getAttribute("sensorIds").getJavaType() ); }); } @@ -453,110 +482,117 @@ public static class Event { @Type(ListArrayType.class) @Column( - name = "sensor_ids", - columnDefinition = "uuid[]" + name = "sensor_ids", + columnDefinition = "uuid[]" ) private List sensorIds; @Type(ListArrayType.class) @Column( - name = "sensor_names", - columnDefinition = "text[]" + name = "sensor_names", + columnDefinition = "text[]" ) private List sensorNames; @Type(ListArrayType.class) @Column( - name = "sensor_values", - columnDefinition = "integer[]" + name = "sensor_values", + columnDefinition = "integer[]" ) private List sensorValues; @Type(ListArrayType.class) @Column( - name = "sensor_long_values", - columnDefinition = "bigint[]" + name = "sensor_long_values", + columnDefinition = "bigint[]" ) private List sensorLongValues; @Type(ListArrayType.class) @Column( - name = "sensor_boolean_values", - columnDefinition = "boolean[]" + name = "sensor_boolean_values", + columnDefinition = "boolean[]" ) private List sensorBooleanValues; @Type(ListArrayType.class) @Column( - name = "sensor_double_values", - columnDefinition = "float8[]" + name = "sensor_double_values", + columnDefinition = "float8[]" ) private List sensorDoubleValues; @Type( - value = ListArrayType.class, - parameters = { - @Parameter( - name = ListArrayType.SQL_ARRAY_TYPE, - value = "sensor_state" - ) - } + value = ListArrayType.class, + parameters = { + @Parameter( + name = ListArrayType.SQL_ARRAY_TYPE, + value = "sensor_state" + ) + } ) @Column( - name = "sensor_states", - columnDefinition = "sensor_state[]" + name = "sensor_states", + columnDefinition = "sensor_state[]" ) private List sensorStates; @Type(ListArrayType.class) @Column( - name = "date_values", - columnDefinition = "date[]" + name = "date_values", + columnDefinition = "date[]" ) private List dateValues; @Type(ListArrayType.class) @Column( - name = "timestamp_values", - columnDefinition = "timestamp[]" + name = "timestamp_values", + columnDefinition = "timestamp[]" ) private List timestampValues; @Type(ListArrayType.class) @Column( - name = "decimal_values", - columnDefinition = "decimal[]" + name = "decimal_values", + columnDefinition = "decimal[]" ) private List decimalValues; @Type(ListArrayType.class) @Column( - name = "localdate_values", - columnDefinition = "date[]" + name = "localdate_values", + columnDefinition = "date[]" ) private List localDateValues; @Type(ListArrayType.class) @Column( - name = "localdatetime_values", - columnDefinition = "timestamp[]" + name = "localdatetime_values", + columnDefinition = "timestamp[]" ) private List localDateTimeValues; @Type(ListArrayType.class) @Column( - name = "localdatetime_set_values", - columnDefinition = "timestamp[]" + name = "localdatetime_set_values", + columnDefinition = "timestamp[]" ) private Set localDateTimeSetValues; @Type(ListArrayType.class) @Column( - name = "sorted_numbers", - columnDefinition = "integer[]" + name = "sorted_numbers", + columnDefinition = "integer[]" ) private SortedSet sortedNumbers; + @Type(ListArrayType.class) + @Column( + name = "short_values", + columnDefinition = "smallint[]" + ) + private List sensorShortValues; + public Long getId() { return id; } @@ -593,6 +629,15 @@ public Event setSensorValues(List sensorValues) { return this; } + public Event setSensorShortValues(List shortValues) { + this.sensorShortValues = shortValues; + return this; + } + + public List getSensorShortValues() { + return sensorShortValues; + } + public List getSensorLongValues() { return sensorLongValues; } @@ -721,4 +766,4 @@ public void testNullArrays() { public enum SensorState { ONLINE, OFFLINE, UNKNOWN; } -} +} \ No newline at end of file diff --git a/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/MappedSuperclassListArrayTypeTest.java b/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/MappedSuperclassListArrayTypeTest.java index dc991e9f5..11fe2af34 100644 --- a/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/MappedSuperclassListArrayTypeTest.java +++ b/hypersistence-utils-hibernate-63/src/test/java/io/hypersistence/utils/hibernate/type/array/MappedSuperclassListArrayTypeTest.java @@ -1,7 +1,11 @@ package io.hypersistence.utils.hibernate.type.array; import io.hypersistence.utils.hibernate.util.AbstractPostgreSQLIntegrationTest; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.Table; import org.hibernate.annotations.Type; import org.junit.Test; @@ -12,13 +16,14 @@ /** * @author Vlad Mihalcea + * @author Baptiste Masoud */ public class MappedSuperclassListArrayTypeTest extends AbstractPostgreSQLIntegrationTest { @Override protected Class[] entities() { return new Class[]{ - Event.class, + Event.class, }; } @@ -34,6 +39,7 @@ public void test() { event.setId(1L); event.setSensorNames(Arrays.asList("Temperature", "Pressure")); event.setSensorValues(Arrays.asList(12, 756)); + event.setSensorShortValues(Arrays.asList((short) 42, (short) 69)); entityManager.persist(event); }); @@ -43,6 +49,7 @@ public void test() { assertArrayEquals(new String[]{"Temperature", "Pressure"}, event.getSensorNames().toArray()); assertArrayEquals(new Integer[]{12, 756}, event.getSensorValues().toArray()); + assertArrayEquals(new Short[]{42, 69}, event.getSensorShortValues().toArray()); }); } @@ -81,6 +88,10 @@ public static class Event extends BaseEntity { @Column(name = "sensor_values", columnDefinition = "integer[]") private List sensorValues; + @Type(ListArrayType.class) + @Column(name = "sensor_short_values", columnDefinition = "smallint[]") + private List sensorShortValues; + public List getSensorValues() { return sensorValues; } @@ -88,5 +99,13 @@ public List getSensorValues() { public void setSensorValues(List sensorValues) { this.sensorValues = sensorValues; } + + public List getSensorShortValues() { + return sensorShortValues; + } + + public void setSensorShortValues(List sensorShortValues) { + this.sensorShortValues = sensorShortValues; + } } -} +} \ No newline at end of file