From 751b61e9120116d3c2084db1497ee8ddad88e0f6 Mon Sep 17 00:00:00 2001 From: Paul OGGERO Date: Thu, 21 Mar 2024 15:01:27 +0700 Subject: [PATCH 1/6] feat(nested-field): add schema option for nested fields" --- lib/src/models/schema.dart | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/lib/src/models/schema.dart b/lib/src/models/schema.dart index f48fae0..1199226 100644 --- a/lib/src/models/schema.dart +++ b/lib/src/models/schema.dart @@ -28,12 +28,11 @@ class Schema extends BaseSchema { /// searching. final Field? defaultSortingField; - Schema( - this.name, - super.fields, { - this.defaultSortingField, - this.documentCount, - }); + /// 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) { if ((map['name'] as String).isEmpty) { @@ -54,13 +53,12 @@ class Schema extends BaseSchema { ), ) : null; + final bool? enableNestedFields = map["enable_nested_fields"]; - return Schema( - map['name'], - fields, - documentCount: map['num_documents'] ?? 0, - defaultSortingField: defaultSortingField, - ); + return Schema(map['name'], fields, + documentCount: map['num_documents'] ?? 0, + defaultSortingField: defaultSortingField, + enableNestedFields: enableNestedFields); } @override @@ -73,6 +71,9 @@ class Schema extends BaseSchema { if (documentCount != null) { map['num_documents'] = documentCount; } + if (enableNestedFields != null) { + map['enable_nested_fields'] = enableNestedFields; + } return map; } } From 55a3bafef12e43a4100ac7316d516eacc2eca5d2 Mon Sep 17 00:00:00 2001 From: Paul OGGERO Date: Thu, 21 Mar 2024 15:02:27 +0700 Subject: [PATCH 2/6] feat(nested-fields): add object type for fields" --- lib/src/models/field.dart | 2 ++ 1 file changed, 2 insertions(+) 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); From e80ab720f254419217e5e56c2abb1de452eb1fa5 Mon Sep 17 00:00:00 2001 From: Paul OGGERO Date: Thu, 21 Mar 2024 15:09:39 +0700 Subject: [PATCH 3/6] test(field): Add test for new type object --- test/models/field_test.dart | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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"}); From f61ea2865e467cca169e4595b976c5fbaf3d12fd Mon Sep 17 00:00:00 2001 From: Paul OGGERO Date: Thu, 21 Mar 2024 15:13:50 +0700 Subject: [PATCH 4/6] test(schema): add tests for enableNestedFields property --- test/models/schema_test.dart | 50 +++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/test/models/schema_test.dart b/test/models/schema_test.dart index f9f6f96..3267bca 100644 --- a/test/models/schema_test.dart +++ b/test/models/schema_test.dart @@ -7,15 +7,15 @@ void main() { setUp(() { s1 = Schema( - 'companies', - { - Field('company_name', type: Type.string), - Field('num_employees', type: Type.int32), - Field('country', type: Type.string, isFacetable: true), - }, - defaultSortingField: Field('num_employees'), - documentCount: 0, - ); + 'companies', + { + Field('company_name', type: Type.string), + Field('num_employees', type: Type.int32), + Field('country', type: Type.string, isFacetable: true), + }, + defaultSortingField: Field('num_employees'), + documentCount: 0, + enableNestedFields: true); s2 = Schema.fromMap({ "name": "companies", "fields": [ @@ -25,6 +25,7 @@ void main() { ], "default_sorting_field": "num_employees", "num_documents": 0, + "enable_nested_fields": true, }); }); @@ -54,6 +55,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 +69,7 @@ void main() { ], "default_sorting_field": "num_employees", "num_documents": 0, + "enable_nested_fields": true, }; expect(s1.toMap(), equals(map)); @@ -151,6 +157,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', () { From 807d0fecb2db270f5b05892ffa89652ce0a4ca2b Mon Sep 17 00:00:00 2001 From: Paul OGGERO Date: Fri, 22 Mar 2024 13:51:56 +0700 Subject: [PATCH 5/6] syntax(schema): Add comma after parameter for easier update --- lib/src/models/schema.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/src/models/schema.dart b/lib/src/models/schema.dart index 1199226..763de3e 100644 --- a/lib/src/models/schema.dart +++ b/lib/src/models/schema.dart @@ -31,8 +31,13 @@ class Schema extends BaseSchema { /// 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}); + Schema( + this.name, + super.fields, { + this.defaultSortingField, + this.documentCount, + this.enableNestedFields, + }); factory Schema.fromMap(Map map) { if ((map['name'] as String).isEmpty) { From 7a7a7bd8b1d8fc74ee4197cc0e122e17ba4b182f Mon Sep 17 00:00:00 2001 From: Paul OGGERO Date: Fri, 22 Mar 2024 14:02:37 +0700 Subject: [PATCH 6/6] syntax(comma): add comma after parameter/constructor --- lib/src/models/schema.dart | 11 +++++++---- test/models/schema_test.dart | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/lib/src/models/schema.dart b/lib/src/models/schema.dart index 763de3e..bffe598 100644 --- a/lib/src/models/schema.dart +++ b/lib/src/models/schema.dart @@ -60,10 +60,13 @@ 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); + return Schema( + map['name'], + fields, + documentCount: map['num_documents'] ?? 0, + defaultSortingField: defaultSortingField, + enableNestedFields: enableNestedFields, + ); } @override diff --git a/test/models/schema_test.dart b/test/models/schema_test.dart index 3267bca..947527a 100644 --- a/test/models/schema_test.dart +++ b/test/models/schema_test.dart @@ -7,15 +7,16 @@ void main() { setUp(() { s1 = Schema( - 'companies', - { - Field('company_name', type: Type.string), - Field('num_employees', type: Type.int32), - Field('country', type: Type.string, isFacetable: true), - }, - defaultSortingField: Field('num_employees'), - documentCount: 0, - enableNestedFields: true); + 'companies', + { + Field('company_name', type: Type.string), + Field('num_employees', type: Type.int32), + Field('country', type: Type.string, isFacetable: true), + }, + defaultSortingField: Field('num_employees'), + documentCount: 0, + enableNestedFields: true, + ); s2 = Schema.fromMap({ "name": "companies", "fields": [