Skip to content

Commit 7f10a48

Browse files
committed
HHH-17335 Add array_position function
1 parent 65fb449 commit 7f10a48

21 files changed

+339
-14
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
@@ -1120,6 +1120,7 @@ The following functions deal with SQL array types, which are not supported on ev
11201120
| `array()` | Creates an array based on the passed arguments
11211121
| `array_contains()` | Whether an array contains an element
11221122
| `array_contains_null()` | Whether an array contains a null
1123+
| `array_position()` | Determines the position of an element in an array
11231124
|===
11241125
11251126
===== `array()`
@@ -1153,6 +1154,19 @@ include::{array-example-dir-hql}/ArrayContainsTest.java[tags=hql-array-contains-
11531154
----
11541155
====
11551156
1157+
[[hql-array-position-functions]]
1158+
===== `array_position()`
1159+
1160+
Returns the 1-based position of an element in the array. Returns 0 if the element is not found and `null` if the array is `null`.
1161+
1162+
[[hql-array-position-example]]
1163+
====
1164+
[source, JAVA, indent=0]
1165+
----
1166+
include::{array-example-dir-hql}/ArrayPositionTest.java[tags=hql-array-position-example]
1167+
----
1168+
====
1169+
11561170
[[hql-user-defined-functions]]
11571171
==== Native and user-defined functions
11581172

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
@@ -465,6 +465,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
465465
functionFactory.arrayAggregate();
466466
functionFactory.arrayContains_operator();
467467
functionFactory.arrayContainsNull_array_position();
468+
functionFactory.arrayPosition_postgresql();
468469

469470
functionContributions.getFunctionRegistry().register(
470471
"trunc",

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
@@ -251,6 +251,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
251251
functionFactory.arrayAggregate();
252252
functionFactory.arrayContains_hsql();
253253
functionFactory.arrayContainsNull_hsql();
254+
functionFactory.arrayPosition_hsql();
254255
}
255256

256257
@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
@@ -287,6 +287,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
287287
functionFactory.arrayAggregate_jsonArrayagg();
288288
functionFactory.arrayContains_oracle();
289289
functionFactory.arrayContainsNull_oracle();
290+
functionFactory.arrayPosition_oracle();
290291
}
291292

292293
@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
@@ -585,6 +585,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
585585
functionFactory.arrayAggregate();
586586
functionFactory.arrayContains_operator();
587587
functionFactory.arrayContainsNull_array_position();
588+
functionFactory.arrayPosition_postgresql();
588589

589590
if ( getVersion().isSameOrAfter( 9, 4 ) ) {
590591
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
@@ -452,6 +452,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
452452
functionFactory.arrayAggregate();
453453
functionFactory.arrayContains_operator();
454454
functionFactory.arrayContainsNull_array_position();
455+
functionFactory.arrayPosition_postgresql();
455456

456457
functionContributions.getFunctionRegistry().register(
457458
"trunc",

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
191191
functionFactory.arrayAggregate();
192192
functionFactory.arrayContains_hsql();
193193
functionFactory.arrayContainsNull_hsql();
194+
functionFactory.arrayPosition_hsql();
194195
}
195196

196197
@Override

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -233,19 +233,19 @@ public void addAuxiliaryDatabaseObjects(
233233
);
234234
database.addAuxiliaryDatabaseObject(
235235
new NamedAuxiliaryDatabaseObject(
236-
arrayTypeName + "_contains",
236+
arrayTypeName + "_position",
237237
database.getDefaultNamespace(),
238238
new String[]{
239-
"create or replace function " + arrayTypeName + "_contains(arr in " + arrayTypeName +
240-
", elem in " + getRawTypeName( elementType ) + ") return number deterministic is begin " +
239+
"create or replace function " + arrayTypeName + "_position(arr in " + arrayTypeName +
240+
", elem in " + getRawTypeName( elementType ) + ", startPos in number default 1) return number deterministic is begin " +
241241
"if arr is null then return null; end if; " +
242242
"if elem is null then " +
243-
"for i in 1 .. arr.count loop " +
244-
"if arr(i) is null then return 1; end if; " +
243+
"for i in startPos .. arr.count loop " +
244+
"if arr(i) is null then return i; end if; " +
245245
"end loop; " +
246246
"else " +
247-
"for i in 1 .. arr.count loop " +
248-
"if arr(i)=elem then return 1; end if; " +
247+
"for i in startPos .. arr.count loop " +
248+
"if arr(i)=elem then return i; end if; " +
249249
"end loop; " +
250250
"end if; " +
251251
"return 0; " +

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
316316
functionFactory.arrayAggregate_jsonArrayagg();
317317
functionFactory.arrayContains_oracle();
318318
functionFactory.arrayContainsNull_oracle();
319+
functionFactory.arrayPosition_oracle();
319320
}
320321

321322
@Override

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
633633
functionFactory.arrayAggregate();
634634
functionFactory.arrayContains_operator();
635635
functionFactory.arrayContainsNull_array_position();
636+
functionFactory.arrayPosition_postgresql();
636637

637638
functionFactory.makeDateTimeTimestamp();
638639
// Note that PostgreSQL doesn't support the OVER clause for ordered set-aggregate functions

0 commit comments

Comments
 (0)