Esempio n. 1
0
 /**
  * Constructor needs the columns descriptor to figure out appropriate filtering methods
  * and translate identifiers.
  *
  * @param TableBundleExtensionContainer                               $extensionContainer
  * @param \Netdudes\DataSourceryBundle\DataSource\DataSourceInterface $dataSource
  * @param bool                                                        $caseSensitive
  */
 public function __construct(TableBundleExtensionContainer $extensionContainer, DataSourceInterface $dataSource, $caseSensitive = true)
 {
     $this->extensionContainer = $extensionContainer;
     $this->dataSource = $dataSource;
     $this->caseSensitive = $caseSensitive;
     // Cache an array of data sources (name => object pairs) for reference during the interpretation
     $this->dataSourceElements = array_combine(array_map(function (FieldInterface $element) use($caseSensitive) {
         return $caseSensitive ? $element->getUniqueName() : strtolower($element->getUniqueName());
     }, $this->dataSource->getFields()), $this->dataSource->getFields());
 }
 /**
  * Transforms a fully-built query builder into a row collection with the results
  *
  * @param QueryBuilder        $queryBuilder
  *
  * @param Query               $query
  * @param DataSourceInterface $dataSource
  *
  * @return array
  * @throws ColumnNotSelectedException
  * @throws \Netdudes\DataSourceryBundle\DataSource\Driver\Doctrine\Exception\ColumnNotFoundException
  *
  */
 protected function fetchData(QueryBuilder $queryBuilder, Query $query, DataSourceInterface $dataSource)
 {
     $fields = $dataSource->getFields();
     $rowCollection = [];
     $queryResults = $queryBuilder->getQuery()->getResult();
     foreach ($queryResults as $queryResultsRow) {
         $row = [];
         foreach ($fields as $queryBuilderDataSourceField) {
             if (!in_array($queryBuilderDataSourceField->getUniqueName(), $query->getSelect(), true)) {
                 continue;
             }
             $row[$queryBuilderDataSourceField->getUniqueName()] = $this->getCellValueByDataSourceField($queryResultsRow, $queryBuilderDataSourceField, $fields);
         }
         $rowCollection[] = $row;
     }
     $event = new PostFetchEvent($dataSource, $rowCollection);
     $dataSource->getEventDispatcher()->dispatch(self::EVENT_POST_FETCH, $event);
     return $event->data;
 }
Esempio n. 3
0
 /**
  * Gets the fully generated query builder. Will autogenerate select and
  * join statements as needed.
  *
  * This function is cached, and will only be generated once per execution.
  *
  * @param Query $query
  *
  * @return QueryBuilder|null
  */
 public function buildQueryBuilder(Query $query, $entityClass)
 {
     $queryBuilder = $this->entityManager->createQueryBuilder();
     $queryBuilder->from($entityClass, $this->getFromAlias());
     $select = $this->selectGenerator->generate($query);
     $event = new GenerateSelectsEvent($select, $this->getFromAlias());
     $this->dataSource->getEventDispatcher()->dispatch(DoctrineDriver::EVENT_GENERATE_SELECTS, $event);
     $select = $event->select;
     $queryBuilder->add('select', $select);
     $joins = $this->joinGenerator->generate($query);
     $event = new GenerateJoinsEvent($this->getFromAlias(), $joins);
     $this->dataSource->getEventDispatcher()->dispatch(DoctrineDriver::EVENT_GENERATE_JOINS, $event);
     $joins = $event->joins;
     foreach ($joins as $join) {
         $queryBuilder->leftJoin($join->getJoin(), $join->getAlias(), $join->getConditionType(), $join->getCondition(), $join->getIndexBy());
     }
     $this->filterer->filter($queryBuilder, $query->getFilter(), $this->selectGenerator->getUniqueNameToSelectFieldMap($query));
     $this->sorter->sort($queryBuilder, $query->getSort(), $this->selectGenerator->getUniqueNameToSelectFieldMap($query));
     $this->paginator->paginate($queryBuilder, $query->getPagination(), $this->dataSource->getFields());
     $this->dataSource->getEventDispatcher()->dispatch(DoctrineDriver::EVENT_POST_GENERATE_QUERY_BUILDER, new PostGenerateQueryBuilderEvent($queryBuilder, $this->getFromAlias()));
     return $queryBuilder;
 }