From: Michael <heluecht@pirati.ca>
Date: Sun, 24 Jun 2018 21:41:49 +0000 (+0000)
Subject: We now store item content centrally
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=58d61810ea8c487e1bc7b97c7d5e4146a152bcf2;p=friendica.git

We now store item content centrally
---

diff --git a/src/Model/Item.php b/src/Model/Item.php
index d6bfef39fb..18d89d55ae 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -56,6 +56,10 @@ class Item extends BaseObject
 			'author-id', 'author-link', 'owner-link', 'contact-uid',
 			'signed_text', 'signature', 'signer'];
 
+	const CONTENT_FIELDLIST = ['title', 'content-warning', 'body', 'location',
+			'coord', 'app', 'rendered-hash', 'rendered-html',
+			'object-type', 'object', 'target-type', 'target'];
+
 	/**
 	 * @brief Fetch a single item row
 	 *
@@ -66,6 +70,14 @@ class Item extends BaseObject
 	{
 		$row = dba::fetch($stmt);
 
+		// Fetch data from the item-content table whenever there is content there
+		foreach (self::CONTENT_FIELDLIST as $field) {
+			if (isset($row[$field]) && !empty($row['item-content-' . $field])) {
+				$row[$field] = $row['item-content-' . $field];
+				unset($row['item-content-' . $field]);
+			}
+		}
+
 		// We prefer the data from the user's contact over the public one
 		if (!empty($row['author-link']) && !empty($row['contact-link']) &&
 			($row['author-link'] == $row['contact-link'])) {
@@ -449,6 +461,10 @@ class Item extends BaseObject
 			$joins .= " LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id`";
 		}
 
+		if (strpos($sql_commands, "`item-content`.") !== false) {
+			$joins .= " LEFT JOIN `item-content` ON `item-content`.`uri` = `item`.`uri`";
+		}
+
 		if ((strpos($sql_commands, "`parent-item`.") !== false) || (strpos($sql_commands, "`parent-author`.") !== false)) {
 			$joins .= " STRAIGHT_JOIN `item` AS `parent-item` ON `parent-item`.`id` = `item`.`parent`";
 		}
@@ -474,10 +490,13 @@ class Item extends BaseObject
 		foreach ($fields as $table => $table_fields) {
 			foreach ($table_fields as $field => $select) {
 				if (empty($selected) || in_array($select, $selected)) {
+					if (in_array($select, self::CONTENT_FIELDLIST)) {
+						$selection[] = "`item-content`.`".$select."` AS `item-content-" . $select . "`";
+					}
 					if (is_int($field)) {
-						$selection[] = "`" . $table . "`.`".$select."`";
+						$selection[] = "`" . $table . "`.`" . $select . "`";
 					} else {
-						$selection[] = "`" . $table . "`.`" . $field . "` AS `".$select ."`";
+						$selection[] = "`" . $table . "`.`" . $field . "` AS `" . $select . "`";
 					}
 				}
 			}
@@ -536,7 +555,7 @@ class Item extends BaseObject
 		// We cannot simply expand the condition to check for origin entries
 		// The condition needn't to be a simple array but could be a complex condition.
 		// And we have to execute this query before the update to ensure to fetch the same data.
-		$items = dba::select('item', ['id', 'origin'], $condition);
+		$items = dba::select('item', ['id', 'origin', 'uri'], $condition);
 
 		$success = dba::update('item', $fields, $condition);
 
@@ -549,6 +568,7 @@ class Item extends BaseObject
 		$rows = dba::affected_rows();
 
 		while ($item = dba::fetch($items)) {
+			self::updateContent($fields, ['uri' => $item['uri']]);
 			Term::insertFromTagFieldByItemId($item['id']);
 			Term::insertFromFileFieldByItemId($item['id']);
 			self::updateThread($item['id']);
@@ -1260,6 +1280,7 @@ class Item extends BaseObject
 		logger('' . print_r($item,true), LOGGER_DATA);
 
 		dba::transaction();
+		self::insertContent($item);
 		$ret = dba::insert('item', $item);
 
 		// When the item was successfully stored we fetch the ID of the item.
@@ -1407,6 +1428,54 @@ class Item extends BaseObject
 		return $current_post;
 	}
 
+	/**
+	 * @brief Insert a new item content entry
+	 *
+	 * @param array $item The item fields that are to be inserted
+	 */
+	private static function insertContent(&$item)
+	{
+		logger('Insert content for URI '.$item['uri']);
+
+		$fields = ['uri' => $item['uri'], 'title' => $item['title'],
+			'content-warning' => $item['content-warning'],
+			'body' => $item['body'], 'location' => $item['location'],
+			'coord' => $item['coord'], 'app' => $item['app'],
+			'rendered-hash' => $item['rendered-hash'],
+			'rendered-html' => $item['rendered-html'],
+			'object-type' => $item['object-type'],
+			'object' => $item['object'], 'target-type' => $item['target-type'],
+			'target' => $item['target'], 'plink' => $item['plink'],
+			'uri-plink-hash' => hash('sha1', $item['plink']).hash('sha1', $item['uri'])];
+
+		dba::insert('item-content', $fields, true);
+	}
+
+	/**
+	 * @brief Update existing item content entries
+	 *
+	 * @param array $item The item fields that are to be changed
+	 * @param array $condition The condition for finding the item content entries
+	 */
+	private static function updateContent($item, $condition)
+	{
+		// We have to select only the fields from the "item-content" table
+		$fields = [];
+		foreach (self::CONTENT_FIELDLIST as $field) {
+			if (isset($item[$field])) {
+				$fields[$field] = $item[$field];
+			}
+		}
+
+		if (empty($fields)) {
+			return;
+		}
+
+		logger('Update content for URI '.$condition['uri']);
+
+		dba::update('item-content', $fields, $condition, true);
+	}
+
 	/**
 	 * @brief Distributes public items to the receivers
 	 *