Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 10 |
CRAP | |
0.00% |
0 / 84 |
| ForumIndexStorage | |
0.00% |
0 / 1 |
|
0.00% |
0 / 10 |
210 | |
0.00% |
0 / 84 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getOriginalTermId | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| create | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 8 |
|||
| read | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
| delete | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| deleteRevision | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
| update | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
| updateIndex | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 28 |
|||
| createIndex | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 21 |
|||
| deleteIndex | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\forum\ForumIndexStorage. | |
| */ | |
| namespace Drupal\forum; | |
| use Drupal\comment\CommentInterface; | |
| use Drupal\Core\Database\Connection; | |
| use Drupal\node\NodeInterface; | |
| /** | |
| * Handles CRUD operations to {forum_index} table. | |
| */ | |
| class ForumIndexStorage implements ForumIndexStorageInterface { | |
| /** | |
| * The active database connection. | |
| * | |
| * @var \Drupal\Core\Database\Connection | |
| */ | |
| protected $database; | |
| /** | |
| * Constructs a ForumIndexStorage object. | |
| * | |
| * @param \Drupal\Core\Database\Connection $database | |
| * The current database connection. | |
| */ | |
| function __construct(Connection $database) { | |
| $this->database = $database; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getOriginalTermId(NodeInterface $node) { | |
| return $this->database->queryRange("SELECT f.tid FROM {forum} f INNER JOIN {node} n ON f.vid = n.vid WHERE n.nid = :nid ORDER BY f.vid DESC", 0, 1, array(':nid' => $node->id()))->fetchField(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function create(NodeInterface $node) { | |
| $this->database->insert('forum') | |
| ->fields(array( | |
| 'tid' => $node->forum_tid, | |
| 'vid' => $node->getRevisionId(), | |
| 'nid' => $node->id(), | |
| )) | |
| ->execute(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function read(array $vids) { | |
| return $this->database->select('forum', 'f') | |
| ->fields('f', array('nid', 'tid')) | |
| ->condition('f.vid', $vids, 'IN') | |
| ->execute(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function delete(NodeInterface $node) { | |
| $this->database->delete('forum') | |
| ->condition('nid', $node->id()) | |
| ->execute(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function deleteRevision(NodeInterface $node) { | |
| $this->database->delete('forum') | |
| ->condition('nid', $node->id()) | |
| ->condition('vid', $node->getRevisionId()) | |
| ->execute(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function update(NodeInterface $node) { | |
| $this->database->update('forum') | |
| ->fields(array('tid' => $node->forum_tid)) | |
| ->condition('vid', $node->getRevisionId()) | |
| ->execute(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function updateIndex(NodeInterface $node) { | |
| $nid = $node->id(); | |
| $count = $this->database->query("SELECT COUNT(cid) FROM {comment_field_data} c INNER JOIN {forum_index} i ON c.entity_id = i.nid WHERE c.entity_id = :nid AND c.field_name = 'comment_forum' AND c.entity_type = 'node' AND c.status = :status AND c.default_langcode = 1", array( | |
| ':nid' => $nid, | |
| ':status' => CommentInterface::PUBLISHED, | |
| ))->fetchField(); | |
| if ($count > 0) { | |
| // Comments exist. | |
| $last_reply = $this->database->queryRange("SELECT cid, name, created, uid FROM {comment_field_data} WHERE entity_id = :nid AND field_name = 'comment_forum' AND entity_type = 'node' AND status = :status AND default_langcode = 1 ORDER BY cid DESC", 0, 1, array( | |
| ':nid' => $nid, | |
| ':status' => CommentInterface::PUBLISHED, | |
| ))->fetchObject(); | |
| $this->database->update('forum_index') | |
| ->fields( array( | |
| 'comment_count' => $count, | |
| 'last_comment_timestamp' => $last_reply->created, | |
| )) | |
| ->condition('nid', $nid) | |
| ->execute(); | |
| } | |
| else { | |
| // Comments do not exist. | |
| // @todo This should be actually filtering on the desired node language | |
| $this->database->update('forum_index') | |
| ->fields( array( | |
| 'comment_count' => 0, | |
| 'last_comment_timestamp' => $node->getCreatedTime(), | |
| )) | |
| ->condition('nid', $nid) | |
| ->execute(); | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function createIndex(NodeInterface $node) { | |
| $query = $this->database->insert('forum_index') | |
| ->fields(array('nid', 'title', 'tid', 'sticky', 'created', 'comment_count', 'last_comment_timestamp')); | |
| foreach ($node->getTranslationLanguages() as $langcode => $language) { | |
| $translation = $node->getTranslation($langcode); | |
| foreach ($translation->taxonomy_forums as $item) { | |
| $query->values(array( | |
| 'nid' => $node->id(), | |
| 'title' => $translation->label(), | |
| 'tid' => $item->target_id, | |
| 'sticky' => (int) $node->isSticky(), | |
| 'created' => $node->getCreatedTime(), | |
| 'comment_count' => 0, | |
| 'last_comment_timestamp' => $node->getCreatedTime(), | |
| )); | |
| } | |
| } | |
| $query->execute(); | |
| // The logic for determining last_comment_count is fairly complex, so | |
| // update the index too. | |
| if ($node->isNew()) { | |
| $this->updateIndex($node); | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function deleteIndex(NodeInterface $node) { | |
| $this->database->delete('forum_index') | |
| ->condition('nid', $node->id()) | |
| ->execute(); | |
| } | |
| } |