private static void ProcessRoomForRentAnnouncementPreference(RoomForRentAnnouncementPreference roomForRentAnnouncementPreference, RoomForRentAnnouncementsIntegrationEvent integrationEvent, HashSet <Guid> processedAnnouncementPreferenceIds) { lock (processedAnnouncementPreferenceIds) { if (!processedAnnouncementPreferenceIds.Add(roomForRentAnnouncementPreference.Id)) { return; } } foreach (var roomForRentAnnouncement in integrationEvent.RoomForRentAnnouncements) { if (roomForRentAnnouncementPreference.RoomType.HasValue) { if (roomForRentAnnouncement.RoomTypes.Any()) { if (roomForRentAnnouncement.RoomTypes.Contains(roomForRentAnnouncementPreference.RoomType.Value)) { ProcessRoomForRentAnnouncementPreferenceForPriceMin(roomForRentAnnouncement, roomForRentAnnouncementPreference); } } else { ProcessRoomForRentAnnouncementPreferenceForPriceMin(roomForRentAnnouncement, roomForRentAnnouncementPreference); } } else { ProcessRoomForRentAnnouncementPreferenceForPriceMin(roomForRentAnnouncement, roomForRentAnnouncementPreference); } } }
public async Task MatchAnnouncementsToPreferencesAsync(RoomForRentAnnouncementsIntegrationEvent integrationEvent) { var roomForRentAnnouncementPreferences = await _cosmosStore.Query().Where(x => x.CityId == integrationEvent.CityId && x.ServiceActive).ToListAsync(); var processedAnnouncementPreferenceIds = new HashSet <Guid>(); Parallel.ForEach( roomForRentAnnouncementPreferences, _parallelOptions, roomForRentAnnouncementPreference => ProcessRoomForRentAnnouncementPreference(roomForRentAnnouncementPreference, integrationEvent, processedAnnouncementPreferenceIds)); var documents = roomForRentAnnouncementPreferences.Select(JsonConvert.SerializeObject); await _bulkExecutor.BulkImportAsync(documents, true, true, _maxDegreeOfParallelism); }