Skip to content

Commit a2e2963

Browse files
author
Fcitx Bot
committed
Merge remote-tracking branch 'origin/master' into fcitx
2 parents 1902698 + 0384be5 commit a2e2963

20 files changed

+492
-328
lines changed

src/MODULE.bazel

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,14 @@ bazel_dep(
8282
name = "rules_pkg",
8383
version = "1.1.0",
8484
)
85+
single_version_override(
86+
module_name = "rules_pkg",
87+
patches = [
88+
# Patch to fix the failure of Bazel fetch.
89+
"bazel/rules_pkg_MODULE.bazel.patch",
90+
],
91+
version = "1.1.0",
92+
)
8593

8694
# rules_python: 1.4.1 2025-05-09
8795
# https://github.com/bazelbuild/rules_python/
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--- MODULE.bazel
2+
+++ MODULE.bazel
3+
@@ -36,7 +36,3 @@ register_toolchains(
4+
5+
local_repository = use_repo_rule("@bazel_tools//tools/build_defs/repo:local.bzl", "local_repository")
6+
7+
-local_repository(
8+
- name = "mappings_test_external_repo",
9+
- path = "tests/mappings/external_repo",
10+
-)

src/converter/converter.cc

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -305,15 +305,15 @@ void Converter::FinishConversion(const ConversionRequest &request,
305305
absl::IntervalClosed, bitgen, 1, std::numeric_limits<uint64_t>::max());
306306
segments->set_revert_id(revert_id);
307307

308+
const prediction::Result history_result = MakeHistoryResult(*segments);
309+
const std::vector<prediction::Result> committed_results =
310+
MakeLearningResults(*segments);
308311
const ConversionRequest finish_req = ConversionRequestBuilder()
309312
.SetConversionRequestView(request)
310-
.SetHistorySegmentsView(*segments)
313+
.SetHistoryResultView(history_result)
311314
.Build();
312-
DCHECK(finish_req.HasConverterHistorySegments());
313-
314315
rewriter_->Finish(finish_req, *segments);
315-
predictor_->Finish(finish_req, MakeLearningResults(*segments),
316-
segments->revert_id());
316+
predictor_->Finish(finish_req, committed_results, segments->revert_id());
317317

318318
if (request.request_type() != ConversionRequest::CONVERSION &&
319319
segments->conversion_segments_size() >= 1 &&
@@ -711,17 +711,21 @@ bool Converter::PredictForRequestWithSegments(const ConversionRequest &request,
711711
DCHECK(segments);
712712
DCHECK(predictor_);
713713

714+
const prediction::Result history_result = MakeHistoryResult(*segments);
715+
714716
const ConversionRequest conv_req = ConversionRequestBuilder()
715717
.SetConversionRequestView(request)
716-
.SetHistorySegmentsView(*segments)
718+
.SetHistoryResultView(history_result)
717719
.Build();
718-
DCHECK(conv_req.HasConverterHistorySegments());
719720

720721
const std::vector<prediction::Result> results = predictor_->Predict(conv_req);
721722

722723
Segment *segment = segments->mutable_conversion_segment(0);
723724
DCHECK(segment);
724725

726+
// TODO(taku): Make utility functions to convert
727+
// Segments <-> history_result, committed_results.
728+
725729
for (const prediction::Result &result : results) {
726730
Candidate *candidate = segment->add_candidate();
727731
strings::Assign(candidate->key, result.key);
@@ -842,5 +846,42 @@ std::vector<prediction::Result> Converter::MakeLearningResults(
842846

843847
return results;
844848
}
849+
850+
// static
851+
prediction::Result Converter::MakeHistoryResult(const Segments &segments) {
852+
prediction::Result result;
853+
854+
if (segments.history_segments_size() == 0) {
855+
return result;
856+
}
857+
858+
bool inner_segment_boundary_failed = false;
859+
for (const auto &segment : segments.history_segments()) {
860+
if (segment.candidates_size() == 0) {
861+
return prediction::Result::DefaultResult(); // Returns an empty result.
862+
}
863+
const Candidate &candidate = segment.candidate(0);
864+
absl::StrAppend(&result.key, candidate.key);
865+
absl::StrAppend(&result.value, candidate.value);
866+
result.candidate_attributes |= candidate.attributes;
867+
uint32_t encoded = 0;
868+
if (!Candidate::EncodeLengths(candidate.key.size(), candidate.value.size(),
869+
candidate.content_key.size(),
870+
candidate.content_value.size(), &encoded)) {
871+
inner_segment_boundary_failed = true;
872+
}
873+
result.inner_segment_boundary.emplace_back(encoded);
874+
}
875+
876+
if (inner_segment_boundary_failed) result.inner_segment_boundary.clear();
877+
878+
const int size = segments.history_segments_size();
879+
result.lid = segments.history_segment(0).candidate(0).lid;
880+
result.rid = segments.history_segment(size - 1).candidate(0).rid;
881+
result.cost = segments.history_segment(size - 1).candidate(0).cost;
882+
883+
return result;
884+
}
885+
845886
} // namespace converter
846887
} // namespace mozc

src/converter/converter.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,13 @@ class Converter final : public ConverterInterface {
173173
return *modules_;
174174
}
175175

176-
// Utility method to results for Predictor::Finish().
176+
// Utility method to make committed results for Predictor::Finish().
177177
static std::vector<prediction::Result> MakeLearningResults(
178178
const Segments &segments);
179179

180+
// Utility method to make history result passed to ConversionRequest.
181+
static prediction::Result MakeHistoryResult(const Segments &segments);
182+
180183
private:
181184
Converter() = default;
182185

src/converter/converter_test.cc

Lines changed: 82 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -856,13 +856,14 @@ TEST_F(ConverterTest, StartSuggestion) {
856856
ConversionRequest::Options options = {.request_type =
857857
ConversionRequest::SUGGESTION};
858858
Segments segments;
859-
const ConversionRequest request = ConversionRequestBuilder()
860-
.SetComposer(composer)
861-
.SetRequestView(client_request)
862-
.SetConfigView(config)
863-
.SetHistorySegmentsView(segments)
864-
.SetOptions(std::move(options))
865-
.Build();
859+
const ConversionRequest request =
860+
ConversionRequestBuilder()
861+
.SetComposer(composer)
862+
.SetRequestView(client_request)
863+
.SetConfigView(config)
864+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
865+
.SetOptions(std::move(options))
866+
.Build();
866867

867868
EXPECT_TRUE(converter->StartPrediction(request, &segments));
868869
EXPECT_EQ(segments.segments_size(), 1);
@@ -881,13 +882,14 @@ TEST_F(ConverterTest, StartSuggestion) {
881882
ConversionRequest::Options options = {.request_type =
882883
ConversionRequest::SUGGESTION};
883884
Segments segments;
884-
const ConversionRequest request = ConversionRequestBuilder()
885-
.SetComposer(composer)
886-
.SetRequestView(client_request)
887-
.SetConfigView(config)
888-
.SetHistorySegmentsView(segments)
889-
.SetOptions(std::move(options))
890-
.Build();
885+
const ConversionRequest request =
886+
ConversionRequestBuilder()
887+
.SetComposer(composer)
888+
.SetRequestView(client_request)
889+
.SetConfigView(config)
890+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
891+
.SetOptions(std::move(options))
892+
.Build();
891893

892894
EXPECT_TRUE(converter->StartPrediction(request, &segments));
893895
EXPECT_EQ(segments.segments_size(), 1);
@@ -1027,7 +1029,7 @@ TEST_F(ConverterTest, PredictSetKey) {
10271029
const ConversionRequest request =
10281030
ConversionRequestBuilder()
10291031
.SetComposer(composer)
1030-
.SetHistorySegmentsView(segments)
1032+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
10311033
.SetRequestType(ConversionRequest::PREDICTION)
10321034
.Build();
10331035
ASSERT_TRUE(converter->StartPrediction(request, &segments));
@@ -1132,7 +1134,7 @@ TEST_F(ConverterTest, ComposerKeySelection) {
11321134
const ConversionRequest request =
11331135
ConversionRequestBuilder()
11341136
.SetComposer(composer)
1135-
.SetHistorySegmentsView(segments)
1137+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
11361138
.SetOptions(
11371139
{.composer_key_selection = ConversionRequest::CONVERSION_KEY})
11381140
.Build();
@@ -1149,7 +1151,7 @@ TEST_F(ConverterTest, ComposerKeySelection) {
11491151
const ConversionRequest request =
11501152
ConversionRequestBuilder()
11511153
.SetComposer(composer)
1152-
.SetHistorySegmentsView(segments)
1154+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
11531155
.SetOptions(
11541156
{.composer_key_selection = ConversionRequest::PREDICTION_KEY})
11551157
.Build();
@@ -1183,11 +1185,12 @@ TEST_F(ConverterTest, SuppressionDictionaryForRewriter) {
11831185
composer.InsertCharacter("placeholder");
11841186
commands::Context context;
11851187
Segments segments;
1186-
const ConversionRequest request = ConversionRequestBuilder()
1187-
.SetComposer(composer)
1188-
.SetHistorySegmentsView(segments)
1189-
.SetConfig(config)
1190-
.Build();
1188+
const ConversionRequest request =
1189+
ConversionRequestBuilder()
1190+
.SetComposer(composer)
1191+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
1192+
.SetConfig(config)
1193+
.Build();
11911194
EXPECT_TRUE(converter->StartConversion(request, &segments));
11921195

11931196
// Verify that words inserted by the rewriter is suppressed if its in the
@@ -1386,11 +1389,12 @@ TEST_F(ConverterTest, LimitCandidatesSize) {
13861389
mozc::composer::Composer composer(table, request_proto, config);
13871390
composer.InsertCharacterPreedit("");
13881391
Segments segments;
1389-
const ConversionRequest request1 = ConversionRequestBuilder()
1390-
.SetComposer(composer)
1391-
.SetHistorySegmentsView(segments)
1392-
.SetRequest(request_proto)
1393-
.Build();
1392+
const ConversionRequest request1 =
1393+
ConversionRequestBuilder()
1394+
.SetComposer(composer)
1395+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
1396+
.SetRequest(request_proto)
1397+
.Build();
13941398
ASSERT_TRUE(converter->StartConversion(request1, &segments));
13951399
ASSERT_EQ(segments.conversion_segments_size(), 1);
13961400
const int original_candidates_size = segments.segment(0).candidates_size();
@@ -1402,11 +1406,12 @@ TEST_F(ConverterTest, LimitCandidatesSize) {
14021406

14031407
segments.Clear();
14041408
request_proto.set_candidates_size_limit(original_candidates_size - 1);
1405-
const ConversionRequest request2 = ConversionRequestBuilder()
1406-
.SetComposer(composer)
1407-
.SetRequest(request_proto)
1408-
.SetHistorySegmentsView(segments)
1409-
.Build();
1409+
const ConversionRequest request2 =
1410+
ConversionRequestBuilder()
1411+
.SetComposer(composer)
1412+
.SetRequest(request_proto)
1413+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
1414+
.Build();
14101415
ASSERT_TRUE(converter->StartConversion(request2, &segments));
14111416
ASSERT_EQ(segments.conversion_segments_size(), 1);
14121417
EXPECT_GE(original_candidates_size - 1,
@@ -1418,11 +1423,12 @@ TEST_F(ConverterTest, LimitCandidatesSize) {
14181423

14191424
segments.Clear();
14201425
request_proto.set_candidates_size_limit(0);
1421-
const ConversionRequest request3 = ConversionRequestBuilder()
1422-
.SetComposer(composer)
1423-
.SetRequest(request_proto)
1424-
.SetHistorySegmentsView(segments)
1425-
.Build();
1426+
const ConversionRequest request3 =
1427+
ConversionRequestBuilder()
1428+
.SetComposer(composer)
1429+
.SetRequest(request_proto)
1430+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
1431+
.Build();
14261432
ASSERT_TRUE(converter->StartConversion(request3, &segments));
14271433
ASSERT_EQ(segments.conversion_segments_size(), 1);
14281434
EXPECT_EQ(segments.segment(0).candidates_size(), 1);
@@ -1477,7 +1483,7 @@ TEST_F(ConverterTest, UserEntryInMobilePrediction) {
14771483
.SetComposer(composer)
14781484
.SetRequestView(request)
14791485
.SetConfigView(config)
1480-
.SetHistorySegmentsView(segments)
1486+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
14811487
.SetOptions(std::move(options))
14821488
.Build();
14831489
EXPECT_TRUE(converter->StartPrediction(conversion_request, &segments));
@@ -1668,7 +1674,7 @@ TEST_F(ConverterTest, RewriterShouldRespectDefaultCandidates) {
16681674
.SetComposer(composer)
16691675
.SetRequestView(request)
16701676
.SetConfigView(config)
1671-
.SetHistorySegmentsView(segments)
1677+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
16721678
.SetOptions(std::move(options))
16731679
.Build();
16741680

@@ -1782,7 +1788,7 @@ TEST_F(ConverterTest, DoNotAddOverlappingNodesForPrediction) {
17821788
.SetComposer(composer)
17831789
.SetRequestView(request)
17841790
.SetConfigView(config)
1785-
.SetHistorySegmentsView(segments)
1791+
.SetHistoryResult(Converter::MakeHistoryResult(segments))
17861792
.SetOptions(std::move(options))
17871793
.Build();
17881794

@@ -2437,6 +2443,42 @@ TEST_F(ConverterTest, MakeLearningResultsTest) {
24372443
}
24382444
}
24392445

2446+
TEST_F(ConverterTest, MakeHistoryResultTest) {
2447+
Segments segments;
2448+
for (int i = 0; i < 3; ++i) {
2449+
Segment *segment = segments.add_segment();
2450+
segment->set_segment_type(Segment::HISTORY);
2451+
Candidate *c = segment->add_candidate();
2452+
c->key = absl::StrCat("k", i);
2453+
c->content_key = "k";
2454+
c->value = absl::StrCat("v", i);
2455+
c->content_value = "v";
2456+
c->lid = i;
2457+
c->rid = i + 1;
2458+
c->cost = i;
2459+
};
2460+
2461+
const prediction::Result result = Converter::MakeHistoryResult(segments);
2462+
EXPECT_EQ(result.key, "k0k1k2");
2463+
EXPECT_EQ(result.value, "v0v1v2");
2464+
EXPECT_EQ(result.lid, segments.segment(0).candidate(0).lid);
2465+
EXPECT_EQ(result.rid, segments.segment(2).candidate(0).rid);
2466+
EXPECT_EQ(result.cost, 2); // only the last cost.
2467+
2468+
int n = 0;
2469+
for (Candidate::InnerSegmentIterator iter(result.inner_segment_boundary,
2470+
result.key, result.value);
2471+
!iter.Done(); iter.Next()) {
2472+
const Candidate &c = segments.segment(n).candidate(0);
2473+
EXPECT_EQ(iter.GetKey(), c.key);
2474+
EXPECT_EQ(iter.GetContentKey(), c.content_key);
2475+
EXPECT_EQ(iter.GetValue(), c.value);
2476+
EXPECT_EQ(iter.GetContentValue(), c.content_value);
2477+
++n;
2478+
}
2479+
EXPECT_EQ(n, 3);
2480+
}
2481+
24402482
TEST_F(ConverterTest, Bugfix424676259) {
24412483
auto mock_predictor = absl::make_unique<MockPredictor>();
24422484
auto mock_rewriter = absl::make_unique<MockRewriter>();

src/prediction/BUILD.bazel

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,13 +206,15 @@ mozc_cc_library(
206206
visibility = [
207207
"//converter:__subpackages__",
208208
"//engine:__subpackages__",
209+
"//request:__subpackages__",
209210
],
210211
deps = [
211212
":zero_query_dict",
212213
"//base/strings:unicode",
213214
"//composer:query",
214215
"//converter:segments",
215216
"//dictionary:dictionary_token",
217+
"@com_google_absl//absl/base:no_destructor",
216218
"@com_google_absl//absl/base:nullability",
217219
"@com_google_absl//absl/log",
218220
"@com_google_absl//absl/strings",
@@ -623,6 +625,7 @@ mozc_cc_library(
623625
deps = [
624626
":result",
625627
"//base:util",
628+
"//base/strings:assign",
626629
"//converter:converter_interface",
627630
"//converter:immutable_converter_interface",
628631
"//converter:segments",

src/prediction/dictionary_prediction_aggregator.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ bool IsLongKeyForRealtimeCandidates(const ConversionRequest &request) {
134134
// "一二", "十二", "壱拾弐", etc for 12.
135135
// TODO(toshiyuki): Define the spec and support Kanji.
136136
std::optional<std::string> GetNumberHistory(const ConversionRequest &request) {
137-
const std::string history_value = request.converter_history_value(1);
137+
absl::string_view history_value = request.converter_history_value(1);
138138
if (history_value.empty() || !NumberUtil::IsArabicNumber(history_value)) {
139139
return std::nullopt;
140140
}
@@ -752,8 +752,8 @@ void DictionaryPredictionAggregator::AggregateZeroQuery(
752752

753753
// There are 4 sources in zero query suggestion.
754754

755-
const std::string history_value = request.converter_history_value(1);
756-
const std::string history_key = request.converter_history_key(1);
755+
absl::string_view history_value = request.converter_history_value(1);
756+
absl::string_view history_key = request.converter_history_key(1);
757757

758758
if (history_key.empty() || history_value.empty()) {
759759
return;
@@ -908,8 +908,8 @@ void DictionaryPredictionAggregator::AggregateBigram(
908908

909909
// TODO(toshiyuki): Support suggestion from the last 2 histories.
910910
// ex) "六本木"+"ヒルズ"->"レジデンス"
911-
const std::string history_key = request.converter_history_key(1);
912-
const std::string history_value = request.converter_history_value(1);
911+
absl::string_view history_key = request.converter_history_key(1);
912+
absl::string_view history_value = request.converter_history_value(1);
913913
if (history_key.empty() || history_value.empty()) {
914914
return;
915915
}

0 commit comments

Comments
 (0)