Skip to content

Commit b3bd6f6

Browse files
authored
Merge pull request #8 from cmoscosoz/main
Add support to datetime on gt. gte. lt. lte. filter
2 parents 6568bff + 809f340 commit b3bd6f6

File tree

2 files changed

+162
-4
lines changed

2 files changed

+162
-4
lines changed

lib/src/mock_supabase_http_client.dart

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -543,16 +543,68 @@ class MockSupabaseHttpClient extends BaseClient {
543543
return (row) => row[columnName].toString() != value;
544544
} else if (postrestFilter.startsWith('gt.')) {
545545
final value = postrestFilter.substring(3);
546-
return (row) => row[columnName] > num.tryParse(value);
546+
547+
if (DateTime.tryParse(value) != null) {
548+
final dateTime = DateTime.parse(value);
549+
550+
return (row) {
551+
final rowDate = DateTime.tryParse(row[columnName].toString());
552+
return rowDate != null && rowDate.isAfter(dateTime);
553+
};
554+
} else if (num.tryParse(value) != null) {
555+
return (row) => row[columnName] > num.tryParse(value);
556+
} else {
557+
throw UnimplementedError('Unsupported value type');
558+
}
547559
} else if (postrestFilter.startsWith('lt.')) {
548560
final value = postrestFilter.substring(3);
549-
return (row) => row[columnName] < num.tryParse(value);
561+
562+
if (DateTime.tryParse(value) != null) {
563+
final dateTime = DateTime.parse(value);
564+
565+
return (row) {
566+
final rowDate = DateTime.tryParse(row[columnName].toString());
567+
return rowDate != null && rowDate.isBefore(dateTime);
568+
};
569+
} else if (num.tryParse(value) != null) {
570+
return (row) => row[columnName] < num.tryParse(value);
571+
} else {
572+
throw UnimplementedError('Unsupported value type');
573+
}
550574
} else if (postrestFilter.startsWith('gte.')) {
551575
final value = postrestFilter.substring(4);
552-
return (row) => row[columnName] >= num.tryParse(value);
576+
577+
if (DateTime.tryParse(value) != null) {
578+
final dateTime = DateTime.parse(value);
579+
580+
return (row) {
581+
final rowDate = DateTime.tryParse(row[columnName].toString());
582+
if (rowDate == null) return false;
583+
return rowDate.isAtSameMomentAs(dateTime) ||
584+
rowDate.isAfter(dateTime);
585+
};
586+
} else if (num.tryParse(value) != null) {
587+
return (row) => row[columnName] >= num.tryParse(value);
588+
} else {
589+
throw UnimplementedError('Unsupported value type');
590+
}
553591
} else if (postrestFilter.startsWith('lte.')) {
554592
final value = postrestFilter.substring(4);
555-
return (row) => row[columnName] <= num.tryParse(value);
593+
594+
if (DateTime.tryParse(value) != null) {
595+
final dateTime = DateTime.parse(value);
596+
597+
return (row) {
598+
final rowDate = DateTime.tryParse(row[columnName].toString());
599+
if (rowDate == null) return false;
600+
return rowDate.isAtSameMomentAs(dateTime) ||
601+
rowDate.isBefore(dateTime);
602+
};
603+
} else if (num.tryParse(value) != null) {
604+
return (row) => row[columnName] <= num.tryParse(value);
605+
} else {
606+
throw UnimplementedError('Unsupported value type');
607+
}
556608
} else if (postrestFilter.startsWith('like.')) {
557609
final value = postrestFilter.substring(5);
558610
final regex = RegExp(value.replaceAll('%', '.*'));

test/mock_supabase_test.dart

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,112 @@ void main() {
691691
expect(count, 2);
692692
});
693693

694+
test('count with gt filter with datetime format', () async {
695+
await mockSupabase.from('data').insert([
696+
{
697+
'title': 'First post',
698+
'author_id': 1,
699+
'createdAt': '2021-08-01 11:26:15.307+00'
700+
},
701+
{
702+
'title': 'Second post',
703+
'author_id': 2,
704+
'createdAt': '2021-08-02 11:26:15.307+00'
705+
},
706+
{
707+
'title': 'Third post',
708+
'author_id': 1,
709+
'createdAt': '2021-08-03 11:26:15.307+00'
710+
}
711+
]);
712+
final count = await mockSupabase
713+
.from('data')
714+
.count()
715+
.gt('createdAt', '2021-08-02 10:26:15.307+00');
716+
717+
expect(count, 2);
718+
});
719+
720+
test('count with gte. filter with datetime format', () async {
721+
await mockSupabase.from('data').insert([
722+
{
723+
'title': 'First post',
724+
'author_id': 1,
725+
'createdAt': '2021-08-01 11:26:15.307+00'
726+
},
727+
{
728+
'title': 'Second post',
729+
'author_id': 2,
730+
'createdAt': '2021-08-02 11:26:15.307+00'
731+
},
732+
{
733+
'title': 'Third post',
734+
'author_id': 1,
735+
'createdAt': '2021-08-03 11:26:15.307+00'
736+
}
737+
]);
738+
739+
final count = await mockSupabase
740+
.from('data')
741+
.count()
742+
.gte('createdAt', '2021-08-02 11:26:15.307+00');
743+
744+
expect(count, 2);
745+
});
746+
747+
test('count with lt filter with datetime format', () async {
748+
await mockSupabase.from('data').insert([
749+
{
750+
'title': 'First post',
751+
'author_id': 1,
752+
'createdAt': '2021-08-01 11:26:15.307+00'
753+
},
754+
{
755+
'title': 'Second post',
756+
'author_id': 2,
757+
'createdAt': '2021-08-02 11:26:15.307+00'
758+
},
759+
{
760+
'title': 'Third post',
761+
'author_id': 1,
762+
'createdAt': '2021-08-03 11:26:15.307+00'
763+
}
764+
]);
765+
final count = await mockSupabase
766+
.from('data')
767+
.count()
768+
.lt('createdAt', '2021-08-02 12:26:15.307+00');
769+
770+
expect(count, 2);
771+
});
772+
773+
test('count with lte. filter with datetime format', () async {
774+
await mockSupabase.from('data').insert([
775+
{
776+
'title': 'First post',
777+
'author_id': 1,
778+
'createdAt': '2021-08-01 11:26:15.307+00'
779+
},
780+
{
781+
'title': 'Second post',
782+
'author_id': 2,
783+
'createdAt': '2021-08-02 11:26:15.307+00'
784+
},
785+
{
786+
'title': 'Third post',
787+
'author_id': 1,
788+
'createdAt': '2021-08-03 11:26:15.307+00'
789+
}
790+
]);
791+
792+
final count = await mockSupabase
793+
.from('data')
794+
.count()
795+
.lte('createdAt', '2021-08-02 11:26:15.307+00');
796+
797+
expect(count, 2);
798+
});
799+
694800
test('count with data and filter', () async {
695801
await mockSupabase.from('posts').insert([
696802
{'title': 'First post', 'author_id': 1},

0 commit comments

Comments
 (0)