LMAssembly // Faster query speed to check data existence.
This commit is contained in:
parent
161aa100cc
commit
bbe1b409c5
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 根據給定的索引鍵和資料值,確認是否有該具體的資料值在庫。
|
/// 根據給定的索引鍵和資料值,確認是否有該具體的資料值在庫。
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue