Skip to content

Commit c6f6491

Browse files
committed
Count query statuses more accurately
1 parent b55e08f commit c6f6491

File tree

3 files changed

+93
-25
lines changed

3 files changed

+93
-25
lines changed

src/Middleware/QueryCountMiddleware.php

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Plasma\SQL\QueryBuilder;
77
use React\Promise\PromiseInterface;
88
use Rx\Observable;
9+
use Rx\Subject\Subject;
910
use Throwable;
1011
use WyriHaximus\React\SimpleORM\MiddlewareInterface;
1112
use function React\Promise\reject;
@@ -27,6 +28,9 @@ final class QueryCountMiddleware implements MiddlewareInterface
2728
/** @var int */
2829
private $slowCount = self::ZERO;
2930

31+
/** @var int */
32+
private $completedCount = self::ZERO;
33+
3034
/** @var int */
3135
private $slowQueryTime;
3236

@@ -42,21 +46,47 @@ public function query(QueryBuilder $query, callable $next): PromiseInterface
4246
$startTime = hrtime()[0];
4347

4448
return resolve($next($query))->then(function (Observable $observable) use ($startTime): PromiseInterface {
45-
$this->successfulCount++;
46-
47-
if (hrtime()[0] - $startTime > $this->slowQueryTime) {
48-
$this->slowCount++;
49-
}
50-
51-
return resolve($observable);
52-
}, function (Throwable $throwable) use ($startTime): PromiseInterface {
53-
$this->erroredCount++;
54-
55-
if (hrtime()[0] - $startTime > $this->slowQueryTime) {
56-
$this->slowCount++;
57-
}
58-
59-
return reject($throwable);
49+
return resolve(Observable::defer(function () use ($observable, $startTime) {
50+
$handledInitialRow = false;
51+
$subject = new Subject();
52+
$observable->subscribe(
53+
function (array $row) use ($subject, $startTime, &$handledInitialRow): void {
54+
$subject->onNext($row);
55+
56+
if ($handledInitialRow === true) {
57+
return;
58+
}
59+
60+
$this->successfulCount++;
61+
62+
if (hrtime()[0] - $startTime > $this->slowQueryTime) {
63+
$this->slowCount++;
64+
}
65+
66+
$handledInitialRow = true;
67+
},
68+
function (Throwable $throwable) use ($startTime, $subject): void {
69+
$this->erroredCount++;
70+
71+
if (hrtime()[0] - $startTime > $this->slowQueryTime) {
72+
$this->slowCount++;
73+
}
74+
75+
$subject->onError($throwable);
76+
},
77+
function () use ($subject, &$handledInitialRow): void {
78+
$this->completedCount++;
79+
$subject->onCompleted();
80+
81+
if ($handledInitialRow === true) {
82+
return;
83+
}
84+
85+
$this->successfulCount++;
86+
},
87+
);
88+
return $subject;
89+
}));
6090
});
6191
}
6292

@@ -66,6 +96,7 @@ public function getCounters(): iterable
6696
yield 'successful' => $this->successfulCount;
6797
yield 'errored' => $this->erroredCount;
6898
yield 'slow' => $this->slowCount;
99+
yield 'completed' => $this->completedCount;
69100
}
70101

71102
public function resetCounters(): void
@@ -74,5 +105,6 @@ public function resetCounters(): void
74105
$this->successfulCount = self::ZERO;
75106
$this->erroredCount = self::ZERO;
76107
$this->slowCount = self::ZERO;
108+
$this->completedCount = self::ZERO;
77109
}
78110
}

tests/FunctionalTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public function usersCount(): void
7777
'successful' => 1,
7878
'errored' => 0,
7979
'slow' => 0,
80+
'completed' => 1,
8081
], iteratorOrArrayToArray($this->counter->getCounters()));
8182
}
8283

@@ -98,6 +99,7 @@ public function usersCountResultSet(): void
9899
'successful' => 1,
99100
'errored' => 0,
100101
'slow' => 0,
102+
'completed' => 1,
101103
], iteratorOrArrayToArray($this->counter->getCounters()));
102104
}
103105

@@ -119,6 +121,7 @@ public function blogPostsCount(): void
119121
'successful' => 1,
120122
'errored' => 0,
121123
'slow' => 0,
124+
'completed' => 1,
122125
], iteratorOrArrayToArray($this->counter->getCounters()));
123126
}
124127

@@ -140,6 +143,7 @@ public function blogPostsCountResultSet(): void
140143
'successful' => 1,
141144
'errored' => 0,
142145
'slow' => 0,
146+
'completed' => 1,
143147
], iteratorOrArrayToArray($this->counter->getCounters()));
144148
}
145149

@@ -163,6 +167,7 @@ public function firstBlogPostCommentCount(): void
163167
'successful' => 2,
164168
'errored' => 0,
165169
'slow' => 0,
170+
'completed' => 2,
166171
], iteratorOrArrayToArray($this->counter->getCounters()));
167172
}
168173

@@ -186,6 +191,7 @@ public function firstBlogPostAuthorId(): void
186191
'successful' => 1,
187192
'errored' => 0,
188193
'slow' => 0,
194+
'completed' => 1,
189195
], iteratorOrArrayToArray($this->counter->getCounters()));
190196
}
191197

@@ -209,6 +215,7 @@ public function firstBlogPostAuthorIdUsingLimit(): void
209215
'successful' => 1,
210216
'errored' => 0,
211217
'slow' => 0,
218+
'completed' => 1,
212219
], iteratorOrArrayToArray($this->counter->getCounters()));
213220
}
214221

@@ -242,6 +249,7 @@ function (CommentStub $comment) {
242249
'successful' => 2,
243250
'errored' => 0,
244251
'slow' => 0,
252+
'completed' => 2,
245253
], iteratorOrArrayToArray($this->counter->getCounters()));
246254
}
247255

@@ -265,6 +273,7 @@ public function firstBlogPostNextBlogPostResolvesToBlogPost(): void
265273
'successful' => 2,
266274
'errored' => 0,
267275
'slow' => 0,
276+
'completed' => 2,
268277
], iteratorOrArrayToArray($this->counter->getCounters()));
269278
}
270279

@@ -288,6 +297,7 @@ public function firstBlogPostPreviousBlogPostResolvesToNull(): void
288297
'successful' => 1,
289298
'errored' => 0,
290299
'slow' => 0,
300+
'completed' => 1,
291301
], iteratorOrArrayToArray($this->counter->getCounters()));
292302
}
293303

@@ -313,6 +323,7 @@ public function secondBlogPostCommentCount(): void
313323
'successful' => 2,
314324
'errored' => 0,
315325
'slow' => 0,
326+
'completed' => 2,
316327
], iteratorOrArrayToArray($this->counter->getCounters()));
317328
}
318329

@@ -338,6 +349,7 @@ public function secondBlogPostAuthorId(): void
338349
'successful' => 1,
339350
'errored' => 0,
340351
'slow' => 0,
352+
'completed' => 1,
341353
], iteratorOrArrayToArray($this->counter->getCounters()));
342354
}
343355

@@ -372,6 +384,7 @@ function (CommentStub $comment) {
372384
'successful' => 2,
373385
'errored' => 0,
374386
'slow' => 0,
387+
'completed' => 2,
375388
], iteratorOrArrayToArray($this->counter->getCounters()));
376389
}
377390

@@ -399,6 +412,7 @@ public function secondBlogPostPreviousBlogPostAuthorId(): void
399412
'successful' => 2,
400413
'errored' => 0,
401414
'slow' => 0,
415+
'completed' => 2,
402416
], iteratorOrArrayToArray($this->counter->getCounters()));
403417
}
404418

@@ -424,6 +438,7 @@ public function secondBlogPostNextBlogPostResolvesToNull(): void
424438
'successful' => 1,
425439
'errored' => 0,
426440
'slow' => 0,
441+
'completed' => 1,
427442
], iteratorOrArrayToArray($this->counter->getCounters()));
428443
}
429444

@@ -449,6 +464,7 @@ public function createUser(): void
449464
'successful' => 2,
450465
'errored' => 0,
451466
'slow' => 0,
467+
'completed' => 2,
452468
], iteratorOrArrayToArray($this->counter->getCounters()));
453469
}
454470

@@ -491,6 +507,7 @@ public function increaseViews(): void
491507
'successful' => 3,
492508
'errored' => 0,
493509
'slow' => 0,
510+
'completed' => 3,
494511
], iteratorOrArrayToArray($this->counter->getCounters()));
495512
}
496513

@@ -519,6 +536,7 @@ public function userSelf(): void
519536
'successful' => 2,
520537
'errored' => 0,
521538
'slow' => 0,
539+
'completed' => 2,
522540
], iteratorOrArrayToArray($this->counter->getCounters()));
523541
}
524542
}

tests/Middleware/QueryCountMiddlewareTest.php

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
use Plasma\SQL\QueryBuilder;
66
use React\Promise\Deferred;
77
use React\Promise\PromiseInterface;
8+
use Rx\Subject\Subject;
89
use WyriHaximus\AsyncTestUtilities\AsyncTestCase;
910
use WyriHaximus\React\SimpleORM\Middleware\ExecuteQueryMiddleware;
1011
use WyriHaximus\React\SimpleORM\Middleware\QueryCountMiddleware;
1112
use function ApiClients\Tools\Rx\observableFromArray;
13+
use function ApiClients\Tools\Rx\unwrapObservableFromPromise;
1214
use function Safe\sleep;
1315
use function WyriHaximus\iteratorOrArrayToArray;
1416

@@ -26,28 +28,31 @@ public function testCountingSuccess(): void
2628
'successful' => 0,
2729
'errored' => 0,
2830
'slow' => 0,
31+
'completed' => 0,
2932
], iteratorOrArrayToArray($middleware->getCounters()));
3033

3134
$deferred = new Deferred();
3235

33-
$middleware->query(QueryBuilder::create(), function () use ($deferred): PromiseInterface {
36+
unwrapObservableFromPromise($middleware->query(QueryBuilder::create(), function () use ($deferred): PromiseInterface {
3437
return $deferred->promise();
35-
});
38+
}))->subscribe(function () {}, function () {});
3639

3740
self::assertSame([
3841
'initiated' => 1,
3942
'successful' => 0,
4043
'errored' => 0,
4144
'slow' => 0,
45+
'completed' => 0,
4246
], iteratorOrArrayToArray($middleware->getCounters()));
4347

44-
$deferred->resolve(observableFromArray([]));
48+
$deferred->resolve(observableFromArray([[]]));
4549

4650
self::assertSame([
4751
'initiated' => 1,
4852
'successful' => 1,
4953
'errored' => 0,
5054
'slow' => 0,
55+
'completed' => 1,
5156
], iteratorOrArrayToArray($middleware->getCounters()));
5257

5358
$middleware->resetCounters();
@@ -57,6 +62,7 @@ public function testCountingSuccess(): void
5762
'successful' => 0,
5863
'errored' => 0,
5964
'slow' => 0,
65+
'completed' => 0,
6066
], iteratorOrArrayToArray($middleware->getCounters()));
6167
}
6268

@@ -69,28 +75,33 @@ public function testCountingError(): void
6975
'successful' => 0,
7076
'errored' => 0,
7177
'slow' => 0,
78+
'completed' => 0,
7279
], iteratorOrArrayToArray($middleware->getCounters()));
7380

7481
$deferred = new Deferred();
7582

76-
$middleware->query(QueryBuilder::create(), function () use ($deferred): PromiseInterface {
83+
unwrapObservableFromPromise($middleware->query(QueryBuilder::create(), function () use ($deferred): PromiseInterface {
7784
return $deferred->promise();
78-
});
85+
}))->subscribe(function () {}, function () {});
7986

8087
self::assertSame([
8188
'initiated' => 1,
8289
'successful' => 0,
8390
'errored' => 0,
8491
'slow' => 0,
92+
'completed' => 0,
8593
], iteratorOrArrayToArray($middleware->getCounters()));
8694

87-
$deferred->reject(new \Exception('whoops'));
95+
$subject = new Subject();
96+
$deferred->resolve($subject);
97+
$subject->onError(new \Exception('whoops'));
8898

8999
self::assertSame([
90100
'initiated' => 1,
91101
'successful' => 0,
92102
'errored' => 1,
93103
'slow' => 0,
104+
'completed' => 0,
94105
], iteratorOrArrayToArray($middleware->getCounters()));
95106

96107
$middleware->resetCounters();
@@ -100,10 +111,11 @@ public function testCountingError(): void
100111
'successful' => 0,
101112
'errored' => 0,
102113
'slow' => 0,
114+
'completed' => 0,
103115
], iteratorOrArrayToArray($middleware->getCounters()));
104116
}
105117

106-
public function testCountingErrorSlo(): void
118+
public function testCountingErrorSlow(): void
107119
{
108120
$middleware = new QueryCountMiddleware(1);
109121

@@ -112,30 +124,35 @@ public function testCountingErrorSlo(): void
112124
'successful' => 0,
113125
'errored' => 0,
114126
'slow' => 0,
127+
'completed' => 0,
115128
], iteratorOrArrayToArray($middleware->getCounters()));
116129

117130
$deferred = new Deferred();
118131

119-
$middleware->query(QueryBuilder::create(), function () use ($deferred): PromiseInterface {
132+
unwrapObservableFromPromise($middleware->query(QueryBuilder::create(), function () use ($deferred): PromiseInterface {
120133
return $deferred->promise();
121-
});
134+
}))->subscribe(function () {}, function () {});
122135

123136
self::assertSame([
124137
'initiated' => 1,
125138
'successful' => 0,
126139
'errored' => 0,
127140
'slow' => 0,
141+
'completed' => 0,
128142
], iteratorOrArrayToArray($middleware->getCounters()));
129143

130144
sleep(2);
131145

132-
$deferred->reject(new \Exception('whoops'));
146+
$subject = new Subject();
147+
$deferred->resolve($subject);
148+
$subject->onError(new \Exception('whoops'));
133149

134150
self::assertSame([
135151
'initiated' => 1,
136152
'successful' => 0,
137153
'errored' => 1,
138154
'slow' => 1,
155+
'completed' => 0,
139156
], iteratorOrArrayToArray($middleware->getCounters()));
140157

141158
$middleware->resetCounters();
@@ -145,6 +162,7 @@ public function testCountingErrorSlo(): void
145162
'successful' => 0,
146163
'errored' => 0,
147164
'slow' => 0,
165+
'completed' => 0,
148166
], iteratorOrArrayToArray($middleware->getCounters()));
149167
}
150168
}

0 commit comments

Comments
 (0)