• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #define MLOG_TAG "MediaAlbumsService"
17 
18 #include "media_albums_service.h"
19 
20 #include <string>
21 
22 #include "medialibrary_album_operations.h"
23 #include "media_albums_rdb_operations.h"
24 #include "media_log.h"
25 #include "medialibrary_data_manager.h"
26 #include "medialibrary_errno.h"
27 #include "medialibrary_notify.h"
28 #include "medialibrary_rdbstore.h"
29 #include "location_column.h"
30 #include "photo_album_column.h"
31 #include "story_album_column.h"
32 #include "media_file_utils.h"
33 #include "result_set_utils.h"
34 #include "medialibrary_analysis_album_operations.h"
35 #include "photo_map_operations.h"
36 #include "medialibrary_common_utils.h"
37 #include "medialibrary_business_code.h"
38 #include "vision_photo_map_column.h"
39 #include "medialibrary_client_errno.h"
40 #include "rdb_utils.h"
41 #include "medialibrary_rdb_utils.h"
42 #include "photo_map_column.h"
43 #include "permission_utils.h"
44 #include "album_operation_uri.h"
45 #include "datashare_result_set.h"
46 #include "user_photography_info_column.h"
47 #include "story_album_column.h"
48 #include "userfile_manager_types.h"
49 #include "story_cover_info_column.h"
50 #include "story_play_info_column.h"
51 #include "vision_column_comm.h"
52 #include "medialibrary_photo_operations.h"
53 #include "rdb_predicates.h"
54 #include "dfx_refresh_manager.h"
55 #include "media_file_utils.h"
56 #include "refresh_business_name.h"
57 
58 using namespace std;
59 using namespace OHOS::RdbDataShareAdapter;
60 
61 namespace OHOS::Media {
62 
63 struct HighlightAlbumInfo {
64     std::string uriStr;
65     std::vector<std::string> fetchColumn;
66 };
67 
68 static const std::map<int32_t, struct HighlightAlbumInfo> HIGHLIGHT_ALBUM_INFO_MAP = {
69     { COVER_INFO, { PAH_QUERY_HIGHLIGHT_COVER, { ID, HIGHLIGHT_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID,
70         AI_ALBUM_ID, SUB_TITLE, CLUSTER_TYPE, CLUSTER_SUB_TYPE,
71         CLUSTER_CONDITION, MIN_DATE_ADDED, MAX_DATE_ADDED, GENERATE_TIME, HIGHLIGHT_VERSION,
72         REMARKS, HIGHLIGHT_STATUS, RATIO, BACKGROUND, FOREGROUND, WORDART, IS_COVERED, COLOR,
73         RADIUS, SATURATION, BRIGHTNESS, BACKGROUND_COLOR_TYPE, SHADOW_LEVEL, TITLE_SCALE_X,
74         TITLE_SCALE_Y, TITLE_RECT_WIDTH, TITLE_RECT_HEIGHT, BACKGROUND_SCALE_X, BACKGROUND_SCALE_Y,
75         BACKGROUND_RECT_WIDTH, BACKGROUND_RECT_HEIGHT, LAYOUT_INDEX, COVER_ALGO_VERSION, COVER_KEY, COVER_STATUS,
76         HIGHLIGHT_IS_MUTED, HIGHLIGHT_IS_FAVORITE, HIGHLIGHT_THEME, HIGHLIGHT_PIN_TIME, HIGHLIGHT_USE_SUBTITLE } } },
77     { PLAY_INFO, { PAH_QUERY_HIGHLIGHT_PLAY, { ID, HIGHLIGHT_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID,
78         MUSIC, FILTER, HIGHLIGHT_PLAY_INFO, IS_CHOSEN, PLAY_INFO_VERSION, PLAY_INFO_ID } } },
79 };
80 
GetInstance()81 MediaAlbumsService &MediaAlbumsService::GetInstance()
82 {
83     static MediaAlbumsService service;
84     return service;
85 }
86 
DeleteHighlightAlbums(const vector<string> & albumIds)87 int32_t MediaAlbumsService::DeleteHighlightAlbums(const vector<string>& albumIds)
88 {
89     // Only Highlight albums can be deleted by this way
90     MEDIA_INFO_LOG("Delete highlight albums");
91     int32_t changedRows = this->rdbOperation_.DeleteHighlightAlbums(albumIds);
92     CHECK_AND_RETURN_RET_LOG(changedRows >= 0, E_HAS_DB_ERROR,
93         "Delete highlight album failed, changedRows is %{private}d", changedRows);
94 
95     auto watch = MediaLibraryNotify::GetInstance();
96     CHECK_AND_RETURN_RET_LOG(watch != nullptr, E_ERR, "Can not get MediaLibraryNotify Instance");
97 
98     if (changedRows > 0) {
99         for (size_t i = 0; i < albumIds.size(); ++i) {
100             watch->Notify(MediaFileUtils::GetUriByExtrConditions(PhotoAlbumColumns::ANALYSIS_ALBUM_URI_PREFIX,
101                 albumIds[i]), NotifyType::NOTIFY_REMOVE);
102         }
103     }
104     return changedRows;
105 }
106 
DeletePhotoAlbums(const std::vector<std::string> & albumIds)107 int32_t MediaAlbumsService::DeletePhotoAlbums(const std::vector<std::string> &albumIds)
108 {
109     NativeRdb::RdbPredicates rdbPredicate(PhotoAlbumColumns::TABLE);
110     rdbPredicate.In(PhotoAlbumColumns::ALBUM_ID, albumIds);
111     return MediaLibraryAlbumOperations::DeletePhotoAlbum(rdbPredicate);
112 }
113 
CreatePhotoAlbum(const std::string & albumName)114 int32_t MediaAlbumsService::CreatePhotoAlbum(const std::string& albumName)
115 {
116     NativeRdb::ValuesBucket value;
117     value.PutString(PhotoAlbumColumns::ALBUM_NAME, albumName);
118     MediaLibraryCommand cmd(OperationObject::PHOTO_ALBUM, OperationType::CREATE, value);
119     return MediaLibraryAlbumOperations::HandlePhotoAlbumOperations(cmd);
120 }
121 
SetSubtitle(const string & highlightAlbumId,const string & albumSubtitle)122 int32_t MediaAlbumsService::SetSubtitle(const string& highlightAlbumId, const string& albumSubtitle)
123 {
124     NativeRdb::ValuesBucket values;
125     DataShare::DataSharePredicates predicates;
126     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, highlightAlbumId);
127     values.Put(SUB_TITLE, albumSubtitle);
128     return MediaLibraryAlbumOperations::SetHighlightSubtitle(values, predicates);
129 }
130 
SetHighlightUserActionData(const SetHighlightUserActionDataDto & dto)131 int32_t MediaAlbumsService::SetHighlightUserActionData(const SetHighlightUserActionDataDto& dto)
132 {
133     int32_t err = this->rdbOperation_.SetHighlightUserActionData(dto);
134     return err;
135 }
136 
SetPortraitAlbumName(const ChangeRequestSetAlbumNameDto & dto)137 int32_t MediaAlbumsService::SetPortraitAlbumName(const ChangeRequestSetAlbumNameDto& dto)
138 {
139     NativeRdb::ValuesBucket values;
140     DataShare::DataSharePredicates predicates;
141     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
142     values.Put(PhotoAlbumColumns::ALBUM_NAME, dto.albumName);
143     return MediaLibraryAlbumOperations::SetAlbumName(values, predicates);
144 }
145 
SetGroupAlbumName(const ChangeRequestSetAlbumNameDto & dto)146 int32_t MediaAlbumsService::SetGroupAlbumName(const ChangeRequestSetAlbumNameDto& dto)
147 {
148     NativeRdb::ValuesBucket values;
149     DataShare::DataSharePredicates predicates;
150     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
151     values.Put(PhotoAlbumColumns::ALBUM_NAME, dto.albumName);
152     return MediaLibraryAnalysisAlbumOperations::SetGroupAlbumName(values, predicates);
153 }
154 
SetHighlightAlbumName(const ChangeRequestSetAlbumNameDto & dto)155 int32_t MediaAlbumsService::SetHighlightAlbumName(const ChangeRequestSetAlbumNameDto& dto)
156 {
157     NativeRdb::ValuesBucket values;
158     DataShare::DataSharePredicates predicates;
159     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
160     values.Put(PhotoAlbumColumns::ALBUM_NAME, dto.albumName);
161     return MediaLibraryAlbumOperations::SetHighlightAlbumName(values, predicates);
162 }
163 
RenameUserAlbum(const string & albumId,const string & newAlbumName)164 int32_t MediaAlbumsService::RenameUserAlbum(const string& albumId, const string &newAlbumName)
165 {
166     NativeRdb::ValuesBucket values;
167     DataShare::DataSharePredicates predicates;
168     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, albumId);
169     values.Put(PhotoAlbumColumns::ALBUM_NAME, newAlbumName);
170     return MediaLibraryAlbumOperations::HandleSetAlbumNameRequest(values, predicates);
171 }
172 
ChangeRequestSetAlbumName(const ChangeRequestSetAlbumNameDto & dto)173 int32_t MediaAlbumsService::ChangeRequestSetAlbumName(const ChangeRequestSetAlbumNameDto& dto)
174 {
175     switch (dto.albumSubtype) {
176         case PhotoAlbumSubType::PORTRAIT:
177             return SetPortraitAlbumName(dto);
178         case PhotoAlbumSubType::GROUP_PHOTO:
179             return SetGroupAlbumName(dto);
180         case PhotoAlbumSubType::HIGHLIGHT:
181         case PhotoAlbumSubType::HIGHLIGHT_SUGGESTIONS:
182             return SetHighlightAlbumName(dto);
183         default:
184             break;
185     }
186     return RenameUserAlbum(dto.albumId, dto.albumName);
187 }
188 
SetPortraitCoverUri(const ChangeRequestSetCoverUriDto & dto)189 int32_t MediaAlbumsService::SetPortraitCoverUri(const ChangeRequestSetCoverUriDto& dto)
190 {
191     NativeRdb::ValuesBucket values;
192     DataShare::DataSharePredicates predicates;
193     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
194     values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
195     return MediaLibraryAlbumOperations::SetCoverUri(values, predicates);
196 }
197 
SetGroupAlbumCoverUri(const ChangeRequestSetCoverUriDto & dto)198 int32_t MediaAlbumsService::SetGroupAlbumCoverUri(const ChangeRequestSetCoverUriDto& dto)
199 {
200     NativeRdb::ValuesBucket values;
201     DataShare::DataSharePredicates predicates;
202     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
203     values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
204     return MediaLibraryAnalysisAlbumOperations::SetGroupCoverUri(values, predicates);
205 }
206 
SetHighlightAlbumCoverUri(const ChangeRequestSetCoverUriDto & dto)207 int32_t MediaAlbumsService::SetHighlightAlbumCoverUri(const ChangeRequestSetCoverUriDto& dto)
208 {
209     NativeRdb::ValuesBucket values;
210     DataShare::DataSharePredicates predicates;
211     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
212     values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
213     return MediaLibraryAlbumOperations::SetHighlightCoverUri(values, predicates);
214 }
215 
SetUserAlbumCoverUri(const ChangeRequestSetCoverUriDto & dto)216 int32_t MediaAlbumsService::SetUserAlbumCoverUri(const ChangeRequestSetCoverUriDto& dto)
217 {
218     NativeRdb::ValuesBucket values;
219     DataShare::DataSharePredicates predicates;
220     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
221     values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
222     values.Put(PhotoAlbumColumns::ALBUM_SUBTYPE, dto.albumSubtype);
223     return MediaLibraryAlbumOperations::UpdateAlbumCoverUri(values, predicates, false);
224 }
225 
SetSourceAlbumCoverUri(const ChangeRequestSetCoverUriDto & dto)226 int32_t MediaAlbumsService::SetSourceAlbumCoverUri(const ChangeRequestSetCoverUriDto& dto)
227 {
228     NativeRdb::ValuesBucket values;
229     DataShare::DataSharePredicates predicates;
230     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
231     values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
232     values.Put(PhotoAlbumColumns::ALBUM_SUBTYPE, dto.albumSubtype);
233     return MediaLibraryAlbumOperations::UpdateAlbumCoverUri(values, predicates, false);
234 }
235 
SetSystemAlbumCoverUri(const ChangeRequestSetCoverUriDto & dto)236 int32_t MediaAlbumsService::SetSystemAlbumCoverUri(const ChangeRequestSetCoverUriDto& dto)
237 {
238     NativeRdb::ValuesBucket values;
239     DataShare::DataSharePredicates predicates;
240     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
241     values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
242     values.Put(PhotoAlbumColumns::ALBUM_SUBTYPE, dto.albumSubtype);
243     return MediaLibraryAlbumOperations::UpdateAlbumCoverUri(values, predicates, true);
244 }
245 
ChangeRequestSetCoverUri(const ChangeRequestSetCoverUriDto & dto)246 int32_t MediaAlbumsService::ChangeRequestSetCoverUri(const ChangeRequestSetCoverUriDto& dto)
247 {
248     switch (dto.albumSubtype) {
249         case PhotoAlbumSubType::PORTRAIT:
250             return SetPortraitCoverUri(dto);
251         case PhotoAlbumSubType::GROUP_PHOTO:
252             return SetGroupAlbumCoverUri(dto);
253         case PhotoAlbumSubType::HIGHLIGHT:
254         case PhotoAlbumSubType::HIGHLIGHT_SUGGESTIONS:
255             return SetHighlightAlbumCoverUri(dto);
256         default:
257             break;
258     }
259     return SetUserAlbumCoverUri(dto);
260 }
261 
ChangeRequestSetDisplayLevel(int32_t displayLevelValue,int32_t albumId)262 int32_t MediaAlbumsService::ChangeRequestSetDisplayLevel(int32_t displayLevelValue,
263     int32_t albumId)
264 {
265     NativeRdb::ValuesBucket values;
266     DataShare::DataSharePredicates predicates;
267     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
268     values.Put(USER_DISPLAY_LEVEL, displayLevelValue);
269     return MediaLibraryAlbumOperations::SetDisplayLevel(values, predicates);
270 }
271 
ChangeRequestSetIsMe(int32_t albumId)272 int32_t MediaAlbumsService::ChangeRequestSetIsMe(int32_t albumId)
273 {
274     NativeRdb::ValuesBucket values;
275     DataShare::DataSharePredicates predicates;
276     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
277     return MediaLibraryAlbumOperations::SetIsMe(values, predicates);
278 }
279 
ChangeRequestDismiss(int32_t albumId)280 int32_t MediaAlbumsService::ChangeRequestDismiss(int32_t albumId)
281 {
282     NativeRdb::ValuesBucket values;
283     DataShare::DataSharePredicates predicates;
284     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
285     return MediaLibraryAnalysisAlbumOperations::DismissGroupPhotoAlbum(values, predicates);
286 }
287 
ChangeRequestResetCoverUri(int32_t albumId,PhotoAlbumSubType albumSubType)288 int32_t MediaAlbumsService::ChangeRequestResetCoverUri(int32_t albumId, PhotoAlbumSubType albumSubType)
289 {
290     NativeRdb::ValuesBucket values;
291     DataShare::DataSharePredicates predicates;
292     values.Put(PhotoAlbumColumns::ALBUM_SUBTYPE, albumSubType);
293     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
294     return MediaLibraryAlbumOperations::ResetCoverUri(values, predicates);
295 }
296 
AlbumCommitModify(const AlbumCommitModifyDto & commitModifyDto,int32_t businessCode)297 int32_t MediaAlbumsService::AlbumCommitModify(const AlbumCommitModifyDto& commitModifyDto, int32_t businessCode)
298 {
299     DataShare::DataSharePredicates predicates;
300     NativeRdb::ValuesBucket values;
301     if (businessCode == static_cast<uint32_t>(MediaLibraryBusinessCode::PAH_COMMIT_MODIFY)) {
302         values.Put(PhotoAlbumColumns::ALBUM_NAME, commitModifyDto.albumName);
303     }
304     values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, commitModifyDto.coverUri);
305     predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(commitModifyDto.albumId));
306 
307     int32_t changedRows = MediaLibraryAlbumOperations::UpdatePhotoAlbum(values, predicates);
308     return changedRows;
309 }
310 
QueryPhoto(int32_t albumId,bool isSmartAlbum)311 static shared_ptr<NativeRdb::ResultSet> QueryPhoto(int32_t albumId, bool isSmartAlbum)
312 {
313     NativeRdb::RdbPredicates querypred(PhotoAlbumColumns::TABLE);
314     querypred.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
315     querypred.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
316 
317     auto whereClause = querypred.GetWhereClause();
318     CHECK_AND_RETURN_RET_LOG(MediaLibraryCommonUtils::CheckWhereClause(whereClause), nullptr,
319         "illegal query whereClause input %{private}s", whereClause.c_str());
320 
321     vector<string> fetchColumn = {
322         PhotoAlbumColumns::ALBUM_ID,
323         PhotoAlbumColumns::ALBUM_COUNT,
324     };
325     if (!isSmartAlbum) {
326         fetchColumn.push_back(PhotoAlbumColumns::ALBUM_IMAGE_COUNT);
327         fetchColumn.push_back(PhotoAlbumColumns::ALBUM_VIDEO_COUNT);
328     }
329     MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(const_cast<vector<string> &>(fetchColumn));
330     return MediaLibraryRdbStore::QueryWithFilter(querypred, fetchColumn);
331 }
332 
FetchNewCount(shared_ptr<NativeRdb::ResultSet> resultSet,AlbumPhotoQueryRespBody & respBody)333 static int32_t FetchNewCount(shared_ptr<NativeRdb::ResultSet> resultSet, AlbumPhotoQueryRespBody& respBody)
334 {
335     if (resultSet == nullptr) {
336         MEDIA_ERR_LOG("resultSet == nullptr");
337         return E_ERR;
338     }
339 
340     if (resultSet->GoToFirstRow() != 0) {
341         MEDIA_ERR_LOG("go to first row failed");
342         return E_ERR;
343     }
344 
345     respBody.newCount =
346         get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoAlbumColumns::ALBUM_COUNT, resultSet, TYPE_INT32));
347     respBody.newImageCount =
348         get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoAlbumColumns::ALBUM_IMAGE_COUNT, resultSet, TYPE_INT32));
349     respBody.newVideoCount =
350         get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoAlbumColumns::ALBUM_VIDEO_COUNT, resultSet, TYPE_INT32));
351     return E_OK;
352 }
353 
AlbumAddAssets(const AlbumAddAssetsDto & addAssetsDto,AlbumPhotoQueryRespBody & respBody)354 int32_t MediaAlbumsService::AlbumAddAssets(const AlbumAddAssetsDto& addAssetsDto, AlbumPhotoQueryRespBody& respBody)
355 {
356     vector<DataShare::DataShareValuesBucket> valuesBuckets;
357     for (const auto &assetId : addAssetsDto.assetsArray) {
358         DataShare::DataShareValuesBucket valuesBucket;
359         valuesBucket.Put(PhotoColumn::PHOTO_OWNER_ALBUM_ID, addAssetsDto.albumId);
360         valuesBucket.Put(PhotoColumn::MEDIA_ID, assetId);
361         valuesBuckets.push_back(valuesBucket);
362     }
363 
364     int32_t changedRows = PhotoMapOperations::AddPhotoAssets(valuesBuckets);
365     if (changedRows < 0) {
366         return changedRows;
367     }
368 
369     auto resultSet = QueryPhoto(addAssetsDto.albumId, addAssetsDto.isSmartAlbum);
370     if (FetchNewCount(resultSet, respBody) != E_OK) {
371         return -1;
372     }
373     return changedRows;
374 }
375 
AlbumRemoveAssets(const AlbumRemoveAssetsDto & removeAssetsDto,AlbumPhotoQueryRespBody & respBody)376 int32_t MediaAlbumsService::AlbumRemoveAssets(const AlbumRemoveAssetsDto& removeAssetsDto,
377     AlbumPhotoQueryRespBody& respBody)
378 {
379     DataShare::DataSharePredicates predicates;
380     predicates.EqualTo(PhotoColumn::PHOTO_OWNER_ALBUM_ID, to_string(removeAssetsDto.albumId));
381     predicates.And()->In(PhotoColumn::MEDIA_ID, removeAssetsDto.assetsArray);
382 
383     auto whereClause = predicates.GetWhereClause();
384     CHECK_AND_RETURN_RET_LOG(MediaLibraryCommonUtils::CheckWhereClause(whereClause), E_SQL_CHECK_FAIL,
385         "illegal query whereClause input %{private}s", whereClause.c_str());
386 
387     NativeRdb::RdbPredicates rdbPredicate = RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, PhotoMap::TABLE);
388     int32_t changedRows = PhotoMapOperations::RemovePhotoAssets(rdbPredicate);
389     if (changedRows < 0) {
390         return changedRows;
391     }
392 
393     auto resultSet = QueryPhoto(removeAssetsDto.albumId, removeAssetsDto.isSmartAlbum);
394     if (FetchNewCount(resultSet, respBody) != E_OK) {
395         return -1;
396     }
397     return changedRows;
398 }
399 
AlbumRecoverAssets(const AlbumRecoverAssetsDto & recoverAssetsDto)400 int32_t MediaAlbumsService::AlbumRecoverAssets(const AlbumRecoverAssetsDto& recoverAssetsDto)
401 {
402     DataShare::DataSharePredicates predicates;
403     predicates.In(MediaColumn::MEDIA_ID, recoverAssetsDto.uris);
404 
405     return MediaLibraryAlbumOperations::RecoverPhotoAssets(predicates);
406 }
407 
AlbumGetAssets(AlbumGetAssetsDto & dto)408 std::shared_ptr<DataShare::DataShareResultSet> MediaAlbumsService::AlbumGetAssets(AlbumGetAssetsDto &dto)
409 {
410     auto startTime = MediaFileUtils::UTCTimeMilliSeconds();
411     MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(dto.columns);
412     NativeRdb::RdbPredicates predicates =
413         RdbDataShareAdapter::RdbUtils::ToPredicates(dto.predicates, PhotoColumn::PHOTOS_TABLE);
414     auto resultSet = PhotoMapOperations::QueryPhotoAssets(predicates, dto.columns);
415     auto totalCostTime = MediaFileUtils::UTCTimeMilliSeconds() - startTime;
416     AccurateRefresh::DfxRefreshManager::QueryStatementReport(
417         AccurateRefresh::GET_ASSETS_BUSSINESS_NAME, totalCostTime, predicates.GetStatement());
418     CHECK_AND_RETURN_RET_LOG(resultSet, nullptr, "Failed to query album assets");
419     auto resultSetBridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resultSet);
420     return make_shared<DataShare::DataShareResultSet>(resultSetBridge);
421 }
422 
LogQueryParams(const DataShare::DataSharePredicates & predicates,const vector<string> & fetchColumn)423 static void LogQueryParams(const DataShare::DataSharePredicates &predicates, const vector<string> &fetchColumn)
424 {
425     std::string sqlColumns;
426     for (const auto &column : fetchColumn) {
427         if (!sqlColumns.empty()) {
428             sqlColumns += ",";
429         }
430         sqlColumns += column;
431     }
432     NativeRdb::RdbPredicates rdbPredicate = RdbUtils::ToPredicates(predicates, PhotoAlbumColumns::TABLE);
433     std::string sqlWhere = rdbPredicate.GetWhereClause();
434     for (const auto &whereArg : rdbPredicate.GetWhereArgs()) {
435         sqlWhere.replace(sqlWhere.find("?"), 1, whereArg);
436     }
437     std::string sqlOrder = rdbPredicate.GetOrder();
438     MEDIA_INFO_LOG("sqlColumns: %{public}s", sqlColumns.c_str());
439     MEDIA_INFO_LOG("sqlWhere: %{public}s", sqlWhere.c_str());
440     MEDIA_INFO_LOG("sqlOrder: %{public}s", sqlOrder.c_str());
441 }
442 
CheckAlbumFetchColumns(const vector<string> & fetchColumn)443 static bool CheckAlbumFetchColumns(const vector<string> &fetchColumn)
444 {
445     for (const auto &column : fetchColumn) {
446         if (!PhotoAlbumColumns::IsPhotoAlbumColumn(column)) {
447             MEDIA_ERR_LOG("Invalid columns:%{public}s", column.c_str());
448             return false;
449         }
450     }
451     return true;
452 }
453 
ReplaceFetchColumn(std::vector<std::string> & fetchColumn,const std::string & oldColumn,const std::string & newColumn)454 static void ReplaceFetchColumn(std::vector<std::string> &fetchColumn,
455     const std::string &oldColumn, const std::string &newColumn)
456 {
457     auto it = std::find(fetchColumn.begin(), fetchColumn.end(), oldColumn);
458     if (it != fetchColumn.end()) {
459         it->assign(newColumn);
460     }
461 }
462 
AddDefaultPhotoAlbumColumns(vector<string> & fetchColumn)463 static void AddDefaultPhotoAlbumColumns(vector<string> &fetchColumn)
464 {
465     auto columns = PhotoAlbumColumns::DEFAULT_FETCH_COLUMNS;
466     for (const auto &column : fetchColumn) {
467         if (columns.count(column) == 0) {
468             columns.insert(column);
469         }
470     }
471     fetchColumn.assign(columns.begin(), columns.end());
472 }
473 
AddNoSmartFetchColumns(std::vector<std::string> & fetchColumn)474 static void AddNoSmartFetchColumns(std::vector<std::string> &fetchColumn)
475 {
476     AddDefaultPhotoAlbumColumns(fetchColumn);
477     fetchColumn.push_back(PhotoAlbumColumns::ALBUM_IMAGE_COUNT);
478     fetchColumn.push_back(PhotoAlbumColumns::ALBUM_VIDEO_COUNT);
479     fetchColumn.push_back(PhotoAlbumColumns::ALBUM_LPATH);
480     fetchColumn.push_back(PhotoAlbumColumns::ALBUM_DATE_ADDED);
481 }
482 
AddPhotoAlbumTypeFilter(DataShare::DataSharePredicates & predicates,int32_t albumType,int32_t albumSubType)483 static void AddPhotoAlbumTypeFilter(DataShare::DataSharePredicates &predicates,
484     int32_t albumType, int32_t albumSubType)
485 {
486     if (albumType != PhotoAlbumType::INVALID) {
487         predicates.And()->EqualTo(PhotoAlbumColumns::ALBUM_TYPE, to_string(albumType));
488     }
489     if (albumSubType != PhotoAlbumSubType::ANY) {
490         predicates.And()->EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, to_string(albumSubType));
491         if (albumSubType == PhotoAlbumSubType::SHOOTING_MODE || albumSubType == PhotoAlbumSubType::GEOGRAPHY_CITY) {
492             predicates.OrderByDesc(PhotoAlbumColumns::ALBUM_COUNT);
493         }
494     }
495     if (PermissionUtils::IsSystemApp()) {
496         predicates.And()->NotEqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, to_string(PhotoAlbumSubType::HIDDEN));
497     } else {
498         predicates.And()->In(PhotoAlbumColumns::ALBUM_SUBTYPE, vector<string>({
499             to_string(PhotoAlbumSubType::USER_GENERIC),
500             to_string(PhotoAlbumSubType::FAVORITE),
501             to_string(PhotoAlbumSubType::VIDEO),
502             to_string(PhotoAlbumSubType::IMAGE),
503         }));
504     }
505 }
506 
GetAllLocationPredicates(DataShare::DataSharePredicates & predicates)507 static NativeRdb::RdbPredicates GetAllLocationPredicates(DataShare::DataSharePredicates &predicates)
508 {
509     predicates.EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
510     predicates.EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(0));
511     predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0));
512     predicates.EqualTo(PhotoColumn::PHOTO_IS_TEMP, to_string(0));
513     predicates.EqualTo(PhotoColumn::PHOTO_BURST_COVER_LEVEL,
514         to_string(static_cast<int32_t>(BurstCoverLevelType::COVER)));
515     predicates.And()->NotEqualTo(PhotoColumn::PHOTO_LATITUDE, to_string(0));
516     predicates.And()->NotEqualTo(PhotoColumn::PHOTO_LONGITUDE, to_string(0));
517     return RdbUtils::ToPredicates(predicates, PhotoColumn::PHOTOS_TABLE);
518 }
519 
ReplacePredicatesColumn(DataShare::DataSharePredicates & predicates,const std::string & oldColumn,const std::string & newColumn)520 static void ReplacePredicatesColumn(DataShare::DataSharePredicates& predicates,
521     const std::string &oldColumn, const std::string &newColumn)
522 {
523     constexpr int32_t fieldIdx = 0;
524     auto& items = predicates.GetOperationList();
525     std::vector<DataShare::OperationItem> tmpOperations = {};
526     for (const DataShare::OperationItem& item : items) {
527         if (item.singleParams.empty()) {
528             tmpOperations.push_back(item);
529             continue;
530         }
531         if (static_cast<string>(item.GetSingle(fieldIdx)) == oldColumn) {
532             DataShare::OperationItem tmpItem = item;
533             tmpItem.singleParams[fieldIdx] = newColumn;
534             tmpOperations.push_back(tmpItem);
535             continue;
536         }
537         tmpOperations.push_back(item);
538     }
539     predicates = DataShare::DataSharePredicates(move(tmpOperations));
540 }
541 
AddHighlightAlbumPredicates(DataShare::DataSharePredicates & predicates,int32_t albumSubType)542 static void AddHighlightAlbumPredicates(DataShare::DataSharePredicates& predicates, int32_t albumSubType)
543 {
544     std::string analysisAlbumId = ANALYSIS_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID;
545     vector<string> onClause = {
546         analysisAlbumId + " = " + HIGHLIGHT_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID,
547     };
548     if (albumSubType == PhotoAlbumSubType::HIGHLIGHT_SUGGESTIONS) {
549         onClause = {
550             analysisAlbumId + " = " + HIGHLIGHT_ALBUM_TABLE + "." + AI_ALBUM_ID,
551         };
552     }
553     predicates.InnerJoin(HIGHLIGHT_ALBUM_TABLE)->On(onClause);
554     predicates.OrderByDesc(MAX_DATE_ADDED + ", " + GENERATE_TIME);
555     ReplacePredicatesColumn(predicates, PhotoAlbumColumns::ALBUM_ID, analysisAlbumId);
556 }
557 
GenerateAnalysisCmd(MediaLibraryCommand & cmd,DataShare::DataSharePredicates & predicates)558 static void GenerateAnalysisCmd(MediaLibraryCommand &cmd,
559     DataShare::DataSharePredicates &predicates)
560 {
561     NativeRdb::RdbPredicates rdbPredicate = RdbUtils::ToPredicates(predicates, MEDIALIBRARY_TABLE);
562     cmd.GetAbsRdbPredicates()->SetWhereClause(rdbPredicate.GetWhereClause());
563     cmd.GetAbsRdbPredicates()->SetWhereArgs(rdbPredicate.GetWhereArgs());
564     cmd.GetAbsRdbPredicates()->SetOrder(rdbPredicate.GetOrder());
565 }
566 
QueryAlbums(QueryAlbumsDto & dto)567 int32_t MediaAlbumsService::QueryAlbums(QueryAlbumsDto &dto)
568 {
569     std::shared_ptr<NativeRdb::ResultSet> resultSet;
570     std::vector<std::string> &columns = dto.columns;
571     MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(columns);
572     auto startTime = MediaFileUtils::UTCTimeMilliSeconds();
573     std::string sqlStr = "";
574     MediaLibraryCommand cmd(OperationObject::ANALYSIS_PHOTO_ALBUM, OperationType::QUERY);
575     if (dto.albumType == PhotoAlbumType::SMART) {
576         if (dto.albumSubType == PhotoAlbumSubType::GEOGRAPHY_LOCATION) {
577             NativeRdb::RdbPredicates rdbPredicate = GetAllLocationPredicates(dto.predicates);
578             const auto &locations = PhotoAlbumColumns::LOCATION_DEFAULT_FETCH_COLUMNS;
579             columns.insert(columns.end(), locations.begin(), locations.end());
580             resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicate, columns);
581             sqlStr = rdbPredicate.GetStatement();
582         } else if (dto.albumSubType == PhotoAlbumSubType::GEOGRAPHY_CITY) {
583             columns = PhotoAlbumColumns::CITY_DEFAULT_FETCH_COLUMNS;
584             std::string onClause = PhotoAlbumColumns::ALBUM_NAME  + " = " + CITY_ID;
585             dto.predicates.InnerJoin(GEO_DICTIONARY_TABLE)->On({ onClause });
586             dto.predicates.NotEqualTo(PhotoAlbumColumns::ALBUM_COUNT, to_string(0));
587             AddPhotoAlbumTypeFilter(dto.predicates, dto.albumType, dto.albumSubType);
588             GenerateAnalysisCmd(cmd, dto.predicates);
589             resultSet = MediaLibraryDataManager::QueryAnalysisAlbum(cmd, columns, dto.predicates);
590             sqlStr = cmd.GetAbsRdbPredicates()->GetStatement();
591         } else {
592             AddDefaultPhotoAlbumColumns(columns);
593             if (dto.albumSubType == PhotoAlbumSubType::HIGHLIGHT ||
594                 dto.albumSubType == PhotoAlbumSubType::HIGHLIGHT_SUGGESTIONS) {
595                 AddHighlightAlbumPredicates(dto.predicates, dto.albumSubType);
596                 std::string analysisAlbumId = ANALYSIS_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID +
597                     " AS " + PhotoAlbumColumns::ALBUM_ID;
598                 ReplaceFetchColumn(columns, PhotoAlbumColumns::ALBUM_ID, analysisAlbumId);
599             }
600             AddPhotoAlbumTypeFilter(dto.predicates, dto.albumType, dto.albumSubType);
601             GenerateAnalysisCmd(cmd, dto.predicates);
602             resultSet = MediaLibraryDataManager::QueryAnalysisAlbum(cmd, columns, dto.predicates);
603             sqlStr = cmd.GetAbsRdbPredicates()->GetStatement();
604         }
605     } else {
606         AddNoSmartFetchColumns(columns);
607         AddPhotoAlbumTypeFilter(dto.predicates, dto.albumType, dto.albumSubType);
608         NativeRdb::RdbPredicates rdbPredicate = RdbUtils::ToPredicates(dto.predicates, PhotoAlbumColumns::TABLE);
609         if (rdbPredicate.GetOrder().empty()) {
610             rdbPredicate.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
611         }
612         resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicate, columns);
613         sqlStr = rdbPredicate.GetStatement();
614     }
615     int64_t totalCostTime = MediaFileUtils::UTCTimeMilliSeconds() - startTime;
616     AccurateRefresh::DfxRefreshManager::QueryStatementReport(
617         AccurateRefresh::DEAL_ALBUMS_BUSSINESS_NAME, totalCostTime, sqlStr);
618     LogQueryParams(dto.predicates, columns);
619 
620     CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, E_HAS_DB_ERROR, "resultSet nullptr");
621     auto bridge = RdbUtils::ToResultSetBridge(resultSet);
622     dto.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
623     return E_OK;
624 }
625 
QueryHiddenAlbums(QueryAlbumsDto & dto)626 int32_t MediaAlbumsService::QueryHiddenAlbums(QueryAlbumsDto &dto)
627 {
628     std::vector<std::string> &columns = dto.columns;
629     if (!CheckAlbumFetchColumns(columns)) {
630         return E_INVALID_VALUES;
631     }
632 
633     AddNoSmartFetchColumns(columns);
634     if (dto.hiddenAlbumFetchMode == 1) {
635         columns.push_back(PhotoAlbumColumns::HIDDEN_COUNT);
636         columns.push_back(PhotoAlbumColumns::HIDDEN_COVER);
637         dto.predicates.And()->EqualTo(PhotoAlbumColumns::CONTAINS_HIDDEN, to_string(1));
638         dto.predicates.And()->NotEqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, PhotoAlbumSubType::HIDDEN);
639         dto.predicates.And()->NotEqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, PhotoAlbumSubType::TRASH);
640     } else {
641         dto.predicates.And()->EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, PhotoAlbumSubType::HIDDEN);
642     }
643 
644     NativeRdb::RdbPredicates rdbPredicate = RdbUtils::ToPredicates(dto.predicates, PhotoAlbumColumns::TABLE);
645     if (rdbPredicate.GetOrder().empty()) {
646         rdbPredicate.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
647     }
648 
649     std::shared_ptr<NativeRdb::ResultSet> resultSet;
650     MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(columns);
651     resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicate, columns);
652 
653     LogQueryParams(dto.predicates, columns);
654 
655     CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, E_HAS_DB_ERROR, "resultSet nullptr");
656     auto bridge = RdbUtils::ToResultSetBridge(resultSet);
657     dto.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
658     return E_OK;
659 }
660 
GetOrderPosition(const GetOrderPositionDto & getOrderPositionDto,GetOrderPositionRespBody & resp)661 int32_t MediaAlbumsService::GetOrderPosition(const GetOrderPositionDto& getOrderPositionDto,
662     GetOrderPositionRespBody& resp)
663 {
664     NativeRdb::RdbPredicates predicates(ANALYSIS_PHOTO_MAP_TABLE);
665     const string mapTable = ANALYSIS_PHOTO_MAP_TABLE;
666     predicates.EqualTo(mapTable + "." + MAP_ALBUM, getOrderPositionDto.albumId)->
667         And()->In(mapTable + "." + MAP_ASSET, getOrderPositionDto.assetIdArray);
668     std::vector<std::string> fetchColumn{MAP_ASSET, ORDER_POSITION};
669 
670     auto resultSet = MediaLibraryRdbStore::QueryWithFilter(predicates, fetchColumn);
671     if (resultSet == nullptr) {
672         MEDIA_ERR_LOG("query resultSet is nullptr");
673         return E_ERR;
674     }
675 
676     int count = 0;
677     int ret = resultSet->GetRowCount(count);
678     if (ret != NativeRdb::E_OK || count <= 0) {
679         MEDIA_ERR_LOG("GetRowCount failed, error code: %{public}d, count: %{public}d", ret, count);
680         return JS_INNER_FAIL;
681     }
682     unordered_map<std::string, int32_t> idOrderMap;
683     while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
684         int32_t mapAsset = get<int32_t>(ResultSetUtils::GetValFromColumn(MAP_ASSET, resultSet, TYPE_INT32));
685         int32_t orderPosition = get<int32_t>(ResultSetUtils::GetValFromColumn(ORDER_POSITION, resultSet, TYPE_INT32));
686         idOrderMap[std::to_string(mapAsset)] = orderPosition;
687     }
688     resp.orderPositionArray.clear();
689     for (const string& assetId : getOrderPositionDto.assetIdArray) {
690         resp.orderPositionArray.push_back(idOrderMap[assetId]);
691     }
692     return E_OK;
693 }
694 
GetFaceId(int32_t albumId,string & groupTag)695 int32_t MediaAlbumsService::GetFaceId(int32_t albumId, string& groupTag)
696 {
697     return this->rdbOperation_.GetFaceId(albumId, groupTag);
698 }
699 
GetPhotoIndex(GetPhotoIndexReqBody & reqBody,QueryResultRespBody & respBody)700 int32_t MediaAlbumsService::GetPhotoIndex(GetPhotoIndexReqBody &reqBody, QueryResultRespBody &respBody)
701 {
702     DataShare::DataSharePredicates &predicates = reqBody.predicates;
703     predicates.And()->EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
704     predicates.And()->EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0));
705     predicates.And()->EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(0));
706     predicates.And()->EqualTo(PhotoColumn::PHOTO_IS_TEMP, to_string(0));
707     predicates.And()->EqualTo(PhotoColumn::PHOTO_BURST_COVER_LEVEL,
708         to_string(static_cast<int32_t>(BurstCoverLevelType::COVER)));
709     const string &photoId = reqBody.photoId;
710     const string &albumId = reqBody.albumId;
711     MEDIA_INFO_LOG("GetPhotoIndex photoId:%{public}s, albumId:%{public}s", photoId.c_str(), albumId.c_str());
712 
713     MediaLibraryCommand cmd(predicates);
714     shared_ptr<NativeRdb::ResultSet> resSet = nullptr;
715     if (reqBody.isAnalysisAlbum) {
716         resSet = MediaLibraryPhotoOperations::HandleAnalysisIndex(cmd, photoId, albumId);
717     } else {
718         NativeRdb::RdbPredicates predicates =
719             RdbDataShareAdapter::RdbUtils::ToPredicates(cmd.GetDataSharePred(), PhotoColumn::PHOTOS_TABLE);
720         resSet = MediaLibraryPhotoOperations::HandleIndexOfUri(cmd, predicates, photoId, albumId);
721     }
722     if (resSet == nullptr) {
723         return E_FAIL;
724     }
725     auto resultSetBridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resSet);
726     respBody.resultSet = make_shared<DataShare::DataShareResultSet>(resultSetBridge);
727     return E_SUCCESS;
728 }
729 
GetAnalysisProcess(GetAnalysisProcessReqBody & reqBody,QueryResultRespBody & respBody)730 int32_t MediaAlbumsService::GetAnalysisProcess(GetAnalysisProcessReqBody &reqBody, QueryResultRespBody &respBody)
731 {
732     std::string tableName;
733     DataShare::DataSharePredicates predicates;
734     std::vector<std::string> columns;
735     if (reqBody.analysisType == static_cast<int32_t>(AnalysisType::ANALYSIS_LABEL)) {
736         tableName = VISION_TOTAL_TABLE;
737         columns = {
738             "COUNT(*) AS totalCount",
739             "SUM(CASE WHEN ((aesthetics_score != 0 AND label != 0 AND ocr != 0 AND face != 0 AND face != 1 "
740                 "AND face != 2 "
741                 "AND saliency != 0 AND segmentation != 0 AND head != 0 AND Photos.media_type = 1) OR "
742                 "(label != 0 AND face != 0 AND Photos.media_type = 2)) THEN 1 ELSE 0 END) AS finishedCount",
743             "SUM(CASE WHEN label != 0 THEN 1 ELSE 0 END) AS LabelCount"
744         };
745         string clause = VISION_TOTAL_TABLE + "." + MediaColumn::MEDIA_ID + " = " + PhotoColumn::PHOTOS_TABLE+ "." +
746             MediaColumn::MEDIA_ID;
747         predicates.InnerJoin(PhotoColumn::PHOTOS_TABLE)->On({ clause });
748         predicates.EqualTo(PhotoColumn::PHOTO_HIDDEN_TIME, 0)->And()
749             ->EqualTo(MediaColumn::MEDIA_DATE_TRASHED, 0)->And()
750             ->EqualTo(MediaColumn::MEDIA_TIME_PENDING, 0);
751     } else if (reqBody.analysisType == static_cast<int32_t>(AnalysisType::ANALYSIS_FACE)) {
752         tableName = USER_PHOTOGRAPHY_INFO_TABLE;
753         std::vector<std::string> columns = {
754             HIGHLIGHT_ANALYSIS_PROGRESS
755         };
756     } else if (reqBody.analysisType == static_cast<int32_t>(AnalysisType::ANALYSIS_HIGHLIGHT)) {
757         tableName = HIGHLIGHT_ALBUM_TABLE;
758         columns = {
759             "SUM(CASE WHEN highlight_status = -3 THEN 1 ELSE 0 END) AS ClearCount",
760             "SUM(CASE WHEN highlight_status = -2 THEN 1 ELSE 0 END) AS DeleteCount",
761             "SUM(CASE WHEN highlight_status = -1 THEN 1 ELSE 0 END) AS NotProduceCount",
762             "SUM(CASE WHEN highlight_status > 0 THEN 1 ELSE 0 END) AS ProduceCount",
763             "SUM(CASE WHEN highlight_status = 1 THEN 1 ELSE 0 END) AS PushCount",
764         };
765     }
766     shared_ptr<NativeRdb::ResultSet> resSet = MediaLibraryRdbStore::QueryWithFilter(
767         RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, tableName), columns);
768     if (resSet == nullptr) {
769         return E_FAIL;
770     }
771     auto resultSetBridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resSet);
772     respBody.resultSet = make_shared<DataShare::DataShareResultSet>(resultSetBridge);
773     return E_SUCCESS;
774 }
775 
GetHighlightAlbumInfo(GetHighlightAlbumReqBody & reqBody,QueryResultRespBody & respBody)776 int32_t MediaAlbumsService::GetHighlightAlbumInfo(GetHighlightAlbumReqBody &reqBody, QueryResultRespBody &respBody)
777 {
778     std::vector<std::string> columns;
779     DataShare::DataSharePredicates predicates;
780 
781     if (HIGHLIGHT_ALBUM_INFO_MAP.find(reqBody.highlightAlbumInfoType) != HIGHLIGHT_ALBUM_INFO_MAP.end()) {
782         columns = HIGHLIGHT_ALBUM_INFO_MAP.at(reqBody.highlightAlbumInfoType).fetchColumn;
783         string tabStr;
784         if (reqBody.highlightAlbumInfoType == COVER_INFO) {
785             tabStr = HIGHLIGHT_COVER_INFO_TABLE;
786         } else {
787             tabStr = HIGHLIGHT_PLAY_INFO_TABLE;
788         }
789         vector<string> onClause = {
790             tabStr + "." + PhotoAlbumColumns::ALBUM_ID + " = " +
791             HIGHLIGHT_ALBUM_TABLE + "." + ID
792         };
793         predicates.InnerJoin(HIGHLIGHT_ALBUM_TABLE)->On(onClause);
794     } else {
795         MEDIA_ERR_LOG("Invalid highlightAlbumInfoType");
796         return E_ERR;
797     }
798     int32_t albumId = reqBody.albumId;
799     int32_t subType = reqBody.subType;
800     if (subType == static_cast<int32_t>(PhotoAlbumSubType::HIGHLIGHT)) {
801         predicates.EqualTo(HIGHLIGHT_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
802     } else if (subType == static_cast<int32_t>(PhotoAlbumSubType::HIGHLIGHT_SUGGESTIONS)) {
803         predicates.EqualTo(HIGHLIGHT_ALBUM_TABLE + "." + AI_ALBUM_ID, to_string(albumId));
804     } else {
805         MEDIA_ERR_LOG("Invalid highlight album subType");
806         return E_ERR;
807     }
808 
809     std::string tableName = "";
810     if (reqBody.highlightAlbumInfoType == static_cast<int32_t>(HighlightAlbumInfoType::COVER_INFO)) {
811         tableName = HIGHLIGHT_COVER_INFO_TABLE;
812     } else if (reqBody.highlightAlbumInfoType == static_cast<int32_t>(HighlightAlbumInfoType::PLAY_INFO)) {
813         tableName = HIGHLIGHT_PLAY_INFO_TABLE;
814     } else {
815         MEDIA_ERR_LOG("highlightAlbumInfoType not valid");
816         return E_ERR;
817     }
818 
819     shared_ptr<NativeRdb::ResultSet> resSet = MediaLibraryRdbStore::QueryWithFilter(
820         RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, tableName), columns);
821     if (resSet == nullptr) {
822         return E_FAIL;
823     }
824     auto resultSetBridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resSet);
825     respBody.resultSet = make_shared<DataShare::DataShareResultSet>(resultSetBridge);
826     return E_SUCCESS;
827 }
828 
UpdatePhotoAlbumOrder(const SetPhotoAlbumOrderDto & setPhotoAlbumOrderDto)829 int32_t MediaAlbumsService::UpdatePhotoAlbumOrder(const SetPhotoAlbumOrderDto &setPhotoAlbumOrderDto)
830 {
831     CHECK_AND_RETURN_RET_LOG(setPhotoAlbumOrderDto.CheckArray(), E_INNER_FAIL,
832         "SetPhotoAlbumOrderDto can not be used to update album order");
833 
834     vector<NativeRdb::ValuesBucket> valuesBuckets;
835     vector<NativeRdb::RdbPredicates> predicatesArray;
836     for (size_t i = 0; i < setPhotoAlbumOrderDto.albumIds.size(); i++) {
837         NativeRdb::RdbPredicates predicates(PhotoAlbumColumns::TABLE);
838         predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, setPhotoAlbumOrderDto.albumIds[i]);
839         predicatesArray.push_back(predicates);
840 
841         NativeRdb::ValuesBucket valuesBucket;
842         valuesBucket.Put(setPhotoAlbumOrderDto.albumOrderColumn, setPhotoAlbumOrderDto.albumOrders[i]);
843         valuesBucket.Put(setPhotoAlbumOrderDto.orderSectionColumn, setPhotoAlbumOrderDto.orderSection[i]);
844         valuesBucket.Put(setPhotoAlbumOrderDto.orderTypeColumn, setPhotoAlbumOrderDto.orderType[i]);
845         valuesBucket.Put(setPhotoAlbumOrderDto.orderStatusColumn, setPhotoAlbumOrderDto.orderStatus[i]);
846         valuesBuckets.push_back(valuesBucket);
847     }
848 
849     int32_t changedRows = MediaLibraryAlbumOperations::UpdatePhotoAlbumOrder(valuesBuckets, predicatesArray);
850     return changedRows;
851 }
852 
MoveAssets(ChangeRequestMoveAssetsDto & moveAssetsDto)853 int32_t MediaAlbumsService::MoveAssets(ChangeRequestMoveAssetsDto &moveAssetsDto)
854 {
855     DataShare::DataSharePredicates predicates;
856     predicates.EqualTo(PhotoColumn::PHOTO_OWNER_ALBUM_ID, to_string(moveAssetsDto.albumId));
857     predicates.And();
858     predicates.In(PhotoColumn::MEDIA_ID, moveAssetsDto.assets);
859     NativeRdb::RdbPredicates rdbPredicate = RdbDataShareAdapter::RdbUtils::ToPredicates(predicates,
860         PhotoColumn::PHOTOS_TABLE);
861 
862     NativeRdb::ValuesBucket value;
863     value.Put(PhotoColumn::PHOTO_OWNER_ALBUM_ID, moveAssetsDto.targetAlbumId);
864 
865     MediaLibraryCommand cmd(OperationObject::PAH_PHOTO, OperationType::UPDATE, MediaLibraryApi::API_10);
866     cmd.SetValueBucket(value);
867     cmd.SetDataSharePred(predicates);
868     cmd.GetAbsRdbPredicates()->SetWhereClause(rdbPredicate.GetWhereClause());
869     cmd.GetAbsRdbPredicates()->SetWhereArgs(rdbPredicate.GetWhereArgs());
870     int32_t ret = MediaLibraryPhotoOperations::BatchSetOwnerAlbumId(cmd);
871 
872     auto resultSet = this->rdbOperation_.MoveAssetsGetAlbumInfo(moveAssetsDto);
873     CHECK_AND_RETURN_RET(resultSet != nullptr, E_ERR);
874     while (resultSet->GoToNextRow() == E_OK) {
875         int32_t albumId = GetInt32Val(PhotoAlbumColumns::ALBUM_ID, resultSet);
876         int32_t albumImageCount = GetInt32Val(PhotoAlbumColumns::ALBUM_IMAGE_COUNT, resultSet);
877         int32_t albumVideoCount = GetInt32Val(PhotoAlbumColumns::ALBUM_VIDEO_COUNT, resultSet);
878         int32_t albumCount = GetInt32Val(PhotoAlbumColumns::ALBUM_COUNT, resultSet);
879         if (albumId == moveAssetsDto.albumId) {
880             moveAssetsDto.albumImageCount = albumImageCount;
881             moveAssetsDto.albumVideoCount = albumVideoCount;
882             moveAssetsDto.albumCount = albumCount;
883             continue;
884         }
885         moveAssetsDto.targetAlbumImageCount = albumImageCount;
886         moveAssetsDto.targetAlbumVideoCount = albumVideoCount;
887         moveAssetsDto.targetAlbumCount = albumCount;
888     }
889     resultSet->Close();
890     return ret;
891 }
892 
AddAssets(ChangeRequestAddAssetsDto & addAssetsDto,ChangeRequestAddAssetsRespBody & respBody)893 int32_t MediaAlbumsService::AddAssets(ChangeRequestAddAssetsDto &addAssetsDto, ChangeRequestAddAssetsRespBody &respBody)
894 {
895     std::vector<DataShare::DataShareValuesBucket> valuesBuckets;
896     if (addAssetsDto.isHighlight) {
897         for (auto asset : addAssetsDto.assets) {
898             DataShare::DataShareValuesBucket pair;
899             pair.Put(MAP_ALBUM, addAssetsDto.albumId);
900             pair.Put(MAP_ASSET, asset);
901             valuesBuckets.push_back(pair);
902         }
903         return PhotoMapOperations::AddHighlightPhotoAssets(valuesBuckets);
904     }
905 
906     for (auto asset : addAssetsDto.assets) {
907         DataShare::DataShareValuesBucket pair;
908         pair.Put(PhotoColumn::PHOTO_OWNER_ALBUM_ID, addAssetsDto.albumId);
909         pair.Put(PhotoColumn::MEDIA_ID, asset);
910         valuesBuckets.push_back(pair);
911     }
912     int32_t ret = PhotoMapOperations::AddPhotoAssets(valuesBuckets);
913 
914     auto resultSet = this->rdbOperation_.AddAssetsGetAlbumInfo(addAssetsDto);
915     CHECK_AND_RETURN_RET(resultSet != nullptr, E_ERR);
916     if (resultSet->GoToFirstRow() == E_OK) {
917         if (!addAssetsDto.isHiddenOnly) {
918             respBody.imageCount = GetInt32Val(PhotoAlbumColumns::ALBUM_IMAGE_COUNT, resultSet);
919             respBody.videoCount = GetInt32Val(PhotoAlbumColumns::ALBUM_VIDEO_COUNT, resultSet);
920         }
921         respBody.albumCount = GetInt32Val(PhotoAlbumColumns::ALBUM_COUNT, resultSet);
922     }
923     resultSet->Close();
924     return ret;
925 }
926 
RemoveAssets(ChangeRequestRemoveAssetsDto & removeAssetsDto,ChangeRequestRemoveAssetsRespBody & respBody)927 int32_t MediaAlbumsService::RemoveAssets(
928     ChangeRequestRemoveAssetsDto &removeAssetsDto, ChangeRequestRemoveAssetsRespBody &respBody)
929 {
930     DataShare::DataSharePredicates predicates;
931     predicates.EqualTo(PhotoColumn::PHOTO_OWNER_ALBUM_ID, to_string(removeAssetsDto.albumId));
932     predicates.In(PhotoColumn::MEDIA_ID, removeAssetsDto.assets);
933     NativeRdb::RdbPredicates rdbPredicate = RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, PhotoMap::TABLE);
934     int32_t ret = PhotoMapOperations::RemovePhotoAssets(rdbPredicate);
935 
936     auto resultSet = this->rdbOperation_.RemoveAssetsGetAlbumInfo(removeAssetsDto);
937     CHECK_AND_RETURN_RET(resultSet != nullptr, E_ERR);
938     if (resultSet->GoToFirstRow() == E_OK) {
939         if (!removeAssetsDto.isHiddenOnly) {
940             respBody.imageCount = GetInt32Val(PhotoAlbumColumns::ALBUM_IMAGE_COUNT, resultSet);
941             respBody.videoCount = GetInt32Val(PhotoAlbumColumns::ALBUM_VIDEO_COUNT, resultSet);
942         }
943         respBody.albumCount = GetInt32Val(PhotoAlbumColumns::ALBUM_COUNT, resultSet);
944     }
945     resultSet->Close();
946     return ret;
947 }
948 
RecoverAssets(ChangeRequestRecoverAssetsDto & recoverAssetsDto)949 int32_t MediaAlbumsService::RecoverAssets(ChangeRequestRecoverAssetsDto &recoverAssetsDto)
950 {
951     DataShare::DataSharePredicates predicates;
952     predicates.In(PhotoColumn::MEDIA_ID, recoverAssetsDto.assets);
953     return MediaLibraryAlbumOperations::RecoverPhotoAssets(predicates);
954 }
955 
DeleteAssets(ChangeRequestDeleteAssetsDto & deleteAssetsDto)956 int32_t MediaAlbumsService::DeleteAssets(ChangeRequestDeleteAssetsDto &deleteAssetsDto)
957 {
958     DataShare::DataSharePredicates predicates;
959     predicates.In(PhotoColumn::MEDIA_ID, deleteAssetsDto.assets);
960     predicates.GreaterThan(PhotoColumn::MEDIA_DATE_TRASHED, 0);
961     return MediaLibraryAlbumOperations::DeletePhotoAssets(predicates, false, false);
962 }
963 
DismissAssets(ChangeRequestDismissAssetsDto & dismissAssetsDto)964 int32_t MediaAlbumsService::DismissAssets(ChangeRequestDismissAssetsDto &dismissAssetsDto)
965 {
966     DataShare::DataSharePredicates predicates;
967     predicates.EqualTo(MAP_ALBUM, to_string(dismissAssetsDto.albumId));
968     predicates.In(MAP_ASSET, dismissAssetsDto.assets);
969     predicates.EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, to_string(dismissAssetsDto.photoAlbumSubType));
970     NativeRdb::RdbPredicates rdbPredicate =
971         RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, ANALYSIS_PHOTO_MAP_TABLE);
972     int32_t ret = PhotoMapOperations::DismissAssets(rdbPredicate);
973     if (ret < 0) {
974         MEDIA_ERR_LOG("DismissAssets Error, ret: %{public}d", ret);
975         return ret;
976     }
977     if (dismissAssetsDto.photoAlbumSubType == PhotoAlbumSubType::PORTRAIT) {
978         DataShare::DataShareValuesBucket updateValues;
979         const int32_t PORTRAIT_REMOVED = -3;
980         const std::string TAG_ID = "tag_id";
981         updateValues.Put(TAG_ID, std::to_string(PORTRAIT_REMOVED));
982         NativeRdb::ValuesBucket value = RdbDataShareAdapter::RdbUtils::ToValuesBucket(updateValues);
983         DataShare::DataSharePredicates updatePredicates;
984         std::string selection = std::to_string(dismissAssetsDto.albumId);
985         for (size_t i = 0; i < dismissAssetsDto.assets.size(); ++i) {
986             selection += "," + dismissAssetsDto.assets[i];
987         }
988         updatePredicates.SetWhereClause(selection);
989         NativeRdb::RdbPredicates rdbPredicateUpdate =
990             RdbDataShareAdapter::RdbUtils::ToPredicates(updatePredicates, VISION_IMAGE_FACE_TABLE);
991 
992         MediaLibraryCommand cmd(OperationObject::VISION_IMAGE_FACE, OperationType::UPDATE, MediaLibraryApi::API_10);
993         cmd.SetValueBucket(value);
994         cmd.SetDataSharePred(updatePredicates);
995         cmd.GetAbsRdbPredicates()->SetWhereClause(rdbPredicateUpdate.GetWhereClause());
996         cmd.GetAbsRdbPredicates()->SetWhereArgs(rdbPredicateUpdate.GetWhereArgs());
997         cmd.SetApiParam(MEDIA_OPERN_KEYWORD, UPDATE_DISMISS_ASSET);
998         auto dataManager = MediaLibraryDataManager::GetInstance();
999         dataManager->HandleAnalysisFaceUpdate(cmd, value, updatePredicates);
1000     }
1001     return ret;
1002 }
1003 
MergeAlbum(ChangeRequestMergeAlbumDto & mergeAlbumDto)1004 int32_t MediaAlbumsService::MergeAlbum(ChangeRequestMergeAlbumDto &mergeAlbumDto)
1005 {
1006     DataShare::DataShareValuesBucket valuesBucket;
1007     valuesBucket.Put(PhotoAlbumColumns::ALBUM_ID, mergeAlbumDto.albumId);
1008     valuesBucket.Put(TARGET_ALBUM_ID, mergeAlbumDto.targetAlbumId);
1009     NativeRdb::ValuesBucket value = RdbDataShareAdapter::RdbUtils::ToValuesBucket(valuesBucket);
1010     if (value.IsEmpty()) {
1011         MEDIA_ERR_LOG("MergeAlbum:Input parameter is invalid ");
1012         return E_INVALID_VALUES;
1013     }
1014     return MediaLibraryAlbumOperations::MergePortraitAlbums(value);
1015 }
1016 
PlaceBefore(ChangeRequestPlaceBeforeDto & placeBeforeDto)1017 int32_t MediaAlbumsService::PlaceBefore(ChangeRequestPlaceBeforeDto &placeBeforeDto)
1018 {
1019     DataShare::DataShareValuesBucket valuesBucket;
1020     valuesBucket.Put(PhotoAlbumColumns::ALBUM_ID, placeBeforeDto.albumId);
1021     valuesBucket.Put(PhotoAlbumColumns::REFERENCE_ALBUM_ID, placeBeforeDto.referenceAlbumId);
1022     valuesBucket.Put(PhotoAlbumColumns::ALBUM_TYPE, placeBeforeDto.albumType);
1023     valuesBucket.Put(PhotoAlbumColumns::ALBUM_SUBTYPE, placeBeforeDto.albumSubType);
1024     NativeRdb::ValuesBucket value = RdbDataShareAdapter::RdbUtils::ToValuesBucket(valuesBucket);
1025     if (value.IsEmpty()) {
1026         MEDIA_ERR_LOG("PlaceBefore:Input parameter is invalid ");
1027         return E_INVALID_VALUES;
1028     }
1029 
1030     return MediaLibraryAlbumOperations::OrderSingleAlbum(value);
1031 }
1032 
SetOrderPosition(ChangeRequestSetOrderPositionDto & setOrderPositionDto)1033 int32_t MediaAlbumsService::SetOrderPosition(ChangeRequestSetOrderPositionDto &setOrderPositionDto)
1034 {
1035     MediaLibraryCommand cmd(OperationObject::ANALYSIS_PHOTO_MAP, OperationType::UPDATE_ORDER, MediaLibraryApi::API_10);
1036     DataShare::DataShareValuesBucket valuesBucket;
1037     valuesBucket.Put(ORDER_POSITION, setOrderPositionDto.orderString);
1038     NativeRdb::ValuesBucket value = RdbDataShareAdapter::RdbUtils::ToValuesBucket(valuesBucket);
1039     if (value.IsEmpty()) {
1040         MEDIA_ERR_LOG("SetOrderPosition:Input parameter is invalid ");
1041         return E_INVALID_VALUES;
1042     }
1043 
1044     const string mapTable = ANALYSIS_PHOTO_MAP_TABLE;
1045     DataShare::DataSharePredicates predicates;
1046     predicates.EqualTo(mapTable + "." + MAP_ALBUM, setOrderPositionDto.albumId)
1047         ->And()
1048         ->In(mapTable + "." + MAP_ASSET, setOrderPositionDto.assetIds);
1049     NativeRdb::RdbPredicates rdbPredicate =
1050         RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, ANALYSIS_PHOTO_MAP_TABLE);
1051     cmd.SetValueBucket(value);
1052     cmd.SetDataSharePred(predicates);
1053     cmd.GetAbsRdbPredicates()->SetWhereClause(rdbPredicate.GetWhereClause());
1054     cmd.GetAbsRdbPredicates()->SetWhereArgs(rdbPredicate.GetWhereArgs());
1055     return MediaLibraryAnalysisAlbumOperations::SetAnalysisAlbumOrderPosition(cmd);
1056 }
1057 
GetAlbumsByIds(GetAlbumsByIdsDto & getAlbumsByIdsDto,GetAlbumsByIdsRespBody & respBody)1058 int32_t MediaAlbumsService::GetAlbumsByIds(GetAlbumsByIdsDto &getAlbumsByIdsDto, GetAlbumsByIdsRespBody &respBody)
1059 {
1060     std::vector<std::string> columns = getAlbumsByIdsDto.columns;
1061     MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(columns);
1062 
1063     NativeRdb::RdbPredicates rdbPredicates =
1064         RdbDataShareAdapter::RdbUtils::ToPredicates(getAlbumsByIdsDto.predicates, PhotoAlbumColumns::TABLE);
1065     if (rdbPredicates.GetOrder().empty()) {
1066         rdbPredicates.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
1067     }
1068 
1069     auto resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicates, columns);
1070     if (resultSet != nullptr) {
1071         auto bridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resultSet);
1072         respBody.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
1073     }
1074 
1075     return E_OK;
1076 }
1077 
GetPhotoAlbumObject(GetPhotoAlbumObjectDto & getPhotoAlbumObjectDto,GetPhotoAlbumObjectRespBody & respBody)1078 int32_t MediaAlbumsService::GetPhotoAlbumObject(
1079     GetPhotoAlbumObjectDto &getPhotoAlbumObjectDto, GetPhotoAlbumObjectRespBody &respBody)
1080 {
1081     std::vector<std::string> columns = getPhotoAlbumObjectDto.columns;
1082     NativeRdb::RdbPredicates rdbPredicates =
1083         RdbDataShareAdapter::RdbUtils::ToPredicates(getPhotoAlbumObjectDto.predicates, PhotoAlbumColumns::TABLE);
1084 
1085     auto resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicates, columns);
1086     if (resultSet != nullptr) {
1087         auto bridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resultSet);
1088         respBody.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
1089     }
1090     return E_OK;
1091 }
1092 
QueryAlbumsLpath(QueryAlbumsDto & dto)1093 int32_t MediaAlbumsService::QueryAlbumsLpath(QueryAlbumsDto &dto)
1094 {
1095     MEDIA_DEBUG_LOG("MediaAlbumsService::QueryAlbumsLpath Start");
1096     std::shared_ptr<NativeRdb::ResultSet> resultSet;
1097     std::vector<std::string> &columns = dto.columns;
1098     MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(columns);
1099     NativeRdb::RdbPredicates rdbPredicates = RdbUtils::ToPredicates(dto.predicates, PhotoAlbumColumns::TABLE);
1100     if (rdbPredicates.GetOrder().empty()) {
1101         rdbPredicates.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
1102     }
1103     resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicates, columns);
1104 
1105     LogQueryParams(dto.predicates, columns);
1106 
1107     CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, E_HAS_DB_ERROR, "resultSet nullptr");
1108     auto bridge = RdbUtils::ToResultSetBridge(resultSet);
1109     dto.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
1110     MEDIA_DEBUG_LOG("MediaAlbumsService::QueryAlbumsLpath End");
1111     return E_OK;
1112 }
1113 
QueryAlbumsLpaths(QueryAlbumsDto & dto)1114 int32_t MediaAlbumsService::QueryAlbumsLpaths(QueryAlbumsDto &dto)
1115 {
1116     MEDIA_DEBUG_LOG("MediaAlbumsService::QueryAlbumsLpaths Start");
1117     std::shared_ptr<NativeRdb::ResultSet> resultSet;
1118     std::vector<std::string> &columns = dto.columns;
1119     MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(columns);
1120     if (dto.albumType == PhotoAlbumType::USER || dto.albumType == PhotoAlbumType::SOURCE) {
1121         dto.predicates.And()
1122             ->EqualTo(PhotoAlbumColumns::ALBUM_TYPE, std::to_string(dto.albumType))
1123             ->And()
1124             ->EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, std::to_string(dto.albumSubType));
1125         NativeRdb::RdbPredicates rdbPredicates = RdbUtils::ToPredicates(dto.predicates, PhotoAlbumColumns::TABLE);
1126         if (rdbPredicates.GetOrder().empty()) {
1127             rdbPredicates.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
1128         }
1129         resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicates, columns);
1130     }
1131 
1132     LogQueryParams(dto.predicates, columns);
1133 
1134     CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, E_HAS_DB_ERROR, "resultSet nullptr");
1135     auto bridge = RdbUtils::ToResultSetBridge(resultSet);
1136     dto.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
1137     MEDIA_DEBUG_LOG("MediaAlbumsService::QueryAlbumsLpaths End");
1138     return E_OK;
1139 }
1140 } // namespace OHOS::Media