Skip to content

Commit ea80307

Browse files
authored
Update advanced filters (#44)
* refactor: use not nesting instead of negate * refactor: remove not op * refactor: make or a list
1 parent 685931b commit ea80307

4 files changed

Lines changed: 171 additions & 132 deletions

File tree

pkg/eventrepo/event_repo_test.go

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,6 @@ func TestListIndexesAdvanced(t *testing.T) {
547547
Tags: []string{"vehicle", "telemetry", "status"},
548548
}
549549

550-
// Add an event with different tags for testing ArrayFilterOption
551550
eventIdx4 := &cloudevent.CloudEventHeader{
552551
ID: "event-source3-producer4",
553552
Subject: subject1,
@@ -577,10 +576,10 @@ func TestListIndexesAdvanced(t *testing.T) {
577576
name: "filter by single type status events",
578577
advancedOpts: &grpc.AdvancedSearchOptions{
579578
Subject: &grpc.StringFilterOption{
580-
HasAny: []string{subject1},
579+
In: []string{subject1},
581580
},
582581
Type: &grpc.StringFilterOption{
583-
HasAny: []string{cloudevent.TypeStatus},
582+
In: []string{cloudevent.TypeStatus},
584583
},
585584
},
586585
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
@@ -589,10 +588,10 @@ func TestListIndexesAdvanced(t *testing.T) {
589588
name: "filter by multiple types with OR logic",
590589
advancedOpts: &grpc.AdvancedSearchOptions{
591590
Subject: &grpc.StringFilterOption{
592-
HasAny: []string{subject1},
591+
In: []string{subject1},
593592
},
594593
Type: &grpc.StringFilterOption{
595-
HasAny: []string{cloudevent.TypeStatus, cloudevent.TypeFingerprint},
594+
In: []string{cloudevent.TypeStatus, cloudevent.TypeFingerprint},
596595
},
597596
},
598597
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeStatusSource1Producer3, keyTypeFingerprintSource2Producer2, keyTypeStatusSource1Producer1},
@@ -601,11 +600,10 @@ func TestListIndexesAdvanced(t *testing.T) {
601600
name: "filter by type with negation",
602601
advancedOpts: &grpc.AdvancedSearchOptions{
603602
Subject: &grpc.StringFilterOption{
604-
HasAny: []string{subject1},
603+
In: []string{subject1},
605604
},
606605
Type: &grpc.StringFilterOption{
607-
HasAny: []string{cloudevent.TypeFingerprint},
608-
Negate: true,
606+
NotIn: []string{cloudevent.TypeFingerprint},
609607
},
610608
},
611609
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
@@ -614,10 +612,10 @@ func TestListIndexesAdvanced(t *testing.T) {
614612
name: "filter by source: multiple results",
615613
advancedOpts: &grpc.AdvancedSearchOptions{
616614
Subject: &grpc.StringFilterOption{
617-
HasAny: []string{subject1},
615+
In: []string{subject1},
618616
},
619617
Source: &grpc.StringFilterOption{
620-
HasAny: []string{"source-1"},
618+
In: []string{"source-1"},
621619
},
622620
},
623621
expectedIndexKeys: []string{keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
@@ -626,13 +624,13 @@ func TestListIndexesAdvanced(t *testing.T) {
626624
name: "combine multiple filters (AND logic)",
627625
advancedOpts: &grpc.AdvancedSearchOptions{
628626
Subject: &grpc.StringFilterOption{
629-
HasAny: []string{subject1},
627+
In: []string{subject1},
630628
},
631629
Type: &grpc.StringFilterOption{
632-
HasAny: []string{cloudevent.TypeStatus},
630+
In: []string{cloudevent.TypeStatus},
633631
},
634632
Source: &grpc.StringFilterOption{
635-
HasAny: []string{"source-1"},
633+
In: []string{"source-1"},
636634
},
637635
},
638636
expectedIndexKeys: []string{keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
@@ -641,13 +639,12 @@ func TestListIndexesAdvanced(t *testing.T) {
641639
name: "OR logic within StringFilterOption",
642640
advancedOpts: &grpc.AdvancedSearchOptions{
643641
Subject: &grpc.StringFilterOption{
644-
HasAny: []string{subject1},
642+
In: []string{subject1},
645643
},
646644
Type: &grpc.StringFilterOption{
647-
HasAny: []string{cloudevent.TypeAttestation},
648-
Or: &grpc.StringFilterOption{
649-
HasAny: []string{cloudevent.TypeStatus},
650-
Negate: true,
645+
In: []string{cloudevent.TypeAttestation},
646+
Or: []*grpc.StringFilterOption{
647+
{NotIn: []string{cloudevent.TypeStatus}},
651648
},
652649
},
653650
},
@@ -657,10 +654,10 @@ func TestListIndexesAdvanced(t *testing.T) {
657654
name: "no matching records",
658655
advancedOpts: &grpc.AdvancedSearchOptions{
659656
Subject: &grpc.StringFilterOption{
660-
HasAny: []string{subject1},
657+
In: []string{subject1},
661658
},
662659
Type: &grpc.StringFilterOption{
663-
HasAny: []string{"non-existent-type"},
660+
In: []string{"non-existent-type"},
664661
},
665662
},
666663
expectedIndexKeys: []string{},
@@ -670,10 +667,10 @@ func TestListIndexesAdvanced(t *testing.T) {
670667
name: "filter by tags: has any (telemetry)",
671668
advancedOpts: &grpc.AdvancedSearchOptions{
672669
Subject: &grpc.StringFilterOption{
673-
HasAny: []string{subject1},
670+
In: []string{subject1},
674671
},
675672
Tags: &grpc.ArrayFilterOption{
676-
HasAny: []string{"telemetry"},
673+
ContainsAny: []string{"telemetry"},
677674
},
678675
},
679676
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeStatusSource1Producer3},
@@ -682,10 +679,10 @@ func TestListIndexesAdvanced(t *testing.T) {
682679
name: "filter by tags: has all (vehicle AND status)",
683680
advancedOpts: &grpc.AdvancedSearchOptions{
684681
Subject: &grpc.StringFilterOption{
685-
HasAny: []string{subject1},
682+
In: []string{subject1},
686683
},
687684
Tags: &grpc.ArrayFilterOption{
688-
HasAll: []string{"vehicle", "status"},
685+
ContainsAll: []string{"vehicle", "status"},
689686
},
690687
},
691688
expectedIndexKeys: []string{keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
@@ -694,23 +691,25 @@ func TestListIndexesAdvanced(t *testing.T) {
694691
name: "filter by tags: has any with multiple values",
695692
advancedOpts: &grpc.AdvancedSearchOptions{
696693
Subject: &grpc.StringFilterOption{
697-
HasAny: []string{subject1},
694+
In: []string{subject1},
698695
},
699696
Tags: &grpc.ArrayFilterOption{
700-
HasAny: []string{"security", "realtime"},
697+
ContainsAny: []string{"security", "realtime"},
698+
Or: []*grpc.ArrayFilterOption{
699+
{ContainsAll: []string{"vehicle", "status"}},
700+
},
701701
},
702702
},
703-
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeFingerprintSource2Producer2},
703+
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeStatusSource1Producer3, keyTypeFingerprintSource2Producer2, keyTypeStatusSource1Producer1},
704704
},
705705
{
706706
name: "filter by tags: negated has_any",
707707
advancedOpts: &grpc.AdvancedSearchOptions{
708708
Subject: &grpc.StringFilterOption{
709-
HasAny: []string{subject1},
709+
In: []string{subject1},
710710
},
711711
Tags: &grpc.ArrayFilterOption{
712-
HasAny: []string{"vehicle"},
713-
Negate: true,
712+
NotContainsAny: []string{"vehicle"},
714713
},
715714
},
716715
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeFingerprintSource2Producer2},
@@ -719,12 +718,12 @@ func TestListIndexesAdvanced(t *testing.T) {
719718
name: "complex tags filter: has_any OR has_all combination",
720719
advancedOpts: &grpc.AdvancedSearchOptions{
721720
Subject: &grpc.StringFilterOption{
722-
HasAny: []string{subject1},
721+
In: []string{subject1},
723722
},
724723
Tags: &grpc.ArrayFilterOption{
725-
HasAny: []string{"fingerprint"},
726-
Or: &grpc.ArrayFilterOption{
727-
HasAll: []string{"telemetry", "realtime"},
724+
ContainsAny: []string{"fingerprint"},
725+
Or: []*grpc.ArrayFilterOption{
726+
{ContainsAll: []string{"telemetry", "realtime"}},
728727
},
729728
},
730729
},
@@ -734,12 +733,12 @@ func TestListIndexesAdvanced(t *testing.T) {
734733
name: "complex tags filter: has_all with OR chain",
735734
advancedOpts: &grpc.AdvancedSearchOptions{
736735
Subject: &grpc.StringFilterOption{
737-
HasAny: []string{subject1},
736+
In: []string{subject1},
738737
},
739738
Tags: &grpc.ArrayFilterOption{
740-
HasAll: []string{"vehicle", "telemetry"},
741-
Or: &grpc.ArrayFilterOption{
742-
HasAny: []string{"security"},
739+
ContainsAll: []string{"vehicle", "telemetry"},
740+
Or: []*grpc.ArrayFilterOption{
741+
{ContainsAny: []string{"security"}},
743742
},
744743
},
745744
},
@@ -749,23 +748,37 @@ func TestListIndexesAdvanced(t *testing.T) {
749748
name: "complex negated tags with multiple conditions",
750749
advancedOpts: &grpc.AdvancedSearchOptions{
751750
Subject: &grpc.StringFilterOption{
752-
HasAny: []string{subject1},
751+
In: []string{subject1},
753752
},
754753
Tags: &grpc.ArrayFilterOption{
755-
HasAny: []string{"fingerprint", "telemetry"},
756-
Negate: true, // Does NOT have fingerprint or telemetry
757-
Or: &grpc.ArrayFilterOption{
758-
HasAll: []string{"telemetry", "status"},
754+
NotContainsAny: []string{"fingerprint", "telemetry"},
755+
Or: []*grpc.ArrayFilterOption{
756+
{ContainsAll: []string{"telemetry", "status"}},
759757
},
760758
},
761759
},
762760
expectedIndexKeys: []string{keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
763761
},
762+
{
763+
name: "complex negated tags with or override",
764+
advancedOpts: &grpc.AdvancedSearchOptions{
765+
Subject: &grpc.StringFilterOption{
766+
In: []string{subject1},
767+
},
768+
Tags: &grpc.ArrayFilterOption{
769+
ContainsAll: []string{"vehicle", "telemetry"},
770+
NotContainsAny: []string{"fingerprint", "telemetry", "security"},
771+
Or: []*grpc.ArrayFilterOption{
772+
{ContainsAll: []string{"telemetry", "status"}},
773+
},
774+
},
775+
},
776+
expectedIndexKeys: []string{keyTypeStatusSource1Producer3},
777+
},
764778
}
765779

766780
for _, tt := range tests {
767781
t.Run(tt.name, func(t *testing.T) {
768-
t.Parallel()
769782
results, err := indexService.ListIndexesAdvanced(t.Context(), 10, tt.advancedOpts)
770783
if tt.expectedError {
771784
require.Error(t, err, "Expected error but got none")

0 commit comments

Comments
 (0)