Example #1
0
        protected async Task <RepositoryQueryResult <TAggregateRoot> > FindByAttributeValueAsync(
            FindByAttributeValueStateQuery query, CancellationToken cancellationToken)
        {
            Require.NotNull(query, nameof(query));

            var queryResult = await _stateStorage.FindByAttributeValueAsync <TAggregateState>(query, cancellationToken);

            var items = new List <TAggregateRoot>(queryResult.States.Count);

            foreach (var restoredState in queryResult.States)
            {
                var id = (TEntityId)Activator.CreateInstance(typeof(TEntityId), restoredState.Key);
                var(version, state) = restoredState.Value;

                items.Add(CreateAggregateInstance(id, version, state));
            }

            return(new RepositoryQueryResult <TAggregateRoot>(items, queryResult.PaginationToken));
        }
Example #2
0
        public async Task FindByAttributeValueAsync_ReturnsAllStatesByProjectId(
            [Frozen] ProjectId projectId,
            IFixture fixture,
            TodoTaskId[] ids)
        {
            // arrange
            const string attributeName = "TaskProjectId";
            var          states        = new Dictionary <TodoTaskId, (AggregateVersion, TodoTask.AggregateState)>();

            foreach (var id in ids)
            {
                var state = fixture.Create <TodoTask.AggregateState>();
                state.Mutate(new TodoTaskCreated(projectId, id));
                var version = AggregateVersion.Emtpy;
                states[id] = (version, state);

                await _stateStorage.PersistAsync(
                    id,
                    state,
                    version,
                    new Dictionary <string, object> {
                    { attributeName, projectId }
                },
                    CancellationToken.None);
            }

            // act
            var query       = new FindByAttributeValueStateQuery(attributeName, projectId, ids.Length);
            var queryResult =
                await _stateStorage.FindByAttributeValueAsync <TodoTask.AggregateState>(query, CancellationToken.None);

            // assert
            foreach (var id in ids)
            {
                var(actualVersion, actualState)     = states[id];
                var(restoredVersion, restoredState) = queryResult.States[id];

                Assert.Equal(AggregateVersion.Emtpy.Increment(), restoredVersion);
                Assert.Equal(actualState.ProjectId, restoredState.ProjectId);
                Assert.Equal(actualState.TaskState, restoredState.TaskState);
            }
        }
Example #3
0
        public async Task FindByAttributeValueAsync_ReturnsAllStatesInPages(
            [Frozen] ProjectId projectId,
            IFixture fixture,
            TodoTaskId[] ids)
        {
            // arrange
            const string attributeName = "TaskProjectId";
            var          states        = new Dictionary <TodoTaskId, (AggregateVersion, TodoTask.AggregateState)>();

            foreach (var id in ids)
            {
                var state   = fixture.Create <TodoTask.AggregateState>();
                var version = AggregateVersion.Emtpy;
                states[id] = (version, state);

                await _stateStorage.PersistAsync(
                    id,
                    state,
                    version,
                    new Dictionary <string, object> {
                    { attributeName, projectId }
                },
                    CancellationToken.None);
            }

            // act
            var results =
                new Dictionary <IEntityIdentity, (AggregateVersion, TodoTask.AggregateState)>(EntityIdentity
                                                                                              .DefaultComparer);
            FindByAttributeValueStateQueryResult <TodoTask.AggregateState> queryResult = null;

            do
            {
                FindByAttributeValueStateQuery query;
                if (queryResult != null)
                {
                    query = new FindByAttributeValueStateQuery(attributeName, projectId, 2,
                                                               queryResult.PaginationToken);
                }
                else
                {
                    query = new FindByAttributeValueStateQuery(attributeName, projectId, 2);
                }

                queryResult =
                    await _stateStorage.FindByAttributeValueAsync <TodoTask.AggregateState>(query,
                                                                                            CancellationToken.None);

                foreach (var pair in queryResult.States)
                {
                    results[pair.Key] = pair.Value;
                }
            } while (queryResult.PaginationToken != null);

            // assert
            foreach (var id in ids)
            {
                var(actualVersion, actualState)     = states[id];
                var(restoredVersion, restoredState) = results[id];

                Assert.Equal(actualVersion, restoredVersion);
                Assert.Equal(actualState.ProjectId, restoredState.ProjectId);
                Assert.Equal(actualState.TaskState, restoredState.TaskState);
            }
        }