23
23
*/
24
24
public class PostgreSQLUnnestFunction extends UnnestFunction {
25
25
26
- public PostgreSQLUnnestFunction () {
26
+ private final boolean supportsJsonTable ;
27
+
28
+ public PostgreSQLUnnestFunction (boolean supportsJsonTable ) {
27
29
super ( null , "ordinality" );
30
+ this .supportsJsonTable = supportsJsonTable ;
28
31
}
29
32
30
33
@ Override
@@ -36,41 +39,54 @@ protected void renderJsonTable(
36
39
AnonymousTupleTableGroupProducer tupleType ,
37
40
String tableIdentifierVariable ,
38
41
SqlAstTranslator <?> walker ) {
39
- final AggregateSupport aggregateSupport = walker .getSessionFactory ().getJdbcServices ().getDialect ()
40
- .getAggregateSupport ();
41
- sqlAppender .appendSql ( "(select" );
42
- tupleType .forEachSelectable ( 0 , (selectionIndex , selectableMapping ) -> {
43
- if ( selectionIndex == 0 ) {
44
- sqlAppender .append ( ' ' );
45
- }
46
- else {
47
- sqlAppender .append ( ',' );
48
- }
49
- if ( CollectionPart .Nature .INDEX .getName ().equals ( selectableMapping .getSelectableName () ) ) {
50
- sqlAppender .appendSql ( "t.i" );
42
+ if ( supportsJsonTable ) {
43
+ super .renderJsonTable (
44
+ sqlAppender ,
45
+ array ,
46
+ pluralType ,
47
+ sqlTypedMapping ,
48
+ tupleType ,
49
+ tableIdentifierVariable ,
50
+ walker
51
+ );
52
+ }
53
+ else {
54
+ final AggregateSupport aggregateSupport = walker .getSessionFactory ().getJdbcServices ().getDialect ()
55
+ .getAggregateSupport ();
56
+ sqlAppender .appendSql ( "(select" );
57
+ tupleType .forEachSelectable ( 0 , (selectionIndex , selectableMapping ) -> {
58
+ if ( selectionIndex == 0 ) {
59
+ sqlAppender .append ( ' ' );
60
+ }
61
+ else {
62
+ sqlAppender .append ( ',' );
63
+ }
64
+ if ( CollectionPart .Nature .INDEX .getName ().equals ( selectableMapping .getSelectableName () ) ) {
65
+ sqlAppender .appendSql ( "t.i" );
66
+ }
67
+ else {
68
+ sqlAppender .append ( aggregateSupport .aggregateComponentCustomReadExpression (
69
+ "" ,
70
+ "" ,
71
+ "t.v" ,
72
+ selectableMapping .getSelectableName (),
73
+ SqlTypes .JSON ,
74
+ selectableMapping ,
75
+ walker .getSessionFactory ().getTypeConfiguration ()
76
+ ) );
77
+ }
78
+ sqlAppender .append ( " as " );
79
+ sqlAppender .append ( selectableMapping .getSelectionExpression () );
80
+ } );
81
+ sqlAppender .appendSql ( " from jsonb_array_elements(" );
82
+ array .accept ( walker );
83
+ sqlAppender .appendSql ( ')' );
84
+ if ( tupleType .findSubPart ( CollectionPart .Nature .INDEX .getName (), null ) != null ) {
85
+ sqlAppender .appendSql ( " with ordinality t(v,i))" );
51
86
}
52
87
else {
53
- sqlAppender .append ( aggregateSupport .aggregateComponentCustomReadExpression (
54
- "" ,
55
- "" ,
56
- "t.v" ,
57
- selectableMapping .getSelectableName (),
58
- SqlTypes .JSON ,
59
- selectableMapping ,
60
- walker .getSessionFactory ().getTypeConfiguration ()
61
- ) );
88
+ sqlAppender .appendSql ( " t(v))" );
62
89
}
63
- sqlAppender .append ( " as " );
64
- sqlAppender .append ( selectableMapping .getSelectionExpression () );
65
- } );
66
- sqlAppender .appendSql ( " from jsonb_array_elements(" );
67
- array .accept ( walker );
68
- sqlAppender .appendSql ( ')' );
69
- if ( tupleType .findSubPart ( CollectionPart .Nature .INDEX .getName (), null ) != null ) {
70
- sqlAppender .appendSql ( " with ordinality t(v,i))" );
71
- }
72
- else {
73
- sqlAppender .appendSql ( " t(v))" );
74
90
}
75
91
}
76
92
0 commit comments