@Override public Identifier determineIndexName(ImplicitIndexNameSource source) { Identifier userProvidedIdentifier = source.getUserProvidedIdentifier(); return userProvidedIdentifier != null ? userProvidedIdentifier : toIdentifier( NamingHelper.withCharset( source.getBuildingContext().getBuildingOptions().getSchemaCharset() ).generateHashedConstraintName( "IDX", source.getTableName(), source.getColumnNames() ), source.getBuildingContext() ); }
/** * If a foreign-key is not explicitly named, this is called to generate * a unique hash using the table and column names. */ public String generateHashedFkName( String prefix, Identifier tableName, Identifier referencedTableName, List<Identifier> columnNames) { final Identifier[] columnNamesArray; if ( columnNames == null || columnNames.isEmpty() ) { columnNamesArray = new Identifier[0]; } else { columnNamesArray = columnNames.toArray( new Identifier[ columnNames.size() ] ); } return generateHashedFkName( prefix, tableName, referencedTableName, columnNamesArray ); }
/** * If a constraint is not explicitly named, this is called to generate * a unique hash using the table and column names. * * @return String The generated name */ public String generateHashedConstraintName(String prefix, Identifier tableName, Identifier... columnNames ) { // Use a concatenation that guarantees uniqueness, even if identical names // exist between all table and column identifiers. StringBuilder sb = new StringBuilder( "table`" + tableName + "`" ); // Ensure a consistent ordering of columns, regardless of the order // they were bound. // Clone the list, as sometimes a set of order-dependent Column // bindings are given. Identifier[] alphabeticalColumns = columnNames.clone(); Arrays.sort( alphabeticalColumns, new Comparator<Identifier>() { @Override public int compare(Identifier o1, Identifier o2) { return o1.getCanonicalName().compareTo( o2.getCanonicalName() ); } } ); for ( Identifier columnName : alphabeticalColumns ) { sb.append( "column`" ).append( columnName ).append( "`" ); } return prefix + hashedName( sb.toString() ); }
@Test @TestForIssue(jiraKey = "HHH-12357") public void generateHashedFkNameUSingUtf8() { Identifier booksDe = new Identifier( "Bücher", false ); Identifier authorsDe = new Identifier( "Autoren", false ); Identifier authorId = new Identifier( "autor_id", false ); defaultCharset.set( StandardCharsets.ISO_8859_1 ); String fkNameLatin1 = NamingHelper.withCharset( "UTF8" ).generateHashedFkName( "FK", booksDe, authorsDe, authorId ); assertEquals( "FKdgopp1hqnm8c1o6sfbb3tbeh", fkNameLatin1 ); defaultCharset.set( StandardCharsets.UTF_8 ); String fkNameUtf8 = NamingHelper.withCharset( "UTF8" ).generateHashedFkName( "FK", booksDe, authorsDe, authorId ); assertEquals( "FKdgopp1hqnm8c1o6sfbb3tbeh", fkNameUtf8 ); }
/** * If a constraint is not explicitly named, this is called to generate * a unique hash using the table and column names. * * @return String The generated name */ public String generateHashedConstraintName(String prefix, Identifier tableName, List<Identifier> columnNames) { Identifier[] columnNamesArray = new Identifier[columnNames.size()]; for ( int i = 0; i < columnNames.size(); i++ ) { columnNamesArray[i] = columnNames.get( i ); } return generateHashedConstraintName( prefix, tableName, columnNamesArray ); }
public static NamingHelper withCharset(String charset) { return new NamingHelper(charset); }
@Override public Identifier determineForeignKeyName(ImplicitForeignKeyNameSource source) { Identifier userProvidedIdentifier = source.getUserProvidedIdentifier(); source.getBuildingContext().getBuildingOptions().getSchemaCharset(); return userProvidedIdentifier != null ? userProvidedIdentifier : toIdentifier( NamingHelper.withCharset( source.getBuildingContext().getBuildingOptions().getSchemaCharset() ).generateHashedFkName( "FK", source.getTableName(), source.getReferencedTableName(), source.getColumnNames() ), source.getBuildingContext() ); }
/** * If a constraint is not explicitly named, this is called to generate * a unique hash using the table and column names. * * @return String The generated name */ public String generateHashedConstraintName(String prefix, Identifier tableName, List<Identifier> columnNames) { Identifier[] columnNamesArray = new Identifier[columnNames.size()]; for ( int i = 0; i < columnNames.size(); i++ ) { columnNamesArray[i] = columnNames.get( i ); } return generateHashedConstraintName( prefix, tableName, columnNamesArray ); }
public static NamingHelper withCharset(String charset) { return new NamingHelper(charset); }
@Override public Identifier determineUniqueKeyName(ImplicitUniqueKeyNameSource source) { Identifier userProvidedIdentifier = source.getUserProvidedIdentifier(); return userProvidedIdentifier != null ? userProvidedIdentifier : toIdentifier( NamingHelper.withCharset( source.getBuildingContext().getBuildingOptions().getSchemaCharset() ).generateHashedConstraintName( "UK", source.getTableName(), source.getColumnNames() ), source.getBuildingContext() ); }
@Override public Identifier determineForeignKeyName(ImplicitForeignKeyNameSource source) { Identifier userProvidedIdentifier = source.getUserProvidedIdentifier(); source.getBuildingContext().getBuildingOptions().getSchemaCharset(); return userProvidedIdentifier != null ? userProvidedIdentifier : toIdentifier( NamingHelper.withCharset( source.getBuildingContext().getBuildingOptions().getSchemaCharset() ).generateHashedFkName( "FK", source.getTableName(), source.getReferencedTableName(), source.getColumnNames() ), source.getBuildingContext() ); }
sb.append( "column`" ).append( columnName ).append( "`" ); return prefix + hashedName( sb.toString() );
@SuppressWarnings("unchecked") private void validateIndexSpecsForUniqueColumns(Table table, IndexOptions indexOptions, Set<String> forIndexNotReferenced, UniqueConstraintSchemaUpdateStrategy constraintMethod) { Iterator<Column> columnIterator = table.getColumnIterator(); while ( columnIterator.hasNext() ) { Column column = columnIterator.next(); if ( column.isUnique() ) { String indexName = NamingHelper.INSTANCE.generateHashedConstraintName( "UK_", table.getNameIdentifier(), Identifier.toIdentifier( column.getName() ) ); forIndexNotReferenced.remove( indexName ); if ( constraintMethod != UniqueConstraintSchemaUpdateStrategy.SKIP ) { MongoDBIndexSpec indexSpec = new MongoDBIndexSpec( table.getName(), column.getName(), indexName, getIndexOptionDocument( table, indexOptions.getOptionForIndex( indexName ) ) ); if ( validateIndexSpec( indexSpec ) ) { indexSpecs.add( indexSpec ); } } } } }
@Test @TestForIssue(jiraKey = "HHH-12357") public void generateHashedFkName() { Identifier booksDe = new Identifier( "Bücher", false ); Identifier authorsDe = new Identifier( "Autoren", false ); Identifier authorId = new Identifier( "autor_id", false ); defaultCharset.set( StandardCharsets.ISO_8859_1 ); String fkNameLatin1 = NamingHelper.INSTANCE.generateHashedFkName( "FK", booksDe, authorsDe, authorId ); assertEquals( "FKpvm24wh1qwbmx6xjcbc7uv5f7", fkNameLatin1 ); defaultCharset.set( StandardCharsets.UTF_8 ); String fkNameUtf8 = NamingHelper.INSTANCE.generateHashedFkName( "FK", booksDe, authorsDe, authorId ); assertEquals( "FKdgopp1hqnm8c1o6sfbb3tbeh", fkNameUtf8 ); }
@Override public Identifier determineUniqueKeyName(ImplicitUniqueKeyNameSource source) { Identifier userProvidedIdentifier = source.getUserProvidedIdentifier(); return userProvidedIdentifier != null ? userProvidedIdentifier : toIdentifier( NamingHelper.withCharset( source.getBuildingContext().getBuildingOptions().getSchemaCharset() ).generateHashedConstraintName( "UK", source.getTableName(), source.getColumnNames() ), source.getBuildingContext() ); }
/** * Generates a constraint name. This code is from Hibernate 4. It is slightly different from * Hibernate 5 NamingHelper code. */ public static String generateHashedConstraintName(String prefix, Identifier tableName, List<Identifier> columnNames) { StringBuilder sb = new StringBuilder("table`" + tableName.getText() + "`"); List<String> alphabeticalColumnNames = toString(columnNames); Collections.sort(alphabeticalColumnNames); for (String columnName : alphabeticalColumnNames) { sb.append("column`" + columnName + "`"); } return prefix + NamingHelper.INSTANCE.hashedName(sb.toString()); }
@SuppressWarnings("unchecked") private void validateIndexSpecsForUniqueColumns(Table table, IndexOptions indexOptions, Set<String> forIndexNotReferenced, UniqueConstraintSchemaUpdateStrategy constraintMethod) { Iterator<Column> columnIterator = table.getColumnIterator(); while ( columnIterator.hasNext() ) { Column column = columnIterator.next(); if ( column.isUnique() ) { String indexName = NamingHelper.INSTANCE.generateHashedConstraintName( "UK_", table.getNameIdentifier(), Identifier.toIdentifier( column.getName() ) ); forIndexNotReferenced.remove( indexName ); if ( constraintMethod != UniqueConstraintSchemaUpdateStrategy.SKIP ) { MongoDBIndexSpec indexSpec = new MongoDBIndexSpec( table.getName(), column.getName(), indexName, getIndexOptionDocument( table, indexOptions.getOptionForIndex( indexName ) ) ); if ( validateIndexSpec( indexSpec ) ) { indexSpecs.add( indexSpec ); } } } } }
/** * If a foreign-key is not explicitly named, this is called to generate * a unique hash using the table and column names. */ public String generateHashedFkName( String prefix, Identifier tableName, Identifier referencedTableName, List<Identifier> columnNames) { final Identifier[] columnNamesArray; if ( columnNames == null || columnNames.isEmpty() ) { columnNamesArray = new Identifier[0]; } else { columnNamesArray = columnNames.toArray( new Identifier[ columnNames.size() ] ); } return generateHashedFkName( prefix, tableName, referencedTableName, columnNamesArray ); }
@Override public Identifier determineIndexName(ImplicitIndexNameSource source) { Identifier userProvidedIdentifier = source.getUserProvidedIdentifier(); return userProvidedIdentifier != null ? userProvidedIdentifier : toIdentifier( NamingHelper.withCharset( source.getBuildingContext().getBuildingOptions().getSchemaCharset() ).generateHashedConstraintName( "IDX", source.getTableName(), source.getColumnNames() ), source.getBuildingContext() ); }
/** * If a constraint is not explicitly named, this is called to generate * a unique hash using the table and column names. * * @return String The generated name */ public String generateHashedConstraintName(String prefix, Identifier tableName, Identifier... columnNames ) { // Use a concatenation that guarantees uniqueness, even if identical names // exist between all table and column identifiers. StringBuilder sb = new StringBuilder( "table`" + tableName + "`" ); // Ensure a consistent ordering of columns, regardless of the order // they were bound. // Clone the list, as sometimes a set of order-dependent Column // bindings are given. Identifier[] alphabeticalColumns = columnNames.clone(); Arrays.sort( alphabeticalColumns, new Comparator<Identifier>() { @Override public int compare(Identifier o1, Identifier o2) { return o1.getCanonicalName().compareTo( o2.getCanonicalName() ); } } ); for ( Identifier columnName : alphabeticalColumns ) { sb.append( "column`" ).append( columnName ).append( "`" ); } return prefix + hashedName( sb.toString() ); }