Merge pull request #57756 from nextcloud/carl/function-builder
Some checks are pending
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Integration sqlite / changes (push) Waiting to run
Integration sqlite / integration-sqlite (master, 8.4, main, --tags ~@large files_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, capabilities_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, collaboration_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, comments_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, dav_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, federation_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, file_conversions) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, files_reminders) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, filesdrop_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, ldap_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, openldap_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, openldap_numerical_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, remoteapi_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, routing_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, setup_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, sharees_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, sharing_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, theming_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, videoverification_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite-summary (push) Blocked by required conditions
Psalm static code analysis / static-code-analysis (push) Waiting to run
Psalm static code analysis / static-code-analysis-security (push) Waiting to run
Psalm static code analysis / static-code-analysis-ocp (push) Waiting to run
Psalm static code analysis / static-code-analysis-ncu (push) Waiting to run

This commit is contained in:
Benjamin Gaussorgues 2026-01-26 14:14:51 +01:00 committed by GitHub
commit 2437046e25
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 22 additions and 9 deletions

View file

@ -798,7 +798,7 @@ class Manager implements ICommentsManager {
$query = $this->dbConn->getQueryBuilder();
$query->select('actor_id')
->selectAlias($query->createFunction('MAX(' . $query->getColumnName('creation_timestamp') . ')'), 'last_comment')
->selectAlias($query->func()->max('creation_timestamp'), 'last_comment')
->from('comments')
->where($query->expr()->eq('object_type', $query->createNamedParameter($objectType)))
->andWhere($query->expr()->eq('object_id', $query->createNamedParameter($objectId)))

View file

@ -13,6 +13,7 @@ use OCP\DB\QueryBuilder\IFunctionBuilder;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\DB\QueryBuilder\IQueryFunction;
use OCP\IDBConnection;
use Override;
class FunctionBuilder implements IFunctionBuilder {
/** @var IDBConnection|Connection */
@ -105,4 +106,9 @@ class FunctionBuilder implements IFunctionBuilder {
public function least($x, $y): IQueryFunction {
return new QueryFunction('LEAST(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')');
}
#[Override]
public function now(): IQueryFunction {
return new QueryFunction('NOW()');
}
}

View file

@ -990,7 +990,7 @@ class QueryBuilder implements IQueryBuilder {
* </code>
*
* @param string $column The column into which the value should be inserted.
* @param IParameter|string $value The value that should be inserted into the column.
* @param IParameter|IQueryFunction|string $value The value that should be inserted into the column.
*
* @return $this This QueryBuilder instance.
*/

View file

@ -29,8 +29,8 @@ class CacheQueryBuilder extends ExtendedQueryBuilder {
public function selectTagUsage(): self {
$this
->select('systemtag.name', 'systemtag.id', 'systemtag.visibility', 'systemtag.editable', 'systemtag.etag', 'systemtag.color')
->selectAlias($this->createFunction('COUNT(filecache.fileid)'), 'number_files')
->selectAlias($this->createFunction('MAX(filecache.fileid)'), 'ref_file_id')
->selectAlias($this->func()->count('filecache.fileid'), 'number_files')
->selectAlias($this->func()->max('filecache.fileid'), 'ref_file_id')
->from('filecache', 'filecache')
->leftJoin('filecache', 'systemtag_object_mapping', 'systemtagmap', $this->expr()->andX(
$this->expr()->eq('filecache.fileid', $this->expr()->castColumn('systemtagmap.objectid', IQueryBuilder::PARAM_INT)),

View file

@ -63,7 +63,7 @@ class MetadataRequestService {
->setValue('file_id', $qb->createNamedParameter($filesMetadata->getFileId(), IQueryBuilder::PARAM_INT))
->setValue('json', $qb->createNamedParameter(json_encode($filesMetadata->jsonSerialize())))
->setValue('sync_token', $qb->createNamedParameter($this->generateSyncToken()))
->setValue('last_update', (string)$qb->createFunction('NOW()'));
->setValue('last_update', $qb->func()->now());
$qb->executeStatement();
}
@ -159,7 +159,7 @@ class MetadataRequestService {
->hintShardKey('files_metadata', $this->getStorageId($filesMetadata))
->set('json', $qb->createNamedParameter(json_encode($filesMetadata->jsonSerialize())))
->set('sync_token', $qb->createNamedParameter($this->generateSyncToken()))
->set('last_update', $qb->createFunction('NOW()'))
->set('last_update', $qb->func()->now())
->where(
$expr->andX(
$expr->eq('file_id', $qb->createNamedParameter($filesMetadata->getFileId(), IQueryBuilder::PARAM_INT)),

View file

@ -170,4 +170,10 @@ interface IFunctionBuilder {
* @since 18.0.0
*/
public function least($x, $y): IQueryFunction;
/**
* Get the current date and time as a UNIX timestamp.
* @since 34.0.0
*/
public function now(): IQueryFunction;
}

View file

@ -770,7 +770,7 @@ interface IQueryBuilder {
* </code>
*
* @param string $column The column into which the value should be inserted.
* @param IParameter|string $value The value that should be inserted into the column.
* @param IParameter|IQueryFunction|string $value The value that should be inserted into the column.
*
* @return $this This QueryBuilder instance.
* @since 8.2.0
@ -1001,9 +1001,10 @@ interface IQueryBuilder {
public function createParameter($name);
/**
* Creates a new function
* Creates a new function.
*
* Attention: Column names inside the call have to be quoted before hand
* @warning Column names inside the call have to be quoted beforehand. In most
* case you can use the IFunctionBuilder instead.
*
* Example:
* <code>