Skip to content

Commit 3a566ff

Browse files
joelanfordvincepri
authored andcommitted
pkg/predicate.go: add And and Or predicates
1 parent 3a692eb commit 3a566ff

File tree

2 files changed

+145
-0
lines changed

2 files changed

+145
-0
lines changed

pkg/predicate/predicate.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ type Predicate interface {
4141
var _ Predicate = Funcs{}
4242
var _ Predicate = ResourceVersionChangedPredicate{}
4343
var _ Predicate = GenerationChangedPredicate{}
44+
var _ Predicate = or{}
45+
var _ Predicate = and{}
4446

4547
// Funcs is a function that implements Predicate.
4648
type Funcs struct {
@@ -155,3 +157,93 @@ func (GenerationChangedPredicate) Update(e event.UpdateEvent) bool {
155157
}
156158
return e.MetaNew.GetGeneration() != e.MetaOld.GetGeneration()
157159
}
160+
161+
// And returns a composite predicate that implements a logical AND of the predicates passed to it.
162+
func And(predicates ...Predicate) Predicate {
163+
return and{predicates}
164+
}
165+
166+
type and struct {
167+
predicates []Predicate
168+
}
169+
170+
func (a and) Create(e event.CreateEvent) bool {
171+
for _, p := range a.predicates {
172+
if !p.Create(e) {
173+
return false
174+
}
175+
}
176+
return true
177+
}
178+
179+
func (a and) Update(e event.UpdateEvent) bool {
180+
for _, p := range a.predicates {
181+
if !p.Update(e) {
182+
return false
183+
}
184+
}
185+
return true
186+
}
187+
188+
func (a and) Delete(e event.DeleteEvent) bool {
189+
for _, p := range a.predicates {
190+
if !p.Delete(e) {
191+
return false
192+
}
193+
}
194+
return true
195+
}
196+
197+
func (a and) Generic(e event.GenericEvent) bool {
198+
for _, p := range a.predicates {
199+
if !p.Generic(e) {
200+
return false
201+
}
202+
}
203+
return true
204+
}
205+
206+
// Or returns a composite predicate that implements a logical OR of the predicates passed to it.
207+
func Or(predicates ...Predicate) Predicate {
208+
return or{predicates}
209+
}
210+
211+
type or struct {
212+
predicates []Predicate
213+
}
214+
215+
func (o or) Create(e event.CreateEvent) bool {
216+
for _, p := range o.predicates {
217+
if p.Create(e) {
218+
return true
219+
}
220+
}
221+
return false
222+
}
223+
224+
func (o or) Update(e event.UpdateEvent) bool {
225+
for _, p := range o.predicates {
226+
if p.Update(e) {
227+
return true
228+
}
229+
}
230+
return false
231+
}
232+
233+
func (o or) Delete(e event.DeleteEvent) bool {
234+
for _, p := range o.predicates {
235+
if p.Delete(e) {
236+
return true
237+
}
238+
}
239+
return false
240+
}
241+
242+
func (o or) Generic(e event.GenericEvent) bool {
243+
for _, p := range o.predicates {
244+
if p.Generic(e) {
245+
return true
246+
}
247+
}
248+
return false
249+
}

pkg/predicate/predicate_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,4 +438,57 @@ var _ = Describe("Predicate", func() {
438438
})
439439

440440
})
441+
442+
Context("With a boolean predicate", func() {
443+
funcs := func(pass bool) predicate.Funcs {
444+
return predicate.Funcs{
445+
CreateFunc: func(event.CreateEvent) bool {
446+
return pass
447+
},
448+
DeleteFunc: func(event.DeleteEvent) bool {
449+
return pass
450+
},
451+
UpdateFunc: func(event.UpdateEvent) bool {
452+
return pass
453+
},
454+
GenericFunc: func(event.GenericEvent) bool {
455+
return pass
456+
},
457+
}
458+
}
459+
passFuncs := funcs(true)
460+
failFuncs := funcs(false)
461+
Describe("When checking an And predicate", func() {
462+
It("should return false when one of its predicates returns false", func() {
463+
a := predicate.And(passFuncs, failFuncs)
464+
Expect(a.Create(event.CreateEvent{})).To(BeFalse())
465+
Expect(a.Update(event.UpdateEvent{})).To(BeFalse())
466+
Expect(a.Delete(event.DeleteEvent{})).To(BeFalse())
467+
Expect(a.Generic(event.GenericEvent{})).To(BeFalse())
468+
})
469+
It("should return true when all of its predicates return true", func() {
470+
a := predicate.And(passFuncs, passFuncs)
471+
Expect(a.Create(event.CreateEvent{})).To(BeTrue())
472+
Expect(a.Update(event.UpdateEvent{})).To(BeTrue())
473+
Expect(a.Delete(event.DeleteEvent{})).To(BeTrue())
474+
Expect(a.Generic(event.GenericEvent{})).To(BeTrue())
475+
})
476+
})
477+
Describe("When checking an Or predicate", func() {
478+
It("should return true when one of its predicates returns true", func() {
479+
o := predicate.Or(passFuncs, failFuncs)
480+
Expect(o.Create(event.CreateEvent{})).To(BeTrue())
481+
Expect(o.Update(event.UpdateEvent{})).To(BeTrue())
482+
Expect(o.Delete(event.DeleteEvent{})).To(BeTrue())
483+
Expect(o.Generic(event.GenericEvent{})).To(BeTrue())
484+
})
485+
It("should return false when all of its predicates return false", func() {
486+
o := predicate.Or(failFuncs, failFuncs)
487+
Expect(o.Create(event.CreateEvent{})).To(BeFalse())
488+
Expect(o.Update(event.UpdateEvent{})).To(BeFalse())
489+
Expect(o.Delete(event.DeleteEvent{})).To(BeFalse())
490+
Expect(o.Generic(event.GenericEvent{})).To(BeFalse())
491+
})
492+
})
493+
})
441494
})

0 commit comments

Comments
 (0)