Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 8 additions & 19 deletions core/src/main/java/google/registry/beam/common/RegistryQuery.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,7 @@ static <T> RegistryQuery<T> createQuery(
Query query =
nativeQuery ? entityManager.createNativeQuery(sql) : entityManager.createQuery(sql);
if (parameters != null) {
parameters.forEach(
(key, value) -> {
query.setParameter(key, value);
});
parameters.forEach(query::setParameter);
}
JpaTransactionManager.setQueryFetchSize(query, QUERY_FETCH_SIZE);
@SuppressWarnings("unchecked")
Expand All @@ -78,14 +75,12 @@ static <T> RegistryQuery<T> createQuery(
static <T> RegistryQuery<T> createQuery(
String jpql, @Nullable Map<String, Object> parameters, Class<T> clazz) {
return () -> {
// TODO(b/193662898): switch to jpaTm().query() when it can properly detach loaded entities.
EntityManager entityManager = tm().getEntityManager();
TypedQuery<T> query = entityManager.createQuery(jpql, clazz);
TypedQuery<T> query = tm().query(jpql, clazz);
if (parameters != null) {
parameters.forEach(query::setParameter);
}
JpaTransactionManager.setQueryFetchSize(query, QUERY_FETCH_SIZE);
return query.getResultStream().map(e -> detach(entityManager, e));
return query.getResultStream();
};
}

Expand All @@ -100,11 +95,9 @@ static <T> RegistryQuery<T> createQuery(
*/
static <T> RegistryQuery<T> createQuery(CriteriaQuerySupplier<T> criteriaQuery) {
return () -> {
// TODO(b/193662898): switch to jpaTm().query() when it can properly detach loaded entities.
EntityManager entityManager = tm().getEntityManager();
TypedQuery<T> query = entityManager.createQuery(criteriaQuery.get());
TypedQuery<T> query = tm().criteriaQuery(criteriaQuery.get());
JpaTransactionManager.setQueryFetchSize(query, QUERY_FETCH_SIZE);
return query.getResultStream().map(e -> detach(entityManager, e));
return query.getResultStream();
};
}

Expand All @@ -125,16 +118,12 @@ static <T> T detach(EntityManager entityManager, T object) {
return object;
}

static void detachObject(EntityManager entityManager, Object object) {
Class<?> objectClass = object.getClass();
if (objectClass.isPrimitive() || objectClass == String.class) {
private static void detachObject(EntityManager entityManager, @Nullable Object object) {
if (object == null || object instanceof String) {
return;
}
try {
// TODO(b/193662898): choose detach() or clear() based on the type of transaction.
// For context, EntityManager.detach() does not remove all metadata about loaded entities.
// See b/193925312 or https://hibernate.atlassian.net/browse/HHH-14735 for details.
entityManager.clear();
entityManager.detach(object);
} catch (IllegalArgumentException e) {
// Not an entity. Do nothing.
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@

package google.registry.beam.common;

import static com.google.common.truth.Truth.assertThat;
import static google.registry.persistence.transaction.JpaTransactionManagerExtension.makeRegistrar1;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static google.registry.testing.DatabaseHelper.newHost;
import static google.registry.testing.DatabaseHelper.newTld;
import static google.registry.testing.DatabaseHelper.persistResource;
Expand All @@ -37,13 +39,13 @@
import google.registry.model.eppcommon.AuthInfo.PasswordAuth;
import google.registry.model.eppcommon.StatusValue;
import google.registry.model.host.Host;
import google.registry.model.host.HostBase;
import google.registry.model.registrar.Registrar;
import google.registry.model.tld.Tld;
import google.registry.persistence.transaction.CriteriaQueryBuilder;
import google.registry.persistence.transaction.JpaTestExtensions;
import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension;
import google.registry.testing.FakeClock;
import jakarta.persistence.EntityManager;
import java.time.Instant;
import org.apache.beam.sdk.coders.StringUtf8Coder;
import org.apache.beam.sdk.testing.PAssert;
Expand Down Expand Up @@ -91,7 +93,11 @@ void beforeEach() {
void readWithCriteriaQuery() {
Read<Host, String> read =
RegistryJpaIO.read(
() -> CriteriaQueryBuilder.create(Host.class).build(), HostBase::getHostName)
() -> CriteriaQueryBuilder.create(Host.class).build(),
host -> {
assertThat(tm().getEntityManager().contains(host)).isFalse();
return host.getHostName();
})
.withCoder(StringUtf8Coder.of());
PCollection<String> repoIds = testPipeline.apply(read);

Expand All @@ -112,6 +118,7 @@ void readWithStringQuery() {
false,
(Object[] row) -> {
Domain domain = (Domain) row[0];
assertThat(tm().getEntityManager().contains(domain)).isFalse();
String emailAddress = (String) row[1];
return domain.getRepoId() + "-" + emailAddress;
})
Expand Down Expand Up @@ -154,14 +161,34 @@ void readWithStringTypedQuery() {
+ " and d.deletionTime > CAST(now() AS timestamp)",
ImmutableMap.of("type", Registrar.Type.REAL),
Domain.class,
Domain::getRepoId)
domain -> {
assertThat(tm().getEntityManager().contains(domain)).isFalse();
return domain.getRepoId();
})
.withCoder(StringUtf8Coder.of());
PCollection<String> repoIds = testPipeline.apply(read);

PAssert.that(repoIds).containsInAnyOrder("4-COM");
testPipeline.run();
}

@Test
void detach_detachesOnlySpecifiedEntity() {
tm().transact(
() -> {
EntityManager entityManager = tm().getEntityManager();
Host host0 = entityManager.find(Host.class, hosts.get(0).getRepoId());
Host host1 = entityManager.find(Host.class, hosts.get(1).getRepoId());
assertThat(entityManager.contains(host0)).isTrue();
assertThat(entityManager.contains(host1)).isTrue();

RegistryQuery.detach(entityManager, host0);

assertThat(entityManager.contains(host0)).isFalse();
assertThat(entityManager.contains(host1)).isTrue();
});
}

private void setupForJoinQuery() {
Tld registry = newTld("com", "ABCDAPP");
Registrar registrar =
Expand Down
Loading