Workaround sqlite query issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
@@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
namespace OCA\Deck\Db;
|
namespace OCA\Deck\Db;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
use Exception;
|
use Exception;
|
||||||
use OCA\Deck\AppInfo\Application;
|
use OCA\Deck\AppInfo\Application;
|
||||||
use OCA\Deck\Search\Query\SearchQuery;
|
use OCA\Deck\Search\Query\SearchQuery;
|
||||||
@@ -54,7 +55,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
IUserManager $userManager,
|
IUserManager $userManager,
|
||||||
IGroupManager $groupManager,
|
IGroupManager $groupManager,
|
||||||
IManager $notificationManager,
|
IManager $notificationManager,
|
||||||
$databaseType = 'sqlite',
|
$databaseType = 'sqlite3',
|
||||||
$database4ByteSupport = true
|
$database4ByteSupport = true
|
||||||
) {
|
) {
|
||||||
parent::__construct($db, 'deck_cards', Card::class);
|
parent::__construct($db, 'deck_cards', Card::class);
|
||||||
@@ -380,48 +381,48 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($query->getDuedate() as $duedate) {
|
foreach ($query->getDuedate() as $duedate) {
|
||||||
|
$dueDateColumn = $this->databaseType === 'sqlite3' ? $qb->createFunction('DATETIME(`c`.`duedate`)') : 'c.duedate';
|
||||||
$date = $duedate->getValue();
|
$date = $duedate->getValue();
|
||||||
$supportedFilters = ['overdue', 'today', 'week', 'month', 'none'];
|
$supportedFilters = ['overdue', 'today', 'week', 'month', 'none'];
|
||||||
if (in_array($date, $supportedFilters, true)) {
|
if (in_array($date, $supportedFilters, true)) {
|
||||||
$currentDate = new \DateTime();
|
$currentDate = new DateTime();
|
||||||
$rangeDate = new \DateTime();
|
$rangeDate = new DateTime();
|
||||||
if ($date === 'overdue') {
|
if ($date === 'overdue') {
|
||||||
$qb->andWhere($qb->expr()->lt('c.duedate', $qb->createNamedParameter($currentDate, IQueryBuilder::PARAM_DATE)));
|
$qb->andWhere($qb->expr()->lt($dueDateColumn, $this->dateTimeParameter($qb, $currentDate)));
|
||||||
} elseif ($date === 'today') {
|
} elseif ($date === 'today') {
|
||||||
$rangeDate->add(new \DateInterval('P1D'));
|
$rangeDate = $rangeDate->add(new \DateInterval('P1D'));
|
||||||
$qb->andWhere($qb->expr()->gte('c.duedate', $qb->createNamedParameter($currentDate, IQueryBuilder::PARAM_DATE)));
|
$qb->andWhere($qb->expr()->gte($dueDateColumn, $this->dateTimeParameter($qb, $currentDate)));
|
||||||
$qb->andWhere($qb->expr()->lte('c.duedate', $qb->createNamedParameter($rangeDate, IQueryBuilder::PARAM_DATE)));
|
$qb->andWhere($qb->expr()->lte($dueDateColumn, $this->dateTimeParameter($qb, $rangeDate)));
|
||||||
} elseif ($date === 'week') {
|
} elseif ($date === 'week') {
|
||||||
$rangeDate->add(new \DateInterval('P7D'));
|
$rangeDate = $rangeDate->add(new \DateInterval('P7D'));
|
||||||
$qb->andWhere($qb->expr()->gte('c.duedate', $qb->createNamedParameter($currentDate, IQueryBuilder::PARAM_DATE)));
|
$qb->andWhere($qb->expr()->gte($dueDateColumn, $this->dateTimeParameter($qb, $currentDate)));
|
||||||
$qb->andWhere($qb->expr()->lte('c.duedate', $qb->createNamedParameter($rangeDate, IQueryBuilder::PARAM_DATE)));
|
$qb->andWhere($qb->expr()->lte($dueDateColumn, $this->dateTimeParameter($qb, $rangeDate)));
|
||||||
} elseif ($date === 'month') {
|
} elseif ($date === 'month') {
|
||||||
$rangeDate->add(new \DateInterval('P1M'));
|
$rangeDate = $rangeDate->add(new \DateInterval('P1M'));
|
||||||
$qb->andWhere($qb->expr()->gte('c.duedate', $qb->createNamedParameter($currentDate, IQueryBuilder::PARAM_DATE)));
|
$qb->andWhere($qb->expr()->gte($dueDateColumn, $this->dateTimeParameter($qb, $currentDate)));
|
||||||
$qb->andWhere($qb->expr()->lte('c.duedate', $qb->createNamedParameter($rangeDate, IQueryBuilder::PARAM_DATE)));
|
$qb->andWhere($qb->expr()->lte($dueDateColumn, $this->dateTimeParameter($qb, $rangeDate)));
|
||||||
} else {
|
} else {
|
||||||
$qb->andWhere($qb->expr()->isNull('c.duedate'));
|
$qb->andWhere($qb->expr()->isNull('c.duedate'));
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
try {
|
||||||
try {
|
$date = new DateTime($date);
|
||||||
$date = new \DateTime($date);
|
if ($duedate->getComparator() === SearchQuery::COMPARATOR_LESS) {
|
||||||
if ($duedate->getComparator() === SearchQuery::COMPARATOR_LESS) {
|
$qb->andWhere($qb->expr()->lt($dueDateColumn, $this->dateTimeParameter($qb, $date)));
|
||||||
$qb->andWhere($qb->expr()->lt('c.duedate', $qb->createNamedParameter($date, IQueryBuilder::PARAM_DATE)));
|
} elseif ($duedate->getComparator() === SearchQuery::COMPARATOR_LESS_EQUAL) {
|
||||||
} elseif ($duedate->getComparator() === SearchQuery::COMPARATOR_LESS_EQUAL) {
|
// take the end of the day to include due dates at the same day (as datetime does't allow just setting the day)
|
||||||
// take the end of the day to include due dates at the same day (as datetime does't allow just setting the day)
|
$date->setTime(23, 59, 59);
|
||||||
$date->setTime(23, 59, 59);
|
$qb->andWhere($qb->expr()->lte($dueDateColumn, $this->dateTimeParameter($qb, $date)));
|
||||||
$qb->andWhere($qb->expr()->lte('c.duedate', $qb->createNamedParameter($date, IQueryBuilder::PARAM_DATE)));
|
} elseif ($duedate->getComparator() === SearchQuery::COMPARATOR_MORE) {
|
||||||
} elseif ($duedate->getComparator() === SearchQuery::COMPARATOR_MORE) {
|
// take the end of the day to exclude due dates at the same day (as datetime does't allow just setting the day)
|
||||||
// take the end of the day to exclude due dates at the same day (as datetime does't allow just setting the day)
|
$date->setTime(23, 59, 59);
|
||||||
$date->setTime(23, 59, 59);
|
$qb->andWhere($qb->expr()->gt($dueDateColumn, $this->dateTimeParameter($qb, $date)));
|
||||||
$qb->andWhere($qb->expr()->gt('c.duedate', $qb->createNamedParameter($date, IQueryBuilder::PARAM_DATE)));
|
} elseif ($duedate->getComparator() === SearchQuery::COMPARATOR_MORE_EQUAL) {
|
||||||
} elseif ($duedate->getComparator() === SearchQuery::COMPARATOR_MORE_EQUAL) {
|
$qb->andWhere($qb->expr()->gte($dueDateColumn, $this->dateTimeParameter($qb, $date)));
|
||||||
$qb->andWhere($qb->expr()->gte('c.duedate', $qb->createNamedParameter($date, IQueryBuilder::PARAM_DATE)));
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
// Invalid date, ignoring
|
||||||
}
|
}
|
||||||
} catch (Exception $e) {
|
|
||||||
// Invalid date, ignoring
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -461,6 +462,13 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function dateTimeParameter(IQueryBuilder $qb, DateTime $dateTime) {
|
||||||
|
if ($this->databaseType === 'sqlite3') {
|
||||||
|
return $qb->createFunction('DATETIME("' . $dateTime->format('Y-m-d\TH:i:s') . '")');
|
||||||
|
}
|
||||||
|
return $qb->createNamedParameter($dateTime, IQueryBuilder::PARAM_DATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -116,8 +116,10 @@ class FilterStringParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected function removeQuotes(string $token): string {
|
protected function removeQuotes(string $token): string {
|
||||||
$token = ($token[0] === '"' && $token[mb_strlen($token) - 1] === '"') ? mb_substr($token, 1, -1): $token;
|
if (mb_strlen($token) > 1) {
|
||||||
$token = ($token[0] === '\'' && $token[mb_strlen($token) - 1] === '\'') ? mb_substr($token, 1, -1): $token;
|
$token = ($token[0] === '"' && $token[mb_strlen($token) - 1] === '"') ? mb_substr($token, 1, -1) : $token;
|
||||||
|
$token = ($token[0] === '\'' && $token[mb_strlen($token) - 1] === '\'') ? mb_substr($token, 1, -1) : $token;
|
||||||
|
}
|
||||||
return $token;
|
return $token;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class AQueryParameter {
|
|||||||
protected $value;
|
protected $value;
|
||||||
|
|
||||||
public function getValue() {
|
public function getValue() {
|
||||||
if (is_string($this->value)) {
|
if (is_string($this->value) && mb_strlen($this->value) > 1) {
|
||||||
$param = ($this->value[0] === '"' && $this->value[mb_strlen($this->value) - 1] === '"') ? mb_substr($this->value, 1, -1): $this->value;
|
$param = ($this->value[0] === '"' && $this->value[mb_strlen($this->value) - 1] === '"') ? mb_substr($this->value, 1, -1): $this->value;
|
||||||
return $param;
|
return $param;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user