Convert DatastoreEntity/SqlEntity to return Optional, not List (#894)

* Convert DatastoreEntity/SqlEntity to return Optional, not List

We don't have any entities that convert to more than one entity, so we
can use an Optional instead for clarity and simplicity.
This commit is contained in:
gbrodman 2020-12-02 17:29:01 -05:00 committed by GitHub
parent 59c852d812
commit 4f0189c162
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 53 additions and 71 deletions

View file

@ -14,7 +14,6 @@
package google.registry.model.contact; package google.registry.model.contact;
import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.EntitySubclass; import com.googlecode.objectify.annotation.EntitySubclass;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
@ -111,8 +110,8 @@ public class ContactHistory extends HistoryEntry implements SqlEntity {
// In Datastore, save as a HistoryEntry object regardless of this object's type // In Datastore, save as a HistoryEntry object regardless of this object's type
@Override @Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() { public Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(asHistoryEntry()); return Optional.of(asHistoryEntry());
} }
/** Class to represent the composite primary key of {@link ContactHistory} entity. */ /** Class to represent the composite primary key of {@link ContactHistory} entity. */

View file

@ -17,7 +17,6 @@ package google.registry.model.domain;
import static com.google.common.collect.ImmutableSet.toImmutableSet; import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static google.registry.util.CollectionUtils.nullToEmptyImmutableCopy; import static google.registry.util.CollectionUtils.nullToEmptyImmutableCopy;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.EntitySubclass; import com.googlecode.objectify.annotation.EntitySubclass;
@ -250,8 +249,8 @@ public class DomainHistory extends HistoryEntry implements SqlEntity {
// In Datastore, save as a HistoryEntry object regardless of this object's type // In Datastore, save as a HistoryEntry object regardless of this object's type
@Override @Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() { public Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(asHistoryEntry()); return Optional.of(asHistoryEntry());
} }
/** Class to represent the composite primary key of {@link DomainHistory} entity. */ /** Class to represent the composite primary key of {@link DomainHistory} entity. */

View file

@ -14,11 +14,11 @@
package google.registry.model.domain.secdns; package google.registry.model.domain.secdns;
import com.google.common.collect.ImmutableList;
import google.registry.model.domain.DomainHistory; import google.registry.model.domain.DomainHistory;
import google.registry.model.ofy.ObjectifyService; import google.registry.model.ofy.ObjectifyService;
import google.registry.schema.replay.DatastoreEntity; import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity; import google.registry.schema.replay.SqlEntity;
import java.util.Optional;
import javax.persistence.Access; import javax.persistence.Access;
import javax.persistence.AccessType; import javax.persistence.AccessType;
import javax.persistence.Column; import javax.persistence.Column;
@ -86,7 +86,7 @@ public class DomainDsDataHistory extends DomainDsDataBase implements SqlEntity {
} }
@Override @Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() { public Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(); // not persisted in Datastore return Optional.empty(); // Not persisted in Datastore
} }
} }

View file

@ -14,7 +14,6 @@
package google.registry.model.host; package google.registry.model.host;
import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.EntitySubclass; import com.googlecode.objectify.annotation.EntitySubclass;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
@ -112,8 +111,8 @@ public class HostHistory extends HistoryEntry implements SqlEntity {
// In Datastore, save as a HistoryEntry object regardless of this object's type // In Datastore, save as a HistoryEntry object regardless of this object's type
@Override @Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() { public Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(asHistoryEntry()); return Optional.of(asHistoryEntry());
} }
/** Class to represent the composite primary key of {@link HostHistory} entity. */ /** Class to represent the composite primary key of {@link HostHistory} entity. */

View file

@ -29,7 +29,6 @@ import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import google.registry.persistence.VKey; import google.registry.persistence.VKey;
import google.registry.schema.replay.DatastoreEntity; import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity;
import java.util.Map; import java.util.Map;
import org.joda.time.DateTime; import org.joda.time.DateTime;
@ -137,10 +136,9 @@ class TransactionInfo {
if (entry.getValue().equals(Delete.SENTINEL)) { if (entry.getValue().equals(Delete.SENTINEL)) {
jpaTm().delete(VKey.from(entry.getKey())); jpaTm().delete(VKey.from(entry.getKey()));
} else { } else {
for (SqlEntity entity : ((DatastoreEntity) entry.getValue())
((DatastoreEntity) entry.getValue()).toSqlEntities()) { .toSqlEntity()
jpaTm().put(entity); .ifPresent(jpaTm()::put);
}
} }
}); });
}); });

View file

@ -18,7 +18,6 @@ import static com.googlecode.objectify.Key.getKind;
import static google.registry.util.CollectionUtils.nullToEmptyImmutableCopy; import static google.registry.util.CollectionUtils.nullToEmptyImmutableCopy;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity; import com.googlecode.objectify.annotation.Entity;
@ -45,6 +44,7 @@ import google.registry.model.host.HostResource;
import google.registry.persistence.VKey; import google.registry.persistence.VKey;
import google.registry.schema.replay.DatastoreEntity; import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity; import google.registry.schema.replay.SqlEntity;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.persistence.Access; import javax.persistence.Access;
@ -314,8 +314,8 @@ public class HistoryEntry extends ImmutableObject implements Buildable, Datastor
// In SQL, save the child type // In SQL, save the child type
@Override @Override
public ImmutableList<SqlEntity> toSqlEntities() { public Optional<SqlEntity> toSqlEntity() {
return ImmutableList.of((SqlEntity) toChildHistoryEntity()); return Optional.of((SqlEntity) toChildHistoryEntity());
} }
/** Creates a {@link VKey} instance from a {@link Key} instance. */ /** Creates a {@link VKey} instance from a {@link Key} instance. */

View file

@ -18,13 +18,13 @@ import static com.google.common.base.Preconditions.checkArgument;
import static google.registry.util.CollectionUtils.isNullOrEmpty; import static google.registry.util.CollectionUtils.isNullOrEmpty;
import static google.registry.util.PreconditionsUtils.checkArgumentNotNull; import static google.registry.util.PreconditionsUtils.checkArgumentNotNull;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import google.registry.model.Buildable; import google.registry.model.Buildable;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
import google.registry.schema.replay.DatastoreEntity; import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity; import google.registry.schema.replay.SqlEntity;
import google.registry.util.DomainNameUtils; import google.registry.util.DomainNameUtils;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
@ -111,8 +111,8 @@ public class Spec11ThreatMatch extends ImmutableObject implements Buildable, Sql
} }
@Override @Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() { public Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(); // not stored in Datastore return Optional.empty(); // Not persisted in Datastore
} }
@Override @Override

View file

@ -20,7 +20,6 @@ import static google.registry.persistence.transaction.TransactionManagerFactory.
import static google.registry.persistence.transaction.TransactionManagerFactory.ofyTm; import static google.registry.persistence.transaction.TransactionManagerFactory.ofyTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity; import com.googlecode.objectify.annotation.Entity;
import google.registry.model.annotations.NotBackedUp; import google.registry.model.annotations.NotBackedUp;
@ -28,9 +27,7 @@ import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.common.CrossTldSingleton; import google.registry.model.common.CrossTldSingleton;
import google.registry.model.tmch.TmchCrl.TmchCrlId; import google.registry.model.tmch.TmchCrl.TmchCrlId;
import google.registry.persistence.VKey; import google.registry.persistence.VKey;
import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.NonReplicatedEntity; import google.registry.schema.replay.NonReplicatedEntity;
import google.registry.schema.replay.SqlEntity;
import java.io.Serializable; import java.io.Serializable;
import java.util.Optional; import java.util.Optional;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@ -106,16 +103,6 @@ public final class TmchCrl extends CrossTldSingleton implements NonReplicatedEnt
return updated; return updated;
} }
@Override
public ImmutableList<SqlEntity> toSqlEntities() {
return ImmutableList.of(); // dually-written
}
@Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() {
return ImmutableList.of(); // dually-written
}
static class TmchCrlId implements Serializable { static class TmchCrlId implements Serializable {
@Column(name = "certificateRevocations") @Column(name = "certificateRevocations")

View file

@ -14,9 +14,9 @@
package google.registry.persistence.transaction; package google.registry.persistence.transaction;
import com.google.common.collect.ImmutableList;
import google.registry.schema.replay.DatastoreEntity; import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity; import google.registry.schema.replay.SqlEntity;
import java.util.Optional;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType; import javax.persistence.GenerationType;
@ -45,7 +45,7 @@ public class TransactionEntity implements SqlEntity {
} }
@Override @Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() { public Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(); // not stored in Datastore per se return Optional.empty(); // Not persisted in Datastore per se
} }
} }

View file

@ -16,7 +16,6 @@ package google.registry.schema.cursor;
import static com.google.appengine.api.search.checkers.Preconditions.checkNotNull; import static com.google.appengine.api.search.checkers.Preconditions.checkNotNull;
import com.google.common.collect.ImmutableList;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
import google.registry.model.UpdateAutoTimestamp; import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.common.Cursor.CursorType; import google.registry.model.common.Cursor.CursorType;
@ -26,6 +25,7 @@ import google.registry.schema.replay.SqlEntity;
import google.registry.util.DateTimeUtils; import google.registry.util.DateTimeUtils;
import java.io.Serializable; import java.io.Serializable;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.Optional;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.EnumType; import javax.persistence.EnumType;
@ -104,8 +104,8 @@ public class Cursor implements SqlEntity {
} }
@Override @Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() { public Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(); // Cursors are not converted since they are ephemeral return Optional.empty(); // Cursors are not converted since they are ephemeral
} }
static class CursorId extends ImmutableObject implements Serializable { static class CursorId extends ImmutableObject implements Serializable {

View file

@ -19,7 +19,6 @@ import static google.registry.util.DateTimeUtils.isBeforeOrAt;
import static google.registry.util.DateTimeUtils.toZonedDateTime; import static google.registry.util.DateTimeUtils.toZonedDateTime;
import static google.registry.util.PreconditionsUtils.checkArgumentNotNull; import static google.registry.util.PreconditionsUtils.checkArgumentNotNull;
import com.google.common.collect.ImmutableList;
import google.registry.model.Buildable; import google.registry.model.Buildable;
import google.registry.model.CreateAutoTimestamp; import google.registry.model.CreateAutoTimestamp;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
@ -234,8 +233,8 @@ public final class RegistryLock extends ImmutableObject implements Buildable, Sq
} }
@Override @Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() { public Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(); // not stored in Datastore return Optional.empty(); // Not persisted in Datastore
} }
/** Builder for {@link google.registry.schema.domain.RegistryLock}. */ /** Builder for {@link google.registry.schema.domain.RegistryLock}. */

View file

@ -14,18 +14,18 @@
package google.registry.schema.replay; package google.registry.schema.replay;
import com.google.common.collect.ImmutableList; import java.util.Optional;
/** An entity that has the same Java object representation in SQL and Datastore. */ /** An entity that has the same Java object representation in SQL and Datastore. */
public interface DatastoreAndSqlEntity extends DatastoreEntity, SqlEntity { public interface DatastoreAndSqlEntity extends DatastoreEntity, SqlEntity {
@Override @Override
default ImmutableList<DatastoreEntity> toDatastoreEntities() { default Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(this); return Optional.of(this);
} }
@Override @Override
default ImmutableList<SqlEntity> toSqlEntities() { default Optional<SqlEntity> toSqlEntity() {
return ImmutableList.of(this); return Optional.of(this);
} }
} }

View file

@ -14,7 +14,7 @@
package google.registry.schema.replay; package google.registry.schema.replay;
import com.google.common.collect.ImmutableList; import java.util.Optional;
/** /**
* An object that can be stored in Datastore and serialized using Objectify's {@link * An object that can be stored in Datastore and serialized using Objectify's {@link
@ -26,5 +26,5 @@ import com.google.common.collect.ImmutableList;
*/ */
public interface DatastoreEntity { public interface DatastoreEntity {
ImmutableList<SqlEntity> toSqlEntities(); Optional<SqlEntity> toSqlEntity();
} }

View file

@ -14,11 +14,12 @@
package google.registry.schema.replay; package google.registry.schema.replay;
import com.google.common.collect.ImmutableList; import java.util.Optional;
/** An entity that is only stored in Datastore, that should not be replayed to SQL. */
public interface DatastoreOnlyEntity extends DatastoreEntity { public interface DatastoreOnlyEntity extends DatastoreEntity {
@Override @Override
default ImmutableList<SqlEntity> toSqlEntities() { default Optional<SqlEntity> toSqlEntity() {
return ImmutableList.of(); return Optional.empty();
} }
} }

View file

@ -14,7 +14,7 @@
package google.registry.schema.replay; package google.registry.schema.replay;
import com.google.common.collect.ImmutableList; import java.util.Optional;
/** /**
* Represents an entity that should not participate in asynchronous replication. * Represents an entity that should not participate in asynchronous replication.
@ -24,12 +24,12 @@ import com.google.common.collect.ImmutableList;
public interface NonReplicatedEntity extends DatastoreEntity, SqlEntity { public interface NonReplicatedEntity extends DatastoreEntity, SqlEntity {
@Override @Override
default ImmutableList<DatastoreEntity> toDatastoreEntities() { default Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(); return Optional.empty();
} }
@Override @Override
default ImmutableList<SqlEntity> toSqlEntities() { default Optional<SqlEntity> toSqlEntity() {
return ImmutableList.of(); return Optional.empty();
} }
} }

View file

@ -14,7 +14,7 @@
package google.registry.schema.replay; package google.registry.schema.replay;
import com.google.common.collect.ImmutableList; import java.util.Optional;
/** /**
* An object that can be stored in Cloud SQL using {@link * An object that can be stored in Cloud SQL using {@link
@ -25,5 +25,5 @@ import com.google.common.collect.ImmutableList;
*/ */
public interface SqlEntity { public interface SqlEntity {
ImmutableList<DatastoreEntity> toDatastoreEntities(); Optional<DatastoreEntity> toDatastoreEntity();
} }

View file

@ -18,7 +18,7 @@ import static google.registry.model.common.CrossTldSingleton.SINGLETON_ID;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm; import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.util.DateTimeUtils.START_OF_TIME; import static google.registry.util.DateTimeUtils.START_OF_TIME;
import com.google.common.collect.ImmutableList; import java.util.Optional;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.Id; import javax.persistence.Id;
import org.joda.time.DateTime; import org.joda.time.DateTime;
@ -32,8 +32,8 @@ public class SqlReplayCheckpoint implements SqlEntity {
private DateTime lastReplayTime; private DateTime lastReplayTime;
@Override @Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() { public Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(); // not necessary to persist in Datastore return Optional.empty(); // Not necessary to persist in Datastore
} }
public static DateTime get() { public static DateTime get() {

View file

@ -16,7 +16,6 @@ package google.registry.schema.server;
import static google.registry.util.PreconditionsUtils.checkArgumentNotNull; import static google.registry.util.PreconditionsUtils.checkArgumentNotNull;
import com.google.common.collect.ImmutableList;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
import google.registry.schema.replay.DatastoreEntity; import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity; import google.registry.schema.replay.SqlEntity;
@ -24,6 +23,7 @@ import google.registry.schema.server.Lock.LockId;
import google.registry.util.DateTimeUtils; import google.registry.util.DateTimeUtils;
import java.io.Serializable; import java.io.Serializable;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.Optional;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.Id; import javax.persistence.Id;
@ -120,8 +120,8 @@ public class Lock implements SqlEntity {
} }
@Override @Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() { public Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(); // Locks are not converted since they are ephemeral return Optional.empty(); // Locks are not converted since they are ephemeral
} }
static class LockId extends ImmutableObject implements Serializable { static class LockId extends ImmutableObject implements Serializable {

View file

@ -14,13 +14,13 @@
package google.registry.schema.tld; package google.registry.schema.tld;
import com.google.common.collect.ImmutableList;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
import google.registry.model.registry.label.PremiumList; import google.registry.model.registry.label.PremiumList;
import google.registry.schema.replay.DatastoreEntity; import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity; import google.registry.schema.replay.SqlEntity;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Optional;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.Id; import javax.persistence.Id;
@ -47,7 +47,7 @@ public class PremiumEntry extends ImmutableObject implements Serializable, SqlEn
private PremiumEntry() {} private PremiumEntry() {}
@Override @Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() { public Optional<DatastoreEntity> toDatastoreEntity() {
return ImmutableList.of(); // PremiumList is dually-written return Optional.empty(); // PremiumList is dually-written
} }
} }