diff --git a/openbas-api/pom.xml b/openbas-api/pom.xml index 6fcd464626..beba108b84 100644 --- a/openbas-api/pom.xml +++ b/openbas-api/pom.xml @@ -146,6 +146,10 @@ org.flywaydb flyway-core + + org.flywaydb + flyway-database-postgresql + commons-codec commons-codec diff --git a/openbas-api/src/main/java/io/openbas/migration/V3_49__Adding_wrapper_functions.java b/openbas-api/src/main/java/io/openbas/migration/V3_49__Adding_wrapper_functions.java new file mode 100644 index 0000000000..7210df4f9f --- /dev/null +++ b/openbas-api/src/main/java/io/openbas/migration/V3_49__Adding_wrapper_functions.java @@ -0,0 +1,32 @@ +package io.openbas.migration; + +import java.sql.SQLException; +import java.sql.Statement; +import org.flywaydb.core.api.migration.BaseJavaMigration; +import org.flywaydb.core.api.migration.Context; +import org.springframework.stereotype.Component; + +@Component +public class V3_49__Adding_wrapper_functions extends BaseJavaMigration { + + @Override + public void migrate(Context context) throws SQLException { + Statement migrator = context.getConnection().createStatement(); + migrator.execute( + """ + CREATE OR REPLACE FUNCTION array_to_string_wrapper(a anyelement, b text) + RETURNS TEXT AS + $$ + SELECT array_to_string(a, b) + $$ LANGUAGE SQL; + """); + migrator.execute( + """ + CREATE OR REPLACE FUNCTION array_position_wrapper(a anyelement, b text) + RETURNS INT AS + $$ + SELECT array_position(a, b) + $$ LANGUAGE SQL; + """); + } +} diff --git a/openbas-api/src/main/java/io/openbas/rest/exercise/service/ExerciseService.java b/openbas-api/src/main/java/io/openbas/rest/exercise/service/ExerciseService.java index 921eb1d16b..4ffacc790a 100644 --- a/openbas-api/src/main/java/io/openbas/rest/exercise/service/ExerciseService.java +++ b/openbas-api/src/main/java/io/openbas/rest/exercise/service/ExerciseService.java @@ -42,6 +42,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; +import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; @@ -383,11 +384,13 @@ private void select( // Array aggregations Join exerciseTagsJoin = exerciseRoot.join("tags", JoinType.LEFT); joinMap.put("tags", exerciseTagsJoin); - Expression tagIdsExpression = arrayAggOnId(cb, exerciseTagsJoin); + Expression tagIdsExpression = + arrayAggOnId((HibernateCriteriaBuilder) cb, exerciseTagsJoin); Join injectsJoin = exerciseRoot.join("injects", JoinType.LEFT); joinMap.put("injects", injectsJoin); - Expression injectIdsExpression = arrayAggOnId(cb, injectsJoin); + Expression injectIdsExpression = + arrayAggOnId((HibernateCriteriaBuilder) cb, injectsJoin); // SELECT cq.multiselect( exerciseRoot.get("id").alias("exercise_id"), diff --git a/openbas-api/src/main/java/io/openbas/service/ScenarioService.java b/openbas-api/src/main/java/io/openbas/service/ScenarioService.java index 675b983058..680c2c309b 100644 --- a/openbas-api/src/main/java/io/openbas/service/ScenarioService.java +++ b/openbas-api/src/main/java/io/openbas/service/ScenarioService.java @@ -58,6 +58,7 @@ import lombok.extern.java.Log; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.function.TriFunction; +import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; @@ -183,12 +184,12 @@ private Page findAllWithCriteriaBuilder( // Join on TAG Join scenarioTagsJoin = scenarioRoot.join("tags", JoinType.LEFT); joinMap.put("tags", scenarioTagsJoin); + Expression nullString = cb.nullLiteral(String.class); + Expression arr = + ((HibernateCriteriaBuilder) cb).arrayAgg(null, scenarioTagsJoin.get("id")); Expression tagIdsExpression = - cb.function( - "array_remove", - String[].class, - cb.function("array_agg", String[].class, scenarioTagsJoin.get("id")), - cb.nullLiteral(String.class)); + ((HibernateCriteriaBuilder) cb).arrayRemove(arr, nullString); + // Join on INJECT and INJECTOR CONTRACT Join injectsJoin = scenarioRoot.join("injects", JoinType.LEFT); joinMap.put("injects", injectsJoin); diff --git a/openbas-api/src/main/resources/application.properties b/openbas-api/src/main/resources/application.properties index 932e095734..6470e9fac4 100644 --- a/openbas-api/src/main/resources/application.properties +++ b/openbas-api/src/main/resources/application.properties @@ -97,7 +97,7 @@ spring.datasource.url=jdbc:postgresql://... spring.datasource.username=openbas spring.datasource.password= spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -spring.jpa.hibernate.ddl-auto=validate +spring.jpa.hibernate.ddl-auto=none # spring.jpa.show-sql=true # spring.jpa.properties.hibernate.format_sql=true spring.flyway.url=${spring.datasource.url} diff --git a/openbas-framework/src/main/java/io/openbas/utils/JpaUtils.java b/openbas-framework/src/main/java/io/openbas/utils/JpaUtils.java index 8202e3a80f..b62fdf47cf 100644 --- a/openbas-framework/src/main/java/io/openbas/utils/JpaUtils.java +++ b/openbas-framework/src/main/java/io/openbas/utils/JpaUtils.java @@ -7,6 +7,7 @@ import jakarta.persistence.criteria.*; import jakarta.validation.constraints.NotNull; import java.util.Map; +import org.hibernate.query.criteria.HibernateCriteriaBuilder; public class JpaUtils { @@ -89,12 +90,10 @@ public static Expression toPath( // -- FUNCTION -- public static Expression arrayAggOnId( - @NotNull final CriteriaBuilder cb, @NotNull final Join join) { - return cb.function( - "array_remove", - String[].class, - cb.function("array_agg", String[].class, join.get("id")), - cb.nullLiteral(String.class)); + @NotNull final HibernateCriteriaBuilder cb, @NotNull final Join join) { + Expression nullString = cb.nullLiteral(String.class); + Expression arr = cb.arrayAgg(null, join.get("id")); + return cb.arrayRemove(arr, nullString); } // -- JOIN -- @@ -106,6 +105,6 @@ public static Join createLeftJoin(Root root, String attributeNam public static Expression createJoinArrayAggOnId( CriteriaBuilder cb, Root root, String attributeName) { Join join = createLeftJoin(root, attributeName); - return arrayAggOnId(cb, join); + return arrayAggOnId((HibernateCriteriaBuilder) cb, join); } } diff --git a/openbas-framework/src/main/java/io/openbas/utils/OperationUtilsJpa.java b/openbas-framework/src/main/java/io/openbas/utils/OperationUtilsJpa.java index a8bc1b0a15..f34bd8a320 100644 --- a/openbas-framework/src/main/java/io/openbas/utils/OperationUtilsJpa.java +++ b/openbas-framework/src/main/java/io/openbas/utils/OperationUtilsJpa.java @@ -295,7 +295,7 @@ private static Expression lowerArray(Expression paths, CriteriaBuil private static Expression arrayPosition( Expression paths, CriteriaBuilder cb, Expression text) { - return cb.function("array_position", Boolean.class, paths, text); + return cb.function("array_position_wrapper", Boolean.class, paths, text); } private static Expression lower(Expression paths, CriteriaBuilder cb) { @@ -307,7 +307,7 @@ private static Expression stringToArray(Expression paths, Crit } private static Expression arrayToString(Expression paths, CriteriaBuilder cb) { - return cb.function("array_to_string", String.class, paths, cb.literal(" && ")); + return cb.function("array_to_string_wrapper", String.class, paths, cb.literal(" && ")); } private static Expression avals(Expression paths, CriteriaBuilder cb) { diff --git a/openbas-model/pom.xml b/openbas-model/pom.xml index e17c06f407..e5f4e6ecc1 100644 --- a/openbas-model/pom.xml +++ b/openbas-model/pom.xml @@ -46,7 +46,7 @@ io.hypersistence hypersistence-utils-hibernate-63 - 3.7.0 + 3.9.0 org.postgresql diff --git a/openbas-model/src/main/java/io/openbas/database/model/Endpoint.java b/openbas-model/src/main/java/io/openbas/database/model/Endpoint.java index f11f3ba660..3e91ab0ec2 100644 --- a/openbas-model/src/main/java/io/openbas/database/model/Endpoint.java +++ b/openbas-model/src/main/java/io/openbas/database/model/Endpoint.java @@ -53,7 +53,7 @@ public enum PLATFORM_TYPE { @NotEmpty @Ipv4OrIpv6Constraint @Type(StringArrayType.class) - @Column(name = "endpoint_ips") + @Column(name = "endpoint_ips", columnDefinition = "text[]") @JsonProperty("endpoint_ips") private String[] ips; diff --git a/pom.xml b/pom.xml index 50c944c502..491c77f276 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.0 + 3.3.5 io.openbas