mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
core: fix nLiked (#1128)
This commit is contained in:
3 files changed
+38
-11
No files matched your search
@@ -287,7 +287,7 @@ DomainUserSetting(Schema.object({
|
|||||||
|
|
||||||
rpInfo: Schema.any().extra('family', 'setting_storage').disabled().hidden(),
|
rpInfo: Schema.any().extra('family', 'setting_storage').disabled().hidden(),
|
||||||
|
|
||||||
...Object.fromEntries(['nAccept', 'nSubmit', 'nLike', 'rp', 'rpdelta', 'rank', 'level', 'join'].map((i) => ([
|
...Object.fromEntries(['nAccept', 'nSubmit', 'nLiked', 'rp', 'rpdelta', 'rank', 'level', 'join'].map((i) => ([
|
||||||
i, Schema.number().default(0).extra('family', 'setting_storage').disabled().hidden(),
|
i, Schema.number().default(0).extra('family', 'setting_storage').disabled().hidden(),
|
||||||
]))),
|
]))),
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,27 @@ import db from '../service/db';
|
|||||||
const sumStatus = (status) => ({ $sum: { $cond: [{ $eq: ['$status', status] }, 1, 0] } });
|
const sumStatus = (status) => ({ $sum: { $cond: [{ $eq: ['$status', status] }, 1, 0] } });
|
||||||
|
|
||||||
export async function udoc(report) {
|
export async function udoc(report) {
|
||||||
|
const userStats = new Map<string, { nLiked?: number, nAccept?: number, nSubmit?: number }>();
|
||||||
|
|
||||||
|
report({ message: 'Udoc nLiked' });
|
||||||
|
const likedPipeline = [
|
||||||
|
{
|
||||||
|
$match: {
|
||||||
|
docType: document.TYPE_PROBLEM_SOLUTION,
|
||||||
|
vote: { $gt: 0 },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$group: {
|
||||||
|
_id: { domainId: '$domainId', uid: '$owner' },
|
||||||
|
nLiked: { $sum: '$vote' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
for await (const adoc of document.coll.aggregate<any>(likedPipeline, { allowDiskUse: true })) {
|
||||||
|
userStats.set(`${adoc._id.domainId}/${adoc._id.uid}`, { nLiked: adoc.nLiked });
|
||||||
|
}
|
||||||
|
|
||||||
report({ message: 'Udoc' });
|
report({ message: 'Udoc' });
|
||||||
const pipeline = [
|
const pipeline = [
|
||||||
{
|
{
|
||||||
@@ -31,20 +52,26 @@ export async function udoc(report) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
for await (const adoc of db.collection('record').aggregate<any>(pipeline, { allowDiskUse: true })) {
|
||||||
|
const key = `${adoc._id.domainId}/${adoc._id.uid}`;
|
||||||
|
const stat = userStats.get(key) || {};
|
||||||
|
stat.nSubmit = adoc.nSubmit;
|
||||||
|
stat.nAccept = adoc.nAccept;
|
||||||
|
userStats.set(key, stat);
|
||||||
|
}
|
||||||
|
|
||||||
let bulk = db.collection('domain.user').initializeUnorderedBulkOp();
|
let bulk = db.collection('domain.user').initializeUnorderedBulkOp();
|
||||||
const cursor = db.collection('record').aggregate<any>(pipeline, { allowDiskUse: true });
|
for (const [key, stat] of userStats) {
|
||||||
for await (const adoc of cursor) {
|
const [domainId, uid] = key.split('/');
|
||||||
bulk.find({
|
bulk.find({ domainId, uid: +uid }).updateOne({
|
||||||
domainId: adoc._id.domainId,
|
|
||||||
uid: adoc._id.uid,
|
|
||||||
}).updateOne({
|
|
||||||
$set: {
|
$set: {
|
||||||
nSubmit: adoc.nSubmit,
|
nSubmit: stat.nSubmit || 0,
|
||||||
nAccept: adoc.nAccept,
|
nAccept: stat.nAccept || 0,
|
||||||
|
nLiked: stat.nLiked || 0,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
if (bulk.batches.length > 100) {
|
if (bulk.batches.length > 100) {
|
||||||
await bulk.execute();
|
await bulk.execute(); // eslint-disable-line no-await-in-loop
|
||||||
bulk = db.collection('domain.user').initializeUnorderedBulkOp();
|
bulk = db.collection('domain.user').initializeUnorderedBulkOp();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -153,7 +153,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="balancer__body">
|
<div class="balancer__body">
|
||||||
<div class="numbox">
|
<div class="numbox">
|
||||||
<div class="numbox__num medium">{{ udoc.nLike or 0 }}</div>
|
<div class="numbox__num medium">{{ udoc.nLiked or 0 }}</div>
|
||||||
<div class="numbox__text">{{ _('Solutions Liked') }}</div>
|
<div class="numbox__text">{{ _('Solutions Liked') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in new issue
Block a user