Skip to content

Commit faf6345

Browse files
committed
HHH-17355 Add array_trim function
1 parent f2e6ad6 commit faf6345

File tree

15 files changed

+236
-0
lines changed

15 files changed

+236
-0
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
@@ -1134,6 +1134,7 @@ The following functions deal with SQL array types, which are not supported on ev
11341134
| `array_remove_index()` | Creates array copy with the element at the given index removed
11351135
| `array_slice()` | Creates a sub-array of the based on lower and upper index
11361136
| `array_replace()` | Creates array copy replacing a given element with another
1137+
| `array_trim()` | Creates array copy trimming the last _N_ elements
11371138
|===
11381139
11391140
===== `array()`
@@ -1385,6 +1386,19 @@ include::{array-example-dir-hql}/ArrayReplaceTest.java[tags=hql-array-replace-ex
13851386
----
13861387
====
13871388
1389+
===== `array_trim()`
1390+
1391+
Returns an array copy without the last _N_ elements, specified by the second argument.
1392+
It is an error if any array has a length smaller than the second argument.
1393+
1394+
[[hql-array-trim-example]]
1395+
====
1396+
[source, JAVA, indent=0]
1397+
----
1398+
include::{array-example-dir-hql}/ArrayTrimTest.java[tags=hql-array-trim-example]
1399+
----
1400+
====
1401+
13881402
[[hql-user-defined-functions]]
13891403
==== Native and user-defined functions
13901404

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
@@ -476,6 +476,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
476476
functionFactory.arrayRemoveIndex_unnest( true );
477477
functionFactory.arraySlice_operator();
478478
functionFactory.arrayReplace();
479+
functionFactory.arrayTrim_trim_array();
479480

480481
functionContributions.getFunctionRegistry().register(
481482
"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
@@ -384,6 +384,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
384384
functionFactory.arrayRemoveIndex_h2( getMaximumArraySize() );
385385
functionFactory.arraySlice();
386386
functionFactory.arrayReplace_h2( getMaximumArraySize() );
387+
functionFactory.arrayTrim_trim_array();
387388
}
388389
else {
389390
// 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
@@ -262,6 +262,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
262262
functionFactory.arrayRemoveIndex_unnest( false );
263263
functionFactory.arraySlice_unnest();
264264
functionFactory.arrayReplace_unnest();
265+
functionFactory.arrayTrim_trim_array();
265266
}
266267

267268
@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
@@ -298,6 +298,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
298298
functionFactory.arrayRemoveIndex_oracle();
299299
functionFactory.arraySlice_oracle();
300300
functionFactory.arrayReplace_oracle();
301+
functionFactory.arrayTrim_oracle();
301302
}
302303

303304
@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
@@ -596,6 +596,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
596596
functionFactory.arrayRemoveIndex_unnest( true );
597597
functionFactory.arraySlice_operator();
598598
functionFactory.arrayReplace();
599+
functionFactory.arrayTrim_trim_array();
599600

600601
if ( getVersion().isSameOrAfter( 9, 4 ) ) {
601602
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
@@ -463,6 +463,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
463463
functionFactory.arrayRemoveIndex_unnest( true );
464464
functionFactory.arraySlice_operator();
465465
functionFactory.arrayReplace();
466+
functionFactory.arrayTrim_trim_array();
466467

467468
functionContributions.getFunctionRegistry().register(
468469
"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
@@ -323,6 +323,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
323323
functionFactory.arrayRemoveIndex_h2( getMaximumArraySize() );
324324
functionFactory.arraySlice();
325325
functionFactory.arrayReplace_h2( getMaximumArraySize() );
326+
functionFactory.arrayTrim_trim_array();
326327
}
327328

328329
/**

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
202202
functionFactory.arrayRemoveIndex_unnest( false );
203203
functionFactory.arraySlice_unnest();
204204
functionFactory.arrayReplace_unnest();
205+
functionFactory.arrayTrim_trim_array();
205206
}
206207

207208
@Override

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,28 @@ public void addAuxiliaryDatabaseObjects(
471471
false
472472
)
473473
);
474+
database.addAuxiliaryDatabaseObject(
475+
new NamedAuxiliaryDatabaseObject(
476+
arrayTypeName + "_trim",
477+
database.getDefaultNamespace(),
478+
new String[]{
479+
"create or replace function " + arrayTypeName + "_trim(arr in " + arrayTypeName +
480+
", elems number) return " + arrayTypeName + " deterministic is " +
481+
"res " + arrayTypeName + ":=" + arrayTypeName + "(); begin " +
482+
"if arr is null or elems is null then return null; end if; " +
483+
"if arr.count < elems then raise_application_error (-20000, 'number of elements to trim must be between 0 and '||arr.count); end if;" +
484+
"for i in 1 .. arr.count-elems loop " +
485+
"res.extend; " +
486+
"res(i) := arr(i); " +
487+
"end loop; " +
488+
"return res; " +
489+
"end;"
490+
},
491+
new String[] { "drop function " + arrayTypeName + "_trim" },
492+
emptySet(),
493+
false
494+
)
495+
);
474496
}
475497

476498
protected String createOrReplaceConcatFunction(String arrayTypeName) {

0 commit comments

Comments
 (0)