Skip to content

Commit 96340a0

Browse files
authored
Change resource id to resource key in import (#5494)
1 parent 5a36613 commit 96340a0

1 file changed

Lines changed: 14 additions & 22 deletions

File tree

src/Microsoft.Health.Fhir.SqlServer/Features/Storage/SqlServerFhirDataStore.cs

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -604,12 +604,12 @@ List<string> GetErrors(IReadOnlyCollection<ImportResource> dups, IReadOnlyCollec
604604
List<ImportResource> RemoveVersionOutOfSyncWithLastUpdatedConflicts(IEnumerable<ImportResource> inputs)
605605
{
606606
// Remove conflicts where versions and last updated are out of order
607-
var prevResourceId = string.Empty;
607+
ResourceKey prevResourceKey = null;
608608
var prevVersion = int.MaxValue;
609609
var inputsWithVersion = new List<ImportResource>();
610-
foreach (var input in inputs.OrderBy(_ => _.ResourceWrapper.ResourceId).ThenByDescending(_ => _.ResourceWrapper.LastModified))
610+
foreach (var input in inputs.OrderBy(_ => _.ResourceWrapper.ToResourceKey(true)).ThenByDescending(_ => _.ResourceWrapper.LastModified))
611611
{
612-
if (prevResourceId != input.ResourceWrapper.ResourceId)
612+
if (prevResourceKey != input.ResourceWrapper.ToResourceKey(true))
613613
{
614614
prevVersion = int.MaxValue;
615615
}
@@ -638,7 +638,7 @@ List<ImportResource> RemoveVersionOutOfSyncWithLastUpdatedConflicts(IEnumerable<
638638
inputsWithVersion.Add(input);
639639
}
640640

641-
prevResourceId = input.ResourceWrapper.ResourceId;
641+
prevResourceKey = input.ResourceWrapper.ToResourceKey(true);
642642
prevVersion = inputVersion;
643643
}
644644

@@ -714,10 +714,10 @@ async Task MergeUnversioned(List<ImportResource> inputs, bool keepLastUpdated, b
714714
// Ensure that the imported resources can "fit" in the db. We want to keep versionId alinged to lastUpdated and sequential if possible.
715715
// Note: surrogate id is populated from last updated by ToResourceDateKey(), therefore we can trust this value as part of dictionary key.
716716
var versionSlots = (await StoreClient.GetResourceVersionsAsync(inputsNoVersionForCheck.Select(_ => _.ResourceWrapper.ToResourceDateKey(_model.GetResourceTypeId, true)).ToList(), _compressedRawResourceConverter.ReadCompressedRawResource, cancellationToken)).ToDictionary(_ => new ResourceDateKey(_.Key.ResourceTypeId, _.Key.Id, _.Key.ResourceSurrogateId, null), _ => _);
717-
foreach (var input in inputsNoVersionForCheck.OrderBy(_ => _.ResourceWrapper.ResourceId).ThenByDescending(_ => _.ResourceWrapper.LastModified))
717+
foreach (var input in inputsNoVersionForCheck.OrderBy(_ => _.ResourceWrapper.ToResourceKey(true)).ThenByDescending(_ => _.ResourceWrapper.LastModified))
718718
{
719-
var resourceKey = input.ResourceWrapper.ToResourceDateKey(_model.GetResourceTypeId, true);
720-
versionSlots.TryGetValue(resourceKey, out var existing);
719+
var resourceDateKey = input.ResourceWrapper.ToResourceDateKey(_model.GetResourceTypeId, true);
720+
versionSlots.TryGetValue(resourceDateKey, out var existing);
721721
input.KeepVersion = true;
722722
var versionIdInt = int.Parse(existing.Key.VersionId);
723723
if (versionIdInt == 0) // though this check was done above, racing conditions can stil lead to extra matches
@@ -751,38 +751,30 @@ async Task MergeUnversioned(List<ImportResource> inputs, bool keepLastUpdated, b
751751
var inputNoConflict = inputs.Except(conflicts).Except(loaded);
752752

753753
// Make sure that version is incremented taking into account current state in the database.
754-
var prevResourceId = string.Empty;
754+
ResourceKey prevResourceKey = null;
755755
var version = 0;
756-
foreach (var input in inputNoConflict.Where(_ => _.KeepLastUpdated && !_.KeepVersion).OrderBy(_ => _.ResourceWrapper.ResourceId).ThenBy(_ => _.ResourceWrapper.LastModified))
756+
foreach (var input in inputNoConflict.Where(_ => _.KeepLastUpdated && !_.KeepVersion).OrderBy(_ => _.ResourceWrapper.ToResourceKey(true)).ThenBy(_ => _.ResourceWrapper.LastModified))
757757
{
758-
if (prevResourceId != input.ResourceWrapper.ResourceId)
758+
if (prevResourceKey != input.ResourceWrapper.ToResourceKey(true))
759759
{
760760
version = currentInDb.TryGetValue(input.ResourceWrapper.ToResourceKey(true), out var current) ? int.Parse(current.Version) : 0;
761761
}
762762

763763
input.ResourceWrapper.Version = (++version).ToString();
764764
input.KeepVersion = true;
765-
prevResourceId = input.ResourceWrapper.ResourceId;
765+
prevResourceKey = input.ResourceWrapper.ToResourceKey(true);
766766
}
767767

768768
// Finally merge the resources to the db.
769-
await Merge(inputNoConflict.OrderBy(_ => _.ResourceWrapper.ResourceId).ThenByDescending(_ => int.Parse(_.ResourceWrapper.Version)), keepLastUpdated, useReplicasForReads);
769+
await Merge(inputNoConflict.OrderBy(_ => _.ResourceWrapper.ToResourceKey(true)).ThenByDescending(_ => int.Parse(_.ResourceWrapper.Version)), keepLastUpdated, useReplicasForReads);
770770
loaded.AddRange(inputNoConflict);
771771
}
772772
}
773773

774774
async Task Merge(IEnumerable<ImportResource> resources, bool keepLastUpdated, bool useReplicasForReads)
775775
{
776-
var input = resources.Select(_ => new ResourceWrapperOperation(_.ResourceWrapper, true, true, null, requireETagOnUpdate: false, keepVersion: _.KeepVersion, bundleResourceContext: null)).ToList();
777-
await MergeInternalAsync(
778-
resources: input,
779-
keepLastUpdated,
780-
keepAllDeleted: true,
781-
enlistInTransaction: false,
782-
useReplicasForReads,
783-
eventualConsistency,
784-
ensureAtomicOperations: false,
785-
cancellationToken);
776+
var input = resources.Select(_ => new ResourceWrapperOperation(_.ResourceWrapper, true, true, null, false, _.KeepVersion, null)).ToList();
777+
await MergeInternalAsync(input, keepLastUpdated, true, false, useReplicasForReads, eventualConsistency, false, cancellationToken);
786778
}
787779
}
788780

0 commit comments

Comments
 (0)