optimize single player search

This commit is contained in:
Robin Appelman 2024-01-20 17:25:07 +01:00
commit 3e79a76e1b
2 changed files with 36 additions and 22 deletions

View file

@ -456,29 +456,41 @@ impl Filter {
.and_where(Expr::col((Alias::new("upload_user"), Users::SteamId)).eq(uploader)); .and_where(Expr::col((Alias::new("upload_user"), Users::SteamId)).eq(uploader));
} }
if !self.players.is_empty() && self.players.len() < 19 { if !self.players.is_empty() && self.players.len() < 19 {
let mut player = self.players.iter(); if self.players.len() == 1 {
let mut players_arr = format!("array['{}'", player.next().unwrap()); let player = &self.players[0];
for player in player { query
write!(&mut players_arr, r#",'{}'"#, player).unwrap(); .inner_join(
} Players::Table,
players_arr.push(']'); Expr::col((Demos::Table, Demos::Id))
.equals((Players::Table, Players::DemoId)),
)
.and_where(Expr::col((Players::Table, Players::SteamId)).eq(player));
} else {
let mut player = self.players.iter();
let mut players_arr = format!("array['{}'", player.next().unwrap());
for player in player {
write!(&mut players_arr, r#",'{}'"#, player).unwrap();
}
players_arr.push(']');
query query
.inner_join( .inner_join(
Players::Table, Players::Table,
Expr::col((Demos::Table, Demos::Id)).equals((Players::Table, Players::DemoId)), Expr::col((Demos::Table, Demos::Id))
) .equals((Players::Table, Players::DemoId)),
.inner_join( )
Users::Table, .and_where(
Expr::col((Users::Table, Users::Id)).equals((Players::Table, Players::UserId)), Expr::col((Players::Table, Players::SteamId)).is_in(self.players.clone()),
) );
.and_where(Expr::col((Users::Table, Users::SteamId)).is_in(self.players.clone())); query.group_by_col((Demos::Table, Players::Id));
query.group_by_col((Demos::Table, Players::Id)); query.and_having(
query.and_having( Expr::cust(&players_arr)
Expr::cust(&players_arr) .cast_as(Alias::new("text[]"))
.cast_as(Alias::new("varchar[]")) .contained(
.contained(Func::cust(ArrayAgg).arg(Expr::col((Users::Table, Users::SteamId)))), Func::cust(ArrayAgg).arg(Expr::col((Players::Table, Players::SteamId))),
); ),
);
}
} }
} }
} }

View file

@ -91,6 +91,8 @@ pub enum Players {
Assists, Assists,
#[iden = "deaths"] #[iden = "deaths"]
Deaths, Deaths,
#[iden = "steam_id"]
SteamId,
} }
#[allow(dead_code)] #[allow(dead_code)]