Skip to content

Commit

Permalink
test all green
Browse files Browse the repository at this point in the history
  • Loading branch information
Mauro Cassani committed Feb 6, 2018
1 parent b7bfb76 commit 91a87ad
Show file tree
Hide file tree
Showing 9 changed files with 108 additions and 78 deletions.
10 changes: 9 additions & 1 deletion src/Collections/DataCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
class DataCollection implements \IteratorAggregate, \Countable
{
/**
* @var array
* @var \ArrayObject
*/
private $items = [];

Expand Down Expand Up @@ -59,4 +59,12 @@ public function count()
{
return count($this->items);
}

/**
* @return array
*/
public function toArray()
{
return (array)$this->items;
}
}
61 changes: 30 additions & 31 deletions src/Importer.php
Original file line number Diff line number Diff line change
Expand Up @@ -155,24 +155,23 @@ public static function init(
/**
* @return string
*/
public function getQuery()
public function getQueries()
{
$class = $this->getQueryClass();
$method = $this->getQueryMethod();
$queryBuilder = $this->getQueryBuilder();

/** @var $class QueryBuilderInterface */
return (new $class(
return (new $queryBuilder(
$this->table,
$this->mapping,
$this->data,
$this->skipDuplicates
))->$method();
))->getQueries($this->mode);
}

/**
* @return string
*/
private function getQueryClass()
private function getQueryBuilder()
{
switch ($this->driver) {
case 'pdo_mysql':
Expand All @@ -183,40 +182,24 @@ private function getQueryClass()
}
}

/**
* @return string
*/
private function getQueryMethod()
{
switch ($this->mode){
case 'single':
return 'getSingleInsertQueries';

case 'multiple':
return 'getMultipleInsertQuery';
}
}

/**
* @return bool
*/
public function executeQuery()
public function execute()
{
switch ($this->mode){
case 'single':
return $this->executeSingleInsertQueries();

case 'multiple':
return $this->executeMultipleInsertQuery();
}
}

/**
* @return bool
*/
private function executeSingleInsertQueries()
{
$queries = $this->getQuery();
$queries = $this->getQueries();
$c = 0;

foreach ($queries as $query){
Expand All @@ -231,23 +214,39 @@ private function executeSingleInsertQueries()

return true;
}

/**
* @return bool
*/
private function executeMultipleInsertQuery()
{
$stmt = $this->dbal->prepare($this->getQuery());
$c = 1;
$queries = $this->getQueries();

foreach ($this->data as $item) {
$this->bindValuesToItem($item, $stmt, $c);
$c++;
/** @var QueryBuilderInterface $queryBuilder */
$queryBuilder = $this->getQueryBuilder();
$limit = $queryBuilder::MULTIPLE_QUERY_IMPORT_LIMIT;
$start = 0;

foreach ($queries as $query){
$stmt = $this->dbal->prepare($query);
$c = 1;
$d = array_slice($this->data->toArray(), ($start*$limit), $limit);

foreach ($d as $item) {
$this->bindValuesToItem($item, $stmt, $c);
$c++;
}

$start++;

if(false === $stmt->execute()){
return false;
}
}

return $stmt->execute();
return true;
}


/**
* @param $item
* @param $index
Expand Down
21 changes: 14 additions & 7 deletions src/QueryBuilder/AbstractQueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,16 +59,23 @@ protected function appendComma($index, $array)
}

/**
* @return string
* @return array
*/
protected function getMultipleInsertQueryBody()
protected function getMultipleInsertQueriesBody($limit)
{
$sql = '';
$count = $this->data->count();
$sql = [];
$data = array_chunk($this->data->toArray(), $limit, true);

for ($c = 1; $c <= $count; $c++) {
$sql .= '('.$this->getItemPlaceholders($c).')';
$sql .= $this->appendComma($c, $this->data);
foreach ($data as $array) {
$count = count($array);
$string = '';

for ($c = 1; $c <= $count; $c++) {
$string .= '('.$this->getItemPlaceholders($c).')';
$string .= $this->appendComma($c, $array);
}

$sql[] = $string;
}

return $sql;
Expand Down
12 changes: 6 additions & 6 deletions src/QueryBuilder/Contracts/QueryBuilderInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
interface QueryBuilderInterface
{
/**
* Returns the full multiple insert query
*
* @return string
* Default multiple query import limit
* Override this value in concrete implementation
*/
public function getMultipleInsertQuery();
const MULTIPLE_QUERY_IMPORT_LIMIT = 1000;

/**
* Returns the array of single insert query
* Returns the array of insert queries
* @param string $mode
*
* @return array
*/
public function getSingleInsertQueries();
public function getQueries($mode = 'multiple');
}
28 changes: 17 additions & 11 deletions src/QueryBuilder/MySqlQueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

class MySqlQueryBuilder extends AbstractQueryBuilder
{
const MULTIPLE_QUERY_IMPORT_LIMIT = 4000;

/**
* @return string
*/
Expand Down Expand Up @@ -49,25 +51,29 @@ private function getQueryTail()
}

/**
* @return string
*/
public function getMultipleInsertQuery()
{
return $this->getQueryHead().$this->getMultipleInsertQueryBody().$this->getQueryTail();
}

/**
* Returns the array of insert queries
* @param string $mode
*
* @return array
*/
public function getSingleInsertQueries()
public function getQueries($mode = 'multiple')
{
$sql = [];
$queries = $this->getSingleInsertQueriesBody();

switch ($mode) {
case 'multiple':
$queries = $this->getMultipleInsertQueriesBody(self::MULTIPLE_QUERY_IMPORT_LIMIT);
break;

case 'single':
$queries = $this->getSingleInsertQueriesBody();
break;
}

foreach ($queries as $query){
$sql[] = $this->getQueryHead().$query.$this->getQueryTail();
}

return $sql ;
return $sql;
}
}
28 changes: 17 additions & 11 deletions src/QueryBuilder/SqliteQueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

class SqliteQueryBuilder extends AbstractQueryBuilder
{
const MULTIPLE_QUERY_IMPORT_LIMIT = 100;

/**
* @return string
*/
Expand Down Expand Up @@ -31,25 +33,29 @@ private function getQueryHead()
}

/**
* @return string
*/
public function getMultipleInsertQuery()
{
return $this->getQueryHead().$this->getMultipleInsertQueryBody();
}

/**
* Returns the array of insert queries
* @param string $mode
*
* @return array
*/
public function getSingleInsertQueries()
public function getQueries($mode = 'multiple')
{
$sql = [];
$queries = $this->getSingleInsertQueriesBody();

switch ($mode) {
case 'multiple':
$queries = $this->getMultipleInsertQueriesBody(self::MULTIPLE_QUERY_IMPORT_LIMIT);
break;

case 'single':
$queries = $this->getSingleInsertQueriesBody();
break;
}

foreach ($queries as $query){
$sql[] = $this->getQueryHead().$query;
}

return $sql ;
return $sql;
}
}
2 changes: 1 addition & 1 deletion tests/BaseTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ protected function executeQueryAndPerformTests(
{
$this->createSchema($connection, $tableName, $keys, $uniqueKeys);
$this->assertInstanceOf(Importer::class, $importer);
$this->assertTrue($importer->executeQuery());
$this->assertTrue($importer->execute());
}

/**
Expand Down
12 changes: 7 additions & 5 deletions tests/MySqlQueryBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,13 @@ public function it_should_returns_the_correct_multiple_insert_query()
true
);

$query = $qb->getMultipleInsertQuery();
$expectedQuery = 'INSERT IGNORE INTO `example_table` (`id`, `name`, `username`) VALUES (:id_utente_1, :name_utente_1, :username_utente_1), (:id_utente_2, :name_utente_2, :username_utente_2), (:id_utente_3, :name_utente_3, :username_utente_3) ON DUPLICATE KEY UPDATE `id`=VALUES(id), `name`=VALUES(name), `username`=VALUES(username)';
$queries = $qb->getQueries();
foreach ($queries as $query){
$expectedQuery = 'INSERT IGNORE INTO `example_table` (`id`, `name`, `username`) VALUES (:id_utente_1, :name_utente_1, :username_utente_1), (:id_utente_2, :name_utente_2, :username_utente_2), (:id_utente_3, :name_utente_3, :username_utente_3) ON DUPLICATE KEY UPDATE `id`=VALUES(id), `name`=VALUES(name), `username`=VALUES(username)';

$this->assertInstanceOf(QueryBuilderInterface::class, $qb);
$this->assertEquals($query, $expectedQuery);
$this->assertInstanceOf(QueryBuilderInterface::class, $qb);
$this->assertEquals($query, $expectedQuery);
}
}

/**
Expand Down Expand Up @@ -91,7 +93,7 @@ public function it_should_returns_the_correct_single_insert_query()
true
);

$queries = $qb->getSingleInsertQueries();
$queries = $qb->getQueries('single');
foreach ($queries as $query){
$expectedQuery = 'INSERT IGNORE INTO `example_table` (`id`, `name`, `username`) VALUES (:id_utente, :name_utente, :username_utente) ON DUPLICATE KEY UPDATE `id`=VALUES(id), `name`=VALUES(name), `username`=VALUES(username)';

Expand Down
12 changes: 7 additions & 5 deletions tests/SqliteQueryBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,13 @@ public function it_should_returns_the_correct_multiple_insert_query()
true
);

$query = $qb->getMultipleInsertQuery();
$expectedQuery = 'INSERT OR IGNORE INTO `example_table` (`id`, `name`, `username`) VALUES (:id_utente_1, :name_utente_1, :username_utente_1), (:id_utente_2, :name_utente_2, :username_utente_2), (:id_utente_3, :name_utente_3, :username_utente_3)';
$queries = $qb->getQueries();
foreach ($queries as $query){
$expectedQuery = 'INSERT OR IGNORE INTO `example_table` (`id`, `name`, `username`) VALUES (:id_utente_1, :name_utente_1, :username_utente_1), (:id_utente_2, :name_utente_2, :username_utente_2), (:id_utente_3, :name_utente_3, :username_utente_3)';

$this->assertInstanceOf(QueryBuilderInterface::class, $qb);
$this->assertEquals($query, $expectedQuery);
$this->assertInstanceOf(QueryBuilderInterface::class, $qb);
$this->assertEquals($query, $expectedQuery);
}
}

/**
Expand Down Expand Up @@ -91,7 +93,7 @@ public function it_should_returns_the_correct_single_insert_query()
true
);

$queries = $qb->getSingleInsertQueries();
$queries = $qb->getQueries('single');
foreach ($queries as $query){
$expectedQuery = 'INSERT OR IGNORE INTO `example_table` (`id`, `name`, `username`) VALUES (:id_utente, :name_utente, :username_utente)';

Expand Down

0 comments on commit 91a87ad

Please sign in to comment.