Skip to content

Commit 7f13589

Browse files
authored
Merge pull request #119 from SpineEventEngine/update-to-responseformat-api
Update to the latest `Storage` API.
2 parents e83aab7 + 79421c5 commit 7f13589

File tree

10 files changed

+147
-194
lines changed

10 files changed

+147
-194
lines changed

datastore/config/index.yaml

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,10 @@ indexes:
1010
- name: type
1111
- name: created
1212

13-
- kind: spine.system.server.EntityHistory
13+
- kind: spine.server.delivery.InboxMessage
1414
properties:
15-
- name: aggregate_id
16-
- name: version
17-
direction: desc
18-
- name: created
19-
direction: desc
20-
- name: snapshot
21-
22-
- kind: spine.system.server.CommandLifecycle
23-
properties:
24-
- name: aggregate_id
25-
- name: version
26-
direction: desc
27-
- name: created
28-
direction: desc
29-
- name: snapshot
15+
- name: inbox_shard
16+
- name: when_received
3017

3118
# Indexes for the Aggregates.
3219
#

datastore/src/main/java/io/spine/server/storage/datastore/DsLookupByQueries.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.google.common.collect.Streams;
2626
import com.google.protobuf.FieldMask;
2727
import io.spine.client.OrderBy;
28+
import io.spine.client.ResponseFormat;
2829
import io.spine.server.entity.EntityRecord;
2930
import io.spine.server.entity.storage.CompositeQueryParameter;
3031
import io.spine.server.entity.storage.QueryParameters;
@@ -47,9 +48,8 @@
4748
/**
4849
* An {@code Entity} lookup using {@linkplain QueryParameters Spine query parameters}.
4950
*
50-
* @implNote A single {@linkplain #find(QueryParameters, FieldMask) find()} call may turn
51-
* into several
52-
* Datastore reads. See {@link DsFilters} for details.
51+
* @implNote A single {@linkplain #find(QueryParameters, ResponseFormat) find()} call may
52+
* turn into several Datastore reads. See {@link DsFilters} for details.
5353
*/
5454
final class DsLookupByQueries {
5555

@@ -68,30 +68,34 @@ final class DsLookupByQueries {
6868

6969
/**
7070
* Finds a collection of entities matching provided {@link QueryParameters} in Datastore and
71-
* returns them one-by-one applying a {@code fieldMask}.
71+
* returns them according to the specified {@code format}.
7272
*
7373
* @param params
74-
* parameters specifying the filters, order and limit for records to conform to
75-
* @param fieldMask
76-
* a mask to apply to each returned {@linkplain EntityRecord#getState() records state}
74+
* parameters specifying the filters for records to conform to
75+
* @param format
76+
* format of the search specifying limits, order and field mask to apply to the results
7777
* @return an iterator over the entity records from the Datastore
7878
*/
79-
Iterator<EntityRecord> find(QueryParameters params, FieldMask fieldMask) {
80-
List<StructuredQuery<Entity>> queries = splitToMultipleDsQueries(params);
79+
Iterator<EntityRecord> find(QueryParameters params, ResponseFormat format) {
80+
List<StructuredQuery<Entity>> queries = splitToMultipleDsQueries(params, format);
81+
FieldMask mask = format.getFieldMask();
8182
if (queries.size() == 1) {
82-
Iterator<EntityRecord> results = find(queries.get(0), fieldMask);
83+
Iterator<EntityRecord> results = find(queries.get(0), mask);
8384
return results;
8485
}
85-
Iterator<EntityRecord> results = find(queries, params.orderBy(), params.limit(), fieldMask);
86+
87+
Iterator<EntityRecord> results =
88+
find(queries, format.getOrderBy(), format.getLimit(), mask);
8689
return results;
8790
}
8891

89-
private List<StructuredQuery<Entity>> splitToMultipleDsQueries(QueryParameters params) {
92+
private List<StructuredQuery<Entity>>
93+
splitToMultipleDsQueries(QueryParameters params, ResponseFormat format) {
9094
checkNotNull(params);
9195

9296
List<StructuredQuery<Entity>> queries = buildDsFilters(params.iterator())
9397
.stream()
94-
.map(new QueryWithFilter(params, Kind.of(typeUrl)))
98+
.map(new QueryWithFilter(format, Kind.of(typeUrl)))
9599
.collect(toList());
96100
return queries;
97101
}

datastore/src/main/java/io/spine/server/storage/datastore/DsProjectionStorage.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.google.protobuf.FieldMask;
2424
import com.google.protobuf.Message;
2525
import com.google.protobuf.Timestamp;
26+
import io.spine.client.ResponseFormat;
2627
import io.spine.server.entity.EntityRecord;
2728
import io.spine.server.projection.Projection;
2829
import io.spine.server.projection.ProjectionStorage;
@@ -87,25 +88,15 @@ public boolean delete(I id) {
8788
}
8889

8990
@Override
90-
protected Iterator<EntityRecord> readMultipleRecords(Iterable<I> ids) {
91-
return recordStorage().readMultiple(ids);
91+
protected Iterator<EntityRecord> readAllRecords(ResponseFormat format) {
92+
return recordStorage.readAllRecords(format);
9293
}
9394

9495
@Override
9596
protected Iterator<EntityRecord> readMultipleRecords(Iterable<I> ids, FieldMask fieldMask) {
9697
return recordStorage().readMultiple(ids, fieldMask);
9798
}
9899

99-
@Override
100-
protected Iterator<EntityRecord> readAllRecords() {
101-
return recordStorage().readAll();
102-
}
103-
104-
@Override
105-
protected Iterator<EntityRecord> readAllRecords(FieldMask fieldMask) {
106-
return recordStorage().readAll(fieldMask);
107-
}
108-
109100
@Override
110101
public Iterator<I> index() {
111102
return recordStorage.index();

datastore/src/main/java/io/spine/server/storage/datastore/DsRecordStorage.java

Lines changed: 30 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import com.google.protobuf.Any;
2929
import com.google.protobuf.FieldMask;
3030
import com.google.protobuf.Message;
31+
import io.spine.client.OrderBy;
32+
import io.spine.client.ResponseFormat;
3133
import io.spine.server.entity.EntityRecord;
3234
import io.spine.server.entity.storage.ColumnTypeRegistry;
3335
import io.spine.server.entity.storage.EntityQuery;
@@ -128,34 +130,23 @@ protected Optional<EntityRecord> readRecord(I id) {
128130
}
129131

130132
@Override
131-
protected Iterator<@Nullable EntityRecord> readMultipleRecords(Iterable<I> ids) {
132-
return idLookup.findActive(ids);
133-
}
134-
135-
@Override
136-
protected Iterator<@Nullable EntityRecord> readMultipleRecords(Iterable<I> ids,
137-
FieldMask fieldMask) {
138-
return idLookup.findActive(ids, fieldMask);
139-
}
140-
141-
@Override
142-
protected Iterator<EntityRecord> readAllRecords() {
143-
Iterator<EntityRecord> result = readAllRecords(FieldMask.getDefaultInstance());
133+
protected Iterator<EntityRecord> readAllRecords(ResponseFormat format) {
134+
Iterator<EntityRecord> result = queryLookup.find(activeEntityQueryParams(this), format);
144135
return result;
145136
}
146137

147138
@Override
148-
protected Iterator<EntityRecord> readAllRecords(FieldMask fieldMask) {
149-
Iterator<EntityRecord> result = queryLookup.find(activeEntityQueryParams(this), fieldMask);
150-
return result;
139+
protected Iterator<EntityRecord> readAllRecords(EntityQuery<I> query, ResponseFormat format) {
140+
if (isQueryForAll(query)) {
141+
return readAll(format);
142+
}
143+
return queryBy(query, format);
151144
}
152145

153146
@Override
154-
protected Iterator<EntityRecord> readAllRecords(EntityQuery<I> query, FieldMask fieldMask) {
155-
if (isQueryForAll(query)) {
156-
return readAll(fieldMask);
157-
}
158-
return queryBy(query, fieldMask);
147+
protected Iterator<@Nullable EntityRecord> readMultipleRecords(Iterable<I> ids,
148+
FieldMask fieldMask) {
149+
return idLookup.findActive(ids, fieldMask);
159150
}
160151

161152
@SuppressWarnings("PMD.SimplifyBooleanReturns")
@@ -167,19 +158,7 @@ private static <I> boolean isQueryForAll(EntityQuery<I> query) {
167158
}
168159

169160
QueryParameters params = query.getParameters();
170-
if (notEmpty(params)) {
171-
return false;
172-
}
173-
174-
if (params.ordered()) {
175-
return false;
176-
}
177-
178-
if (params.limited()) {
179-
return false;
180-
}
181-
182-
return true;
161+
return !notEmpty(params);
183162
}
184163

185164
/**
@@ -190,17 +169,18 @@ private static <I> boolean isQueryForAll(EntityQuery<I> query) {
190169
*
191170
* @param entityQuery
192171
* the {@link EntityQuery} to query the Datastore by
193-
* @param fieldMask
194-
* the {@code FieldMask} to apply to all the retrieved entity states
172+
* @param responseFormat
173+
* the {@code ResponseFormat} according to which the result is retrieved
195174
* @return an iterator over the resulting entity records
196175
*/
197-
private Iterator<EntityRecord> queryBy(EntityQuery<I> entityQuery, FieldMask fieldMask) {
176+
private Iterator<EntityRecord> queryBy(EntityQuery<I> entityQuery,
177+
ResponseFormat responseFormat) {
198178
EntityQuery<I> completeQuery = includeLifecycle(entityQuery);
199179
Collection<I> idFilter = completeQuery.getIds();
200180
QueryParameters params = completeQuery.getParameters();
201181
Iterator<EntityRecord> result = idFilter.isEmpty()
202-
? queryLookup.find(params, fieldMask)
203-
: queryByIdsAndColumns(idFilter, params, fieldMask);
182+
? queryLookup.find(params, responseFormat)
183+
: queryByIdsAndColumns(idFilter, params, responseFormat);
204184
return result;
205185
}
206186

@@ -220,20 +200,23 @@ private EntityQuery<I> includeLifecycle(EntityQuery<I> entityQuery) {
220200
* the IDs to search by
221201
* @param params
222202
* the additional query parameters
223-
* @param fieldMask
224-
* the {@code FieldMask} to apply to all the retrieved entity states
203+
* @param format
204+
* the format of the response including a field mask to apply, response size limit
205+
* and ordering
225206
* @return an iterator over the resulting entity records
226207
*/
227208
private Iterator<EntityRecord> queryByIdsAndColumns(Collection<I> acceptableIds,
228209
QueryParameters params,
229-
FieldMask fieldMask) {
210+
ResponseFormat format) {
230211
Predicate<Entity> inMemPredicate = columnPredicate(params);
231-
if (params.ordered()) {
232-
if (params.limited()) {
233-
return idLookup.find(acceptableIds, fieldMask, inMemPredicate,
234-
params.orderBy(), params.limit());
212+
FieldMask fieldMask = format.getFieldMask();
213+
if (format.hasOrderBy()) {
214+
OrderBy order = format.getOrderBy();
215+
int limit = format.getLimit();
216+
if (limit > 0) {
217+
return idLookup.find(acceptableIds, fieldMask, inMemPredicate, order, limit);
235218
}
236-
return idLookup.find(acceptableIds, fieldMask, inMemPredicate, params.orderBy());
219+
return idLookup.find(acceptableIds, fieldMask, inMemPredicate, order);
237220
}
238221
return idLookup.find(acceptableIds, fieldMask, inMemPredicate);
239222
}

datastore/src/main/java/io/spine/server/storage/datastore/QueryWithFilter.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import com.google.cloud.datastore.Query;
2525
import com.google.cloud.datastore.StructuredQuery;
2626
import io.spine.client.OrderBy;
27-
import io.spine.server.entity.storage.QueryParameters;
27+
import io.spine.client.ResponseFormat;
2828

2929
import java.util.function.Function;
3030

@@ -41,17 +41,18 @@ final class QueryWithFilter implements Function<StructuredQuery.Filter, Structur
4141

4242
private final StructuredQuery.Builder<Entity> builder;
4343

44-
QueryWithFilter(QueryParameters params, Kind kind) {
45-
checkNotNull(params);
44+
QueryWithFilter(ResponseFormat format, Kind kind) {
45+
checkNotNull(format);
4646
checkNotNull(kind);
4747

4848
this.builder = Query.newEntityQueryBuilder()
4949
.setKind(kind.getValue());
50-
if (params.ordered()) {
51-
this.builder.setOrderBy(translateOrderBy(params.orderBy()));
50+
if (format.hasOrderBy()) {
51+
this.builder.setOrderBy(translateOrderBy(format.getOrderBy()));
5252
}
53-
if (params.limited()) {
54-
this.builder.setLimit(params.limit());
53+
int limit = format.getLimit();
54+
if (limit > 0) {
55+
this.builder.setLimit(limit);
5556
}
5657
}
5758

datastore/src/test/java/io/spine/server/storage/datastore/BigDataTester.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
package io.spine.server.storage.datastore;
2222

2323
import com.google.common.base.Throwables;
24+
import io.spine.client.ResponseFormat;
2425
import io.spine.logging.Logging;
2526
import io.spine.server.entity.EntityRecord;
2627
import io.spine.server.entity.storage.EntityRecordWithColumns;
@@ -120,7 +121,7 @@ public void testBigDataOperations(RecordStorage<I> storage) {
120121
long readStart = System.currentTimeMillis();
121122

122123
// Do not test data equality here, only the sizes and time
123-
Iterator<EntityRecord> readRecords = storage.readAll();
124+
Iterator<EntityRecord> readRecords = storage.readAll(ResponseFormat.getDefaultInstance());
124125

125126
long readEnd = System.currentTimeMillis();
126127
long readTime = readEnd - readStart;

0 commit comments

Comments
 (0)