LMAssembly // Faster query speed to check data existence.

This commit is contained in:
ShikiSuen 2023-12-01 12:05:18 +08:00
parent 161aa100cc
commit bbe1b409c5
2 changed files with 13 additions and 9 deletions

View File

@ -274,7 +274,7 @@ public extension vChewingLM {
/// - Returns:
public func hasUnigramsFor(keyArray: [String]) -> Bool {
let keyChain = keyArray.joined(separator: "-")
return keyChain == " " || (!unigramsFor(keyArray: keyArray).isEmpty && !keyChain.isEmpty)
return keyChain == " " || (hasFactoryCoreUnigramsFor(keyArray: keyArray) && !keyChain.isEmpty)
}
///

View File

@ -66,13 +66,16 @@ extension vChewingLM.LMInstantiator {
}
}
fileprivate static func hasSQLResult(strStmt sqlQuery: String, coreColumn column: CoreColumn) -> Bool {
fileprivate static func hasSQLResult(strStmt sqlQuery: String) -> Bool {
guard Self.ptrSQL != nil else { return false }
var sqlQuery = sqlQuery
if sqlQuery.last == ";" { sqlQuery = sqlQuery.dropLast(1).description } //
guard !sqlQuery.isEmpty else { return false }
return performStatement { ptrStatement in
sqlite3_prepare_v2(Self.ptrSQL, sqlQuery, -1, &ptrStatement, nil)
let wrappedQuery = "SELECT EXISTS(\(sqlQuery));"
sqlite3_prepare_v2(Self.ptrSQL, wrappedQuery, -1, &ptrStatement, nil)
while sqlite3_step(ptrStatement) == SQLITE_ROW {
guard sqlite3_column_text(ptrStatement, column.id) != nil else { continue }
return true
return sqlite3_column_int(ptrStatement, 0) == 1
}
return false
}
@ -165,12 +168,13 @@ extension vChewingLM.LMInstantiator {
/// UTF8
/// - parameters:
/// - key:
func hasFactoryCoreUnigramsFor(key: String) -> Bool {
func hasFactoryCoreUnigramsFor(keyArray: [String]) -> Bool {
let column: CoreColumn = isCHS ? .theDataCHS : .theDataCHT
// ASCII SQLite
let encryptedKey = Self.cnvPhonabetToASCII(key.replacingOccurrences(of: "'", with: "''"))
let sqlQuery = "SELECT * FROM DATA_MAIN WHERE theKey='\(encryptedKey)';"
return Self.hasSQLResult(strStmt: sqlQuery, coreColumn: column)
let encryptedKey = Self.cnvPhonabetToASCII(keyArray.joined(separator: "-").replacingOccurrences(of: "'", with: "''"))
// SELECT EXISTS();
let sqlQuery = "SELECT * FROM DATA_MAIN WHERE theKey='\(encryptedKey)' AND \(column.name) IS NOT NULL"
return Self.hasSQLResult(strStmt: sqlQuery)
}
}