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);
 }
Пример #4
0
 /**
  * @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()));
         }
     }
 }
Пример #5
0
 /**
  * @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);
 }