Skip to content

Commit 79e3af5

Browse files
committed
HHH-17355 Add array_to_string function
1 parent d558df9 commit 79e3af5

File tree

19 files changed

+358
-2
lines changed

19 files changed

+358
-2
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
@@ -1138,6 +1138,7 @@ The following functions deal with SQL array types, which are not supported on ev
11381138
| `array_replace()` | Creates array copy replacing a given element with another
11391139
| `array_trim()` | Creates array copy trimming the last _N_ elements
11401140
| `array_fill()` | Creates array filled with the same element _N_ times
1141+
| `array_to_string()` | String representation of non-null array elements
11411142
|===
11421143
11431144
===== `array()`
@@ -1429,6 +1430,19 @@ include::{array-example-dir-hql}/ArrayFillTest.java[tags=hql-array-fill-example]
14291430
----
14301431
====
14311432
1433+
===== `array_to_string()`
1434+
1435+
Concatenates the non-null array elements with a separator, as specified by the arguments.
1436+
Returns `null` if the first argument is `null`.
1437+
1438+
[[hql-array-to-string-example]]
1439+
====
1440+
[source, JAVA, indent=0]
1441+
----
1442+
include::{array-example-dir-hql}/ArrayToStringTest.java[tags=hql-array-to-string-example]
1443+
----
1444+
====
1445+
14321446
[[hql-user-defined-functions]]
14331447
==== Native and user-defined functions
14341448

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
@@ -479,6 +479,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
479479
functionFactory.arrayReplace();
480480
functionFactory.arrayTrim_trim_array();
481481
functionFactory.arrayFill_postgresql();
482+
functionFactory.arrayToString_postgresql();
482483

483484
functionContributions.getFunctionRegistry().register(
484485
"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
@@ -388,6 +388,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
388388
functionFactory.arrayReplace_h2( getMaximumArraySize() );
389389
functionFactory.arrayTrim_trim_array();
390390
functionFactory.arrayFill_h2();
391+
functionFactory.arrayToString_h2( getMaximumArraySize() );
391392
}
392393
else {
393394
// 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
@@ -265,6 +265,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
265265
functionFactory.arrayReplace_unnest();
266266
functionFactory.arrayTrim_trim_array();
267267
functionFactory.arrayFill_hsql();
268+
functionFactory.arrayToString_hsql();
268269
}
269270

270271
@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
@@ -301,6 +301,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
301301
functionFactory.arrayReplace_oracle();
302302
functionFactory.arrayTrim_oracle();
303303
functionFactory.arrayFill_oracle();
304+
functionFactory.arrayToString_oracle();
304305
}
305306

306307
@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
@@ -599,6 +599,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
599599
functionFactory.arrayReplace();
600600
functionFactory.arrayTrim_trim_array();
601601
functionFactory.arrayFill_postgresql();
602+
functionFactory.arrayToString_postgresql();
602603

603604
if ( getVersion().isSameOrAfter( 9, 4 ) ) {
604605
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
@@ -466,6 +466,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
466466
functionFactory.arrayReplace();
467467
functionFactory.arrayTrim_trim_array();
468468
functionFactory.arrayFill_postgresql();
469+
functionFactory.arrayToString_postgresql();
469470

470471
functionContributions.getFunctionRegistry().register(
471472
"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
@@ -327,6 +327,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
327327
functionFactory.arrayReplace_h2( getMaximumArraySize() );
328328
functionFactory.arrayTrim_trim_array();
329329
functionFactory.arrayFill_h2();
330+
functionFactory.arrayToString_h2( getMaximumArraySize() );
330331
}
331332

332333
/**

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
205205
functionFactory.arrayReplace_unnest();
206206
functionFactory.arrayTrim_trim_array();
207207
functionFactory.arrayFill_hsql();
208+
functionFactory.arrayToString_hsql();
208209
}
209210

210211
@Override

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,29 @@ public void addAuxiliaryDatabaseObjects(
541541
false
542542
)
543543
);
544+
database.addAuxiliaryDatabaseObject(
545+
new NamedAuxiliaryDatabaseObject(
546+
arrayTypeName + "_to_string",
547+
database.getDefaultNamespace(),
548+
new String[]{
549+
"create or replace function " + arrayTypeName + "_to_string(arr in " + arrayTypeName +
550+
", sep in varchar2) return varchar2 deterministic is " +
551+
"res varchar2(4000):=''; begin " +
552+
"if arr is null or sep is null then return null; end if; " +
553+
"for i in 1 .. arr.count loop " +
554+
"if arr(i) is not null then " +
555+
"if length(res)<>0 then res:=res||sep; end if; " +
556+
"res:=res||arr(i); " +
557+
"end if; " +
558+
"end loop; " +
559+
"return res; " +
560+
"end;"
561+
},
562+
new String[] { "drop function " + arrayTypeName + "_to_string" },
563+
emptySet(),
564+
false
565+
)
566+
);
544567
}
545568

546569
protected String createOrReplaceConcatFunction(String arrayTypeName) {

0 commit comments

Comments
 (0)