This commit is contained in:
		
							parent
							
								
									cd8bfca29c
								
							
						
					
					
						commit
						9cac293efc
					
				
					 4 changed files with 14 additions and 12 deletions
				
			
		| 
						 | 
					@ -16,7 +16,7 @@ import Following from './following';
 | 
				
			||||||
const Note = db.get<INote>('notes');
 | 
					const Note = db.get<INote>('notes');
 | 
				
			||||||
Note.createIndex('uri', { sparse: true, unique: true });
 | 
					Note.createIndex('uri', { sparse: true, unique: true });
 | 
				
			||||||
Note.createIndex('userId');
 | 
					Note.createIndex('userId');
 | 
				
			||||||
Note.createIndex('tags', { sparse: true });
 | 
					Note.createIndex('tagsLower');
 | 
				
			||||||
Note.createIndex({
 | 
					Note.createIndex({
 | 
				
			||||||
	createdAt: -1
 | 
						createdAt: -1
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					@ -40,6 +40,7 @@ export type INote = {
 | 
				
			||||||
	poll: any; // todo
 | 
						poll: any; // todo
 | 
				
			||||||
	text: string;
 | 
						text: string;
 | 
				
			||||||
	tags: string[];
 | 
						tags: string[];
 | 
				
			||||||
 | 
						tagsLower: string[];
 | 
				
			||||||
	cw: string;
 | 
						cw: string;
 | 
				
			||||||
	userId: mongo.ObjectID;
 | 
						userId: mongo.ObjectID;
 | 
				
			||||||
	appId: mongo.ObjectID;
 | 
						appId: mongo.ObjectID;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@ import Note from '../../../../models/note';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const rangeA = 1000 * 60 * 30; // 30分
 | 
					const rangeA = 1000 * 60 * 30; // 30分
 | 
				
			||||||
const rangeB = 1000 * 60 * 120; // 2時間
 | 
					const rangeB = 1000 * 60 * 120; // 2時間
 | 
				
			||||||
const coefficient = 1.5; // 「n倍」の部分
 | 
					const coefficient = 1.25; // 「n倍」の部分
 | 
				
			||||||
const requiredUsers = 3; // 最低何人がそのタグを投稿している必要があるか
 | 
					const requiredUsers = 3; // 最低何人がそのタグを投稿している必要があるか
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const max = 5;
 | 
					const max = 5;
 | 
				
			||||||
| 
						 | 
					@ -22,20 +22,20 @@ module.exports = () => new Promise(async (res, rej) => {
 | 
				
			||||||
			createdAt: {
 | 
								createdAt: {
 | 
				
			||||||
				$gt: new Date(Date.now() - rangeA)
 | 
									$gt: new Date(Date.now() - rangeA)
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			tags: {
 | 
								tagsLower: {
 | 
				
			||||||
				$exists: true,
 | 
									$exists: true,
 | 
				
			||||||
				$ne: []
 | 
									$ne: []
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}, {
 | 
						}, {
 | 
				
			||||||
		$unwind: '$tags'
 | 
							$unwind: '$tagsLower'
 | 
				
			||||||
	}, {
 | 
						}, {
 | 
				
			||||||
		$group: {
 | 
							$group: {
 | 
				
			||||||
			_id: { tags: '$tags', userId: '$userId' }
 | 
								_id: { tag: '$tagsLower', userId: '$userId' }
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}]) as Array<{
 | 
						}]) as Array<{
 | 
				
			||||||
		_id: {
 | 
							_id: {
 | 
				
			||||||
			tags: string;
 | 
								tag: string;
 | 
				
			||||||
			userId: any;
 | 
								userId: any;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}>;
 | 
						}>;
 | 
				
			||||||
| 
						 | 
					@ -49,12 +49,12 @@ module.exports = () => new Promise(async (res, rej) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// カウント
 | 
						// カウント
 | 
				
			||||||
	data.map(x => x._id).forEach(x => {
 | 
						data.map(x => x._id).forEach(x => {
 | 
				
			||||||
		const i = tags.findIndex(tag => tag.name == x.tags);
 | 
							const i = tags.findIndex(tag => tag.name == x.tag);
 | 
				
			||||||
		if (i != -1) {
 | 
							if (i != -1) {
 | 
				
			||||||
			tags[i].count++;
 | 
								tags[i].count++;
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			tags.push({
 | 
								tags.push({
 | 
				
			||||||
				name: x.tags,
 | 
									name: x.tag,
 | 
				
			||||||
				count: 1
 | 
									count: 1
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -66,7 +66,7 @@ module.exports = () => new Promise(async (res, rej) => {
 | 
				
			||||||
	//#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する
 | 
						//#region 2. 1で取得したそれぞれのタグについて、「直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上」かどうかを判定する
 | 
				
			||||||
	const hotsPromises = limitedTags.map(async tag => {
 | 
						const hotsPromises = limitedTags.map(async tag => {
 | 
				
			||||||
		const passedCount = (await Note.distinct('userId', {
 | 
							const passedCount = (await Note.distinct('userId', {
 | 
				
			||||||
			tags: tag.name,
 | 
								tagsLower: tag.name,
 | 
				
			||||||
			createdAt: {
 | 
								createdAt: {
 | 
				
			||||||
				$lt: new Date(Date.now() - rangeA),
 | 
									$lt: new Date(Date.now() - rangeA),
 | 
				
			||||||
				$gt: new Date(Date.now() - rangeB)
 | 
									$gt: new Date(Date.now() - rangeB)
 | 
				
			||||||
| 
						 | 
					@ -108,7 +108,7 @@ module.exports = () => new Promise(async (res, rej) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (let i = 0; i < range; i++) {
 | 
						for (let i = 0; i < range; i++) {
 | 
				
			||||||
		countPromises.push(Promise.all(hots.map(tag => Note.distinct('userId', {
 | 
							countPromises.push(Promise.all(hots.map(tag => Note.distinct('userId', {
 | 
				
			||||||
			tags: tag,
 | 
								tagsLower: tag,
 | 
				
			||||||
			createdAt: {
 | 
								createdAt: {
 | 
				
			||||||
				$lt: new Date(Date.now() - (interval * i)),
 | 
									$lt: new Date(Date.now() - (interval * i)),
 | 
				
			||||||
				$gt: new Date(Date.now() - (interval * (i + 1)))
 | 
									$gt: new Date(Date.now() - (interval * (i + 1)))
 | 
				
			||||||
| 
						 | 
					@ -119,7 +119,7 @@ module.exports = () => new Promise(async (res, rej) => {
 | 
				
			||||||
	const countsLog = await Promise.all(countPromises);
 | 
						const countsLog = await Promise.all(countPromises);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const totalCounts: any = await Promise.all(hots.map(tag => Note.distinct('userId', {
 | 
						const totalCounts: any = await Promise.all(hots.map(tag => Note.distinct('userId', {
 | 
				
			||||||
		tags: tag,
 | 
							tagsLower: tag,
 | 
				
			||||||
		createdAt: {
 | 
							createdAt: {
 | 
				
			||||||
			$gt: new Date(Date.now() - (interval * range))
 | 
								$gt: new Date(Date.now() - (interval * range))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -101,7 +101,7 @@ async function search(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	let q: any = {
 | 
						let q: any = {
 | 
				
			||||||
		$and: [{
 | 
							$and: [{
 | 
				
			||||||
			tags: tag
 | 
								tagsLower: tag.toLowerCase()
 | 
				
			||||||
		}]
 | 
							}]
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -130,6 +130,7 @@ export default async (user: IUser, data: {
 | 
				
			||||||
		poll: data.poll,
 | 
							poll: data.poll,
 | 
				
			||||||
		cw: data.cw == null ? null : data.cw,
 | 
							cw: data.cw == null ? null : data.cw,
 | 
				
			||||||
		tags,
 | 
							tags,
 | 
				
			||||||
 | 
							tagsLower: tags.map(tag => tag.toLowerCase()),
 | 
				
			||||||
		userId: user._id,
 | 
							userId: user._id,
 | 
				
			||||||
		viaMobile: data.viaMobile,
 | 
							viaMobile: data.viaMobile,
 | 
				
			||||||
		geo: data.geo || null,
 | 
							geo: data.geo || null,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue