Do not trigger cloud prediction when the full-pinyin auxiliary code is active.
This commit is contained in:
1 parent
e31cd003b0
commit
77af7d7f26
4 files changed
+110
-8
No files matched your search
@@ -3,6 +3,7 @@
|
||||
#include <algorithm>
|
||||
#include "config/ime_config.h"
|
||||
#include "MetasequoiaImeEngine/common/helpcode_utils.h"
|
||||
#include "MetasequoiaImeEngine/quanpin/quanpin_query.h"
|
||||
#include "MetasequoiaImeEngine/shuangpin/shuangpin_query.h"
|
||||
#include "MetasequoiaImeEngine/shuangpin/shuangpin_utils.h"
|
||||
|
||||
@@ -43,6 +44,27 @@ ShuangpinCompositionBase ResolveShuangpinCompositionBase(const QueryRequest &req
|
||||
|
||||
return base;
|
||||
}
|
||||
|
||||
bool HasActiveQuanpinHelpcode(const QueryRequest &request)
|
||||
{
|
||||
if (!request.enable_shuangpin_helpcode || request.raw_input.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto &raw_input_with_cases = request.raw_input_with_cases.empty() ? request.raw_input : request.raw_input_with_cases;
|
||||
if (HelpcodeUtils::is_quanpin_double_help_mode(raw_input_with_cases) && request.raw_input.size() >= 2)
|
||||
{
|
||||
return quanpin::is_complete_pinyin_input(request.raw_input.substr(0, request.raw_input.size() - 2));
|
||||
}
|
||||
|
||||
if (HelpcodeUtils::is_quanpin_single_help_mode(raw_input_with_cases) && !request.raw_input.empty())
|
||||
{
|
||||
return quanpin::is_complete_pinyin_input(request.raw_input.substr(0, request.raw_input.size() - 1));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
EngineInputSession::EngineInputSession(SchemeType scheme_type) : session_(scheme_type)
|
||||
@@ -264,8 +286,16 @@ IInputSession::SelectionTransition EngineInputSession::advance_composition_after
|
||||
IInputSession::CloudQueryState EngineInputSession::get_cloud_query_state() const
|
||||
{
|
||||
CloudQueryState state;
|
||||
state.cache_key = request().raw_input;
|
||||
state.committed_pinyin = request().normalized_input;
|
||||
|
||||
if (is_shuangpin())
|
||||
{
|
||||
if (ResolveShuangpinCompositionBase(request()).helpcode_length > 0)
|
||||
{
|
||||
return state;
|
||||
}
|
||||
|
||||
const auto &pinyin_with_cases = get_pinyin_sequence_with_cases();
|
||||
if (!pinyin_with_cases.empty() && pinyin_with_cases.size() % 2 == 0)
|
||||
{
|
||||
@@ -277,16 +307,16 @@ IInputSession::CloudQueryState EngineInputSession::get_cloud_query_state() const
|
||||
{
|
||||
state.query_text = request().normalized_input;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
state.cache_key = request().raw_input;
|
||||
state.committed_pinyin = request().normalized_input;
|
||||
if (HasActiveQuanpinHelpcode(request()))
|
||||
{
|
||||
return state;
|
||||
}
|
||||
|
||||
state.should_query = !request().normalized_input.empty();
|
||||
state.query_text = request().normalized_input;
|
||||
state.cache_key = request().raw_input;
|
||||
state.committed_pinyin = request().normalized_input;
|
||||
return state;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,41 @@
|
||||
#include "shuangpin_input_session.h"
|
||||
#include "config/ime_config.h"
|
||||
#include "MetasequoiaImeEngine/common/helpcode_utils.h"
|
||||
#include "MetasequoiaImeEngine/shuangpin/shuangpin_utils.h"
|
||||
#include <stdexcept>
|
||||
|
||||
namespace
|
||||
{
|
||||
bool HasActiveShuangpinHelpcode(const ShuangpinInputSession &session)
|
||||
{
|
||||
if (!GetConfiguredShuangpinHelpcodeEnabled())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto &raw_input = session.get_pinyin_sequence();
|
||||
const auto &raw_input_with_cases = session.get_pinyin_sequence_with_cases();
|
||||
if (raw_input.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ShuangpinUtil::IsFullHelpMode(raw_input_with_cases) && raw_input.size() >= 2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (raw_input.size() % 2 == 1 && raw_input.size() > 1)
|
||||
{
|
||||
const std::string pure_raw_input = raw_input.substr(0, raw_input.size() - 1);
|
||||
const std::string pure_segmentation = ShuangpinUtil::pinyin_segmentation(pure_raw_input);
|
||||
return ShuangpinUtil::is_all_complete_pinyin(pure_raw_input, pure_segmentation);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
ShuangpinInputSession::ShuangpinInputSession() : dictionary_(std::make_unique<DictionaryUlPb>())
|
||||
{
|
||||
}
|
||||
@@ -142,6 +176,14 @@ ShuangpinInputSession::advance_composition_after_selection(const std::string &se
|
||||
IInputSession::CloudQueryState ShuangpinInputSession::get_cloud_query_state() const
|
||||
{
|
||||
CloudQueryState state;
|
||||
state.cache_key = dictionary_->get_pinyin_sequence();
|
||||
state.committed_pinyin = dictionary_->get_pure_pinyin_sequence();
|
||||
|
||||
if (HasActiveShuangpinHelpcode(*this))
|
||||
{
|
||||
return state;
|
||||
}
|
||||
|
||||
const auto &pinyin_with_cases = dictionary_->get_pinyin_sequence_with_cases();
|
||||
if (!pinyin_with_cases.empty() && pinyin_with_cases.size() % 2 == 0)
|
||||
{
|
||||
@@ -153,9 +195,6 @@ IInputSession::CloudQueryState ShuangpinInputSession::get_cloud_query_state() co
|
||||
{
|
||||
state.query_text = dictionary_->get_quanpin();
|
||||
}
|
||||
|
||||
state.cache_key = dictionary_->get_pinyin_sequence();
|
||||
state.committed_pinyin = dictionary_->get_pure_pinyin_sequence();
|
||||
return state;
|
||||
}
|
||||
|
||||
|
||||
@@ -67,3 +67,36 @@ TEST_CASE(EngineShuangpinSessionCloudQueryMatchesLegacyTiming)
|
||||
state = session.get_cloud_query_state();
|
||||
REQUIRE(!state.should_query);
|
||||
}
|
||||
|
||||
TEST_CASE(EngineShuangpinSessionCloudQueryDoesNotTriggerWhenHelpcodesApply)
|
||||
{
|
||||
EngineInputSession session(SchemeType::Shuangpin);
|
||||
|
||||
InputLetters(session, "xitelea");
|
||||
auto state = session.get_cloud_query_state();
|
||||
REQUIRE(!state.should_query);
|
||||
|
||||
session.reset_state();
|
||||
InputLetters(session, "xiteleaA");
|
||||
state = session.get_cloud_query_state();
|
||||
REQUIRE(!state.should_query);
|
||||
}
|
||||
|
||||
TEST_CASE(EngineQuanpinSessionCloudQueryDoesNotTriggerWhenHelpcodesApply)
|
||||
{
|
||||
EngineInputSession session(SchemeType::Quanpin);
|
||||
|
||||
InputLetters(session, "xiteleA");
|
||||
auto state = session.get_cloud_query_state();
|
||||
REQUIRE(!state.should_query);
|
||||
|
||||
session.reset_state();
|
||||
InputLetters(session, "xiteleAA");
|
||||
state = session.get_cloud_query_state();
|
||||
REQUIRE(!state.should_query);
|
||||
|
||||
session.reset_state();
|
||||
InputLetters(session, "xitelR");
|
||||
state = session.get_cloud_query_state();
|
||||
REQUIRE(state.should_query);
|
||||
}
|
||||
@@ -105,7 +105,7 @@ TEST_CASE(QuanpinHelpcodeRequiresCompleteBasePinyin)
|
||||
REQUIRE_EQ(request.raw_input_with_cases, std::string("xitelA"));
|
||||
REQUIRE_EQ(request.raw_input, std::string("xitela"));
|
||||
REQUIRE_EQ(request.normalized_input, std::string("xitela"));
|
||||
REQUIRE_EQ(request.raw_segmentation, std::string("xi'te'la"));
|
||||
REQUIRE_EQ(request.raw_segmentation, std::string("xi'te'lA"));
|
||||
}
|
||||
|
||||
TEST_CASE(QuanpinCompletePinyinInputDetectionMatchesHelpcodesRequirement)
|
||||
|
||||
Reference in new issue
Block a user