Skip to content

Commit 9a01f50

Browse files
committed
Fix: Correct index calculation for FahrenTransferEntry.
The previous implementation incorrectly calculated the new index when correcting override indices, leading to incorrect placement of entries. This commit corrects the index calculation logic and ensures that entries are inserted at the correct positions based on their override indices. Additionally, it addresses an issue where duplicate entries were not handled correctly during index correction.
1 parent 159fed5 commit 9a01f50

File tree

1 file changed

+65
-20
lines changed

1 file changed

+65
-20
lines changed

Streckenbuch.Server/Services/FahrenService.cs

Lines changed: 65 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,26 @@ public FahrenService(FahrenRepository fahrenRepository, IMapper mapper, Continuo
2929
public override Task<FahrenResponse> FahrenByTrainNumber(FahrenRequestByTrainNumber request, ServerCallContext context)
3030
{
3131
List<FahrenTransferEntry> entries = _fahrenRepository.ListEntriesByLinieTrain(request.LinieTrainId).ToList();
32-
32+
3333
RemoveDuplicates(entries);
3434
CorrectIndices(entries);
35-
35+
3636
FahrenResponse response = new();
3737
response.Entries.AddRange(_mapper.Map<List<FahrenEntry>>(entries));
38+
3839
return Task.FromResult(response);
3940
}
4041

4142
public override Task<FahrenResponse> FahrenByLinie(FahrenRequestByLinie request, ServerCallContext context)
4243
{
4344
List<FahrenTransferEntry> entries = _fahrenRepository.ListEntriesByLinie(request.LinieId).ToList();
44-
45+
4546
RemoveDuplicates(entries);
4647
CorrectIndices(entries);
47-
48+
4849
FahrenResponse response = new();
4950
response.Entries.AddRange(_mapper.Map<List<FahrenEntry>>(entries));
51+
5052
return Task.FromResult(response);
5153
}
5254

@@ -59,10 +61,12 @@ public override Task<FahrenResponse> FahrenByStrecken(FahrenRequestByStrecken re
5961

6062
FahrenResponse response = new();
6163
response.Entries.AddRange(_mapper.Map<List<FahrenEntry>>(entries));
64+
6265
return Task.FromResult(response);
6366
}
6467

65-
private void RemoveDuplicates(List<FahrenTransferEntry> entries) {
68+
private void RemoveDuplicates(List<FahrenTransferEntry> entries)
69+
{
6670
var duplicateEntries = entries.Where(x => x.Betriebspunkt is not null).GroupBy(x => x.Betriebspunkt.Id).Where(x => x.Count() > 1).ToList();
6771

6872
foreach (var item in duplicateEntries)
@@ -90,7 +94,15 @@ private void RemoveDuplicates(List<FahrenTransferEntry> entries) {
9094

9195
private void CorrectIndices(List<FahrenTransferEntry> entries)
9296
{
93-
for (int i = 0; i < entries.Count; i++)
97+
List<Guid> alreadyHandledIds = new();
98+
var originalIndices = entries.Where(x => x.OverrideIndex.HasValue).Select(x =>
99+
new
100+
{
101+
Index = entries.IndexOf(x), Id = x.SignalZuordnung!.SignalId
102+
}
103+
).ToDictionary(x => x.Id, x => x.Index);
104+
105+
for (int i = entries.Count - 1; i >= 0; i--)
94106
{
95107
var currentEntry = entries[i];
96108

@@ -99,51 +111,84 @@ private void CorrectIndices(List<FahrenTransferEntry> entries)
99111
continue;
100112
}
101113

114+
if (currentEntry.OverrideIndex.Value <= 0)
115+
{
116+
continue;
117+
}
118+
119+
if (alreadyHandledIds.Contains(currentEntry.SignalZuordnung!.SignalId))
120+
{
121+
continue;
122+
}
123+
124+
alreadyHandledIds.Add(currentEntry.SignalZuordnung!.SignalId);
125+
102126
int currentEntryOverrideIndex = currentEntry.OverrideIndex.Value;
103-
var newIndex = i + currentEntryOverrideIndex;
127+
int newIndex = originalIndices[currentEntry.SignalZuordnung!.SignalId] + currentEntryOverrideIndex;
128+
129+
entries.Insert(newIndex + 1, currentEntry);
130+
entries.RemoveAt(i);
104131

105-
if (newIndex > i)
132+
i++;
133+
}
134+
135+
for (int i = 0; i < entries.Count; i++)
136+
{
137+
var currentEntry = entries[i];
138+
139+
if (currentEntry.OverrideIndex is null)
106140
{
107-
entries.Insert(newIndex, currentEntry);
108-
entries.RemoveAt(i);
141+
continue;
142+
}
109143

110-
// Da ein Element eingefügt wurde, muss der Index für das nächste Element erhöht werden.
111-
i++;
144+
if (currentEntry.OverrideIndex.Value > 0)
145+
{
146+
continue;
112147
}
113-
else
148+
149+
if (alreadyHandledIds.Contains(currentEntry.SignalZuordnung!.SignalId))
114150
{
115-
entries.Insert(newIndex, currentEntry);
116-
entries.RemoveAt(i + 1);
117-
i--;
151+
continue;
118152
}
153+
154+
alreadyHandledIds.Add(currentEntry.SignalZuordnung!.SignalId);
155+
156+
int currentEntryOverrideIndex = currentEntry.OverrideIndex.Value;
157+
int newIndex = originalIndices[currentEntry.SignalZuordnung!.SignalId] + currentEntryOverrideIndex;
158+
159+
entries.Insert(newIndex, currentEntry);
160+
entries.RemoveAt(i + 1);
161+
162+
i--;
119163
}
120164
}
121165

122166
public override Task<CaptureMessageResponse> CaptureRealtimeMessages(CaptureMessage request, ServerCallContext context)
123167
{
124168
CaptureMessageResponse response = new();
125169
response.Messages.AddRange(_continuousConnection.GetMessagesInQueue(request.ClientId));
170+
126171
return Task.FromResult(response);
127172
}
128173

129174
public override Task<Empty> RegisterOnTrain(RegisterOnTrainRequest request, ServerCallContext context)
130175
{
131176
_continuousConnection.RegisterTrain(request.ClientId, request.TrainNumber);
132-
177+
133178
return Task.FromResult(new Empty());
134179
}
135180

136181
public override Task<Empty> UnregisterOnTrain(UnregisterOnTrainRequest request, ServerCallContext context)
137182
{
138183
_continuousConnection.UnregisterTrain(request.ClientId);
139-
184+
140185
return Task.FromResult(new Empty());
141186
}
142187

143188
public override Task<Empty> DisconnectClient(DisconnectClientRequest request, ServerCallContext context)
144189
{
145190
_continuousConnection.DisconnectTrainOperator(request.ClientId);
146-
191+
147192
return Task.FromResult(new Empty());
148193
}
149194

@@ -163,4 +208,4 @@ private List<FahrenTransferEntry> GetTrimmedEntries(FahrenRequestStrecke strecke
163208

164209
return entries;
165210
}
166-
}
211+
}

0 commit comments

Comments
 (0)