@@ -12,7 +12,7 @@ extension Engine {
12
12
public static func structureReverseLookup( text: String , input: String , segmentation: Segmentation ) -> [ Candidate ] {
13
13
let markFreeText = text. removedSpacesTonesSeparators ( )
14
14
let matched = process ( text: markFreeText, segmentation: segmentation) . uniqued ( )
15
- guard ! matched. isEmpty else { return [ ] }
15
+ guard matched. isNotEmpty else { return [ ] }
16
16
switch ( text. hasSeparators, text. hasTones) {
17
17
case ( true , true ) :
18
18
let isOneToneOnly : Bool = ( text. count - markFreeText. count) == 2
@@ -44,31 +44,28 @@ extension Engine {
44
44
}
45
45
46
46
private static func process( text: String , segmentation: Segmentation ) -> [ Candidate ] {
47
+ let matched = match ( text: text)
47
48
let textCount = text. count
48
- let segmentation = segmentation. filter ( { $0. length == textCount } )
49
- guard segmentation. maxLength > 0 else {
50
- return match ( text: text)
51
- }
52
- let matches = segmentation. map ( { scheme -> [ Candidate ] in
49
+ let schemes = segmentation. filter ( { $0. length == textCount } )
50
+ guard schemes. maxLength > 0 else { return matched }
51
+ let matches = schemes. map ( { scheme -> [ Candidate ] in
53
52
let pingText = scheme. map ( \. origin) . joined ( )
54
53
return match ( text: pingText)
55
54
} )
56
- return match ( text : text ) + matches. flatMap ( { $0 } )
55
+ return matched + matches. flatMap ( { $0 } )
57
56
}
58
-
59
57
private static func match( text: String ) -> [ Candidate ] {
60
58
var candidates : [ Candidate ] = [ ]
61
- let query : String = " SELECT word, romanization FROM composetable WHERE ping = \( text. hash) ; "
59
+ let command : String = " SELECT word, romanization FROM structuretable WHERE ping = \( text. hash) ; "
62
60
var statement : OpaquePointer ? = nil
63
- if sqlite3_prepare_v2 ( Engine . database , query , - 1 , & statement, nil ) == SQLITE_OK {
64
- while sqlite3_step ( statement) == SQLITE_ROW {
65
- let word : String = String ( cString : sqlite3_column_text ( statement , 0 ) )
66
- let romanization : String = String ( cString: sqlite3_column_text ( statement, 1 ) )
67
- let instance = Candidate ( text : word , romanization : romanization , input : text )
68
- candidates . append ( instance )
69
- }
61
+ defer { sqlite3_finalize ( statement) }
62
+ guard sqlite3_prepare_v2 ( Engine . database , command , - 1 , & statement, nil ) == SQLITE_OK else { return [ ] }
63
+ while sqlite3_step ( statement ) == SQLITE_ROW {
64
+ let word : String = String ( cString: sqlite3_column_text ( statement, 0 ) )
65
+ let romanization : String = String ( cString : sqlite3_column_text ( statement , 1 ) )
66
+ let instance = Candidate ( text : word , romanization : romanization , input : text )
67
+ candidates . append ( instance )
70
68
}
71
- sqlite3_finalize ( statement)
72
69
return candidates
73
70
}
74
71
}
0 commit comments