diff --git a/src/main/kotlin/net/taehui/twilight/system/DB.kt b/src/main/kotlin/net/taehui/twilight/system/DB.kt index eccb7cc..bcc0bdc 100644 --- a/src/main/kotlin/net/taehui/twilight/system/DB.kt +++ b/src/main/kotlin/net/taehui/twilight/system/DB.kt @@ -50,7 +50,15 @@ Ability_7K REAL, Ability_9K REAL, Length REAL, - PRIMARY KEY (Note_ID) + PRIMARY KEY (Note_ID), + KEY (Note_Variety), + FULLTEXT (Artist), + FULLTEXT (Title), + FULLTEXT (Genre), + KEY (Is_Salt), + KEY (Ability_5K), + KEY (Ability_7K), + KEY (Ability_9K) ) ENGINE=InnoDB """.trimIndent() ) @@ -82,6 +90,15 @@ Is_Paused BOOLEAN, Input_Flags INTEGER, FOREIGN KEY (Avatar) REFERENCES tn_avatar(Avatar_ID) ON UPDATE CASCADE ON DELETE CASCADE, + KEY (Date), + KEY (Note_ID), + KEY (Avatar), + KEY (Judgment_Mode), + KEY (Hit_Points_Mode), + KEY (Input_Favor_Mode), + KEY (Stand), + KEY (Comment_ID), + KEY (Is_Max), CHECK (Multiplier >= 0.0), CHECK (Auto_Mode IN (0, 1)), CHECK (Note_Salt_Mode IN (0, 1, 2, 4, 11, 13)), @@ -140,6 +157,7 @@ Notify_Save_Bundle INTEGER, PRIMARY KEY (Avatar), FOREIGN KEY (Avatar) REFERENCES tn_avatar(Avatar_ID) ON UPDATE CASCADE ON DELETE CASCADE, + KEY (Notify_Ubuntu), CHECK (Silent_Site IN (0, 1, 2, 3)), CHECK (Notify_Ubuntu IN (0, 1)), CHECK (Default_Bundle_Competence IN (0, 1, 2, 3)), @@ -164,7 +182,8 @@ Avatar VARCHAR(20), Edge_ID CHAR(36), PRIMARY KEY (Avatar), - FOREIGN KEY (Avatar) REFERENCES tn_avatar(Avatar_ID) ON UPDATE CASCADE ON DELETE CASCADE + FOREIGN KEY (Avatar) REFERENCES tn_avatar(Avatar_ID) ON UPDATE CASCADE ON DELETE CASCADE, + KEY (Edge_ID) ) ENGINE=InnoDB """.trimIndent() ) @@ -176,7 +195,9 @@ Avatar_Name VARCHAR(255), Date LONG, Site_Yell TEXT, - Platform_ID LONG + Platform_ID LONG, + KEY (Site_ID), + KEY (Platform_ID) ) ENGINE=InnoDB """.trimIndent() ) @@ -1839,7 +1860,7 @@ fun getNote(qm: Map): CompletableFuture { return logValueFuture { val noteVariety = (qm["noteVariety"] ?: "0").toInt() - val want = (qm["want"] ?: "").replace("%".toRegex(), "\\\\%").replace("_".toRegex(), "\\\\_") + val want = qm["want"] ?: "" val src = qm["src"] ?: "0" val fit = qm["fit"] ?: "0" val page = (qm["page"] ?: "1").toInt() @@ -1878,32 +1899,32 @@ "0" -> """ SELECT COUNT(Comment_ID) AS Total_Count, COUNT(DISTINCT tw_note.Note_ID, Avatar) AS Highest_Count, COUNT(DISTINCT tw_note.Note_ID) AS Note_Count FROM tw_note, tw_comment - WHERE tw_note.Note_ID = tw_comment.Note_ID AND Title LIKE ? ESCAPE "\\" + WHERE tw_note.Note_ID = tw_comment.Note_ID AND MATCH(Title) AGAINST(?) """.trimIndent() "1" -> """ SELECT COUNT(Comment_ID) AS Total_Count, COUNT(DISTINCT tw_note.Note_ID, Avatar) AS Highest_Count, COUNT(DISTINCT tw_note.Note_ID) AS Note_Count FROM tw_note, tw_comment, tn_avatar - WHERE tw_note.Note_ID = tw_comment.Note_ID AND Avatar = Avatar_ID AND Avatar_Name LIKE ? ESCAPE "\\" + WHERE tw_note.Note_ID = tw_comment.Note_ID AND Avatar = Avatar_ID AND MATCH(Avatar_Name) AGAINST(?) """.trimIndent() "2" -> """ SELECT COUNT(Comment_ID) AS Total_Count, COUNT(DISTINCT tw_note.Note_ID, Avatar) AS Highest_Count, COUNT(DISTINCT tw_note.Note_ID) AS Note_Count FROM tw_note, tw_comment - WHERE tw_note.Note_ID = tw_comment.Note_ID AND Artist LIKE ? ESCAPE "\\" + WHERE tw_note.Note_ID = tw_comment.Note_ID AND MATCH(Artist) AGAINST(?) """.trimIndent() "3" -> """ SELECT COUNT(Comment_ID) AS Total_Count, COUNT(DISTINCT tw_note.Note_ID, Avatar) AS Highest_Count, COUNT(DISTINCT tw_note.Note_ID) AS Note_Count FROM tw_note, tw_comment - WHERE tw_note.Note_ID = tw_comment.Note_ID AND Genre LIKE ? ESCAPE "\\" + WHERE tw_note.Note_ID = tw_comment.Note_ID AND MATCH(Genre) AGAINST(?) """.trimIndent() else -> null } + noteVarietyStatement1 ).use { dbStatement -> if (dbStatement != null) { - dbStatement.setString(1, "%$want%") + dbStatement.setString(1, want) dbStatement.executeQuery().use { rows -> if (rows.next()) { totalCount = rows.getInt("Total_Count") @@ -1952,7 +1973,7 @@ """ SELECT $asStatement FROM tw_note - WHERE Title LIKE ? ESCAPE "\\" $noteVarietyStatement1 $fitStatement LIMIT ?, ? + WHERE MATCH(Title) AGAINST(?) $noteVarietyStatement1 $fitStatement LIMIT ?, ? """.trimIndent() ) @@ -1960,7 +1981,7 @@ """ SELECT $asStatement FROM tw_note, tw_comment, tn_avatar - WHERE tw_note.Note_ID = tw_comment.Note_ID AND Avatar = Avatar_ID AND Avatar_Name LIKE ? ESCAPE "\\" $noteVarietyStatement1 $fitStatement LIMIT ?, ? + WHERE tw_note.Note_ID = tw_comment.Note_ID AND Avatar = Avatar_ID AND MATCH(Avatar_Name) AGAINST(?) $noteVarietyStatement1 $fitStatement LIMIT ?, ? """.trimIndent() ) @@ -1968,7 +1989,7 @@ """ SELECT $asStatement FROM tw_note - WHERE Artist LIKE ? ESCAPE "\\" $noteVarietyStatement1 $fitStatement LIMIT ?, ? + WHERE MATCH(Artist) AGAINST(?) ESCAPE "\\" $noteVarietyStatement1 $fitStatement LIMIT ?, ? """.trimIndent() ) @@ -1976,13 +1997,13 @@ """ SELECT $asStatement FROM tw_note - WHERE Genre LIKE ? ESCAPE "\\" $noteVarietyStatement1 $fitStatement LIMIT ?, ? + WHERE MATCH(Genre) AGAINST(?) ESCAPE "\\" $noteVarietyStatement1 $fitStatement LIMIT ?, ? """.trimIndent() ) else -> null } - dbStatement?.setString(1, "%$want%") + dbStatement?.setString(1, want) dbStatement?.setInt(2, viewUnit * (page - 1)) dbStatement?.setInt(3, viewUnit) } @@ -2149,10 +2170,10 @@ """ SELECT Avatar_ID, Avatar_Name, Avatar_Intro FROM tn_avatar - WHERE Avatar_Name LIKE ? + WHERE MATCH(Avatar_Name) AGAINST(?) """.trimIndent() ).use { dbStatement -> - dbStatement.setString(1, "%$wantAvatarName%") + dbStatement.setString(1, wantAvatarName) dbStatement.executeQuery().use { rows -> while (rows.next()) { wantAvatars.add(object { @@ -2321,21 +2342,19 @@ pool.connection.use { db -> val highestDateValue = System.currentTimeMillis() for (i in 90 downTo 0) { + val yyyyMMDD = yyyyMMDDFormat.format( + Instant.ofEpochMilli(highestDateValue - 86400000L * i) + .atZone(ZoneId.systemDefault()) + ) dateSet.add(highestDateValue - 86400000L * i) db.prepareStatement( """ SELECT COUNT(Comment_ID) AS Count FROM tw_comment - WHERE Avatar = ? AND DATE_FORMAT(Date, "%Y-%m-%d") = ? + WHERE Avatar = ? AND Date BETWEEN "$yyyyMMDD 00:00:00" AND "$yyyyMMDD 23:59:59" """.trimIndent() ).use { it.setString(1, avatarID) - it.setString( - 2, yyyyMMDDFormat.format( - Instant.ofEpochMilli(highestDateValue - 86400000L * i) - .atZone(ZoneId.systemDefault()) - ) - ) it.executeQuery().use { rows -> if (rows.next()) { dateValues.add(rows.getInt("Count")) @@ -2907,6 +2926,8 @@ } fun getEtc(language: String): CompletableFuture { + val yyyyMM = yyyyMMFormat.format(Instant.now()) + val totalDateSet = mutableListOf() val totalDateValues = mutableListOf() val signUpDateSet = mutableListOf() @@ -2994,13 +3015,12 @@ """ SELECT tw_comment.Note_ID, Title, Artist, Genre, Level, Level_Text, COUNT(tw_comment.Note_ID) AS Value FROM tw_note, tw_comment - WHERE tw_note.Note_ID = tw_comment.Note_ID AND DATE_FORMAT(Date, "%Y-%m") = ? + WHERE tw_note.Note_ID = tw_comment.Note_ID AND Date BETWEEN "$yyyyMM-01" AND "$yyyyMM-31" GROUP BY tw_comment.Note_ID ORDER BY Value DESC LIMIT 10; """.trimIndent() ).use { dbStatement -> - dbStatement.setString(1, yyyyMMFormat.format(Instant.now())) dbStatement.executeQuery().use { rows -> while (rows.next()) { totalNoteFileValues.add(object { @@ -3102,13 +3122,12 @@ """ SELECT tw_favor.Note_ID, Title, Artist, Genre, Level, Level_Text, SUM(2 * Favor - 1) AS Value FROM tw_note, tw_favor - WHERE tw_note.Note_ID = tw_favor.Note_ID AND DATE_FORMAT(Date, "%Y-%m") = ? + WHERE tw_note.Note_ID = tw_favor.Note_ID AND Date BETWEEN "$yyyyMM-01" AND "$yyyyMM-31" GROUP BY tw_favor.Note_ID ORDER BY Value DESC LIMIT 10; """.trimIndent() ).use { dbStatement -> - dbStatement.setString(1, yyyyMMFormat.format(Instant.now())) dbStatement.executeQuery().use { rows -> while (rows.next()) { favoriteNoteFileAtValues.add(object {