break out collage ranking into contributed and created

This commit is contained in:
Spine
2025-07-06 01:12:34 +00:00
parent 09c00ca6f6
commit 9f420d31a8
14 changed files with 140 additions and 130 deletions

View File

@@ -27,6 +27,7 @@ class User extends \Gazelle\Json {
$artistsAdded = $this->valueOrNull($stats->artistAddedTotal(), 'artistsadded');
$torrentComments = $this->valueOrNull($stats->commentTotal('torrents'), 'torrentcomments++');
$collageContribs = $this->valueOrNull($stats->collageContrib(), 'collagecontribs+');
$collageTotal = $this->valueOrNull($stats->collageTotal(), 'collagecontribs+');
if (!$user->propertyVisibleMulti($viewer, ['requestsfilled_count', 'requestsfilled_bounty'])) {
$requestsFilled = null;
@@ -43,17 +44,18 @@ class User extends \Gazelle\Json {
$rank = new \Gazelle\UserRank(
new \Gazelle\UserRank\Configuration(RANKING_WEIGHT),
[
'posts' => $forumPosts,
'votes' => $releaseVotes,
'artists' => (int)$artistsAdded,
'downloaded' => (int)$downloaded,
'bounty' => (int)$totalSpent,
'collage' => (int)$collageContribs,
'comment-t' => (int)$torrentComments,
'requests' => (int)$requestsFilled,
'uploaded' => (int)$uploaded,
'uploads' => (int)$uploads,
'bonus' => new \Gazelle\User\Bonus($user)->pointsSpent(),
'posts' => $forumPosts,
'votes' => $releaseVotes,
'artists' => (int)$artistsAdded,
'downloaded' => (int)$downloaded,
'bounty' => (int)$totalSpent,
'collage-create' => (int)$collageContribs,
'collage-add' => (int)$collageTotal,
'comment-t' => (int)$torrentComments,
'requests' => (int)$requestsFilled,
'uploaded' => (int)$uploaded,
'uploads' => (int)$uploads,
'bonus' => new \Gazelle\User\Bonus($user)->pointsSpent(),
]
);
@@ -81,17 +83,18 @@ class User extends \Gazelle\Json {
},
],
'ranks' => [
'uploaded' => $this->valueOrNull($rank->rank('uploaded'), 'uploaded'),
'downloaded' => $this->valueOrNull($rank->rank('downloaded'), 'downloaded'),
'uploads' => $this->valueOrNull($rank->rank('uploads'), 'uploads+'),
'requests' => $this->valueOrNull($rank->rank('requests'), 'requestsfilled_count'),
'bounty' => $this->valueOrNull($rank->rank('bounty'), 'requestsvoted_bounty'),
'artists' => $this->valueOrNull($rank->rank('artists'), 'artistsadded'),
'collage' => $this->valueOrNull($rank->rank('collage'), 'collagecontribs+'),
'posts' => $rank->rank('posts'),
'votes' => $rank->rank('votes'),
'bonus' => $rank->rank('bonus'),
'overall' => $user->propertyVisibleMulti($viewer, ['uploaded', 'downloaded', 'uploads+', 'requestsfilled_count', 'requestsvoted_bounty', 'artistsadded', 'collagecontribs+'])
'uploaded' => $this->valueOrNull($rank->rank('uploaded'), 'uploaded'),
'downloaded' => $this->valueOrNull($rank->rank('downloaded'), 'downloaded'),
'uploads' => $this->valueOrNull($rank->rank('uploads'), 'uploads+'),
'requests' => $this->valueOrNull($rank->rank('requests'), 'requestsfilled_count'),
'bounty' => $this->valueOrNull($rank->rank('bounty'), 'requestsvoted_bounty'),
'artists' => $this->valueOrNull($rank->rank('artists'), 'artistsadded'),
'collage-add' => $this->valueOrNull($rank->rank('collage-add'), 'collagecontribs+'),
'collage-create' => $this->valueOrNull($rank->rank('collage-create'), 'collagecontribs+'),
'posts' => $rank->rank('posts'),
'votes' => $rank->rank('votes'),
'bonus' => $rank->rank('bonus'),
'overall' => $user->propertyVisibleMulti($viewer, ['uploaded', 'downloaded', 'uploads+', 'requestsfilled_count', 'requestsvoted_bounty', 'artistsadded', 'collagecontribs+'])
? $rank->score() * $user->rankFactor() : null,
],
'personal' => [

View File

@@ -20,11 +20,11 @@ class User extends \Gazelle\BaseObject {
protected array $commentTotal;
public function flush(): static {
$this->info = [];
self::$cache->delete_multi([
sprintf(self::CACHE_COMMENT_TOTAL, $this->id),
sprintf(self::CACHE_GENERAL, $this->id),
]);
unset($this->info);
return $this;
}
@@ -66,7 +66,7 @@ class User extends \Gazelle\BaseObject {
* @see \Gazelle\Stats\Users::refresh()
*/
public function info(): array {
if (isset($this->info) && !empty($this->info)) {
if (isset($this->info)) {
return $this->info;
}
$key = sprintf(self::CACHE_GENERAL, $this->id);

View File

@@ -415,34 +415,33 @@ class Users extends \Gazelle\Base {
self::$db->prepared_query("
INSERT INTO user_summary_new (user_id, collage_total, collage_contrib)
WITH c AS (
SELECT um.ID AS user_id,
SELECT c.UserID AS user_id,
count(c.ID) AS total
FROM users_main um
LEFT JOIN collages c ON (c.UserID = um.ID AND c.Deleted = '0')
GROUP BY um.ID
FROM collages c
WHERE c.Deleted = '0'
GROUP BY c.UserID
),
ca AS (
SELECT um.ID AS user_id,
SELECT ca.UserID AS user_id,
count(DISTINCT ca.ArtistID) AS total
FROM users_main um
LEFT JOIN collages_artists ca ON (ca.UserID = um.ID)
LEFT JOIN collages c ON (c.ID = ca.CollageID AND c.Deleted = '0')
GROUP BY um.ID
FROM collages_artists ca
INNER JOIN collages c ON (c.ID = ca.CollageID AND c.Deleted = '0')
GROUP BY ca.UserID
),
ct AS (
SELECT um.ID AS user_id,
SELECT ct.UserID AS user_id,
count(DISTINCT ct.GroupID) AS total
FROM users_main um
LEFT JOIN collages_torrents ct ON (ct.UserID = um.ID)
LEFT JOIN collages c ON (c.ID = ct.CollageID AND c.Deleted = '0')
GROUP BY um.ID
FROM collages_torrents ct
INNER JOIN collages c ON (c.ID = ct.CollageID AND c.Deleted = '0')
GROUP BY ct.UserID
)
SELECT c.user_id, c.total, ca.total + ct.total
FROM c
LEFT JOIN ca USING (user_id)
LEFT JOIN ct USING (user_id)
SELECT um.ID, coalesce(c.total, 0), coalesce(ca.total, 0) + coalesce(ct.total, 0)
FROM users_main um
LEFT JOIN c ON (c.user_id = um.ID)
LEFT JOIN ca ON (ca.user_id = um.ID)
LEFT JOIN ct ON (ct.user_id = um.ID)
ON DUPLICATE KEY UPDATE
collage_total = VALUES(collage_total),
collage_total = VALUES(collage_total),
collage_contrib = VALUES(collage_contrib)
");

View File

@@ -0,0 +1,18 @@
<?php
namespace Gazelle\UserRank\Dimension;
class CollageContributed extends \Gazelle\UserRank\AbstractUserRank {
public function cacheKey(): string {
return 'rank_data_collagecontrib';
}
public function selector(): string {
return "
SELECT collage_contrib
FROM user_summary
WHERE collage_contrib > 0
ORDER BY 1
";
}
}

View File

@@ -1,35 +0,0 @@
<?php
namespace Gazelle\UserRank\Dimension;
class CollageContribution extends \Gazelle\UserRank\AbstractUserRank {
public function cacheKey(): string {
return 'rank_data_collagecontrib';
}
public function selector(): string {
return "
SELECT sum(contrib) AS n FROM (
SELECT um.ID as id, count(*) AS contrib
FROM collages_artists ca
INNER JOIN collages c ON (c.ID = ca.CollageID)
INNER JOIN users_main um ON (um.ID = ca.UserID)
WHERE um.Enabled = '1'
AND c.Deleted = '0'
AND c.Locked = '0'
GROUP BY um.ID
UNION ALL
SELECT um.ID as id, count(*) AS contrib
FROM collages_torrents ct
INNER JOIN collages c ON (c.ID = ct.CollageID)
INNER JOIN users_main um ON (um.ID = ct.UserID)
WHERE um.Enabled = '1'
AND c.Deleted = '0'
AND c.Locked = '0'
GROUP BY um.ID
) COLL
GROUP BY id
ORDER BY 1
";
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace Gazelle\UserRank\Dimension;
class CollageCreated extends \Gazelle\UserRank\AbstractUserRank {
public function cacheKey(): string {
return 'rank_data_collagecontrib';
}
public function selector(): string {
return "
SELECT collage_total
FROM user_summary
WHERE collage_total > 0
ORDER BY 1
";
}
}

View File

@@ -605,17 +605,18 @@ defined('IMAGE_HOST_RECOMMENDED') or define('IMAGE_HOST_RECOMMENDED', []);
// What are the relative weights of user percentiles, in order to calculate
// the overall percentile rank.
defined('RANKING_WEIGHT') or define('RANKING_WEIGHT', [
'uploaded' => [ 8, 'DataUpload'],
'downloaded' => [20, 'DataDownload'],
'uploads' => [25, 'Uploads'],
'requests' => [10, 'RequestsFilled'],
'posts' => [ 3, 'ForumPosts'],
'bounty' => [ 4, 'BountySpent'],
'artists' => [ 1, 'ArtistsAdded'],
'collage' => [ 5, 'CollageContribution'],
'votes' => [ 5, 'ReleaseVotes'],
'bonus' => [ 6, 'BonusPoints'],
'comment-t' => [18, 'CommentTorrent'],
'uploaded' => [10, 'DataUpload'],
'downloaded' => [25, 'DataDownload'],
'uploads' => [25, 'Uploads'],
'requests' => [15, 'RequestsFilled'],
'posts' => [ 6, 'ForumPosts'],
'bounty' => [ 4, 'BountySpent'],
'artists' => [ 2, 'ArtistsAdded'],
'collage-add' => [ 5, 'CollageContributed'],
'collage-create' => [ 8, 'CollageCreated'],
'votes' => [ 7, 'ReleaseVotes'],
'bonus' => [ 4, 'BonusPoints'],
'comment-t' => [16, 'CommentTorrent'],
]);
// Successive login failures generate increasing delays.

View File

@@ -127,17 +127,18 @@ $Uploads = check_paranoia_here('uploads+') ? $stats->uploadTotal() : 0;
$rank = new UserRank(
new UserRank\Configuration(RANKING_WEIGHT),
[
'uploaded' => $user->uploadedSize(),
'downloaded' => $user->downloadedSize(),
'uploads' => $Uploads,
'requests' => $stats->requestBountyTotal(),
'posts' => $stats->forumPostTotal(),
'bounty' => $stats->requestVoteSize(),
'artists' => check_paranoia_here('artistsadded') ? $stats->artistAddedTotal() : 0,
'collage' => check_paranoia_here('collagecontribs+') ? $stats->collageTotal() : 0,
'votes' => $vote->userTotal(Vote::UPVOTE | Vote::DOWNVOTE),
'bonus' => $userBonus->pointsSpent(),
'comment-t' => check_paranoia_here('torrentcomments++') ? $stats->commentTotal('torrents') : 0,
'uploaded' => $user->uploadedSize(),
'downloaded' => $user->downloadedSize(),
'uploads' => $Uploads,
'requests' => $stats->requestBountyTotal(),
'posts' => $stats->forumPostTotal(),
'bounty' => $stats->requestVoteSize(),
'artists' => check_paranoia_here('artistsadded') ? $stats->artistAddedTotal() : 0,
'collage-add' => check_paranoia_here('collagecontribs+') ? $stats->collageContrib() : 0,
'collage-create' => check_paranoia_here('collagecontribs+') ? $stats->collageTotal() : 0,
'votes' => $vote->userTotal(Vote::UPVOTE | Vote::DOWNVOTE),
'bonus' => $userBonus->pointsSpent(),
'comment-t' => check_paranoia_here('torrentcomments++') ? $stats->commentTotal('torrents') : 0,
],
);
@@ -153,7 +154,8 @@ $statList = [
['bounty', 'requestsvoted_bounty', 'Request votes', $byteFormatter, 'spent'],
['posts', null, 'Forum posts made', $numberFormatter, 'posts'],
['comment-t', 'torrentcomments++', 'Torrent comments', $numberFormatter, 'posted'],
['collage', 'collagecontribs+', 'Collage contributions', $numberFormatter, 'contributions'],
['collage-add', 'collagecontribs+', 'Collage contributions', $numberFormatter, 'contributions'],
['collage-create', 'collagecontribs+', 'Collages created', $numberFormatter, 'created'],
['artists', 'artistsadded', 'Artists added', $numberFormatter, 'added'],
['votes', null, 'Release votes cast', $numberFormatter, 'votes'],
]

View File

@@ -163,7 +163,7 @@ class CollageTest extends TestCase {
$this->assertEquals(
1,
$this->userList['u1']->stats()->collageTotal(),
$this->userList['u1']->stats()->flush()->collageTotal(),
'collage-user-total'
);

View File

@@ -133,7 +133,7 @@ class DownloadTest extends TestCase {
$this->assertFalse($this->torrent->isFreeleechPersonal(), 'redown-torrent-is-still-not-pfl');
new Stats\Users()->refresh();
$this->assertEquals(2, $user->stats()->downloadTotal(), 'redown-user-download-total');
$this->assertEquals(2, $user->stats()->flush()->downloadTotal(), 'redown-user-download-total');
$this->assertEquals(1, $user->stats()->downloadUnique(), 'redown-user-download-unique');
$this->assertEquals(2, $user->history()->resetDownloaded(), 'redown-reset-downloaded');

View File

@@ -166,7 +166,7 @@ class ForumTest extends TestCase {
$this->assertFalse($thread->isLocked(), 'fthread-is-not-locked');
$this->assertFalse($thread->isPinned(), 'fthread-is-not-pinned');
$this->assertEquals(1, $admin->stats()->forumThreadTotal(), 'fthread-user-stats-total');
$this->assertEquals(1, $admin->stats()->flush()->forumThreadTotal(), 'fthread-user-stats-total');
$this->assertCount(0, $this->userList['user']->forumLastReadList(1, $this->forum), 'fthread-user-unread');
// Forum Thread Notes

View File

@@ -206,7 +206,7 @@ class RequestTest extends TestCase {
'created-total' => 0,
'vote-size' => 0,
'vote-total' => 0,
'uploaded' => $admin->uploadedSize(),
'uploaded' => $admin->flush()->uploadedSize(),
'total' => $statsReq->total(),
'total-filled' => $statsReq->filledTotal(),
];
@@ -304,7 +304,7 @@ class RequestTest extends TestCase {
$this->assertInstanceOf(Torrent::class, $torrent, 'request-torrent-filler');
$this->assertEquals(1, $this->request->fill($user, $torrent), 'request-fill');
$this->assertEquals($fillBefore['bounty-size'] + $taxedBounty * 2, $user->stats()->requestBountySize(), 'request-fill-receive-bounty');
$this->assertEquals($fillBefore['bounty-size'] + $taxedBounty * 2, $user->stats()->flush()->requestBountySize(), 'request-fill-receive-bounty');
$this->assertEquals($fillBefore['bounty-total'] + 1, $user->stats()->requestBountyTotal(), 'request-fill-receive-total');
$this->assertTrue(Helper::recentDate($this->request->fillDate()), 'request-fill-date');
$this->assertEquals($this->request->id, $torrent->requestFills($requestMan)[0]->id, 'request-torrent-fills');

View File

@@ -11,7 +11,8 @@ class UserRankTest extends TestCase {
['ArtistsAdded'],
['BonusPoints'],
['BountySpent'],
['CollageContribution'],
['CollageContributed'],
['CollageCreated'],
['CommentTorrent'],
['DataDownload'],
['DataUpload'],
@@ -39,17 +40,18 @@ class UserRankTest extends TestCase {
$userRank = new UserRank(
new UserRank\Configuration(RANKING_WEIGHT),
[
'downloaded' => 0,
'uploaded' => STARTING_UPLOAD,
'uploads' => 0,
'requests' => 0,
'posts' => 0,
'bounty' => 0,
'artists' => 0,
'collage' => 0,
'votes' => 0,
'bonus' => 0,
'comment-t' => 0,
'downloaded' => 0,
'uploaded' => STARTING_UPLOAD,
'uploads' => 0,
'requests' => 0,
'posts' => 0,
'bounty' => 0,
'artists' => 0,
'collage-add' => 0,
'collage-create' => 0,
'votes' => 0,
'bonus' => 0,
'comment-t' => 0,
],
);
$this->assertSame(0, $userRank->score(), 'userrank-score');

View File

@@ -333,6 +333,7 @@ class UserTest extends TestCase {
$this->assertStringContainsString('100%', $next['goal']['Time']['percent'], 'user-next-has-time');
$this->user->addBounty(7 * 1024 * 1024 * 1024);
$this->user->stats()->flush();
$next = $this->user->nextClass($manager);
$this->assertIsArray($next, 'user-next-requirements-next-3-array');
$this->assertStringContainsString('100%', $next['goal']['Upload']['percent'], 'user-next-has-upload');
@@ -536,21 +537,22 @@ class UserTest extends TestCase {
$rank = new UserRank(
new UserRank\Configuration(RANKING_WEIGHT),
[
'uploaded' => STARTING_UPLOAD,
'downloaded' => 1,
'uploads' => 0,
'requests' => 0,
'posts' => 0,
'bounty' => 0,
'artists' => 0,
'collage' => 0,
'votes' => 0,
'bonus' => 0,
'comment-t' => 0,
'downloaded' => 0,
'uploaded' => STARTING_UPLOAD,
'uploads' => 0,
'requests' => 0,
'posts' => 0,
'bounty' => 0,
'artists' => 0,
'collage-add' => 0,
'collage-create' => 0,
'votes' => 0,
'bonus' => 0,
'comment-t' => 0,
]
);
$this->assertEquals(0, $rank->score(), 'userrank-score');
$this->assertEquals(1, $rank->rank('downloaded'), 'userrank-rank');
$this->assertEquals(0, $rank->rank('downloaded'), 'userrank-rank');
}
public function testUserHash(): void {