Skip to content

Commit 142e3c6

Browse files
committed
fix: Update an object only if it actually changes
1 parent ec74884 commit 142e3c6

File tree

2 files changed

+103
-6
lines changed

2 files changed

+103
-6
lines changed

pkg/pipeline/aggregation_test.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,103 @@ var _ = Describe("Aggregations", func() {
599599
Expect(err).NotTo(HaveOccurred())
600600
Expect(res).To(BeEmpty())
601601
})
602+
603+
It("should evaluate an update with demux expressions that set the object name", func() {
604+
obj := object.NewViewObject("view")
605+
// must have a valid name
606+
object.SetContent(obj, unstruct{
607+
"spec": unstruct{
608+
"list": []any{"a", "b", "c"},
609+
},
610+
})
611+
object.SetName(obj, "default", "name")
612+
613+
jsonData := `{"@aggregate":[{"@unwind": "$.spec.list"},{"@project":{"metadata":{"name":"$.spec.list"}}}]}`
614+
ag := newAggregation(eng, []byte(jsonData))
615+
Expect(ag.Expressions).To(HaveLen(2))
616+
617+
res, err := ag.Evaluate(cache.Delta{Type: cache.Upserted, Object: obj})
618+
Expect(err).NotTo(HaveOccurred())
619+
Expect(res).To(HaveLen(3))
620+
621+
Expect(res[0].Type).To(Equal(cache.Added))
622+
Expect(res[0].Object).To(Equal(&unstructured.Unstructured{
623+
Object: unstruct{
624+
"apiVersion": "view.dcontroller.io/v1alpha1",
625+
"kind": "view",
626+
"metadata": unstruct{
627+
"name": "a",
628+
},
629+
},
630+
}))
631+
632+
Expect(res[1].Type).To(Equal(cache.Added))
633+
Expect(res[1].Object).To(Equal(&unstructured.Unstructured{
634+
Object: unstruct{
635+
"apiVersion": "view.dcontroller.io/v1alpha1",
636+
"kind": "view",
637+
"metadata": unstruct{
638+
"name": "b",
639+
},
640+
},
641+
}))
642+
643+
Expect(res[2].Type).To(Equal(cache.Added))
644+
Expect(res[2].Object).To(Equal(&unstructured.Unstructured{
645+
Object: unstruct{
646+
"apiVersion": "view.dcontroller.io/v1alpha1",
647+
"kind": "view",
648+
"metadata": unstruct{
649+
"name": "c",
650+
},
651+
},
652+
}))
653+
654+
// update the list
655+
object.SetContent(obj, unstruct{
656+
"spec": unstruct{
657+
"list": []any{"c", "d"},
658+
},
659+
})
660+
object.SetName(obj, "default", "name")
661+
662+
res, err = ag.Evaluate(cache.Delta{Type: cache.Upserted, Object: obj})
663+
Expect(err).NotTo(HaveOccurred())
664+
Expect(res).To(HaveLen(3))
665+
666+
Expect(res[0].Type).To(Equal(cache.Deleted))
667+
Expect(res[0].Object).To(Equal(&unstructured.Unstructured{
668+
Object: unstruct{
669+
"apiVersion": "view.dcontroller.io/v1alpha1",
670+
"kind": "view",
671+
"metadata": unstruct{
672+
"name": "a",
673+
},
674+
},
675+
}))
676+
677+
Expect(res[1].Type).To(Equal(cache.Deleted))
678+
Expect(res[1].Object).To(Equal(&unstructured.Unstructured{
679+
Object: unstruct{
680+
"apiVersion": "view.dcontroller.io/v1alpha1",
681+
"kind": "view",
682+
"metadata": unstruct{
683+
"name": "b",
684+
},
685+
},
686+
}))
687+
688+
Expect(res[2].Type).To(Equal(cache.Added))
689+
Expect(res[2].Object).To(Equal(&unstructured.Unstructured{
690+
Object: unstruct{
691+
"apiVersion": "view.dcontroller.io/v1alpha1",
692+
"kind": "view",
693+
"metadata": unstruct{
694+
"name": "d",
695+
},
696+
},
697+
}))
698+
})
602699
})
603700
})
604701

pkg/pipeline/default_engine.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ func (eng *defaultEngine) evalStage(_ *Aggregation, e *expression.Expression, u
309309

310310
default:
311311
return nil, NewAggregationError(
312-
errors.New("unknown aggregation stage"))
312+
errors.New("unknown aggregation op"))
313313
}
314314
}
315315

@@ -353,21 +353,21 @@ func (eng *defaultEngine) consolidateDeltas(orig cache.Delta, ds []cache.Delta)
353353

354354
res := []cache.Delta{}
355355

356-
// 1. "deleted+!added=deleted"
356+
// 1. deleted && !added -> deleted
357357
for name, del := range delidx {
358358
if _, ok := addidx[name]; !ok {
359359
res = append(res, *del)
360360
}
361361
}
362362

363-
// 2. "deleted+added=updated"
364-
for name := range delidx {
365-
if add, ok := addidx[name]; ok {
363+
// 2. deleted && added && deleted!=added -> updated
364+
for name, del := range delidx {
365+
if add, ok := addidx[name]; ok && !object.DeepEqual(add.Object, del.Object) {
366366
res = append(res, cache.Delta{Type: cache.Updated, Object: add.Object})
367367
}
368368
}
369369

370-
// 3. "!deleted+added=added"
370+
// 3. !deleted && added -> added
371371
for name, add := range addidx {
372372
if _, ok := delidx[name]; !ok {
373373
res = append(res, *add)

0 commit comments

Comments
 (0)