Skip to content

Commit 5ef002f

Browse files
committed
Fix commit b7ab0de
1 parent 45b8a33 commit 5ef002f

2 files changed

Lines changed: 72 additions & 57 deletions

File tree

Messages/SubscriptionHolder.cs

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public class SubscriptionHolder<TSubcription, TSession, TRequestId>(ILogReceiver
5959
private readonly ILogReceiver _logs = logs ?? throw new ArgumentNullException(nameof(logs));
6060

6161
/// <summary>
62-
/// Get subscription for the specified session.
62+
/// Get subscriptions for the specified session.
6363
/// </summary>
6464
/// <param name="session">Session.</param>
6565
/// <returns>Subscriptions.</returns>
@@ -122,7 +122,7 @@ public void AddUnsubscribeRequest(long transactionId, long originalTransactionId
122122
}
123123

124124
/// <summary>
125-
/// Remove session.
125+
/// Remove all subscriptions for the specified session.
126126
/// </summary>
127127
/// <param name="session">Session.</param>
128128
/// <returns>Subscriptions.</returns>
@@ -196,12 +196,13 @@ void tryRemove<TKey>(SynchronizedDictionary<TKey, CachedSynchronizedSet<TSubcrip
196196
}
197197

198198
/// <summary>
199-
/// Try get subscription by the specified identifier.
199+
/// Try to get a subscription by the specified identifier.
200200
/// </summary>
201201
/// <param name="id">Identifier.</param>
202-
/// <returns>Subscription.</returns>
203-
public TSubcription TryGetById(long id)
204-
=> _subscriptionsById.TryGetValue(id);
202+
/// <param name="info">The found subscription, if any.</param>
203+
/// <returns><see langword="true"/> if a subscription with the specified identifier exists; otherwise, <see langword="false"/>.</returns>
204+
public bool TryGetById(long id, out TSubcription info)
205+
=> _subscriptionsById.TryGetValue(id, out info);
205206

206207
/// <summary>
207208
/// Clear state.
@@ -217,44 +218,41 @@ public void Clear()
217218
}
218219

219220
/// <summary>
220-
/// Determines has subscription for the specified data type and security.
221+
/// Determines whether any subscription exists for the specified data type and security.
221222
/// </summary>
222223
/// <param name="dataType">Data type info.</param>
223224
/// <param name="securityId">Security ID.</param>
224-
/// <returns>Check result.</returns>
225+
/// <returns><see langword="true"/> if any subscription exists; otherwise, <see langword="false"/>.</returns>
225226
public bool HasSubscriptions(DataType dataType, SecurityId securityId)
226227
{
227228
var receivers = _subscriptionsByAllSec.TryGetValue(dataType) ?? _subscriptionsBySec.TryGetValue((dataType, securityId));
228229
return receivers != null && receivers.Count > 0;
229230
}
230231

231232
/// <summary>
232-
/// Try get and stop subscription by the specified identifier.
233+
/// Try to get the subscription by the specified identifier and set its state to <see cref="SubscriptionStates.Stopped"/>.
233234
/// </summary>
234235
/// <param name="id">Identifier.</param>
235-
/// <returns>Subscription.</returns>
236-
public TSubcription TryGetSubscriptionAndStop(long id)
237-
=> TryGetSubscription(id, SubscriptionStates.Stopped);
236+
/// <param name="info">The found subscription, if any.</param>
237+
/// <returns><see langword="true"/> if the subscription was found; otherwise, <see langword="false"/>.</returns>
238+
public bool TryGetSubscriptionAndStop(long id, out TSubcription info)
239+
=> TryGetSubscription(id, SubscriptionStates.Stopped, out info);
238240

239241
/// <summary>
240-
/// Try get subscription by the specified identifier and swith into new state.
242+
/// Try to get the subscription by the specified identifier and switch to a new state if specified.
241243
/// </summary>
242244
/// <param name="id">Identifier.</param>
243-
/// <param name="state">State.</param>
244-
/// <returns>Subscription.</returns>
245-
public TSubcription TryGetSubscription(long id, SubscriptionStates? state)
245+
/// <param name="state">The state to set for the subscription, or <see langword="null"/> to leave unchanged.</param>
246+
/// <param name="info">The found subscription, if any.</param>
247+
/// <returns><see langword="true"/> if the subscription was found; otherwise, <see langword="false"/>.</returns>
248+
public bool TryGetSubscription(long id, SubscriptionStates? state, out TSubcription info)
246249
{
247-
if (id == 0)
248-
return null;
249-
250-
var info = TryGetById(id);
251-
252-
if (info == null)
250+
if (!TryGetById(id, out info))
253251
{
254252
if (_nonFoundSubscriptions.TryAdd(id))
255253
_logs.AddWarningLog(LocalizedStrings.SubscriptionNonExist, id);
256254

257-
return null;
255+
return false;
258256
}
259257

260258
if (state != null)
@@ -266,7 +264,7 @@ public TSubcription TryGetSubscription(long id, SubscriptionStates? state)
266264
if (state?.IsActive() == false)
267265
Remove(info);
268266

269-
return info;
267+
return true;
270268
}
271269

272270
private IEnumerable<TSubcription> GetSubscriptions(MessageTypes type, long id)
@@ -280,7 +278,9 @@ private IEnumerable<TSubcription> GetSubscriptions(MessageTypes type, long id)
280278
_ => null,
281279
};
282280

283-
return ToSet(TryGetSubscription(id, state));
281+
return TryGetSubscription(id, state, out var sub)
282+
? ToSet(sub)
283+
: [];
284284
}
285285

286286
return _subscriptionsByType.TryGetValue(type)?.Cache.Where(i => !i.Suspend) ?? [];
@@ -292,7 +292,9 @@ private static IEnumerable<TSubcription> ToSet(TSubcription info, bool checkSusp
292292
private IEnumerable<TSubcription> GetSubscriptions(DataType dataType, SecurityId securityId, long id)
293293
{
294294
if (id != 0)
295-
return ToSet(TryGetSubscription(id, null));
295+
return TryGetSubscription(id, null, out var sub)
296+
? ToSet(sub)
297+
: [];
296298

297299
if (dataType is null)
298300
return [];
@@ -325,9 +327,7 @@ public IEnumerable<TSubcription> GetSubscriptions(Message message)
325327
return GetSubscriptions(execMsg.DataType, execMsg.SecurityId, originTransId);
326328
else if (execMsg.DataType == DataType.Transactions)
327329
{
328-
var subscription = TryGetById(originTransId);
329-
330-
if (subscription == null)
330+
if (!TryGetById(originTransId, out var subscription))
331331
return [];
332332

333333
if (execMsg.TransactionId != 0)
@@ -356,11 +356,17 @@ public IEnumerable<TSubcription> GetSubscriptions(Message message)
356356
TSubcription info;
357357

358358
if (_unsubscribeRequests.TryGetAndRemove(originId, out var subscriptionId))
359-
info = TryGetSubscription(subscriptionId, SubscriptionStates.Stopped);
359+
{
360+
return TryGetSubscription(subscriptionId, SubscriptionStates.Stopped, out info)
361+
? ToSet(info, false)
362+
: [];
363+
}
360364
else
361-
info = TryGetSubscription(originId, responseMsg.IsOk() ? SubscriptionStates.Active : SubscriptionStates.Error);
362-
363-
return ToSet(info, false);
365+
{
366+
return TryGetSubscription(originId, responseMsg.IsOk() ? SubscriptionStates.Active : SubscriptionStates.Error, out info)
367+
? ToSet(info, false)
368+
: [];
369+
}
364370
}
365371

366372
default:

Tests/SubscriptionHolderTests.cs

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public void Add_ValidSubscription_CanRetrieveById()
6161

6262
holder.Add(subscription);
6363

64-
var retrieved = holder.TryGetById(1);
64+
holder.TryGetById(1, out var retrieved).AssertTrue();
6565
retrieved.AssertNotNull();
6666
retrieved.Id.AssertEqual(1);
6767
}
@@ -78,9 +78,9 @@ public void Add_MultipleSubscriptions_AllRetrievable()
7878
holder.Add(sub2);
7979
holder.Add(sub3);
8080

81-
holder.TryGetById(1).AssertNotNull();
82-
holder.TryGetById(2).AssertNotNull();
83-
holder.TryGetById(3).AssertNotNull();
81+
holder.TryGetById(1, out _).AssertTrue();
82+
holder.TryGetById(2, out _).AssertTrue();
83+
holder.TryGetById(3, out _).AssertTrue();
8484
}
8585

8686
[TestMethod]
@@ -91,7 +91,7 @@ public void Add_SubscriptionWithAllSecurity_Stored()
9191

9292
holder.Add(subscription);
9393

94-
holder.TryGetById(1).AssertNotNull();
94+
holder.TryGetById(1, out _).AssertTrue();
9595
}
9696

9797
#endregion
@@ -144,9 +144,10 @@ public void GetSubscriptions_FiltersBySession()
144144
public void TryGetById_NotFound_ReturnsNull()
145145
{
146146
var holder = CreateHolder();
147-
var result = holder.TryGetById(999);
147+
var result = holder.TryGetById(999, out var notFound);
148148

149-
result.AssertNull();
149+
result.AssertFalse();
150+
notFound.AssertNull();
150151
}
151152

152153
[TestMethod]
@@ -157,7 +158,7 @@ public void TryGetById_Found_ReturnsSubscription()
157158

158159
holder.Add(subscription);
159160

160-
var result = holder.TryGetById(100);
161+
holder.TryGetById(100, out var result).AssertTrue();
161162
result.AssertNotNull();
162163
result.Id.AssertEqual(100);
163164
result.Session.AssertEqual("session1");
@@ -171,8 +172,9 @@ public void TryGetById_Found_ReturnsSubscription()
171172
public void TryGetSubscription_NotFound_ReturnsNull()
172173
{
173174
var holder = CreateHolder();
174-
var result = holder.TryGetSubscription(999, SubscriptionStates.Active);
175+
var ok = holder.TryGetSubscription(999, SubscriptionStates.Active, out var result);
175176

177+
ok.AssertFalse();
176178
result.AssertNull();
177179
}
178180

@@ -184,7 +186,7 @@ public void TryGetSubscription_NullState_ReturnsSubscription()
184186

185187
holder.Add(subscription);
186188

187-
var result = holder.TryGetSubscription(1, null);
189+
holder.TryGetSubscription(1, null, out var result).AssertTrue();
188190
result.AssertNotNull();
189191
}
190192

@@ -196,7 +198,7 @@ public void TryGetSubscription_MatchingState_ReturnsSubscription()
196198

197199
holder.Add(subscription);
198200

199-
var result = holder.TryGetSubscription(1, SubscriptionStates.Active);
201+
holder.TryGetSubscription(1, SubscriptionStates.Active, out var result).AssertTrue();
200202
result.AssertNotNull();
201203
}
202204

@@ -208,8 +210,9 @@ public void TryGetSubscription_MatchingState_ReturnsSubscription()
208210
public void TryGetSubscriptionAndStop_NotFound_ReturnsNull()
209211
{
210212
var holder = CreateHolder();
211-
var result = holder.TryGetSubscriptionAndStop(999);
213+
var ok = holder.TryGetSubscriptionAndStop(999, out var result);
212214

215+
ok.AssertFalse();
213216
result.AssertNull();
214217
}
215218

@@ -221,7 +224,7 @@ public void TryGetSubscriptionAndStop_Found_ReturnsAndChangesState()
221224

222225
holder.Add(subscription);
223226

224-
var result = holder.TryGetSubscriptionAndStop(1);
227+
holder.TryGetSubscriptionAndStop(1, out var result).AssertTrue();
225228
result.AssertNotNull();
226229
result.State.AssertEqual(SubscriptionStates.Stopped);
227230
}
@@ -237,11 +240,12 @@ public void Remove_BySubscription_RemovesFromHolder()
237240
var subscription = CreateSubscription(1, "session1", new SecurityId { SecurityCode = "AAPL" }, DataType.Ticks);
238241

239242
holder.Add(subscription);
240-
holder.TryGetById(1).AssertNotNull();
243+
holder.TryGetById(1, out _).AssertTrue();
241244

242245
holder.Remove(subscription);
243246

244-
holder.TryGetById(1).AssertNull();
247+
holder.TryGetById(1, out var shouldBeNull).AssertFalse();
248+
shouldBeNull.AssertNull();
245249
}
246250

247251
[TestMethod]
@@ -266,9 +270,11 @@ public void Remove_BySession_RemovesAllForSession()
266270
var removed = holder.Remove("session1").ToArray();
267271

268272
removed.Length.AssertEqual(2);
269-
holder.TryGetById(1).AssertNull();
270-
holder.TryGetById(2).AssertNull();
271-
holder.TryGetById(3).AssertNotNull();
273+
holder.TryGetById(1, out var _c1).AssertFalse();
274+
_c1.AssertNull();
275+
holder.TryGetById(2, out var _c2).AssertFalse();
276+
_c2.AssertNull();
277+
holder.TryGetById(3, out _).AssertTrue();
272278
}
273279

274280
[TestMethod]
@@ -303,8 +309,10 @@ public void Clear_RemovesAllSubscriptions()
303309

304310
holder.Clear();
305311

306-
holder.TryGetById(1).AssertNull();
307-
holder.TryGetById(2).AssertNull();
312+
holder.TryGetById(1, out var _a).AssertFalse();
313+
_a.AssertNull();
314+
holder.TryGetById(2, out var _b).AssertFalse();
315+
_b.AssertNull();
308316
holder.GetSubscriptions((string)"session1").Count().AssertEqual(0);
309317
holder.GetSubscriptions((string)"session2").Count().AssertEqual(0);
310318
}
@@ -387,7 +395,7 @@ public void SubscriptionChanged_TriggeredOnStateChange()
387395
TestSubscription changedSub = null;
388396
holder.SubscriptionChanged += (sub) => changedSub = sub;
389397

390-
holder.TryGetSubscriptionAndStop(1);
398+
holder.TryGetSubscriptionAndStop(1, out _);
391399

392400
changedSub.AssertNotNull();
393401
changedSub.Id.AssertEqual(1);
@@ -416,8 +424,9 @@ public void MultipleSessions_IsolatedCorrectly()
416424

417425
holder.Remove("session1");
418426

419-
holder.TryGetById(1).AssertNull();
420-
holder.TryGetById(2).AssertNotNull();
427+
holder.TryGetById(1, out var _c3).AssertFalse();
428+
_c3.AssertNull();
429+
holder.TryGetById(2, out _).AssertTrue();
421430
}
422431

423432
#endregion
@@ -434,7 +443,7 @@ public void Add_DuplicateId_SecondOverwritesFirst()
434443
holder.Add(sub1);
435444
Assert.ThrowsExactly<ArgumentException>(() => holder.Add(sub2));
436445

437-
var retrieved = holder.TryGetById(1);
446+
holder.TryGetById(1, out var retrieved).AssertTrue();
438447
retrieved.AssertNotNull();
439448
// Should be the second subscription
440449
retrieved.Session.AssertEqual("session1");

0 commit comments

Comments
 (0)