@@ -35,6 +35,58 @@ export default class Event extends ClickHouseEntity<ClickHouseEvent, [string, Ga
3535 createdAt ! : Date
3636 updatedAt : Date = new Date ( )
3737
38+ static async massHydrate ( em : EntityManager , data : ClickHouseEvent [ ] , clickhouse : ClickHouseClient , loadProps : boolean = false ) : Promise < Event [ ] > {
39+ const playerAliasIds = Array . from ( new Set ( data . map ( ( event ) => event . player_alias_id ) ) )
40+
41+ const playerAliases = await em . getRepository ( PlayerAlias ) . find ( {
42+ id : {
43+ $in : playerAliasIds
44+ }
45+ } , { populate : [ 'player' ] } )
46+
47+ const playerAliasesMap = new Map < number , PlayerAlias > ( )
48+ playerAliases . forEach ( ( alias ) => playerAliasesMap . set ( alias . id , alias ) )
49+
50+ const propsMap = new Map < string , Prop [ ] > ( )
51+ if ( loadProps ) {
52+ const eventIds = data . map ( ( event ) => event . id )
53+ if ( eventIds . length > 0 ) {
54+ const props = await clickhouse . query ( {
55+ query : 'SELECT * FROM event_props WHERE event_id IN ({eventIds:Array(String)})' ,
56+ query_params : { eventIds } ,
57+ format : 'JSONEachRow'
58+ } ) . then ( ( res ) => res . json < ClickHouseEventProp > ( ) )
59+
60+ props . forEach ( ( prop ) => {
61+ if ( ! propsMap . has ( prop . event_id ) ) {
62+ propsMap . set ( prop . event_id , [ ] )
63+ }
64+ propsMap . get ( prop . event_id ) ! . push ( new Prop ( prop . prop_key , prop . prop_value ) )
65+ } )
66+ }
67+ }
68+
69+ return data . map ( ( eventData ) => {
70+ const playerAlias = playerAliasesMap . get ( eventData . player_alias_id )
71+ if ( ! playerAlias ) {
72+ return null
73+ }
74+
75+ const event = new Event ( )
76+ event . construct ( eventData . name , playerAlias . player . game )
77+ event . id = eventData . id
78+ event . playerAlias = playerAlias
79+ event . createdAt = new Date ( eventData . created_at )
80+ event . updatedAt = new Date ( eventData . updated_at )
81+
82+ if ( loadProps ) {
83+ event . props = propsMap . get ( eventData . id ) || [ ]
84+ }
85+
86+ return event
87+ } ) . filter ( ( event ) => ! ! event )
88+ }
89+
3890 construct ( name : string , game : Game ) : this {
3991 this . name = name
4092 this . game = game
@@ -91,7 +143,8 @@ export default class Event extends ClickHouseEntity<ClickHouseEvent, [string, Ga
91143
92144 if ( loadProps ) {
93145 const props = await clickhouse . query ( {
94- query : `SELECT * FROM event_props WHERE event_id = '${ data . id } '` ,
146+ query : 'SELECT * FROM event_props WHERE event_id = {eventId:String}' ,
147+ query_params : { eventId : data . id } ,
95148 format : 'JSONEachRow'
96149 } ) . then ( ( res ) => res . json < ClickHouseEventProp > ( ) )
97150
0 commit comments