Add status attribute for advanced search

This commit is contained in:
Frederic Guillot
2015-06-28 20:47:39 -04:00
parent 7af5a923b0
commit 2e7e703180
5 changed files with 88 additions and 1 deletions

View File

@@ -28,6 +28,7 @@ class Lexer
"/^(assignee:)/" => 'T_ASSIGNEE', "/^(assignee:)/" => 'T_ASSIGNEE',
"/^(color:)/" => 'T_COLOR', "/^(color:)/" => 'T_COLOR',
"/^(due:)/" => 'T_DUE', "/^(due:)/" => 'T_DUE',
"/^(status:)/" => 'T_STATUS',
"/^(title:)/" => 'T_TITLE', "/^(title:)/" => 'T_TITLE',
"/^(\s+)/" => 'T_WHITESPACE', "/^(\s+)/" => 'T_WHITESPACE',
'/^([<=>]{0,2}[0-9]{4}-[0-9]{2}-[0-9]{2})/' => 'T_DATE', '/^([<=>]{0,2}[0-9]{4}-[0-9]{2}-[0-9]{2})/' => 'T_DATE',
@@ -114,10 +115,11 @@ class Lexer
break; break;
case 'T_STATUS':
case 'T_DUE': case 'T_DUE':
$next = next($tokens); $next = next($tokens);
if ($next !== false && $next['token'] === 'T_DATE') { if ($next !== false && ($next['token'] === 'T_DATE' || $next['token'] === 'T_STRING')) {
$map[$token['token']] = $next['match']; $map[$token['token']] = $next['match'];
} }

View File

@@ -53,6 +53,9 @@ class TaskFilter extends Base
case 'T_TITLE': case 'T_TITLE':
$this->filterByTitle($value); $this->filterByTitle($value);
break; break;
case 'T_STATUS':
$this->filterByStatusName($value);
break;
} }
} }
@@ -296,6 +299,22 @@ class TaskFilter extends Base
return $this; return $this;
} }
/**
* Filter by status name
*
* @access public
* @param string $status
* @return TaskFilter
*/
public function filterByStatusName($status)
{
if ($status === 'open' || $status === 'closed') {
$this->filterByStatus($status === 'open' ? Task::STATUS_OPEN : Task::STATUS_CLOSED);
}
return $this;
}
/** /**
* Filter by status * Filter by status
* *
@@ -321,6 +340,7 @@ class TaskFilter extends Base
*/ */
public function filterByDueDate($date) public function filterByDueDate($date)
{ {
$this->query->neq('date_due', '');
$this->query->neq('date_due', 0); $this->query->neq('date_due', 0);
$this->query->notNull('date_due'); $this->query->notNull('date_due');
return $this->filterWithOperator('date_due', $date, true); return $this->filterWithOperator('date_due', $date, true);

View File

@@ -12,6 +12,14 @@ This example will returns all tasks assigned to me with a due date for tomorrow
assigne:me due:tomorrow my title assigne:me due:tomorrow my title
``` ```
Search by status
----------------
Attribute: **status**
- Query to find open tasks: `status:open`
- Query to find closed tasks: `status:closed`
Search by assignee Search by assignee
------------------ ------------------

View File

@@ -66,6 +66,36 @@ class LexerTest extends Base
); );
} }
public function testStatusQuery()
{
$lexer = new Lexer;
$this->assertEquals(
array(array('match' => 'status:', 'token' => 'T_STATUS'), array('match' => 'open', 'token' => 'T_STRING')),
$lexer->tokenize('status:open')
);
$this->assertEquals(
array(array('match' => 'status:', 'token' => 'T_STATUS'), array('match' => 'closed', 'token' => 'T_STRING')),
$lexer->tokenize('status:closed')
);
$this->assertEquals(
array('T_STATUS' => 'open'),
$lexer->map($lexer->tokenize('status:open'))
);
$this->assertEquals(
array('T_STATUS' => 'closed'),
$lexer->map($lexer->tokenize('status:closed'))
);
$this->assertEquals(
array(),
$lexer->map($lexer->tokenize('status: '))
);
}
public function testDueDateQuery() public function testDueDateQuery()
{ {
$lexer = new Lexer; $lexer = new Lexer;

View File

@@ -26,6 +26,33 @@ class TaskFilterTest extends Base
$this->assertEmpty($tf->search('search something')->findAll()); $this->assertEmpty($tf->search('search something')->findAll());
} }
public function testSearchWithStatus()
{
$p = new Project($this->container);
$tc = new TaskCreation($this->container);
$tf = new TaskFilter($this->container);
$this->assertEquals(1, $p->create(array('name' => 'test')));
$this->assertNotFalse($tc->create(array('project_id' => 1, 'title' => 'my task title is awesome')));
$this->assertNotFalse($tc->create(array('project_id' => 1, 'title' => 'my task title is amazing')));
$this->assertNotFalse($tc->create(array('project_id' => 1, 'title' => 'my task title is amazing', 'is_active' => 0)));
$tf->search('status:open');
$tasks = $tf->findAll();
$this->assertNotEmpty($tasks);
$this->assertCount(2, $tasks);
$tf->search('status:plop');
$tasks = $tf->findAll();
$this->assertNotEmpty($tasks);
$this->assertCount(3, $tasks);
$tf->search('status:closed');
$tasks = $tf->findAll();
$this->assertNotEmpty($tasks);
$this->assertCount(1, $tasks);
}
public function testSearchWithDueDate() public function testSearchWithDueDate()
{ {
$dp = new DateParser($this->container); $dp = new DateParser($this->container);