/** * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @return int * @throws \TYPO3\CMS\Extbase\Persistence\Generic\Storage\Exception\BadConstraintException */ protected function getObjectCountByQueryTYPO362(\TYPO3\CMS\Extbase\Persistence\QueryInterface $query) { if ($query->getConstraint() instanceof \TYPO3\CMS\Extbase\Persistence\Generic\Qom\Statement) { throw new \TYPO3\CMS\Extbase\Persistence\Generic\Storage\Exception\BadConstraintException('Could not execute count on queries with a constraint of type TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Qom\\StatementInterface', 1256661045); } $statement = $query->getStatement(); if ($statement instanceof \TYPO3\CMS\Extbase\Persistence\Generic\Qom\Statement) { /* * Overriding default extbase logic for manually passed SQL */ $sql = $statement->getStatement(); $parameters = $statement->getBoundVariables(); $this->replacePlaceholders($sql, $parameters); $matches = array(); $tableNames = array(); if (preg_match('/^\\s*#\\s*@tables_used\\s*=\\s*(.*)\\s*;/msU', $sql, $matches)) { $tableNames = GeneralUtility::trimExplode(',', $matches[1]); $sql = preg_replace('/^\\s*#\\s*@tables_used\\s*=\\s*(.*)\\s*;/msU', '', $sql); } $sqlParser = \EssentialDots\ExtbaseHijax\Persistence\Parser\SQL::ParseString($sql); $countQuery = $sqlParser->getCountQuery(); if (count($tableNames)) { $countQuery = "# @tables_used=" . implode(',', $tableNames) . "; \n" . $countQuery; } $res = $this->databaseHandle->sql_query($countQuery); $this->checkSqlErrors($countQuery); $count = 0; while ($row = $this->databaseHandle->sql_fetch_assoc($res)) { $count = $row['count']; break; } $this->databaseHandle->sql_free_result($res); } else { /* * Default Extbase logic */ $count = parent::getObjectCountByQuery($query); } return (int) $count; }
/** * Returns the number of tuples matching the query. * * @param QueryInterface $query * @throws Exception\BadConstraintException * @return int The number of matching tuples */ public function getObjectCountByQuery(QueryInterface $query) { if ($query->getConstraint() instanceof Qom\Statement) { throw new \TYPO3\CMS\Extbase\Persistence\Generic\Storage\Exception\BadConstraintException('Could not execute count on queries with a constraint of type TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Qom\\Statement', 1256661045); } list($statementParts) = $this->getStatementParts($query); $fields = '*'; if (isset($statementParts['keywords']['distinct'])) { $fields = 'DISTINCT ' . reset($statementParts['tables']) . '.uid'; } $queryCommandParameters = $this->createQueryCommandParametersFromStatementParts($statementParts); $count = $this->databaseHandle->exec_SELECTcountRows($fields, $queryCommandParameters['fromTable'], $queryCommandParameters['whereClause']); $this->checkSqlErrors(); if ($statementParts['offset']) { $count -= $statementParts['offset']; } if ($statementParts['limit']) { $count = min($count, $statementParts['limit']); } return (int) max(0, $count); }
/** * Parses the query and returns the SQL statement parts. * * @param QueryInterface $query The query * @return array The SQL statement parts */ public function parseQuery(QueryInterface $query) { $sql = array(); $sql['keywords'] = array(); $sql['tables'] = array(); $sql['unions'] = array(); $sql['fields'] = array(); $sql['where'] = array(); $sql['additionalWhereClause'] = array(); $sql['orderings'] = array(); $sql['limit'] = (int) $query->getLimit() ?: NULL; $sql['offset'] = (int) $query->getOffset() ?: NULL; $source = $query->getSource(); $this->parseSource($source, $sql); $this->parseConstraint($query->getConstraint(), $source, $sql); $this->parseOrderings($query->getOrderings(), $source, $sql); $tableNames = array_unique(array_keys($sql['tables'] + $sql['unions'])); foreach ($tableNames as $tableName) { if (is_string($tableName) && !empty($tableName)) { $this->addAdditionalWhereClause($query->getQuerySettings(), $tableName, $sql); } } return $sql; }
/** * Parses the query and returns the SQL statement parts. * * @param QueryInterface $query The query * @param array &$parameters * @return array The SQL statement parts */ public function parseQuery(QueryInterface $query, array &$parameters) { $statementParts = array(); $statementParts['keywords'] = array(); $statementParts['tables'] = array(); $statementParts['unions'] = array(); $statementParts['fields'] = array(); $statementParts['where'] = array(); $statementParts['additionalWhereClause'] = array(); $statementParts['orderings'] = array(); $statementParts['limit'] = array(); $source = $query->getSource(); $this->parseSource($source, $statementParts); $this->parseConstraint($query->getConstraint(), $source, $statementParts, $parameters); $this->parseOrderings($query->getOrderings(), $source, $statementParts); $this->parseLimitAndOffset($query->getLimit(), $query->getOffset(), $statementParts); $tableNames = array_unique(array_keys($statementParts['tables'] + $statementParts['unions'])); foreach ($tableNames as $tableNameOrAlias) { if (is_string($tableNameOrAlias) && strlen($tableNameOrAlias) > 0) { $this->addAdditionalWhereClause($query->getQuerySettings(), $tableNameOrAlias, $statementParts); } } return $statementParts; }
/** * Returns the number of tuples matching the query. * * @param QueryInterface $query * @throws Exception\BadConstraintException * @return int The number of matching tuples * @throws SqlErrorException */ public function getObjectCountByQuery(QueryInterface $query) { if ($query->getConstraint() instanceof Qom\Statement) { throw new \TYPO3\CMS\Extbase\Persistence\Generic\Storage\Exception\BadConstraintException('Could not execute count on queries with a constraint of type TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Qom\\Statement', 1256661045); } $queryBuilder = $this->objectManager->get(Typo3DbQueryParser::class)->convertQueryToDoctrineQueryBuilder($query); try { $count = $queryBuilder->count('*')->execute()->fetchColumn(0); } catch (DBALException $e) { throw new SqlErrorException($e->getPrevious()->getMessage(), 1472074379); } if ($query->getOffset()) { $count -= $query->getOffset(); } if ($query->getLimit()) { $count = min($count, $query->getLimit()); } return (int) max(0, $count); }
/** * Returns a ready to be executed QueryBuilder object, based on the query * * @param QueryInterface $query * @return QueryBuilder */ public function convertQueryToDoctrineQueryBuilder(QueryInterface $query) { // Reset all properties $this->tablePropertyMap = []; $this->tableAliasMap = []; $this->unionTableAliasCache = []; $this->tableName = ''; // Find the right table name $source = $query->getSource(); $this->initializeQueryBuilder($source); $constraint = $query->getConstraint(); if ($constraint instanceof Qom\ConstraintInterface) { $wherePredicates = $this->parseConstraint($constraint, $source); if (!empty($wherePredicates)) { $this->queryBuilder->andWhere($wherePredicates); } } $this->parseOrderings($query->getOrderings(), $source); $this->addTypo3Constraints($query); return $this->queryBuilder; }
/** * Parses the query and returns the SQL statement parts. * * @param QueryInterface $query The query * @return array The SQL statement parts */ public function parseQuery(QueryInterface $query) { $this->tablePropertyMap = array(); $sql = array(); $sql['keywords'] = array(); $sql['tables'] = array(); $sql['unions'] = array(); $sql['fields'] = array(); $sql['where'] = array(); $sql['additionalWhereClause'] = array(); $sql['orderings'] = array(); $sql['limit'] = (int) $query->getLimit() ?: null; $sql['offset'] = (int) $query->getOffset() ?: null; $sql['tableAliasMap'] = array(); $source = $query->getSource(); $this->parseSource($source, $sql); $this->parseConstraint($query->getConstraint(), $source, $sql); $this->parseOrderings($query->getOrderings(), $source, $sql); foreach ($sql['tableAliasMap'] as $tableAlias => $tableName) { $additionalWhereClause = $this->getAdditionalWhereClause($query->getQuerySettings(), $tableName, $tableAlias); if ($additionalWhereClause !== '') { $additionalWhereClause = $this->addNullConditionToStatementIfRequired($sql, $additionalWhereClause, $tableAlias); $sql['additionalWhereClause'][] = $additionalWhereClause; } } return $sql; }