mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 19:17:32 +00:00
fix(eventstore): improve pagination of handler filter (#6968)
* fix(setup): add filter_offset to `projections.current_states` * fix(eventstore): allow offset in query * fix(handler): offset for already processed events
This commit is contained in:
@@ -14,6 +14,7 @@ import (
|
||||
type SearchQueryBuilder struct {
|
||||
columns Columns
|
||||
limit uint64
|
||||
offset uint16
|
||||
desc bool
|
||||
resourceOwner string
|
||||
instanceID *string
|
||||
@@ -37,6 +38,10 @@ func (b *SearchQueryBuilder) GetLimit() uint64 {
|
||||
return b.limit
|
||||
}
|
||||
|
||||
func (b *SearchQueryBuilder) GetOffset() uint16 {
|
||||
return b.offset
|
||||
}
|
||||
|
||||
func (b *SearchQueryBuilder) GetDesc() bool {
|
||||
return b.desc
|
||||
}
|
||||
@@ -149,25 +154,46 @@ func NewSearchQueryBuilder(columns Columns) *SearchQueryBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
func (builder *SearchQueryBuilder) Matches(event Event, existingLen int) (matches bool) {
|
||||
if builder.limit > 0 && uint64(existingLen) >= builder.limit {
|
||||
func (builder *SearchQueryBuilder) Matches(commands ...Command) []Command {
|
||||
matches := make([]Command, 0, len(commands))
|
||||
for i, command := range commands {
|
||||
if builder.limit > 0 && builder.limit <= uint64(len(matches)) {
|
||||
break
|
||||
}
|
||||
if builder.offset > 0 && uint16(i) < builder.offset {
|
||||
continue
|
||||
}
|
||||
|
||||
if builder.matchCommand(command) {
|
||||
matches = append(matches, command)
|
||||
}
|
||||
}
|
||||
|
||||
return matches
|
||||
}
|
||||
|
||||
type sequencer interface {
|
||||
Sequence() uint64
|
||||
}
|
||||
|
||||
func (builder *SearchQueryBuilder) matchCommand(command Command) bool {
|
||||
if builder.resourceOwner != "" && command.Aggregate().ResourceOwner != builder.resourceOwner {
|
||||
return false
|
||||
}
|
||||
if builder.resourceOwner != "" && event.Aggregate().ResourceOwner != builder.resourceOwner {
|
||||
if command.Aggregate().InstanceID != "" && builder.instanceID != nil && *builder.instanceID != "" && command.Aggregate().InstanceID != *builder.instanceID {
|
||||
return false
|
||||
}
|
||||
if event.Aggregate().InstanceID != "" && builder.instanceID != nil && *builder.instanceID != "" && event.Aggregate().InstanceID != *builder.instanceID {
|
||||
return false
|
||||
}
|
||||
if builder.eventSequenceGreater > 0 && event.Sequence() <= builder.eventSequenceGreater {
|
||||
return false
|
||||
if seq, ok := command.(sequencer); ok {
|
||||
if builder.eventSequenceGreater > 0 && seq.Sequence() <= builder.eventSequenceGreater {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
if len(builder.queries) == 0 {
|
||||
return true
|
||||
}
|
||||
for _, query := range builder.queries {
|
||||
if query.matches(event) {
|
||||
if query.matches(command) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -186,6 +212,12 @@ func (builder *SearchQueryBuilder) Limit(limit uint64) *SearchQueryBuilder {
|
||||
return builder
|
||||
}
|
||||
|
||||
// Limit defines how many events are returned maximally.
|
||||
func (builder *SearchQueryBuilder) Offset(offset uint16) *SearchQueryBuilder {
|
||||
builder.offset = offset
|
||||
return builder
|
||||
}
|
||||
|
||||
// ResourceOwner defines the resource owner (org) of the events
|
||||
func (builder *SearchQueryBuilder) ResourceOwner(resourceOwner string) *SearchQueryBuilder {
|
||||
builder.resourceOwner = resourceOwner
|
||||
@@ -317,14 +349,14 @@ func (query *SearchQuery) Builder() *SearchQueryBuilder {
|
||||
return query.builder
|
||||
}
|
||||
|
||||
func (query *SearchQuery) matches(event Event) bool {
|
||||
if ok := isAggreagteTypes(event.Aggregate(), query.aggregateTypes...); len(query.aggregateTypes) > 0 && !ok {
|
||||
func (query *SearchQuery) matches(command Command) bool {
|
||||
if ok := isAggregateTypes(command.Aggregate(), query.aggregateTypes...); len(query.aggregateTypes) > 0 && !ok {
|
||||
return false
|
||||
}
|
||||
if ok := isAggregateIDs(event.Aggregate(), query.aggregateIDs...); len(query.aggregateIDs) > 0 && !ok {
|
||||
if ok := isAggregateIDs(command.Aggregate(), query.aggregateIDs...); len(query.aggregateIDs) > 0 && !ok {
|
||||
return false
|
||||
}
|
||||
if ok := isEventTypes(event, query.eventTypes...); len(query.eventTypes) > 0 && !ok {
|
||||
if ok := isEventTypes(command, query.eventTypes...); len(query.eventTypes) > 0 && !ok {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
|
Reference in New Issue
Block a user