Merge branch '5.5'
[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 *
17 * @method ConversationMessageList getObjectList()
18 */
19 final class ConversationMessageSearchIndexRebuildDataWorker extends AbstractRebuildDataWorker
20 {
21 /**
22 * @inheritDoc
23 */
24 protected $limit = 1000;
25
26 /**
27 * @inheritDoc
28 */
29 public function countObjects()
30 {
31 if ($this->count === null) {
32 $this->count = 0;
33 $sql = "SELECT MAX(messageID) AS messageID
34 FROM wcf1_conversation_message";
35 $statement = WCF::getDB()->prepare($sql);
36 $statement->execute();
37 $row = $statement->fetchArray();
38 if ($row !== false) {
39 $this->count = $row['messageID'];
40 }
41 }
42 }
43
44 /**
45 * @inheritDoc
46 */
47 protected function initObjectList()
48 {
49 $this->objectList = new ConversationMessageList();
50 $this->objectList->sqlOrderBy = 'conversation_message.messageID';
51 }
52
53 /**
54 * @inheritDoc
55 */
56 public function execute()
57 {
58 $this->objectList->getConditionBuilder()->add(
59 'conversation_message.messageID BETWEEN ? AND ?',
60 [$this->limit * $this->loopCount + 1, $this->limit * $this->loopCount + $this->limit]
61 );
62
63 parent::execute();
64
65 if (!$this->loopCount) {
66 // reset search index
67 SearchIndexManager::getInstance()->reset('com.woltlab.wcf.conversation.message');
68 }
69
70 if (!\count($this->objectList)) {
71 return;
72 }
73
74 // read associated conversations
75 $conversationIDs = \array_column(
76 $this->getObjectList()->getObjects(),
77 'conversationID'
78 );
79
80 $threadList = new ConversationList();
81 $threadList->setObjectIDs($conversationIDs);
82 $threadList->readObjects();
83 $conversations = $threadList->getObjects();
84
85 foreach ($this->getObjectList() as $message) {
86 $message->setConversation($conversations[$message->conversationID]);
87
88 $subject = '';
89 if ($message->messageID == $message->getConversation()->firstMessageID) {
90 $subject = $message->getTitle();
91 }
92
93 SearchIndexManager::getInstance()->set(
94 'com.woltlab.wcf.conversation.message',
95 $message->messageID,
96 $message->message,
97 $subject,
98 $message->time,
99 $message->userID,
100 $message->username
101 );
102 }
103 }
104 }