Skip to content

Commit 865365e

Browse files
committed
HHH-17335 Add array_remove function
1 parent b8b8a87 commit 865365e

File tree

20 files changed

+362
-21
lines changed

20 files changed

+362
-21
lines changed

documentation/src/main/asciidoc/userguide/chapters/query/hql/QueryLanguage.adoc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,7 @@ The following functions deal with SQL array types, which are not supported on ev
11291129
| `array_contains_any_nullable()` | Determines if one array holds at least one element of another array, supporting null elements
11301130
| `array_get()` | Accesses the element of an array by index
11311131
| `array_set()` | Creates array copy with given element at given index
1132+
| `array_remove()` | Creates array copy with given element removed
11321133
|===
11331134
11341135
===== `array()`
@@ -1274,6 +1275,19 @@ include::{array-example-dir-hql}/ArraySetTest.java[tags=hql-array-set-example]
12741275
----
12751276
====
12761277
1278+
[[hql-array-remove-functions]]
1279+
===== `array_remove()`
1280+
1281+
Returns an array copy with the given element removed from the array. Allows removal of `null` elements.
1282+
1283+
[[hql-array-remove-example]]
1284+
====
1285+
[source, JAVA, indent=0]
1286+
----
1287+
include::{array-example-dir-hql}/ArrayRemoveTest.java[tags=hql-array-remove-example]
1288+
----
1289+
====
1290+
12771291
[[hql-user-defined-functions]]
12781292
==== Native and user-defined functions
12791293

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CockroachLegacyDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
474474
functionFactory.arrayContainsAnyNullable_operator();
475475
functionFactory.arrayGet_bracket();
476476
functionFactory.arraySet_unnest();
477+
functionFactory.arrayRemove_unnest();
477478

478479
functionContributions.getFunctionRegistry().register(
479480
"trunc",

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/H2LegacyDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
382382
functionFactory.arrayContainsAnyNullable_h2();
383383
functionFactory.arrayGet_h2();
384384
functionFactory.arraySet_h2();
385+
functionFactory.arrayRemove_h2();
385386
}
386387
else {
387388
// Use group_concat until 2.x as listagg was buggy

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/HSQLLegacyDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
260260
functionFactory.arrayContainsAnyNullable_hsql();
261261
functionFactory.arrayGet_unnest();
262262
functionFactory.arraySet_hsql();
263+
functionFactory.arrayRemove_hsql();
263264
}
264265

265266
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
296296
functionFactory.arrayContainsAnyNullable_oracle();
297297
functionFactory.arrayGet_oracle();
298298
functionFactory.arraySet_oracle();
299+
functionFactory.arrayRemove_oracle();
299300
}
300301

301302
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/PostgreSQLLegacyDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
594594
functionFactory.arrayContainsAnyNullable_operator();
595595
functionFactory.arrayGet_bracket();
596596
functionFactory.arraySet_unnest();
597+
functionFactory.arrayRemove_unnest();
597598

598599
if ( getVersion().isSameOrAfter( 9, 4 ) ) {
599600
functionFactory.makeDateTimeTimestamp();

hibernate-core/src/main/java/org/hibernate/dialect/CockroachDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
461461
functionFactory.arrayContainsAnyNullable_operator();
462462
functionFactory.arrayGet_bracket();
463463
functionFactory.arraySet_unnest();
464+
functionFactory.arrayRemove_unnest();
464465

465466
functionContributions.getFunctionRegistry().register(
466467
"trunc",

hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
322322
functionFactory.arrayContainsAnyNullable_h2();
323323
functionFactory.arrayGet_h2();
324324
functionFactory.arraySet_h2();
325+
functionFactory.arrayRemove_h2();
325326
}
326327

327328
@Override

hibernate-core/src/main/java/org/hibernate/dialect/HSQLDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
200200
functionFactory.arrayContainsAnyNullable_hsql();
201201
functionFactory.arrayGet_unnest();
202202
functionFactory.arraySet_hsql();
203+
functionFactory.arrayRemove_hsql();
203204
}
204205

205206
@Override

hibernate-core/src/main/java/org/hibernate/dialect/OracleArrayJdbcType.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,32 @@ public void addAuxiliaryDatabaseObjects(
373373
false
374374
)
375375
);
376+
database.addAuxiliaryDatabaseObject(
377+
new NamedAuxiliaryDatabaseObject(
378+
arrayTypeName + "_remove",
379+
database.getDefaultNamespace(),
380+
new String[]{
381+
"create or replace function " + arrayTypeName + "_remove(arr in " + arrayTypeName +
382+
", elem in " + getRawTypeName( elementType ) + ") return " + arrayTypeName + " deterministic is " +
383+
"res " + arrayTypeName + ":=" + arrayTypeName + "(); begin " +
384+
"if arr is null then return null; end if; " +
385+
"if elem is null then " +
386+
"for i in 1 .. arr.count loop " +
387+
"if arr(i) is not null then res.extend; res(res.last) := arr(i); end if; " +
388+
"end loop; " +
389+
"else " +
390+
"for i in 1 .. arr.count loop " +
391+
"if arr(i) is null or arr(i)<>elem then res.extend; res(res.last) := arr(i); end if; " +
392+
"end loop; " +
393+
"end if; " +
394+
"return res; " +
395+
"end;"
396+
},
397+
new String[] { "drop function " + arrayTypeName + "_remove" },
398+
emptySet(),
399+
false
400+
)
401+
);
376402
}
377403

378404
protected String createOrReplaceConcatFunction(String arrayTypeName) {

0 commit comments

Comments
 (0)