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: /// - Returns:
public func hasUnigramsFor(keyArray: [String]) -> Bool { public func hasUnigramsFor(keyArray: [String]) -> Bool {
let keyChain = keyArray.joined(separator: "-") 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 } 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 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 { while sqlite3_step(ptrStatement) == SQLITE_ROW {
guard sqlite3_column_text(ptrStatement, column.id) != nil else { continue } return sqlite3_column_int(ptrStatement, 0) == 1
return true
} }
return false return false
} }
@ -165,12 +168,13 @@ extension vChewingLM.LMInstantiator {
/// UTF8 /// UTF8
/// - parameters: /// - parameters:
/// - key: /// - key:
func hasFactoryCoreUnigramsFor(key: String) -> Bool { func hasFactoryCoreUnigramsFor(keyArray: [String]) -> Bool {
let column: CoreColumn = isCHS ? .theDataCHS : .theDataCHT let column: CoreColumn = isCHS ? .theDataCHS : .theDataCHT
// ASCII SQLite // ASCII SQLite
let encryptedKey = Self.cnvPhonabetToASCII(key.replacingOccurrences(of: "'", with: "''")) let encryptedKey = Self.cnvPhonabetToASCII(keyArray.joined(separator: "-").replacingOccurrences(of: "'", with: "''"))
let sqlQuery = "SELECT * FROM DATA_MAIN WHERE theKey='\(encryptedKey)';" // SELECT EXISTS();
return Self.hasSQLResult(strStmt: sqlQuery, coreColumn: column) let sqlQuery = "SELECT * FROM DATA_MAIN WHERE theKey='\(encryptedKey)' AND \(column.name) IS NOT NULL"
return Self.hasSQLResult(strStmt: sqlQuery)
} }
} }