From 7f4cef58c24e996e4ca8bbd1f58f0b88b9721af1 Mon Sep 17 00:00:00 2001
From: Josh Pollock <josh@calderawp.com>
Date: Thu, 5 Apr 2018 19:43:05 -0400
Subject: [PATCH] impliment select by user ID feature

---
 .../Features/FeatureContainerTest.php         |  55 ++++++++++
 .../Features/QueryByUserIdTest.php            |  14 ++-
 Tests/Traits/HasFactories.php                 |  13 +++
 Tests/Unit/Features/FeatureContainerTest.php  |  47 +++++++-
 Tests/Unit/TestCase.php                       |   3 +
 src/CanCollectResults.php                     |  70 ++++++++++++
 src/CreatesSelectQueries.php                  |   8 +-
 src/Features/FeatureContainer.php             | 101 +++++++++++++++++-
 src/Features/Queries.php                      |  31 ++++++
 src/SelectQueries.php                         |  64 -----------
 10 files changed, 327 insertions(+), 79 deletions(-)
 create mode 100644 Tests/Integration/Features/FeatureContainerTest.php
 create mode 100644 src/CanCollectResults.php

diff --git a/Tests/Integration/Features/FeatureContainerTest.php b/Tests/Integration/Features/FeatureContainerTest.php
new file mode 100644
index 0000000..b117fcf
--- /dev/null
+++ b/Tests/Integration/Features/FeatureContainerTest.php
@@ -0,0 +1,55 @@
+<?php
+
+
+namespace calderawp\CalderaFormsQuery\Tests\Integration\Features;
+
+
+use calderawp\CalderaFormsQuery\Features\FeatureContainer;
+use calderawp\CalderaFormsQuery\Tests\Integration\IntegrationTestCase;
+
+class FeatureContainerTest extends IntegrationTestCase
+{
+
+	/**
+	 * Test the table names
+	 *
+	 * @covers FeatureContainer::getQueries()
+	 * @covers FeatureContainer::bindServices()
+	 */
+	public function testTableNames()
+	{
+		$container = $this->containerFactory();
+
+		//Select entry
+		$this->assertEquals( $this->entryTableName(),
+			$container
+				->getQueries()
+				->entrySelect()
+				->getTableName()
+		);
+
+		//Select entry value
+		$this->assertEquals( $this->entryValueTableName(),
+			$container
+				->getQueries()
+				->entryValuesSelect()
+				->getTableName()
+		);
+
+		//Delete entry
+		$this->assertEquals( $this->entryTableName(),
+			$container
+				->getQueries()
+				->entryDelete()
+				->getTableName()
+		);
+
+		//Delete entry values
+		$this->assertEquals( $this->entryValueTableName(),
+			$container
+				->getQueries()
+				->entryValueDelete()
+				->getTableName()
+		);
+	}
+}
\ No newline at end of file
diff --git a/Tests/Integration/Features/QueryByUserIdTest.php b/Tests/Integration/Features/QueryByUserIdTest.php
index 0347b9c..897712c 100644
--- a/Tests/Integration/Features/QueryByUserIdTest.php
+++ b/Tests/Integration/Features/QueryByUserIdTest.php
@@ -11,23 +11,20 @@ class QueryByUserIdTest extends IntegrationTestCase
 
 	use CanCreateEntryWithEmailField;
 
-	/**
-	 * Test selecting by entry ID
-	 *
-	 * @covers CreatesSelectQueries::selectByUserId()
-	 */
+
 	public function testByUserId()
 	{
-		$email = 'nom@noms.noms';
+		$container = $this->containerFactory();
+
 		//Create an entry for a known user.
+		$email = 'nom@noms.noms';
 		$userId = $this->factory()->user->create(
 			[ 'user_email' => $email ]
 		);
 		wp_set_current_user( $userId );
 		$entryId = $this->createEntryWithEmail( $email );
-		$queries = $this->selectQueriesFactory();
 
-		$results = $queries->selectByUserId( $userId );
+		$results = $container->selectByUserId( $userId );
 		$this->assertEquals( $entryId, $results[0]['entry']->id);
 		$this->assertEquals( $entryId, $results[0]['entry']->id);
 
@@ -42,5 +39,6 @@ class QueryByUserIdTest extends IntegrationTestCase
 
 		$this->assertTrue( $found );
 
+
 	}
 }
\ No newline at end of file
diff --git a/Tests/Traits/HasFactories.php b/Tests/Traits/HasFactories.php
index 1c948f2..6bd08f1 100644
--- a/Tests/Traits/HasFactories.php
+++ b/Tests/Traits/HasFactories.php
@@ -3,7 +3,9 @@
 
 namespace calderawp\CalderaFormsQuery\Tests\Traits;
 
+use calderawp\CalderaContainers\Service\Container;
 use calderawp\CalderaFormsQuery\DeleteQueries;
+use calderawp\CalderaFormsQuery\Features\FeatureContainer;
 use calderawp\CalderaFormsQuery\SelectQueries;
 use calderawp\CalderaFormsQuery\Tests\Unit\Features\QueriesTest;
 
@@ -102,6 +104,17 @@ trait HasFactories
 		);
 	}
 
+	/**
+	 * @return FeatureContainer
+	 */
+	protected function containerFactory()
+	{
+		return new FeatureContainer(
+			new Container(),
+			$this->getWPDB()
+		);
+	}
+
 	/**
 	 * Gets a WPDB instance
 	 *
diff --git a/Tests/Unit/Features/FeatureContainerTest.php b/Tests/Unit/Features/FeatureContainerTest.php
index 300c1ce..82c2151 100644
--- a/Tests/Unit/Features/FeatureContainerTest.php
+++ b/Tests/Unit/Features/FeatureContainerTest.php
@@ -16,6 +16,7 @@ class FeatureContainerTest extends TestCase
 {
 
 	/**
+	 * Test getting the main MySQL Builder
 	 *
 	 * @covers FeatureContainer::getBuilder()
 	 * @covers FeatureContainer::bindServices()
@@ -42,6 +43,7 @@ class FeatureContainerTest extends TestCase
 	}
 
 	/**
+	 * Test getting the main query builder
 	 *
 	 * @covers FeatureContainer::bindServices()
 	 * @covers FeatureContainer::getQueries()
@@ -51,7 +53,6 @@ class FeatureContainerTest extends TestCase
 		$serviceContainer = new TheServiceContainer();
 		$container = new FeatureContainer($serviceContainer, $this->getWPDB());
 
-
 		$this->assertTrue(
 			is_a(
 				$container->getQueries(),
@@ -64,4 +65,48 @@ class FeatureContainerTest extends TestCase
 			$container->getQueries()
 		);
 	}
+
+	/**
+	 * Test the table names
+	 *
+	 * @covers FeatureContainer::getQueries()
+	 * @covers FeatureContainer::bindServices()
+	 */
+	public function testTableNames()
+	{
+		$container = $this->containerFactory();
+
+		//Select entry
+		$this->assertEquals( $this->entryTableName(),
+			$container
+				->getQueries()
+				->entrySelect()
+				->getTableName()
+		);
+
+		//Select entry value
+		$this->assertEquals( $this->entryValueTableName(),
+			$container
+				->getQueries()
+				->entryValuesSelect()
+				->getTableName()
+		);
+
+		//Delete entry
+		$this->assertEquals( $this->entryTableName(),
+			$container
+				->getQueries()
+				->entryDelete()
+				->getTableName()
+		);
+
+		//Delete entry values
+		$this->assertEquals( $this->entryValueTableName(),
+			$container
+				->getQueries()
+				->entryValueDelete()
+				->getTableName()
+		);
+	}
+
 }
\ No newline at end of file
diff --git a/Tests/Unit/TestCase.php b/Tests/Unit/TestCase.php
index 3040fb6..df3ec4c 100755
--- a/Tests/Unit/TestCase.php
+++ b/Tests/Unit/TestCase.php
@@ -17,5 +17,8 @@ use PHPUnit\Framework\TestCase as FrameworkTestCase;
  */
 abstract class TestCase extends FrameworkTestCase
 {
+	//Factories go in this trait so they are share with integration tests
 	use HasFactories;
+
+
 }
diff --git a/src/CanCollectResults.php b/src/CanCollectResults.php
new file mode 100644
index 0000000..33b5b78
--- /dev/null
+++ b/src/CanCollectResults.php
@@ -0,0 +1,70 @@
+<?php
+
+
+namespace calderawp\CalderaFormsQuery;
+
+
+trait CanCollectResults
+{
+	/**
+	 * Collect results using  Caldera_Forms_Entry_Entry and Caldera_Forms_Entry_Field to represent values
+	 *
+	 * @param \stdClass[] $entriesValues
+	 * @return array
+	 */
+	private function collectResults($entriesValues)
+	{
+		$results = [];
+		foreach ($entriesValues as $entry) {
+			$this->resetEntryValueGenerator();
+			$entry = new \Caldera_Forms_Entry_Entry($entry);
+			$this
+				->getEntryValueGenerator()
+				->queryByEntryId($entry->id);
+			$entriesValues =$this->getResults(
+				$this->getEntryValueGenerator()
+					->getPreparedSql()
+			);
+
+			$entryValuesPrepared = $this->collectEntryValues($entriesValues);
+			$results[] = [
+				'entry' => $entry,
+				'values' => $entryValuesPrepared
+			];
+		}
+		return $results;
+	}
+
+	/**
+	 * Collect entry values as Caldera_Forms_Entry_Field objects
+	 *
+	 * @param \stdClass[] $entriesValues
+	 * @return array
+	 */
+	private function collectEntryValues($entriesValues): array
+	{
+		$entryValuesPrepared = [];
+		if (!empty($entriesValues)) {
+			foreach ($entriesValues as $entryValue) {
+				$entryValuesPrepared[] = new \Caldera_Forms_Entry_Field($entryValue);
+			}
+		}
+		return $entryValuesPrepared;
+	}
+
+	/**
+	 * Reset entry generator
+	 */
+	private function resetEntryGenerator()
+	{
+		$this->entryGenerator->resetQuery();
+	}
+
+	/**
+	 * Reset entry value generator
+	 */
+	private function resetEntryValueGenerator()
+	{
+		$this->entryValueGenerator->resetQuery();
+	}
+}
\ No newline at end of file
diff --git a/src/CreatesSelectQueries.php b/src/CreatesSelectQueries.php
index 0c1f9ea..eb58822 100644
--- a/src/CreatesSelectQueries.php
+++ b/src/CreatesSelectQueries.php
@@ -9,7 +9,7 @@ use calderawp\CalderaFormsQuery\Select\EntryValues;
 /**
  * Interface QueriesEntries
  *
- * Interface that all classes that query for entries MUST impliment
+ * Interface that all classes that query for entries MUST implement
  */
 interface CreatesSelectQueries extends GetsResults
 {
@@ -25,4 +25,10 @@ interface CreatesSelectQueries extends GetsResults
 	 * @return Entry
 	 */
 	public function getEntryGenerator();
+
+	/**
+	 * @param $sql
+	 * @return \stdClass[]
+	 */
+	public function getResults($sql);
 }
diff --git a/src/Features/FeatureContainer.php b/src/Features/FeatureContainer.php
index 7fb00dd..c3ae76e 100644
--- a/src/Features/FeatureContainer.php
+++ b/src/Features/FeatureContainer.php
@@ -7,12 +7,16 @@ namespace calderawp\CalderaFormsQuery\Features;
 use calderawp\CalderaContainers\Container;
 use calderawp\CalderaContainers\Interfaces\ServiceContainer;
 
+use calderawp\CalderaFormsQuery\Delete\DeleteQueryBuilder;
+use calderawp\CalderaFormsQuery\Delete\DoesDeleteQuery;
 use calderawp\CalderaFormsQuery\DeleteQueries;
 use calderawp\CalderaFormsQuery\MySqlBuilder;
 use calderawp\CalderaFormsQuery\Delete\Entry as EntryDelete;
 use \calderawp\CalderaFormsQuery\Delete\EntryValues as EntryValuesDelete;
+use calderawp\CalderaFormsQuery\Select\DoesSelectQuery;
 use \calderawp\CalderaFormsQuery\Select\Entry as EntrySelect;
 use \calderawp\CalderaFormsQuery\Select\EntryValues as EntryValueSelect;
+use calderawp\CalderaFormsQuery\Select\SelectQueryBuilder;
 use calderawp\CalderaFormsQuery\SelectQueries;
 
 class FeatureContainer extends Container
@@ -44,11 +48,13 @@ class FeatureContainer extends Container
 	 */
 	protected function bindServices()
 	{
+		//@TODO move these to service provider classes
 		$this->serviceContainer->singleton( MySqlBuilder::class, function(){
 			return new MySqlBuilder();
 		});
 
 		$this->serviceContainer->bind( SelectQueries::class, function (){
+			//@TODO Factory
 			return new SelectQueries(
 				new EntrySelect(
 					$this->getBuilder(),
@@ -56,13 +62,14 @@ class FeatureContainer extends Container
 				),
 				new EntryValueSelect(
 					$this->getBuilder(),
-					$this->entryTableName()
+					$this->entryValueTableName()
 				),
 				$this->wpdb
 			);
 		});
 
 		$this->serviceContainer->bind( DeleteQueries::class, function (){
+			//@TODO Factory
 			return new DeleteQueries(
 				new EntryDelete(
 					$this->getBuilder(),
@@ -70,7 +77,7 @@ class FeatureContainer extends Container
 				),
 				new EntryValuesDelete(
 					$this->getBuilder(),
-					$this->entryTableName()
+					$this->entryValueTableName()
 				),
 				$this->wpdb
 			);
@@ -112,12 +119,25 @@ class FeatureContainer extends Container
 			->make( Queries::class );
 	}
 
-
+	/**
+	 * Select all entries and entry values by user ID
+	 *
+	 * @param int $userId
+	 * @return array
+	 */
+	public function selectByUserId($userId)
+	{
+		$query = $this
+			->getQueries()
+			->entrySelect()
+			->queryByUserId($userId);
+		return $this->collectResults( $this->select( $query ) );
+	}
 
 	/**
 	 * @return string
 	 */
-	protected function entryValueTableName(): string
+	protected function entryValueTableName()
 	{
 		return "{$this->wpdb->prefix}cf_form_entry_values";
 	}
@@ -125,9 +145,80 @@ class FeatureContainer extends Container
 	/**
 	 * @return string
 	 */
-	protected function entryTableName(): string
+	protected function entryTableName()
 	{
 		return "{$this->wpdb->prefix}cf_form_entries";
 	}
 
+	/**
+	 * Collect results using  Caldera_Forms_Entry_Entry and Caldera_Forms_Entry_Field to represent values
+	 *
+	 * @param \stdClass[] $entriesValues
+	 * @return array
+	 */
+	private function collectResults($entriesValues)
+	{
+		$results = [];
+		foreach ($entriesValues as $entry) {
+
+			$entry = new \Caldera_Forms_Entry_Entry($entry);
+			$query = $this
+				->getQueries()
+				->entryValuesSelect()
+				->queryByEntryId($entry->id);
+			$entriesValues = $this->select($query);
+
+			$entryValuesPrepared = $this->collectEntryValues($entriesValues);
+			$results[] = [
+				'entry' => $entry,
+				'values' => $entryValuesPrepared
+			];
+		}
+		return $results;
+	}
+
+	/**
+	 * Collect entry values as Caldera_Forms_Entry_Field objects
+	 *
+	 * @param \stdClass[] $entriesValues
+	 * @return array
+	 */
+	private function collectEntryValues($entriesValues): array
+	{
+		$entryValuesPrepared = [];
+		if (!empty($entriesValues)) {
+			foreach ($entriesValues as $entryValue) {
+				$entryValuesPrepared[] = new \Caldera_Forms_Entry_Field($entryValue);
+			}
+		}
+		return $entryValuesPrepared;
+	}
+
+	/**
+	 * Do a select query
+	 *
+	 * @param SelectQueryBuilder $query
+	 * @return \stdClass[]
+	 */
+	private function select(SelectQueryBuilder $query)
+	{
+		return $this
+				->getQueries()
+				->select($query);
+	}
+
+	/**
+	 * Do a delete query
+	 *
+	 * @param DeleteQueryBuilder $query
+	 * @return \stdClass[]
+	 */
+	private function delete(DeleteQueryBuilder $query)
+	{
+		return $this->
+			getQueries()
+			->delete($query);
+	}
+
+
 }
\ No newline at end of file
diff --git a/src/Features/Queries.php b/src/Features/Queries.php
index 55c0885..0cd7204 100644
--- a/src/Features/Queries.php
+++ b/src/Features/Queries.php
@@ -5,10 +5,15 @@ namespace calderawp\CalderaFormsQuery\Features;
 
 use calderawp\CalderaFormsQuery\CreatesDeleteQueries;
 use calderawp\CalderaFormsQuery\CreatesSelectQueries;
+use calderawp\CalderaFormsQuery\Delete\DeleteQueryBuilder;
+use calderawp\CalderaFormsQuery\Delete\DoesDeleteQuery;
 use calderawp\CalderaFormsQuery\Delete\Entry as EntryDelete;
 use \calderawp\CalderaFormsQuery\Delete\EntryValues as EntryValuesDelete;
+use calderawp\CalderaFormsQuery\DeleteQueries;
+use calderawp\CalderaFormsQuery\Select\DoesSelectQuery;
 use \calderawp\CalderaFormsQuery\Select\Entry as EntrySelect;
 use \calderawp\CalderaFormsQuery\Select\EntryValues as EntryValueSelect;
+use calderawp\CalderaFormsQuery\Select\SelectQueryBuilder;
 
 class Queries implements DoesQueries
 {
@@ -34,6 +39,32 @@ class Queries implements DoesQueries
 		$this->deleteQueries = $deleteQueries;
 	}
 
+	/**
+	 * @param SelectQueryBuilder $query
+	 * @return \stdClass[]
+	 */
+	public function select( SelectQueryBuilder $query )
+	{
+		return $this
+			->selectQueries
+			->getResults(
+				$query->getPreparedSql()
+			);
+	}
+
+	/**
+	 * @param DeleteQueryBuilder $query
+	 * @return \stdClass[]
+	 */
+	public function delete( DeleteQueryBuilder $query )
+	{
+		return $this
+			->deleteQueries
+			->getResults(
+				$query->getPreparedSql()
+			);
+	}
+
 	/**
 	 * Create a new SELECT query for Entry table
 	 *
diff --git a/src/SelectQueries.php b/src/SelectQueries.php
index 8b355cd..1cc6aeb 100644
--- a/src/SelectQueries.php
+++ b/src/SelectQueries.php
@@ -62,26 +62,6 @@ class SelectQueries implements CreatesSelectQueries
 		return $this->entryGenerator;
 	}
 
-
-	/**
-	 * Get all data for a user by Id
-	 *
-	 * @param $userId
-	 * @return array
-	 */
-	public function selectByUserId($userId)
-	{
-		$this->resetEntryGenerator();
-
-		$this
-			->getEntryGenerator()
-			->queryByUserId($userId);
-
-		$entries = $this->getResults($this->getEntryGenerator()->getPreparedSql());
-
-		return $this->collectResults($entries);
-	}
-
 	/**
 	 * Reset entry generator
 	 */
@@ -98,49 +78,5 @@ class SelectQueries implements CreatesSelectQueries
 		$this->entryValueGenerator->resetQuery();
 	}
 
-	/**
-	 * Collect results using  Caldera_Forms_Entry_Entry and Caldera_Forms_Entry_Field to represent values
-	 *
-	 * @param \stdClass[] $entriesValues
-	 * @return array
-	 */
-	private function collectResults($entriesValues)
-	{
-		$results = [];
-		foreach ($entriesValues as $entry) {
-			$this->resetEntryValueGenerator();
-			$entry = new \Caldera_Forms_Entry_Entry($entry);
-			$this
-				->getEntryValueGenerator()
-				->queryByEntryId($entry->id);
-			$entriesValues =$this->getResults(
-				$this->getEntryValueGenerator()
-				->getPreparedSql()
-			);
-
-			$entryValuesPrepared = $this->collectEntryValues($entriesValues);
-			$results[] = [
-				'entry' => $entry,
-				'values' => $entryValuesPrepared
-			];
-		}
-		return $results;
-	}
 
-	/**
-	 * Collect entry values as Caldera_Forms_Entry_Field objects
-	 *
-	 * @param \stdClass[] $entriesValues
-	 * @return array
-	 */
-	private function collectEntryValues($entriesValues): array
-	{
-		$entryValuesPrepared = [];
-		if (!empty($entriesValues)) {
-			foreach ($entriesValues as $entryValue) {
-				$entryValuesPrepared[] = new \Caldera_Forms_Entry_Field($entryValue);
-			}
-		}
-		return $entryValuesPrepared;
-	}
 }
-- 
GitLab