improvement on the Db

Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
pull/51/head
Maxence Lange 2018-11-22 10:46:29 -01:00
rodzic 6a06fd22b1
commit ab9d9fdd37
3 zmienionych plików z 160 dodań i 53 usunięć

Wyświetl plik

@ -84,12 +84,12 @@ class CoreRequestBuilder {
* @param int $id
*/
protected function limitToId(IQueryBuilder &$qb, int $id) {
$this->limitToDBField($qb, 'id', $id);
$this->limitToDBFieldInt($qb, 'id', $id);
}
/**
* Limit the request to the Id
* Limit the request to the Id (string)
*
* @param IQueryBuilder $qb
* @param string $id
@ -100,67 +100,47 @@ class CoreRequestBuilder {
/**
* Limit the request to the OwnerId
* Limit the request to the UserId
*
* @param IQueryBuilder $qb
* @param string $userId
*/
protected function limitToUserId(IQueryBuilder &$qb, $userId) {
protected function limitToUserId(IQueryBuilder &$qb, string $userId) {
$this->limitToDBField($qb, 'user_id', $userId);
}
/**
* Limit the request to the OwnerId
*
* @param IQueryBuilder $qb
* @param string $userId
*/
protected function limitToPreferredUsername(IQueryBuilder &$qb, $userId) {
$this->limitToDBField($qb, 'preferred_username', $userId);
}
/**
* Limit the request to the OwnerId
* Limit the request to the Preferred Username
*
* @param IQueryBuilder $qb
* @param string $username
*/
protected function searchInPreferredUsername(IQueryBuilder &$qb, $username) {
protected function limitToPreferredUsername(IQueryBuilder &$qb, string $username) {
$this->limitToDBField($qb, 'preferred_username', $username);
}
/**
* search using username
*
* @param IQueryBuilder $qb
* @param string $username
*/
protected function searchInPreferredUsername(IQueryBuilder &$qb, string $username) {
$this->searchInDBField($qb, 'preferred_username', $username . '%');
}
/**
* Limit the request to the OwnerId
*
* @param IQueryBuilder $qb
* @param int $accountId
*/
protected function limitToAccountId(IQueryBuilder &$qb, int $accountId) {
$this->limitToDBField($qb, 'account_id', $accountId);
}
/**
* Limit the request to the ServiceId
*
* @param IQueryBuilder $qb
* @param int $serviceId
*/
protected function limitToServiceId(IQueryBuilder &$qb, int $serviceId) {
$this->limitToDBField($qb, 'service_id', $serviceId);
}
/**
* Limit the request to the ActorId
*
* @param IQueryBuilder $qb
* @param string $actorId
* @param string $alias
*/
protected function limitToActorId(IQueryBuilder &$qb, string $actorId) {
$this->limitToDBField($qb, 'actor_id', $actorId);
protected function limitToActorId(IQueryBuilder &$qb, string $actorId, string $alias = '') {
$pf = ($alias === '') ? $this->defaultSelectAlias : $alias;
$this->limitToDBField($qb, $pf . '.' . 'actor_id', $actorId);
}
@ -236,11 +216,22 @@ class CoreRequestBuilder {
* @param IQueryBuilder $qb
* @param string $address
*/
protected function limitToAddress(IQueryBuilder &$qb, $address) {
protected function limitToAddress(IQueryBuilder &$qb, string $address) {
$this->limitToDBField($qb, 'address', $address);
}
/**
* Limit the request to the instance
*
* @param IQueryBuilder $qb
* @param bool $local
*/
protected function limitToLocal(IQueryBuilder &$qb, bool $local) {
$this->limitToDBField($qb, 'local', ($local) ? '1' : '0');
}
/**
* @param IQueryBuilder $qb
* @param string $recipient
@ -257,6 +248,7 @@ class CoreRequestBuilder {
$qb->andWhere($orX);
}
/**
* @param IQueryBuilder $qb
* @param int $since
@ -280,13 +272,51 @@ class CoreRequestBuilder {
$qb->orderBy('creation', 'desc');
}
/**
* @param IQueryBuilder $qb
* @param string $field
* @param string|integer|array $values
* @param bool $cs Case Sensitive
* @param string $value
* @param bool $cs - case sensitive
*/
private function limitToDBField(IQueryBuilder &$qb, string $field, $values, bool $cs = true) {
private function limitToDBField(
IQueryBuilder &$qb, string $field, string $value, bool $cs = true
) {
$expr = $qb->expr();
$pf = ($qb->getType() === QueryBuilder::SELECT) ? $this->defaultSelectAlias . '.' : '';
$field = $pf . $field;
if ($cs) {
$qb->andWhere($expr->eq($field, $qb->createNamedParameter($value)));
} else {
$func = $qb->func();
$qb->andWhere(
$expr->eq($func->lower($field), $func->lower($qb->createNamedParameter($value)))
);
}
}
/**
* @param IQueryBuilder $qb
* @param string $field
* @param int $value
*/
private function limitToDBFieldInt(IQueryBuilder &$qb, string $field, int $value) {
$expr = $qb->expr();
$pf = ($qb->getType() === QueryBuilder::SELECT) ? $this->defaultSelectAlias . '.' : '';
$field = $pf . $field;
$qb->andWhere($expr->eq($field, $qb->createNamedParameter($value)));
}
/**
* @param IQueryBuilder $qb
* @param string $field
* @param array $values
*/
private function limitToDBFieldArray(IQueryBuilder &$qb, string $field, array $values) {
$expr = $qb->expr();
$pf = ($qb->getType() === QueryBuilder::SELECT) ? $this->defaultSelectAlias . '.' : '';
$field = $pf . $field;
@ -297,16 +327,40 @@ class CoreRequestBuilder {
$orX = $expr->orX();
foreach ($values as $value) {
if ($cs) {
$orX->add($expr->eq($field, $qb->createNamedParameter($value)));
} else {
$orX->add($expr->iLike($field, $qb->createNamedParameter($value)));
}
$orX->add($expr->eq($field, $qb->createNamedParameter($value)));
}
$qb->andWhere($orX);
}
// /**
// * @param IQueryBuilder $qb
// * @param string $field
// * @param string|integer|array $values
// * @param bool $cs Case Sensitive
// */
// private function limitToDBField(IQueryBuilder &$qb, string $field, $values, bool $cs = true) {
// $expr = $qb->expr();
// $pf = ($qb->getType() === QueryBuilder::SELECT) ? $this->defaultSelectAlias . '.' : '';
// $field = $pf . $field;
//
// if (!is_array($values)) {
// $values = [$values];
// }
//
// $orX = $expr->orX();
// foreach ($values as $value) {
// if ($cs) {
// $orX->add($expr->eq($field, $qb->createNamedParameter($value)));
// } else {
// $orX->add($expr->iLike($field, $qb->createNamedParameter($value)));
// }
// }
//
// $qb->andWhere($orX);
// }
/**
* @param IQueryBuilder $qb
* @param string $field

Wyświetl plik

@ -138,15 +138,42 @@ class NotesRequest extends NotesRequestBuilder {
/**
* @param int $since
* @param int $limit
* @param string $actorId
*
* @return array
*/
public function getPublicNotes(int $since = 0, int $limit = 5): array {
public function getHomeNotesForActorId(string $actorId): array {
$qb = $this->getNotesSelectSql();
$this->rightJoinFollowing($qb);
$this->limitToActorId($qb, $actorId, 'f');
// $this->leftJoinCacheActors($qb, 'attributed_to');
$notes = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$notes[] = $this->parseNotesSelectSql($data);
}
$cursor->closeCursor();
return $notes;
}
/**
* @param int $since
* @param int $limit
* @param bool $localOnly
*
* @return array
*/
public function getPublicNotes(int $since = 0, int $limit = 5, bool $localOnly = true): array {
$qb = $this->getNotesSelectSql();
$this->limitToRecipient($qb, ActivityService::TO_PUBLIC);
$this->limitPaginate($qb, $since, $limit);
if ($localOnly) {
$this->limitToLocal($qb, true);
}
$this->leftJoinCacheActors($qb, 'attributed_to');
$notes = [];
@ -159,12 +186,13 @@ class NotesRequest extends NotesRequestBuilder {
return $notes;
}
/**
* @param string $actorId
*
* @return array
*/
public function getNotesForActorId(string $actorId): array {
public function getDirectNotesForActorId(string $actorId): array {
$qb = $this->getNotesSelectSql();
$this->limitToRecipient($qb, $actorId);
$this->leftJoinCacheActors($qb, 'attributed_to');

Wyświetl plik

@ -32,6 +32,7 @@ namespace OCA\Social\Db;
use daita\MySmallPhpTools\Traits\TArrayTools;
use DateTime;
use Doctrine\DBAL\Query\QueryBuilder;
use OCA\Social\Exceptions\InvalidResourceException;
use OCA\Social\Model\ActivityPub\Note;
use OCA\Social\Model\InstancePath;
@ -104,6 +105,30 @@ class NotesRequestBuilder extends CoreRequestBuilder {
}
/**
* @param IQueryBuilder $qb
*/
protected function rightJoinFollowing(IQueryBuilder $qb) {
if ($qb->getType() !== QueryBuilder::SELECT) {
return;
}
$expr = $qb->expr();
$pf = $this->defaultSelectAlias;
$orX = $expr->orX();
$orX->add($expr->eq($pf . 'to', 'f.follow_id'));
// $orX->add($expr->like($pf.'to_array', $qb->createNamedParameter('%"' . $recipient . '"%')));
// $orX->add($expr->like($pf.'cc', $qb->createNamedParameter('%"' . $recipient . '"%')));
// $orX->add($expr->like($pf.'bcc', $qb->createNamedParameter('%"' . $recipient . '"%')));
$qb->rightJoin(
$this->defaultSelectAlias, CoreRequestBuilder::TABLE_SERVER_FOLLOWS, 'f',
$orX
);
}
/**
* @param array $data
*