Allow search by task id

This commit is contained in:
Frederic Guillot 2015-07-04 18:01:42 -04:00
parent 198f3eda90
commit 32ddfb3fba
5 changed files with 64 additions and 2 deletions

View File

@ -40,6 +40,7 @@ class Lexer
'/^(yesterday|tomorrow|today)/' => 'T_DATE',
'/^("(.*?)")/' => 'T_STRING',
"/^(\w+)/" => 'T_STRING',
"/^(#\d+)/" => 'T_STRING',
);
/**

View File

@ -173,7 +173,7 @@ class TaskFilter extends Base
}
/**
* Filter by title
* Filter by title or id if the string is like #123 or an integer
*
* @access public
* @param string $title
@ -181,7 +181,16 @@ class TaskFilter extends Base
*/
public function filterByTitle($title)
{
$this->query->ilike(Task::TABLE.'.title', '%'.$title.'%');
if (strlen($title) > 1 && $title{0} === '#' && ctype_digit(substr($title, 1))) {
$this->query->eq(Task::TABLE.'.id', substr($title, 1));
}
else if (ctype_digit($title)) {
$this->query->eq(Task::TABLE.'.id', $title);
}
else {
$this->query->ilike(Task::TABLE.'.title', '%'.$title.'%');
}
return $this;
}

View File

@ -12,6 +12,12 @@ This example will returns all tasks assigned to me with a due date for tomorrow
assigne:me due:tomorrow my title
```
Search by task id or title
--------------------------
- Search by task id: `#123` or `123`
- Search by task title: anything that don't match any search attributes mentioned below
Search by status
----------------

View File

@ -340,6 +340,11 @@ class LexerTest extends Base
$lexer->map($lexer->tokenize('my title '))
);
$this->assertEquals(
array('T_TITLE' => '#123'),
$lexer->map($lexer->tokenize('#123'))
);
$this->assertEquals(
array(),
$lexer->map($lexer->tokenize('color:assignee:'))

View File

@ -27,6 +27,47 @@ class TaskFilterTest extends Base
$this->assertEmpty($tf->search('search something')->findAll());
}
public function testSearchById()
{
$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' => 'task1')));
$this->assertNotFalse($tc->create(array('project_id' => 1, 'title' => 'task2')));
$tf->search('#2');
$tasks = $tf->findAll();
$this->assertNotEmpty($tasks);
$this->assertCount(1, $tasks);
$this->assertEquals('task2', $tasks[0]['title']);
$tf->search('1');
$tasks = $tf->findAll();
$this->assertNotEmpty($tasks);
$this->assertCount(1, $tasks);
$this->assertEquals('task1', $tasks[0]['title']);
$tf->search('something');
$tasks = $tf->findAll();
$this->assertEmpty($tasks);
$tf->search('#');
$tasks = $tf->findAll();
$this->assertEmpty($tasks);
$tf->search('#abcd');
$tasks = $tf->findAll();
$this->assertEmpty($tasks);
$tf->search('task1');
$tasks = $tf->findAll();
$this->assertNotEmpty($tasks);
$this->assertCount(1, $tasks);
$this->assertEquals('task1', $tasks[0]['title']);
}
public function testSearchWithReference()
{
$p = new Project($this->container);