]> source.dussan.org Git - nextcloud-server.git/commitdiff
Move casting to IExpressionBuilder
authorJoas Schilling <nickvergessen@owncloud.com>
Fri, 5 Feb 2016 14:32:34 +0000 (15:32 +0100)
committerJoas Schilling <nickvergessen@owncloud.com>
Fri, 5 Feb 2016 20:26:30 +0000 (21:26 +0100)
apps/files/lib/backgroundjob/deleteorphaneditems.php
lib/private/db/querybuilder/expressionbuilder.php [deleted file]
lib/private/db/querybuilder/expressionbuilder/expressionbuilder.php [new file with mode: 0644]
lib/private/db/querybuilder/expressionbuilder/ociexpressionbuilder.php [new file with mode: 0644]
lib/private/db/querybuilder/expressionbuilder/pgsqlexpressionbuilder.php [new file with mode: 0644]
lib/private/db/querybuilder/ociexpressionbuilder.php [deleted file]
lib/private/db/querybuilder/querybuilder.php
lib/public/db/querybuilder/iexpressionbuilder.php
tests/lib/db/querybuilder/expressionbuildertest.php
tests/lib/share/share.php

index dc9f781e403c8cf8619bc5a7331d354443ec752a..cefa1d655de829be60dc795758ce760f0c41deec 100644 (file)
@@ -22,6 +22,7 @@
 namespace OCA\Files\BackgroundJob;
 
 use OC\BackgroundJob\TimedJob;
+use OCP\DB\QueryBuilder\IQueryBuilder;
 
 /**
  * Delete all share entries that have no matching entries in the file cache table.
@@ -111,7 +112,7 @@ class DeleteOrphanedItems extends TimedJob {
         */
        protected function cleanComments() {
                $qb = $this->connection->getQueryBuilder();
-               $deletedEntries = $this->cleanUp('comments', $qb->createFunction('CAST(`object_id` as INT)'), 'object_type');
+               $deletedEntries = $this->cleanUp('comments', $qb->expr()->castColumn('object_id', IQueryBuilder::PARAM_INT), 'object_type');
                $this->logger->debug("$deletedEntries orphaned comments deleted", ['app' => 'DeleteOrphanedItems']);
                return $deletedEntries;
        }
@@ -123,7 +124,7 @@ class DeleteOrphanedItems extends TimedJob {
         */
        protected function cleanCommentMarkers() {
                $qb = $this->connection->getQueryBuilder();
-               $deletedEntries = $this->cleanUp('comments_read_markers', $qb->createFunction('CAST(`object_id` as INT)'), 'object_type');
+               $deletedEntries = $this->cleanUp('comments_read_markers', $qb->expr()->castColumn('object_id', IQueryBuilder::PARAM_INT), 'object_type');
                $this->logger->debug("$deletedEntries orphaned comment read marks deleted", ['app' => 'DeleteOrphanedItems']);
                return $deletedEntries;
        }
diff --git a/lib/private/db/querybuilder/expressionbuilder.php b/lib/private/db/querybuilder/expressionbuilder.php
deleted file mode 100644 (file)
index b688ebf..0000000
+++ /dev/null
@@ -1,334 +0,0 @@
-<?php
-/**
- * @author Joas Schilling <nickvergessen@owncloud.com>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program.  If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\DB\QueryBuilder;
-
-use Doctrine\DBAL\Query\Expression\ExpressionBuilder as DoctrineExpressionBuilder;
-use OCP\DB\QueryBuilder\IExpressionBuilder;
-use OCP\IDBConnection;
-
-class ExpressionBuilder implements IExpressionBuilder {
-       /** @var \Doctrine\DBAL\Query\Expression\ExpressionBuilder */
-       protected $expressionBuilder;
-
-       /** @var QuoteHelper */
-       protected $helper;
-
-       /**
-        * Initializes a new <tt>ExpressionBuilder</tt>.
-        *
-        * @param \OCP\IDBConnection $connection
-        */
-       public function __construct(IDBConnection $connection) {
-               $this->helper = new QuoteHelper();
-               $this->expressionBuilder = new DoctrineExpressionBuilder($connection);
-       }
-
-       /**
-        * Creates a conjunction of the given boolean expressions.
-        *
-        * Example:
-        *
-        *     [php]
-        *     // (u.type = ?) AND (u.role = ?)
-        *     $expr->andX('u.type = ?', 'u.role = ?'));
-        *
-        * @param mixed $x Optional clause. Defaults = null, but requires
-        *                 at least one defined when converting to string.
-        *
-        * @return \OCP\DB\QueryBuilder\ICompositeExpression
-        */
-       public function andX($x = null) {
-               $arguments = func_get_args();
-               $compositeExpression = call_user_func_array([$this->expressionBuilder, 'andX'], $arguments);
-               return new CompositeExpression($compositeExpression);
-       }
-
-       /**
-        * Creates a disjunction of the given boolean expressions.
-        *
-        * Example:
-        *
-        *     [php]
-        *     // (u.type = ?) OR (u.role = ?)
-        *     $qb->where($qb->expr()->orX('u.type = ?', 'u.role = ?'));
-        *
-        * @param mixed $x Optional clause. Defaults = null, but requires
-        *                 at least one defined when converting to string.
-        *
-        * @return \OCP\DB\QueryBuilder\ICompositeExpression
-        */
-       public function orX($x = null) {
-               $arguments = func_get_args();
-               $compositeExpression = call_user_func_array([$this->expressionBuilder, 'orX'], $arguments);
-               return new CompositeExpression($compositeExpression);
-       }
-
-       /**
-        * Creates a comparison expression.
-        *
-        * @param mixed $x The left expression.
-        * @param string $operator One of the IExpressionBuilder::* constants.
-        * @param mixed $y The right expression.
-        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
-        *                  required when comparing text fields for oci compatibility
-        *
-        * @return string
-        */
-       public function comparison($x, $operator, $y, $type = null) {
-               $x = $this->helper->quoteColumnName($x);
-               $y = $this->helper->quoteColumnName($y);
-               return $this->expressionBuilder->comparison($x, $operator, $y);
-       }
-
-       /**
-        * Creates an equality comparison expression with the given arguments.
-        *
-        * First argument is considered the left expression and the second is the right expression.
-        * When converted to string, it will generated a <left expr> = <right expr>. Example:
-        *
-        *     [php]
-        *     // u.id = ?
-        *     $expr->eq('u.id', '?');
-        *
-        * @param mixed $x The left expression.
-        * @param mixed $y The right expression.
-        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
-        *                  required when comparing text fields for oci compatibility
-        *
-        * @return string
-        */
-       public function eq($x, $y, $type = null) {
-               $x = $this->helper->quoteColumnName($x);
-               $y = $this->helper->quoteColumnName($y);
-               return $this->expressionBuilder->eq($x, $y);
-       }
-
-       /**
-        * Creates a non equality comparison expression with the given arguments.
-        * First argument is considered the left expression and the second is the right expression.
-        * When converted to string, it will generated a <left expr> <> <right expr>. Example:
-        *
-        *     [php]
-        *     // u.id <> 1
-        *     $q->where($q->expr()->neq('u.id', '1'));
-        *
-        * @param mixed $x The left expression.
-        * @param mixed $y The right expression.
-        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
-        *                  required when comparing text fields for oci compatibility
-        *
-        * @return string
-        */
-       public function neq($x, $y, $type = null) {
-               $x = $this->helper->quoteColumnName($x);
-               $y = $this->helper->quoteColumnName($y);
-               return $this->expressionBuilder->neq($x, $y);
-       }
-
-       /**
-        * Creates a lower-than comparison expression with the given arguments.
-        * First argument is considered the left expression and the second is the right expression.
-        * When converted to string, it will generated a <left expr> < <right expr>. Example:
-        *
-        *     [php]
-        *     // u.id < ?
-        *     $q->where($q->expr()->lt('u.id', '?'));
-        *
-        * @param mixed $x The left expression.
-        * @param mixed $y The right expression.
-        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
-        *                  required when comparing text fields for oci compatibility
-        *
-        * @return string
-        */
-       public function lt($x, $y, $type = null) {
-               $x = $this->helper->quoteColumnName($x);
-               $y = $this->helper->quoteColumnName($y);
-               return $this->expressionBuilder->lt($x, $y);
-       }
-
-       /**
-        * Creates a lower-than-equal comparison expression with the given arguments.
-        * First argument is considered the left expression and the second is the right expression.
-        * When converted to string, it will generated a <left expr> <= <right expr>. Example:
-        *
-        *     [php]
-        *     // u.id <= ?
-        *     $q->where($q->expr()->lte('u.id', '?'));
-        *
-        * @param mixed $x The left expression.
-        * @param mixed $y The right expression.
-        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
-        *                  required when comparing text fields for oci compatibility
-        *
-        * @return string
-        */
-       public function lte($x, $y, $type = null) {
-               $x = $this->helper->quoteColumnName($x);
-               $y = $this->helper->quoteColumnName($y);
-               return $this->expressionBuilder->lte($x, $y);
-       }
-
-       /**
-        * Creates a greater-than comparison expression with the given arguments.
-        * First argument is considered the left expression and the second is the right expression.
-        * When converted to string, it will generated a <left expr> > <right expr>. Example:
-        *
-        *     [php]
-        *     // u.id > ?
-        *     $q->where($q->expr()->gt('u.id', '?'));
-        *
-        * @param mixed $x The left expression.
-        * @param mixed $y The right expression.
-        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
-        *                  required when comparing text fields for oci compatibility
-        *
-        * @return string
-        */
-       public function gt($x, $y, $type = null) {
-               $x = $this->helper->quoteColumnName($x);
-               $y = $this->helper->quoteColumnName($y);
-               return $this->expressionBuilder->gt($x, $y);
-       }
-
-       /**
-        * Creates a greater-than-equal comparison expression with the given arguments.
-        * First argument is considered the left expression and the second is the right expression.
-        * When converted to string, it will generated a <left expr> >= <right expr>. Example:
-        *
-        *     [php]
-        *     // u.id >= ?
-        *     $q->where($q->expr()->gte('u.id', '?'));
-        *
-        * @param mixed $x The left expression.
-        * @param mixed $y The right expression.
-        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
-        *                  required when comparing text fields for oci compatibility
-        *
-        * @return string
-        */
-       public function gte($x, $y, $type = null) {
-               $x = $this->helper->quoteColumnName($x);
-               $y = $this->helper->quoteColumnName($y);
-               return $this->expressionBuilder->gte($x, $y);
-       }
-
-       /**
-        * Creates an IS NULL expression with the given arguments.
-        *
-        * @param string $x The field in string format to be restricted by IS NULL.
-        *
-        * @return string
-        */
-       public function isNull($x) {
-               $x = $this->helper->quoteColumnName($x);
-               return $this->expressionBuilder->isNull($x);
-       }
-
-       /**
-        * Creates an IS NOT NULL expression with the given arguments.
-        *
-        * @param string $x The field in string format to be restricted by IS NOT NULL.
-        *
-        * @return string
-        */
-       public function isNotNull($x) {
-               $x = $this->helper->quoteColumnName($x);
-               return $this->expressionBuilder->isNotNull($x);
-       }
-
-       /**
-        * Creates a LIKE() comparison expression with the given arguments.
-        *
-        * @param string $x Field in string format to be inspected by LIKE() comparison.
-        * @param mixed $y Argument to be used in LIKE() comparison.
-        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
-        *                  required when comparing text fields for oci compatibility
-        *
-        * @return string
-        */
-       public function like($x, $y, $type = null) {
-               $x = $this->helper->quoteColumnName($x);
-               $y = $this->helper->quoteColumnName($y);
-               return $this->expressionBuilder->like($x, $y);
-       }
-
-       /**
-        * Creates a NOT LIKE() comparison expression with the given arguments.
-        *
-        * @param string $x Field in string format to be inspected by NOT LIKE() comparison.
-        * @param mixed $y Argument to be used in NOT LIKE() comparison.
-        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
-        *                  required when comparing text fields for oci compatibility
-        *
-        * @return string
-        */
-       public function notLike($x, $y, $type = null) {
-               $x = $this->helper->quoteColumnName($x);
-               $y = $this->helper->quoteColumnName($y);
-               return $this->expressionBuilder->notLike($x, $y);
-       }
-
-       /**
-        * Creates a IN () comparison expression with the given arguments.
-        *
-        * @param string $x The field in string format to be inspected by IN() comparison.
-        * @param string|array $y The placeholder or the array of values to be used by IN() comparison.
-        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
-        *                  required when comparing text fields for oci compatibility
-        *
-        * @return string
-        */
-       public function in($x, $y, $type = null) {
-               $x = $this->helper->quoteColumnName($x);
-               $y = $this->helper->quoteColumnNames($y);
-               return $this->expressionBuilder->in($x, $y);
-       }
-
-       /**
-        * Creates a NOT IN () comparison expression with the given arguments.
-        *
-        * @param string $x The field in string format to be inspected by NOT IN() comparison.
-        * @param string|array $y The placeholder or the array of values to be used by NOT IN() comparison.
-        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
-        *                  required when comparing text fields for oci compatibility
-        *
-        * @return string
-        */
-       public function notIn($x, $y, $type = null) {
-               $x = $this->helper->quoteColumnName($x);
-               $y = $this->helper->quoteColumnNames($y);
-               return $this->expressionBuilder->notIn($x, $y);
-       }
-
-       /**
-        * Quotes a given input parameter.
-        *
-        * @param mixed $input The parameter to be quoted.
-        * @param mixed|null $type One of the IQueryBuilder::PARAM_* constants
-        *
-        * @return Literal
-        */
-       public function literal($input, $type = null) {
-               return new Literal($this->expressionBuilder->literal($input, $type));
-       }
-}
diff --git a/lib/private/db/querybuilder/expressionbuilder/expressionbuilder.php b/lib/private/db/querybuilder/expressionbuilder/expressionbuilder.php
new file mode 100644 (file)
index 0000000..7ab4c03
--- /dev/null
@@ -0,0 +1,351 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\DB\QueryBuilder\ExpressionBuilder;
+
+use Doctrine\DBAL\Query\Expression\ExpressionBuilder as DoctrineExpressionBuilder;
+use OC\DB\QueryBuilder\CompositeExpression;
+use OC\DB\QueryBuilder\Literal;
+use OC\DB\QueryBuilder\QueryFunction;
+use OC\DB\QueryBuilder\QuoteHelper;
+use OCP\DB\QueryBuilder\IExpressionBuilder;
+use OCP\IDBConnection;
+
+class ExpressionBuilder implements IExpressionBuilder {
+       /** @var \Doctrine\DBAL\Query\Expression\ExpressionBuilder */
+       protected $expressionBuilder;
+
+       /** @var QuoteHelper */
+       protected $helper;
+
+       /**
+        * Initializes a new <tt>ExpressionBuilder</tt>.
+        *
+        * @param \OCP\IDBConnection $connection
+        */
+       public function __construct(IDBConnection $connection) {
+               $this->helper = new QuoteHelper();
+               $this->expressionBuilder = new DoctrineExpressionBuilder($connection);
+       }
+
+       /**
+        * Creates a conjunction of the given boolean expressions.
+        *
+        * Example:
+        *
+        *     [php]
+        *     // (u.type = ?) AND (u.role = ?)
+        *     $expr->andX('u.type = ?', 'u.role = ?'));
+        *
+        * @param mixed $x Optional clause. Defaults = null, but requires
+        *                 at least one defined when converting to string.
+        *
+        * @return \OCP\DB\QueryBuilder\ICompositeExpression
+        */
+       public function andX($x = null) {
+               $arguments = func_get_args();
+               $compositeExpression = call_user_func_array([$this->expressionBuilder, 'andX'], $arguments);
+               return new CompositeExpression($compositeExpression);
+       }
+
+       /**
+        * Creates a disjunction of the given boolean expressions.
+        *
+        * Example:
+        *
+        *     [php]
+        *     // (u.type = ?) OR (u.role = ?)
+        *     $qb->where($qb->expr()->orX('u.type = ?', 'u.role = ?'));
+        *
+        * @param mixed $x Optional clause. Defaults = null, but requires
+        *                 at least one defined when converting to string.
+        *
+        * @return \OCP\DB\QueryBuilder\ICompositeExpression
+        */
+       public function orX($x = null) {
+               $arguments = func_get_args();
+               $compositeExpression = call_user_func_array([$this->expressionBuilder, 'orX'], $arguments);
+               return new CompositeExpression($compositeExpression);
+       }
+
+       /**
+        * Creates a comparison expression.
+        *
+        * @param mixed $x The left expression.
+        * @param string $operator One of the IExpressionBuilder::* constants.
+        * @param mixed $y The right expression.
+        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
+        *                  required when comparing text fields for oci compatibility
+        *
+        * @return string
+        */
+       public function comparison($x, $operator, $y, $type = null) {
+               $x = $this->helper->quoteColumnName($x);
+               $y = $this->helper->quoteColumnName($y);
+               return $this->expressionBuilder->comparison($x, $operator, $y);
+       }
+
+       /**
+        * Creates an equality comparison expression with the given arguments.
+        *
+        * First argument is considered the left expression and the second is the right expression.
+        * When converted to string, it will generated a <left expr> = <right expr>. Example:
+        *
+        *     [php]
+        *     // u.id = ?
+        *     $expr->eq('u.id', '?');
+        *
+        * @param mixed $x The left expression.
+        * @param mixed $y The right expression.
+        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
+        *                  required when comparing text fields for oci compatibility
+        *
+        * @return string
+        */
+       public function eq($x, $y, $type = null) {
+               $x = $this->helper->quoteColumnName($x);
+               $y = $this->helper->quoteColumnName($y);
+               return $this->expressionBuilder->eq($x, $y);
+       }
+
+       /**
+        * Creates a non equality comparison expression with the given arguments.
+        * First argument is considered the left expression and the second is the right expression.
+        * When converted to string, it will generated a <left expr> <> <right expr>. Example:
+        *
+        *     [php]
+        *     // u.id <> 1
+        *     $q->where($q->expr()->neq('u.id', '1'));
+        *
+        * @param mixed $x The left expression.
+        * @param mixed $y The right expression.
+        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
+        *                  required when comparing text fields for oci compatibility
+        *
+        * @return string
+        */
+       public function neq($x, $y, $type = null) {
+               $x = $this->helper->quoteColumnName($x);
+               $y = $this->helper->quoteColumnName($y);
+               return $this->expressionBuilder->neq($x, $y);
+       }
+
+       /**
+        * Creates a lower-than comparison expression with the given arguments.
+        * First argument is considered the left expression and the second is the right expression.
+        * When converted to string, it will generated a <left expr> < <right expr>. Example:
+        *
+        *     [php]
+        *     // u.id < ?
+        *     $q->where($q->expr()->lt('u.id', '?'));
+        *
+        * @param mixed $x The left expression.
+        * @param mixed $y The right expression.
+        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
+        *                  required when comparing text fields for oci compatibility
+        *
+        * @return string
+        */
+       public function lt($x, $y, $type = null) {
+               $x = $this->helper->quoteColumnName($x);
+               $y = $this->helper->quoteColumnName($y);
+               return $this->expressionBuilder->lt($x, $y);
+       }
+
+       /**
+        * Creates a lower-than-equal comparison expression with the given arguments.
+        * First argument is considered the left expression and the second is the right expression.
+        * When converted to string, it will generated a <left expr> <= <right expr>. Example:
+        *
+        *     [php]
+        *     // u.id <= ?
+        *     $q->where($q->expr()->lte('u.id', '?'));
+        *
+        * @param mixed $x The left expression.
+        * @param mixed $y The right expression.
+        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
+        *                  required when comparing text fields for oci compatibility
+        *
+        * @return string
+        */
+       public function lte($x, $y, $type = null) {
+               $x = $this->helper->quoteColumnName($x);
+               $y = $this->helper->quoteColumnName($y);
+               return $this->expressionBuilder->lte($x, $y);
+       }
+
+       /**
+        * Creates a greater-than comparison expression with the given arguments.
+        * First argument is considered the left expression and the second is the right expression.
+        * When converted to string, it will generated a <left expr> > <right expr>. Example:
+        *
+        *     [php]
+        *     // u.id > ?
+        *     $q->where($q->expr()->gt('u.id', '?'));
+        *
+        * @param mixed $x The left expression.
+        * @param mixed $y The right expression.
+        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
+        *                  required when comparing text fields for oci compatibility
+        *
+        * @return string
+        */
+       public function gt($x, $y, $type = null) {
+               $x = $this->helper->quoteColumnName($x);
+               $y = $this->helper->quoteColumnName($y);
+               return $this->expressionBuilder->gt($x, $y);
+       }
+
+       /**
+        * Creates a greater-than-equal comparison expression with the given arguments.
+        * First argument is considered the left expression and the second is the right expression.
+        * When converted to string, it will generated a <left expr> >= <right expr>. Example:
+        *
+        *     [php]
+        *     // u.id >= ?
+        *     $q->where($q->expr()->gte('u.id', '?'));
+        *
+        * @param mixed $x The left expression.
+        * @param mixed $y The right expression.
+        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
+        *                  required when comparing text fields for oci compatibility
+        *
+        * @return string
+        */
+       public function gte($x, $y, $type = null) {
+               $x = $this->helper->quoteColumnName($x);
+               $y = $this->helper->quoteColumnName($y);
+               return $this->expressionBuilder->gte($x, $y);
+       }
+
+       /**
+        * Creates an IS NULL expression with the given arguments.
+        *
+        * @param string $x The field in string format to be restricted by IS NULL.
+        *
+        * @return string
+        */
+       public function isNull($x) {
+               $x = $this->helper->quoteColumnName($x);
+               return $this->expressionBuilder->isNull($x);
+       }
+
+       /**
+        * Creates an IS NOT NULL expression with the given arguments.
+        *
+        * @param string $x The field in string format to be restricted by IS NOT NULL.
+        *
+        * @return string
+        */
+       public function isNotNull($x) {
+               $x = $this->helper->quoteColumnName($x);
+               return $this->expressionBuilder->isNotNull($x);
+       }
+
+       /**
+        * Creates a LIKE() comparison expression with the given arguments.
+        *
+        * @param string $x Field in string format to be inspected by LIKE() comparison.
+        * @param mixed $y Argument to be used in LIKE() comparison.
+        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
+        *                  required when comparing text fields for oci compatibility
+        *
+        * @return string
+        */
+       public function like($x, $y, $type = null) {
+               $x = $this->helper->quoteColumnName($x);
+               $y = $this->helper->quoteColumnName($y);
+               return $this->expressionBuilder->like($x, $y);
+       }
+
+       /**
+        * Creates a NOT LIKE() comparison expression with the given arguments.
+        *
+        * @param string $x Field in string format to be inspected by NOT LIKE() comparison.
+        * @param mixed $y Argument to be used in NOT LIKE() comparison.
+        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
+        *                  required when comparing text fields for oci compatibility
+        *
+        * @return string
+        */
+       public function notLike($x, $y, $type = null) {
+               $x = $this->helper->quoteColumnName($x);
+               $y = $this->helper->quoteColumnName($y);
+               return $this->expressionBuilder->notLike($x, $y);
+       }
+
+       /**
+        * Creates a IN () comparison expression with the given arguments.
+        *
+        * @param string $x The field in string format to be inspected by IN() comparison.
+        * @param string|array $y The placeholder or the array of values to be used by IN() comparison.
+        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
+        *                  required when comparing text fields for oci compatibility
+        *
+        * @return string
+        */
+       public function in($x, $y, $type = null) {
+               $x = $this->helper->quoteColumnName($x);
+               $y = $this->helper->quoteColumnNames($y);
+               return $this->expressionBuilder->in($x, $y);
+       }
+
+       /**
+        * Creates a NOT IN () comparison expression with the given arguments.
+        *
+        * @param string $x The field in string format to be inspected by NOT IN() comparison.
+        * @param string|array $y The placeholder or the array of values to be used by NOT IN() comparison.
+        * @param mixed|null $type one of the IQueryBuilder::PARAM_* constants
+        *                  required when comparing text fields for oci compatibility
+        *
+        * @return string
+        */
+       public function notIn($x, $y, $type = null) {
+               $x = $this->helper->quoteColumnName($x);
+               $y = $this->helper->quoteColumnNames($y);
+               return $this->expressionBuilder->notIn($x, $y);
+       }
+
+       /**
+        * Quotes a given input parameter.
+        *
+        * @param mixed $input The parameter to be quoted.
+        * @param mixed|null $type One of the IQueryBuilder::PARAM_* constants
+        *
+        * @return Literal
+        */
+       public function literal($input, $type = null) {
+               return new Literal($this->expressionBuilder->literal($input, $type));
+       }
+
+       /**
+        * Returns a IQueryFunction that casts the column to the given type
+        *
+        * @param string $column
+        * @param mixed $type One of IQueryBuilder::PARAM_*
+        * @return string
+        */
+       public function castColumn($column, $type) {
+               return new QueryFunction(
+                       $this->helper->quoteColumnName($column)
+               );
+       }
+}
diff --git a/lib/private/db/querybuilder/expressionbuilder/ociexpressionbuilder.php b/lib/private/db/querybuilder/expressionbuilder/ociexpressionbuilder.php
new file mode 100644 (file)
index 0000000..6a6d0f4
--- /dev/null
@@ -0,0 +1,152 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\DB\QueryBuilder\ExpressionBuilder;
+
+
+use OC\DB\QueryBuilder\QueryFunction;
+use OCP\DB\QueryBuilder\ILiteral;
+use OCP\DB\QueryBuilder\IParameter;
+use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\DB\QueryBuilder\IQueryFunction;
+
+class OCIExpressionBuilder extends ExpressionBuilder {
+
+       /**
+        * @param mixed $column
+        * @param mixed|null $type
+        * @return array|IQueryFunction|string
+        */
+       protected function prepareColumn($column, $type) {
+               if ($type === IQueryBuilder::PARAM_STR && !is_array($column) && !($column instanceof IParameter) && !($column instanceof ILiteral)) {
+                       $column = $this->castColumn($column, $type);
+               } else {
+                       $column = $this->helper->quoteColumnNames($column);
+               }
+               return $column;
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function comparison($x, $operator, $y, $type = null) {
+               $x = $this->prepareColumn($x, $type);
+               $y = $this->prepareColumn($y, $type);
+
+               return $this->expressionBuilder->comparison($x, $operator, $y);
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function eq($x, $y, $type = null) {
+               $x = $this->prepareColumn($x, $type);
+               $y = $this->prepareColumn($y, $type);
+
+               return $this->expressionBuilder->eq($x, $y);
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function neq($x, $y, $type = null) {
+               $x = $this->prepareColumn($x, $type);
+               $y = $this->prepareColumn($y, $type);
+
+               return $this->expressionBuilder->neq($x, $y);
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function lt($x, $y, $type = null) {
+               $x = $this->prepareColumn($x, $type);
+               $y = $this->prepareColumn($y, $type);
+
+               return $this->expressionBuilder->lt($x, $y);
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function lte($x, $y, $type = null) {
+               $x = $this->prepareColumn($x, $type);
+               $y = $this->prepareColumn($y, $type);
+
+               return $this->expressionBuilder->lte($x, $y);
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function gt($x, $y, $type = null) {
+               $x = $this->prepareColumn($x, $type);
+               $y = $this->prepareColumn($y, $type);
+
+               return $this->expressionBuilder->gt($x, $y);
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function gte($x, $y, $type = null) {
+               $x = $this->prepareColumn($x, $type);
+               $y = $this->prepareColumn($y, $type);
+
+               return $this->expressionBuilder->gte($x, $y);
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function in($x, $y, $type = null) {
+               $x = $this->prepareColumn($x, $type);
+               $y = $this->prepareColumn($y, $type);
+
+               return $this->expressionBuilder->in($x, $y);
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function notIn($x, $y, $type = null) {
+               $x = $this->prepareColumn($x, $type);
+               $y = $this->prepareColumn($y, $type);
+
+               return $this->expressionBuilder->notIn($x, $y);
+       }
+
+       /**
+        * Returns a IQueryFunction that casts the column to the given type
+        *
+        * @param string $column
+        * @param mixed $type One of IQueryBuilder::PARAM_*
+        * @return IQueryFunction
+        */
+       public function castColumn($column, $type) {
+               if ($type === IQueryBuilder::PARAM_STR) {
+                       $column = $this->helper->quoteColumnName($column);
+                       return new QueryFunction('to_char(' . $column . ')');
+               }
+
+               return parent::castColumn($column, $type);
+       }
+}
diff --git a/lib/private/db/querybuilder/expressionbuilder/pgsqlexpressionbuilder.php b/lib/private/db/querybuilder/expressionbuilder/pgsqlexpressionbuilder.php
new file mode 100644 (file)
index 0000000..8a0b68d
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\DB\QueryBuilder\ExpressionBuilder;
+
+
+use OC\DB\QueryBuilder\QueryFunction;
+use OCP\DB\QueryBuilder\IQueryBuilder;
+
+class PgSqlExpressionBuilder extends ExpressionBuilder {
+
+       /**
+        * Returns a IQueryFunction that casts the column to the given type
+        *
+        * @param string $column
+        * @param mixed $type One of IQueryBuilder::PARAM_*
+        * @return string
+        */
+       public function castColumn($column, $type) {
+               if ($type === IQueryBuilder::PARAM_INT) {
+                       $column = $this->helper->quoteColumnName($column);
+                       return new QueryFunction('CAST(' . $column . ' AS INT)');
+               }
+
+               return parent::castColumn($column, $type);
+       }
+}
diff --git a/lib/private/db/querybuilder/ociexpressionbuilder.php b/lib/private/db/querybuilder/ociexpressionbuilder.php
deleted file mode 100644 (file)
index 4c127bd..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-/**
- * @author Joas Schilling <nickvergessen@owncloud.com>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program.  If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\DB\QueryBuilder;
-
-
-use OCP\DB\QueryBuilder\ILiteral;
-use OCP\DB\QueryBuilder\IParameter;
-use OCP\DB\QueryBuilder\IQueryBuilder;
-
-class OCIExpressionBuilder extends ExpressionBuilder {
-
-       /**
-        * @param mixed $column
-        * @param mixed|null $type
-        * @return array|QueryFunction|string
-        */
-       protected function prepareColumn($column, $type) {
-               if ($type === IQueryBuilder::PARAM_STR && !is_array($column) && !($column instanceof IParameter) && !($column instanceof ILiteral)) {
-                       $column = $this->helper->quoteColumnName($column);
-                       $column = new QueryFunction('to_char(' . $column . ')');
-               } else {
-                       $column = $this->helper->quoteColumnNames($column);
-               }
-               return $column;
-       }
-
-       /**
-        * @inheritdoc
-        */
-       public function comparison($x, $operator, $y, $type = null) {
-               $x = $this->prepareColumn($x, $type);
-               $y = $this->prepareColumn($y, $type);
-
-               return $this->expressionBuilder->comparison($x, $operator, $y);
-       }
-
-       /**
-        * @inheritdoc
-        */
-       public function eq($x, $y, $type = null) {
-               $x = $this->prepareColumn($x, $type);
-               $y = $this->prepareColumn($y, $type);
-
-               return $this->expressionBuilder->eq($x, $y);
-       }
-
-       /**
-        * @inheritdoc
-        */
-       public function neq($x, $y, $type = null) {
-               $x = $this->prepareColumn($x, $type);
-               $y = $this->prepareColumn($y, $type);
-
-               return $this->expressionBuilder->neq($x, $y);
-       }
-
-       /**
-        * @inheritdoc
-        */
-       public function lt($x, $y, $type = null) {
-               $x = $this->prepareColumn($x, $type);
-               $y = $this->prepareColumn($y, $type);
-
-               return $this->expressionBuilder->lt($x, $y);
-       }
-
-       /**
-        * @inheritdoc
-        */
-       public function lte($x, $y, $type = null) {
-               $x = $this->prepareColumn($x, $type);
-               $y = $this->prepareColumn($y, $type);
-
-               return $this->expressionBuilder->lte($x, $y);
-       }
-
-       /**
-        * @inheritdoc
-        */
-       public function gt($x, $y, $type = null) {
-               $x = $this->prepareColumn($x, $type);
-               $y = $this->prepareColumn($y, $type);
-
-               return $this->expressionBuilder->gt($x, $y);
-       }
-
-       /**
-        * @inheritdoc
-        */
-       public function gte($x, $y, $type = null) {
-               $x = $this->prepareColumn($x, $type);
-               $y = $this->prepareColumn($y, $type);
-
-               return $this->expressionBuilder->gte($x, $y);
-       }
-
-       /**
-        * @inheritdoc
-        */
-       public function in($x, $y, $type = null) {
-               $x = $this->prepareColumn($x, $type);
-               $y = $this->prepareColumn($y, $type);
-
-               return $this->expressionBuilder->in($x, $y);
-       }
-
-       /**
-        * @inheritdoc
-        */
-       public function notIn($x, $y, $type = null) {
-               $x = $this->prepareColumn($x, $type);
-               $y = $this->prepareColumn($y, $type);
-
-               return $this->expressionBuilder->notIn($x, $y);
-       }
-}
index 42b290b90e762c1491f14ca603059b23536476ac..ff31ffbc04305e51cb4b36bf8b6c738e0a6014c7 100644 (file)
 
 namespace OC\DB\QueryBuilder;
 
+use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
 use OC\DB\OracleConnection;
+use OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder;
+use OC\DB\QueryBuilder\ExpressionBuilder\OCIExpressionBuilder;
+use OC\DB\QueryBuilder\ExpressionBuilder\PgSqlExpressionBuilder;
 use OCP\DB\QueryBuilder\IQueryBuilder;
 use OCP\DB\QueryBuilder\IQueryFunction;
 use OCP\DB\QueryBuilder\IParameter;
@@ -85,6 +89,8 @@ class QueryBuilder implements IQueryBuilder {
        public function expr() {
                if ($this->connection instanceof OracleConnection) {
                        return new OCIExpressionBuilder($this->connection);
+               } else if ($this->connection->getDatabasePlatform() instanceof PostgreSqlPlatform) {
+                       return new PgSqlExpressionBuilder($this->connection);
                } else {
                        return new ExpressionBuilder($this->connection);
                }
index a53ae3846c2d65549b2efc886ecea35aa1b62392..4b53a0e0b8bb5a408eb21de840d1cfe8a22c2d31 100644 (file)
@@ -299,4 +299,14 @@ interface IExpressionBuilder {
         * @since 8.2.0
         */
        public function literal($input, $type = null);
+
+       /**
+        * Returns a IQueryFunction that casts the column to the given type
+        *
+        * @param string $column
+        * @param mixed $type One of IQueryBuilder::PARAM_*
+        * @return string
+        * @since 9.0.0
+        */
+       public function castColumn($column, $type);
 }
index 8310c4adf68e652a6ab8af7d27afebf6c2a1d454..f38faab9169b1699411fae8054d9252eaabfd572 100644 (file)
@@ -22,7 +22,7 @@
 namespace Test\DB\QueryBuilder;
 
 use Doctrine\DBAL\Query\Expression\ExpressionBuilder as DoctrineExpressionBuilder;
-use OC\DB\QueryBuilder\ExpressionBuilder;
+use OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder;
 use OCP\DB\QueryBuilder\IQueryBuilder;
 use Test\TestCase;
 
index 5162a03f367493051c99d58543543ee714461276..4519c33f9d189b55cebe9cbe3abdf84aa97c9440 100644 (file)
@@ -1423,7 +1423,7 @@ class Test_Share extends \Test\TestCase {
                $userSession->method('getUser')->willReturn($user);
 
 
-               $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder')
+               $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
                           ->disableOriginalConstructor()
                           ->getMock();
                $qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')
@@ -1478,7 +1478,7 @@ class Test_Share extends \Test\TestCase {
                $userSession->method('getUser')->willReturn($user);
 
 
-               $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder')
+               $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
                           ->disableOriginalConstructor()
                           ->getMock();
                $qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')
@@ -1531,7 +1531,7 @@ class Test_Share extends \Test\TestCase {
                $userSession->method('getUser')->willReturn($user);
 
 
-               $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder')
+               $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
                           ->disableOriginalConstructor()
                           ->getMock();
                $qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')
@@ -1584,7 +1584,7 @@ class Test_Share extends \Test\TestCase {
                $userSession->method('getUser')->willReturn($user);
 
 
-               $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder')
+               $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
                           ->disableOriginalConstructor()
                           ->getMock();
                $qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')