1 // Copyright 2010-2018, Google Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 #include "engine/minimal_engine.h"
31
32 #include "composer/composer.h"
33 #include "converter/converter_interface.h"
34 #include "converter/segments.h"
35 #include "data_manager/data_manager.h"
36 #include "dictionary/suppression_dictionary.h"
37 #include "engine/user_data_manager_interface.h"
38 #include "prediction/predictor_interface.h"
39 #include "request/conversion_request.h"
40
41 namespace mozc {
42 namespace {
43
44 class UserDataManagerStub : public UserDataManagerInterface {
45 public:
46 UserDataManagerStub() = default;
47 ~UserDataManagerStub() override = default;
Sync()48 bool Sync() override { return true; }
Reload()49 bool Reload() override { return true; }
ClearUserHistory()50 bool ClearUserHistory() override { return true; }
ClearUserPrediction()51 bool ClearUserPrediction() override { return true; }
ClearUnusedUserPrediction()52 bool ClearUnusedUserPrediction() override { return true; }
ClearUserPredictionEntry(const string & key,const string & value)53 bool ClearUserPredictionEntry(const string &key,
54 const string &value) override {
55 return true;
56 }
Wait()57 bool Wait() override { return true; }
58 };
59
AddAsIsCandidate(const string & key,Segments * segments)60 bool AddAsIsCandidate(const string &key, Segments *segments) {
61 if (segments == nullptr) {
62 return false;
63 }
64 segments->Clear();
65 Segment *segment = segments->add_segment();
66 DCHECK(segment);
67
68 Segment::Candidate *candidate = segment->push_back_candidate();
69 DCHECK(candidate);
70 candidate->Init();
71 candidate->content_key = key;
72 candidate->content_value = key;
73 candidate->key = key;
74 candidate->value = key;
75 candidate->lid = 0;
76 candidate->rid = 0;
77 candidate->wcost = 0;
78 candidate->cost = 0;
79 candidate->attributes = Segment::Candidate::DEFAULT_ATTRIBUTE;
80
81 return true;
82 }
83
AddAsIsCandidate(const ConversionRequest & request,Segments * segments)84 bool AddAsIsCandidate(const ConversionRequest &request, Segments *segments) {
85 if (!request.has_composer()) {
86 return false;
87 }
88 string key;
89 request.composer().GetQueryForConversion(&key);
90 return AddAsIsCandidate(key, segments);
91 }
92
93 class MinimalConverter : public ConverterInterface {
94 public:
95 MinimalConverter() = default;
96 ~MinimalConverter() override = default;
97
StartConversionForRequest(const ConversionRequest & request,Segments * segments) const98 bool StartConversionForRequest(const ConversionRequest &request,
99 Segments *segments) const override {
100 return AddAsIsCandidate(request, segments);
101 }
102
StartConversion(Segments * segments,const string & key) const103 bool StartConversion(Segments *segments, const string &key) const override {
104 return AddAsIsCandidate(key, segments);
105 }
106
StartReverseConversion(Segments * segments,const string & key) const107 bool StartReverseConversion(Segments *segments,
108 const string &key) const override {
109 return false;
110 }
111
StartPredictionForRequest(const ConversionRequest & request,Segments * segments) const112 bool StartPredictionForRequest(const ConversionRequest &request,
113 Segments *segments) const override {
114 return AddAsIsCandidate(request, segments);
115 }
116
StartPrediction(Segments * segments,const string & key) const117 bool StartPrediction(Segments *segments, const string &key) const override {
118 return AddAsIsCandidate(key, segments);
119 }
120
StartSuggestionForRequest(const ConversionRequest & request,Segments * segments) const121 bool StartSuggestionForRequest(const ConversionRequest &request,
122 Segments *segments) const override {
123 return AddAsIsCandidate(request, segments);
124 }
125
StartSuggestion(Segments * segments,const string & key) const126 bool StartSuggestion(Segments *segments, const string &key) const override {
127 return AddAsIsCandidate(key, segments);
128 }
129
StartPartialPredictionForRequest(const ConversionRequest & request,Segments * segments) const130 bool StartPartialPredictionForRequest(const ConversionRequest &request,
131 Segments *segments) const override {
132 return false;
133 }
134
StartPartialPrediction(Segments * segments,const string & key) const135 bool StartPartialPrediction(Segments *segments,
136 const string &key) const override {
137 return false;
138 }
139
StartPartialSuggestionForRequest(const ConversionRequest & request,Segments * segments) const140 bool StartPartialSuggestionForRequest(const ConversionRequest &request,
141 Segments *segments) const override {
142 return false;
143 }
144
StartPartialSuggestion(Segments * segments,const string & key) const145 bool StartPartialSuggestion(Segments *segments,
146 const string &key) const override {
147 return false;
148 }
149
FinishConversion(const ConversionRequest & request,Segments * segments) const150 bool FinishConversion(const ConversionRequest &request,
151 Segments *segments) const override {
152 return true;
153 }
154
CancelConversion(Segments * segments) const155 bool CancelConversion(Segments *segments) const override {
156 return true;
157 }
158
ResetConversion(Segments * segments) const159 bool ResetConversion(Segments *segments) const override {
160 return true;
161 }
162
RevertConversion(Segments * segments) const163 bool RevertConversion(Segments *segments) const override {
164 return true;
165 }
166
ReconstructHistory(Segments * segments,const string & preceding_text) const167 bool ReconstructHistory(Segments *segments,
168 const string &preceding_text) const override {
169 return true;
170 }
171
CommitSegmentValue(Segments * segments,size_t segment_index,int candidate_index) const172 bool CommitSegmentValue(Segments *segments, size_t segment_index,
173 int candidate_index) const override {
174 return true;
175 }
176
CommitPartialSuggestionSegmentValue(Segments * segments,size_t segment_index,int candidate_index,const string & current_segment_key,const string & new_segment_key) const177 bool CommitPartialSuggestionSegmentValue(
178 Segments *segments, size_t segment_index, int candidate_index,
179 const string ¤t_segment_key,
180 const string &new_segment_key) const override {
181 return true;
182 }
183
FocusSegmentValue(Segments * segments,size_t segment_index,int candidate_index) const184 bool FocusSegmentValue(Segments *segments, size_t segment_index,
185 int candidate_index) const override {
186 return true;
187 }
188
FreeSegmentValue(Segments * segments,size_t segment_index) const189 bool FreeSegmentValue(Segments *segments,
190 size_t segment_index) const override {
191 return true;
192 }
193
CommitSegments(Segments * segments,const std::vector<size_t> & candidate_index) const194 bool CommitSegments(
195 Segments *segments,
196 const std::vector<size_t> &candidate_index) const override {
197 return true;
198 }
199
ResizeSegment(Segments * segments,const ConversionRequest & request,size_t segment_index,int offset_length) const200 bool ResizeSegment(Segments *segments, const ConversionRequest &request,
201 size_t segment_index, int offset_length) const override {
202 return true;
203 }
204
ResizeSegment(Segments * segments,const ConversionRequest & request,size_t start_segment_index,size_t segments_size,const uint8 * new_size_array,size_t array_size) const205 bool ResizeSegment(Segments *segments, const ConversionRequest &request,
206 size_t start_segment_index, size_t segments_size,
207 const uint8 *new_size_array,
208 size_t array_size) const override {
209 return true;
210 }
211 };
212
213 class MinimalPredictor : public PredictorInterface {
214 public:
MinimalPredictor()215 MinimalPredictor() : name_("MinimalPredictor") {}
216 ~MinimalPredictor() override = default;
217
PredictForRequest(const ConversionRequest & request,Segments * segments) const218 bool PredictForRequest(const ConversionRequest &request,
219 Segments *segments) const override {
220 return AddAsIsCandidate(request, segments);
221 }
222
GetPredictorName() const223 const string &GetPredictorName() const override { return name_; }
224
225 private:
226 const string name_;
227 };
228
229 } // namespace
230
MinimalEngine()231 MinimalEngine::MinimalEngine()
232 : converter_(new MinimalConverter()),
233 predictor_(new MinimalPredictor()),
234 suppression_dictionary_(new dictionary::SuppressionDictionary()),
235 user_data_manager_(new UserDataManagerStub()),
236 data_manager_(new DataManager()) {}
237
238 MinimalEngine::~MinimalEngine() = default;
239
GetConverter() const240 ConverterInterface *MinimalEngine::GetConverter() const {
241 return converter_.get();
242 }
243
GetPredictor() const244 PredictorInterface *MinimalEngine::GetPredictor() const {
245 return predictor_.get();
246 }
247
GetSuppressionDictionary()248 dictionary::SuppressionDictionary *MinimalEngine::GetSuppressionDictionary() {
249 return suppression_dictionary_.get();
250 }
251
GetUserDataManager()252 UserDataManagerInterface *MinimalEngine::GetUserDataManager() {
253 return user_data_manager_.get();
254 }
255
GetDataManager() const256 const DataManagerInterface *MinimalEngine::GetDataManager() const {
257 return data_manager_.get();
258 }
259
260 } // namespace mozc
261