private RichAccommodationDetails GetDbAccommodation(Contracts.MultilingualAccommodation accommodation, bool isActive, DeactivationReasons deactivationReason = DeactivationReasons.None) { var locationIds = _actualLocationsSearchHelper.GetActualLocationIds(accommodation.Location); var utcNow = DateTimeOffset.UtcNow; var dbAccommodation = new RichAccommodationDetails { CountryCode = _country.Code, FinalAccommodation = accommodation, SupplierAccommodationCodes = new Dictionary <string, string> { { _supplier, accommodation.SupplierCode } }, Created = utcNow, Modified = utcNow, IsCorrected = true, KeyData = _multilingualDataHelper.GetAccommodationKeyData(accommodation), CountryId = _country.Id, LocalityId = locationIds.LocalityId, LocalityZoneId = locationIds.LocalityZoneId, IsActive = isActive, DeactivationReason = deactivationReason }; return(dbAccommodation); }
public void RemoveSupplierCodeOrDeactivateNotValid(Contracts.MultilingualAccommodation accommodation, DeactivationReasons deactivationReason) { if (!_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(accommodation.SupplierCode, out var existingAccommodation) || existingAccommodation.SupplierAccommodationCodes.Count == 1) { ProcessDeactivation(accommodation.SupplierCode, deactivationReason, accommodation); return; } var dbAccommodation = new RichAccommodationDetails { Id = existingAccommodation.HtId, Modified = DateTimeOffset.UtcNow, IsCorrected = false }; _accommodationChangeLogCollectorService.CollectSupplierCodeRemoveEvent(existingAccommodation.HtId, AccommodationChangeEventSources.Updater, _supplier, accommodation.SupplierCode, existingAccommodation.SupplierAccommodationCodes, SupplierCodeRemoveReasonConverter.Convert(deactivationReason)); foreach (var supplierCode in existingAccommodation.SupplierAccommodationCodes) { dbAccommodation.SupplierAccommodationCodes.TryAdd(supplierCode.Key, supplierCode.Value); } dbAccommodation.SupplierAccommodationCodes.Remove(_supplier); _context.Attach(dbAccommodation); var entry = _context.Entry(dbAccommodation); entry.Property(ac => ac.Modified).IsModified = true; entry.Property(ac => ac.IsCorrected).IsModified = true; entry.Property(ac => ac.SupplierAccommodationCodes).IsModified = true; }
private void ProcessDeactivation(string supplierAccommodationCode, DeactivationReasons reason, Contracts.MultilingualAccommodation accommodation) { if (_accommodationDataStorage.SupplierInvalidAccommodations.TryGetValue(supplierAccommodationCode, out var invalidAccommodation)) { if (invalidAccommodation.DeactivationReason == reason) { return; } var accommodationToUpdate = new RichAccommodationDetails { Id = invalidAccommodation.HtId, DeactivationReason = reason, Modified = DateTimeOffset.UtcNow, FinalAccommodation = accommodation }; _context.Attach(accommodationToUpdate); var entry = _context.Entry(accommodationToUpdate); entry.Property(ac => ac.DeactivationReason).IsModified = true; entry.Property(ac => ac.Modified).IsModified = true; entry.Property(ac => ac.FinalAccommodation).IsModified = true; _accommodationChangeLogCollectorService.CollectDeactivationReasonChangeEvent(invalidAccommodation.HtId, AccommodationChangeEventSources.Updater, invalidAccommodation.DeactivationReason, reason); return; } if (_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(supplierAccommodationCode, out var existingActive)) { var accommodationToUpdate = new RichAccommodationDetails { Id = existingActive.HtId, IsActive = false, DeactivationReason = reason, Modified = DateTimeOffset.UtcNow, FinalAccommodation = accommodation }; _context.Attach(accommodationToUpdate); var entry = _context.Entry(accommodationToUpdate); entry.Property(ac => ac.IsActive).IsModified = true; entry.Property(ac => ac.DeactivationReason).IsModified = true; entry.Property(ac => ac.Modified).IsModified = true; _accommodationsToRemove.Add(existingActive.HtId); _accommodationChangeLogCollectorService.CollectDeactivationEvent(existingActive.HtId, AccommodationChangeEventSources.Updater, reason, string.Empty); return; } var dbAccommodation = GetDbAccommodation(accommodation, isActive: false, reason); _accommodationsToAdd.Add(dbAccommodation); }
public List <SlimAccommodationData> GetNearest(Contracts.MultilingualAccommodation accommodation, STRtree <SlimAccommodationData> tree) { var accommodationEnvelope = new Envelope(accommodation.Location.Coordinates.Longitude - 0.01, accommodation.Location.Coordinates.Longitude + 0.01, accommodation.Location.Coordinates.Latitude - 0.01, accommodation.Location.Coordinates.Latitude + 0.01); return(tree.Query(accommodationEnvelope).ToList()); }
public void AddUncertain(Contracts.MultilingualAccommodation accommodation, int existingHtId, float score) { int matchedHtId = 0; if (_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(accommodation.SupplierCode, out var existing)) { matchedHtId = existing.HtId; if (IsExistUncertainMatch(matchedHtId, existingHtId)) { return; } } else if (_accommodationDataStorage.SupplierInvalidAccommodations.TryGetValue(accommodation.SupplierCode, out var existingNotValid)) { matchedHtId = existingNotValid.HtId; ActivateOrAddActive(accommodation); if (IsExistUncertainMatch(matchedHtId, existingHtId)) { return; } } var utcNow = DateTimeOffset.UtcNow; _uncertainAccommodationsToAdd.Add(new AccommodationUncertainMatches { Score = score, SourceHtId = existingHtId, HtIdToMerge = matchedHtId != 0 ? matchedHtId : 0, Created = utcNow, Modified = utcNow, AccommodationToMatch = matchedHtId == 0 ? GetDbAccommodation(accommodation, isActive: true) : null, IsActive = true }); bool IsExistUncertainMatch(int firstId, int secondId) => _accommodationDataStorage.ActiveUncertainMatches.Any(eum => eum.Value.Equals(new(firstId, secondId)) || eum.Value.Equals(new(secondId, firstId))); }
public void ActivateOrAddActive(Contracts.MultilingualAccommodation accommodation) { if (_accommodationDataStorage.SupplierActiveAccommodations.ContainsKey(accommodation.SupplierCode)) { return; } if (_accommodationDataStorage.SupplierInvalidAccommodations.TryGetValue(accommodation.SupplierCode, out var existingNotValid)) { // Get accommodation data here, because invalid accommodations are dependant from one supplier no need recalculation var accommodationToUpdate = GetDbAccommodation(accommodation, true, DeactivationReasons.None); accommodationToUpdate.Id = existingNotValid.HtId; _context.Attach(accommodationToUpdate); var entry = _context.Entry(accommodationToUpdate); // After activation invalids only these fields can be changed entry.Property(ac => ac.IsActive).IsModified = true; entry.Property(ac => ac.Modified).IsModified = true; entry.Property(ac => ac.DeactivationReason).IsModified = true; entry.Property(ac => ac.KeyData).IsModified = true; entry.Property(ac => ac.FinalAccommodation).IsModified = true; entry.Property(ac => ac.LocalityId).IsModified = true; entry.Property(ac => ac.LocalityZoneId).IsModified = true; entry.Property(ac => ac.IsCorrected).IsModified = true; _accommodationsToActivate.Add((new AccommodationData(existingNotValid.HtId, accommodationToUpdate.KeyData.DefaultName, accommodationToUpdate.KeyData.DefaultLocalityName, accommodationToUpdate.KeyData.DefaultCountryName, _country.Code, accommodationToUpdate.KeyData.Coordinates), accommodationToUpdate.LocalityId ?? default)); _accommodationChangeLogCollectorService.CollectActivationEvent(existingNotValid.HtId, AccommodationChangeEventSources.Updater, existingNotValid.DeactivationReason, existingNotValid.KeyData, accommodationToUpdate.KeyData); return; } var dbAccommodation = GetDbAccommodation(accommodation, isActive: true); _accommodationsToAdd.Add(dbAccommodation); }
private bool TryProcessDuplicates(SlimAccommodationData matchedAccommodation, Contracts.MultilingualAccommodation accommodation) { if (_context.ChangeTracker.Entries <RichAccommodationDetails>() .Any(ac => ac.Entity.Id == matchedAccommodation.HtId)) { var entry = _context.ChangeTracker.Entries <RichAccommodationDetails>() .Single(ac => ac.Entity.Id == matchedAccommodation.HtId); _logger.LogSameAccommodationInOneSupplierError(_supplier.ToString(), entry.Entity.SupplierAccommodationCodes[_supplier], accommodation.SupplierCode); if (!_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(accommodation.SupplierCode, out var duplicate)) { ProcessDeactivation(accommodation.SupplierCode, DeactivationReasons.DuplicateInOneSupplier, accommodation); return(true); } _accommodationChangeLogCollectorService.CollectDuplicateAccommodationSupplierCodesMergeEvent(matchedAccommodation.HtId, AccommodationChangeEventSources.Updater, duplicate.HtId, matchedAccommodation.SupplierAccommodationCodes, duplicate.SupplierAccommodationCodes); var duplicateCodes = new Dictionary <string, string>(); foreach (var supplierCode in duplicate.SupplierAccommodationCodes) { if (!entry.Entity.SupplierAccommodationCodes.TryAdd(supplierCode.Key, supplierCode.Value)) { duplicateCodes.Add(supplierCode.Key, supplierCode.Value); } } entry.Entity.IsCorrected = false; entry.Property(p => p.SupplierAccommodationCodes).IsModified = true; entry.Property(p => p.IsCorrected).IsModified = true; DeactivateDuplicate(duplicate, duplicateCodes); return(true); } if (matchedAccommodation.SupplierAccommodationCodes.ContainsKey(_supplier)) { _logger.LogSameAccommodationInOneSupplierError(_supplier, accommodation.SupplierCode, matchedAccommodation.SupplierAccommodationCodes[_supplier]); if (!_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(accommodation.SupplierCode, out var duplicate)) { ProcessDeactivation(accommodation.SupplierCode, DeactivationReasons.DuplicateInOneSupplier, accommodation); return(true); } _accommodationChangeLogCollectorService.CollectDuplicateAccommodationSupplierCodesMergeEvent(matchedAccommodation.HtId, AccommodationChangeEventSources.Updater, duplicate.HtId, matchedAccommodation.SupplierAccommodationCodes, duplicate.SupplierAccommodationCodes); var accommodationToUpdate = new RichAccommodationDetails { Id = matchedAccommodation.HtId, Modified = DateTimeOffset.UtcNow, IsCorrected = false, SupplierAccommodationCodes = matchedAccommodation.SupplierAccommodationCodes }; var duplicateCodes = new Dictionary <string, string>(); foreach (var supplierCode in duplicate.SupplierAccommodationCodes) { if (!accommodationToUpdate.SupplierAccommodationCodes.TryAdd(supplierCode.Key, supplierCode.Value)) { duplicateCodes.Add(supplierCode.Key, supplierCode.Value); } } _context.Attach(accommodationToUpdate); var firstEntry = _context.Entry(accommodationToUpdate); firstEntry.Property(e => e.Modified).IsModified = true; firstEntry.Property(e => e.IsCorrected).IsModified = true; firstEntry.Property(e => e.SupplierAccommodationCodes).IsModified = true; DeactivateDuplicate(duplicate, duplicateCodes); return(true); } return(false); void DeactivateDuplicate(SlimAccommodationData duplicate, Dictionary <string, string> duplicateCodes) { var dbDuplicate = new RichAccommodationDetails { Id = duplicate.HtId, Modified = DateTimeOffset.UtcNow, SupplierAccommodationCodes = duplicateCodes, DeactivationReason = DeactivationReasons.DuplicateInOneSupplier, IsActive = false }; _context.Attach(dbDuplicate); var secondEntry = _context.Entry(dbDuplicate); secondEntry.Property(e => e.Modified).IsModified = true; secondEntry.Property(e => e.SupplierAccommodationCodes).IsModified = true; secondEntry.Property(e => e.IsActive).IsModified = true; secondEntry.Property(e => e.DeactivationReason).IsModified = true; _accommodationsToRemove.Add(duplicate.HtId); _accommodationChangeLogCollectorService.CollectDuplicateAccommodationCommonSuppliersCodesRemoveEvent(duplicate.HtId, AccommodationChangeEventSources.Updater, matchedAccommodation.HtId, duplicate.SupplierAccommodationCodes, matchedAccommodation.SupplierAccommodationCodes); AddOrUpdateHtAccommodationMappings(duplicate.HtId, matchedAccommodation.HtId); } }
public void Update(Contracts.MultilingualAccommodation accommodation, SlimAccommodationData matchedAccommodation) { // This is temporary solution if (TryProcessDuplicates(matchedAccommodation, accommodation)) { return; } var accommodationToUpdate = new RichAccommodationDetails { Id = matchedAccommodation.HtId, Modified = DateTimeOffset.UtcNow, IsCorrected = false, SupplierAccommodationCodes = matchedAccommodation.SupplierAccommodationCodes }; _context.Accommodations.Attach(accommodationToUpdate); _context.Entry(accommodationToUpdate).Property(p => p.IsCorrected).IsModified = true; _context.Entry(accommodationToUpdate).Property(p => p.Modified).IsModified = true; if (_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(accommodation.SupplierCode, out var existingAccommodation)) { Merge(existingAccommodation); } else if (_accommodationDataStorage.SupplierInvalidAccommodations.TryGetValue(accommodation.SupplierCode, out var existingInvalidAccommodation)) { Merge(existingInvalidAccommodation); } else { _accommodationChangeLogCollectorService.CollectNewSupplierAdditionEvent(accommodationToUpdate.Id, AccommodationChangeEventSources.Updater, matchedAccommodation.SupplierAccommodationCodes, _supplier, accommodation.SupplierCode); accommodationToUpdate.SupplierAccommodationCodes.Add(_supplier, accommodation.SupplierCode); } _context.Entry(accommodationToUpdate).Property(p => p.SupplierAccommodationCodes).IsModified = true; void FindAndDeactivateUncertainMatch(int firstHtId, int secondHtId) { var existingUncertainMatch = _accommodationDataStorage.ActiveUncertainMatches .FirstOrDefault(eum => eum.Value.Equals(new(firstHtId, secondHtId)) || eum.Value.Equals(new(secondHtId, firstHtId))); if (existingUncertainMatch.Key != default) { var uncertainMatchToDeactivate = new AccommodationUncertainMatches { Id = existingUncertainMatch.Key, IsActive = false, Modified = DateTimeOffset.UtcNow }; _context.Attach(uncertainMatchToDeactivate); var entry = _context.Entry(uncertainMatchToDeactivate); entry.Property(um => um.IsActive).IsModified = true; entry.Property(um => um.Modified).IsModified = true; } } void Merge(SlimAccommodationData existing) { ProcessDeactivation(accommodation.SupplierCode, DeactivationReasons.MatchingWithOther, accommodation); _accommodationChangeLogCollectorService.CollectMergeEvent(accommodationToUpdate.Id, AccommodationChangeEventSources.Updater, existing.HtId, matchedAccommodation.SupplierAccommodationCodes, existing.SupplierAccommodationCodes); foreach (var supplierCode in existing.SupplierAccommodationCodes) { accommodationToUpdate.SupplierAccommodationCodes.TryAdd(supplierCode.Key, supplierCode.Value); } AddOrUpdateHtAccommodationMappings(existing.HtId, matchedAccommodation.HtId); FindAndDeactivateUncertainMatch(matchedAccommodation.HtId, existing.HtId); } }