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