Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
HHH-9811 - Change EntityPersister#resolveAttributeIndexes to take Str…
…ing[]
  • Loading branch information
barreiro authored and sebersole committed May 27, 2015
1 parent 73c5d57 commit f795dfc
Show file tree
Hide file tree
Showing 11 changed files with 44 additions and 55 deletions.
Expand Up @@ -6,6 +6,11 @@
*/
package org.hibernate.bytecode.enhance.internal;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;

import javassist.CannotCompileException;
import javassist.CtClass;
import javassist.CtField;
Expand All @@ -20,11 +25,6 @@
import org.hibernate.bytecode.enhance.spi.EnhancerConstants;
import org.hibernate.engine.spi.SelfDirtinessTracker;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;

/**
* enhancer for regular entities
*
Expand Down Expand Up @@ -140,13 +140,18 @@ private void createDirtyTrackerMethods(CtClass managedCtClass) {

MethodWriter.write(
managedCtClass, "" +
"public java.util.Set %1$s() {%n" +
" if (%2$s == null) { %2$s = new %4$s(); }%n" +
" %3$s(%2$s);%n" +
" return %2$s.asSet();%n" +
"public String[] %1$s() {%n" +
" if(%3$s == null) {%n" +
" return (%2$s == null) ? new String[0] : %2$s.get();%n" +
" } else {%n" +
" if (%2$s == null) %2$s = new %5$s();%n" +
" %4$s(%2$s);%n" +
" return %2$s.get();%n" +
" }%n" +
"}",
EnhancerConstants.TRACKER_GET_NAME,
EnhancerConstants.TRACKER_FIELD_NAME,
EnhancerConstants.TRACKER_COLLECTION_NAME,
EnhancerConstants.TRACKER_COLLECTION_CHANGED_FIELD_NAME,
TRACKER_IMPL
);
Expand Down
Expand Up @@ -7,8 +7,6 @@
package org.hibernate.bytecode.enhance.internal.tracker;

import java.util.Arrays;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

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

public Set<String> asSet() {
return new CopyOnWriteArraySet<String>( Arrays.asList( names ) );
public String[] get() {
return names;
}

}
Expand Up @@ -6,10 +6,6 @@
*/
package org.hibernate.bytecode.enhance.internal.tracker;

import java.util.Arrays;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

/**
* small low memory class to keep track of changed fields
*
Expand Down Expand Up @@ -58,8 +54,8 @@ public boolean isEmpty() {
return names.length == 0;
}

public Set<String> asSet() {
return new CopyOnWriteArraySet<String>( Arrays.asList( names ) );
public String[] get() {
return names;
}

}
Expand Up @@ -6,8 +6,6 @@
*/
package org.hibernate.engine.spi;

import java.util.Set;

/**
* Contract for an entity to report that it tracks the dirtiness of its own state,
* as opposed to needing Hibernate to perform state-diff dirty calculations.
Expand All @@ -30,9 +28,9 @@ public interface SelfDirtinessTracker {
/**
* Retrieve the names of all the persistent attributes whose values have changed.
*
* @return The set of changed persistent attribute names
* @return An array of changed persistent attribute names
*/
Set<String> $$_hibernate_getDirtyAttributes();
String[] $$_hibernate_getDirtyAttributes();

/**
* Clear the stored dirty attributes
Expand Down
Expand Up @@ -1868,12 +1868,12 @@ protected String[] getSubclassPropertyNameClosure() {
}

@Override
public int[] resolveAttributeIndexes(Set<String> properties) {
Iterator<String> iter = properties.iterator();
int[] fields = new int[properties.size()];
public int[] resolveAttributeIndexes(String[] attributeNames) {
int[] fields = new int[attributeNames.length];
int counter = 0;
while ( iter.hasNext() ) {
Integer index = entityMetamodel.getPropertyIndexOrNull( iter.next() );

for ( String attribute : attributeNames ) {
Integer index = entityMetamodel.getPropertyIndexOrNull( attribute );
if ( index != null ) {
fields[counter++] = index;
}
Expand Down
Expand Up @@ -8,7 +8,6 @@

import java.io.Serializable;
import java.util.Map;
import java.util.Set;

import org.hibernate.EntityMode;
import org.hibernate.HibernateException;
Expand Down Expand Up @@ -784,7 +783,7 @@ public Object createProxy(Serializable id, SessionImplementor session)

public FilterAliasGenerator getFilterAliasGenerator(final String rootAlias);

public int[] resolveAttributeIndexes(Set<String> properties);
public int[] resolveAttributeIndexes(String[] attributeNames);

public boolean canUseReferenceCacheEntries();
}
Expand Up @@ -9,7 +9,6 @@
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
Expand Down Expand Up @@ -203,9 +202,9 @@ public static void clearDirtyTracking(Object entityInstance) {
public static void checkDirtyTracking(Object entityInstance, String... dirtyFields) {
final SelfDirtinessTracker selfDirtinessTracker = (SelfDirtinessTracker) entityInstance;
assertEquals( dirtyFields.length > 0, selfDirtinessTracker.$$_hibernate_hasDirtyAttributes() );
Set<?> tracked = selfDirtinessTracker.$$_hibernate_getDirtyAttributes();
assertEquals( dirtyFields.length, tracked.size() );
assertTrue( tracked.containsAll( Arrays.asList( dirtyFields ) ) );
String[] tracked = selfDirtinessTracker.$$_hibernate_getDirtyAttributes();
assertEquals( dirtyFields.length, tracked.length );
assertTrue( Arrays.asList( tracked ).containsAll( Arrays.asList( dirtyFields ) ) );
}

static EntityEntry makeEntityEntry() {
Expand Down
Expand Up @@ -6,11 +6,10 @@
*/
package org.hibernate.test.bytecode.enhancement.tracker;

import org.hibernate.bytecode.enhance.internal.tracker.SortedDirtyTracker;
import org.hibernate.bytecode.enhance.internal.tracker.SimpleDirtyTracker;
import org.junit.Test;
import org.hibernate.bytecode.enhance.internal.tracker.SortedDirtyTracker;

import java.util.Set;
import org.junit.Test;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertFalse;
Expand All @@ -25,55 +24,53 @@ public class DirtyTrackerTest {
public void testSimpleTracker() {
SimpleDirtyTracker tracker = new SimpleDirtyTracker();
assertTrue(tracker.isEmpty());
assertTrue(tracker.asSet().isEmpty());
assertTrue(tracker.get().length == 0);

tracker.add("foo");
assertFalse(tracker.isEmpty());
assertArrayEquals(tracker.asSet().toArray(), new String[]{"foo"});
assertArrayEquals(tracker.get(), new String[]{"foo"});

tracker.clear();
assertTrue(tracker.isEmpty());
assertTrue(tracker.asSet().isEmpty());
assertTrue(tracker.get().length == 0);

tracker.add("foo");
tracker.add("bar");
tracker.add("another.bar");
tracker.add("foo");
tracker.add("another.foo");
tracker.add("another.bar");
assertTrue(tracker.asSet().size() == 4);
assertTrue(tracker.get().length == 4);

}

@Test
public void testSortedTracker() {
SortedDirtyTracker tracker = new SortedDirtyTracker();
assertTrue(tracker.isEmpty());
assertTrue(tracker.asSet().isEmpty());
assertTrue(tracker.get().length == 0);

tracker.add("foo");
assertFalse(tracker.isEmpty());
assertArrayEquals(tracker.asSet().toArray(), new String[]{"foo"});
assertArrayEquals(tracker.get(), new String[]{"foo"});

tracker.clear();
assertTrue(tracker.isEmpty());
assertTrue(tracker.asSet().isEmpty());
assertTrue(tracker.get().length == 0);

tracker.add("foo");
tracker.add("bar");
tracker.add("another.bar");
tracker.add("foo");
tracker.add("another.foo");
tracker.add("another.bar");
assertTrue(tracker.asSet().size() == 4);
assertTrue(tracker.get().length == 4);

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

private boolean isSorted(Set<String> set) {
String[] arr = new String[set.size()];
arr = set.toArray(arr);
private boolean isSorted(String[] arr) {
for (int i = 1; i < arr.length; i++) {
if (arr[i - 1].compareTo(arr[i]) > 0) {
return false;
Expand Down
Expand Up @@ -11,7 +11,6 @@
import java.sql.SQLException;
import java.util.Comparator;
import java.util.Map;
import java.util.Set;

import org.hibernate.EntityMode;
import org.hibernate.HibernateException;
Expand Down Expand Up @@ -587,7 +586,7 @@ public Iterable<AttributeDefinition> getAttributes() {
}

@Override
public int[] resolveAttributeIndexes(Set<String> attributes) {
public int[] resolveAttributeIndexes(String[] attributeNames) {
return null;
}

Expand Down
Expand Up @@ -10,7 +10,6 @@
import java.util.Comparator;
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;

import org.hibernate.EntityMode;
import org.hibernate.HibernateException;
Expand Down Expand Up @@ -709,7 +708,7 @@ public Iterable<AttributeDefinition> getAttributes() {
}

@Override
public int[] resolveAttributeIndexes(Set<String> attributes) {
public int[] resolveAttributeIndexes(String[] attributeNames) {
return null;
}

Expand Down
Expand Up @@ -10,7 +10,6 @@
import java.util.Arrays;
import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceException;

Expand Down Expand Up @@ -592,7 +591,7 @@ public FilterAliasGenerator getFilterAliasGenerator(String rootAlias) {
}

@Override
public int[] resolveAttributeIndexes(Set<String> properties) {
public int[] resolveAttributeIndexes(String[] attributeNames) {
return new int[0];
}

Expand Down

0 comments on commit f795dfc

Please sign in to comment.