1 /*
2  * Copyright (C) 2024 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 #ifndef OHOS_MEDIA_BACKUP_GALLERY_MEDIA_COUNT_STATISTIC_H
16 #define OHOS_MEDIA_BACKUP_GALLERY_MEDIA_COUNT_STATISTIC_H
17 
18 #include <string>
19 #include <vector>
20 
21 #include "rdb_store.h"
22 #include "result_set_utils.h"
23 #include "media_backup_report_data_type.h"
24 
25 namespace OHOS::Media {
26 class GalleryMediaCountStatistic {
27 public:
SetGalleryRdb(std::shared_ptr<NativeRdb::RdbStore> galleryRdb)28     GalleryMediaCountStatistic &SetGalleryRdb(std::shared_ptr<NativeRdb::RdbStore> galleryRdb)
29     {
30         this->galleryRdb_ = galleryRdb;
31         return *this;
32     }
SetSceneCode(int32_t sceneCode)33     GalleryMediaCountStatistic &SetSceneCode(int32_t sceneCode)
34     {
35         this->sceneCode_ = sceneCode;
36         return *this;
37     }
SetShouldIncludeSd(bool shouldIncludeSd)38     GalleryMediaCountStatistic &SetShouldIncludeSd(bool shouldIncludeSd)
39     {
40         this->shouldIncludeSd_ = shouldIncludeSd;
41         return *this;
42     }
SetTaskId(const std::string & taskId)43     GalleryMediaCountStatistic &SetTaskId(const std::string &taskId)
44     {
45         this->taskId_ = taskId;
46         return *this;
47     }
48     std::vector<AlbumMediaStatisticInfo> Load();
49 
50 private:
51     int32_t GetCount(const std::string &query);
52     int32_t QueryGalleryAllCount(SearchCondition searchCondition);
53     int32_t QueryAlbumGalleryCount(SearchCondition searchCondition);
54     int32_t GetGalleryMediaAllRestoreCount(SearchCondition searchCondition);
55     int32_t QueryGalleryCloneCount();
56     int32_t QueryGallerySdCardCount(SearchCondition searchCondition);
57     bool HasLowQualityImage();
58     int32_t QueryGalleryAppTwinDataCount();
59     int32_t QueryAlbumAllVideoCount(SearchCondition searchCondition);
60     std::vector<AlbumStatisticInfo> QueryAlbumCountByName(
61         const std::string &albumName, SearchCondition searchCondition);
62     std::vector<AlbumStatisticInfo> QueryAlbumCountByLPath(const std::string &lPath, SearchCondition searchCondition);
63     int32_t QueryLiveCount(int32_t searchType, int32_t mediaType);
64     int32_t QueryTempCount(int32_t searchType, int32_t mediaType);
65     AlbumMediaStatisticInfo GetAllStatInfo();
66     AlbumMediaStatisticInfo GetAllImageStatInfo();
67     AlbumMediaStatisticInfo GetAllVideoStatInfo();
68     AlbumMediaStatisticInfo GetAllRestoreStatInfo();
69     AlbumMediaStatisticInfo GetAllRestoreImageStatInfo();
70     AlbumMediaStatisticInfo GetAllRestoreVideoStatInfo();
71     AlbumMediaStatisticInfo GetSdCardStatInfo();
72     AlbumMediaStatisticInfo GetDuplicateStatInfo();
73     AlbumMediaStatisticInfo GetAppTwinStatInfo();
74     AlbumMediaStatisticInfo GetImageAlbumInfo();
75     AlbumMediaStatisticInfo GetFavoriteAlbumStatInfo();
76     AlbumMediaStatisticInfo GetTrashedAlbumStatInfo();
77     std::vector<AlbumMediaStatisticInfo> GetAlbumInfoByName(const std::string &albumName);
78     std::vector<AlbumMediaStatisticInfo> GetAlbumInfoByLPath(const std::string &lPath);
79     AlbumMediaStatisticInfo GetGalleryAlbumCountInfo();
80     AlbumMediaStatisticInfo GetVideoAlbumInfo();
81     AlbumMediaStatisticInfo GetLiveStatInfo();
82     AlbumMediaStatisticInfo GetTempInfo();
83     AlbumMediaStatisticInfo GetNotSyncInfo();
84 
85 private:
86     std::shared_ptr<NativeRdb::RdbStore> galleryRdb_;
87     int32_t sceneCode_;
88     bool shouldIncludeSd_{false};
89     std::string taskId_;
90 
91 private:
92     const std::string SQL_QUERY_ALL_GALLERY_COUNT = "\
93         SELECT COUNT(1) AS count \
94         FROM gallery_media \
95         WHERE (0 = ? OR media_type = ?) AND \
96             (-1 = ? OR 0 = ? AND COALESCE(local_media_id, 0) <> -4 OR 1 = ? AND COALESCE(local_media_id, 0) = -4) AND \
97             (-1 = ? OR 0 = ? AND COALESCE(recycleFlag, 0) = 0 OR 1 = ? AND COALESCE(recycleFlag, 0) <> 0) AND \
98             (-1 = ? OR 0 = ? AND local_media_id <> -1 OR 1 = ? AND local_media_id = -1) AND \
99             (-1 = ? OR 0 = ? AND COALESCE(is_hw_favorite, 0) <> 1 OR 1 = ? AND COALESCE(is_hw_favorite, 0) = 1) AND \
100             (-1 = ? OR 0 = ? AND is_hw_burst IN (1, 2) OR 1 = ? AND is_hw_burst = 1) \
101         ;";
102     const std::string SQL_GALLERY_MEDIA_QUERY_COUNT = "\
103         SELECT COUNT(1) AS count \
104         FROM gallery_media \
105             LEFT JOIN gallery_album \
106             ON gallery_media.albumId=gallery_album.albumId \
107             LEFT JOIN gallery_album AS album_v2 \
108             ON gallery_media.relative_bucket_id = album_v2.relativeBucketId \
109         WHERE (local_media_id != -1) AND \
110             (relative_bucket_id IS NULL OR \
111                 relative_bucket_id NOT IN ( \
112                     SELECT DISTINCT relative_bucket_id \
113                     FROM garbage_album \
114                     WHERE type = 1 \
115                 ) \
116             ) AND \
117             (_size > 0 OR (1 = ? AND _size = 0 AND photo_quality = 0)) AND \
118             _data NOT LIKE '/storage/emulated/0/Pictures/cloud/Imports%' AND \
119             COALESCE(_data, '') <> '' AND \
120             (1 = ? OR storage_id IN (0, 65537) ) AND \
121             (0 = ? OR media_type = ?) AND \
122             (-1 = ? OR 0 = ? AND COALESCE(local_media_id, 0) <> -4 OR 1 = ? AND COALESCE(local_media_id, 0) = -4) AND \
123             (-1 = ? OR 0 = ? AND COALESCE(recycleFlag, 0) = 0 OR 1 = ? AND COALESCE(recycleFlag, 0) <> 0) AND \
124             (-1 = ? OR 0 = ? AND local_media_id <> -1 OR 1 = ? AND local_media_id = -1) AND \
125             (-1 = ? OR 0 = ? AND COALESCE(is_hw_favorite, 0) <> 1 OR 1 = ? AND COALESCE(is_hw_favorite, 0) = 1) AND \
126             (-1 = ? OR 0 = ? AND is_hw_burst IN (1, 2) OR 1 = ? AND is_hw_burst = 1) \
127         ;";
128     const std::string SQL_QUERY_GALLERY_SD_CARD_COUNT = "\
129         SELECT COUNT(1) AS count \
130         FROM gallery_media \
131         WHERE storage_id NOT IN (0, 65537) AND \
132             _size > 0 AND \
133             (0 = ? OR media_type = ?) AND \
134             (-1 = ? OR 0 = ? AND COALESCE(local_media_id, 0) <> -4 OR 1 = ? AND COALESCE(local_media_id, 0) = -4) AND \
135             (-1 = ? OR 0 = ? AND COALESCE(recycleFlag, 0) = 0 OR 1 = ? AND COALESCE(recycleFlag, 0) <> 0) AND \
136             (-1 = ? OR 0 = ? AND local_media_id <> -1 OR 1 = ? AND local_media_id = -1) AND \
137             (-1 = ? OR 0 = ? AND COALESCE(is_hw_favorite, 0) <> 1 OR 1 = ? AND COALESCE(is_hw_favorite, 0) = 1) AND \
138             (-1 = ? OR 0 = ? AND is_hw_burst IN (1, 2) OR 1 = ? AND is_hw_burst = 1) \
139         ;";
140     const std::string SQL_QUERY_GALLERY_MEDIA_ALL_VIDEO_COUNT = "\
141         SELECT COUNT(1) AS count \
142         FROM gallery_media \
143             INNER JOIN gallery_album \
144             ON gallery_media.albumId = gallery_album.albumId OR \
145                 gallery_media.relative_bucket_id = gallery_album.relativeBucketId \
146         WHERE LOWER(gallery_album.lPath) <> LOWER('/Pictures/Screenshots') AND \
147             (COALESCE(is_hw_burst, 1) <> 2) AND \
148             (0 = ? OR media_type = ?) AND \
149             (-1 = ? OR 0 = ? AND COALESCE(local_media_id, 0) <> -4 OR 1 = ? AND COALESCE(local_media_id, 0) = -4) AND \
150             (-1 = ? OR 0 = ? AND COALESCE(recycleFlag, 0) = 0 OR 1 = ? AND COALESCE(recycleFlag, 0) <> 0) AND \
151             (-1 = ? OR 0 = ? AND local_media_id <> -1 OR 1 = ? AND local_media_id = -1) AND \
152             (-1 = ? OR 0 = ? AND COALESCE(is_hw_favorite, 0) <> 1 OR 1 = ? AND COALESCE(is_hw_favorite, 0) = 1) AND \
153             (-1 = ? OR 0 = ? AND is_hw_burst IN (1, 2) OR 1 = ? AND is_hw_burst = 1) \
154         ;";
155     const std::string SQL_QUERY_ALBUM_GALLERY_COUNT = "\
156         SELECT COUNT(1) AS count \
157         FROM gallery_media \
158         WHERE (COALESCE(is_hw_burst, 1) <> 2) AND \
159             (0 = ? OR media_type = ?) AND \
160             (-1 = ? OR 0 = ? AND COALESCE(local_media_id, 0) <> -4 OR 1 = ? AND COALESCE(local_media_id, 0) = -4) AND \
161             (-1 = ? OR 0 = ? AND COALESCE(recycleFlag, 0) = 0 OR 1 = ? AND COALESCE(recycleFlag, 0) <> 0) AND \
162             (-1 = ? OR 0 = ? AND local_media_id <> -1 OR 1 = ? AND local_media_id = -1) AND \
163             (-1 = ? OR 0 = ? AND COALESCE(is_hw_favorite, 0) <> 1 OR 1 = ? AND COALESCE(is_hw_favorite, 0) = 1) AND \
164             (-1 = ? OR 0 = ? AND is_hw_burst IN (1, 2) OR 1 = ? AND is_hw_burst = 1) \
165         ;";
166     const std::string SQL_QUERY_ALBUM_COUNT_BY_NAME = "\
167         SELECT album_plugin.lpath AS lPath, \
168             album_plugin.album_name AS albumName, \
169             COUNT(1) AS count \
170         FROM gallery_media \
171             INNER JOIN gallery_album \
172             ON gallery_media.albumId = gallery_album.albumId OR \
173                 gallery_media.relative_bucket_id = gallery_album.relativeBucketId \
174             INNER JOIN album_plugin \
175             ON LOWER(gallery_album.lPath) = LOWER(album_plugin.lpath) \
176         WHERE album_plugin.album_name = ? AND \
177             (COALESCE(is_hw_burst, 1) <> 2) AND \
178             (0 = ? OR media_type = ?) AND \
179             (-1 = ? OR 0 = ? AND COALESCE(local_media_id, 0) <> -4 OR 1 = ? AND COALESCE(local_media_id, 0) = -4) AND \
180             (-1 = ? OR 0 = ? AND COALESCE(recycleFlag, 0) = 0 OR 1 = ? AND COALESCE(recycleFlag, 0) <> 0) AND \
181             (-1 = ? OR 0 = ? AND local_media_id <> -1 OR 1 = ? AND local_media_id = -1) AND \
182             (-1 = ? OR 0 = ? AND COALESCE(is_hw_favorite, 0) <> 1 OR 1 = ? AND COALESCE(is_hw_favorite, 0) = 1) AND \
183             (-1 = ? OR 0 = ? AND is_hw_burst IN (1, 2) OR 1 = ? AND is_hw_burst = 1) \
184         GROUP BY album_plugin.lpath, album_plugin.album_name ;";
185     const std::string SQL_QUERY_ALBUM_COUNT_BY_LPATH = "\
186         SELECT gallery_album.lPath, \
187             CASE WHEN COALESCE(album_plugin.album_name, '') <> '' THEN album_plugin.album_name \
188                 ELSE gallery_album.albumName \
189             END AS albumName, \
190             COUNT(1) AS count \
191         FROM gallery_media \
192             INNER JOIN gallery_album \
193             ON gallery_media.albumId = gallery_album.albumId OR \
194                 gallery_media.relative_bucket_id = gallery_album.relativeBucketId \
195             LEFT JOIN album_plugin \
196             ON LOWER(gallery_album.lPath) = LOWER(album_plugin.lpath) \
197         WHERE LOWER(gallery_album.lPath) = LOWER(?) AND \
198             (COALESCE(is_hw_burst, 1) <> 2) AND \
199             (0 = ? OR media_type = ?) AND \
200             (-1 = ? OR 0 = ? AND COALESCE(local_media_id, 0) <> -4 OR 1 = ? AND COALESCE(local_media_id, 0) = -4) AND \
201             (-1 = ? OR 0 = ? AND COALESCE(recycleFlag, 0) = 0 OR 1 = ? AND COALESCE(recycleFlag, 0) <> 0) AND \
202             (-1 = ? OR 0 = ? AND local_media_id <> -1 OR 1 = ? AND local_media_id = -1) AND \
203             (-1 = ? OR 0 = ? AND COALESCE(is_hw_favorite, 0) <> 1 OR 1 = ? AND COALESCE(is_hw_favorite, 0) = 1) AND \
204             (-1 = ? OR 0 = ? AND is_hw_burst IN (1, 2) OR 1 = ? AND is_hw_burst = 1) \
205         GROUP BY gallery_album.lPath, gallery_album.albumName ;";
206     const std::string SQL_QUERY_GALLERY_ALBUM_COUNT = "\
207         SELECT COUNT(1) AS count \
208         FROM gallery_album \
209         WHERE albumId IN \
210             ( \
211                 SELECT DISTINCT albumId \
212                 FROM gallery_media \
213             ) OR \
214             relativeBucketId IN \
215             ( \
216                 SELECT DISTINCT relative_bucket_id \
217                 FROM gallery_media \
218             ) \
219         ;";
220     const std::string SQL_QUERY_LIVE_COUNT = "\
221         SELECT COUNT(1) AS count \
222         FROM gallery_media \
223         WHERE special_file_type IN (50, 1050) AND \
224             local_media_id <> -4 AND \
225             COALESCE(recycleFlag, 0) = 0 AND \
226             (0 = ? OR local_media_id = -1) AND \
227             (0 = ? OR media_type = ?);";
228     const std::string SQL_QUERY_TEMP_COUNT = "\
229         SELECT COUNT(1) AS count \
230         FROM gallery_media \
231         WHERE relative_bucket_id IN \
232             ( \
233                 SELECT DISTINCT relative_bucket_id \
234                 FROM garbage_album \
235                 WHERE type = 1 \
236             ) AND \
237             (0 = ? OR local_media_id = -1) AND \
238             (0 = ? OR media_type = ?);";
239     const std::string SQL_QUERY_NOT_SYNC_COUNT = "\
240         SELECT COUNT(1) AS count \
241         FROM gallery_media \
242         WHERE local_media_id = -3;";
243 };
244 }  // namespace OHOS::Media
245 #endif  // OHOS_MEDIA_BACKUP_GALLERY_MEDIA_COUNT_STATISTIC_H