From ef8d38ca27d24ff1c2b2b499f74c24dae9d9e906 Mon Sep 17 00:00:00 2001
From: Vincent Petry <pvince81@owncloud.com>
Date: Mon, 19 Jan 2015 17:05:44 +0100
Subject: [PATCH] Fix chunked query for tags + unit test

---
 lib/private/tags.php |  2 +-
 tests/lib/tags.php   | 32 +++++++++++++++++++++++++++++---
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/lib/private/tags.php b/lib/private/tags.php
index 9ff433b6984..4d737e47e07 100644
--- a/lib/private/tags.php
+++ b/lib/private/tags.php
@@ -211,7 +211,7 @@ class Tags implements \OCP\ITags {
 
 		try {
 			$conn = \OC_DB::getConnection();
-			$chunks = array_chunk($objIds, 1000, false);
+			$chunks = array_chunk($objIds, 900, false);
 			foreach ($chunks as $chunk) {
 				$result = $conn->executeQuery(
 					'SELECT `category`, `categoryid`, `objid` ' .
diff --git a/tests/lib/tags.php b/tests/lib/tags.php
index 71296d2e346..547cd302d5d 100644
--- a/tests/lib/tags.php
+++ b/tests/lib/tags.php
@@ -30,7 +30,7 @@ class Test_Tags extends \Test\TestCase {
 	protected $backupGlobals = FALSE;
 	/** @var \OC\Tagging\TagMapper */
 	protected $tagMapper;
-	/** @var \OC\TagManager */
+	/** @var \OCP\ITagManager */
 	protected $tagMgr;
 
 	protected function setUp() {
@@ -55,8 +55,9 @@ class Test_Tags extends \Test\TestCase {
 	}
 
 	protected function tearDown() {
-		//$query = OC_DB::prepare('DELETE FROM `*PREFIX*vcategories` WHERE `item_type` = ?');
-		//$query->execute(array('test'));
+		$conn = \OC_DB::getConnection();
+		$conn->executeQuery('DELETE FROM `*PREFIX*vcategory_to_object`');
+		$conn->executeQuery('DELETE FROM `*PREFIX*vcategory`');
 
 		parent::tearDown();
 	}
@@ -176,6 +177,31 @@ class Test_Tags extends \Test\TestCase {
 		);
 	}
 
+	public function testGetTagsForObjectsMassiveResults() {
+		$defaultTags = array('tag1');
+		$tagger = $this->tagMgr->load($this->objectType, $defaultTags);
+		$tagData = $tagger->getTags();
+		$tagId = $tagData[0]['id'];
+		$tagType = $tagData[0]['type'];
+
+		$conn = \OC_DB::getConnection();
+		$statement = $conn->prepare(
+				'INSERT INTO `*PREFIX*vcategory_to_object` ' .
+				'(`objid`, `categoryid`, `type`) VALUES ' .
+				'(?, ?, ?)'
+		);
+
+		// insert lots of entries
+		$idsArray = array();
+		for($i = 1; $i <= 1500; $i++) {
+			$statement->execute(array($i, $tagId, $tagType));
+			$idsArray[] = $i;
+		}
+
+		$tags = $tagger->getTagsForObjects($idsArray);
+		$this->assertEquals(1500, count($tags));
+	}
+
 	public function testDeleteTags() {
 		$defaultTags = array('Friends', 'Family', 'Work', 'Other');
 		$tagger = $this->tagMgr->load($this->objectType, $defaultTags);
-- 
GitLab