public function testRead() { $data = [['id' => 1, 'name' => 'foo', 'group' => 'admin'], ['id' => 2, 'name' => 'bar', 'group' => 'user'], ['id' => 3, 'name' => 'foobar', 'group' => 'user'], ['id' => 4, 'name' => 'foo', 'group' => 'admin'], ['id' => 5, 'name' => 'baz', 'group' => 'user'], ['id' => 6, 'name' => 'foobaz', 'group' => 'user']]; // Select all $source = new ArrayDataSource($data); $selection = new ReadSelectionBuilder($source); $this->assertEquals(6, count($selection->toArray())); $this->assertEquals($data, $selection->toArray()); // Select with a predicate $source = new ArrayDataSource($data); $selection = new ReadSelectionBuilder($source); $selection = $selection->where('group = %s', 'user'); $this->assertEquals(4, count($selection->toArray())); $this->assertNotContains($data[0], $selection->toArray()); $this->assertContains($data[1], $selection->toArray()); // Select with groups $source = new ArrayDataSource($data); $selection = new ReadSelectionBuilder($source); $selection = $selection->groupBy(['group']); $this->assertEquals(2, count($selection->toArray())); $source = new ArrayDataSource($data); $selection = new ReadSelectionBuilder($source); $selection = $selection->groupBy(['group', 'name'], E::e('name in %s()', ['foo', 'bar', 'foobar'])); $this->assertEquals(3, count($selection->toArray())); // Select with limit $source = new ArrayDataSource($data); $selection = new ReadSelectionBuilder($source); $selection = $selection->limit(1); $this->assertEquals(1, count($selection->toArray())); $this->assertContains($data[0], $selection->toArray()); // Select with projection $source = new ArrayDataSource($data); $selection = new ReadSelectionBuilder($source); $projection = $selection->select(['n' => 'name']); $this->assertEquals(6, iterator_count($projection)); foreach ($projection as $record) { $this->assertEquals(['n'], array_keys($record)); } }
/** * Make a projection. * * @param string|string[]|Expression|Expression[] $expression * Expression or array of expressions (if the keys are strings, * they are used as aliases). * @param string $alias * Alias. * @return \Iterator A {@see Record} iterator. * @todo Rename to 'project' ? */ public function select($expression, $alias = null) { $selection = new ReadSelectionBuilder($this->getSource()); return $selection->select($expression, $alias); }