Skip to content

Commit

Permalink
IBX-7418: Added ContentName Criterion (#312)
Browse files Browse the repository at this point in the history
For more details see https://issues.ibexa.co/browse/IBX-7418 and #312

Key changes:

* Added ContentName Criterion

* Implemented ContentName Criterion handler

* [Tests] Added integration tests coverage

---------

Co-Authored-By: Konrad Oboza <[email protected]>
  • Loading branch information
ciastektk and konradoboza authored Jan 17, 2024
1 parent ed512f1 commit 273aa8c
Show file tree
Hide file tree
Showing 4 changed files with 433 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

namespace Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion;

use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion;
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Operator\Specifications;

final class ContentName extends Criterion
{
public function __construct(string $value)
{
parent::__construct(null, Operator::LIKE, $value);
}

/**
* @return array<\Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Operator\Specifications>
*/
public function getSpecifications(): array
{
return [
new Specifications(Operator::LIKE, Specifications::FORMAT_SINGLE),
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ services:
- {name: ibexa.search.legacy.gateway.criterion_handler.content}
- {name: ibexa.search.legacy.gateway.criterion_handler.location}

Ibexa\Core\Search\Legacy\Content\Common\Gateway\CriterionHandler\ContentName:
parent: Ibexa\Core\Search\Legacy\Content\Common\Gateway\CriterionHandler
tags:
- { name: ibexa.search.legacy.gateway.criterion_handler.content }
- { name: ibexa.search.legacy.gateway.criterion_handler.location }

Ibexa\Core\Search\Legacy\Content\Common\Gateway\CriterionHandler\ContentTypeGroupId:
parent: Ibexa\Core\Search\Legacy\Content\Common\Gateway\CriterionHandler
class: Ibexa\Core\Search\Legacy\Content\Common\Gateway\CriterionHandler\ContentTypeGroupId
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?php

/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

namespace Ibexa\Core\Search\Legacy\Content\Common\Gateway\CriterionHandler;

use Doctrine\DBAL\Query\QueryBuilder;
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion;
use Ibexa\Core\Persistence\Legacy\Content\Gateway;
use Ibexa\Core\Search\Legacy\Content\Common\Gateway\CriteriaConverter;
use Ibexa\Core\Search\Legacy\Content\Common\Gateway\CriterionHandler;

/**
* @internal
*/
final class ContentName extends CriterionHandler
{
private const CONTENTOBJECT_NAME_ALIAS = 'ezc_n';
private const CONTENTOBJECT_ALIAS = 'c';

public function accept(Criterion $criterion): bool
{
return $criterion instanceof Criterion\ContentName
&& $criterion->operator === Criterion\Operator::LIKE;
}

/**
* @param array{
* languages: array<string>,
* useAlwaysAvailable: bool,
* } $languageSettings
*
* @throws \Doctrine\DBAL\Exception
*/
public function handle(
CriteriaConverter $converter,
QueryBuilder $queryBuilder,
Criterion $criterion,
array $languageSettings
): string {
$subQuery = $this->connection->createQueryBuilder();
$subQuery
->select('1')
->from(Gateway::CONTENT_NAME_TABLE, self::CONTENTOBJECT_NAME_ALIAS)
->andWhere(
$queryBuilder->expr()->eq(
self::CONTENTOBJECT_NAME_ALIAS . '.contentobject_id',
self::CONTENTOBJECT_ALIAS . '.id'
),
$queryBuilder->expr()->eq(
self::CONTENTOBJECT_NAME_ALIAS . '.content_version',
self::CONTENTOBJECT_ALIAS . '.current_version'
),
$queryBuilder->expr()->like(
$this->toLowerCase(self::CONTENTOBJECT_NAME_ALIAS . '.name'),
$this->toLowerCase(
$queryBuilder->createNamedParameter(
$this->prepareValue($criterion)
)
)
)
);

return sprintf(
'EXISTS (%s)',
$subQuery->getSQL()
);
}

private function prepareValue(Criterion $criterion): string
{
/** @var string $value */
$value = $criterion->value;

return str_replace(
'*',
'%',
addcslashes(
$value,
'%_'
)
);
}

/**
* @throws \Doctrine\DBAL\Exception
*/
private function toLowerCase(string $value): string
{
return $this->connection->getDatabasePlatform()->getLowerExpression($value);
}
}
Loading

0 comments on commit 273aa8c

Please sign in to comment.