private static void ProcessFlatForRentAnnouncementPreference(FlatForRentAnnouncementPreference flatForRentAnnouncementPreference, FlatForRentAnnouncementsIntegrationEvent integrationEvent, HashSet <Guid> processedAnnouncementPreferenceIds) { lock (processedAnnouncementPreferenceIds) { if (!processedAnnouncementPreferenceIds.Add(flatForRentAnnouncementPreference.Id)) { return; } } foreach (var flatForRentAnnouncement in integrationEvent.FlatForRentAnnouncements) { var numberOfRooms = flatForRentAnnouncement.NumberOfRooms.ConvertToInt(); if (flatForRentAnnouncementPreference.RoomNumbersMin.HasValue && numberOfRooms.HasValue) { if (NumberOfRoomsMinMatches(numberOfRooms.Value, flatForRentAnnouncementPreference.RoomNumbersMin.Value)) { ProcessFlatForRentAnnouncementPreferenceForNumberOfRoomsMax(flatForRentAnnouncement, flatForRentAnnouncementPreference, numberOfRooms); } } else { ProcessFlatForRentAnnouncementPreferenceForNumberOfRoomsMax(flatForRentAnnouncement, flatForRentAnnouncementPreference, numberOfRooms); } } }
public async Task MatchAnnouncementsToPreferencesAsync(FlatForRentAnnouncementsIntegrationEvent integrationEvent) { var flatForRentAnnouncementPreferences = await _cosmosStore.Query().Where(x => x.CityId == integrationEvent.CityId && x.ServiceActive).ToListAsync(); var processedAnnouncementPreferenceIds = new HashSet <Guid>(); Parallel.ForEach( flatForRentAnnouncementPreferences, _parallelOptions, flatForRentAnnouncementPreference => ProcessFlatForRentAnnouncementPreference(flatForRentAnnouncementPreference, integrationEvent, processedAnnouncementPreferenceIds)); var documents = flatForRentAnnouncementPreferences.Select(JsonConvert.SerializeObject); await _bulkExecutor.BulkImportAsync(documents, true, true, _maxDegreeOfParallelism); }