]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add octetLength and charLength to function builder, and tests
authorCôme Chilliet <come.chilliet@nextcloud.com>
Thu, 24 Mar 2022 15:17:37 +0000 (16:17 +0100)
committerVincent Petry (Rebase PR Action) <PVince81@users.noreply.github.com>
Thu, 24 Mar 2022 20:35:02 +0000 (20:35 +0000)
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
apps/user_ldap/lib/Migration/Version1120Date20210917155206.php
lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php
lib/private/DB/QueryBuilder/FunctionBuilder/SqliteFunctionBuilder.php
lib/public/DB/QueryBuilder/IFunctionBuilder.php
tests/lib/DB/QueryBuilder/FunctionBuilderTest.php

index 87a8f07fbe1229ff5075632271babbe76949080a..bca390441d70d1a8f1549b78b56cd4e59e2b3b64 100644 (file)
@@ -127,10 +127,9 @@ class Version1120Date20210917155206 extends SimpleMigrationStep {
 
        protected function getSelectQuery(string $table): IQueryBuilder {
                $qb = $this->dbc->getQueryBuilder();
-               $lengthExpr = $this->dbc->getDatabasePlatform()->getLengthExpression('owncloud_name');
                $qb->select('owncloud_name', 'directory_uuid')
                        ->from($table)
-                       ->where($qb->expr()->gt($qb->createFunction($lengthExpr), '64', IQueryBuilder::PARAM_INT));
+                       ->where($qb->expr()->gt($qb->func()->octetLength('owncloud_name'), '64', IQueryBuilder::PARAM_INT));
                return $qb;
        }
 
index 03630ea14a370f3db4e66f1c7eaab97f14e49231..c0f07d37406b80672b4975322d1ec9ff279dd839 100644 (file)
@@ -94,6 +94,18 @@ class FunctionBuilder implements IFunctionBuilder {
                return new QueryFunction('COUNT(' . $quotedName . ')' . $alias);
        }
 
+       public function octetLength($field, $alias = ''): IQueryFunction {
+               $alias = $alias ? (' AS ' . $this->helper->quoteColumnName($alias)) : '';
+               $quotedName = $this->helper->quoteColumnName($field);
+               return new QueryFunction('LENGTHB(' . $quotedName . ')' . $alias);
+       }
+
+       public function charLength($field, $alias = ''): IQueryFunction {
+               $alias = $alias ? (' AS ' . $this->helper->quoteColumnName($alias)) : '';
+               $quotedName = $this->helper->quoteColumnName($field);
+               return new QueryFunction('LENGTH(' . $quotedName . ')' . $alias);
+       }
+
        public function max($field): IQueryFunction {
                return new QueryFunction('MAX(' . $this->helper->quoteColumnName($field) . ')');
        }
index fe700075a82c308ac9b3f1c0bc2316522f2561f1..4e9e83a49d2c871dcdc618ce0dc8d0abb085e45b 100644 (file)
@@ -48,4 +48,10 @@ class SqliteFunctionBuilder extends FunctionBuilder {
        public function least($x, $y): IQueryFunction {
                return new QueryFunction('MIN(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')');
        }
+
+       public function octetLength($field, $alias = ''): IQueryFunction {
+               $alias = $alias ? (' AS ' . $this->helper->quoteColumnName($alias)) : '';
+               $quotedName = $this->helper->quoteColumnName($field);
+               return new QueryFunction('LENGTH(CAST(' . $quotedName . ' as BLOB))' . $alias);
+       }
 }
index 04c5cbd07bde6b7227105cffff22555bd8bf85c9..d4edc8ea9f814181bcebe506efe69c3a944b0234 100644 (file)
@@ -123,6 +123,24 @@ interface IFunctionBuilder {
         */
        public function count($count = '', $alias = ''): IQueryFunction;
 
+       /**
+        * @param string|ILiteral|IParameter|IQueryFunction $field The input to be measured
+        * @param string $alias Alias for the length
+        *
+        * @return IQueryFunction
+        * @since 24.0.0
+        */
+       public function octetLength($field, $alias = ''): IQueryFunction;
+
+       /**
+        * @param string|ILiteral|IParameter|IQueryFunction $field The input to be measured
+        * @param string $alias Alias for the length
+        *
+        * @return IQueryFunction
+        * @since 24.0.0
+        */
+       public function charLength($field, $alias = ''): IQueryFunction;
+
        /**
         * Takes the maximum of all rows in a column
         *
index 3f4b8bb7524433ded67493a0ee78d600f56f2c47..6b13051c2c143f4eed31b2696027b2d03a0f8758 100644 (file)
@@ -336,6 +336,52 @@ class FunctionBuilderTest extends TestCase {
                $this->assertGreaterThan(1, $column);
        }
 
+       public function octetLengthProvider() {
+               return [
+                       ['', 0],
+                       ['foobar', 6],
+                       ['fé', 3],
+                       ['šđčćž', 10],
+               ];
+       }
+
+       /**
+        * @dataProvider octetLengthProvider
+        */
+       public function testOctetLength(string $str, int $bytes) {
+               $query = $this->connection->getQueryBuilder();
+
+               $query->select($query->func()->octetLength($query->createNamedParameter($str, IQueryBuilder::PARAM_STR)));
+
+               $result = $query->execute();
+               $column = $result->fetchOne();
+               $result->closeCursor();
+               $this->assertEquals($bytes, $column);
+       }
+
+       public function charLengthProvider() {
+               return [
+                       ['', 0],
+                       ['foobar', 6],
+                       ['fé', 2],
+                       ['šđčćž', 5],
+               ];
+       }
+
+       /**
+        * @dataProvider charLengthProvider
+        */
+       public function testCharLength(string $str, int $bytes) {
+               $query = $this->connection->getQueryBuilder();
+
+               $query->select($query->func()->charLength($query->createNamedParameter($str, IQueryBuilder::PARAM_STR)));
+
+               $result = $query->execute();
+               $column = $result->fetchOne();
+               $result->closeCursor();
+               $this->assertEquals($bytes, $column);
+       }
+
        private function setUpMinMax($value) {
                $query = $this->connection->getQueryBuilder();