diff --git a/frameworks/libs/distributeddb/common/src/query_expression.cpp b/frameworks/libs/distributeddb/common/src/query_expression.cpp index c491ce3215e262a4852ecc9bbc63d884902890d6..7bc61ad8997dd83f7b46e3b9ecfa9cb8eaa199c0 100644 --- a/frameworks/libs/distributeddb/common/src/query_expression.cpp +++ b/frameworks/libs/distributeddb/common/src/query_expression.cpp @@ -220,41 +220,47 @@ void QueryExpression::QueryByKeyRange(const std::vector &keyBegin, cons endKey_ = keyEnd; } +void QueryExpression::SetAssetsOnlyValidStatusIfNeed(int status) +{ + if (validStatusForAssetsOnly_ != E_OK && validStatusForAssetsOnly_ == -E_INVALID_ARGS) { + return; + } + validStatusForAssetsOnly_ = status; +} + void QueryExpression::QueryAssetsOnly(const AssetsMap &assets) { isAssetsOnly_ = true; if (useFromTable_) { - if (validStatusForAssetsOnly_ == E_OK) { - expressions_[fromTable_].QueryAssetsOnly(assets); - validStatusForAssetsOnly_ = expressions_[fromTable_].GetExpressionStatusForAssetsOnly(); - } + expressions_[fromTable_].QueryAssetsOnly(assets); + SetAssetsOnlyValidStatusIfNeed(expressions_[fromTable_].GetExpressionStatusForAssetsOnly()); return; } if (queryInfo_.empty()) { LOGE("[QueryExpression] the QueryAssetsOnly option must be connected with And."); - validStatusForAssetsOnly_ = -E_INVALID_ARGS; + SetAssetsOnlyValidStatusIfNeed(-E_INVALID_ARGS); return; } else if (queryInfo_.back().operFlag != QueryObjType::AND) { LOGE("[QueryExpression] the QueryAssetsOnly option must be connected with And."); - validStatusForAssetsOnly_ = -E_INVALID_ARGS; + SetAssetsOnlyValidStatusIfNeed(-E_INVALID_ARGS); return; } else { queryInfo_.pop_back(); } if (assetsGroupMap_.find(groupNum_) != assetsGroupMap_.end()) { LOGE("[QueryExpression]assets only already set!"); - validStatusForAssetsOnly_ = -E_NOT_SUPPORT; + SetAssetsOnlyValidStatusIfNeed(-E_NOT_SUPPORT); return; } if (assets.empty()) { LOGE("[QueryExpression]assets map can not be empty!"); - validStatusForAssetsOnly_ = -E_NOT_SUPPORT; + SetAssetsOnlyValidStatusIfNeed(-E_NOT_SUPPORT); return; } for (const auto &item : assets) { if (item.second.empty() && item.first.empty()) { LOGE("[QueryExpression]assets filed or asset name can not be empty!"); - validStatusForAssetsOnly_ = -E_NOT_SUPPORT; + SetAssetsOnlyValidStatusIfNeed(-E_NOT_SUPPORT); return; } } @@ -262,7 +268,7 @@ void QueryExpression::QueryAssetsOnly(const AssetsMap &assets) for (uint32_t i = 0; i <= groupNum_; i++) { if (assetsGroupMap_.find(i) == assetsGroupMap_.end()) { LOGE("[QueryExpression]asset group " PRIu32 " not found, may be AssetsOnly interface use in wrong way.", i); - validStatusForAssetsOnly_ = -E_NOT_SUPPORT; + SetAssetsOnlyValidStatusIfNeed(-E_NOT_SUPPORT); return; } } diff --git a/frameworks/libs/distributeddb/include/query_expression.h b/frameworks/libs/distributeddb/include/query_expression.h index e0763cc4d0b05b6d9d442e67d5661549d410166b..4cee65dde0695ba82a67bcdb6307bbf2e5a2ce43 100644 --- a/frameworks/libs/distributeddb/include/query_expression.h +++ b/frameworks/libs/distributeddb/include/query_expression.h @@ -173,6 +173,8 @@ private: void SetNotSupportIfNeed(QueryObjType type); + void SetAssetsOnlyValidStatusIfNeed(int status); + std::list queryInfo_; bool errFlag_ = true; std::vector prefixKey_; diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/cloud/distributeddb_cloud_syncer_download_assets_only_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/cloud/distributeddb_cloud_syncer_download_assets_only_test.cpp index 88646916a048540bfdc7c097b5309168432ddef5..6af3557f91f07b7db5fefd23b29d76eb2bcc6847 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/cloud/distributeddb_cloud_syncer_download_assets_only_test.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/cloud/distributeddb_cloud_syncer_download_assets_only_test.cpp @@ -1655,5 +1655,35 @@ HWTEST_F(DistributedDBCloudSyncerDownloadAssetsOnlyTest, DownloadAssetsOnly022, EndGroup().Or().BeginGroup().EqualTo("id", 0).And().AssetsOnly(assets1).EndGroup(); PriorityLevelSync(2, query, SyncMode::SYNC_MODE_CLOUD_FORCE_PULL, DBStatus::INVALID_ARGS); } + +/** + * @tc.name: DownloadAssetsOnly023 + * @tc.desc: test assets only with group and. + * @tc.type: FUNC + * @tc.require: + * @tc.author: luoguo + */ +HWTEST_F(DistributedDBCloudSyncerDownloadAssetsOnlyTest, DownloadAssetsOnly023, TestSize.Level0) +{ + /** + * @tc.steps:step1. init data + * @tc.expected: step1. return OK. + */ + int dataCount = 10; + InsertCloudDBData(0, dataCount, 0, ASSETS_TABLE_NAME); + CallSync({ASSETS_TABLE_NAME}, SYNC_MODE_CLOUD_MERGE, DBStatus::OK, DBStatus::OK); + + /** + * @tc.steps:step2. assets only sync. + * @tc.expected: step2. return Ok. + */ + std::map> assets; + assets["assets"] = {ASSET_COPY.name + "0"}; + std::map> assets1; + assets1["assets"] = {ASSET_COPY.name + "0_copy"}; + Query query = Query::Select().From(ASSETS_TABLE_NAME).BeginGroup().EqualTo("id", 0).And().AssetsOnly(assets). + EndGroup().And().BeginGroup().EqualTo("id", 0).And().AssetsOnly(assets1).EndGroup(); + PriorityLevelSync(2, query, SyncMode::SYNC_MODE_CLOUD_FORCE_PULL, DBStatus::OK); +} } // namespace #endif // RELATIONAL_STORE