diff --git a/example/bin/myapp.g.dart b/example/bin/myapp.g.dart index e2e05c69b..4697abd18 100644 --- a/example/bin/myapp.g.dart +++ b/example/bin/myapp.g.dart @@ -61,7 +61,7 @@ class Car extends _Car with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Car._); - return const SchemaObject(ObjectType.realmObject, Car, 'Car', [ + return SchemaObject(ObjectType.realmObject, Car, 'Car', [ SchemaProperty('make', RealmPropertyType.string), SchemaProperty('model', RealmPropertyType.string, optional: true), SchemaProperty('kilometers', RealmPropertyType.int, optional: true), @@ -69,6 +69,9 @@ class Car extends _Car with RealmEntity, RealmObjectBase, RealmObject { optional: true, linkTarget: 'Person'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Person extends _Person with RealmEntity, RealmObjectBase, RealmObject { @@ -110,9 +113,12 @@ class Person extends _Person with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Person._); - return const SchemaObject(ObjectType.realmObject, Person, 'Person', [ + return SchemaObject(ObjectType.realmObject, Person, 'Person', [ SchemaProperty('name', RealmPropertyType.string), SchemaProperty('age', RealmPropertyType.int), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } diff --git a/flutter/realm_flutter/example/lib/main.g.dart b/flutter/realm_flutter/example/lib/main.g.dart index c0cc2b3a5..03389510b 100644 --- a/flutter/realm_flutter/example/lib/main.g.dart +++ b/flutter/realm_flutter/example/lib/main.g.dart @@ -61,7 +61,7 @@ class Car extends _Car with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Car._); - return const SchemaObject(ObjectType.realmObject, Car, 'Car', [ + return SchemaObject(ObjectType.realmObject, Car, 'Car', [ SchemaProperty('make', RealmPropertyType.string), SchemaProperty('model', RealmPropertyType.string, optional: true), SchemaProperty('kilometers', RealmPropertyType.int, optional: true), @@ -69,6 +69,9 @@ class Car extends _Car with RealmEntity, RealmObjectBase, RealmObject { optional: true, linkTarget: 'Person'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Person extends _Person with RealmEntity, RealmObjectBase, RealmObject { @@ -110,9 +113,12 @@ class Person extends _Person with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Person._); - return const SchemaObject(ObjectType.realmObject, Person, 'Person', [ + return SchemaObject(ObjectType.realmObject, Person, 'Person', [ SchemaProperty('name', RealmPropertyType.string), SchemaProperty('age', RealmPropertyType.int), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } diff --git a/generator/lib/src/realm_model_info.dart b/generator/lib/src/realm_model_info.dart index 21f64e57f..e2e24f946 100644 --- a/generator/lib/src/realm_model_info.dart +++ b/generator/lib/src/realm_model_info.dart @@ -124,7 +124,7 @@ class RealmModelInfo { yield 'static SchemaObject _initSchema() {'; { yield 'RealmObjectBase.registerFactory($name._);'; - yield "return const SchemaObject(ObjectType.${baseType.name}, $name, '$realmName', ["; + yield "return SchemaObject(ObjectType.${baseType.name}, $name, '$realmName', ["; { yield* fields.map((f) { final namedArgs = { @@ -146,6 +146,9 @@ class RealmModelInfo { yield ']);'; } yield '}'; + yield ''; + yield '@override'; + yield 'SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema;'; } yield '}'; } diff --git a/lib/src/configuration.dart b/lib/src/configuration.dart index 16659997e..be12e2390 100644 --- a/lib/src/configuration.dart +++ b/lib/src/configuration.dart @@ -413,13 +413,12 @@ class InMemoryConfiguration extends Configuration { /// A collection of properties describing the underlying schema of a [RealmObjectBase]. /// /// {@category Configuration} -class SchemaObject { +class SchemaObject extends Iterable { + final List _properties; + /// Schema object type. final Type type; - /// Collection of the properties of this schema object. - final List properties; - /// Returns the name of this schema type. final String name; @@ -427,7 +426,18 @@ class SchemaObject { final ObjectType baseType; /// Creates schema instance with object type and collection of object's properties. - const SchemaObject(this.baseType, this.type, this.name, this.properties); + SchemaObject(this.baseType, this.type, this.name, Iterable properties) : _properties = List.from(properties); + + @override + Iterator get iterator => _properties.iterator; + + @override + int get length => _properties.length; + + SchemaProperty operator [](int index) => _properties[index]; + + @override + SchemaProperty elementAt(int index) => _properties.elementAt(index); } /// Describes the complete set of classes which may be stored in a `Realm` @@ -456,6 +466,14 @@ class RealmSchema extends Iterable { /// @nodoc extension SchemaObjectInternal on SchemaObject { bool get isGenericRealmObject => type == RealmObject || type == EmbeddedObject || type == RealmObjectBase; + + void add(SchemaProperty property) => _properties.add(property); +} + +extension RealmSchemaInternal on RealmSchema { + void add(SchemaObject obj) { + _schema.add(obj); + } } /// [ClientResetHandler] is triggered if the device and server cannot agree diff --git a/lib/src/native/realm_core.dart b/lib/src/native/realm_core.dart index 26d17ac14..14fe56255 100644 --- a/lib/src/native/realm_core.dart +++ b/lib/src/native/realm_core.dart @@ -175,8 +175,8 @@ class _RealmCore { for (var i = 0; i < classCount; i++) { final schemaObject = schema.elementAt(i); final classInfo = schemaClasses.elementAt(i).ref; - final propertiesCount = schemaObject.properties.length; - final computedCount = schemaObject.properties.where((p) => p.isComputed).length; + final propertiesCount = schemaObject.length; + final computedCount = schemaObject.where((p) => p.isComputed).length; final persistedCount = propertiesCount - computedCount; classInfo.name = schemaObject.name.toCharPtr(arena); @@ -189,7 +189,7 @@ class _RealmCore { final properties = arena(propertiesCount); for (var j = 0; j < propertiesCount; j++) { - final schemaProperty = schemaObject.properties[j]; + final schemaProperty = schemaObject[j]; final propInfo = properties.elementAt(j).ref; propInfo.name = schemaProperty.mapTo.toCharPtr(arena); propInfo.public_name = (schemaProperty.mapTo != schemaProperty.name ? schemaProperty.name : '').toCharPtr(arena); @@ -289,7 +289,7 @@ class _RealmCore { } else if (config is InMemoryConfiguration) { _realmLib.realm_config_set_in_memory(configHandle._pointer, true); } else if (config is FlexibleSyncConfiguration) { - _realmLib.realm_config_set_schema_mode(configHandle._pointer, realm_schema_mode.RLM_SCHEMA_MODE_ADDITIVE_EXPLICIT); + _realmLib.realm_config_set_schema_mode(configHandle._pointer, realm_schema_mode.RLM_SCHEMA_MODE_ADDITIVE_DISCOVERED); final syncConfigPtr = _realmLib.invokeGetPointer(() => _realmLib.realm_flx_sync_config_new(config.user.handle._pointer)); try { _realmLib.realm_sync_config_set_session_stop_policy(syncConfigPtr, config.sessionStopPolicy.index); @@ -338,6 +338,12 @@ class _RealmCore { if (config.encryptionKey != null) { _realmLib.realm_config_set_encryption_key(configPtr, config.encryptionKey!.toUint8Ptr(arena), encryptionKeySize); } + + // For sync and for dynamic Realms, we need to have a complete view of the schema in Core. + if (config.schemaObjects.isEmpty || config is FlexibleSyncConfiguration) { + _realmLib.realm_config_set_schema_subset_mode(configHandle._pointer, realm_schema_subset_mode.RLM_SCHEMA_SUBSET_MODE_COMPLETE); + } + return configHandle; }); } @@ -962,38 +968,42 @@ class _RealmCore { } final primaryKey = classInfo.ref.primary_key.cast().toRealmDartString(treatEmptyAsNull: true); - return RealmObjectMetadata(schema, classInfo.ref.key, _getPropertyMetadata(realm, classInfo.ref.key, primaryKey)); + return RealmObjectMetadata(schema, classInfo.ref.key, _getPropertiesMetadata(realm, classInfo.ref.key, primaryKey, arena)); }); } - Map _getPropertyMetadata(Realm realm, int classKey, String? primaryKeyName) { + Map getPropertiesMetadata(Realm realm, int classKey, String? primaryKeyName) { return using((Arena arena) { - final propertyCountPtr = arena(); - _realmLib.invokeGetBool( - () => _realmLib.realm_get_property_keys(realm.handle._pointer, classKey, nullptr, 0, propertyCountPtr), "Error getting property count"); - - var propertyCount = propertyCountPtr.value; - final propertiesPtr = arena(propertyCount); - _realmLib.invokeGetBool(() => _realmLib.realm_get_class_properties(realm.handle._pointer, classKey, propertiesPtr, propertyCount, propertyCountPtr), - "Error getting class properties."); - - propertyCount = propertyCountPtr.value; - Map result = {}; - for (var i = 0; i < propertyCount; i++) { - final property = propertiesPtr.elementAt(i); - final propertyName = property.ref.name.cast().toRealmDartString()!; - final objectType = property.ref.link_target.cast().toRealmDartString(treatEmptyAsNull: true); - final linkOriginProperty = property.ref.link_origin_property_name.cast().toRealmDartString(treatEmptyAsNull: true); - final isNullable = property.ref.flags & realm_property_flags.RLM_PROPERTY_NULLABLE != 0; - final isPrimaryKey = propertyName == primaryKeyName; - final propertyMeta = RealmPropertyMetadata(property.ref.key, objectType, linkOriginProperty, RealmPropertyType.values.elementAt(property.ref.type), - isNullable, isPrimaryKey, RealmCollectionType.values.elementAt(property.ref.collection_type)); - result[propertyName] = propertyMeta; - } - return result; + return _getPropertiesMetadata(realm, classKey, primaryKeyName, arena); }); } + Map _getPropertiesMetadata(Realm realm, int classKey, String? primaryKeyName, Arena arena) { + final propertyCountPtr = arena(); + _realmLib.invokeGetBool( + () => _realmLib.realm_get_property_keys(realm.handle._pointer, classKey, nullptr, 0, propertyCountPtr), "Error getting property count"); + + var propertyCount = propertyCountPtr.value; + final propertiesPtr = arena(propertyCount); + _realmLib.invokeGetBool(() => _realmLib.realm_get_class_properties(realm.handle._pointer, classKey, propertiesPtr, propertyCount, propertyCountPtr), + "Error getting class properties."); + + propertyCount = propertyCountPtr.value; + Map result = {}; + for (var i = 0; i < propertyCount; i++) { + final property = propertiesPtr.elementAt(i); + final propertyName = property.ref.name.cast().toRealmDartString()!; + final objectType = property.ref.link_target.cast().toRealmDartString(treatEmptyAsNull: true); + final linkOriginProperty = property.ref.link_origin_property_name.cast().toRealmDartString(treatEmptyAsNull: true); + final isNullable = property.ref.flags & realm_property_flags.RLM_PROPERTY_NULLABLE != 0; + final isPrimaryKey = propertyName == primaryKeyName; + final propertyMeta = RealmPropertyMetadata(property.ref.key, objectType, linkOriginProperty, RealmPropertyType.values.elementAt(property.ref.type), + isNullable, isPrimaryKey, RealmCollectionType.values.elementAt(property.ref.collection_type)); + result[propertyName] = propertyMeta; + } + return result; + } + RealmObjectHandle createRealmObject(Realm realm, int classKey) { final realmPtr = _realmLib.invokeGetPointer(() => _realmLib.realm_object_create(realm.handle._pointer, classKey)); return RealmObjectHandle._(realmPtr, realm.handle); @@ -1735,6 +1745,15 @@ class _RealmCore { } } + static void schema_change_callback(Pointer userdata, Pointer data) { + final Realm realm = userdata.toObject(); + try { + realm.updateSchema(); + } catch (e) { + Realm.logger.log(RealmLogLevel.error, 'Failed to update Realm schema: $e'); + } + } + RealmNotificationTokenHandle subscribeResultsNotifications(RealmResults results, NotificationsController controller) { final pointer = _realmLib.invokeGetPointer(() => _realmLib.realm_results_add_notification_callback( results.handle._pointer, @@ -1783,6 +1802,13 @@ class _RealmCore { return RealmNotificationTokenHandle._(pointer, map.realm.handle); } + RealmCallbackTokenHandle subscribeForSchemaNotifications(Realm realm) { + final pointer = _realmLib.invokeGetPointer( + () => _realmLib.realm_add_schema_changed_callback(realm.handle._pointer, Pointer.fromFunction(schema_change_callback), realm.toWeakHandle(), nullptr)); + + return RealmCallbackTokenHandle._(pointer, realm.handle); + } + bool getObjectChangesIsDeleted(RealmObjectChangesHandle handle) { return _realmLib.realm_object_changes_is_deleted(handle._pointer); } @@ -3159,6 +3185,10 @@ class _RealmQueryHandle extends RootedHandleBase { _RealmQueryHandle._(Pointer pointer, RealmHandle root) : super(root, pointer, 256); } +class RealmCallbackTokenHandle extends RootedHandleBase { + RealmCallbackTokenHandle._(Pointer pointer, RealmHandle root) : super(root, pointer, 32); +} + class RealmNotificationTokenHandle extends RootedHandleBase { RealmNotificationTokenHandle._(Pointer pointer, RealmHandle root) : super(root, pointer, 32); } diff --git a/lib/src/realm_class.dart b/lib/src/realm_class.dart index f2dc47132..debf4242b 100644 --- a/lib/src/realm_class.dart +++ b/lib/src/realm_class.dart @@ -158,6 +158,7 @@ class Realm implements Finalizable { late final RealmMetadata _metadata; late final RealmHandle _handle; final bool _isInMigration; + late final RealmCallbackTokenHandle? _schemaCallbackHandle; /// An object encompassing this `Realm` instance's dynamic API. late final DynamicRealm dynamic = DynamicRealm._(this); @@ -179,6 +180,15 @@ class Realm implements Finalizable { Realm._(this.config, [RealmHandle? handle, this._isInMigration = false]) : _handle = handle ?? _openRealm(config) { _populateMetadata(); + // The schema of a Realm file may change due to sync adding new properties/classes. We subscribe for notifications + // in order to update the managed schema instance in case this happens. The same is true for dynamic Realms. For + // local Realms with user-supplied schema, the schema on disk may still change, but Core doesn't report the updated + // schema, so even if we subscribe, we wouldn't be able to see the updates. + if (config is FlexibleSyncConfiguration || config.schemaObjects.isEmpty) { + _schemaCallbackHandle = realmCore.subscribeForSchemaNotifications(this); + } else { + _schemaCallbackHandle = null; + } } /// A method for asynchronously opening a [Realm]. @@ -436,6 +446,7 @@ class Realm implements Finalizable { return; } + _schemaCallbackHandle?.release(); realmCore.closeRealm(this); handle.release(); } @@ -645,6 +656,29 @@ class Realm implements Finalizable { Future refreshAsync() async { return realmCore.realmRefreshAsync(this); } + + void _updateSchema() { + final newSchema = realmCore.readSchema(this); + + for (final schemaObject in newSchema) { + final existing = schema.firstWhereOrNull((s) => s.name == schemaObject.name); + if (existing == null) { + schema.add(schemaObject); + final meta = realmCore.getObjectMetadata(this, schemaObject); + metadata._add(meta); + } else if (schemaObject.length > existing.length) { + final existingMeta = metadata.getByName(schemaObject.name); + final propertyMeta = realmCore.getPropertiesMetadata(this, existingMeta.classKey, existingMeta.primaryKey); + for (final property in schemaObject) { + final existingProp = existing.firstWhereOrNull((e) => e.mapTo == property.mapTo); + if (existingProp == null) { + existing.add(property); + existingMeta[property.name] = propertyMeta[property.name]!; + } + } + } + } + } } /// Provides a scope to safely write data to a [Realm]. Can be created using [Realm.beginWrite] or @@ -839,6 +873,10 @@ extension RealmInternal on Realm { static void logMessageForTesting(Level logLevel, String message) { realmCore.logMessageForTesting(logLevel, message); } + + void updateSchema() { + _updateSchema(); + } } /// @nodoc @@ -930,13 +968,19 @@ class RealmMetadata { RealmMetadata._(Iterable objectMetadatas) { for (final metadata in objectMetadatas) { - if (!metadata.schema.isGenericRealmObject) { - _typeMap[metadata.schema.type] = metadata; - } else { - _stringMap[metadata.schema.name] = metadata; - } - _classKeyMap[metadata.classKey] = metadata; + _add(metadata); + } + } + + /// This is used when constructing the metadata, but also when the Realm schema + /// changes. + void _add(RealmObjectMetadata metadata) { + if (!metadata.schema.isGenericRealmObject) { + _typeMap[metadata.schema.type] = metadata; + } else { + _stringMap[metadata.schema.name] = metadata; } + _classKeyMap[metadata.classKey] = metadata; } RealmObjectMetadata getByType(Type type) { diff --git a/lib/src/realm_object.dart b/lib/src/realm_object.dart index b1b313306..dcbe9faf0 100644 --- a/lib/src/realm_object.dart +++ b/lib/src/realm_object.dart @@ -100,10 +100,11 @@ class RealmValuesAccessor implements RealmAccessor { } } +/// @nodoc class RealmObjectMetadata { final int classKey; final SchemaObject schema; - late final String? primaryKey = schema.properties.firstWhereOrNull((element) => element.primaryKey)?.mapTo; + late final String? primaryKey = schema.firstWhereOrNull((element) => element.primaryKey)?.mapTo; final Map _propertyKeys; @@ -114,11 +115,11 @@ class RealmObjectMetadata { RealmPropertyMetadata operator [](String propertyName) { var meta = _propertyKeys[propertyName]; if (meta == null) { - // We couldn't find a proeprty by the name supplied by the user - this may be because the _propertyKeys + // We couldn't find a property by the name supplied by the user - this may be because the _propertyKeys // map is keyed on the property names as they exist in the database while the user supplied the public // name (i.e. the name of the property in the model). Try and look up the property by the public name and // then try to re-fetch the property meta using the database name. - final publicName = schema.properties.firstWhereOrNull((e) => e.name == propertyName)?.mapTo; + final publicName = schema.firstWhereOrNull((e) => e.name == propertyName)?.mapTo; if (publicName != null && publicName != propertyName) { meta = _propertyKeys[publicName]; } @@ -126,9 +127,10 @@ class RealmObjectMetadata { return meta ?? (throw RealmException("Property $propertyName does not exist on class $_realmObjectTypeName")); } - // _propertyKeys[propertyName] ?? - // schema.properties.firstWhereOrNull((p) => p.name == propertyName) ?? - // (throw RealmException("Property $propertyName does not exist on class $_realmObjectTypeName")); + + void operator []=(String propertyName, RealmPropertyMetadata value) { + _propertyKeys[propertyName] = value; + } String? getPropertyName(int propertyKey) { for (final entry in _propertyKeys.entries) { @@ -140,6 +142,7 @@ class RealmObjectMetadata { } } +/// @nodoc class RealmPropertyMetadata { final int key; final RealmCollectionType collectionType; @@ -379,6 +382,16 @@ mixin RealmObjectBase on RealmEntity implements RealmObjectBaseMarker, Finalizab object._accessor.set(object, name, value, update: update); } + /// @nodoc + static SchemaObject? getSchema(RealmObjectBase object) { + final accessor = object.accessor; + if (accessor is RealmCoreAccessor) { + return accessor.metadata.schema; + } + + return null; + } + /// @nodoc static void registerFactory(T Function() factory) { // We register a factory for both the type itself, but also the nullable @@ -554,6 +567,9 @@ mixin RealmObjectBase on RealmEntity implements RealmObjectBaseMarker, Finalizab final handle = realmCore.getBacklinks(this, sourceMeta.classKey, sourceProperty.key); return RealmResultsInternal.create(handle, realm, sourceMeta); } + + /// Returns the schema for this object. + SchemaObject get objectSchema; } /// @nodoc @@ -731,10 +747,16 @@ class RealmObjectNotificationsController extends Noti } /// @nodoc -class _ConcreteRealmObject with RealmEntity, RealmObjectBase, RealmObject {} +class _ConcreteRealmObject with RealmEntity, RealmObjectBase, RealmObject { + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this)!; // _ConcreteRealmObject should only ever be created for managed objects +} /// @nodoc -class _ConcreteEmbeddedObject with RealmEntity, RealmObjectBase, EmbeddedObject {} +class _ConcreteEmbeddedObject with RealmEntity, RealmObjectBase, EmbeddedObject { + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this)!; // _ConcreteEmbeddedObject should only ever be created for managed objects +} // This is necessary whenever we need to pass T? as the type. Type _typeOf() => T; diff --git a/test/backlinks_test.g.dart b/test/backlinks_test.g.dart index d8f144ad3..944c8c554 100644 --- a/test/backlinks_test.g.dart +++ b/test/backlinks_test.g.dart @@ -78,7 +78,7 @@ class Source extends _Source with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Source._); - return const SchemaObject(ObjectType.realmObject, Source, 'Source', [ + return SchemaObject(ObjectType.realmObject, Source, 'Source', [ SchemaProperty('name', RealmPropertyType.string), SchemaProperty('oneTarget', RealmPropertyType.object, mapTo: 'et mål', optional: true, linkTarget: 'Target'), @@ -90,6 +90,9 @@ class Source extends _Source with RealmEntity, RealmObjectBase, RealmObject { linkTarget: 'Target', collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Target extends _Target with RealmEntity, RealmObjectBase, RealmObject { @@ -158,7 +161,7 @@ class Target extends _Target with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Target._); - return const SchemaObject(ObjectType.realmObject, Target, 'Target', [ + return SchemaObject(ObjectType.realmObject, Target, 'Target', [ SchemaProperty('name', RealmPropertyType.string), SchemaProperty('source', RealmPropertyType.object, optional: true, linkTarget: 'Source'), @@ -172,4 +175,7 @@ class Target extends _Target with RealmEntity, RealmObjectBase, RealmObject { linkTarget: 'Source'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } diff --git a/test/dynamic_realm_test.dart b/test/dynamic_realm_test.dart index e35bf8d17..bcd679688 100644 --- a/test/dynamic_realm_test.dart +++ b/test/dynamic_realm_test.dart @@ -18,21 +18,37 @@ // ignore_for_file: avoid_relative_lib_imports +import 'package:collection/collection.dart'; import 'package:test/test.dart' hide test, throws; import 'package:realm_dart/realm.dart'; import 'test.dart'; +part 'dynamic_realm_test.g.dart'; + +@RealmModel() +@MapTo('Task') +class _Taskv2 { + @PrimaryKey() + @MapTo('_id') + late ObjectId id; + + late String description; +} + void main() { setupTests(); - _assertSchemaExists(Realm realm, SchemaObject expected) { - final foundSchema = realm.schema.singleWhere((e) => e.name == expected.name); - expect(foundSchema.properties.length, expected.properties.length); + void assertSchemaMatches(SchemaObject actual, SchemaObject expected) { + expect(actual.name, expected.name); + expect(actual.baseType, expected.baseType); + expect(actual.length, expected.length); - for (final prop in foundSchema.properties) { - final expectedProp = expected.properties.singleWhere((e) => e.mapTo == prop.name); - expect(prop.collectionType, expectedProp.collectionType); + for (final prop in actual) { + final expectedProp = expected.singleWhereOrNull((e) => e.name == prop.name || e.mapTo == prop.name); + expect(expectedProp, isNotNull, + reason: "Expected to find '${prop.name}' in schema '${actual.name}', but couldn't. Properties in schema: ${expected.map((e) => e.name).join(', ')}"); + expect(prop.collectionType, expectedProp!.collectionType); expect(prop.linkTarget, expectedProp.linkTarget); expect(prop.optional, expectedProp.optional); expect(prop.primaryKey, expectedProp.primaryKey); @@ -40,6 +56,11 @@ void main() { } } + void assertSchemaExists(Realm realm, SchemaObject expected) { + final foundSchema = realm.schema.singleWhere((e) => e.name == expected.name); + assertSchemaMatches(foundSchema, expected); + } + test('schema is read from disk', () { final config = Configuration.local([ Car.schema, @@ -54,23 +75,35 @@ void main() { RecursiveEmbedded3.schema ]); - getRealm(config).close(); + final staticRealm = getRealm(config); + + staticRealm.write(() { + staticRealm.add(ObjectWithEmbedded('abc', recursiveObject: RecursiveEmbedded1('embedded'))); + }); + + staticRealm.close(); final dynamicConfig = Configuration.local([]); final realm = getRealm(dynamicConfig); expect(realm.schema.length, 10); - _assertSchemaExists(realm, Car.schema); - _assertSchemaExists(realm, Dog.schema); - _assertSchemaExists(realm, Person.schema); - _assertSchemaExists(realm, AllTypes.schema); - _assertSchemaExists(realm, LinksClass.schema); - _assertSchemaExists(realm, ObjectWithEmbedded.schema); - _assertSchemaExists(realm, AllTypesEmbedded.schema); - _assertSchemaExists(realm, RecursiveEmbedded1.schema); - _assertSchemaExists(realm, RecursiveEmbedded2.schema); - _assertSchemaExists(realm, RecursiveEmbedded3.schema); + assertSchemaExists(realm, Car.schema); + assertSchemaExists(realm, Dog.schema); + assertSchemaExists(realm, Person.schema); + assertSchemaExists(realm, AllTypes.schema); + assertSchemaExists(realm, LinksClass.schema); + assertSchemaExists(realm, ObjectWithEmbedded.schema); + assertSchemaExists(realm, AllTypesEmbedded.schema); + assertSchemaExists(realm, RecursiveEmbedded1.schema); + assertSchemaExists(realm, RecursiveEmbedded2.schema); + assertSchemaExists(realm, RecursiveEmbedded3.schema); + + final obj = realm.dynamic.all(ObjectWithEmbedded.schema.name).single; + assertSchemaMatches(obj.objectSchema, ObjectWithEmbedded.schema); + + final embedded = obj.dynamic.get('recursiveObject')!; + assertSchemaMatches(embedded.objectSchema, RecursiveEmbedded1.schema); }); test('dynamic is always the same', () { @@ -329,6 +362,23 @@ void main() { expect(() => dynamicRealm.dynamic.find('i-dont-exist', 'i-dont-exist'), throws("Object type i-dont-exist not configured in the current Realm's schema")); }); + + test('all returns objects with schema', () { + final config = Configuration.local([Car.schema]); + final staticRealm = getRealm(config); + staticRealm.write(() { + staticRealm.add(Car('Honda')); + staticRealm.add(Car('Toyota')); + }); + + final realm = _getDynamicRealm(staticRealm); + final allCars = realm.dynamic.all(Car.schema.name); + expect(allCars, hasLength(2)); + + for (final car in allCars) { + assertSchemaMatches(car.objectSchema, Car.schema); + } + }); }); group('RealmObject.dynamic.get when isDynamic=$isDynamic', () { @@ -378,6 +428,8 @@ void main() { expect(obj2.dynamic.get('link'), obj1); expect(obj2.dynamic.get('link')?.dynamic.get('id'), uuid1); + assertSchemaMatches(obj2.dynamic.get('link')!.objectSchema, LinksClass.schema); + dynamic dynamicObj1 = obj1; dynamic dynamicObj2 = obj2; @@ -385,6 +437,7 @@ void main() { expect(dynamicObj2.link, obj1); expect(dynamicObj2.link.id, uuid1); + assertSchemaMatches(dynamicObj2.link.objectSchema, LinksClass.schema); }); test('fails with non-existent property', () { @@ -640,4 +693,84 @@ void main() { expect(dynamicObj2.list, [obj1, obj1]); expect(dynamicObj2.list[0].id, uuid1); }); + + test('Realm.schema is updated with a new class', () { + final v1Config = Configuration.local([ + Car.schema, + ]); + + final v1Realm = getRealm(v1Config); + v1Realm.close(); + + final dynamicRealm = getRealm(Configuration.local([])); + + expect(dynamicRealm.schema, hasLength(1)); + assertSchemaExists(dynamicRealm, Car.schema); + + final v2Config = Configuration.local([Car.schema, Person.schema]); + final v2Realm = getRealm(v2Config); + + v2Realm.write(() { + v2Realm.add(Person('Peter')); + }); + + expect(v2Realm.schema, hasLength(2)); + assertSchemaExists(v2Realm, Car.schema); + assertSchemaExists(v2Realm, Person.schema); + + dynamicRealm.refresh(); + expect(dynamicRealm.schema, hasLength(2)); + assertSchemaExists(dynamicRealm, Car.schema); + assertSchemaExists(dynamicRealm, Person.schema); + + final dynamicPeople = dynamicRealm.dynamic.all(Person.schema.name); + expect(dynamicPeople, hasLength(1)); + expect(dynamicPeople.single.dynamic.get('name'), 'Peter'); + + assertSchemaMatches(dynamicPeople.single.objectSchema, Person.schema); + }); + + baasTest('Realm.schema is updated with a new property', (config) async { + // This test validates that adding a property in the schema will update the Realm.schema collection + // It goes through sync, because that's the only way to add a property without triggering a migration. + // It is necessary to immediately stop the sync sessions to make sure those changes don't make it to the + // server, otherwise the schema for all tests will be adjusted, which may pollute the test run. + + final app = App(config); + final user = await getIntegrationUser(app); + + final v1Config = Configuration.flexibleSync(user, [ + Task.schema, + ]); + + final v1Realm = getRealm(v1Config); + v1Realm.syncSession.pause(); + + final v2Config = Configuration.flexibleSync(user, [Taskv2.schema]); + final v2Realm = getRealm(v2Config); + v2Realm.syncSession.pause(); + + v2Realm.subscriptions.update((mutableSubscriptions) { + mutableSubscriptions.add(v2Realm.all()); + }); + + final taskId = ObjectId(); + v2Realm.write(() { + v2Realm.add(Taskv2(taskId, 'lorem ipsum')); + }); + + expect(v2Realm.schema, hasLength(1)); + assertSchemaExists(v2Realm, Taskv2.schema); + + v1Realm.refresh(); + expect(v1Realm.schema, hasLength(1)); + assertSchemaExists(v1Realm, Taskv2.schema); + + final tasks = v1Realm.all(); + expect(tasks, hasLength(1)); + expect(tasks.single.id, taskId); + expect(tasks.single.dynamic.get('description'), 'lorem ipsum'); + + assertSchemaMatches(tasks.single.objectSchema, Taskv2.schema); + }); } diff --git a/test/dynamic_realm_test.g.dart b/test/dynamic_realm_test.g.dart new file mode 100644 index 000000000..aaee9e155 --- /dev/null +++ b/test/dynamic_realm_test.g.dart @@ -0,0 +1,53 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'dynamic_realm_test.dart'; + +// ************************************************************************** +// RealmObjectGenerator +// ************************************************************************** + +// ignore_for_file: type=lint +class Taskv2 extends _Taskv2 with RealmEntity, RealmObjectBase, RealmObject { + Taskv2( + ObjectId id, + String description, + ) { + RealmObjectBase.set(this, '_id', id); + RealmObjectBase.set(this, 'description', description); + } + + Taskv2._(); + + @override + ObjectId get id => RealmObjectBase.get(this, '_id') as ObjectId; + @override + set id(ObjectId value) => RealmObjectBase.set(this, '_id', value); + + @override + String get description => + RealmObjectBase.get(this, 'description') as String; + @override + set description(String value) => + RealmObjectBase.set(this, 'description', value); + + @override + Stream> get changes => + RealmObjectBase.getChanges(this); + + @override + Taskv2 freeze() => RealmObjectBase.freezeObject(this); + + static SchemaObject get schema => _schema ??= _initSchema(); + static SchemaObject? _schema; + static SchemaObject _initSchema() { + RealmObjectBase.registerFactory(Taskv2._); + return SchemaObject(ObjectType.realmObject, Taskv2, 'Task', [ + SchemaProperty('id', RealmPropertyType.objectid, + mapTo: '_id', primaryKey: true), + SchemaProperty('description', RealmPropertyType.string), + ]); + } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; +} diff --git a/test/geospatial_test.g.dart b/test/geospatial_test.g.dart index e2e336e19..d69317daa 100644 --- a/test/geospatial_test.g.dart +++ b/test/geospatial_test.g.dart @@ -48,12 +48,15 @@ class Location extends _Location static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Location._); - return const SchemaObject(ObjectType.embeddedObject, Location, 'Location', [ + return SchemaObject(ObjectType.embeddedObject, Location, 'Location', [ SchemaProperty('type', RealmPropertyType.string), SchemaProperty('coordinates', RealmPropertyType.double, collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Restaurant extends _Restaurant @@ -91,13 +94,15 @@ class Restaurant extends _Restaurant static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Restaurant._); - return const SchemaObject( - ObjectType.realmObject, Restaurant, 'Restaurant', [ + return SchemaObject(ObjectType.realmObject, Restaurant, 'Restaurant', [ SchemaProperty('name', RealmPropertyType.string, primaryKey: true), SchemaProperty('location', RealmPropertyType.object, optional: true, linkTarget: 'Location'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class LocationList extends _LocationList @@ -129,10 +134,12 @@ class LocationList extends _LocationList static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(LocationList._); - return const SchemaObject( - ObjectType.realmObject, LocationList, 'LocationList', [ + return SchemaObject(ObjectType.realmObject, LocationList, 'LocationList', [ SchemaProperty('locations', RealmPropertyType.object, linkTarget: 'Location', collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } diff --git a/test/indexed_test.g.dart b/test/indexed_test.g.dart index 79787b278..221a96e79 100644 --- a/test/indexed_test.g.dart +++ b/test/indexed_test.g.dart @@ -71,8 +71,7 @@ class WithIndexes extends _WithIndexes static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(WithIndexes._); - return const SchemaObject( - ObjectType.realmObject, WithIndexes, 'WithIndexes', [ + return SchemaObject(ObjectType.realmObject, WithIndexes, 'WithIndexes', [ SchemaProperty('anInt', RealmPropertyType.int, indexType: RealmIndexType.regular), SchemaProperty('aBool', RealmPropertyType.bool, @@ -87,6 +86,9 @@ class WithIndexes extends _WithIndexes indexType: RealmIndexType.regular), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class NoIndexes extends _NoIndexes @@ -153,7 +155,7 @@ class NoIndexes extends _NoIndexes static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(NoIndexes._); - return const SchemaObject(ObjectType.realmObject, NoIndexes, 'NoIndexes', [ + return SchemaObject(ObjectType.realmObject, NoIndexes, 'NoIndexes', [ SchemaProperty('anInt', RealmPropertyType.int), SchemaProperty('aBool', RealmPropertyType.bool), SchemaProperty('string', RealmPropertyType.string), @@ -162,6 +164,9 @@ class NoIndexes extends _NoIndexes SchemaProperty('uuid', RealmPropertyType.uuid), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class ObjectWithFTSIndex extends _ObjectWithFTSIndex @@ -207,7 +212,7 @@ class ObjectWithFTSIndex extends _ObjectWithFTSIndex static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(ObjectWithFTSIndex._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, ObjectWithFTSIndex, 'ObjectWithFTSIndex', [ SchemaProperty('title', RealmPropertyType.string), SchemaProperty('summary', RealmPropertyType.string, @@ -216,4 +221,7 @@ class ObjectWithFTSIndex extends _ObjectWithFTSIndex optional: true, indexType: RealmIndexType.fullText), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } diff --git a/test/migration_test.g.dart b/test/migration_test.g.dart index f38fa5703..7e09d4ff5 100644 --- a/test/migration_test.g.dart +++ b/test/migration_test.g.dart @@ -33,10 +33,13 @@ class PersonIntName extends _PersonIntName static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(PersonIntName._); - return const SchemaObject(ObjectType.realmObject, PersonIntName, 'Person', [ + return SchemaObject(ObjectType.realmObject, PersonIntName, 'Person', [ SchemaProperty('name', RealmPropertyType.int), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class StudentV1 extends _StudentV1 @@ -73,11 +76,14 @@ class StudentV1 extends _StudentV1 static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(StudentV1._); - return const SchemaObject(ObjectType.realmObject, StudentV1, 'Student', [ + return SchemaObject(ObjectType.realmObject, StudentV1, 'Student', [ SchemaProperty('name', RealmPropertyType.string, primaryKey: true), SchemaProperty('yearOfBirth', RealmPropertyType.int, optional: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class MyObjectWithTypo extends _MyObjectWithTypo @@ -114,12 +120,14 @@ class MyObjectWithTypo extends _MyObjectWithTypo static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(MyObjectWithTypo._); - return const SchemaObject( - ObjectType.realmObject, MyObjectWithTypo, 'MyObject', [ + return SchemaObject(ObjectType.realmObject, MyObjectWithTypo, 'MyObject', [ SchemaProperty('nmae', RealmPropertyType.string), SchemaProperty('vlaue', RealmPropertyType.int), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class MyObjectWithoutTypo extends _MyObjectWithoutTypo @@ -156,12 +164,15 @@ class MyObjectWithoutTypo extends _MyObjectWithoutTypo static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(MyObjectWithoutTypo._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, MyObjectWithoutTypo, 'MyObject', [ SchemaProperty('name', RealmPropertyType.string), SchemaProperty('value', RealmPropertyType.int), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class MyObjectWithoutValue extends _MyObjectWithoutValue @@ -191,9 +202,12 @@ class MyObjectWithoutValue extends _MyObjectWithoutValue static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(MyObjectWithoutValue._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, MyObjectWithoutValue, 'MyObject', [ SchemaProperty('name', RealmPropertyType.string), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } diff --git a/test/realm_map_test.g.dart b/test/realm_map_test.g.dart index 3acadf1f7..1fe4540fb 100644 --- a/test/realm_map_test.g.dart +++ b/test/realm_map_test.g.dart @@ -39,11 +39,14 @@ class Car extends _Car with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Car._); - return const SchemaObject(ObjectType.realmObject, Car, 'Car', [ + return SchemaObject(ObjectType.realmObject, Car, 'Car', [ SchemaProperty('make', RealmPropertyType.string, primaryKey: true), SchemaProperty('color', RealmPropertyType.string, optional: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class EmbeddedValue extends _EmbeddedValue @@ -72,11 +75,14 @@ class EmbeddedValue extends _EmbeddedValue static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(EmbeddedValue._); - return const SchemaObject( + return SchemaObject( ObjectType.embeddedObject, EmbeddedValue, 'EmbeddedValue', [ SchemaProperty('intValue', RealmPropertyType.int), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class TestRealmMaps extends _TestRealmMaps @@ -321,7 +327,7 @@ class TestRealmMaps extends _TestRealmMaps static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(TestRealmMaps._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, TestRealmMaps, 'TestRealmMaps', [ SchemaProperty('key', RealmPropertyType.int, primaryKey: true), SchemaProperty('boolMap', RealmPropertyType.bool, @@ -372,4 +378,7 @@ class TestRealmMaps extends _TestRealmMaps optional: true, collectionType: RealmCollectionType.map), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } diff --git a/test/realm_object_test.dart b/test/realm_object_test.dart index 06967a64f..2d759ebc7 100644 --- a/test/realm_object_test.dart +++ b/test/realm_object_test.dart @@ -301,7 +301,7 @@ void main() { void testPrimaryKey(SchemaObject schema, T Function() createObject, K? key) { test("$T primary key: $key", () { - final pkProp = schema.properties.where((p) => p.primaryKey).single; + final pkProp = schema.where((p) => p.primaryKey).single; final realm = Realm(Configuration.local([schema])); final obj = realm.write(() { return realm.add(createObject()); diff --git a/test/realm_object_test.g.dart b/test/realm_object_test.g.dart index a49ff88c5..19084a9ff 100644 --- a/test/realm_object_test.g.dart +++ b/test/realm_object_test.g.dart @@ -34,11 +34,14 @@ class ObjectIdPrimaryKey extends _ObjectIdPrimaryKey static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(ObjectIdPrimaryKey._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, ObjectIdPrimaryKey, 'ObjectIdPrimaryKey', [ SchemaProperty('id', RealmPropertyType.objectid, primaryKey: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class NullableObjectIdPrimaryKey extends _NullableObjectIdPrimaryKey @@ -68,12 +71,15 @@ class NullableObjectIdPrimaryKey extends _NullableObjectIdPrimaryKey static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(NullableObjectIdPrimaryKey._); - return const SchemaObject(ObjectType.realmObject, - NullableObjectIdPrimaryKey, 'NullableObjectIdPrimaryKey', [ + return SchemaObject(ObjectType.realmObject, NullableObjectIdPrimaryKey, + 'NullableObjectIdPrimaryKey', [ SchemaProperty('id', RealmPropertyType.objectid, optional: true, primaryKey: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class IntPrimaryKey extends _IntPrimaryKey @@ -102,11 +108,14 @@ class IntPrimaryKey extends _IntPrimaryKey static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(IntPrimaryKey._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, IntPrimaryKey, 'IntPrimaryKey', [ SchemaProperty('id', RealmPropertyType.int, primaryKey: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class NullableIntPrimaryKey extends _NullableIntPrimaryKey @@ -136,12 +145,15 @@ class NullableIntPrimaryKey extends _NullableIntPrimaryKey static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(NullableIntPrimaryKey._); - return const SchemaObject(ObjectType.realmObject, NullableIntPrimaryKey, + return SchemaObject(ObjectType.realmObject, NullableIntPrimaryKey, 'NullableIntPrimaryKey', [ SchemaProperty('id', RealmPropertyType.int, optional: true, primaryKey: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class StringPrimaryKey extends _StringPrimaryKey @@ -171,11 +183,14 @@ class StringPrimaryKey extends _StringPrimaryKey static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(StringPrimaryKey._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, StringPrimaryKey, 'StringPrimaryKey', [ SchemaProperty('id', RealmPropertyType.string, primaryKey: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class NullableStringPrimaryKey extends _NullableStringPrimaryKey @@ -205,12 +220,15 @@ class NullableStringPrimaryKey extends _NullableStringPrimaryKey static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(NullableStringPrimaryKey._); - return const SchemaObject(ObjectType.realmObject, NullableStringPrimaryKey, + return SchemaObject(ObjectType.realmObject, NullableStringPrimaryKey, 'NullableStringPrimaryKey', [ SchemaProperty('id', RealmPropertyType.string, optional: true, primaryKey: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class UuidPrimaryKey extends _UuidPrimaryKey @@ -239,11 +257,14 @@ class UuidPrimaryKey extends _UuidPrimaryKey static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(UuidPrimaryKey._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, UuidPrimaryKey, 'UuidPrimaryKey', [ SchemaProperty('id', RealmPropertyType.uuid, primaryKey: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class NullableUuidPrimaryKey extends _NullableUuidPrimaryKey @@ -273,12 +294,15 @@ class NullableUuidPrimaryKey extends _NullableUuidPrimaryKey static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(NullableUuidPrimaryKey._); - return const SchemaObject(ObjectType.realmObject, NullableUuidPrimaryKey, + return SchemaObject(ObjectType.realmObject, NullableUuidPrimaryKey, 'NullableUuidPrimaryKey', [ SchemaProperty('id', RealmPropertyType.uuid, optional: true, primaryKey: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class RemappedFromAnotherFile extends _RemappedFromAnotherFile @@ -311,7 +335,7 @@ class RemappedFromAnotherFile extends _RemappedFromAnotherFile static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(RemappedFromAnotherFile._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, RemappedFromAnotherFile, 'class with spaces', [ SchemaProperty('linkToAnotherClass', RealmPropertyType.object, mapTo: 'property with spaces', @@ -319,6 +343,9 @@ class RemappedFromAnotherFile extends _RemappedFromAnotherFile linkTarget: 'myRemappedClass'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class BoolValue extends _BoolValue @@ -354,9 +381,12 @@ class BoolValue extends _BoolValue static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(BoolValue._); - return const SchemaObject(ObjectType.realmObject, BoolValue, 'BoolValue', [ + return SchemaObject(ObjectType.realmObject, BoolValue, 'BoolValue', [ SchemaProperty('key', RealmPropertyType.int, primaryKey: true), SchemaProperty('value', RealmPropertyType.bool), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } diff --git a/test/realm_set_test.g.dart b/test/realm_set_test.g.dart index ba17d309c..c7ee23b2c 100644 --- a/test/realm_set_test.g.dart +++ b/test/realm_set_test.g.dart @@ -39,11 +39,14 @@ class Car extends _Car with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Car._); - return const SchemaObject(ObjectType.realmObject, Car, 'Car', [ + return SchemaObject(ObjectType.realmObject, Car, 'Car', [ SchemaProperty('make', RealmPropertyType.string, primaryKey: true), SchemaProperty('color', RealmPropertyType.string, optional: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class TestRealmSets extends _TestRealmSets @@ -255,7 +258,7 @@ class TestRealmSets extends _TestRealmSets static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(TestRealmSets._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, TestRealmSets, 'TestRealmSets', [ SchemaProperty('key', RealmPropertyType.int, primaryKey: true), SchemaProperty('boolSet', RealmPropertyType.bool, @@ -296,4 +299,7 @@ class TestRealmSets extends _TestRealmSets optional: true, collectionType: RealmCollectionType.set), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } diff --git a/test/realm_value_test.g.dart b/test/realm_value_test.g.dart index f5596faae..e7fca202b 100644 --- a/test/realm_value_test.g.dart +++ b/test/realm_value_test.g.dart @@ -40,10 +40,13 @@ class TuckedIn extends _TuckedIn static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(TuckedIn._); - return const SchemaObject(ObjectType.embeddedObject, TuckedIn, 'TuckedIn', [ + return SchemaObject(ObjectType.embeddedObject, TuckedIn, 'TuckedIn', [ SchemaProperty('x', RealmPropertyType.int), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class AnythingGoes extends _AnythingGoes @@ -83,14 +86,16 @@ class AnythingGoes extends _AnythingGoes static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(AnythingGoes._); - return const SchemaObject( - ObjectType.realmObject, AnythingGoes, 'AnythingGoes', [ + return SchemaObject(ObjectType.realmObject, AnythingGoes, 'AnythingGoes', [ SchemaProperty('oneAny', RealmPropertyType.mixed, optional: true, indexType: RealmIndexType.regular), SchemaProperty('manyAny', RealmPropertyType.mixed, optional: true, collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Stuff extends _Stuff with RealmEntity, RealmObjectBase, RealmObject { @@ -125,8 +130,11 @@ class Stuff extends _Stuff with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Stuff._); - return const SchemaObject(ObjectType.realmObject, Stuff, 'Stuff', [ + return SchemaObject(ObjectType.realmObject, Stuff, 'Stuff', [ SchemaProperty('i', RealmPropertyType.int), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } diff --git a/test/test.g.dart b/test/test.g.dart index 616cc5492..b0ea1f7d2 100644 --- a/test/test.g.dart +++ b/test/test.g.dart @@ -32,10 +32,13 @@ class Car extends _Car with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Car._); - return const SchemaObject(ObjectType.realmObject, Car, 'Car', [ + return SchemaObject(ObjectType.realmObject, Car, 'Car', [ SchemaProperty('make', RealmPropertyType.string, primaryKey: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Person extends _Person with RealmEntity, RealmObjectBase, RealmObject { @@ -63,10 +66,13 @@ class Person extends _Person with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Person._); - return const SchemaObject(ObjectType.realmObject, Person, 'Person', [ + return SchemaObject(ObjectType.realmObject, Person, 'Person', [ SchemaProperty('name', RealmPropertyType.string), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Dog extends _Dog with RealmEntity, RealmObjectBase, RealmObject { @@ -109,13 +115,16 @@ class Dog extends _Dog with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Dog._); - return const SchemaObject(ObjectType.realmObject, Dog, 'Dog', [ + return SchemaObject(ObjectType.realmObject, Dog, 'Dog', [ SchemaProperty('name', RealmPropertyType.string, primaryKey: true), SchemaProperty('age', RealmPropertyType.int, optional: true), SchemaProperty('owner', RealmPropertyType.object, optional: true, linkTarget: 'Person'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Team extends _Team with RealmEntity, RealmObjectBase, RealmObject { @@ -162,7 +171,7 @@ class Team extends _Team with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Team._); - return const SchemaObject(ObjectType.realmObject, Team, 'Team', [ + return SchemaObject(ObjectType.realmObject, Team, 'Team', [ SchemaProperty('name', RealmPropertyType.string), SchemaProperty('players', RealmPropertyType.object, linkTarget: 'Person', collectionType: RealmCollectionType.list), @@ -170,6 +179,9 @@ class Team extends _Team with RealmEntity, RealmObjectBase, RealmObject { collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Student extends _Student with RealmEntity, RealmObjectBase, RealmObject { @@ -220,7 +232,7 @@ class Student extends _Student with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Student._); - return const SchemaObject(ObjectType.realmObject, Student, 'Student', [ + return SchemaObject(ObjectType.realmObject, Student, 'Student', [ SchemaProperty('number', RealmPropertyType.int, primaryKey: true), SchemaProperty('name', RealmPropertyType.string, optional: true), SchemaProperty('yearOfBirth', RealmPropertyType.int, optional: true), @@ -228,6 +240,9 @@ class Student extends _Student with RealmEntity, RealmObjectBase, RealmObject { optional: true, linkTarget: 'School'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class School extends _School with RealmEntity, RealmObjectBase, RealmObject { @@ -291,7 +306,7 @@ class School extends _School with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(School._); - return const SchemaObject(ObjectType.realmObject, School, 'School', [ + return SchemaObject(ObjectType.realmObject, School, 'School', [ SchemaProperty('name', RealmPropertyType.string, primaryKey: true), SchemaProperty('city', RealmPropertyType.string, optional: true), SchemaProperty('students', RealmPropertyType.object, @@ -302,6 +317,9 @@ class School extends _School with RealmEntity, RealmObjectBase, RealmObject { linkTarget: 'School', collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class RemappedClass extends $RemappedClass @@ -343,7 +361,7 @@ class RemappedClass extends $RemappedClass static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(RemappedClass._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, RemappedClass, 'myRemappedClass', [ SchemaProperty('remappedProperty', RealmPropertyType.string, mapTo: 'primitive_property'), @@ -353,6 +371,9 @@ class RemappedClass extends $RemappedClass collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Task extends _Task with RealmEntity, RealmObjectBase, RealmObject { @@ -380,11 +401,14 @@ class Task extends _Task with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Task._); - return const SchemaObject(ObjectType.realmObject, Task, 'Task', [ + return SchemaObject(ObjectType.realmObject, Task, 'Task', [ SchemaProperty('id', RealmPropertyType.objectid, mapTo: '_id', primaryKey: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Product extends _Product with RealmEntity, RealmObjectBase, RealmObject { @@ -421,13 +445,16 @@ class Product extends _Product with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Product._); - return const SchemaObject(ObjectType.realmObject, Product, 'Product', [ + return SchemaObject(ObjectType.realmObject, Product, 'Product', [ SchemaProperty('id', RealmPropertyType.objectid, mapTo: '_id', primaryKey: true), SchemaProperty('name', RealmPropertyType.string, mapTo: 'stringQueryField'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Schedule extends _Schedule @@ -465,13 +492,16 @@ class Schedule extends _Schedule static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Schedule._); - return const SchemaObject(ObjectType.realmObject, Schedule, 'Schedule', [ + return SchemaObject(ObjectType.realmObject, Schedule, 'Schedule', [ SchemaProperty('id', RealmPropertyType.objectid, mapTo: '_id', primaryKey: true), SchemaProperty('tasks', RealmPropertyType.object, linkTarget: 'Task', collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Foo extends _Foo with RealmEntity, RealmObjectBase, RealmObject { @@ -521,13 +551,16 @@ class Foo extends _Foo with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Foo._); - return const SchemaObject(ObjectType.realmObject, Foo, 'Foo', [ + return SchemaObject(ObjectType.realmObject, Foo, 'Foo', [ SchemaProperty('requiredBinaryProp', RealmPropertyType.binary), SchemaProperty('defaultValueBinaryProp', RealmPropertyType.binary), SchemaProperty('nullableBinaryProp', RealmPropertyType.binary, optional: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class AllTypes extends _AllTypes @@ -705,7 +738,7 @@ class AllTypes extends _AllTypes static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(AllTypes._); - return const SchemaObject(ObjectType.realmObject, AllTypes, 'AllTypes', [ + return SchemaObject(ObjectType.realmObject, AllTypes, 'AllTypes', [ SchemaProperty('stringProp', RealmPropertyType.string), SchemaProperty('boolProp', RealmPropertyType.bool), SchemaProperty('dateProp', RealmPropertyType.timestamp), @@ -734,6 +767,9 @@ class AllTypes extends _AllTypes optional: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class LinksClass extends _LinksClass @@ -781,8 +817,7 @@ class LinksClass extends _LinksClass static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(LinksClass._); - return const SchemaObject( - ObjectType.realmObject, LinksClass, 'LinksClass', [ + return SchemaObject(ObjectType.realmObject, LinksClass, 'LinksClass', [ SchemaProperty('id', RealmPropertyType.uuid, primaryKey: true), SchemaProperty('link', RealmPropertyType.object, optional: true, linkTarget: 'LinksClass'), @@ -790,6 +825,9 @@ class LinksClass extends _LinksClass linkTarget: 'LinksClass', collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class AllCollections extends _AllCollections @@ -973,7 +1011,7 @@ class AllCollections extends _AllCollections static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(AllCollections._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, AllCollections, 'AllCollections', [ SchemaProperty('strings', RealmPropertyType.string, collectionType: RealmCollectionType.list), @@ -1009,6 +1047,9 @@ class AllCollections extends _AllCollections optional: true, collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class NullableTypes extends _NullableTypes @@ -1111,7 +1152,7 @@ class NullableTypes extends _NullableTypes static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(NullableTypes._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, NullableTypes, 'NullableTypes', [ SchemaProperty('id', RealmPropertyType.objectid, mapTo: '_id', primaryKey: true), @@ -1128,6 +1169,9 @@ class NullableTypes extends _NullableTypes optional: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Event extends _Event with RealmEntity, RealmObjectBase, RealmObject { @@ -1191,7 +1235,7 @@ class Event extends _Event with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Event._); - return const SchemaObject(ObjectType.realmObject, Event, 'Event', [ + return SchemaObject(ObjectType.realmObject, Event, 'Event', [ SchemaProperty('id', RealmPropertyType.objectid, mapTo: '_id', primaryKey: true), SchemaProperty('name', RealmPropertyType.string, @@ -1203,6 +1247,9 @@ class Event extends _Event with RealmEntity, RealmObjectBase, RealmObject { SchemaProperty('assignedTo', RealmPropertyType.string, optional: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Party extends _Party with RealmEntity, RealmObjectBase, RealmObject { @@ -1255,7 +1302,7 @@ class Party extends _Party with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Party._); - return const SchemaObject(ObjectType.realmObject, Party, 'Party', [ + return SchemaObject(ObjectType.realmObject, Party, 'Party', [ SchemaProperty('host', RealmPropertyType.object, optional: true, linkTarget: 'Friend'), SchemaProperty('year', RealmPropertyType.int), @@ -1265,6 +1312,9 @@ class Party extends _Party with RealmEntity, RealmObjectBase, RealmObject { optional: true, linkTarget: 'Party'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Friend extends _Friend with RealmEntity, RealmObjectBase, RealmObject { @@ -1325,7 +1375,7 @@ class Friend extends _Friend with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Friend._); - return const SchemaObject(ObjectType.realmObject, Friend, 'Friend', [ + return SchemaObject(ObjectType.realmObject, Friend, 'Friend', [ SchemaProperty('name', RealmPropertyType.string, primaryKey: true), SchemaProperty('age', RealmPropertyType.int), SchemaProperty('bestFriend', RealmPropertyType.object, @@ -1334,6 +1384,9 @@ class Friend extends _Friend with RealmEntity, RealmObjectBase, RealmObject { linkTarget: 'Friend', collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class When extends _When with RealmEntity, RealmObjectBase, RealmObject { @@ -1372,11 +1425,14 @@ class When extends _When with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(When._); - return const SchemaObject(ObjectType.realmObject, When, 'When', [ + return SchemaObject(ObjectType.realmObject, When, 'When', [ SchemaProperty('dateTimeUtc', RealmPropertyType.timestamp), SchemaProperty('locationName', RealmPropertyType.string), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Player extends _Player with RealmEntity, RealmObjectBase, RealmObject { @@ -1421,7 +1477,7 @@ class Player extends _Player with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Player._); - return const SchemaObject(ObjectType.realmObject, Player, 'Player', [ + return SchemaObject(ObjectType.realmObject, Player, 'Player', [ SchemaProperty('name', RealmPropertyType.string, primaryKey: true), SchemaProperty('game', RealmPropertyType.object, optional: true, linkTarget: 'Game'), @@ -1429,6 +1485,9 @@ class Player extends _Player with RealmEntity, RealmObjectBase, RealmObject { optional: true, collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Game extends _Game with RealmEntity, RealmObjectBase, RealmObject { @@ -1459,11 +1518,14 @@ class Game extends _Game with RealmEntity, RealmObjectBase, RealmObject { static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Game._); - return const SchemaObject(ObjectType.realmObject, Game, 'Game', [ + return SchemaObject(ObjectType.realmObject, Game, 'Game', [ SchemaProperty('winnerByRound', RealmPropertyType.object, linkTarget: 'Player', collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class AllTypesEmbedded extends _AllTypesEmbedded @@ -1701,7 +1763,7 @@ class AllTypesEmbedded extends _AllTypesEmbedded static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(AllTypesEmbedded._); - return const SchemaObject( + return SchemaObject( ObjectType.embeddedObject, AllTypesEmbedded, 'AllTypesEmbedded', [ SchemaProperty('stringProp', RealmPropertyType.string), SchemaProperty('boolProp', RealmPropertyType.bool), @@ -1744,6 +1806,9 @@ class AllTypesEmbedded extends _AllTypesEmbedded collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class ObjectWithEmbedded extends _ObjectWithEmbedded @@ -1824,7 +1889,7 @@ class ObjectWithEmbedded extends _ObjectWithEmbedded static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(ObjectWithEmbedded._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, ObjectWithEmbedded, 'ObjectWithEmbedded', [ SchemaProperty('id', RealmPropertyType.string, mapTo: '_id', primaryKey: true), @@ -1841,6 +1906,9 @@ class ObjectWithEmbedded extends _ObjectWithEmbedded collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class RecursiveEmbedded1 extends _RecursiveEmbedded1 @@ -1901,7 +1969,7 @@ class RecursiveEmbedded1 extends _RecursiveEmbedded1 static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(RecursiveEmbedded1._); - return const SchemaObject( + return SchemaObject( ObjectType.embeddedObject, RecursiveEmbedded1, 'RecursiveEmbedded1', [ SchemaProperty('value', RealmPropertyType.string), SchemaProperty('child', RealmPropertyType.object, @@ -1913,6 +1981,9 @@ class RecursiveEmbedded1 extends _RecursiveEmbedded1 optional: true, linkTarget: 'ObjectWithEmbedded'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class RecursiveEmbedded2 extends _RecursiveEmbedded2 @@ -1973,7 +2044,7 @@ class RecursiveEmbedded2 extends _RecursiveEmbedded2 static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(RecursiveEmbedded2._); - return const SchemaObject( + return SchemaObject( ObjectType.embeddedObject, RecursiveEmbedded2, 'RecursiveEmbedded2', [ SchemaProperty('value', RealmPropertyType.string), SchemaProperty('child', RealmPropertyType.object, @@ -1985,6 +2056,9 @@ class RecursiveEmbedded2 extends _RecursiveEmbedded2 optional: true, linkTarget: 'ObjectWithEmbedded'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class RecursiveEmbedded3 extends _RecursiveEmbedded3 @@ -2014,11 +2088,14 @@ class RecursiveEmbedded3 extends _RecursiveEmbedded3 static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(RecursiveEmbedded3._); - return const SchemaObject( + return SchemaObject( ObjectType.embeddedObject, RecursiveEmbedded3, 'RecursiveEmbedded3', [ SchemaProperty('value', RealmPropertyType.string), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class ObjectWithDecimal extends _ObjectWithDecimal @@ -2058,13 +2135,16 @@ class ObjectWithDecimal extends _ObjectWithDecimal static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(ObjectWithDecimal._); - return const SchemaObject( + return SchemaObject( ObjectType.realmObject, ObjectWithDecimal, 'ObjectWithDecimal', [ SchemaProperty('decimal', RealmPropertyType.decimal128), SchemaProperty('nullableDecimal', RealmPropertyType.decimal128, optional: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Asymmetric extends _Asymmetric @@ -2113,8 +2193,7 @@ class Asymmetric extends _Asymmetric static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Asymmetric._); - return const SchemaObject( - ObjectType.asymmetricObject, Asymmetric, 'Asymmetric', [ + return SchemaObject(ObjectType.asymmetricObject, Asymmetric, 'Asymmetric', [ SchemaProperty('id', RealmPropertyType.objectid, mapTo: '_id', primaryKey: true), SchemaProperty('symmetric', RealmPropertyType.object, @@ -2123,6 +2202,9 @@ class Asymmetric extends _Asymmetric linkTarget: 'Embedded', collectionType: RealmCollectionType.list), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Embedded extends _Embedded @@ -2168,13 +2250,16 @@ class Embedded extends _Embedded static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Embedded._); - return const SchemaObject(ObjectType.embeddedObject, Embedded, 'Embedded', [ + return SchemaObject(ObjectType.embeddedObject, Embedded, 'Embedded', [ SchemaProperty('value', RealmPropertyType.int), SchemaProperty('any', RealmPropertyType.mixed, optional: true), SchemaProperty('symmetric', RealmPropertyType.object, optional: true, linkTarget: 'Symmetric'), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } class Symmetric extends _Symmetric @@ -2203,9 +2288,12 @@ class Symmetric extends _Symmetric static SchemaObject? _schema; static SchemaObject _initSchema() { RealmObjectBase.registerFactory(Symmetric._); - return const SchemaObject(ObjectType.realmObject, Symmetric, 'Symmetric', [ + return SchemaObject(ObjectType.realmObject, Symmetric, 'Symmetric', [ SchemaProperty('id', RealmPropertyType.objectid, mapTo: '_id', primaryKey: true), ]); } + + @override + SchemaObject get objectSchema => RealmObjectBase.getSchema(this) ?? schema; } diff --git a/test/user_test.dart b/test/user_test.dart index 6d6aa4471..e23cc5337 100644 --- a/test/user_test.dart +++ b/test/user_test.dart @@ -17,7 +17,6 @@ //////////////////////////////////////////////////////////////////////////////// import 'dart:isolate'; -import 'dart:math'; import 'package:test/expect.dart' hide throws;