forked from torifat/iAvro
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDatabase.swift
More file actions
119 lines (101 loc) · 4.11 KB
/
Copy pathDatabase.swift
File metadata and controls
119 lines (101 loc) · 4.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//
// Database.swift
// AvroKeyboard
//
// Created by Mamnun Bhuiyan on 27/4/17.
//
//
import Foundation
/// A helper/utility class that loads the database.db3 sqlite database which is basically a bengaliy dictionary. The db file contains huge list of legit bangla words partitioned into multiple tables by word-prefix. Also contains available bengali suffix eg. ta, khana which can be used with other words like boita, teblekhana etc.
@objc public class Database: NSObject {
fileprivate var db:[String:[String]] = [:]
fileprivate var suffixList:[String:String] = [:]
static let shared: Database = Database()
static let tables:[String] = ["A", "AA", "B", "BH",
"C", "CH", "D", "Dd", "Ddh", "Dh",
"E", "G", "Gh", "H", "I", "II",
"J", "JH", "K", "KH", "Khandatta",
"L", "M", "N", "NGA", "NN", "NYA",
"O","OI", "OU", "P", "PH",
"R", "RR", "RRH", "RRI",
"S", "SH", "SS",
"T", "TH", "TT", "TTH",
"U", "UU", "Y", "Z"];
static let prefixToTableMap: [Character:[String]] = [
"a" : ["a", "aa", "e", "oi", "o", "nya", "y"],
"b" : ["b", "bh"],
"c" : ["c", "ch", "k"],
"d" : ["d", "dh", "dd", "ddh"],
"e" : ["i", "ii", "e", "y"],
"f" : ["ph"],
"g" : ["g", "gh", "j"],
"h" : ["h"],
"i" : ["i", "ii", "y"],
"j" : ["j", "jh", "z"],
"k" : ["k", "kh"],
"l" : ["l"],
"m" : ["h", "m"],
"n" : ["n", "nya", "nga", "nn"],
"o" : ["a", "u", "uu", "oi", "o", "ou", "y"],
"p" : ["p", "ph"],
"q" : ["k"],
"r" : ["rri", "h", "r", "rr", "rrh"],
"s" : ["s", "sh", "ss"],
"t" : ["t", "th", "tt", "tth", "khandatta"],
"u" : ["u", "uu", "y"],
"v" : ["bh"],
"w" : ["o"],
"x" : ["e", "k"],
"y" : ["i", "y"],
"z" : ["h", "j", "jh", "z"]
]
override init() {
super.init()
autoreleasepool {
guard let filePath = Bundle.main.path(forResource: "database", ofType: "db3"),
let dbase = FMDatabase(path: filePath) else {
return
}
dbase.open()
for tableName in Database.tables {
loadTable(name: tableName, from: dbase)
}
loadSuffixTable(from: dbase)
dbase.close()
}
}
public func find(_ term:String) -> [String] {
//lmc = left most character
guard let lmc = term.characters.first else { return [] }
guard let parsed = RegexParser.sharedInstance().parse(term) else { return [] }
let regex = "^\(parsed)$"
let tableList: [String] = Database.prefixToTableMap[lmc] ?? []
let suggestions: [String] =
tableList.map{db[$0]} // [ [String]? ]
.flatMap{$0} // [ [String] ]
.flatMap{$0} // [String]
.filter({ ($0 as NSString).isMatched(byRegex: regex) })
return suggestions
}
public func bangla(forSuffix suffix:String) -> String? {
return suffixList[suffix]
}
}
fileprivate extension Database {
func loadSuffixTable(from dbase:FMDatabase) {
guard let result = dbase.executeQuery("SELECT * FROM Suffix", withArgumentsIn: nil) else { return }
while result.next() == true {
guard let eng = result.string(forColumn: "English"), let bn = result.string(forColumn: "Bangla") else { continue }
suffixList[eng] = bn
}
}
func loadTable(name:String, from dbase:FMDatabase) {
guard let result = dbase.executeQuery("SELECT * FROM \(name)", withArgumentsIn: nil) else { return }
var items:[String] = []
while result.next() {
guard let item = result.string(forColumn: "Words") else { continue }
items.append(item)
}
db[name.lowercased()] = items
}
}