Skip to content

Commit c3e1815

Browse files
committed
HHH-17355 Add array_positions and array_positions_list functions
1 parent fe9289b commit c3e1815

31 files changed

+632
-14
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,6 +1120,8 @@ 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_agg()` | Aggregates row values into an array
11221122
| `array_position()` | Determines the position of an element in an array
1123+
| `array_positions()` | Determines all positions of an element in an array
1124+
| `array_positions_list()` | Like `array_positions`, but returns the result as `List<Integer>`
11231125
| `array_length()` | Determines the length of an array
11241126
| `array_concat()` | Concatenates array with each other in order
11251127
| `array_prepend()` | Prepends element to array
@@ -1175,6 +1177,20 @@ include::{array-example-dir-hql}/ArrayPositionTest.java[tags=hql-array-position-
11751177
----
11761178
====
11771179
1180+
[[hql-array-positions-functions]]
1181+
===== `array_positions()` and `array_positions_list()`
1182+
1183+
Returns an `int[]` of 1-based positions of matching elements in the array. Returns an empty array if the element is not found and `null` if the array is `null`.
1184+
To retrieve the result as `List<Integer>`, use the `array_positions_list()` function.
1185+
1186+
[[hql-array-positions-example]]
1187+
====
1188+
[source, JAVA, indent=0]
1189+
----
1190+
include::{array-example-dir-hql}/ArrayPositionsTest.java[tags=hql-array-positions-example]
1191+
----
1192+
====
1193+
11781194
[[hql-array-length-functions]]
11791195
===== `array_length()`
11801196

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
@@ -464,6 +464,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
464464
functionFactory.array_postgresql();
465465
functionFactory.arrayAggregate();
466466
functionFactory.arrayPosition_postgresql();
467+
functionFactory.arrayPositions_postgresql();
467468
functionFactory.arrayLength_cardinality();
468469
functionFactory.arrayConcat_postgresql();
469470
functionFactory.arrayPrepend_postgresql();

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,8 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
372372
functionFactory.listagg( null );
373373
functionFactory.array();
374374
functionFactory.arrayAggregate();
375+
functionFactory.arrayPosition_h2( getMaximumArraySize() );
376+
functionFactory.arrayPositions_h2( getMaximumArraySize() );
375377
functionFactory.arrayLength_cardinality();
376378
functionFactory.arrayConcat_operator();
377379
functionFactory.arrayPrepend_operator();

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
@@ -250,6 +250,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
250250
functionFactory.array_hsql();
251251
functionFactory.arrayAggregate();
252252
functionFactory.arrayPosition_hsql();
253+
functionFactory.arrayPositions_hsql();
253254
functionFactory.arrayLength_cardinality();
254255
functionFactory.arrayConcat_operator();
255256
functionFactory.arrayPrepend_operator();

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
@@ -286,6 +286,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
286286
functionFactory.array_oracle();
287287
functionFactory.arrayAggregate_jsonArrayagg();
288288
functionFactory.arrayPosition_oracle();
289+
functionFactory.arrayPositions_oracle();
289290
functionFactory.arrayLength_oracle();
290291
functionFactory.arrayConcat_oracle();
291292
functionFactory.arrayPrepend_oracle();

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
@@ -584,6 +584,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
584584
functionFactory.array_postgresql();
585585
functionFactory.arrayAggregate();
586586
functionFactory.arrayPosition_postgresql();
587+
functionFactory.arrayPositions_postgresql();
587588
functionFactory.arrayLength_cardinality();
588589
functionFactory.arrayConcat_postgresql();
589590
functionFactory.arrayPrepend_postgresql();

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
451451
functionFactory.array_postgresql();
452452
functionFactory.arrayAggregate();
453453
functionFactory.arrayPosition_postgresql();
454+
functionFactory.arrayPositions_postgresql();
454455
functionFactory.arrayLength_cardinality();
455456
functionFactory.arrayConcat_postgresql();
456457
functionFactory.arrayPrepend_postgresql();

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,8 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
311311
functionFactory.hypotheticalOrderedSetAggregates();
312312
functionFactory.array();
313313
functionFactory.arrayAggregate();
314+
functionFactory.arrayPosition_h2( getMaximumArraySize() );
315+
functionFactory.arrayPositions_h2( getMaximumArraySize() );
314316
functionFactory.arrayLength_cardinality();
315317
functionFactory.arrayConcat_operator();
316318
functionFactory.arrayPrepend_operator();

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
190190
functionFactory.array_hsql();
191191
functionFactory.arrayAggregate();
192192
functionFactory.arrayPosition_hsql();
193+
functionFactory.arrayPositions_hsql();
193194
functionFactory.arrayLength_cardinality();
194195
functionFactory.arrayConcat_operator();
195196
functionFactory.arrayPrepend_operator();

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,32 @@ public void addAuxiliaryDatabaseObjects(
515515
false
516516
)
517517
);
518+
database.addAuxiliaryDatabaseObject(
519+
new NamedAuxiliaryDatabaseObject(
520+
arrayTypeName + "_positions",
521+
database.getDefaultNamespace(),
522+
new String[]{
523+
"create or replace function " + arrayTypeName + "_positions(arr in " + arrayTypeName +
524+
", elem in " + getRawTypeName( elementType ) + ") return sdo_ordinate_array deterministic is " +
525+
"res sdo_ordinate_array:=sdo_ordinate_array(); begin " +
526+
"if arr is null then return null; end if; " +
527+
"if elem is null then " +
528+
"for i in 1 .. arr.count loop " +
529+
"if arr(i) is null then res.extend; res(res.last):=i; end if; " +
530+
"end loop; " +
531+
"else " +
532+
"for i in 1 .. arr.count loop " +
533+
"if arr(i)=elem then res.extend; res(res.last):=i; end if; " +
534+
"end loop; " +
535+
"end if; " +
536+
"return res; " +
537+
"end;"
538+
},
539+
new String[] { "drop function " + arrayTypeName + "_positions" },
540+
emptySet(),
541+
false
542+
)
543+
);
518544
}
519545

520546
protected String createOrReplaceConcatFunction(String arrayTypeName) {

0 commit comments

Comments
 (0)