From 2374ba3c7dd879144ce2b0ccc17c50a39892ebf7 Mon Sep 17 00:00:00 2001
From: Josh Pollock <josh@calderawp.com>
Date: Thu, 5 Apr 2018 20:51:01 -0400
Subject: [PATCH] delete by entry ids

---
 Tests/Integration/Delete/EntryTest.php | 35 ++++++++++++++++++++++++++
 src/Delete/Entry.php                   | 11 ++++++++
 src/Exceptions/Exception.php           |  8 ++++++
 src/QueryBuilder.php                   | 24 ++++++++++++++++--
 src/Select/Entry.php                   |  8 +++---
 src/Select/SelectQueryBuilder.php      |  8 +++---
 6 files changed, 83 insertions(+), 11 deletions(-)
 create mode 100644 src/Exceptions/Exception.php

diff --git a/Tests/Integration/Delete/EntryTest.php b/Tests/Integration/Delete/EntryTest.php
index 071f3ad..fa8b577 100644
--- a/Tests/Integration/Delete/EntryTest.php
+++ b/Tests/Integration/Delete/EntryTest.php
@@ -4,6 +4,7 @@
 namespace calderawp\CalderaFormsQuery\Tests\Integration\Delete;
 
 
+use calderawp\CalderaFormsQuery\Delete\Entry;
 use calderawp\CalderaFormsQuery\Tests\Integration\IntegrationTestCase;
 
 class EntryTest extends IntegrationTestCase
@@ -159,7 +160,41 @@ class EntryTest extends IntegrationTestCase
 			)
 		));
 
+	}
+
+	/**
+	 * Test querying by IDs
+	 *
+	 * @covers Entry::deleteByEntryIds()
+	 */
+	public function testByEntryIds()
+	{
+		$entryIdOne = $this->createEntryWithMockFormAndGetEntryId();
+		$entryIdTwo = $this->createEntryWithMockFormAndGetEntryId();
+		$entryIdThree = $this->createEntryWithMockFormAndGetEntryId();
+
+		//Delete results IN One and Three
+		$entryGenerator = $this->entryDeleteGeneratorFactory();
+		$sql = $entryGenerator->deleteByEntryIds( [
+			$entryIdOne,
+			$entryIdThree
+		])
+			->getPreparedSql();
+		$this->queryWithWPDB($sql);
+
+		//Query for entry Two expect 1 result
+		$entryGenerator = $this->entryGeneratorFactory();
+		$sql = $entryGenerator->queryByEntryId($entryIdTwo)
+			->getPreparedSql();
+		$results = $this->queryWithWPDB( $sql );
+		$this->assertSame( 1, count( $results ) );
 
+		//Query for entry One expect 0 result
+		$entryGenerator = $this->entryGeneratorFactory();
+		$sql = $entryGenerator->queryByEntryId($entryIdOne)
+			->getPreparedSql();
+		$results = $this->queryWithWPDB( $sql );
+		$this->assertSame( 0, count( $results ) );
 
 	}
 
diff --git a/src/Delete/Entry.php b/src/Delete/Entry.php
index edbf882..28d6434 100644
--- a/src/Delete/Entry.php
+++ b/src/Delete/Entry.php
@@ -28,6 +28,17 @@ class Entry extends DeleteQueryBuilder
 		return $this->is('id', $entryId);
 	}
 
+	/**
+	 * Delete an array of entries
+	 *
+	 * @param array $entryIds
+	 * @return $this
+	 */
+	public function deleteByEntryIds(array $entryIds)
+	{
+		return $this->in($entryIds);
+	}
+
 	/**
 	 * Delete entries belonging to a specific user ID
 	 *
diff --git a/src/Exceptions/Exception.php b/src/Exceptions/Exception.php
new file mode 100644
index 0000000..6303eff
--- /dev/null
+++ b/src/Exceptions/Exception.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace calderawp\CalderaFormsQuery\Exceptions;
+
+class Exception extends \Exception
+{
+
+}
\ No newline at end of file
diff --git a/src/QueryBuilder.php b/src/QueryBuilder.php
index 3a9a311..6dc87a8 100644
--- a/src/QueryBuilder.php
+++ b/src/QueryBuilder.php
@@ -3,7 +3,7 @@
 
 namespace calderawp\CalderaFormsQuery;
 
-use calderawp\CalderaFormsQuery\Select\DoesSelectQuery;
+use calderawp\CalderaFormsQuery\Exceptions\Exception;
 use NilPortugues\Sql\QueryBuilder\Manipulation\AbstractBaseQuery;
 
 /**
@@ -94,12 +94,17 @@ abstract class QueryBuilder implements CreatesSqlQueries
 	 *
 	 * @param string $sql SQL query with substitutions
 	 * @return string
+	 * @throws Exception
 	 */
 	protected function substituteValues($sql)
 	{
 		$values = $this->getBuilder()->getValues();
 		foreach ($values as $identifier => $value) {
-			$values[$identifier] = $this->surroundValue($value);
+			if (is_array( $value ) || is_object( $value ) ) {
+				continue;
+			} else {
+				$values[$identifier] = $this->surroundValue($value);
+			}
 		}
 		return str_replace(array_keys($values), array_values($values), $sql);
 	}
@@ -153,4 +158,19 @@ abstract class QueryBuilder implements CreatesSqlQueries
 	{
 		return $this->substituteValues($this->getBuilder()->write($this->getCurrentQuery()));
 	}
+
+	/**
+	 * Add a WHERE IN()
+	 *
+	 * @param array $entryIds
+	 * @return $this
+	 */
+	protected function in(array $entryIds)
+	{
+		$this
+			->getCurrentQuery()
+			->where()
+			->in('id', $entryIds);
+		return $this;
+	}
 }
diff --git a/src/Select/Entry.php b/src/Select/Entry.php
index 7aa2824..c1fea30 100644
--- a/src/Select/Entry.php
+++ b/src/Select/Entry.php
@@ -42,11 +42,7 @@ class Entry extends SelectQueryBuilder
 	 */
 	public function queryByEntryIds(array $entryIds)
 	{
-		$this
-			->getSelectQuery()
-			->where()
-			->in( 'id', $entryIds );
-		return $this;
+		return $this->in($entryIds);
 	}
 
 	/**
@@ -59,4 +55,6 @@ class Entry extends SelectQueryBuilder
 	{
 		return $this->is('user_id', $userId);
 	}
+
+
 }
diff --git a/src/Select/SelectQueryBuilder.php b/src/Select/SelectQueryBuilder.php
index eb45d07..9c06624 100644
--- a/src/Select/SelectQueryBuilder.php
+++ b/src/Select/SelectQueryBuilder.php
@@ -3,11 +3,7 @@
 
 namespace calderawp\CalderaFormsQuery\Select;
 
-use calderawp\CalderaFormsQuery\CreatesSqlQueries;
-use calderawp\CalderaFormsQuery\MySqlBuilder;
 use calderawp\CalderaFormsQuery\QueryBuilder;
-use NilPortugues\Sql\QueryBuilder\Manipulation\AbstractBaseQuery;
-use NilPortugues\Sql\QueryBuilder\Manipulation\Delete;
 use NilPortugues\Sql\QueryBuilder\Manipulation\Select;
 
 abstract class SelectQueryBuilder extends QueryBuilder implements DoesSelectQuery
@@ -56,8 +52,12 @@ abstract class SelectQueryBuilder extends QueryBuilder implements DoesSelectQuer
 		return $this;
 	}
 
+	/**
+	 * Set new query in selectQuery prop
+	 */
 	private function setNewQuery()
 	{
 		$this->selectQuery = new \NilPortugues\Sql\QueryBuilder\Manipulation\Select($this->getTableName());
 	}
+
 }
-- 
GitLab