@@ -24,13 +24,21 @@ class TagMapper {
2424 */
2525 protected $ db ;
2626
27+ private FolderMapper $ folderMapper ;
28+
29+ private BookmarkMapper $ bookmarkMapper ;
30+
2731 /**
2832 * TagMapper constructor.
2933 *
3034 * @param IDBConnection $db
35+ * @param FolderMapper $folderMapper
36+ * @param BookmarkMapper $bookmarkMapper
3137 */
32- public function __construct (IDBConnection $ db ) {
38+ public function __construct (IDBConnection $ db, FolderMapper $ folderMapper , BookmarkMapper $ bookmarkMapper ) {
3339 $ this ->db = $ db ;
40+ $ this ->folderMapper = $ folderMapper ;
41+ $ this ->bookmarkMapper = $ bookmarkMapper ;
3442 }
3543
3644 /**
@@ -39,23 +47,30 @@ public function __construct(IDBConnection $db) {
3947 * @throws Exception
4048 */
4149 public function findAllWithCount ($ userId ): array {
50+ $ rootFolder = $ this ->folderMapper ->findRootFolder ($ userId );
51+ [$ cte , $ cteParams , $ cteParamTypes ] = $ this ->bookmarkMapper ->generateCTE ($ rootFolder ->getId (), false );
52+
4253 $ qb = $ this ->db ->getQueryBuilder ();
54+ $ qb ->automaticTablePrefix (false );
4355 $ qb
44- ->select ('t.tag AS name ' )
56+ ->selectAlias ('t.tag ' , ' name ' )
4557 ->selectAlias ($ qb ->createFunction ('COUNT(DISTINCT ' . $ qb ->getColumnName ('t.bookmark_id ' ) . ') ' ), 'count ' )
46- ->from ('bookmarks_tags ' , 't ' )
47- ->innerJoin ('t ' , 'bookmarks ' , 'b ' , $ qb ->expr ()->eq ('b.id ' , 't.bookmark_id ' ))
48- ->innerJoin ('b ' , 'bookmarks_tree ' , 'tr ' , 'b.id = tr.id AND tr.type = ' . $ qb ->createPositionalParameter (TreeMapper::TYPE_BOOKMARK ) . ' AND tr.soft_deleted_at IS NULL ' )
49- ->leftJoin ('tr ' , 'bookmarks_shared_folders ' , 'sf ' , $ qb ->expr ()->eq ('tr.parent_folder ' , 'sf.folder_id ' ))
50- ->where ($ qb ->expr ()->eq ('b.user_id ' , $ qb ->createPositionalParameter ($ userId )))
51- ->orWhere ($ qb ->expr ()->andX (
52- $ qb ->expr ()->eq ('sf.user_id ' , $ qb ->createPositionalParameter ($ userId )),
53- $ qb ->expr ()->eq ('tr.type ' , $ qb ->createPositionalParameter (TreeMapper::TYPE_BOOKMARK )))
54- )
58+ ->from ('*PREFIX*bookmarks_tags ' , 't ' )
59+ ->innerJoin ('t ' , 'folder_tree ' , 'tree ' , 'tree.item_id = t.bookmark_id AND tree.type = ' . $ qb ->createPositionalParameter (TreeMapper::TYPE_BOOKMARK ) . ' AND tree.soft_deleted_at IS NULL ' )
5560 ->groupBy ('t.tag ' )
5661 ->orderBy ('count ' , 'DESC ' );
5762
58- return $ qb ->executeQuery ()->fetchAll ();
63+ $ finalQuery = $ cte . ' ' . $ qb ->getSQL ();
64+ $ params = array_merge ($ cteParams , $ qb ->getParameters ());
65+ $ paramTypes = array_merge ($ cteParamTypes , $ qb ->getParameterTypes ());
66+
67+ $ cursor = $ this ->db ->executeQuery ($ finalQuery , $ params , $ paramTypes );
68+ $ rows = [];
69+ while ($ row = $ cursor ->fetch ()) {
70+ $ rows [] = $ row ;
71+ }
72+ $ cursor ->closeCursor ();
73+ return $ rows ;
5974 }
6075
6176 /**
@@ -64,20 +79,28 @@ public function findAllWithCount($userId): array {
6479 * @throws Exception
6580 */
6681 public function findAll ($ userId ): array {
82+ $ rootFolder = $ this ->folderMapper ->findRootFolder ($ userId );
83+ [$ cte , $ cteParams , $ cteParamTypes ] = $ this ->bookmarkMapper ->generateCTE ($ rootFolder ->getId (), false );
84+
6785 $ qb = $ this ->db ->getQueryBuilder ();
86+ $ qb ->automaticTablePrefix (false );
6887 $ qb
6988 ->select ('t.tag ' )
70- ->from ('bookmarks_tags ' , 't ' )
71- ->innerJoin ('t ' , 'bookmarks ' , 'b ' , $ qb ->expr ()->eq ('b.id ' , 't.bookmark_id ' ))
72- ->leftJoin ('b ' , 'bookmarks_tree ' , 'tr ' , 'b.id = tr.id AND tr.type = ' . $ qb ->createPositionalParameter (TreeMapper::TYPE_BOOKMARK ))
73- ->leftJoin ('tr ' , 'bookmarks_shared_folders ' , 'sf ' , $ qb ->expr ()->eq ('tr.parent_folder ' , 'sf.folder_id ' ))
74- ->where ($ qb ->expr ()->eq ('b.user_id ' , $ qb ->createPositionalParameter ($ userId )))
75- ->orWhere ($ qb ->expr ()->andX (
76- $ qb ->expr ()->eq ('sf.user_id ' , $ qb ->createPositionalParameter ($ userId )),
77- $ qb ->expr ()->eq ('tr.type ' , $ qb ->createPositionalParameter (TreeMapper::TYPE_SHARE )))
78- )
89+ ->from ('*PREFIX*bookmarks_tags ' , 't ' )
90+ ->innerJoin ('t ' , 'folder_tree ' , 'tree ' , 'tree.item_id = t.bookmark_id AND tree.type = ' . $ qb ->createPositionalParameter (TreeMapper::TYPE_BOOKMARK ) . ' AND tree.soft_deleted_at IS NULL ' )
7991 ->groupBy ('t.tag ' );
80- return $ qb ->executeQuery ()->fetchAll (PDO ::FETCH_COLUMN );
92+
93+ $ finalQuery = $ cte . ' ' . $ qb ->getSQL ();
94+ $ params = array_merge ($ cteParams , $ qb ->getParameters ());
95+ $ paramTypes = array_merge ($ cteParamTypes , $ qb ->getParameterTypes ());
96+
97+ $ cursor = $ this ->db ->executeQuery ($ finalQuery , $ params , $ paramTypes );
98+ $ tags = [];
99+ while ($ row = $ cursor ->fetch ()) {
100+ $ tags [] = $ row ['tag ' ];
101+ }
102+ $ cursor ->closeCursor ();
103+ return $ tags ;
81104 }
82105
83106 /**
0 commit comments