diff --git a/datastore/src/main/java/io/spine/server/storage/datastore/DatastoreStorageFactory.java b/datastore/src/main/java/io/spine/server/storage/datastore/DatastoreStorageFactory.java index 980286aa..bb019eaf 100644 --- a/datastore/src/main/java/io/spine/server/storage/datastore/DatastoreStorageFactory.java +++ b/datastore/src/main/java/io/spine/server/storage/datastore/DatastoreStorageFactory.java @@ -158,7 +158,7 @@ public BoundedContextBuilder configureTenantIndex(BoundedContextBuilder builder) @Override public RecordStorage - createRecordStorage(ContextSpec context, RecordSpec spec) { + createRecordStorage(ContextSpec context, RecordSpec spec) { checkNotNull(context); checkNotNull(spec); var config = configurationWith(context, spec); @@ -170,7 +170,7 @@ public BoundedContextBuilder configureTenantIndex(BoundedContextBuilder builder) } private - StorageConfiguration configurationWith(ContextSpec context, RecordSpec spec) { + StorageConfiguration configurationWith(ContextSpec context, RecordSpec spec) { var wrapper = wrapperFor(context); var recordType = spec.sourceType(); var behavior = txSettings.find(recordType); diff --git a/datastore/src/main/java/io/spine/server/storage/datastore/config/CustomStorages.java b/datastore/src/main/java/io/spine/server/storage/datastore/config/CustomStorages.java index cef5dc86..6b172966 100644 --- a/datastore/src/main/java/io/spine/server/storage/datastore/config/CustomStorages.java +++ b/datastore/src/main/java/io/spine/server/storage/datastore/config/CustomStorages.java @@ -68,7 +68,7 @@ private CustomStorages(Builder builder) { * @return a callback to create a custom storage wrapped into {@code Optional}, * or {@code Optional.empty()} in case none was found */ - public Optional> find(RecordSpec spec) { + public Optional> find(RecordSpec spec) { var domainType = spec.sourceType(); var optional = findValue(domainType); Optional> result = @@ -117,7 +117,7 @@ Builder self() { * this builder. */ @Override - public final CustomStorages build() { + public CustomStorages build() { return new CustomStorages(this); } } diff --git a/datastore/src/main/java/io/spine/server/storage/datastore/config/StorageConfiguration.java b/datastore/src/main/java/io/spine/server/storage/datastore/config/StorageConfiguration.java index a2a118da..caa8b782 100644 --- a/datastore/src/main/java/io/spine/server/storage/datastore/config/StorageConfiguration.java +++ b/datastore/src/main/java/io/spine/server/storage/datastore/config/StorageConfiguration.java @@ -86,7 +86,7 @@ public DsEntitySpec recordSpec() { */ public Class storedType() { return recordSpec.recordSpec() - .storedType(); + .recordType(); } /** diff --git a/datastore/src/main/java/io/spine/server/storage/datastore/delivery/DsSessionStorage.java b/datastore/src/main/java/io/spine/server/storage/datastore/delivery/DsSessionStorage.java index 74f2d1ae..9dfdeb2e 100644 --- a/datastore/src/main/java/io/spine/server/storage/datastore/delivery/DsSessionStorage.java +++ b/datastore/src/main/java/io/spine/server/storage/datastore/delivery/DsSessionStorage.java @@ -32,7 +32,7 @@ import io.spine.server.ContextSpec; import io.spine.server.delivery.ShardIndex; import io.spine.server.delivery.ShardSessionRecord; -import io.spine.server.storage.MessageRecordSpec; +import io.spine.server.storage.RecordSpec; import io.spine.server.storage.RecordWithColumns; import io.spine.server.storage.datastore.DatastoreStorageFactory; import io.spine.server.storage.datastore.config.StorageConfiguration; @@ -64,7 +64,7 @@ public final class DsSessionStorage extends DsRecordStorage { private static final boolean multitenant = false; - private final MessageRecordSpec spec; + private final RecordSpec spec; /** * Creates a new instance of this storage. @@ -104,9 +104,9 @@ private static DsEntitySpec newRecordSpec() { return result; } - private static MessageRecordSpec messageSpec() { + private static RecordSpec messageSpec() { @SuppressWarnings("ConstantConditions") /* Protobuf getters never return `nulls`. */ - var spec = new MessageRecordSpec<>( + var spec = new RecordSpec<>( ShardIndex.class, ShardSessionRecord.class, ShardSessionRecord::getIndex, diff --git a/datastore/src/main/java/io/spine/server/storage/datastore/record/DsEntitySpec.java b/datastore/src/main/java/io/spine/server/storage/datastore/record/DsEntitySpec.java index 7519c018..9e4b4026 100644 --- a/datastore/src/main/java/io/spine/server/storage/datastore/record/DsEntitySpec.java +++ b/datastore/src/main/java/io/spine/server/storage/datastore/record/DsEntitySpec.java @@ -52,7 +52,7 @@ */ public final class DsEntitySpec { - private final RecordSpec recordSpec; + private final RecordSpec recordSpec; private final RecordLayout layout; /** @@ -63,7 +63,7 @@ public final class DsEntitySpec { * @param layout * ancestor-children structure to use for Datastore Entities */ - public DsEntitySpec(RecordSpec recordSpec, RecordLayout layout) { + public DsEntitySpec(RecordSpec recordSpec, RecordLayout layout) { this.recordSpec = checkNotNull(recordSpec); this.layout = checkNotNull(layout); } @@ -75,14 +75,14 @@ public DsEntitySpec(RecordSpec recordSpec, RecordLayout layout) { * @param recordSpec * specification telling which fields of Protobuf message to store in Datastore Entity */ - public DsEntitySpec(RecordSpec recordSpec) { + public DsEntitySpec(RecordSpec recordSpec) { this(recordSpec, new FlatLayout<>(recordSpec.sourceType())); } /** * Returns the storage specification for the persisted Protobuf message. */ - public RecordSpec recordSpec() { + public RecordSpec recordSpec() { return recordSpec; } diff --git a/datastore/src/main/java/io/spine/server/storage/datastore/record/DsRecordStorage.java b/datastore/src/main/java/io/spine/server/storage/datastore/record/DsRecordStorage.java index a6057ded..dd48fc9f 100644 --- a/datastore/src/main/java/io/spine/server/storage/datastore/record/DsRecordStorage.java +++ b/datastore/src/main/java/io/spine/server/storage/datastore/record/DsRecordStorage.java @@ -102,7 +102,7 @@ public Iterator index() { protected Iterator index(RecordQuery query) { var spec = recordSpec(); var recordIterator = readAllRecords(query); - var result = transform(recordIterator, spec::idFromRecord); + var result = transform(recordIterator, spec::idValueIn); return result; } diff --git a/datastore/src/test/java/io/spine/server/storage/datastore/DatastoreStorageFactoryTest.java b/datastore/src/test/java/io/spine/server/storage/datastore/DatastoreStorageFactoryTest.java index 4400793e..5dad0c26 100644 --- a/datastore/src/test/java/io/spine/server/storage/datastore/DatastoreStorageFactoryTest.java +++ b/datastore/src/test/java/io/spine/server/storage/datastore/DatastoreStorageFactoryTest.java @@ -30,7 +30,6 @@ import com.google.cloud.datastore.DatastoreOptions; import com.google.cloud.datastore.Key; import com.google.common.testing.NullPointerTester; -import com.google.common.truth.Truth8; import io.spine.base.Identifier; import io.spine.core.TenantId; import io.spine.server.BoundedContext; @@ -55,11 +54,12 @@ import org.junit.jupiter.api.Test; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth8.assertThat; import static io.spine.server.ContextSpec.multitenant; import static io.spine.server.storage.datastore.given.DatastoreStorageFactoryTestEnv.factoryFor; import static io.spine.server.storage.datastore.given.TestEnvironment.singleTenantSpec; import static io.spine.server.storage.datastore.given.TestRecordSpec.projectDetailsSpec; -import static io.spine.server.storage.datastore.given.TestRecordSpec.stgProjectSpec; +import static io.spine.server.storage.given.GivenStorageProject.messageSpec; import static io.spine.server.tenant.TenantAwareRunner.with; import static io.spine.testing.DisplayNames.NOT_ACCEPT_NULLS; import static io.spine.testing.server.storage.datastore.TestDatastores.defaultLocalProjectId; @@ -85,7 +85,7 @@ final class DatastoreStorageFactoryTest { @DisplayName(NOT_ACCEPT_NULLS) void testNulls() { new NullPointerTester().setDefault(ContextSpec.class, singleTenantSpec()) - .setDefault(RecordSpec.class, stgProjectSpec()) + .setDefault(RecordSpec.class, messageSpec()) .testAllPublicInstanceMethods(factory); } @@ -144,7 +144,7 @@ void namespaceForMultitenant() { var datastore = options.getService(); var factory = factoryFor(datastore); var storage = - factory.createRecordStorage(spec, stgProjectSpec()); + factory.createRecordStorage(spec, messageSpec()); var key = writeForTenant(storage, tenant) .setNamespace(namespace + ".V" + tenant.getValue()) .build(); @@ -162,7 +162,7 @@ void testDatastoreNamespaceInOptions() { var datastore = local(); var factory = factoryFor(datastore); var storage = - factory.createRecordStorage(spec, stgProjectSpec()); + factory.createRecordStorage(spec, messageSpec()); var key = writeForTenant(storage, tenant) .setNamespace('V' + tenant.getValue()) .build(); @@ -175,11 +175,11 @@ void testDatastoreNamespaceInOptions() { void testProduceBcBuilder() { DatastoreStorageFactory factory = TestDatastoreStorageFactory.local(); var builder = BoundedContext.multitenant(testName()); - Truth8.assertThat(builder.tenantIndex()) + assertThat(builder.tenantIndex()) .isEmpty(); var updatedIndex = factory.configureTenantIndex(builder) .tenantIndex(); - Truth8.assertThat(updatedIndex) + assertThat(updatedIndex) .isPresent(); assertThat(updatedIndex.get()).isInstanceOf(TestNamespaceIndex.getType()); } @@ -194,14 +194,14 @@ void plainRecord() { var spec = ContextSpec.singleTenant(testName()); var customStorage = InMemoryStorageFactory.newInstance() - .createRecordStorage(spec, stgProjectSpec()); + .createRecordStorage(spec, messageSpec()); var factory = DatastoreStorageFactory.newBuilder() .setDatastore(TestDatastores.local()) .useRecordStorage(StgProjectId.class, StgProject.class, configuration -> customStorage) .build(); var actualStorage = - factory.createRecordStorage(spec, stgProjectSpec()); + factory.createRecordStorage(spec, messageSpec()); assertThat(actualStorage).isEqualTo(customStorage); } diff --git a/datastore/src/test/java/io/spine/server/storage/datastore/given/DatastoreStorageFactoryTestEnv.java b/datastore/src/test/java/io/spine/server/storage/datastore/given/DatastoreStorageFactoryTestEnv.java index f300acc0..1edf6e5e 100644 --- a/datastore/src/test/java/io/spine/server/storage/datastore/given/DatastoreStorageFactoryTestEnv.java +++ b/datastore/src/test/java/io/spine/server/storage/datastore/given/DatastoreStorageFactoryTestEnv.java @@ -27,8 +27,10 @@ package io.spine.server.storage.datastore.given; import com.google.cloud.datastore.Datastore; -import io.spine.server.entity.storage.EntityRecordSpec; +import io.spine.server.entity.EntityRecord; +import io.spine.server.entity.storage.SpecScanner; import io.spine.server.projection.Projection; +import io.spine.server.storage.RecordSpec; import io.spine.server.storage.datastore.DatastoreStorageFactory; import io.spine.test.datastore.College; import io.spine.test.datastore.CollegeId; @@ -62,16 +64,16 @@ public static DatastoreStorageFactory factoryFor(Datastore datastore) { public static class TestEntity extends Projection { - public static EntityRecordSpec spec() { - return EntityRecordSpec.of(TestEntity.class); + public static RecordSpec spec() { + return SpecScanner.scan(TestEntity.class); } } public static class DifferentTestEntity extends Projection { - public static EntityRecordSpec spec() { - return EntityRecordSpec.of(DifferentTestEntity.class); + public static RecordSpec spec() { + return SpecScanner.scan(DifferentTestEntity.class); } } } diff --git a/datastore/src/test/java/io/spine/server/storage/datastore/given/TestRecordSpec.java b/datastore/src/test/java/io/spine/server/storage/datastore/given/TestRecordSpec.java index 28df608b..66e93f0b 100644 --- a/datastore/src/test/java/io/spine/server/storage/datastore/given/TestRecordSpec.java +++ b/datastore/src/test/java/io/spine/server/storage/datastore/given/TestRecordSpec.java @@ -26,10 +26,10 @@ package io.spine.server.storage.datastore.given; -import com.google.common.collect.ImmutableSet; -import io.spine.server.entity.storage.EntityRecordSpec; +import io.spine.server.entity.EntityRecord; +import io.spine.server.entity.storage.SpecScanner; import io.spine.server.projection.Projection; -import io.spine.server.storage.MessageRecordSpec; +import io.spine.server.storage.RecordSpec; import io.spine.test.storage.StgProject; import io.spine.test.storage.StgProjectId; @@ -44,24 +44,12 @@ public final class TestRecordSpec { private TestRecordSpec() { } - /** - * Creates a new {@code MessageRecordSpec} describing how instances of {@link StgProject} - * message are stored. - * - *

Defines no record columns. - */ - public static MessageRecordSpec stgProjectSpec() { - return new MessageRecordSpec<>( - StgProjectId.class, StgProject.class, StgProject::getId, ImmutableSet.of() - ); - } - /** * Creates a new {@code EntityRecordSpec} describing how instances of {@link ProjectDetails} * projection are stored. */ - public static EntityRecordSpec projectDetailsSpec() { - return EntityRecordSpec.of(ProjectDetails.class); + public static RecordSpec projectDetailsSpec() { + return SpecScanner.scan(ProjectDetails.class); } private static class ProjectDetails diff --git a/datastore/src/test/java/io/spine/server/storage/datastore/record/DsRecordStorageTest.java b/datastore/src/test/java/io/spine/server/storage/datastore/record/DsRecordStorageTest.java index e28810f2..bedaaa57 100644 --- a/datastore/src/test/java/io/spine/server/storage/datastore/record/DsRecordStorageTest.java +++ b/datastore/src/test/java/io/spine/server/storage/datastore/record/DsRecordStorageTest.java @@ -26,7 +26,6 @@ package io.spine.server.storage.datastore.record; -import io.spine.core.Versions; import io.spine.environment.Tests; import io.spine.server.ServerEnvironment; import io.spine.server.storage.RecordStorageDelegateTest; @@ -44,10 +43,11 @@ import org.junit.jupiter.api.Test; import static com.google.common.truth.Truth8.assertThat; +import static io.spine.base.Identifier.newUuid; import static io.spine.base.Time.currentTime; -import static io.spine.server.storage.given.StgColumn.due_date; -import static io.spine.server.storage.given.StgColumn.project_version; -import static io.spine.server.storage.given.StgColumn.status; +import static io.spine.server.storage.given.GivenStorageProject.StgProjectColumns.due_date; +import static io.spine.server.storage.given.GivenStorageProject.StgProjectColumns.name; +import static io.spine.server.storage.given.GivenStorageProject.StgProjectColumns.status; import static org.junit.jupiter.api.Assertions.assertEquals; @DisplayName("`DsRecordStorage` should") @@ -107,12 +107,12 @@ public StgProject newRecord(StgProjectId id) { void testPersistColumns() { var id = newId(); var project = newStorageRecord(id); - var expectedVersion = Versions.newVersion(42, currentTime()); var expectedDueDate = currentTime(); var expectedStatus = StgProject.Status.STARTED; + var expectedName = newUuid(); project = project .toBuilder() - .setProjectVersion(expectedVersion) + .setName(expectedName) .setDueDate(expectedDueDate) .setStatus(expectedStatus) .build(); @@ -135,9 +135,9 @@ void testPersistColumns() { assertEquals(expectedStatus.name(), datastoreEntity.getString(status.name() .value())); - assertEquals(expectedVersion.getNumber(), - datastoreEntity.getLong(project_version.name() - .value())); + assertEquals(expectedName, + datastoreEntity.getString(name.name() + .value())); var actualDueDate = datastoreEntity.getTimestamp(due_date.name() .value()); diff --git a/datastore/src/test/java/io/spine/server/storage/datastore/record/given/DsEntityColumnsTestEnv.java b/datastore/src/test/java/io/spine/server/storage/datastore/record/given/DsEntityColumnsTestEnv.java index 4303b34f..f5313fe7 100644 --- a/datastore/src/test/java/io/spine/server/storage/datastore/record/given/DsEntityColumnsTestEnv.java +++ b/datastore/src/test/java/io/spine/server/storage/datastore/record/given/DsEntityColumnsTestEnv.java @@ -33,7 +33,6 @@ import com.google.cloud.datastore.Value; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.protobuf.Any; import com.google.protobuf.Timestamp; import com.google.protobuf.util.Durations; import com.google.protobuf.util.Timestamps; @@ -43,7 +42,6 @@ import io.spine.core.Versions; import io.spine.server.entity.EntityRecord; import io.spine.server.entity.storage.EntityRecordStorage; -import io.spine.server.entity.storage.EntityRecordWithColumns; import io.spine.server.storage.ColumnTypeMapping; import io.spine.server.storage.datastore.DatastoreWrapper; import io.spine.server.storage.datastore.Kind; @@ -80,8 +78,7 @@ private DsEntityColumnsTestEnv() { DatastoreWrapper datastore, Key key) { var record = toEntityRecord(college, version); - var recordWithCols = EntityRecordWithColumns.create(record, COLLEGE_CLS); - storage.write(recordWithCols); + storage.write(college.getId(), record); var response = datastore.read(key); checkArgument(response.isPresent()); var storedDeadline = readAdmissionDeadline(response.get()); diff --git a/datastore/src/test/java/io/spine/server/storage/datastore/tenant/NamespaceIndexTest.java b/datastore/src/test/java/io/spine/server/storage/datastore/tenant/NamespaceIndexTest.java index c4d8a46d..4d715801 100644 --- a/datastore/src/test/java/io/spine/server/storage/datastore/tenant/NamespaceIndexTest.java +++ b/datastore/src/test/java/io/spine/server/storage/datastore/tenant/NamespaceIndexTest.java @@ -37,7 +37,7 @@ import io.spine.server.BoundedContextBuilder; import io.spine.server.ServerEnvironment; import io.spine.server.entity.EntityRecord; -import io.spine.server.entity.storage.EntityRecordSpec; +import io.spine.server.entity.storage.SpecScanner; import io.spine.server.storage.datastore.DatastoreStorageFactory; import io.spine.server.storage.datastore.given.CollegeProjection; import io.spine.test.datastore.College; @@ -89,7 +89,7 @@ void createIndex() { } @AfterEach - void closeContext() throws Exception { + void closeContext() { context.close(); } @@ -170,7 +170,7 @@ void findPrefixedNamespaces() { storageFactory.configureTenantIndex(contextBuilder); var context = contextBuilder.build(); var storage = storageFactory - .createRecordStorage(context.spec(), EntityRecordSpec.of(CollegeProjection.class)); + .createRecordStorage(context.spec(), SpecScanner.scan(CollegeProjection.class)); var id = CollegeId.newBuilder() .setValue("Aeronautic Forgery College") .build();