Exemplo n.º 1
0
        public async Task <ReadModelEnvelope <TReadModel> > GetAsync(
            string id,
            CancellationToken cancellationToken)
        {
            var readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <TReadModel>();

            _log.Verbose(() => $"Fetching read model '{typeof(TReadModel).PrettyPrint()}' with ID '{id}' from index '{readModelDescription.IndexName}'");

            var getResponse = await _elasticClient.GetAsync <TReadModel>(
                id,
                d => d
                .RequestConfiguration(c => c
                                      .AllowedStatusCodes((int)HttpStatusCode.NotFound))
                .Index(readModelDescription.IndexName.Value),
                cancellationToken)
                              .ConfigureAwait(false);

            if (!getResponse.IsValid || !getResponse.Found)
            {
                return(ReadModelEnvelope <TReadModel> .Empty(id));
            }

            return(ReadModelEnvelope <TReadModel> .With(
                       id,
                       getResponse.Source,
                       getResponse.Version));
        }
Exemplo n.º 2
0
        public async Task DeleteAsync(string id, CancellationToken cancellationToken)
        {
            var readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <TReadModel>();

            _log.Information($"Deleting '{typeof(TReadModel).PrettyPrint()}' with id '{id}', from '{readModelDescription.RootCollectionName}'!");

            var collection = _mongoDatabase.GetCollection <TReadModel>(readModelDescription.RootCollectionName.Value);
            await collection.DeleteOneAsync(x => x.Id == id, cancellationToken);
        }
        public async Task DeleteAllAsync(CancellationToken cancellationToken)
        {
            var readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <TReadModel>();

            _log.Information($"Deleting ALL '{typeof(TReadModel).PrettyPrint()}' by DELETING NODE '{readModelDescription.RootNodeName}'!");
            if (_firebaseReadStoreConfiguration.UseBackupStore)
            {
                await _readModelBackUpStore.DeleteAllAsync <TReadModel>(readModelDescription.RootNodeName.Value, cancellationToken);

                await _readModelBackUpStore.TryFirebaseCoupleOfTimesAsync <TReadModel, FirebaseResponse>(_firebaseClient.DeleteAsync, readModelDescription.RootNodeName.Value);
            }
            else
            {
                await _firebaseClient.DeleteAsync(readModelDescription.RootNodeName.Value);
            }
        }
        public void PrepareIndex()
        {
            var modelDescription = _descriptionProvider.GetReadModelDescription <FlightAvailabilityReadModel>();
            var indexName        = GetIndexName(modelDescription.IndexName.Value);

            var isExist = _elasticClient.IndexExists(modelDescription.IndexName.Value).Exists;

            if (isExist)
            {
                return;
            }

            _elasticClient.CreateIndex(indexName, c => c
                                       .Settings(s => s
                                                 .NumberOfShards(1)
                                                 .NumberOfReplicas(0))
                                       .Aliases(a => a.Alias(modelDescription.IndexName.Value))
                                       .Mappings(m => m
                                                 .Map <FlightAvailabilityReadModel>(map => map
                                                                                    .AutoMap()
                                                                                    .Properties(ps => ps
                                                                                                .Text(t => t
                                                                                                      .Name(pn => pn.Number)
                                                                                                      .Fielddata()
                                                                                                      .Fields(fs => fs
                                                                                                              .Keyword(ss => ss
                                                                                                                       .Name("raw"))))))));
        }
        public async Task <IReadOnlyCollection <ThingyMessage> > ExecuteQueryAsync(ThingyGetMessagesQuery query, CancellationToken cancellationToken)
        {
            var readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <ElasticsearchThingyMessageReadModel>();
            var indexName            = readModelDescription.IndexName.Value;

            // Never do this
            await _elasticClient.FlushAsync(
                indexName,
                d => d
                .RequestConfiguration(c => c
                                      .AllowedStatusCodes((int)HttpStatusCode.NotFound)),
                cancellationToken)
            .ConfigureAwait(false);

            await _elasticClient.RefreshAsync(
                indexName,
                d => d
                .RequestConfiguration(c => c
                                      .AllowedStatusCodes((int)HttpStatusCode.NotFound)),
                cancellationToken)
            .ConfigureAwait(false);

            var searchResponse = await _elasticClient.SearchAsync <ElasticsearchThingyMessageReadModel>(d => d
                                                                                                        .RequestConfiguration(c => c
                                                                                                                              .AllowedStatusCodes((int)HttpStatusCode.NotFound))
                                                                                                        .Index(indexName)
                                                                                                        .Query(q => q.Term(m => m.ThingyId.Suffix("keyword"), query.ThingyId.Value)),
                                                                                                        cancellationToken)
                                 .ConfigureAwait(false);

            return(searchResponse.Documents
                   .Select(d => d.ToThingyMessage())
                   .ToList());
        }
Exemplo n.º 6
0
        public async Task <IReadOnlyCollection <Employee> > ExecuteQueryAsync(EmployeeGetAllQuery query, CancellationToken cancellationToken)
        {
            ReadModelDescription readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <EmployeeReadModel>();
            string indexName = "eventflow-" + readModelDescription.IndexName.Value;

            await _elasticClient.FlushAsync(indexName,
                                            d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound)), cancellationToken)
            .ConfigureAwait(false);

            await _elasticClient.RefreshAsync(indexName,
                                              d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound)), cancellationToken)
            .ConfigureAwait(false);

            var searchResponse = await _elasticClient.SearchAsync <EmployeeReadModel>(d => d
                                                                                      .RequestConfiguration(c => c
                                                                                                            .AllowedStatusCodes((int)HttpStatusCode.NotFound))
                                                                                      .Index(readModelDescription.IndexName.Value)
                                                                                      .Query(q => q),
                                                                                      cancellationToken)
                                 .ConfigureAwait(false);

            var retList = new List <Employee>();

            foreach (var doc in searchResponse?.Documents)
            {
                var dataEmployee = new Employee(new EmployeeId(doc.Id), doc.FullName ?? string.Empty, doc.Department ?? string.Empty, doc.TenantId);
                retList.Add(dataEmployee);
            }
            return(retList);
        }
        public async Task <BookingReadModel> ExecuteQueryAsync(BookingIdQuery query, CancellationToken cancellationToken)
        {
            var index = _modelDescriptionProvider.GetReadModelDescription <BookingReadModel>().IndexName;


            var getResponse = await _elasticClient.GetAsync <BookingReadModel>(
                query.BookingId,
                d => d
                .RequestConfiguration(c => c
                                      .AllowedStatusCodes((int)HttpStatusCode.NotFound))
                .Index(index.Value),
                cancellationToken)
                              .ConfigureAwait(false);


            var searchResponse = await _elasticClient.SearchAsync <BookingReadModel>(d => d
                                                                                     .RequestConfiguration(c => c
                                                                                                           .AllowedStatusCodes((int)HttpStatusCode.NotFound))
                                                                                     .Index(index.Value)
                                                                                     .Query(q => q.Match(m => m.Field(f => f.Id).Query(query.BookingId))),
                                                                                     cancellationToken)
                                 .ConfigureAwait(false);

//            return searchResponse.Documents
//                .First();

            return(getResponse.Source);
        }
        public void RestoreReadModel <TReadModel>(string readModelId, List <ReadModelUpdateFailure> failedUpdates)
            where TReadModel : class, IFirebaseReadModel, new()
        {
            var readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <TReadModel>().RootNodeName.Value;
            var readmodelBackup      = GetLatestBackupForReadModel <TReadModel>(readModelDescription, readModelId);
            var path = $"{readModelDescription}/{readModelId}";

            try
            {
                _firebaseClient.Set(path, readmodelBackup);
                MarkFailedUpdatesAsFixed(failedUpdates);
            }
            catch (Exception)
            {
                MarkFailedUpdatesAsTriedAgain(failedUpdates);
            }
        }
 public override void TearDown()
 {
     try
     {
         var readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <ElasticsearchTestAggregateReadModel>();
         _elasticClient.DeleteIndex(readModelDescription.IndexName.Value);
     }
     catch (Exception e)
     {
         Console.WriteLine(e.Message);
     }
 }
Exemplo n.º 10
0
        public async Task <long?> ExecuteQueryAsync(ThingyGetVersionQuery query, CancellationToken cancellationToken)
        {
            var readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <ElasticsearchThingyReadModel>();
            var getResponse          = await _elasticClient.GetAsync <ElasticsearchThingyReadModel>(
                query.ThingyId.Value,
                readModelDescription.IndexName.Value)
                                       .ConfigureAwait(false);

            return(getResponse != null && getResponse.Found
                ? long.Parse(getResponse.Version)
                : null as long?);
        }
Exemplo n.º 11
0
        public async Task <ReadModelEnvelope <TReadModel> > GetAsync(
            string id,
            CancellationToken cancellationToken)
        {
            var readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <TReadModel>();

            _log.Verbose(() => $"Fetching read model '{typeof(TReadModel).PrettyPrint()}' with ID '{id}' from index '{readModelDescription.IndexName}'");

            var getResponse = await _elasticClient.GetAsync <TReadModel>(
                id,
                readModelDescription.IndexName.Value)
                              .ConfigureAwait(false);

            if (!getResponse.IsValid || !getResponse.Found)
            {
                return(ReadModelEnvelope <TReadModel> .Empty);
            }

            var version = long.Parse(getResponse.Version);

            return(ReadModelEnvelope <TReadModel> .With(getResponse.Source, version));
        }
        public async Task <List <FlightAvailabilityReadModel> > ExecuteQueryAsync(DepartureStationQuery query,
                                                                                  CancellationToken cancellationToken)
        {
            var index = _modelDescriptionProvider.GetReadModelDescription <FlightAvailabilityReadModel>().IndexName;

            var searchResponse = await _elasticClient.SearchAsync <FlightAvailabilityReadModel>(d => d
                                                                                                .RequestConfiguration(c => c
                                                                                                                      .AllowedStatusCodes((int)HttpStatusCode.NotFound))
                                                                                                .Index(index.Value)
                                                                                                .Query(q => q.QueryString(qs => qs
                                                                                                                          .Query(query.Departure))), cancellationToken);

            return(searchResponse.Documents.ToList());
        }
Exemplo n.º 13
0
 public void TearDown()
 {
     try
     {
         var readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <ElasticsearchThingyReadModel>();
         var indexName            = readModelDescription.IndexName.Value;
         Console.WriteLine("Deleting test index '{0}'", indexName);
         _elasticClient.DeleteIndex(indexName);
     }
     catch (Exception e)
     {
         Console.WriteLine(e.Message);
     }
 }
        public async Task <IPagedResponse <Company> > ExecuteQueryAsync(CompanySearchByNameQuery query, CancellationToken cancellationToken)
        {
            ReadModelDescription readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <CompanyReadModel>();
            string indexName = readModelDescription.IndexName.Value;

            await _elasticClient.FlushAsync(indexName,
                                            d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound)), cancellationToken)
            .ConfigureAwait(false);

            await _elasticClient.RefreshAsync(indexName,
                                              d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound)), cancellationToken)
            .ConfigureAwait(false);

            var querySearch = !string.IsNullOrEmpty(query.Name)
                ? new WildcardQuery()
            {
                Field = Infer.Field <CompanyReadModel>(f => f.Name),
                Value = query.Name.ToLower() + "*",
            }
                : null;
            var searchRequest = new SearchRequest(indexName)
            {
                Query = new BoolQuery()
                {
                    Must = new QueryContainer[]
                    {
                        querySearch
                    },
                    //MustNot = new QueryContainer[]
                    //{
                    //    new ExistsQuery()
                    //    {
                    //        Field = Infer.Field<CompanyReadModel>(f => f.IsDeleted)
                    //    }
                    //}
                },
                From = 1,
                Size = 10,
            };

            var companyRecords = await _elasticClient.SearchAsync <CompanyReadModel>(searchRequest, cancellationToken);

            IPagedResponse <Company> response = new PagedResponse <Company>()
            {
                Records    = (companyRecords?.Documents?.Count > 0) ? companyRecords.Documents.Select(collection => collection.ToCompany()).ToList() : new List <Company>(),
                TotalCount = (companyRecords?.Documents?.Count > 0) ? companyRecords.Total : 0
            };

            return(response);
        }
Exemplo n.º 15
0
        public async Task <long?> ExecuteQueryAsync(ThingyGetVersionQuery query, CancellationToken cancellationToken)
        {
            var readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <ElasticsearchThingyReadModel>();
            var getResponse          = await _elasticClient.GetAsync <ElasticsearchThingyReadModel>(
                query.ThingyId.Value,
                d => d
                .RequestConfiguration(c => c
                                      .CancellationToken(cancellationToken)
                                      .AllowedStatusCodes((int)HttpStatusCode.NotFound))
                .Index(readModelDescription.IndexName.Value))
                                       .ConfigureAwait(false);

            return(getResponse != null && getResponse.Found
                ? getResponse.Version
                : null as long?);
        }
        public async Task <IReadOnlyCollection <ThingyMessage> > ExecuteQueryAsync(ThingyGetMessagesQuery query, CancellationToken cancellationToken)
        {
            var readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <ElasticsearchThingyMessageReadModel>();
            var indexName            = readModelDescription.IndexName.Value;

            // Never do this
            await _elasticClient.FlushAsync(d => d.Index(indexName)).ConfigureAwait(false);

            await _elasticClient.RefreshAsync(d => d.Index(indexName)).ConfigureAwait(false);

            var searchResponse = await _elasticClient.SearchAsync <ElasticsearchThingyMessageReadModel>(d => d
                                                                                                        .Index(indexName)
                                                                                                        .Query(q => q.Term(m => m.ThingyId, query.ThingyId.Value)))
                                 .ConfigureAwait(false);

            return(searchResponse.Documents
                   .Select(d => d.ToThingyMessage())
                   .ToList());
        }
Exemplo n.º 17
0
        public async Task <Employee> ExecuteQueryAsync(EmployeeGetQuery query, CancellationToken cancellationToken)
        {
            ReadModelDescription readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <EmployeeReadModel>();
            string indexName = "eventflow-" + readModelDescription.IndexName.Value;

            await _elasticClient.Indices.FlushAsync(indexName,
                                                    d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound)), cancellationToken)
            .ConfigureAwait(false);

            await _elasticClient.Indices.RefreshAsync(indexName,
                                                      d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound)), cancellationToken)
            .ConfigureAwait(false);

            IGetResponse <EmployeeReadModel> searchResponse = await _elasticClient.GetAsync <EmployeeReadModel>(query.EmployeeId.Value,
                                                                                                                d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound)).Index(readModelDescription.IndexName.Value), cancellationToken)
                                                              .ConfigureAwait(false);

            return(searchResponse.Source.ToEmployee());
        }
Exemplo n.º 18
0
        public void PrepareIndex()
        {
            var modelDescription = _descriptionProvider.GetReadModelDescription <FlightAvailabilityReadModel>();
            var indexName        = GetIndexName(modelDescription.IndexName.Value);
            var isExist          = _elasticClient.IndexExists(indexName).Exists;

            if (isExist)
            {
                return;
            }

            _elasticClient.CreateIndex(indexName, c => c
                                       .Settings(s => s
                                                 .NumberOfShards(1)
                                                 .NumberOfReplicas(0))
                                       .Aliases(a => a.Alias(modelDescription.IndexName.Value))
                                       .Mappings(m => m
                                                 .Map <FlightAvailabilityReadModel>(map => map
                                                                                    .AutoMap())));
        }
        public async Task <Company> ExecuteQueryAsync(CompanyGetQuery query, CancellationToken cancellationToken)
        {
            ReadModelDescription readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <CompanyReadModel>();
            string indexName = readModelDescription.IndexName.Value;

            await _elasticClient.FlushAsync(indexName,
                                            d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound)), cancellationToken)
            .ConfigureAwait(false);

            await _elasticClient.RefreshAsync(indexName,
                                              d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound)), cancellationToken)
            .ConfigureAwait(false);

            IGetResponse <CompanyReadModel> response = await _elasticClient.GetAsync <CompanyReadModel>(
                query.CompanyId.Value.ToString(),
                d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound))
                .Index(indexName), cancellationToken)
                                                       .ConfigureAwait(false);

            return(response.Source.ToCompany());
        }
        public async Task <int> ExecuteQueryAsync(CompanyGetByAddressQuery query, CancellationToken cancellationToken)
        {
            ReadModelDescription readModelDescription = _readModelDescriptionProvider.GetReadModelDescription <CompanyReadModel>();
            string indexName = readModelDescription.IndexName.Value;

            await _elasticClient.FlushAsync(indexName,
                                            d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound)), cancellationToken)
            .ConfigureAwait(false);

            await _elasticClient.RefreshAsync(indexName,
                                              d => d.RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound)), cancellationToken)
            .ConfigureAwait(false);

            ISearchResponse <CompanyReadModel> searchResponse;

            if (query.Id != null)
            {
                searchResponse = await _elasticClient.SearchAsync <CompanyReadModel>(
                    d => d
                    .RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound))
                    .Index(indexName)
                    .Query(q => q.Match(m => m.Field(f => f.Address).Query(query.Address).MinimumShouldMatch("100%")) &&
                           !q.Match(m => m.Field(f => f.Id).Query(query.Id.Value.ToString()))), cancellationToken);
            }
            else
            {
                searchResponse = await _elasticClient.SearchAsync <CompanyReadModel>(
                    d => d
                    .RequestConfiguration(c => c.AllowedStatusCodes((int)HttpStatusCode.NotFound))
                    .Index(indexName)
                    .Query(q => q.Match(m => m.Field(f => f.Address).Query(query.Address).MinimumShouldMatch("100%"))), cancellationToken);
            }
            var count = searchResponse?.Documents?.Count;

            return(count ?? 0);
        }