From e1c81393735abf78dfcecaddf421ff8cf98b825b Mon Sep 17 00:00:00 2001
From: Marcin Kurczewski <mkurczew@gmail.com>
Date: Fri, 1 Nov 2013 20:51:19 +0100
Subject: [PATCH] Unused tags are removed on post edit

---
 src/Controllers/PostController.php |  1 +
 src/Models/Model_Tag.php           | 22 ++++++++++++++++++++--
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/Controllers/PostController.php b/src/Controllers/PostController.php
index 0bc47da8..69e82bb4 100644
--- a/src/Controllers/PostController.php
+++ b/src/Controllers/PostController.php
@@ -427,6 +427,7 @@ class PostController
 			}
 
 			R::store($post);
+			Model_Tag::removeUnused();
 
 
 			$this->context->transport->success = true;
diff --git a/src/Models/Model_Tag.php b/src/Models/Model_Tag.php
index 24986d63..e42dbac9 100644
--- a/src/Models/Model_Tag.php
+++ b/src/Models/Model_Tag.php
@@ -3,7 +3,7 @@ class Model_Tag extends AbstractModel
 {
 	public static function locate($key, $throw = true)
 	{
-		$tag = R::findOne('tag', 'LOWER(name) = LOWER(?)', [$key]);
+		$tag = R::findOne(self::getTableName(), 'LOWER(name) = LOWER(?)', [$key]);
 		if (!$tag)
 		{
 			if ($throw)
@@ -13,6 +13,24 @@ class Model_Tag extends AbstractModel
 		return $tag;
 	}
 
+	public static function removeUnused()
+	{
+		$dbQuery = R::$f
+			->begin()
+			->select('id, name')
+			->from(self::getTableName())
+			->where()
+			->not()->exists()
+			->open()
+				->select('1')
+				->from('post_tag')
+				->where('post_tag.tag_id = tag.id')
+			->close();
+		$rows = $dbQuery->get();
+		$entities = R::convertToBeans(self::getTableName(), $rows);
+		R::trashAll($entities);
+	}
+
 	public static function insertOrUpdate($tags)
 	{
 		$dbTags = [];
@@ -21,7 +39,7 @@ class Model_Tag extends AbstractModel
 			$dbTag = self::locate($tag, false);
 			if (!$dbTag)
 			{
-				$dbTag = R::dispense('tag');
+				$dbTag = R::dispense(self::getTableName());
 				$dbTag->name = $tag;
 				R::store($dbTag);
 			}