public function testNoJoins() { $en = 'Acme\\Entity\\TestEntity'; $definition = ['columns' => [['name' => 'column1', 'label' => 'lbl1', 'sorting' => '']], 'filters' => []]; $doctrine = $this->getDoctrine([$en => ['column1' => 'string']]); $model = new QueryDesignerModel(); $model->setEntity($en); $model->setDefinition(json_encode($definition)); $builder = $this->createDatagridConfigurationBuilder($model, $doctrine); $result = $builder->getConfiguration()->toArray(); $expected = ['source' => ['type' => 'orm', 'query' => ['select' => ['t1.column1 as c1'], 'from' => [['table' => $en, 'alias' => 't1']]], 'query_config' => ['table_aliases' => ['' => 't1'], 'column_aliases' => ['column1' => 'c1']], 'hints' => [['name' => Query::HINT_CUSTOM_OUTPUT_WALKER, 'value' => 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker']]], 'columns' => ['c1' => ['label' => 'lbl1', 'frontend_type' => 'string', 'translatable' => false]], 'name' => 'test_grid', 'sorters' => ['columns' => ['c1' => ['data_name' => 'c1']]], 'filters' => ['columns' => ['c1' => ['data_name' => 'c1', 'type' => 'string', 'translatable' => false]]]]; $this->assertEquals($expected, $result); }
/** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testVirtualColumns() { $en = 'Acme\\Entity\\TestEntity'; $definition = ['columns' => [['name' => 'vc1', 'label' => 'lbl1'], ['name' => 'vc2', 'label' => 'lbl2']], 'filters' => []]; $doctrine = $this->getDoctrine([$en => ['column1' => 'string', 'rc1' => ['nullable' => true]]]); $virtualColumnProvider = $this->getVirtualFieldProvider([[$en, 'vc1', ['select' => ['expr' => 'country.name', 'return_type' => 'string'], 'join' => ['left' => [['join' => 'entity.country', 'alias' => 'country']]]]], [$en, 'vc2', ['select' => ['expr' => 'country.iso2Code', 'return_type' => 'string'], 'join' => ['left' => [['join' => 'entity.country', 'alias' => 'country']]]]]]); $model = new QueryDesignerModel(); $model->setEntity($en); $model->setDefinition(json_encode($definition)); $builder = $this->createDatagridConfigurationBuilder($model, $doctrine, null, $virtualColumnProvider); $result = $builder->getConfiguration()->toArray(); $expected = ['name' => 'test_grid', 'columns' => ['c1' => ['frontend_type' => 'string', 'label' => 'lbl1', 'translatable' => false], 'c2' => ['frontend_type' => 'string', 'label' => 'lbl2', 'translatable' => false]], 'sorters' => ['columns' => ['c1' => ['data_name' => 'c1'], 'c2' => ['data_name' => 'c2']]], 'filters' => ['columns' => ['c1' => ['type' => 'string', 'data_name' => 'c1', 'translatable' => false], 'c2' => ['type' => 'string', 'data_name' => 'c2', 'translatable' => false]]], 'source' => ['query' => ['select' => ['t2.name as c1', 't2.iso2Code as c2'], 'from' => [['table' => $en, 'alias' => 't1']], 'join' => ['left' => [['join' => 't1.country', 'alias' => 't2']]]], 'query_config' => ['table_aliases' => ['' => 't1', 't1.country|left' => 't2'], 'column_aliases' => ['vc1' => 'c1', 'vc2' => 'c2']], 'type' => 'orm', 'hints' => [['name' => Query::HINT_CUSTOM_OUTPUT_WALKER, 'value' => 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker']]]]; $this->assertEquals($expected, $result); }
/** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testComplexQuery() { $en = 'Acme\\Entity\\TestEntity'; $en1 = 'Acme\\Entity\\TestEntity1'; $en2 = 'Acme\\Entity\\TestEntity2'; $en3 = 'Acme\\Entity\\TestEntity3'; $definition = ['columns' => [['name' => 'column1', 'label' => 'lbl1', 'sorting' => 'DESC'], ['name' => 'rc1+' . $en1 . '::column2', 'label' => 'lbl2', 'sorting' => ''], ['name' => 'rc2+' . $en2 . '::column3', 'label' => 'lbl3', 'sorting' => 'ASC']], 'filters' => [['columnName' => 'rc1+' . $en1 . '::column2', 'criterion' => ['filter' => 'string', 'data' => ['type' => '1', 'value' => 'test']]], 'OR', [['columnName' => 'rc1+' . $en1 . '::rc4+' . $en3 . '::column5', 'criterion' => ['filter' => 'string', 'data' => ['type' => '1', 'value' => 'test']]], 'and', ['columnName' => 'rc1+' . $en1 . '::rc4+' . $en3 . '::column6', 'criterion' => ['filter' => 'string', 'data' => ['type' => '1', 'value' => 'test']]]]]]; $doctrine = $this->getDoctrine([$en => ['column1' => 'string', 'rc1' => ['nullable' => true], 'rc2' => ['nullable' => true]], $en1 => ['column2' => 'integer', 'rc4' => ['nullable' => true]], $en2 => ['column3' => 'float'], $en3 => ['column5' => 'string']]); $model = new QueryDesignerModel(); $model->setEntity($en); $model->setDefinition(json_encode($definition)); $builder = $this->createDatagridConfigurationBuilder($model, $doctrine); $result = $builder->getConfiguration()->toArray(); $expected = ['source' => ['type' => 'orm', 'query' => ['select' => ['t1.column1 as c1', 't2.column2 as c2', 't4.column3 as c3'], 'from' => [['table' => $en, 'alias' => 't1']], 'join' => ['left' => [['join' => 't1.rc1', 'alias' => 't2'], ['join' => 't2.rc4', 'alias' => 't3'], ['join' => 't1.rc2', 'alias' => 't4']]]], 'query_config' => ['table_aliases' => ['' => 't1', $en . '::rc1' => 't2', $en . '::rc1+' . $en1 . '::rc4' => 't3', $en . '::rc2' => 't4'], 'column_aliases' => ['column1' => 'c1', 'rc1+' . $en1 . '::column2' => 'c2', 'rc2+' . $en2 . '::column3' => 'c3'], 'filters' => [['column' => 't2.column2', 'filter' => 'string', 'filterData' => ['type' => '1', 'value' => 'test'], 'columnAlias' => 'c2'], 'OR', [['column' => 't3.column5', 'filter' => 'string', 'filterData' => ['type' => '1', 'value' => 'test']], 'AND', ['column' => 't3.column6', 'filter' => 'string', 'filterData' => ['type' => '1', 'value' => 'test']]]]], 'hints' => [['name' => Query::HINT_CUSTOM_OUTPUT_WALKER, 'value' => 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker']]], 'columns' => ['c1' => ['label' => 'lbl1', 'frontend_type' => 'string', 'translatable' => false], 'c2' => ['label' => 'lbl2', 'frontend_type' => 'integer', 'translatable' => false], 'c3' => ['label' => 'lbl3', 'frontend_type' => 'decimal', 'translatable' => false]], 'sorters' => ['columns' => ['c1' => ['data_name' => 'c1'], 'c2' => ['data_name' => 'c2'], 'c3' => ['data_name' => 'c3']], 'default' => ['c1' => 'DESC', 'c3' => 'ASC']], 'name' => 'test_grid', 'filters' => ['columns' => ['c1' => ['data_name' => 'c1', 'type' => 'string', 'translatable' => false], 'c2' => ['data_name' => 'c2', 'type' => 'number', 'translatable' => false], 'c3' => ['data_name' => 'c3', 'type' => 'number', 'translatable' => false]]]]; $this->assertEquals($expected, $result); }
/** * @dataProvider invalidFiltersStructureProvider */ public function testInvalidFiltersStructure($expectedExceptionMessage, $filters) { $en = 'Acme\\Entity\\TestEntity'; $definition = ['columns' => [['name' => 'column1', 'label' => 'lbl1', 'sorting' => '']], 'filters' => $filters]; $doctrine = $this->getDoctrine([$en => ['column1' => 'string']]); $model = new QueryDesignerModel(); $model->setEntity($en); $model->setDefinition(json_encode($definition)); try { $builder = $this->createDatagridConfigurationBuilder($model, $doctrine); $builder->getConfiguration()->toArray(); $this->fail('Expected "Oro\\Bundle\\QueryDesignerBundle\\Exception\\InvalidFiltersException" exception.'); } catch (InvalidFiltersException $ex) { if (false === strpos($ex->getMessage(), $expectedExceptionMessage)) { $this->fail(sprintf('Expected exception message "%s", but given "%s".', $expectedExceptionMessage, $ex->getMessage())); } } }
/** * @param array $columns * @param array $virtualRelationQuery * @param array $expected * * @dataProvider virtualRelationsDataProvider */ public function testVirtualColumns(array $columns, array $virtualRelationQuery, array $expected) { $entity = 'Acme\\Entity\\TestEntity'; $doctrine = $this->getDoctrine([$entity => [], 'Oro\\Bundle\\TrackingBundle\\Entity\\TrackingEvent' => [], 'Oro\\Bundle\\TrackingBundle\\Entity\\TrackingWebsite' => [], 'Oro\\Bundle\\TrackingBundle\\Entity\\Campaign' => [], 'Oro\\Bundle\\TrackingBundle\\Entity\\List' => [], 'Oro\\Bundle\\TrackingBundle\\Entity\\ListItem' => []]); $virtualColumnProvider = $this->getVirtualFieldProvider(); $model = new QueryDesignerModel(); $model->setEntity($entity); $model->setDefinition(json_encode(['columns' => $columns])); $builder = $this->createDatagridConfigurationBuilder($model, $doctrine, null, $virtualColumnProvider); /** @var \PHPUnit_Framework_MockObject_MockObject|VirtualRelationProviderInterface $virtualRelationProvider */ $virtualRelationProvider = $this->getMock('Oro\\Bundle\\EntityBundle\\Provider\\VirtualRelationProviderInterface'); $virtualRelationProvider->expects($this->any())->method('isVirtualRelation')->will($this->returnCallback(function ($className, $fieldName) use($virtualRelationQuery) { return !empty($virtualRelationQuery[$className][$fieldName]); })); $virtualRelationProvider->expects($this->any())->method('getVirtualRelationQuery')->will($this->returnCallback(function ($className, $fieldName) use($virtualRelationQuery) { if (empty($virtualRelationQuery[$className][$fieldName])) { return []; } return $virtualRelationQuery[$className][$fieldName]; })); $virtualRelationProvider->expects($this->any())->method('getTargetJoinAlias')->will($this->returnCallback(function ($className, $fieldName) use($virtualRelationQuery) { if (!empty($virtualRelationQuery[$className][$fieldName]['target_join_alias'])) { return $virtualRelationQuery[$className][$fieldName]['target_join_alias']; } $joins = []; foreach ($virtualRelationQuery[$className][$fieldName]['join'] as $typeJoins) { $joins = array_merge($joins, $typeJoins); } if (1 === count($joins)) { $join = reset($joins); return $join['alias']; } return null; })); $builder->setVirtualRelationProvider($virtualRelationProvider); $this->assertEquals($expected, $builder->getConfiguration()->toArray()['source']['query']); }
/** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testComplexQuery() { $gridName = 'test_grid'; $en = 'Acme\\Entity\\TestEntity'; $en1 = 'Acme\\Entity\\TestEntity1'; $en2 = 'Acme\\Entity\\TestEntity2'; $en3 = 'Acme\\Entity\\TestEntity3'; $definition = ['columns' => [['name' => 'column1', 'label' => 'lbl1', 'sorting' => 'DESC'], ['name' => 'rc1,' . $en1 . '::column2', 'label' => 'lbl2', 'sorting' => ''], ['name' => 'rc2,' . $en2 . '::column3', 'label' => 'lbl3', 'sorting' => 'ASC']], 'filters' => [['columnName' => 'rc1,' . $en1 . '::column2', 'criterion' => ['filter' => 'string', 'data' => ['type' => '1', 'value' => 'test']]], ['columnName' => 'rc1,' . $en1 . '::rc4,' . $en3 . '::column5', 'criterion' => ['filter' => 'string', 'data' => ['type' => '1', 'value' => 'test']]], ['columnName' => 'rc1,' . $en1 . '::rc4,' . $en3 . '::column6', 'criterion' => ['filter' => 'string', 'data' => ['type' => '1', 'value' => 'test']]]], 'filters_logic' => ' 1 OR ( 2 And ( ( 3 or 1 ) oR 2) ) ']; $doctrine = $this->getDoctrine([$en => ['column1' => 'string'], $en1 => ['column2' => 'integer'], $en2 => ['column3' => 'float']]); $model = new QueryDesignerModel(); $model->setEntity($en); $model->setDefinition(json_encode($definition)); $builder = new DatagridConfigurationBuilder($gridName, $model, $doctrine); $result = $builder->getConfiguration()->toArray(); $expected = ['source' => ['type' => 'orm', 'query' => ['select' => ['t1.column1 as c1', 't2.column2 as c2', 't4.column3 as c3'], 'from' => [['table' => $en, 'alias' => 't1']], 'join' => ['left' => [['join' => 't1.rc1', 'alias' => 't2'], ['join' => 't2.rc4', 'alias' => 't3'], ['join' => 't1.rc2', 'alias' => 't4']]]], 'query_config' => ['table_aliases' => ['' => 't1', $en . '::rc1' => 't2', $en . '::rc1,' . $en1 . '::rc4' => 't3', $en . '::rc2' => 't4'], 'column_aliases' => ['column1' => 'c1', 'rc1,' . $en1 . '::column2' => 'c2', 'rc2,' . $en2 . '::column3' => 'c3'], 'filters' => [['column' => 't2.column2', 'filter' => 'string', 'filterData' => ['type' => '1', 'value' => 'test'], 'columnAlias' => 'c2'], 'OR', [['column' => 't3.column5', 'filter' => 'string', 'filterData' => ['type' => '1', 'value' => 'test']], 'AND', [[['column' => 't3.column6', 'filter' => 'string', 'filterData' => ['type' => '1', 'value' => 'test']], 'OR', ['column' => 't2.column2', 'filter' => 'string', 'filterData' => ['type' => '1', 'value' => 'test'], 'columnAlias' => 'c2']], 'OR', ['column' => 't3.column5', 'filter' => 'string', 'filterData' => ['type' => '1', 'value' => 'test']]]]]]], 'columns' => ['c1' => ['label' => 'lbl1', 'frontend_type' => 'string'], 'c2' => ['label' => 'lbl2', 'frontend_type' => 'integer'], 'c3' => ['label' => 'lbl3', 'frontend_type' => 'decimal']], 'sorters' => ['columns' => ['c1' => ['data_name' => 't1.column1'], 'c2' => ['data_name' => 't2.column2'], 'c3' => ['data_name' => 't4.column3']], 'default' => ['c1' => 'DESC', 'c3' => 'ASC']], 'name' => $gridName, 'filters' => ['columns' => ['c1' => ['data_name' => 't1.column1', 'type' => 'string'], 'c2' => ['data_name' => 't2.column2', 'type' => 'number'], 'c3' => ['data_name' => 't4.column3', 'type' => 'number']]]]; $this->assertEquals($expected, $result); }