public async Task OnEvent(IAggregateEvent ev, string queryId = null)
        {
            queryId = queryId ?? ev.AggregateId;
            var query = await queryStore.Get(queryId);

            var data = query.Data;

            if (query.Version >= ev.SequenceId)
            {
                // event already applied
                return;
            }

            int originalVersion = query.Version;

            if (originalVersion < ev.SequenceId - 1)
            {
                // fastforward to the current event's version
                query = await FastForward(query, ev.SequenceId);
            }
            else
            {
                // query is sync, just apply the event
                query.Data    = mutator.InvokeEventMutator(data, ev);
                query.Version = ev.SequenceId;
                query.DateUtc = DateTime.UtcNow;
            }

            await queryStore.Set(queryId, query, originalVersion);
        }