Skip to content

Commit 0aaa84c

Browse files
feat(datastore): Return nested data for belongsTo associations in datastore (#1390)
1 parent 1d9df01 commit 0aaa84c

File tree

2 files changed

+37
-23
lines changed

2 files changed

+37
-23
lines changed

aws-datastore/src/androidTest/java/com/amplifyframework/datastore/HybridOfflineInstrumentationTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,8 @@ public void queryModelsInSerializedForm() throws DataStoreException {
165165
serializedBlogData.put("id", blog.getId());
166166
serializedBlogData.put("name", blog.getName());
167167
serializedBlogData.put("owner", SerializedModel.builder()
168-
.serializedData(Collections.singletonMap("id", blogOwner.getId()))
169-
.modelSchema(null)
168+
.serializedData(serializedBlogOwnerData)
169+
.modelSchema(blogOwnerSchema)
170170
.build()
171171
);
172172
assertEquals(

aws-datastore/src/main/java/com/amplifyframework/datastore/storage/sqlite/SQLiteStorageAdapter.java

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.amplifyframework.core.Consumer;
2929
import com.amplifyframework.core.async.Cancelable;
3030
import com.amplifyframework.core.model.Model;
31+
import com.amplifyframework.core.model.ModelAssociation;
3132
import com.amplifyframework.core.model.ModelField;
3233
import com.amplifyframework.core.model.ModelProvider;
3334
import com.amplifyframework.core.model.ModelSchema;
@@ -416,7 +417,6 @@ public <T extends Model> void query(
416417
/**
417418
* {@inheritDoc}
418419
*/
419-
@SuppressWarnings("unchecked")
420420
@Override
421421
public void query(
422422
@NonNull String modelName,
@@ -447,26 +447,8 @@ public void query(
447447

448448
if (cursor.moveToFirst()) {
449449
do {
450-
final Map<String, Object> serializedData = new HashMap<>();
451-
for (Map.Entry<String, Object> entry : converter.buildMapForModel(cursor).entrySet()) {
452-
ModelField field = modelSchema.getFields().get(entry.getKey());
453-
if (field == null || entry.getValue() == null) {
454-
// Skip it
455-
} else if (field.isModel()) {
456-
String id = (String) ((Map<String, Object>) entry.getValue()).get("id");
457-
serializedData.put(entry.getKey(), SerializedModel.builder()
458-
.serializedData(Collections.singletonMap("id", id))
459-
.modelSchema(null)
460-
.build()
461-
);
462-
} else {
463-
serializedData.put(entry.getKey(), entry.getValue());
464-
}
465-
}
466-
SerializedModel model = SerializedModel.builder()
467-
.serializedData(serializedData)
468-
.modelSchema(modelSchema)
469-
.build();
450+
final Map<String, Object> data = converter.buildMapForModel(cursor);
451+
final SerializedModel model = createSerializedModel(modelSchema, data);
470452
models.add(model);
471453
} while (cursor.moveToNext());
472454
}
@@ -831,4 +813,36 @@ private Completable updateModels() {
831813
return PersistentModelVersion.saveToLocalStorage(this, persistentModelVersion);
832814
}).ignoreElement();
833815
}
816+
817+
/**
818+
* recursively creates nested SerializedModels from raw data.
819+
*/
820+
private SerializedModel createSerializedModel(ModelSchema modelSchema, Map<String, Object> data) {
821+
final Map<String, Object> serializedData = new HashMap<>();
822+
for (Map.Entry<String, Object> entry : data.entrySet()) {
823+
ModelField field = modelSchema.getFields().get(entry.getKey());
824+
if (field != null && entry.getValue() != null) {
825+
if (field.isModel()) {
826+
ModelAssociation association = modelSchema.getAssociations().get(entry.getKey());
827+
if (association != null) {
828+
String associatedType = association.getAssociatedType();
829+
final ModelSchema nestedModelSchema = modelSchemaRegistry.getModelSchemaForModelClass(
830+
associatedType
831+
);
832+
@SuppressWarnings("unchecked")
833+
SerializedModel model = createSerializedModel(
834+
nestedModelSchema, (Map<String, Object>) entry.getValue()
835+
);
836+
serializedData.put(entry.getKey(), model);
837+
}
838+
} else {
839+
serializedData.put(entry.getKey(), entry.getValue());
840+
}
841+
}
842+
}
843+
return SerializedModel.builder()
844+
.serializedData(serializedData)
845+
.modelSchema(modelSchema)
846+
.build();
847+
}
834848
}

0 commit comments

Comments
 (0)