/** * 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; }
/** * 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; }