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)); }
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()); }
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); } }
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?); }
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()); }
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); }
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()); }
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()); }
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); }