Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
DatabaseThreadItemSet
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 9
132
0.00% covered (danger)
0.00%
0 / 1
 addThreadItem
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 isEmpty
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 updateIdAndNameMaps
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 getThreadItems
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getCommentItems
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 findCommentsByName
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 findCommentById
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getThreads
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getThreadsStructured
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace MediaWiki\Extension\DiscussionTools;
4
5use MediaWiki\Extension\DiscussionTools\ThreadItem\CommentItem;
6use MediaWiki\Extension\DiscussionTools\ThreadItem\DatabaseCommentItem;
7use MediaWiki\Extension\DiscussionTools\ThreadItem\DatabaseHeadingItem;
8use MediaWiki\Extension\DiscussionTools\ThreadItem\DatabaseThreadItem;
9use MediaWiki\Extension\DiscussionTools\ThreadItem\HeadingItem;
10use MediaWiki\Extension\DiscussionTools\ThreadItem\ThreadItem;
11use Wikimedia\Assert\Assert;
12
13/**
14 * Groups thread items (headings and comments) generated from database.
15 */
16class DatabaseThreadItemSet implements ThreadItemSet {
17
18    /** @var DatabaseThreadItem[] */
19    private array $threadItems = [];
20    /** @var DatabaseCommentItem[] */
21    private array $commentItems = [];
22    /** @var DatabaseThreadItem[][] */
23    private array $threadItemsByName = [];
24    /** @var DatabaseThreadItem[] */
25    private array $threadItemsById = [];
26    /** @var DatabaseHeadingItem[] */
27    private array $threads = [];
28
29    /**
30     * @inheritDoc
31     */
32    public function addThreadItem( ThreadItem $item ) {
33        Assert::precondition( $item instanceof DatabaseThreadItem, 'Must be DatabaseThreadItem' );
34
35        $this->threadItems[] = $item;
36        if ( $item instanceof CommentItem ) {
37            $this->commentItems[] = $item;
38        }
39        if ( $item instanceof HeadingItem ) {
40            $this->threads[] = $item;
41        }
42    }
43
44    /**
45     * @inheritDoc
46     */
47    public function isEmpty(): bool {
48        return !$this->threadItems;
49    }
50
51    /**
52     * @inheritDoc
53     */
54    public function updateIdAndNameMaps( ThreadItem $item ) {
55        Assert::precondition( $item instanceof DatabaseThreadItem, 'Must be DatabaseThreadItem' );
56
57        $this->threadItemsByName[ $item->getName() ][] = $item;
58
59        $this->threadItemsById[ $item->getId() ] = $item;
60    }
61
62    /**
63     * @inheritDoc
64     * @return DatabaseThreadItem[] Thread items
65     */
66    public function getThreadItems(): array {
67        return $this->threadItems;
68    }
69
70    /**
71     * @inheritDoc
72     * @return DatabaseCommentItem[] Comment items
73     */
74    public function getCommentItems(): array {
75        return $this->commentItems;
76    }
77
78    /**
79     * @inheritDoc
80     * @return DatabaseThreadItem[] Thread items, empty array if not found
81     */
82    public function findCommentsByName( string $name ): array {
83        return $this->threadItemsByName[$name] ?? [];
84    }
85
86    /**
87     * @inheritDoc
88     * @return DatabaseThreadItem|null Thread item, null if not found
89     */
90    public function findCommentById( string $id ): ?ThreadItem {
91        return $this->threadItemsById[$id] ?? null;
92    }
93
94    /**
95     * @inheritDoc
96     * @return DatabaseHeadingItem[] Tree structure of comments, top-level items are the headings.
97     */
98    public function getThreads(): array {
99        return $this->threads;
100    }
101
102    /**
103     * @inheritDoc
104     * @return DatabaseHeadingItem[] Tree structure of comments, top-level items are the headings.
105     */
106    public function getThreadsStructured(): array {
107        return array_values( array_filter( $this->getThreads(), static function ( DatabaseThreadItem $item ) {
108            return $item->getParent() === null;
109        } ) );
110    }
111}