denormalize Events/Notes relation
This commit is contained in:
		
							parent
							
								
									a56561f8aa
								
							
						
					
					
						commit
						173a901eee
					
				|  | @ -0,0 +1,29 @@ | |||
| export class Event1681675881633 { | ||||
|     name = 'Event1681675881633' | ||||
| 
 | ||||
|     async up(queryRunner) { | ||||
|         await queryRunner.query(`ALTER TABLE "note" RENAME COLUMN "isEvent" TO "hasEvent"`); | ||||
|         await queryRunner.query(`CREATE TYPE "public"."event_notevisibility_enum" AS ENUM('public', 'home', 'followers', 'specified')`); | ||||
|         await queryRunner.query(`ALTER TABLE "event" ADD "noteVisibility" "public"."event_notevisibility_enum" NOT NULL`); | ||||
|         await queryRunner.query(`COMMENT ON COLUMN "event"."noteVisibility" IS '[Denormalized]'`); | ||||
|         await queryRunner.query(`ALTER TABLE "event" ADD "userId" character varying(32) NOT NULL`); | ||||
|         await queryRunner.query(`COMMENT ON COLUMN "event"."userId" IS '[Denormalized]'`); | ||||
|         await queryRunner.query(`ALTER TABLE "event" ADD "userHost" character varying(128)`); | ||||
|         await queryRunner.query(`COMMENT ON COLUMN "event"."userHost" IS '[Denormalized]'`); | ||||
|         await queryRunner.query(`CREATE INDEX "IDX_01cd2b829e0263917bf570cb67" ON "event" ("userId") `); | ||||
|         await queryRunner.query(`CREATE INDEX "IDX_f6ba57dff679ccbcfe004698ec" ON "event" ("userHost") `); | ||||
|     } | ||||
| 
 | ||||
|     async down(queryRunner) { | ||||
|         await queryRunner.query(`DROP INDEX "public"."IDX_f6ba57dff679ccbcfe004698ec"`); | ||||
|         await queryRunner.query(`DROP INDEX "public"."IDX_01cd2b829e0263917bf570cb67"`); | ||||
|         await queryRunner.query(`COMMENT ON COLUMN "event"."userHost" IS '[Denormalized]'`); | ||||
|         await queryRunner.query(`ALTER TABLE "event" DROP COLUMN "userHost"`); | ||||
|         await queryRunner.query(`COMMENT ON COLUMN "event"."userId" IS '[Denormalized]'`); | ||||
|         await queryRunner.query(`ALTER TABLE "event" DROP COLUMN "userId"`); | ||||
|         await queryRunner.query(`COMMENT ON COLUMN "event"."noteVisibility" IS '[Denormalized]'`); | ||||
|         await queryRunner.query(`ALTER TABLE "event" DROP COLUMN "noteVisibility"`); | ||||
|         await queryRunner.query(`DROP TYPE "public"."event_notevisibility_enum"`); | ||||
|         await queryRunner.query(`ALTER TABLE "note" RENAME COLUMN "hasEvent" TO "isEvent"`); | ||||
|     } | ||||
| } | ||||
|  | @ -1,6 +1,8 @@ | |||
| import { Entity, Index, Column, PrimaryColumn, OneToOne, JoinColumn } from 'typeorm'; | ||||
| import { id } from '../id.js'; | ||||
| import { noteVisibilities } from '../../types.js'; | ||||
| import { Note } from './Note.js'; | ||||
| import type { User } from './User.js'; | ||||
| 
 | ||||
| @Entity() | ||||
| export class Event { | ||||
|  | @ -37,4 +39,41 @@ export class Event { | |||
| 		comment: 'metadata mapping for event with more user configurable optional information', | ||||
| 	}) | ||||
| 	public metadata: Record<string, string>; | ||||
| 
 | ||||
| 	//#region Denormalized fields
 | ||||
| 	@Column('enum', { | ||||
| 		enum: noteVisibilities, | ||||
| 		comment: '[Denormalized]', | ||||
| 	}) | ||||
| 	public noteVisibility: typeof noteVisibilities[number]; | ||||
| 
 | ||||
| 	@Index() | ||||
| 	@Column({ | ||||
| 		...id(), | ||||
| 		comment: '[Denormalized]', | ||||
| 	}) | ||||
| 	public userId: User['id']; | ||||
| 
 | ||||
| 	@Index() | ||||
| 	@Column('varchar', { | ||||
| 		length: 128, nullable: true, | ||||
| 		comment: '[Denormalized]', | ||||
| 	}) | ||||
| 	public userHost: string | null; | ||||
| 	//#endregion
 | ||||
| 
 | ||||
| 	constructor(data: Partial<Event>) { | ||||
| 		if (data == null) return; | ||||
| 
 | ||||
| 		for (const [k, v] of Object.entries(data)) { | ||||
| 			(this as any)[k] = v; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| export type IEvent = { | ||||
| 	start: Date; | ||||
| 	end: Date | null | ||||
| 	title: string; | ||||
| 	metadata: Record<string, string>; | ||||
| } | ||||
|  |  | |||
|  | @ -56,7 +56,7 @@ export class Note { | |||
| 	@Column('boolean', { | ||||
| 		default: false, | ||||
| 	}) | ||||
| 	public isEvent: boolean; | ||||
| 	public hasEvent: boolean; | ||||
| 
 | ||||
| 	// TODO: varcharにしたい
 | ||||
| 	@Column('text', { | ||||
|  |  | |||
|  | @ -150,6 +150,12 @@ export type Note = { | |||
| 	replyId: Note['id']; | ||||
| 	renote?: Note; | ||||
| 	renoteId: Note['id']; | ||||
| 	event?: { | ||||
| 		title: string, | ||||
| 		start: DateString, | ||||
| 		end: DateString | null, | ||||
| 		metadata: Record<string, string>, | ||||
| 	}; | ||||
| 	files: DriveFile[]; | ||||
| 	fileIds: DriveFile['id'][]; | ||||
| 	visibility: 'public' | 'home' | 'followers' | 'specified'; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue