diff --git a/example/main.dart b/example/main.dart index fbfe4dc..59a63a2 100644 --- a/example/main.dart +++ b/example/main.dart @@ -64,13 +64,13 @@ Future main() async { // stream final streamSubscription = client .from('countries') - .stream('id') + .stream(['id']) .order('name') .limit(10) .execute() .listen((snapshot) { - print('snapshot: $snapshot'); - }); + print('snapshot: $snapshot'); + }); // remember to remove subscription streamSubscription.cancel(); diff --git a/lib/src/supabase_query_builder.dart b/lib/src/supabase_query_builder.dart index 4e9a725..1254935 100644 --- a/lib/src/supabase_query_builder.dart +++ b/lib/src/supabase_query_builder.dart @@ -41,6 +41,8 @@ class SupabaseQueryBuilder extends PostgrestQueryBuilder { /// Notifies of data at the queried table /// + /// [uniqueColumns] can be either the primary key or a combination of unique columns. + /// /// ```dart /// supabase.from('chats').stream('my_primary_key').execute().listen(_onChatsReceived); /// ``` @@ -50,11 +52,11 @@ class SupabaseQueryBuilder extends PostgrestQueryBuilder { /// ```dart /// supabase.from('chats:room_id=eq.123').stream('my_primary_key').order('created_at').limit(20).execute().listen(_onChatsReceived); /// ``` - SupabaseStreamBuilder stream(String primaryKey) { + SupabaseStreamBuilder stream(List uniqueColumns) { return SupabaseStreamBuilder( this, streamFilter: _streamFilter, - primaryKey: primaryKey, + uniqueColumns: uniqueColumns, ); } } diff --git a/lib/src/supabase_stream_builder.dart b/lib/src/supabase_stream_builder.dart index 86c0b92..741d0b3 100644 --- a/lib/src/supabase_stream_builder.dart +++ b/lib/src/supabase_stream_builder.dart @@ -41,15 +41,15 @@ class SupabaseStreamBuilder { late final StreamPostgrestFilter? _streamFilter; /// Used to identify which row has changed - final String _primaryKey; + final List _uniqueColumns; SupabaseStreamBuilder( SupabaseQueryBuilder queryBuilder, { required StreamPostgrestFilter? streamFilter, - required String primaryKey, + required List uniqueColumns, }) : _queryBuilder = queryBuilder, _streamFilter = streamFilter, - _primaryKey = primaryKey; + _uniqueColumns = uniqueColumns; /// Which column to order by and whether it's ascending _Order? _orderBy; @@ -72,7 +72,7 @@ class SupabaseStreamBuilder { /// Limits the result with the specified `count`. /// /// ```dart - /// supabase.from('users').stream('id).limit(10); + /// supabase.from('users').stream('id').limit(10); /// ``` SupabaseStreamBuilder limit(int count) { _limit = count; @@ -160,8 +160,8 @@ class SupabaseStreamBuilder { } else if (payload.eventType == 'DELETE') { targetRecord = payload.oldRecord!; } - - return record[_primaryKey] == targetRecord[_primaryKey]; + return _uniqueColumns + .every((column) => record[column] == targetRecord[column]); } void _sortData() { diff --git a/test/mock_test.dart b/test/mock_test.dart index df67a55..975fba1 100644 --- a/test/mock_test.dart +++ b/test/mock_test.dart @@ -136,7 +136,7 @@ void main() { }); test('stream() emits data', () { - final stream = client.from('todos').stream('id').execute(); + final stream = client.from('todos').stream(['id']).execute(); expect( stream, emitsInOrder([ @@ -154,7 +154,7 @@ void main() { }); test('Can filter stream results with eq', () { - final stream = client.from('todos:status=eq.true').stream('id').execute(); + final stream = client.from('todos:status=eq.true').stream(['id']).execute(); expect( stream, emitsInOrder([ @@ -170,7 +170,7 @@ void main() { }); test('stream() with order', () { - final stream = client.from('todos').stream('id').order('id').execute(); + final stream = client.from('todos').stream(['id']).order('id').execute(); expect( stream, emitsInOrder([ @@ -189,7 +189,7 @@ void main() { test('stream() with limit', () { final stream = - client.from('todos').stream('id').order('id').limit(2).execute(); + client.from('todos').stream(['id']).order('id').limit(2).execute(); expect( stream, emitsInOrder([