Commit 673dedd6 authored by nanahira's avatar nanahira

add conditional query

parent aa69147c
......@@ -230,6 +230,46 @@ class DataManager {
return [];
}
}
async getDuelLogFromCondition(data) {
if (!data) {
return this.getAllDuelLogs();
}
const { roomName, duelCount, playerName, playerScore } = data;
const repo = this.db.getRepository(DuelLog_1.DuelLog);
try {
const queryBuilder = repo.createQueryBuilder("duelLog")
.where("1");
if (roomName != null && roomName.length) {
const escapedRoomName = roomName.replace(/[%_]/g, "") + "%";
queryBuilder.andWhere("duelLog.name like :escapedRoomName", { escapedRoomName });
}
if (duelCount != null && !isNaN(duelCount)) {
queryBuilder.andWhere("duelLog.duelCount = :duelCount", { duelCount });
}
if (playerName != null && playerName.length || playerScore != null && !isNaN(playerScore)) {
let innerQuery = "select id from duel_log_player where duel_log_player.duelLogId = duelLog.id";
const innerQueryParams = {};
if (playerName != null && playerName.length) {
const escapedPlayerName = playerName.replace(/[%_]/g, "") + "%";
innerQuery += " and duel_log_player.escapedPlayerName like :escapedPlayerName";
innerQueryParams.playerRealName = escapedPlayerName;
}
if (playerScore != null && !isNaN(playerScore)) {
innerQuery += " and duel_log_player.score = :playerScore";
innerQueryParams.playerScore = playerScore;
}
queryBuilder.andWhere(`exists (${innerQuery})`, innerQueryParams);
}
const duelLogs = queryBuilder.orderBy("duelLog.id", "DESC")
.leftJoinAndSelect("duelLog.players", "player")
.getMany();
return duelLogs;
}
catch (e) {
this.log.warn(`Failed to fetch duel logs: ${e.toString()}`);
return [];
}
}
async getDuelLogFromId(id) {
const repo = this.db.getRepository(DuelLog_1.DuelLog);
try {
......@@ -261,10 +301,18 @@ class DataManager {
const allDuelLogs = await this.getAllDuelLogs();
return allDuelLogs.map(duelLog => duelLog.getViewJSON(tournamentModeSettings));
}
async getDuelLogJSONFromCondition(tournamentModeSettings, data) {
const allDuelLogs = await this.getDuelLogFromCondition(data);
return allDuelLogs.map(duelLog => duelLog.getViewJSON(tournamentModeSettings));
}
async getAllReplayFilenames() {
const allDuelLogs = await this.getAllDuelLogs();
return allDuelLogs.map(duelLog => duelLog.replayFileName);
}
async getReplayFilenamesFromCondition(data) {
const allDuelLogs = await this.getDuelLogFromCondition(data);
return allDuelLogs.map(duelLog => duelLog.replayFileName);
}
async clearDuelLog() {
const runner = this.db.createQueryRunner();
try {
......
......@@ -33,6 +33,8 @@ export interface DuelLogPlayerInfo extends BasePlayerInfo {
cardCount: number;
}
export interface DuelLogQuery {roomName: string, duelCount: number, playerName: string, playerScore: number}
export class DataManager {
config: ConnectionOptions;
......@@ -254,6 +256,46 @@ export class DataManager {
}
async getDuelLogFromCondition(data: DuelLogQuery) {
if(!data) {
return this.getAllDuelLogs();
}
const {roomName, duelCount, playerName, playerScore} = data;
const repo = this.db.getRepository(DuelLog);
try {
const queryBuilder = repo.createQueryBuilder("duelLog")
.where("1");
if(roomName != null && roomName.length) {
const escapedRoomName = roomName.replace(/[%_]/g, "") + "%";
queryBuilder.andWhere("duelLog.name like :escapedRoomName", { escapedRoomName });
}
if(duelCount != null && !isNaN(duelCount)) {
queryBuilder.andWhere("duelLog.duelCount = :duelCount", { duelCount });
}
if(playerName != null && playerName.length || playerScore != null && !isNaN(playerScore)) {
let innerQuery = "select id from duel_log_player where duel_log_player.duelLogId = duelLog.id";
const innerQueryParams: any = {};
if(playerName != null && playerName.length) {
const escapedPlayerName = playerName.replace(/[%_]/g, "") + "%";
innerQuery += " and duel_log_player.escapedPlayerName like :escapedPlayerName";
innerQueryParams.playerRealName = escapedPlayerName;
}
if(playerScore != null && !isNaN(playerScore)) {
innerQuery += " and duel_log_player.score = :playerScore";
innerQueryParams.playerScore = playerScore;
}
queryBuilder.andWhere(`exists (${innerQuery})`, innerQueryParams);
}
const duelLogs = queryBuilder.orderBy("duelLog.id", "DESC")
.leftJoinAndSelect("duelLog.players", "player")
.getMany();
return duelLogs;
} catch (e) {
this.log.warn(`Failed to fetch duel logs: ${e.toString()}`);
return [];
}
}
async getDuelLogFromId(id: number) {
const repo = this.db.getRepository(DuelLog);
try {
......@@ -289,10 +331,18 @@ export class DataManager {
const allDuelLogs = await this.getAllDuelLogs();
return allDuelLogs.map(duelLog => duelLog.getViewJSON(tournamentModeSettings));
}
async getDuelLogJSONFromCondition(tournamentModeSettings: any, data: DuelLogQuery) {
const allDuelLogs = await this.getDuelLogFromCondition(data);
return allDuelLogs.map(duelLog => duelLog.getViewJSON(tournamentModeSettings));
}
async getAllReplayFilenames() {
const allDuelLogs = await this.getAllDuelLogs();
return allDuelLogs.map(duelLog => duelLog.replayFileName);
}
async getReplayFilenamesFromCondition(data: DuelLogQuery) {
const allDuelLogs = await this.getDuelLogFromCondition(data);
return allDuelLogs.map(duelLog => duelLog.replayFileName);
}
async clearDuelLog() {
const runner = this.db.createQueryRunner();
try {
......
......@@ -77,6 +77,7 @@ __decorate([
__metadata("design:type", Number)
], DuelLog.prototype, "roomMode", void 0);
__decorate([
typeorm_1.Index(),
typeorm_1.Column("tinyint", { unsigned: true }),
__metadata("design:type", Number)
], DuelLog.prototype, "duelCount", void 0);
......
......@@ -33,6 +33,7 @@ export class DuelLog extends CreateAndUpdateTimeBase {
@Column("tinyint", {unsigned: true})
roomMode: number;
@Index()
@Column("tinyint", {unsigned: true})
duelCount: number;
......
......@@ -66,6 +66,7 @@ __decorate([
__metadata("design:type", Number)
], DuelLogPlayer.prototype, "isFirst", void 0);
__decorate([
typeorm_1.Index(),
typeorm_1.Column("tinyint"),
__metadata("design:type", Number)
], DuelLogPlayer.prototype, "score", void 0);
......
......@@ -16,6 +16,7 @@ export class DuelLogPlayer extends BasePlayer {
@Column("tinyint", {unsigned: true})
isFirst: number;
@Index()
@Column("tinyint")
score: number;
......
......@@ -3643,6 +3643,18 @@ global.rebooted = false
#http
if true
getDuelLogQueryFromQs = (qdata) ->
ret = {}
if(qdata.roomname)
ret.roomName = decodeURIComponent(qdata.roomname)
if(qdata.duelcount)
ret.roomName = parseInt(decodeURIComponent(qdata.duelcount))
if(qdata.playername)
ret.playerName = decodeURIComponent(qdata.playername)
if(qdata.score)
ret.playerScore = parseInt(decodeURIComponent(qdata.score))
return
addCallback = (callback, text)->
if not callback then return text
return callback + "( " + text + " );"
......@@ -3696,7 +3708,7 @@ if true
return
else
response.writeHead(200)
duellog = JSON.stringify(await dataManager.getDuelLogJSON(settings.modules.tournament_mode), null, 2)
duellog = JSON.stringify(await dataManager.getDuelLogJSONFromCondition(settings.modules.tournament_mode, getDuelLogQueryFromQs(u.query)), null, 2)
response.end(addCallback(u.query.callback, duellog))
else if u.pathname == '/api/archive.zip' and settings.modules.mysql.enabled
......@@ -3709,7 +3721,7 @@ if true
archive_name = moment().format('YYYY-MM-DD HH-mm-ss') + ".zip"
archive_args = ["a", "-mx0", "-y", archive_name]
check = false
for filename in await dataManager.getAllReplayFilenames()
for filename in await dataManager.getReplayFilenamesFromCondition(getDuelLogQueryFromQs(u.query))
check = true
archive_args.push(filename)
if !check
......
// Generated by CoffeeScript 2.5.1
(function() {
// 标准库
var CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, _, _async, addCallback, athleticChecker, auth, axios, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_queue_callbacks, checkFileExists, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, fs, geoip, getSeedTimet, get_callback, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, is_challonge_requesting, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_tips, log, long_resolve_cards, memory_usage, merge, moment, net, netRequestHandler, os, path, qs, real_windbot_server_ip, refresh_challonge_cache, release_disconnect, replaced_index, report_to_big_brother, request, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, ygopro, zlib;
var CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, _, _async, addCallback, athleticChecker, auth, axios, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_queue_callbacks, checkFileExists, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, fs, geoip, getDuelLogQueryFromQs, getSeedTimet, get_callback, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, is_challonge_requesting, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_tips, log, long_resolve_cards, memory_usage, merge, moment, net, netRequestHandler, os, path, qs, real_windbot_server_ip, refresh_challonge_cache, release_disconnect, replaced_index, report_to_big_brother, request, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, ygopro, zlib;
net = require('net');
......@@ -4865,6 +4865,22 @@
//http
if (true) {
getDuelLogQueryFromQs = function(qdata) {
var ret;
ret = {};
if (qdata.roomname) {
ret.roomName = decodeURIComponent(qdata.roomname);
}
if (qdata.duelcount) {
ret.roomName = parseInt(decodeURIComponent(qdata.duelcount));
}
if (qdata.playername) {
ret.playerName = decodeURIComponent(qdata.playername);
}
if (qdata.score) {
ret.playerScore = parseInt(decodeURIComponent(qdata.score));
}
};
addCallback = function(callback, text) {
if (!callback) {
return text;
......@@ -4935,7 +4951,7 @@
return;
} else {
response.writeHead(200);
duellog = JSON.stringify((await dataManager.getDuelLogJSON(settings.modules.tournament_mode)), null, 2);
duellog = JSON.stringify((await dataManager.getDuelLogJSONFromCondition(settings.modules.tournament_mode, getDuelLogQueryFromQs(u.query))), null, 2);
response.end(addCallback(u.query.callback, duellog));
}
} else if (u.pathname === '/api/archive.zip' && settings.modules.mysql.enabled) {
......@@ -4948,7 +4964,7 @@
archive_name = moment().format('YYYY-MM-DD HH-mm-ss') + ".zip";
archive_args = ["a", "-mx0", "-y", archive_name];
check = false;
ref = (await dataManager.getAllReplayFilenames());
ref = (await dataManager.getReplayFilenamesFromCondition(getDuelLogQueryFromQs(u.query)));
for (j = 0, len = ref.length; j < len; j++) {
filename = ref[j];
check = true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment