From 75906515ee5397e18c20777ae9103c7e62e9042b Mon Sep 17 00:00:00 2001
From: Josh Pollock <josh@calderawp.com>
Date: Wed, 4 Apr 2018 21:11:10 -0400
Subject: [PATCH] make sql builders resetable

---
 .../EntryQueriesGeneratorsTest.php            | 88 +++++++++++++++++++
 Tests/Integration/EntryQueriesTest.php        |  3 +
 Tests/Unit/Delete/DeleteQueryBuilderTest.php  | 10 +++
 Tests/Unit/EntryQueriesTest.php               |  1 +
 src/CreatesSqlQueries.php                     |  7 ++
 src/Delete/DeleteQueryBuilder.php             | 16 +++-
 src/Select/SelectQueryBuilder.php             | 15 +++-
 7 files changed, 138 insertions(+), 2 deletions(-)
 create mode 100644 Tests/Integration/EntryQueriesGeneratorsTest.php

diff --git a/Tests/Integration/EntryQueriesGeneratorsTest.php b/Tests/Integration/EntryQueriesGeneratorsTest.php
new file mode 100644
index 0000000..2f7a464
--- /dev/null
+++ b/Tests/Integration/EntryQueriesGeneratorsTest.php
@@ -0,0 +1,88 @@
+<?php
+
+
+namespace calderawp\CalderaFormsQuery\Tests\Integration;
+
+
+use calderawp\CalderaFormsQuery\EntryQueries;
+use calderawp\CalderaFormsQuery\QueriesEntries;
+use calderawp\CalderaFormsQuery\Select\EntryValues;
+use calderawp\CalderaFormsQuery\Tests\Traits\CanCreateEntryWithEmailField;
+use calderawp\CalderaFormsQuery\Tests\Traits\HasFactories;
+use calderawp\CalderaFormsQuery\Tests\Traits\UsersMockFormAsDBForm;
+
+class EntryQueriesGeneratorsTest extends IntegrationTestCase
+{
+	use CanCreateEntryWithEmailField;
+
+	/**
+	 * Test reset builder allows us to create new queries on generator
+	 *
+	 * @covers QueriesEntries::getEntryValueGenerator()
+	 * @covers EntryValues::resetQuery()
+	 */
+	public function testReset()
+	{
+		$emailOne = 'one@email.com';
+		$entryIdOne = $this->createEntryWithEmail($emailOne);
+		$emailTwo = 'two@email.com';
+		$entryIdTwo = $this->createEntryWithEmail($emailTwo);
+		$entryQueries = $this->entryQueriesFactory();
+
+		//Email one by email
+		$results = $entryQueries
+			->getResults(
+				$entryQueries
+					->getEntryValueGenerator()
+					->queryByFieldValue(
+						$this->getEmailFieldSlug(),
+						$emailOne
+					)
+				->getPreparedSql()
+			);
+		$this->assertSame(1, count($results));
+
+		//Email one by entry_id
+		$results = $entryQueries
+			->getResults(
+				$entryQueries
+					->getEntryValueGenerator()
+					->queryByEntryId(
+						$entryIdOne
+					)
+					->getPreparedSql()
+			);
+		$this->assertSame(1, count($results));
+
+		$entryQueries
+			->getEntryValueGenerator()
+			->resetQuery();
+
+		//Email two by email
+		$results = $entryQueries
+			->getResults(
+				$entryQueries
+					->getEntryValueGenerator()
+					->queryByFieldValue(
+						$this->getEmailFieldSlug(),
+						$emailTwo
+					)
+					->getPreparedSql()
+			);
+		$this->assertSame(1, count($results));
+
+		//Email two by entry_id
+		$results = $entryQueries
+			->getResults(
+				$entryQueries
+					->getEntryValueGenerator()
+					->queryByEntryId(
+						$entryIdTwo
+					)
+					->getPreparedSql()
+			);
+		$this->assertSame(1, count($results));
+
+	}
+
+}
\ No newline at end of file
diff --git a/Tests/Integration/EntryQueriesTest.php b/Tests/Integration/EntryQueriesTest.php
index c31d0db..50a2f59 100644
--- a/Tests/Integration/EntryQueriesTest.php
+++ b/Tests/Integration/EntryQueriesTest.php
@@ -5,6 +5,7 @@ namespace calderawp\CalderaFormsQuery\Tests\Integration;
 
 
 use calderawp\CalderaFormsQuery\EntryQueries;
+use calderawp\CalderaFormsQuery\Tests\Traits\CanCreateEntryWithEmailField;
 use calderawp\CalderaFormsQuery\Tests\Traits\HasFactories;
 use calderawp\CalderaFormsQuery\Tests\Traits\UsersMockFormAsDBForm;
 
@@ -58,4 +59,6 @@ class EntryQueriesTest extends IntegrationTestCase
 		$this->assertTrue( ! empty( $resultsTwo ), var_export( $resultsTwo, true ) );
 
 	}
+
+
 }
\ No newline at end of file
diff --git a/Tests/Unit/Delete/DeleteQueryBuilderTest.php b/Tests/Unit/Delete/DeleteQueryBuilderTest.php
index be97ae6..10db4db 100644
--- a/Tests/Unit/Delete/DeleteQueryBuilderTest.php
+++ b/Tests/Unit/Delete/DeleteQueryBuilderTest.php
@@ -110,4 +110,14 @@ class DeleteQueryBuilderTest extends TestCase
 		$entryGenerator->resetBuilder( $newBuilder );
 		$this->assertSame( $newBuilder, $entryGenerator->getBuilder( ) );
 	}
+
+	public function testResetOfQuery()
+	{
+		$entryGenerator = $this->entryDeleteGeneratorFactory();
+		$entryGenerator->deleteByUserId(55 );
+		$entryGenerator->resetQuery();
+		$entryGenerator->deleteByUserId( 42 );
+		$this->assertTrue( is_int( strpos( $entryGenerator->getPreparedSql(), '42' ) ) );
+		$this->assertTrue( ! is_int( strpos( $entryGenerator->getPreparedSql(), '55' ) ) );
+	}
 }
diff --git a/Tests/Unit/EntryQueriesTest.php b/Tests/Unit/EntryQueriesTest.php
index b87a1b3..0ca9c6f 100644
--- a/Tests/Unit/EntryQueriesTest.php
+++ b/Tests/Unit/EntryQueriesTest.php
@@ -45,4 +45,5 @@ class EntryQueriesTest extends TestCase
 		$queries = $this->entryQueriesFactory();
 		$this->assertTrue(is_array($queries->getResults("SELECT `roy` FROM sivan WHERE mike = 'roy'")));
 	}
+
 }
diff --git a/src/CreatesSqlQueries.php b/src/CreatesSqlQueries.php
index dde4600..5b8eb83 100644
--- a/src/CreatesSqlQueries.php
+++ b/src/CreatesSqlQueries.php
@@ -39,4 +39,11 @@ interface CreatesSqlQueries
 	 * @return $this
 	 */
 	public function resetBuilder( MySqlBuilder $builder = null );
+
+	/**
+	 * Reset the query
+	 *
+	 * @return $this
+	 */
+	public function resetQuery();
 }
diff --git a/src/Delete/DeleteQueryBuilder.php b/src/Delete/DeleteQueryBuilder.php
index f55c08a..94bbd5b 100644
--- a/src/Delete/DeleteQueryBuilder.php
+++ b/src/Delete/DeleteQueryBuilder.php
@@ -20,7 +20,7 @@ abstract class DeleteQueryBuilder extends QueryBuilder implements DoesDeleteQuer
 	public function getDeleteQuery()
 	{
 		if (! $this->deleteQuery) {
-			$this->deleteQuery = new Delete($this->getTableName());
+			$this->setNewQuery();
 		}
 
 		return $this->deleteQuery;
@@ -33,4 +33,18 @@ abstract class DeleteQueryBuilder extends QueryBuilder implements DoesDeleteQuer
 	{
 		return $this->getDeleteQuery();
 	}
+
+	/** @inheritdoc */
+	public function resetQuery()
+	{
+		$this->setNewQuery();
+	}
+
+	/**
+	 * Set a new delete query
+	 */
+	private function setNewQuery()
+	{
+		$this->deleteQuery = new Delete($this->getTableName());
+	}
 }
diff --git a/src/Select/SelectQueryBuilder.php b/src/Select/SelectQueryBuilder.php
index 57891b5..d2b37f1 100644
--- a/src/Select/SelectQueryBuilder.php
+++ b/src/Select/SelectQueryBuilder.php
@@ -23,7 +23,7 @@ abstract class SelectQueryBuilder extends QueryBuilder implements DoesSelectQuer
 	{
 
 		if (empty($this->selectQuery)) {
-			$this->selectQuery = new \NilPortugues\Sql\QueryBuilder\Manipulation\Select($this->getTableName());
+			$this->setNewQuery();
 		}
 		return $this->selectQuery;
 	}
@@ -49,4 +49,17 @@ abstract class SelectQueryBuilder extends QueryBuilder implements DoesSelectQuer
 	}
 
 
+	/** @inheritdoc */
+	public function resetQuery()
+	{
+		$this->setNewQuery();
+		return $this;
+	}
+
+	private function setNewQuery()
+	{
+		$this->selectQuery = new \NilPortugues\Sql\QueryBuilder\Manipulation\Select($this->getTableName());
+	}
+
+
 }
-- 
GitLab