2014-02-23 19:39:23 +01:00
|
|
|
<?php
|
2014-02-28 20:35:12 +01:00
|
|
|
use \Chibi\Sql as Sql;
|
|
|
|
|
2014-02-23 19:39:23 +01:00
|
|
|
abstract class AbstractSearchParser
|
|
|
|
{
|
|
|
|
protected $statement;
|
|
|
|
|
2014-02-28 20:35:12 +01:00
|
|
|
public function decorate(Sql\SelectStatement $statement, $filterString)
|
2014-02-23 19:39:23 +01:00
|
|
|
{
|
|
|
|
$this->statement = $statement;
|
|
|
|
|
|
|
|
$tokens = preg_split('/\s+/', $filterString);
|
|
|
|
$tokens = array_filter($tokens);
|
|
|
|
$tokens = array_unique($tokens);
|
|
|
|
$this->processSetup($tokens);
|
|
|
|
|
|
|
|
foreach ($tokens as $token)
|
|
|
|
{
|
|
|
|
$neg = false;
|
|
|
|
if ($token{0} == '-')
|
|
|
|
{
|
|
|
|
$token = substr($token, 1);
|
|
|
|
$neg = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (strpos($token, ':') !== false)
|
|
|
|
{
|
|
|
|
list ($key, $value) = explode(':', $token, 2);
|
|
|
|
$key = strtolower($key);
|
|
|
|
|
|
|
|
if ($key == 'order')
|
|
|
|
{
|
|
|
|
$this->internalProcessOrderToken($value, $neg);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!$this->processComplexToken($key, $value, $neg))
|
|
|
|
throw new SimpleException('Invalid search token: ' . $key);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!$this->processSimpleToken($token, $neg))
|
|
|
|
throw new SimpleException('Invalid search token: ' . $token);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$this->processTeardown();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function processSetup(&$tokens)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function processTeardown()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function internalProcessOrderToken($orderToken, $neg)
|
|
|
|
{
|
|
|
|
$arr = preg_split('/[;,]/', $orderToken);
|
|
|
|
if (count($arr) == 1)
|
|
|
|
$arr []= 'asc';
|
|
|
|
|
|
|
|
if (count($arr) != 2)
|
|
|
|
throw new SimpleException('Invalid search order token: ' . $orderToken);
|
|
|
|
|
|
|
|
$orderByString = strtolower(array_shift($arr));
|
|
|
|
$orderDirString = strtolower(array_shift($arr));
|
|
|
|
if ($orderDirString == 'asc')
|
2014-02-28 20:35:12 +01:00
|
|
|
$orderDir = Sql\SelectStatement::ORDER_ASC;
|
2014-02-23 19:39:23 +01:00
|
|
|
elseif ($orderDirString == 'desc')
|
2014-02-28 20:35:12 +01:00
|
|
|
$orderDir = Sql\SelectStatement::ORDER_DESC;
|
2014-02-23 19:39:23 +01:00
|
|
|
else
|
|
|
|
throw new SimpleException('Invalid search order direction: ' . $searchOrderDir);
|
|
|
|
|
|
|
|
if ($neg)
|
|
|
|
{
|
2014-02-28 20:35:12 +01:00
|
|
|
$orderDir = $orderDir == Sql\SelectStatement::ORDER_ASC
|
|
|
|
? Sql\SelectStatement::ORDER_DESC
|
|
|
|
: Sql\SelectStatement::ORDER_ASC;
|
2014-02-23 19:39:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!$this->processOrderToken($orderByString, $orderDir))
|
2014-02-24 00:11:01 +01:00
|
|
|
throw new SimpleException('Invalid search order type: ' . $orderByString);
|
2014-02-23 19:39:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
protected function processComplexToken($key, $value, $neg)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function processSimpleToken($value, $neg)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function processOrderToken($orderToken, $orderDir)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|