Skip to content

Commit 937116e

Browse files
committed
HHH-17335 Add array_slice function
1 parent 950423e commit 937116e

File tree

18 files changed

+357
-19
lines changed

18 files changed

+357
-19
lines changed

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,6 +1130,7 @@ The following functions deal with SQL array types, which are not supported on ev
11301130
| `array_get()` | Accesses the element of an array by index
11311131
| `array_set()` | Creates array copy with given element at given index
11321132
| `array_remove()` | Creates array copy with given element removed
1133+
| `array_slice()` | Creates a sub-array of the based on lower and upper index
11331134
|===
11341135
11351136
===== `array()`
@@ -1301,6 +1302,20 @@ include::{array-example-dir-hql}/ArrayRemoveIndexTest.java[tags=hql-array-remove
13011302
----
13021303
====
13031304
1305+
[[hql-array-slice-functions]]
1306+
===== `array_slice()`
1307+
1308+
Returns the sub-array as specified by the given start and end index. Returns `null` if any of the arguments is `null`
1309+
and also if the index is out of bounds.
1310+
1311+
[[hql-array-remove-index-example]]
1312+
====
1313+
[source, JAVA, indent=0]
1314+
----
1315+
include::{array-example-dir-hql}/ArrayRemoveIndexTest.java[tags=hql-array-remove-index-example]
1316+
----
1317+
====
1318+
13041319
[[hql-user-defined-functions]]
13051320
==== Native and user-defined functions
13061321

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,8 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
475475
functionFactory.arrayGet_bracket();
476476
functionFactory.arraySet_unnest();
477477
functionFactory.arrayRemove();
478-
functionFactory.arrayRemoveIndex_postgresql();
478+
functionFactory.arrayRemoveIndex_unnest( true );
479+
functionFactory.arraySlice_operator();
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.arraySet_h2();
385385
functionFactory.arrayRemove_h2();
386386
functionFactory.arrayRemoveIndex_h2();
387+
functionFactory.arraySlice();
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: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,8 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
261261
functionFactory.arrayGet_unnest();
262262
functionFactory.arraySet_hsql();
263263
functionFactory.arrayRemove_hsql();
264-
functionFactory.arrayRemoveIndex_unnest();
264+
functionFactory.arrayRemoveIndex_unnest( false );
265+
functionFactory.arraySlice_unnest();
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.arraySet_oracle();
299299
functionFactory.arrayRemove_oracle();
300300
functionFactory.arrayRemoveIndex_oracle();
301+
functionFactory.arraySlice_oracle();
301302
}
302303

303304
@Override

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,8 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
595595
functionFactory.arrayGet_bracket();
596596
functionFactory.arraySet_unnest();
597597
functionFactory.arrayRemove();
598-
functionFactory.arrayRemoveIndex_postgresql();
598+
functionFactory.arrayRemoveIndex_unnest( true );
599+
functionFactory.arraySlice_operator();
599600

600601
if ( getVersion().isSameOrAfter( 9, 4 ) ) {
601602
functionFactory.makeDateTimeTimestamp();

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,8 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
462462
functionFactory.arrayGet_bracket();
463463
functionFactory.arraySet_unnest();
464464
functionFactory.arrayRemove();
465-
functionFactory.arrayRemoveIndex_postgresql();
465+
functionFactory.arrayRemoveIndex_unnest( true );
466+
functionFactory.arraySlice_operator();
466467

467468
functionContributions.getFunctionRegistry().register(
468469
"trunc",

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@
9393
import static org.hibernate.type.SqlTypes.NCHAR;
9494
import static org.hibernate.type.SqlTypes.NVARCHAR;
9595
import static org.hibernate.type.SqlTypes.OTHER;
96-
import static org.hibernate.type.SqlTypes.TIMESTAMP_UTC;
9796
import static org.hibernate.type.SqlTypes.UUID;
9897
import static org.hibernate.type.SqlTypes.VARBINARY;
9998
import static org.hibernate.type.SqlTypes.VARCHAR;
@@ -324,6 +323,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
324323
functionFactory.arraySet_h2();
325324
functionFactory.arrayRemove_h2();
326325
functionFactory.arrayRemoveIndex_h2();
326+
functionFactory.arraySlice();
327327
}
328328

329329
@Override

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
201201
functionFactory.arrayGet_unnest();
202202
functionFactory.arraySet_hsql();
203203
functionFactory.arrayRemove_hsql();
204-
functionFactory.arrayRemoveIndex_unnest();
204+
functionFactory.arrayRemoveIndex_unnest( false );
205+
functionFactory.arraySlice_unnest();
205206
}
206207

207208
@Override

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,26 @@ public void addAuxiliaryDatabaseObjects(
419419
false
420420
)
421421
);
422+
database.addAuxiliaryDatabaseObject(
423+
new NamedAuxiliaryDatabaseObject(
424+
arrayTypeName + "_slice",
425+
database.getDefaultNamespace(),
426+
new String[]{
427+
"create or replace function " + arrayTypeName + "_slice(arr in " + arrayTypeName +
428+
", startIdx in number, endIdx in number) return " + arrayTypeName + " deterministic is " +
429+
"res " + arrayTypeName + ":=" + arrayTypeName + "(); begin " +
430+
"if arr is null or startIdx is null or endIdx is null then return null; end if; " +
431+
"for i in startIdx .. least(arr.count,endIdx) loop " +
432+
"res.extend; res(res.last) := arr(i); " +
433+
"end loop; " +
434+
"return res; " +
435+
"end;"
436+
},
437+
new String[] { "drop function " + arrayTypeName + "_slice" },
438+
emptySet(),
439+
false
440+
)
441+
);
422442
}
423443

424444
protected String createOrReplaceConcatFunction(String arrayTypeName) {

0 commit comments

Comments
 (0)