Codebase list mozc / 4f8f2c3
Fill 'all_candidate_words' field even for NaCl. Historically Output::all_candidate_words field has been omitted only in NaCl mainly because of performance reasons. With this CL, that field is enabled even in NaCl build. To mitigate the impact on performance, this CL also introduces Request::candidates_size_limit field so that clients can change the maximum number of candidates for each conversion request. BUG= TEST=unittest REF_BUG= REF_CL=88403136 Hiroshi Sumita authored 8 years ago Yohei Yukawa committed 8 years ago
6 changed file(s) with 81 addition(s) and 4 deletion(s). Raw diff Collapse all Expand all
254254 segments->set_request_type(Segments::CONVERSION);
255255 immutable_converter_->ConvertForRequest(request, segments);
256256 RewriteAndSuppressCandidates(request, segments);
257 TrimCandidates(request, segments);
257258 return IsValidSegments(request, *segments);
258259 }
259260
267268 const ConversionRequest default_request;
268269 immutable_converter_->ConvertForRequest(default_request, segments);
269270 RewriteAndSuppressCandidates(default_request, segments);
271 TrimCandidates(default_request, segments);
270272 return IsValidSegments(default_request, *segments);
271273 }
272274
375377 segments->set_request_type(request_type);
376378 predictor_->PredictForRequest(request, segments);
377379 RewriteAndSuppressCandidates(request, segments);
380 TrimCandidates(request, segments);
378381 if (request_type == Segments::PARTIAL_SUGGESTION ||
379382 request_type == Segments::PARTIAL_PREDICTION) {
380383 // Here 1st segment's key is the query string of
772775
773776 immutable_converter_->ConvertForRequest(request, segments);
774777 RewriteAndSuppressCandidates(request, segments);
778 TrimCandidates(request, segments);
775779 return true;
776780 }
777781
831835
832836 immutable_converter_->ConvertForRequest(request, segments);
833837 RewriteAndSuppressCandidates(request, segments);
838 TrimCandidates(request, segments);
834839 return true;
835840 }
836841
920925 }
921926 }
922927
928 void ConverterImpl::TrimCandidates(const ConversionRequest &request,
929 Segments *segments) const {
930 const mozc::commands::Request &request_proto = request.request();
931 if (!request_proto.has_candidates_size_limit()) {
932 return;
933 }
934
935 const int limit = request_proto.candidates_size_limit();
936 for (size_t segment_index = 0;
937 segment_index < segments->conversion_segments_size(); ++segment_index) {
938 Segment *seg = segments->mutable_conversion_segment(segment_index);
939 const int candidates_size = seg->candidates_size();
940 // A segment should have at least one candidate.
941 const int candidates_limit =
942 max(1, limit - static_cast<int>(seg->meta_candidates_size()));
943 if (candidates_size < candidates_limit) {
944 continue;
945 }
946 seg->erase_candidates(candidates_limit, candidates_size - candidates_limit);
947 }
948 }
949
923950 void ConverterImpl::CommitUsageStats(const Segments *segments,
924951 size_t begin_segment_index,
925952 size_t segment_length) const {
153153 void RewriteAndSuppressCandidates(const ConversionRequest &request,
154154 Segments *segments) const;
155155
156 // Limits the number of candidates based on a request.
157 // This method doesn't drop meta candidates for T13n conversion.
158 void TrimCandidates(const ConversionRequest &request,
159 Segments *segments) const;
160
156161 // Commits usage stats for committed text.
157162 // |begin_segment_index| is a index of whole segments. (history and conversion
158163 // segments)
16491649 EXPECT_NE(0, candidate.rid);
16501650 }
16511651
1652 TEST_F(ConverterTest, LimitCandidatesSize) {
1653 std::unique_ptr<EngineInterface> engine(MockDataEngineFactory::Create());
1654 ConverterInterface *converter = engine->GetConverter();
1655
1656 composer::Table table;
1657 mozc::commands::Request request_proto;
1658 mozc::composer::Composer composer(&table, &request_proto);
1659 composer.InsertCharacterPreedit("\xE3\x81\x82"); // "あ"
1660 ConversionRequest request(&composer, &request_proto);
1661
1662 Segments segments;
1663 ASSERT_TRUE(converter->StartConversionForRequest(request, &segments));
1664 ASSERT_EQ(1, segments.conversion_segments_size());
1665 const int original_candidates_size =
1666 segments.segment(0).candidates_size();
1667 const int original_meta_candidates_size =
1668 segments.segment(0).meta_candidates_size();
1669 EXPECT_LT(0, original_candidates_size - 1 - original_meta_candidates_size)
1670 << "original candidates size: " << original_candidates_size
1671 << ", original meta candidates size: " << original_meta_candidates_size;
1672
1673 segments.Clear();
1674 request_proto.set_candidates_size_limit(original_candidates_size - 1);
1675 ASSERT_TRUE(converter->StartConversionForRequest(request, &segments));
1676 ASSERT_EQ(1, segments.conversion_segments_size());
1677 EXPECT_GE(original_candidates_size - 1,
1678 segments.segment(0).candidates_size());
1679 EXPECT_LE(original_candidates_size - 1 - original_meta_candidates_size,
1680 segments.segment(0).candidates_size());
1681 EXPECT_EQ(original_meta_candidates_size,
1682 segments.segment(0).meta_candidates_size());
1683
1684 segments.Clear();
1685 request_proto.set_candidates_size_limit(0);
1686 ASSERT_TRUE(converter->StartConversionForRequest(request, &segments));
1687 ASSERT_EQ(1, segments.conversion_segments_size());
1688 EXPECT_EQ(1, segments.segment(0).candidates_size());
1689 EXPECT_EQ(original_meta_candidates_size,
1690 segments.segment(0).meta_candidates_size());
1691 }
1692
16521693 } // namespace mozc
00 MAJOR=2
11 MINOR=17
2 BUILD=2232
2 BUILD=2233
33 REVISION=102
44 # NACL_DICTIONARY_VERSION is the target version of the system dictionary to be
55 # downloaded by NaCl Mozc.
765765
766766 // Page size of the candidate list.
767767 optional int32 candidate_page_size = 15 [default = 9];
768
769 // The maximum limit of the candidates size.
770 // If not set, converter doesn't limit the size.
771 // NOTE: Each segment has at least one candidate and meta candidates even if
772 // this value is set to 0.
773 optional int32 candidates_size_limit = 16;
768774 }
769775
770776 // Note there is another ApplicationInfo inside RendererCommand.
11161116 candidate_list_visible_) {
11171117 FillCandidates(output->mutable_candidates());
11181118 }
1119 #ifndef __native_client__
1119
11201120 // All candidate words
1121 // In NaCl, we don't use the all candidate word data.
11221121 if (CheckState(SUGGESTION | PREDICTION | CONVERSION)) {
11231122 FillAllCandidateWords(output->mutable_all_candidate_words());
11241123 }
1125 #endif // __native_client__
11261124 }
11271125
11281126 // static