Skip to content

Commit f795dfc

Browse files
barreirosebersole
authored andcommitted
HHH-9811 - Change EntityPersister#resolveAttributeIndexes to take String[]
1 parent 73c5d57 commit f795dfc

File tree

11 files changed

+44
-55
lines changed

11 files changed

+44
-55
lines changed

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/EntityEnhancer.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
*/
77
package org.hibernate.bytecode.enhance.internal;
88

9+
import java.util.Collection;
10+
import java.util.LinkedList;
11+
import java.util.List;
12+
import java.util.Locale;
13+
914
import javassist.CannotCompileException;
1015
import javassist.CtClass;
1116
import javassist.CtField;
@@ -20,11 +25,6 @@
2025
import org.hibernate.bytecode.enhance.spi.EnhancerConstants;
2126
import org.hibernate.engine.spi.SelfDirtinessTracker;
2227

23-
import java.util.Collection;
24-
import java.util.LinkedList;
25-
import java.util.List;
26-
import java.util.Locale;
27-
2828
/**
2929
* enhancer for regular entities
3030
*
@@ -140,13 +140,18 @@ private void createDirtyTrackerMethods(CtClass managedCtClass) {
140140

141141
MethodWriter.write(
142142
managedCtClass, "" +
143-
"public java.util.Set %1$s() {%n" +
144-
" if (%2$s == null) { %2$s = new %4$s(); }%n" +
145-
" %3$s(%2$s);%n" +
146-
" return %2$s.asSet();%n" +
143+
"public String[] %1$s() {%n" +
144+
" if(%3$s == null) {%n" +
145+
" return (%2$s == null) ? new String[0] : %2$s.get();%n" +
146+
" } else {%n" +
147+
" if (%2$s == null) %2$s = new %5$s();%n" +
148+
" %4$s(%2$s);%n" +
149+
" return %2$s.get();%n" +
150+
" }%n" +
147151
"}",
148152
EnhancerConstants.TRACKER_GET_NAME,
149153
EnhancerConstants.TRACKER_FIELD_NAME,
154+
EnhancerConstants.TRACKER_COLLECTION_NAME,
150155
EnhancerConstants.TRACKER_COLLECTION_CHANGED_FIELD_NAME,
151156
TRACKER_IMPL
152157
);

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/SimpleDirtyTracker.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
package org.hibernate.bytecode.enhance.internal.tracker;
88

99
import java.util.Arrays;
10-
import java.util.Set;
11-
import java.util.concurrent.CopyOnWriteArraySet;
1210

1311
/**
1412
* small low memory class to keep track of changed fields
@@ -44,8 +42,8 @@ public boolean isEmpty() {
4442
return names.length == 0;
4543
}
4644

47-
public Set<String> asSet() {
48-
return new CopyOnWriteArraySet<String>( Arrays.asList( names ) );
45+
public String[] get() {
46+
return names;
4947
}
5048

5149
}

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/SortedDirtyTracker.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@
66
*/
77
package org.hibernate.bytecode.enhance.internal.tracker;
88

9-
import java.util.Arrays;
10-
import java.util.Set;
11-
import java.util.concurrent.CopyOnWriteArraySet;
12-
139
/**
1410
* small low memory class to keep track of changed fields
1511
*
@@ -58,8 +54,8 @@ public boolean isEmpty() {
5854
return names.length == 0;
5955
}
6056

61-
public Set<String> asSet() {
62-
return new CopyOnWriteArraySet<String>( Arrays.asList( names ) );
57+
public String[] get() {
58+
return names;
6359
}
6460

6561
}

hibernate-core/src/main/java/org/hibernate/engine/spi/SelfDirtinessTracker.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
*/
77
package org.hibernate.engine.spi;
88

9-
import java.util.Set;
10-
119
/**
1210
* Contract for an entity to report that it tracks the dirtiness of its own state,
1311
* as opposed to needing Hibernate to perform state-diff dirty calculations.
@@ -30,9 +28,9 @@ public interface SelfDirtinessTracker {
3028
/**
3129
* Retrieve the names of all the persistent attributes whose values have changed.
3230
*
33-
* @return The set of changed persistent attribute names
31+
* @return An array of changed persistent attribute names
3432
*/
35-
Set<String> $$_hibernate_getDirtyAttributes();
33+
String[] $$_hibernate_getDirtyAttributes();
3634

3735
/**
3836
* Clear the stored dirty attributes

hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1868,12 +1868,12 @@ protected String[] getSubclassPropertyNameClosure() {
18681868
}
18691869

18701870
@Override
1871-
public int[] resolveAttributeIndexes(Set<String> properties) {
1872-
Iterator<String> iter = properties.iterator();
1873-
int[] fields = new int[properties.size()];
1871+
public int[] resolveAttributeIndexes(String[] attributeNames) {
1872+
int[] fields = new int[attributeNames.length];
18741873
int counter = 0;
1875-
while ( iter.hasNext() ) {
1876-
Integer index = entityMetamodel.getPropertyIndexOrNull( iter.next() );
1874+
1875+
for ( String attribute : attributeNames ) {
1876+
Integer index = entityMetamodel.getPropertyIndexOrNull( attribute );
18771877
if ( index != null ) {
18781878
fields[counter++] = index;
18791879
}

hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
import java.io.Serializable;
1010
import java.util.Map;
11-
import java.util.Set;
1211

1312
import org.hibernate.EntityMode;
1413
import org.hibernate.HibernateException;
@@ -784,7 +783,7 @@ public Object createProxy(Serializable id, SessionImplementor session)
784783

785784
public FilterAliasGenerator getFilterAliasGenerator(final String rootAlias);
786785

787-
public int[] resolveAttributeIndexes(Set<String> properties);
786+
public int[] resolveAttributeIndexes(String[] attributeNames);
788787

789788
public boolean canUseReferenceCacheEntries();
790789
}

hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/EnhancerTestUtils.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import java.io.ByteArrayInputStream;
1010
import java.io.File;
1111
import java.io.IOException;
12-
import java.lang.reflect.InvocationTargetException;
1312
import java.util.Arrays;
1413
import java.util.Collections;
1514
import java.util.HashSet;
@@ -203,9 +202,9 @@ public static void clearDirtyTracking(Object entityInstance) {
203202
public static void checkDirtyTracking(Object entityInstance, String... dirtyFields) {
204203
final SelfDirtinessTracker selfDirtinessTracker = (SelfDirtinessTracker) entityInstance;
205204
assertEquals( dirtyFields.length > 0, selfDirtinessTracker.$$_hibernate_hasDirtyAttributes() );
206-
Set<?> tracked = selfDirtinessTracker.$$_hibernate_getDirtyAttributes();
207-
assertEquals( dirtyFields.length, tracked.size() );
208-
assertTrue( tracked.containsAll( Arrays.asList( dirtyFields ) ) );
205+
String[] tracked = selfDirtinessTracker.$$_hibernate_getDirtyAttributes();
206+
assertEquals( dirtyFields.length, tracked.length );
207+
assertTrue( Arrays.asList( tracked ).containsAll( Arrays.asList( dirtyFields ) ) );
209208
}
210209

211210
static EntityEntry makeEntityEntry() {

hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/tracker/DirtyTrackerTest.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@
66
*/
77
package org.hibernate.test.bytecode.enhancement.tracker;
88

9-
import org.hibernate.bytecode.enhance.internal.tracker.SortedDirtyTracker;
109
import org.hibernate.bytecode.enhance.internal.tracker.SimpleDirtyTracker;
11-
import org.junit.Test;
10+
import org.hibernate.bytecode.enhance.internal.tracker.SortedDirtyTracker;
1211

13-
import java.util.Set;
12+
import org.junit.Test;
1413

1514
import static org.junit.Assert.assertArrayEquals;
1615
import static org.junit.Assert.assertFalse;
@@ -25,55 +24,53 @@ public class DirtyTrackerTest {
2524
public void testSimpleTracker() {
2625
SimpleDirtyTracker tracker = new SimpleDirtyTracker();
2726
assertTrue(tracker.isEmpty());
28-
assertTrue(tracker.asSet().isEmpty());
27+
assertTrue(tracker.get().length == 0);
2928

3029
tracker.add("foo");
3130
assertFalse(tracker.isEmpty());
32-
assertArrayEquals(tracker.asSet().toArray(), new String[]{"foo"});
31+
assertArrayEquals(tracker.get(), new String[]{"foo"});
3332

3433
tracker.clear();
3534
assertTrue(tracker.isEmpty());
36-
assertTrue(tracker.asSet().isEmpty());
35+
assertTrue(tracker.get().length == 0);
3736

3837
tracker.add("foo");
3938
tracker.add("bar");
4039
tracker.add("another.bar");
4140
tracker.add("foo");
4241
tracker.add("another.foo");
4342
tracker.add("another.bar");
44-
assertTrue(tracker.asSet().size() == 4);
43+
assertTrue(tracker.get().length == 4);
4544

4645
}
4746

4847
@Test
4948
public void testSortedTracker() {
5049
SortedDirtyTracker tracker = new SortedDirtyTracker();
5150
assertTrue(tracker.isEmpty());
52-
assertTrue(tracker.asSet().isEmpty());
51+
assertTrue(tracker.get().length == 0);
5352

5453
tracker.add("foo");
5554
assertFalse(tracker.isEmpty());
56-
assertArrayEquals(tracker.asSet().toArray(), new String[]{"foo"});
55+
assertArrayEquals(tracker.get(), new String[]{"foo"});
5756

5857
tracker.clear();
5958
assertTrue(tracker.isEmpty());
60-
assertTrue(tracker.asSet().isEmpty());
59+
assertTrue(tracker.get().length == 0);
6160

6261
tracker.add("foo");
6362
tracker.add("bar");
6463
tracker.add("another.bar");
6564
tracker.add("foo");
6665
tracker.add("another.foo");
6766
tracker.add("another.bar");
68-
assertTrue(tracker.asSet().size() == 4);
67+
assertTrue(tracker.get().length == 4);
6968

7069
// we the algorithm for this implementation relies on the fact that the array is kept sorted, so let's check it really is
71-
assertTrue(isSorted(tracker.asSet()));
70+
assertTrue(isSorted(tracker.get()));
7271
}
7372

74-
private boolean isSorted(Set<String> set) {
75-
String[] arr = new String[set.size()];
76-
arr = set.toArray(arr);
73+
private boolean isSorted(String[] arr) {
7774
for (int i = 1; i < arr.length; i++) {
7875
if (arr[i - 1].compareTo(arr[i]) > 0) {
7976
return false;

hibernate-core/src/test/java/org/hibernate/test/cfg/persister/GoofyPersisterClassProvider.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import java.sql.SQLException;
1212
import java.util.Comparator;
1313
import java.util.Map;
14-
import java.util.Set;
1514

1615
import org.hibernate.EntityMode;
1716
import org.hibernate.HibernateException;
@@ -587,7 +586,7 @@ public Iterable<AttributeDefinition> getAttributes() {
587586
}
588587

589588
@Override
590-
public int[] resolveAttributeIndexes(Set<String> attributes) {
589+
public int[] resolveAttributeIndexes(String[] attributeNames) {
591590
return null;
592591
}
593592

hibernate-core/src/test/java/org/hibernate/test/legacy/CustomPersister.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.util.Comparator;
1111
import java.util.Hashtable;
1212
import java.util.Map;
13-
import java.util.Set;
1413

1514
import org.hibernate.EntityMode;
1615
import org.hibernate.HibernateException;
@@ -709,7 +708,7 @@ public Iterable<AttributeDefinition> getAttributes() {
709708
}
710709

711710
@Override
712-
public int[] resolveAttributeIndexes(Set<String> attributes) {
711+
public int[] resolveAttributeIndexes(String[] attributeNames) {
713712
return null;
714713
}
715714

0 commit comments

Comments
 (0)