diff --git a/lib/src/models/field.dart b/lib/src/models/field.dart index 2a841de..b8f82e3 100644 --- a/lib/src/models/field.dart +++ b/lib/src/models/field.dart @@ -248,6 +248,7 @@ enum Type { auto, stringify, geopoint, + object, } extension _Type on Type { @@ -259,6 +260,7 @@ extension _Type on Type { case Type.float: case Type.bool: case Type.geopoint: + case Type.object: final description = toString(), indexOfDot = description.indexOf('.'), value = description.substring(indexOfDot + 1); diff --git a/lib/src/models/schema.dart b/lib/src/models/schema.dart index f48fae0..bffe598 100644 --- a/lib/src/models/schema.dart +++ b/lib/src/models/schema.dart @@ -28,11 +28,15 @@ class Schema extends BaseSchema { /// searching. final Field? defaultSortingField; + /// Boolean to enable nested fields on the schema, only available for typesense 0.24 or more + final bool? enableNestedFields; + Schema( this.name, super.fields, { this.defaultSortingField, this.documentCount, + this.enableNestedFields, }); factory Schema.fromMap(Map map) { @@ -54,12 +58,14 @@ class Schema extends BaseSchema { ), ) : null; + final bool? enableNestedFields = map["enable_nested_fields"]; return Schema( map['name'], fields, documentCount: map['num_documents'] ?? 0, defaultSortingField: defaultSortingField, + enableNestedFields: enableNestedFields, ); } @@ -73,6 +79,9 @@ class Schema extends BaseSchema { if (documentCount != null) { map['num_documents'] = documentCount; } + if (enableNestedFields != null) { + map['enable_nested_fields'] = enableNestedFields; + } return map; } } diff --git a/test/models/field_test.dart b/test/models/field_test.dart index 0953d5b..ffe0430 100644 --- a/test/models/field_test.dart +++ b/test/models/field_test.dart @@ -242,6 +242,20 @@ void main() { }); expect(field.type, equals(Type.geopoint)); expect(field.isMultivalued, isTrue); + + field = Field.fromMap({ + "name": "name", + "type": "object", + }); + expect(field.type, equals(Type.object)); + expect(field.isMultivalued, isFalse); + + field = Field.fromMap({ + "name": "name", + "type": "object[]", + }); + expect(field.type, equals(Type.object)); + expect(field.isMultivalued, isTrue); }); test('sets default values to fields when null', () { final field = Field.fromMap({"name": "num_employees", "type": "int32"}); diff --git a/test/models/schema_test.dart b/test/models/schema_test.dart index f9f6f96..947527a 100644 --- a/test/models/schema_test.dart +++ b/test/models/schema_test.dart @@ -15,6 +15,7 @@ void main() { }, defaultSortingField: Field('num_employees'), documentCount: 0, + enableNestedFields: true, ); s2 = Schema.fromMap({ "name": "companies", @@ -25,6 +26,7 @@ void main() { ], "default_sorting_field": "num_employees", "num_documents": 0, + "enable_nested_fields": true, }); }); @@ -54,6 +56,10 @@ void main() { expect(s2.defaultSortingField, equals(Field('num_employees', type: Type.int32))); }); + test('has a enableNestedFields field', () { + expect(s1.enableNestedFields, equals(true)); + expect(s2.enableNestedFields, equals(true)); + }); test('has a toMap method', () { final map = { "name": "companies", @@ -64,6 +70,7 @@ void main() { ], "default_sorting_field": "num_employees", "num_documents": 0, + "enable_nested_fields": true, }; expect(s1.toMap(), equals(map)); @@ -151,6 +158,32 @@ void main() { ), ); }); + test("with null/empty enableNestedFields is successful", () { + var schema = Schema.fromMap({ + "name": "companies", + "fields": [ + {"name": "company_name", "type": "string"}, + {"name": "num_employees", "type": "int32"}, + {"name": "country", "type": "string", "facet": true} + ], + "default_sorting_field": "", + "num_documents": 0, + }); + expect(schema.name, equals('companies')); + expect(schema.enableNestedFields, isNull); + + schema = Schema.fromMap({ + "name": "companies", + "fields": [ + {"name": "company_name", "type": "string"}, + {"name": "num_employees", "type": "int32"}, + {"name": "country", "type": "string", "facet": true} + ], + "num_documents": 0, + }); + expect(schema.name, equals('companies')); + expect(schema.enableNestedFields, isNull); + }); }); group('UpdateSchema', () {