java-topology/defects/hibernate/patch/hibernate-0001-constraint-addcolumn-hashset.patch

60 lines
2.1 KiB
Diff

# UNDF: UNDF-2026-000000107
--- a/hibernate-core/src/main/java/org/hibernate/mapping/Constraint.java
+++ b/hibernate-core/src/main/java/org/hibernate/mapping/Constraint.java
@@ -7,7 +7,9 @@ package org.hibernate.mapping;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Set;
import org.hibernate.MappingException;
import org.hibernate.boot.model.relational.Exportable;
@@ -22,7 +24,12 @@ public abstract class Constraint implements Exportable, Serializable {
private String name;
- private final ArrayList<Column> columns = new ArrayList<>();
+ // hibernate-0001 fix: LinkedHashSet for O(1) contains() in addColumn().
+ // Previously ArrayList<Column>: addColumn() called contains() which is O(C)
+ // and addColumn() is invoked inside loops over columns/selectables,
+ // giving O(C²) total cost. LinkedHashSet preserves insertion order
+ // (required by callers of getColumns() that iterate in definition order)
+ // while making contains() O(1).
+ private final LinkedHashSet<Column> columnsSet = new LinkedHashSet<>();
private Table table;
private String options = "";
@@ -44,9 +51,9 @@ public abstract class Constraint implements Exportable, Serializable {
public void addColumn(Column column) {
- if ( !columns.contains( column ) ) {
- columns.add( column );
- }
+ // O(1) with LinkedHashSet; was O(C) with ArrayList
+ columnsSet.add( column );
}
public void addColumns(Value value) {
@@ -60,19 +67,19 @@ public abstract class Constraint implements Exportable, Serializable {
/**
* @return true if this constraint already contains a column with same name.
*/
public boolean containsColumn(Column column) {
- return columns.contains( column );
+ return columnsSet.contains( column );
}
public int getColumnSpan() {
- return columns.size();
+ return columnsSet.size();
}
public Column getColumn(int i) {
- return columns.get( i );
+ return (Column) columnsSet.toArray()[i];
}
public List<Column> getColumns() {
- return columns;
+ return new ArrayList<>( columnsSet );
}