8
8
9
9
import org .hibernate .HibernateException ;
10
10
import org .hibernate .LockOptions ;
11
+ import org .hibernate .boot .Metadata ;
12
+ import org .hibernate .boot .model .relational .QualifiedNameImpl ;
11
13
import org .hibernate .cfg .Environment ;
12
14
import org .hibernate .dialect .function .SQLFunctionTemplate ;
15
+ import org .hibernate .engine .jdbc .env .spi .JdbcEnvironment ;
13
16
import org .hibernate .exception .spi .TemplatedViolatedConstraintNameExtracter ;
14
17
import org .hibernate .exception .spi .ViolatedConstraintNameExtracter ;
18
+ import org .hibernate .mapping .Column ;
19
+ import org .hibernate .mapping .Index ;
15
20
import org .hibernate .sql .ForUpdateFragment ;
21
+ import org .hibernate .tool .schema .internal .StandardIndexExporter ;
22
+ import org .hibernate .tool .schema .spi .Exporter ;
16
23
import org .hibernate .type .StandardBasicTypes ;
17
24
18
25
import java .sql .CallableStatement ;
19
26
import java .sql .ResultSet ;
20
27
import java .sql .SQLException ;
21
28
import java .sql .Types ;
29
+ import java .util .Iterator ;
22
30
import java .util .Map ;
23
31
24
32
/**
@@ -28,6 +36,8 @@ public class Teradata14Dialect extends TeradataDialect {
28
36
/**
29
37
* Constructor
30
38
*/
39
+ StandardIndexExporter TeraIndexExporter = null ;
40
+
31
41
public Teradata14Dialect () {
32
42
super ();
33
43
//registerColumnType data types
@@ -41,6 +51,8 @@ public Teradata14Dialect() {
41
51
42
52
registerFunction ( "current_time" , new SQLFunctionTemplate ( StandardBasicTypes .TIME , "current_time" ) );
43
53
registerFunction ( "current_date" , new SQLFunctionTemplate ( StandardBasicTypes .DATE , "current_date" ) );
54
+
55
+ TeraIndexExporter = new TeradataIndexExporter ( this );
44
56
}
45
57
46
58
@ Override
@@ -200,5 +212,68 @@ public boolean useFollowOnLocking() {
200
212
public boolean supportsLockTimeouts () {
201
213
return false ;
202
214
}
215
+
216
+ @ Override
217
+ public Exporter <Index > getIndexExporter () {
218
+ return TeraIndexExporter ;
219
+ }
220
+
221
+
222
+ private class TeradataIndexExporter extends StandardIndexExporter implements Exporter <Index > {
223
+
224
+ public TeradataIndexExporter (Dialect dialect ) {
225
+ super (dialect );
226
+ }
227
+
228
+ @ Override
229
+ public String [] getSqlCreateStrings (Index index , Metadata metadata ) {
230
+ final JdbcEnvironment jdbcEnvironment = metadata .getDatabase ().getJdbcEnvironment ();
231
+ final String tableName = jdbcEnvironment .getQualifiedObjectNameFormatter ().format (
232
+ index .getTable ().getQualifiedTableName (),
233
+ jdbcEnvironment .getDialect ()
234
+ );
235
+
236
+ final String indexNameForCreation ;
237
+ if ( getDialect ().qualifyIndexName () ) {
238
+ indexNameForCreation = jdbcEnvironment .getQualifiedObjectNameFormatter ().format (
239
+ new QualifiedNameImpl (
240
+ index .getTable ().getQualifiedTableName ().getCatalogName (),
241
+ index .getTable ().getQualifiedTableName ().getSchemaName (),
242
+ jdbcEnvironment .getIdentifierHelper ().toIdentifier ( index .getName () )
243
+ ),
244
+ jdbcEnvironment .getDialect ()
245
+ );
246
+ }
247
+ else {
248
+ indexNameForCreation = index .getName ();
249
+ }
250
+
251
+ StringBuilder colBuf = new StringBuilder ("" );
252
+ boolean first = true ;
253
+ Iterator <Column > columnItr = index .getColumnIterator ();
254
+ while ( columnItr .hasNext () ) {
255
+ final Column column = columnItr .next ();
256
+ if ( first ) {
257
+ first = false ;
258
+ }
259
+ else {
260
+ colBuf .append ( ", " );
261
+ }
262
+ colBuf .append ( ( column .getQuotedName ( jdbcEnvironment .getDialect () )) );
263
+ }
264
+ colBuf .append ( ")" );
265
+
266
+ final StringBuilder buf = new StringBuilder ()
267
+ .append ( "create index " )
268
+ .append ( indexNameForCreation )
269
+ .append ( "(" + colBuf )
270
+ .append ( " on " )
271
+ .append ( tableName );
272
+
273
+ return new String [] { buf .toString () };
274
+ }
275
+ }
276
+
277
+
203
278
}
204
279
0 commit comments