migrate therinaldos.com data
Build & Deploy to DigitalOcean Space / build (push) Failing after 2m38s

This commit is contained in:
2024-05-05 15:50:45 -04:00
commit ef1ff240d4
23182 changed files with 3801898 additions and 0 deletions
@@ -0,0 +1,80 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2021 Robin Appelman <robin@icewind.nl>
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @author Robin Appelman <robin@icewind.nl>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Files\Search\QueryOptimizer;
use OC\Files\Search\SearchComparison;
use OCP\Files\Search\ISearchBinaryOperator;
use OCP\Files\Search\ISearchComparison;
use OCP\Files\Search\ISearchOperator;
class PathPrefixOptimizer extends QueryOptimizerStep {
private bool $useHashEq = true;
public function inspectOperator(ISearchOperator $operator): void {
// normally any `path = "$path"` search filter would be generated as an `path_hash = md5($path)` sql query
// since the `path_hash` sql column usually provides much faster querying that selecting on the `path` sql column
//
// however, if we're already doing a filter on the `path` column in the form of `path LIKE "$prefix/%"`
// generating a `path = "$prefix"` sql query lets the database handle use the same column for both expressions and potentially use the same index
//
// If there is any operator in the query that matches this pattern, we change all `path = "$path"` instances to not the `path_hash` equality,
// otherwise mariadb has a tendency of ignoring the path_prefix index
if ($this->useHashEq && $this->isPathPrefixOperator($operator)) {
$this->useHashEq = false;
}
parent::inspectOperator($operator);
}
public function processOperator(ISearchOperator &$operator) {
if (!$this->useHashEq && $operator instanceof ISearchComparison && !$operator->getExtra() && $operator->getField() === 'path' && $operator->getType() === ISearchComparison::COMPARE_EQUAL) {
$operator->setQueryHint(ISearchComparison::HINT_PATH_EQ_HASH, false);
}
parent::processOperator($operator);
}
private function isPathPrefixOperator(ISearchOperator $operator): bool {
if ($operator instanceof ISearchBinaryOperator && $operator->getType() === ISearchBinaryOperator::OPERATOR_OR && count($operator->getArguments()) == 2) {
$a = $operator->getArguments()[0];
$b = $operator->getArguments()[1];
if ($this->operatorPairIsPathPrefix($a, $b) || $this->operatorPairIsPathPrefix($b, $a)) {
return true;
}
}
return false;
}
private function operatorPairIsPathPrefix(ISearchOperator $like, ISearchOperator $equal): bool {
return (
$like instanceof ISearchComparison && $equal instanceof ISearchComparison &&
!$like->getExtra() && !$equal->getExtra() && $like->getField() === 'path' && $equal->getField() === 'path' &&
$like->getType() === ISearchComparison::COMPARE_LIKE_CASE_SENSITIVE && $equal->getType() === ISearchComparison::COMPARE_EQUAL
&& $like->getValue() === SearchComparison::escapeLikeParameter($equal->getValue()) . '/%'
);
}
}
@@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2021 Robin Appelman <robin@icewind.nl>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Files\Search\QueryOptimizer;
use OCP\Files\Search\ISearchOperator;
class QueryOptimizer {
/** @var QueryOptimizerStep[] */
private $steps = [];
public function __construct(
PathPrefixOptimizer $pathPrefixOptimizer
) {
$this->steps = [
$pathPrefixOptimizer
];
}
public function processOperator(ISearchOperator $operator) {
foreach ($this->steps as $step) {
$step->inspectOperator($operator);
}
foreach ($this->steps as $step) {
$step->processOperator($operator);
}
}
}
@@ -0,0 +1,57 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2021 Robin Appelman <robin@icewind.nl>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Files\Search\QueryOptimizer;
use OCP\Files\Search\ISearchBinaryOperator;
use OCP\Files\Search\ISearchOperator;
class QueryOptimizerStep {
/**
* Allow optimizer steps to inspect the entire query before starting processing
*
* @param ISearchOperator $operator
* @return void
*/
public function inspectOperator(ISearchOperator $operator): void {
if ($operator instanceof ISearchBinaryOperator) {
foreach ($operator->getArguments() as $argument) {
$this->inspectOperator($argument);
}
}
}
/**
* Allow optimizer steps to modify query operators
*
* @param ISearchOperator $operator
* @return void
*/
public function processOperator(ISearchOperator &$operator) {
if ($operator instanceof ISearchBinaryOperator) {
foreach ($operator->getArguments() as $argument) {
$this->processOperator($argument);
}
}
}
}
@@ -0,0 +1,67 @@
<?php
/**
* @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl>
*
* @author Robin Appelman <robin@icewind.nl>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Files\Search;
use OCP\Files\Search\ISearchBinaryOperator;
use OCP\Files\Search\ISearchOperator;
class SearchBinaryOperator implements ISearchBinaryOperator {
/** @var string */
private $type;
/** @var ISearchOperator[] */
private $arguments;
private $hints = [];
/**
* SearchBinaryOperator constructor.
*
* @param string $type
* @param ISearchOperator[] $arguments
*/
public function __construct($type, array $arguments) {
$this->type = $type;
$this->arguments = $arguments;
}
/**
* @return string
*/
public function getType() {
return $this->type;
}
/**
* @return ISearchOperator[]
*/
public function getArguments() {
return $this->arguments;
}
public function getQueryHint(string $name, $default) {
return $this->hints[$name] ?? $default;
}
public function setQueryHint(string $name, $value): void {
$this->hints[$name] = $value;
}
}
@@ -0,0 +1,81 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl>
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @author Robin Appelman <robin@icewind.nl>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Files\Search;
use OCP\Files\Search\ISearchComparison;
class SearchComparison implements ISearchComparison {
private array $hints = [];
public function __construct(
private string $type,
private string $field,
private \DateTime|int|string|bool $value,
private string $extra = ''
) {
}
/**
* @return string
*/
public function getType(): string {
return $this->type;
}
/**
* @return string
*/
public function getField(): string {
return $this->field;
}
/**
* @return \DateTime|int|string|bool
*/
public function getValue(): string|int|bool|\DateTime {
return $this->value;
}
/**
* @return string
* @since 28.0.0
*/
public function getExtra(): string {
return $this->extra;
}
public function getQueryHint(string $name, $default) {
return $this->hints[$name] ?? $default;
}
public function setQueryHint(string $name, $value): void {
$this->hints[$name] = $value;
}
public static function escapeLikeParameter(string $param): string {
return addcslashes($param, '\\_%');
}
}
@@ -0,0 +1,82 @@
<?php
/**
* @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl>
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @author Robin Appelman <robin@icewind.nl>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Files\Search;
use OCP\Files\FileInfo;
use OCP\Files\Search\ISearchOrder;
class SearchOrder implements ISearchOrder {
public function __construct(
private string $direction,
private string $field,
private string $extra = ''
) {
}
/**
* @return string
*/
public function getDirection(): string {
return $this->direction;
}
/**
* @return string
*/
public function getField(): string {
return $this->field;
}
/**
* @return string
* @since 28.0.0
*/
public function getExtra(): string {
return $this->extra;
}
public function sortFileInfo(FileInfo $a, FileInfo $b): int {
$cmp = $this->sortFileInfoNoDirection($a, $b);
return $cmp * ($this->direction === ISearchOrder::DIRECTION_ASCENDING ? 1 : -1);
}
private function sortFileInfoNoDirection(FileInfo $a, FileInfo $b): int {
switch ($this->field) {
case 'name':
return $a->getName() <=> $b->getName();
case 'mimetype':
return $a->getMimetype() <=> $b->getMimetype();
case 'mtime':
return $a->getMtime() <=> $b->getMtime();
case 'size':
return $a->getSize() <=> $b->getSize();
case 'fileid':
return $a->getId() <=> $b->getId();
case 'permissions':
return $a->getPermissions() <=> $b->getPermissions();
default:
return 0;
}
}
}
@@ -0,0 +1,107 @@
<?php
/**
* @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl>
*
* @author Robin Appelman <robin@icewind.nl>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Files\Search;
use OCP\Files\Search\ISearchOperator;
use OCP\Files\Search\ISearchOrder;
use OCP\Files\Search\ISearchQuery;
use OCP\IUser;
class SearchQuery implements ISearchQuery {
/** @var ISearchOperator */
private $searchOperation;
/** @var integer */
private $limit;
/** @var integer */
private $offset;
/** @var ISearchOrder[] */
private $order;
/** @var ?IUser */
private $user;
private $limitToHome;
/**
* SearchQuery constructor.
*
* @param ISearchOperator $searchOperation
* @param int $limit
* @param int $offset
* @param array $order
* @param ?IUser $user
* @param bool $limitToHome
*/
public function __construct(
ISearchOperator $searchOperation,
int $limit,
int $offset,
array $order,
?IUser $user = null,
bool $limitToHome = false
) {
$this->searchOperation = $searchOperation;
$this->limit = $limit;
$this->offset = $offset;
$this->order = $order;
$this->user = $user;
$this->limitToHome = $limitToHome;
}
/**
* @return ISearchOperator
*/
public function getSearchOperation() {
return $this->searchOperation;
}
/**
* @return int
*/
public function getLimit() {
return $this->limit;
}
/**
* @return int
*/
public function getOffset() {
return $this->offset;
}
/**
* @return ISearchOrder[]
*/
public function getOrder() {
return $this->order;
}
/**
* @return ?IUser
*/
public function getUser() {
return $this->user;
}
public function limitToHome(): bool {
return $this->limitToHome;
}
}