Skip to content

Commit 24fa18f

Browse files
committed
HHH-17335 Add array_replace function
1 parent 937116e commit 24fa18f

File tree

19 files changed

+374
-26
lines changed

19 files changed

+374
-26
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
@@ -1131,6 +1131,7 @@ The following functions deal with SQL array types, which are not supported on ev
11311131
| `array_set()` | Creates array copy with given element at given index
11321132
| `array_remove()` | Creates array copy with given element removed
11331133
| `array_slice()` | Creates a sub-array of the based on lower and upper index
1134+
| `array_replace()` | Creates array copy replacing a given element with another
11341135
|===
11351136
11361137
===== `array()`
@@ -1316,6 +1317,19 @@ include::{array-example-dir-hql}/ArrayRemoveIndexTest.java[tags=hql-array-remove
13161317
----
13171318
====
13181319
1320+
[[hql-array-replace-functions]]
1321+
===== `array_replace()`
1322+
1323+
Returns an array copy which has elements matching the second argument replaced by the third argument.
1324+
1325+
[[hql-array-replace-example]]
1326+
====
1327+
[source, JAVA, indent=0]
1328+
----
1329+
include::{array-example-dir-hql}/ArrayReplaceTest.java[tags=hql-array-replace-example]
1330+
----
1331+
====
1332+
13191333
[[hql-user-defined-functions]]
13201334
==== Native and user-defined functions
13211335

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
@@ -477,6 +477,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
477477
functionFactory.arrayRemove();
478478
functionFactory.arrayRemoveIndex_unnest( true );
479479
functionFactory.arraySlice_operator();
480+
functionFactory.arrayReplace();
480481

481482
functionContributions.getFunctionRegistry().register(
482483
"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
@@ -385,6 +385,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
385385
functionFactory.arrayRemove_h2();
386386
functionFactory.arrayRemoveIndex_h2();
387387
functionFactory.arraySlice();
388+
functionFactory.arrayReplace_h2();
388389
}
389390
else {
390391
// 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
@@ -263,6 +263,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
263263
functionFactory.arrayRemove_hsql();
264264
functionFactory.arrayRemoveIndex_unnest( false );
265265
functionFactory.arraySlice_unnest();
266+
functionFactory.arrayReplace_unnest();
266267
}
267268

268269
@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
@@ -299,6 +299,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
299299
functionFactory.arrayRemove_oracle();
300300
functionFactory.arrayRemoveIndex_oracle();
301301
functionFactory.arraySlice_oracle();
302+
functionFactory.arrayReplace_oracle();
302303
}
303304

304305
@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
@@ -597,6 +597,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
597597
functionFactory.arrayRemove();
598598
functionFactory.arrayRemoveIndex_unnest( true );
599599
functionFactory.arraySlice_operator();
600+
functionFactory.arrayReplace();
600601

601602
if ( getVersion().isSameOrAfter( 9, 4 ) ) {
602603
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
@@ -464,6 +464,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
464464
functionFactory.arrayRemove();
465465
functionFactory.arrayRemoveIndex_unnest( true );
466466
functionFactory.arraySlice_operator();
467+
functionFactory.arrayReplace();
467468

468469
functionContributions.getFunctionRegistry().register(
469470
"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
@@ -324,6 +324,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
324324
functionFactory.arrayRemove_h2();
325325
functionFactory.arrayRemoveIndex_h2();
326326
functionFactory.arraySlice();
327+
functionFactory.arrayReplace_h2();
327328
}
328329

329330
@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
@@ -203,6 +203,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
203203
functionFactory.arrayRemove_hsql();
204204
functionFactory.arrayRemoveIndex_unnest( false );
205205
functionFactory.arraySlice_unnest();
206+
functionFactory.arrayReplace_unnest();
206207
}
207208

208209
@Override

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,38 @@ public void addAuxiliaryDatabaseObjects(
439439
false
440440
)
441441
);
442+
database.addAuxiliaryDatabaseObject(
443+
new NamedAuxiliaryDatabaseObject(
444+
arrayTypeName + "_replace",
445+
database.getDefaultNamespace(),
446+
new String[]{
447+
"create or replace function " + arrayTypeName + "_replace(arr in " + arrayTypeName +
448+
", old in " + getRawTypeName( elementType ) + ", elem in " + getRawTypeName( elementType ) + ") return " + arrayTypeName + " deterministic is " +
449+
"res " + arrayTypeName + ":=" + arrayTypeName + "(); begin " +
450+
"if arr is null then return null; end if; " +
451+
"if old is null then " +
452+
"for i in 1 .. arr.count loop " +
453+
"res.extend; " +
454+
"res(res.last) := coalesce(arr(i),elem); " +
455+
"end loop; " +
456+
"else " +
457+
"for i in 1 .. arr.count loop " +
458+
"res.extend; " +
459+
"if arr(i) = old then " +
460+
"res(res.last) := elem; " +
461+
"else " +
462+
"res(res.last) := arr(i); " +
463+
"end if; " +
464+
"end loop; " +
465+
"end if; " +
466+
"return res; " +
467+
"end;"
468+
},
469+
new String[] { "drop function " + arrayTypeName + "_replace" },
470+
emptySet(),
471+
false
472+
)
473+
);
442474
}
443475

444476
protected String createOrReplaceConcatFunction(String arrayTypeName) {

0 commit comments

Comments
 (0)