storage: add filtering to SyncLatest (#3368)

* wip

* storage: add filtering to SyncLatest

* don't increment the record version, so intermediate changes are requested

* fix stream filter
This commit is contained in:
Caleb Doxsey 2022-05-17 22:00:23 +00:00 committed by GitHub
parent 363dd82802
commit 1669b601ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 88 additions and 49 deletions

View file

@ -10,17 +10,35 @@ import (
func newSyncLatestRecordStream(
ctx context.Context,
backend *Backend,
) storage.RecordStream {
recordType string,
expr storage.FilterExpression,
) (storage.RecordStream, error) {
filter, err := storage.RecordStreamFilterFromFilterExpression(expr)
if err != nil {
return nil, err
}
if recordType != "" {
filter = filter.And(func(record *databroker.Record) (keep bool) {
return record.GetType() == recordType
})
}
var ready []*databroker.Record
return storage.NewRecordStream(ctx, backend.closed, []storage.RecordStreamGenerator{
func(ctx context.Context, block bool) (*databroker.Record, error) {
backend.mu.RLock()
for _, co := range backend.lookup {
ready = append(ready, co.List()...)
generator := func(ctx context.Context, block bool) (*databroker.Record, error) {
backend.mu.RLock()
for _, co := range backend.lookup {
for _, record := range co.List() {
if filter(record) {
ready = append(ready, record)
}
}
backend.mu.RUnlock()
return nil, storage.ErrStreamDone
},
}
backend.mu.RUnlock()
return nil, storage.ErrStreamDone
}
return storage.NewRecordStream(ctx, backend.closed, []storage.RecordStreamGenerator{
generator,
func(ctx context.Context, block bool) (*databroker.Record, error) {
if len(ready) == 0 {
return nil, storage.ErrStreamDone
@ -30,7 +48,7 @@ func newSyncLatestRecordStream(
ready = ready[1:]
return dup(record), nil
},
}, nil)
}, nil), nil
}
func newSyncRecordStream(