Skip to content

Commit ab13e22

Browse files
authored
Add total number of users in daily metrics (#1019)
Bug: T401471
1 parent 1fa0de6 commit ab13e22

4 files changed

Lines changed: 101 additions & 1 deletion

File tree

app/Metrics/App/WikiMetrics.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public function saveMetrics(Wiki $wiki): void {
3636
$quarterlyActions = $this->getNumberOfActions(self::INTERVAL_QUARTERLY);
3737
$numberOfEntities = $this->getNumberOfEntities();
3838
$monthlyNumberOfUsersPerActivityType = $this->getNumberOfUsersPerActivityType();
39+
$numberOfUsersPerWiki = $this->getTotalUserCount();
3940

4041
$dailyMetrics = new WikiDailyMetrics([
4142
'id' => $wiki->id . '_' . date('Y-m-d'),
@@ -54,6 +55,7 @@ public function saveMetrics(Wiki $wiki): void {
5455
'entity_schema_count' => $numberOfEntities['640'],
5556
'monthly_casual_users' => $monthlyNumberOfUsersPerActivityType[0],
5657
'monthly_active_users' => $monthlyNumberOfUsersPerActivityType[1],
58+
'total_user_count' => $numberOfUsersPerWiki,
5759
]);
5860

5961
// compare current record to old record and only save if there is a change
@@ -210,4 +212,17 @@ private function getNumberOfEntities(): array {
210212

211213
return $result;
212214
}
215+
216+
private function getTotalUserCount() {
217+
$wikiDb = $this->wiki->wikiDb;
218+
$tableUser = "{$wikiDb->name}.{$wikiDb->prefix}_user";
219+
$query = "SELECT COUNT(*) AS total_users FROM $tableUser";
220+
$manager = app()->db;
221+
$manager->purge('mw');
222+
$conn = $manager->connection('mw');
223+
$pdo = $conn->getPdo();
224+
$result = $pdo->query($query)->fetch(PDO::FETCH_ASSOC);
225+
226+
return $result['total_users'] ?? null;
227+
}
213228
}

app/WikiDailyMetrics.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class WikiDailyMetrics extends Model {
3333
'entity_schema_count',
3434
'monthly_casual_users',
3535
'monthly_active_users',
36+
'total_user_count',
3637

3738
];
3839

@@ -51,6 +52,7 @@ class WikiDailyMetrics extends Model {
5152
'entity_schema_count',
5253
'monthly_casual_users',
5354
'monthly_active_users',
55+
'total_user_count',
5456
];
5557

5658
public function areMetricsEqual(WikiDailyMetrics $wikiDailyMetrics): bool {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration {
8+
/**
9+
* Run the migrations.
10+
*/
11+
public function up(): void {
12+
Schema::table('wiki_daily_metrics', function (Blueprint $table) {
13+
$table->integer('total_user_count')->nullable()->default(null);
14+
});
15+
}
16+
17+
/**
18+
* Reverse the migrations.
19+
*/
20+
public function down(): void {
21+
Schema::table('wiki_daily_metrics', function (Blueprint $table) {
22+
$table->dropColumn('total_user_count');
23+
});
24+
}
25+
};

tests/Metrics/WikiMetricsTest.php

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,6 @@ public function testSavesEntityCountsCorrectly($expectedItemCount, $expectedProp
354354

355355
// clean up after the test
356356
$wiki->forceDelete();
357-
Schema::dropIfExists($tablePage);
358357

359358
$this->assertDatabaseHas('wiki_daily_metrics', [
360359
'wiki_id' => $wiki->id,
@@ -364,4 +363,63 @@ public function testSavesEntityCountsCorrectly($expectedItemCount, $expectedProp
364363
'entity_schema_count' => $expectedEntitySchemaCount, // redirects should be ignored
365364
]);
366365
}
366+
367+
public function testSavesTotalUserCountCorrectly() {
368+
$wiki = Wiki::factory()->create([
369+
'domain' => 'usercounttest.wikibase.cloud',
370+
]);
371+
372+
$users = [
373+
[
374+
'user_name' => 'user1',
375+
'user_real_name' => 'user1',
376+
'user_password' => 'user1',
377+
'user_new_password' => 'user1',
378+
'user_email' => 'user1@email.com',
379+
'user_touched' => random_bytes(10),
380+
],
381+
[
382+
'user_name' => 'user2',
383+
'user_real_name' => 'user2',
384+
'user_password' => 'user2',
385+
'user_new_password' => 'user2',
386+
'user_email' => 'user2@email.com',
387+
'user_touched' => random_bytes(10),
388+
],
389+
];
390+
$wikiDb = WikiDb::first();
391+
$wikiDb->update(['wiki_id' => $wiki->id]);
392+
393+
$tableUser = $wikiDb->name . '.' . $wikiDb->prefix . '_user';
394+
Schema::dropIfExists($tableUser);
395+
Schema::create($tableUser, function (Blueprint $table) {
396+
$table->increments('user_id');
397+
$table->string('user_name');
398+
$table->string('user_real_name')->default(0);
399+
$table->string('user_password', 255);
400+
$table->string('user_new_password');
401+
$table->string('user_email');
402+
$table->binary('user_touched');
403+
});
404+
405+
// Insert dummy data
406+
DB::table($tableUser)->insert($users);
407+
WikiDailyMetrics::create([
408+
'id' => $wiki->id . '_' . now()->subDay()->toDateString(),
409+
'wiki_id' => $wiki->id,
410+
'date' => now()->subDay()->toDateString(),
411+
'pages' => 0,
412+
'is_deleted' => 0,
413+
]);
414+
415+
(new WikiMetrics)->saveMetrics($wiki);
416+
417+
// clean up after the test
418+
$wiki->forceDelete();
419+
420+
$this->assertDatabaseHas('wiki_daily_metrics', [
421+
'wiki_id' => $wiki->id,
422+
'total_user_count' => count($users),
423+
]);
424+
}
367425
}

0 commit comments

Comments
 (0)