Skip to content

Commit

Permalink
First tests for ZendSelect
Browse files Browse the repository at this point in the history
* Split of ZendSelect
* UnitTests
  • Loading branch information
ThaDafinser committed Aug 18, 2013
1 parent bcd32c6 commit f304c89
Show file tree
Hide file tree
Showing 5 changed files with 318 additions and 110 deletions.
18 changes: 0 additions & 18 deletions src/ZfcDatagrid/DataSource/PhpArray.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,24 +50,6 @@ public function execute()
$data = $this->sortArrayMultiple($data, $this->getSortConditions());
}

// if (count($this->sortConditions) > 0) {
// $sortConditions = $this->sortConditions;

// // @todo UGLY SOLUTION!!!
// if (count($sortConditions) === 1) {
// $sort1 = $this->getSortArrayParameter($sortConditions[0]);

// $data = $this->sortArrayMultiple($data, $sort1[0], $sort1[1]);
// } elseif (count($sortConditions) === 2) {
// $sort1 = $this->getSortArrayParameter($sortConditions[0]);
// $sort2 = $this->getSortArrayParameter($sortConditions[1]);

// $data = $this->sortArrayMultiple($data, $sort1[0], $sort1[1], $sort2[0], $sort2[1]);
// } else {
// throw new \Exception('Too much column sorts defined!');
// }
// }

/**
* Step 2) Apply filters
*/
Expand Down
25 changes: 18 additions & 7 deletions src/ZfcDatagrid/DataSource/PhpArray/Filter.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,29 @@ class Filter
private $filter;

/**
*
* @param string $uniqueId
* @param array $valuesToFilter
*
* @param \ZfcDatagrid\Filter $filter
*/
public function __construct(\ZfcDatagrid\Filter $filter)
public function __construct(DatagridFilter $filter)
{
$this->filter = $filter;
}

/**
*
*
* @return \ZfcDatagrid\Filter
*/
public function getFilter()
{
return $this->filter;
}

private function getRowValue($row)
/**
*
* @param array $row
* @return Ambigous <string, unknown>
*/
private function getRowValue(array $row)
{
$rowValue = $row[$this->getFilter()
->getColumn()
Expand All @@ -44,7 +48,14 @@ private function getRowValue($row)
return $rowValue;
}

public function applyFilter($row)
/**
* Does the value get filtered?
*
* @param array $row
* @throws \Exception
* @return boolean
*/
public function applyFilter(array $row)
{
$return = false;

Expand Down
88 changes: 3 additions & 85 deletions src/ZfcDatagrid/DataSource/ZendSelect.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,99 +109,17 @@ public function execute()
}
}

$adapter = $this->sqlObject->getAdapter();
$qi = function ($name) use($adapter)
{
return $adapter->getPlatform()->quoteIdentifier($name);
};
$qv = function ($value) use($adapter)
{
return $adapter->getPlatform()->quoteValue($value);
};
$fp = function ($name) use($adapter)
{
return $adapter->getDriver()->formatParameterName($name);
};

/**
* Step 3) Apply filters
*/
$filterColumn = new ZendSelect\Filter($this->getAdapter(), $select);
foreach ($this->getFilters() as $filter) {

/* @var $filter \ZfcDatagrid\Filter */
if ($filter->isColumnFilter() === true) {
$filterColumn->applyFilter($filter);

$column = $filter->getColumn();
$colString = $column->getUniqueId();

$values = $filter->getValues();
foreach ($values as $value) {
switch ($filter->getOperator()) {

case Filter::LIKE:
$select->where->like($colString, '%' . $value . '%');
break;

case Filter::LIKE_LEFT:
$select->where->like($colString, '%' . $value);
break;

case Filter::LIKE_RIGHT:
$select->where->like($colString, $value . '%');
break;

case Filter::NOT_LIKE:
$select->where->literal($qi($colString) . ' NOT LIKE ?', array(
'%' . $value . '%'
));
break;

case Filter::NOT_LIKE_LEFT:
$select->where->literal($qi($colString) . 'NOT LIKE ?', array(
'%' . $value
));
break;

case Filter::NOT_LIKE_RIGHT:
$select->where->literal($qi($colString) . 'NOT LIKE ?', array(
$value . '%'
));
break;

case Filter::EQUAL:
$select->where->equalTo($colString, $value);
break;

case Filter::NOT_EQUAL:
$select->where->notEqualTo($colString, $value);
break;

case Filter::GREATER_EQUAL:
$select->where->greaterThanOrEqualTo($colString, $value);
break;

case Filter::GREATER:
$select->where->greaterThan($colString, $value);
break;

case Filter::LESS_EQUAL:
$select->where->lessThanOrEqualTo($colString, $value);
break;

case Filter::LESS:
$select->where->lessThan($colString, $value);
break;

case Filter::BETWEEN:
$min = min($values);
$max = max($values);
$select->where->between($colString, $min, $max);
break;

default:
throw new \Exception('This operator is currently not supported: ' . $filter->getOperator());
break;
}
}
}
}

Expand Down
146 changes: 146 additions & 0 deletions src/ZfcDatagrid/DataSource/ZendSelect/Filter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
<?php
namespace ZfcDatagrid\DataSource\ZendSelect;

use ZfcDatagrid\Filter as DatagridFilter;
use Zend\Db\Sql\Select;
use Zend\Db\Sql\Sql;
use Zend\Db\Sql\Where;
use Zend\Db\Sql\Predicate\PredicateSet;

class Filter
{

/**
*
* @var Sql
*/
private $sql;

/**
*
* @var Select
*/
private $select;

public function __construct(Sql $sql, Select $select)
{
$this->sql = $sql;
$this->select = $select;
}

/**
*
* @return \Zend\Db\Sql\Sql
*/
public function getSql()
{
return $this->sql;
}

/**
*
* @return \Zend\Db\Sql\Select
*/
public function getSelect()
{
return $this->select;
}

/**
*
* @param DatagridFilter $filter
*/
public function applyFilter(DatagridFilter $filter)
{
$select = $this->getSelect();

$adapter = $this->getSql()->getAdapter();
$qi = function ($name) use($adapter)
{
return $adapter->getPlatform()->quoteIdentifier($name);
};
$qv = function ($value) use($adapter)
{
return $adapter->getPlatform()->quoteValue($value);
};

$wheres = array();

$colString = $filter->getColumn()->getUniqueId();
$values = $filter->getValues();
foreach ($values as $value) {
$where = new Where();

switch ($filter->getOperator()) {

case DatagridFilter::LIKE:
$wheres[] = $where->like($colString, '%' . $value . '%');
break;

case DatagridFilter::LIKE_LEFT:
$wheres[] = $where->like($colString, '%' . $value);
break;

case DatagridFilter::LIKE_RIGHT:
$wheres[] = $where->like($colString, $value . '%');
break;

case DatagridFilter::NOT_LIKE:
$wheres[] = $where->literal($qi($colString) . ' NOT LIKE ?', array(
'%' . $value . '%'
));
break;

case DatagridFilter::NOT_LIKE_LEFT:
$wheres[] = $where->literal($qi($colString) . 'NOT LIKE ?', array(
'%' . $value
));
break;

case DatagridFilter::NOT_LIKE_RIGHT:
$wheres[] = $where->literal($qi($colString) . 'NOT LIKE ?', array(
$value . '%'
));
break;

case DatagridFilter::EQUAL:
$wheres[] = $where->equalTo($colString, $value);
break;

case DatagridFilter::NOT_EQUAL:
$wheres[] = $where->notEqualTo($colString, $value);
break;

case DatagridFilter::GREATER_EQUAL:
$wheres[] = $where->greaterThanOrEqualTo($colString, $value);
break;

case DatagridFilter::GREATER:
$wheres[] = $where->greaterThan($colString, $value);
break;

case DatagridFilter::LESS_EQUAL:
$wheres[] = $where->lessThanOrEqualTo($colString, $value);
break;

case DatagridFilter::LESS:
$wheres[] = $where->lessThan($colString, $value);
break;

case DatagridFilter::BETWEEN:
$min = min($values);
$max = max($values);
$wheres[] = $where->between($colString, $min, $max);
break 2;

default:
throw new \Exception('This operator is currently not supported: ' . $filter->getOperator());
break;
}
}

$set = new PredicateSet($wheres, PredicateSet::OP_OR);

$select->where->andPredicate($set);
}
}
Loading

0 comments on commit f304c89

Please sign in to comment.