diff --git a/frameworks/libs/distributeddb/syncer/src/cloud/strategy/cloud_custom_pull_strategy.cpp b/frameworks/libs/distributeddb/syncer/src/cloud/strategy/cloud_custom_pull_strategy.cpp index eb5ef57fa49dd11cd555d2a00f50023377bb0e97..f4dbda4312042ba4b346a532ee13e0fefa18b214 100644 --- a/frameworks/libs/distributeddb/syncer/src/cloud/strategy/cloud_custom_pull_strategy.cpp +++ b/frameworks/libs/distributeddb/syncer/src/cloud/strategy/cloud_custom_pull_strategy.cpp @@ -34,10 +34,16 @@ OpType CloudCustomPullStrategy::TagSyncDataStatus(const DataStatusInfo &statusIn for (const auto &item: upsert) { cloudData.insert_or_assign(item.first, item.second); } - if (ret == ConflictRet::NOT_HANDLE && IsDelete(cloudInfo)) { + if (ret != ConflictRet::NOT_HANDLE) { + return ConvertToOpType(statusInfo.isExistInLocal, ret); + } + if (IsDelete(cloudInfo)) { return OpType::CLEAR_GID; } - return ConvertToOpType(statusInfo.isExistInLocal, ret); + if (localInfo.cloudGid.empty() || IsLogNeedUpdate(cloudInfo, localInfo)) { + return OpType::ONLY_UPDATE_GID; + } + return OpType::NOT_HANDLE; } bool CloudCustomPullStrategy::JudgeUpdateCursor() const @@ -73,8 +79,6 @@ OpType CloudCustomPullStrategy::ConvertToOpType(bool isLocalExist, ConflictRet c return isLocalExist ? OpType::UPDATE : OpType::INSERT; case ConflictRet::DELETE: return OpType::DELETE; - case ConflictRet::NOT_HANDLE: - return OpType::NOT_HANDLE; default: LOGW("[CloudCustomPullStrategy] Unknown conflict ret %d", static_cast(conflictRet)); return OpType::NOT_HANDLE; diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/cloud/distributeddb_cloud_strategy_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/cloud/distributeddb_cloud_strategy_test.cpp index 5d8e203daab0cfec849c63a9f50625c715d6db79..8bf6e5bd81c83bb6781cfd96a9a329316e589587 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/cloud/distributeddb_cloud_strategy_test.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/cloud/distributeddb_cloud_strategy_test.cpp @@ -581,4 +581,38 @@ HWTEST_F(DistributedDBCloudStrategyTest, TagOpTyeTest011, TestSize.Level0) localInfo.originDev = "originDev"; EXPECT_EQ(strategy->TagSyncDataStatus(true, false, localInfo, cloudInfo), OpType::ONLY_UPDATE_GID); } + +/** + * @tc.name: TagOpTyeTest012 + * @tc.desc: Verify custom pull strategy. + * @tc.type: FUNC + * @tc.author: zqq + */ +HWTEST_F(DistributedDBCloudStrategyTest, TagOpTyeTest012, TestSize.Level0) +{ + auto strategy = StrategyFactory::BuildSyncStrategy(SyncMode::SYNC_MODE_CLOUD_CUSTOM_PULL); + ASSERT_NE(strategy, nullptr); + auto handler = std::make_shared(); + handler->SetCallback([](const std::string &, const VBucket &, const VBucket &, VBucket &) { + return ConflictRet::UPSERT; + }); + strategy->SetCloudConflictHandler(handler); + DataStatusInfo statusInfo; + VBucket localData; + VBucket cloudData; + LogInfo localInfo; + LogInfo cloudInfo; + statusInfo.isExistInLocal = true; + EXPECT_EQ(strategy->TagSyncDataStatus(statusInfo, localInfo, localData, cloudInfo, cloudData), + OpType::UPDATE); + handler->SetCallback([](const std::string &, const VBucket &, const VBucket &, VBucket &) { + return ConflictRet::NOT_HANDLE; + }); + EXPECT_EQ(strategy->TagSyncDataStatus(statusInfo, localInfo, localData, cloudInfo, cloudData), + OpType::ONLY_UPDATE_GID); + localInfo.cloudGid = "1"; + cloudInfo.version = "v"; + EXPECT_EQ(strategy->TagSyncDataStatus(statusInfo, localInfo, localData, cloudInfo, cloudData), + OpType::ONLY_UPDATE_GID); +} } \ No newline at end of file