Update npm dependencies
[GitHub/WoltLab/com.woltlab.wcf.conversation.git] / files / lib / system / worker / ConversationMessageSearchIndexRebuildDataWorker.class.php
1 <?php
2
3 namespace wcf\system\worker;
4
5 use wcf\data\conversation\ConversationList;
6 use wcf\data\conversation\message\ConversationMessageList;
7 use wcf\system\search\SearchIndexManager;
8 use wcf\system\WCF;
9
10 /**
11 * Worker implementation for updating the search index of conversation messages.
12 *
13 * @author Tim Duesterhus
14 * @copyright 2001-2019 WoltLab GmbH
15 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
16 * @package WoltLabSuite\Core\System\Worker
17 *
18 * @method ConversationMessageList getObjectList()
19 */
20 final class ConversationMessageSearchIndexRebuildDataWorker extends AbstractRebuildDataWorker
21 {
22 /**
23 * @inheritDoc
24 */
25 protected $limit = 1000;
26
27 /**
28 * @inheritDoc
29 */
30 public function countObjects()
31 {
32 if ($this->count === null) {
33 $this->count = 0;
34 $sql = "SELECT MAX(messageID) AS messageID
35 FROM wcf" . WCF_N . "_conversation_message";
36 $statement = WCF::getDB()->prepareStatement($sql);
37 $statement->execute();
38 $row = $statement->fetchArray();
39 if ($row !== false) {
40 $this->count = $row['messageID'];
41 }
42 }
43 }
44
45 /**
46 * @inheritDoc
47 */
48 protected function initObjectList()
49 {
50 $this->objectList = new ConversationMessageList();
51 $this->objectList->sqlOrderBy = 'conversation_message.messageID';
52 }
53
54 /**
55 * @inheritDoc
56 */
57 public function execute()
58 {
59 $this->objectList->getConditionBuilder()->add(
60 'conversation_message.messageID BETWEEN ? AND ?',
61 [$this->limit * $this->loopCount + 1, $this->limit * $this->loopCount + $this->limit]
62 );
63
64 parent::execute();
65
66 if (!$this->loopCount) {
67 // reset search index
68 SearchIndexManager::getInstance()->reset('com.woltlab.wcf.conversation.message');
69 }
70
71 if (!\count($this->objectList)) {
72 return;
73 }
74
75 // read associated conversations
76 $conversationIDs = \array_column(
77 $this->getObjectList()->getObjects(),
78 'conversationID'
79 );
80
81 $threadList = new ConversationList();
82 $threadList->setObjectIDs($conversationIDs);
83 $threadList->readObjects();
84 $conversations = $threadList->getObjects();
85
86 foreach ($this->getObjectList() as $message) {
87 $message->setConversation($conversations[$message->conversationID]);
88
89 $subject = '';
90 if ($message->messageID == $message->getConversation()->firstMessageID) {
91 $subject = $message->getTitle();
92 }
93
94 SearchIndexManager::getInstance()->set(
95 'com.woltlab.wcf.conversation.message',
96 $message->messageID,
97 $message->message,
98 $subject,
99 $message->time,
100 $message->userID,
101 $message->username
102 );
103 }
104 }
105 }