/**
  * @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;
 }
Ejemplo n.º 2
0
 /**
  * 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);
 }
Ejemplo n.º 3
0
 /**
  * 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;
 }
Ejemplo n.º 4
0
 /**
  * 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;
 }
Ejemplo n.º 5
0
 /**
  * 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);
 }
Ejemplo n.º 6
0
 /**
  * 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;
 }