Skip to content

Conversation

adriendupuis
Copy link
Contributor

Question Answer
JIRA Ticket N/A
Versions 4.6, master
Edition All

Fix PHPStan errors after #2591

Checklist

  • Text renders correctly
  • Text has been checked with vale
  • Description metadata is up to date
  • Redirects cover removed/moved pages
  • Code samples are working
  • PHP code samples have been fixed with PHP CS fixer
  • Added link to this PR in relevant JIRA ticket or code PR

@adriendupuis adriendupuis changed the base branch from master to 4.6 February 12, 2025 10:11
@github-actions
Copy link

Preview of modified Markdown: no Markdown change to preview.

@adriendupuis adriendupuis requested a review from mnocon February 12, 2025 10:40
Copy link
Contributor

@mnocon mnocon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\LogicalAnd;
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\ObjectStateIdentifier;
use Ibexa\Contracts\ElasticSearch\Query\Event\QueryFilterEvent;
use Ibexa\Contracts\Elasticsearch\Query\Event\QueryFilterEvent;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch 😄

@github-actions
Copy link

code_samples/ change report

Before (on target branch)After (in current PR)

code_samples/search/custom/src/EventSubscriber/CustomQueryFilterSubscriber.php

docs/search/extensibility/manipulate_elasticsearch_query.md@14:``` php hl_lines="34"
docs/search/extensibility/manipulate_elasticsearch_query.md@15:--8<--
docs/search/extensibility/manipulate_elasticsearch_query.md@16:code_samples/search/custom/src/EventSubscriber/CustomQueryFilterSubscriber.php
docs/search/extensibility/manipulate_elasticsearch_query.md@17:--8<--
docs/search/extensibility/manipulate_elasticsearch_query.md@18:```

001⫶<?php
002⫶
003⫶declare(strict_types=1);
004⫶
005⫶namespace App\EventSubscriber;
006⫶
007⫶use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\LogicalAnd;
008⫶use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\ObjectStateIdentifier;

code_samples/search/custom/src/EventSubscriber/CustomQueryFilterSubscriber.php

docs/search/extensibility/manipulate_elasticsearch_query.md@14:``` php hl_lines="34"
docs/search/extensibility/manipulate_elasticsearch_query.md@15:--8<--
docs/search/extensibility/manipulate_elasticsearch_query.md@16:code_samples/search/custom/src/EventSubscriber/CustomQueryFilterSubscriber.php
docs/search/extensibility/manipulate_elasticsearch_query.md@17:--8<--
docs/search/extensibility/manipulate_elasticsearch_query.md@18:```

001⫶<?php
002⫶
003⫶declare(strict_types=1);
004⫶
005⫶namespace App\EventSubscriber;
006⫶
007⫶use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\LogicalAnd;
008⫶use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\ObjectStateIdentifier;
009⫶use Ibexa\Contracts\ElasticSearch\Query\Event\QueryFilterEvent;
009⫶use Ibexa\Contracts\Elasticsearch\Query\Event\QueryFilterEvent;
010⫶use Symfony\Component\EventDispatcher\EventSubscriberInterface;
011⫶
012⫶final class CustomQueryFilterSubscriber implements EventSubscriberInterface
013⫶{
014⫶ public function onQueryFilter(QueryFilterEvent $event): void
015⫶ {
016⫶ $query = $event->getQuery();
017⫶
018⫶ $additionalCriteria = new ObjectStateIdentifier('locked');
019⫶
020⫶ if ($query->filter !== null) {
021⫶ $query->filter = $additionalCriteria;
022⫶ } else {
023⫶ // Append Criterion to existing filter
024⫶ $query->filter = new LogicalAnd([
025⫶ $query->filter,
026⫶ $additionalCriteria,
027⫶ ]);
028⫶ }
029⫶ }
030⫶
031⫶ public static function getSubscribedEvents(): array
032⫶ {
033⫶ return [
034❇️ QueryFilterEvent::class => 'onQueryFilter',
035⫶ ];
036⫶ }
037⫶}


code_samples/search/custom/src/Query/Aggregation/Elasticsearch/PriorityRangeAggregationVisitor.php

docs/search/extensibility/create_custom_aggregation.md@151: ``` php
docs/search/extensibility/create_custom_aggregation.md@152: --8<--
docs/search/extensibility/create_custom_aggregation.md@153: code_samples/search/custom/src/Query/Aggregation/Elasticsearch/PriorityRangeAggregationVisitor.php
docs/search/extensibility/create_custom_aggregation.md@154: --8<--
docs/search/extensibility/create_custom_aggregation.md@155: ```

001⫶<?php
002⫶
003⫶declare(strict_types=1);
004⫶
005⫶namespace App\Query\Aggregation\Elasticsearch;
006⫶
007⫶use App\Query\Aggregation\PriorityRangeAggregation;
008⫶use Ibexa\Contracts\Core\Repository\Values\Content\Query\Aggregation;
009⫶use Ibexa\Contracts\Elasticsearch\Query\AggregationVisitor;
010⫶use Ibexa\Contracts\Elasticsearch\Query\LanguageFilter;
011⫶
012⫶final class PriorityRangeAggregationVisitor implements AggregationVisitor
013⫶{
014⫶ public function supports(Aggregation $aggregation, LanguageFilter $languageFilter): bool
015⫶ {
016⫶ return $aggregation instanceof PriorityRangeAggregation;
017⫶ }
018⫶
019⫶ /**
020⫶ * @param \App\Query\Aggregation\PriorityRangeAggregation $aggregation
010⫶use Symfony\Component\EventDispatcher\EventSubscriberInterface;
011⫶
012⫶final class CustomQueryFilterSubscriber implements EventSubscriberInterface
013⫶{
014⫶ public function onQueryFilter(QueryFilterEvent $event): void
015⫶ {
016⫶ $query = $event->getQuery();
017⫶
018⫶ $additionalCriteria = new ObjectStateIdentifier('locked');
019⫶
020⫶ if ($query->filter !== null) {
021⫶ $query->filter = $additionalCriteria;
022⫶ } else {
023⫶ // Append Criterion to existing filter
024⫶ $query->filter = new LogicalAnd([
025⫶ $query->filter,
026⫶ $additionalCriteria,
027⫶ ]);
028⫶ }
029⫶ }
030⫶
031⫶ public static function getSubscribedEvents(): array
032⫶ {
033⫶ return [
034❇️ QueryFilterEvent::class => 'onQueryFilter',
035⫶ ];
036⫶ }
037⫶}


code_samples/search/custom/src/Query/Aggregation/Elasticsearch/PriorityRangeAggregationVisitor.php

docs/search/extensibility/create_custom_aggregation.md@151: ``` php
docs/search/extensibility/create_custom_aggregation.md@152: --8<--
docs/search/extensibility/create_custom_aggregation.md@153: code_samples/search/custom/src/Query/Aggregation/Elasticsearch/PriorityRangeAggregationVisitor.php
docs/search/extensibility/create_custom_aggregation.md@154: --8<--
docs/search/extensibility/create_custom_aggregation.md@155: ```

001⫶<?php
002⫶
003⫶declare(strict_types=1);
004⫶
005⫶namespace App\Query\Aggregation\Elasticsearch;
006⫶
007⫶use App\Query\Aggregation\PriorityRangeAggregation;
008⫶use Ibexa\Contracts\Core\Repository\Values\Content\Query\Aggregation;
009⫶use Ibexa\Contracts\Elasticsearch\Query\AggregationVisitor;
010⫶use Ibexa\Contracts\Elasticsearch\Query\LanguageFilter;
011⫶
012⫶final class PriorityRangeAggregationVisitor implements AggregationVisitor
013⫶{
014⫶ public function supports(Aggregation $aggregation, LanguageFilter $languageFilter): bool
015⫶ {
016⫶ return $aggregation instanceof PriorityRangeAggregation;
017⫶ }
018⫶
019⫶ /**
020⫶ * @param \App\Query\Aggregation\PriorityRangeAggregation $aggregation
021⫶     */
022⫶ public function visit(AggregationVisitor $dispatcher, Aggregation $aggregation, LanguageFilter $languageFilter): array
023⫶ {
024⫶ $ranges = [];
025⫶
026⫶ foreach ($aggregation->getRanges() as $range) {
027⫶ if ($range->getFrom() !== null && $range->getTo() !== null) {
028⫶ $ranges[] = [
029⫶ 'from' => $range->getFrom(),
030⫶ 'to' => $range->getTo(),
031⫶ ];
032⫶ } elseif ($range->getFrom() === null && $range->getTo() !== null) {
033⫶ $ranges[] = [
034⫶ 'to' => $range->getTo(),
035⫶ ];
036⫶ } elseif ($range->getFrom() !== null && $range->getTo() === null) {
037⫶ $ranges[] = [
038⫶ 'from' => $range->getFrom(),
039⫶ ];
040⫶ } else {
041⫶ // invalid range
042⫶ }
043⫶ }
044⫶
045⫶ return [
046⫶ 'range' => [
047⫶ 'field' => 'priority_i',
048⫶ 'ranges' => $ranges,
049⫶ ],
050⫶ ];
051⫶ }
052⫶}
021⫶     *
022⫶ * @return array<string, array<string, mixed>>
023⫶ */
024⫶ public function visit(AggregationVisitor $dispatcher, Aggregation $aggregation, LanguageFilter $languageFilter): array
025⫶ {
026⫶ $ranges = [];
027⫶
028⫶ foreach ($aggregation->getRanges() as $range) {
029⫶ if ($range->getFrom() !== null && $range->getTo() !== null) {
030⫶ $ranges[] = [
031⫶ 'from' => $range->getFrom(),
032⫶ 'to' => $range->getTo(),
033⫶ ];
034⫶ } elseif ($range->getFrom() === null && $range->getTo() !== null) {
035⫶ $ranges[] = [
036⫶ 'to' => $range->getTo(),
037⫶ ];
038⫶ } elseif ($range->getFrom() !== null && $range->getTo() === null) {
039⫶ $ranges[] = [
040⫶ 'from' => $range->getFrom(),
041⫶ ];
042⫶ } else {
043⫶ // invalid range
044⫶ }
045⫶ }
046⫶
047⫶ return [
048⫶ 'range' => [
049⫶ 'field' => 'priority_i',
050⫶ 'ranges' => $ranges,
051⫶ ],
052⫶ ];
053⫶ }
054⫶}


code_samples/search/custom/src/Query/Criterion/Elasticsearch/CameraManufacturerVisitor.php

docs/search/extensibility/create_custom_search_criterion.md@33: ``` php
docs/search/extensibility/create_custom_search_criterion.md@34: --8<--
docs/search/extensibility/create_custom_search_criterion.md@35: code_samples/search/custom/src/Query/Criterion/Elasticsearch/CameraManufacturerVisitor.php
docs/search/extensibility/create_custom_search_criterion.md@36: --8<--
docs/search/extensibility/create_custom_search_criterion.md@37: ```

001⫶<?php
002⫶
003⫶declare(strict_types=1);
004⫶
005⫶namespace App\Query\Criterion\Elasticsearch;
006⫶
007⫶use App\Query\Criterion\CameraManufacturerCriterion;
008⫶use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion;
009⫶use Ibexa\Contracts\Elasticsearch\Query\CriterionVisitor;
010⫶use Ibexa\Contracts\Elasticsearch\Query\LanguageFilter;
011⫶
012⫶final class CameraManufacturerVisitor implements CriterionVisitor
013⫶{
014⫶ public function supports(Criterion $criterion, LanguageFilter $languageFilter): bool
015⫶ {
016⫶ return $criterion instanceof CameraManufacturerCriterion;
017⫶ }
018⫶
019⫶ /**


code_samples/search/custom/src/Query/Criterion/Elasticsearch/CameraManufacturerVisitor.php

docs/search/extensibility/create_custom_search_criterion.md@33: ``` php
docs/search/extensibility/create_custom_search_criterion.md@34: --8<--
docs/search/extensibility/create_custom_search_criterion.md@35: code_samples/search/custom/src/Query/Criterion/Elasticsearch/CameraManufacturerVisitor.php
docs/search/extensibility/create_custom_search_criterion.md@36: --8<--
docs/search/extensibility/create_custom_search_criterion.md@37: ```

001⫶<?php
002⫶
003⫶declare(strict_types=1);
004⫶
005⫶namespace App\Query\Criterion\Elasticsearch;
006⫶
007⫶use App\Query\Criterion\CameraManufacturerCriterion;
008⫶use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion;
009⫶use Ibexa\Contracts\Elasticsearch\Query\CriterionVisitor;
010⫶use Ibexa\Contracts\Elasticsearch\Query\LanguageFilter;
011⫶
012⫶final class CameraManufacturerVisitor implements CriterionVisitor
013⫶{
014⫶ public function supports(Criterion $criterion, LanguageFilter $languageFilter): bool
015⫶ {
016⫶ return $criterion instanceof CameraManufacturerCriterion;
017⫶ }
018⫶
019⫶ /**
020⫶     * @param \App\Query\Criterion\Elasticsearch\CameraManufacturerCriterion $criterion
020⫶     * @param \App\Query\Criterion\CameraManufacturerCriterion $criterion
021⫶     */
022⫶ public function visit(CriterionVisitor $dispatcher, Criterion $criterion, LanguageFilter $languageFilter): array
023⫶ {
024⫶ return [
025⫶ 'terms' => [
026⫶ 'exif_camera_manufacturer_id' => (array)$criterion->value,
027⫶ ],
028⫶ ];
029⫶ }
030⫶}


code_samples/search/custom/src/Query/Criterion/Solr/CameraManufacturerVisitor.php

docs/search/extensibility/create_custom_search_criterion.md@25: ``` php
docs/search/extensibility/create_custom_search_criterion.md@26: --8<--
docs/search/extensibility/create_custom_search_criterion.md@27: code_samples/search/custom/src/Query/Criterion/Solr/CameraManufacturerVisitor.php
docs/search/extensibility/create_custom_search_criterion.md@28: --8<--
docs/search/extensibility/create_custom_search_criterion.md@29: ```

001⫶<?php
002⫶
003⫶declare(strict_types=1);
004⫶
005⫶namespace App\Query\Criterion\Solr;
006⫶
007⫶use App\Query\Criterion\CameraManufacturerCriterion;
008⫶use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion;
009⫶use Ibexa\Contracts\Solr\Query\CriterionVisitor;
010⫶
011⫶final class CameraManufacturerVisitor extends CriterionVisitor
012⫶{
013⫶ public function canVisit(Criterion $criterion)
014⫶ {
015⫶ return $criterion instanceof CameraManufacturerCriterion;
016⫶ }
017⫶
018⫶ /**
021⫶     */
022⫶ public function visit(CriterionVisitor $dispatcher, Criterion $criterion, LanguageFilter $languageFilter): array
023⫶ {
024⫶ return [
025⫶ 'terms' => [
026⫶ 'exif_camera_manufacturer_id' => (array)$criterion->value,
027⫶ ],
028⫶ ];
029⫶ }
030⫶}


code_samples/search/custom/src/Query/Criterion/Solr/CameraManufacturerVisitor.php

docs/search/extensibility/create_custom_search_criterion.md@25: ``` php
docs/search/extensibility/create_custom_search_criterion.md@26: --8<--
docs/search/extensibility/create_custom_search_criterion.md@27: code_samples/search/custom/src/Query/Criterion/Solr/CameraManufacturerVisitor.php
docs/search/extensibility/create_custom_search_criterion.md@28: --8<--
docs/search/extensibility/create_custom_search_criterion.md@29: ```

001⫶<?php
002⫶
003⫶declare(strict_types=1);
004⫶
005⫶namespace App\Query\Criterion\Solr;
006⫶
007⫶use App\Query\Criterion\CameraManufacturerCriterion;
008⫶use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion;
009⫶use Ibexa\Contracts\Solr\Query\CriterionVisitor;
010⫶
011⫶final class CameraManufacturerVisitor extends CriterionVisitor
012⫶{
013⫶ public function canVisit(Criterion $criterion)
014⫶ {
015⫶ return $criterion instanceof CameraManufacturerCriterion;
016⫶ }
017⫶
018⫶ /**
019⫶     * @param \App\Query\Criterion\Solr\CameraManufacturerCriterion $criterion
019⫶     * @param \App\Query\Criterion\CameraManufacturerCriterion $criterion
020⫶     */
021⫶ public function visit(Criterion $criterion, CriterionVisitor $subVisitor = null)
022⫶ {
023⫶ $expressions = array_map(
024⫶ function ($value): string {
025⫶ return 'exif_camera_manufacturer_id:"' . $this->escapeQuote((string) $value) . '"';
026⫶ },
027⫶ $criterion->value
028⫶ );
029⫶
030⫶ return '(' . implode(' OR ', $expressions) . ')';
031⫶ }
032⫶}

020⫶     */
021⫶ public function visit(Criterion $criterion, CriterionVisitor $subVisitor = null)
022⫶ {
023⫶ $expressions = array_map(
024⫶ function ($value): string {
025⫶ return 'exif_camera_manufacturer_id:"' . $this->escapeQuote((string) $value) . '"';
026⫶ },
027⫶ $criterion->value
028⫶ );
029⫶
030⫶ return '(' . implode(' OR ', $expressions) . ')';
031⫶ }
032⫶}

Download colorized diff

@adriendupuis adriendupuis merged commit b5ea60f into 4.6 Feb 12, 2025
7 checks passed
@adriendupuis adriendupuis deleted the fix-search-phpstan branch February 12, 2025 12:24
adriendupuis added a commit that referenced this pull request Feb 12, 2025
* Fix errors found by PHPStan
* code_samples_usage.php: Tri more visible 'highlighted line' marker
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants