From e7dd5e155d212188de9fbef70e6694b433530559 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 20 May 2019 21:44:16 +0900 Subject: [PATCH] Fix bugs Use Not(IsNull()) --- CONTRIBUTING.md | 14 ++++++++++++++ .../users/get-frequently-replied-users.ts | 4 ++-- src/services/chart/charts/classes/drive.ts | 4 ++-- src/services/chart/charts/classes/notes.ts | 4 ++-- .../chart/charts/classes/per-user-following.ts | 6 +++--- src/services/chart/charts/classes/users.ts | 4 ++-- src/tools/clean-remote-files.ts | 4 ++-- 7 files changed, 27 insertions(+), 13 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ace822c63e..b01e5e6dd8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -128,6 +128,20 @@ query.andWhere(new Brackets(qb => { })); ``` +### Not `null` in TypeORM +```ts +const foo = await Foos.findOne({ + bar: Not(null) +}); +``` +のようなクエリ(`bar`が`null`ではない)は期待通りに動作しない。 +次のようにします: +```ts +const foo = await Foos.findOne({ + bar: Not(IsNull()) +}); +``` + ### `null` in SQL SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない 例えば diff --git a/src/server/api/endpoints/users/get-frequently-replied-users.ts b/src/server/api/endpoints/users/get-frequently-replied-users.ts index 420936c089..24d1bd194c 100644 --- a/src/server/api/endpoints/users/get-frequently-replied-users.ts +++ b/src/server/api/endpoints/users/get-frequently-replied-users.ts @@ -4,7 +4,7 @@ import define from '../../define'; import { maximum } from '../../../../prelude/array'; import { ApiError } from '../../error'; import { getUser } from '../../common/getters'; -import { Not, In } from 'typeorm'; +import { Not, In, IsNull } from 'typeorm'; import { Notes, Users } from '../../../../models'; import { types, bool } from '../../../../misc/schema'; @@ -58,7 +58,7 @@ export default define(meta, async (ps, me) => { const recentNotes = await Notes.find({ where: { userId: user.id, - replyId: Not(null) + replyId: Not(IsNull()) }, order: { id: -1 diff --git a/src/services/chart/charts/classes/drive.ts b/src/services/chart/charts/classes/drive.ts index ae52df19ac..c3bcacb7df 100644 --- a/src/services/chart/charts/classes/drive.ts +++ b/src/services/chart/charts/classes/drive.ts @@ -2,7 +2,7 @@ import autobind from 'autobind-decorator'; import Chart, { Obj, DeepPartial } from '../../core'; import { SchemaType } from '../../../../misc/schema'; import { DriveFiles } from '../../../../models'; -import { Not } from 'typeorm'; +import { Not, IsNull } from 'typeorm'; import { DriveFile } from '../../../../models/entities/drive-file'; import { name, schema } from '../schemas/drive'; @@ -31,7 +31,7 @@ export default class DriveChart extends Chart { protected async fetchActual(): Promise> { const [localCount, remoteCount, localSize, remoteSize] = await Promise.all([ DriveFiles.count({ userHost: null }), - DriveFiles.count({ userHost: Not(null) }), + DriveFiles.count({ userHost: Not(IsNull()) }), DriveFiles.clacDriveUsageOfLocal(), DriveFiles.clacDriveUsageOfRemote() ]); diff --git a/src/services/chart/charts/classes/notes.ts b/src/services/chart/charts/classes/notes.ts index 85ccf000d8..815061c445 100644 --- a/src/services/chart/charts/classes/notes.ts +++ b/src/services/chart/charts/classes/notes.ts @@ -2,7 +2,7 @@ import autobind from 'autobind-decorator'; import Chart, { Obj, DeepPartial } from '../../core'; import { SchemaType } from '../../../../misc/schema'; import { Notes } from '../../../../models'; -import { Not } from 'typeorm'; +import { Not, IsNull } from 'typeorm'; import { Note } from '../../../../models/entities/note'; import { name, schema } from '../schemas/notes'; @@ -29,7 +29,7 @@ export default class NotesChart extends Chart { protected async fetchActual(): Promise> { const [localCount, remoteCount] = await Promise.all([ Notes.count({ userHost: null }), - Notes.count({ userHost: Not(null) }) + Notes.count({ userHost: Not(IsNull()) }) ]); return { diff --git a/src/services/chart/charts/classes/per-user-following.ts b/src/services/chart/charts/classes/per-user-following.ts index f3809a7c94..8295c0cb0d 100644 --- a/src/services/chart/charts/classes/per-user-following.ts +++ b/src/services/chart/charts/classes/per-user-following.ts @@ -2,7 +2,7 @@ import autobind from 'autobind-decorator'; import Chart, { Obj, DeepPartial } from '../../core'; import { SchemaType } from '../../../../misc/schema'; import { Followings, Users } from '../../../../models'; -import { Not } from 'typeorm'; +import { Not, IsNull } from 'typeorm'; import { User } from '../../../../models/entities/user'; import { name, schema } from '../schemas/per-user-following'; @@ -45,8 +45,8 @@ export default class PerUserFollowingChart extends Chart { ] = await Promise.all([ Followings.count({ followerId: group, followeeHost: null }), Followings.count({ followeeId: group, followerHost: null }), - Followings.count({ followerId: group, followeeHost: Not(null) }), - Followings.count({ followeeId: group, followerHost: Not(null) }) + Followings.count({ followerId: group, followeeHost: Not(IsNull()) }), + Followings.count({ followeeId: group, followerHost: Not(IsNull()) }) ]); return { diff --git a/src/services/chart/charts/classes/users.ts b/src/services/chart/charts/classes/users.ts index eec30de8dc..47e4caa1b7 100644 --- a/src/services/chart/charts/classes/users.ts +++ b/src/services/chart/charts/classes/users.ts @@ -2,7 +2,7 @@ import autobind from 'autobind-decorator'; import Chart, { Obj, DeepPartial } from '../../core'; import { SchemaType } from '../../../../misc/schema'; import { Users } from '../../../../models'; -import { Not } from 'typeorm'; +import { Not, IsNull } from 'typeorm'; import { User } from '../../../../models/entities/user'; import { name, schema } from '../schemas/users'; @@ -29,7 +29,7 @@ export default class UsersChart extends Chart { protected async fetchActual(): Promise> { const [localCount, remoteCount] = await Promise.all([ Users.count({ host: null }), - Users.count({ host: Not(null) }) + Users.count({ host: Not(IsNull()) }) ]); return { diff --git a/src/tools/clean-remote-files.ts b/src/tools/clean-remote-files.ts index e722552e14..633a6fc04d 100644 --- a/src/tools/clean-remote-files.ts +++ b/src/tools/clean-remote-files.ts @@ -1,14 +1,14 @@ import * as promiseLimit from 'promise-limit'; import del from '../services/drive/delete-file'; import { DriveFiles } from '../models'; -import { Not } from 'typeorm'; +import { Not, IsNull } from 'typeorm'; import { DriveFile } from '../models/entities/drive-file'; import { ensure } from '../prelude/ensure'; const limit = promiseLimit(16); DriveFiles.find({ - userHost: Not(null) + userHost: Not(IsNull()) }).then(async files => { console.log(`there is ${files.length} files`);