Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
bbe0613
IBX-10494: Included Postgres 18 on CI
micszo Oct 2, 2025
826bbe4
Fixed inconsistent test
Steveb-p Oct 6, 2025
fe8e46a
Postgres 14 & 18 setup
micszo Oct 6, 2025
c51726f
Image in matrix for Postgres int tests
micszo Oct 14, 2025
47e3d44
Image in matrix for MySQL int tests
micszo Oct 14, 2025
65100e2
Dedicated action for installation of composer packages
micszo Oct 14, 2025
7365d29
reformat code
micszo Oct 14, 2025
bd6a19b
fixup! reformat code
micszo Oct 14, 2025
6f7a043
Refactored location sorting logic in query builders and enhance filte…
mikadamczyk Nov 20, 2025
56ac7dc
Refactored sorting field names in query builders for consistency
mikadamczyk Nov 24, 2025
4081616
Enhanced query wrapping to include dynamic select columns based on or…
mikadamczyk Nov 24, 2025
6ac0505
Refactored location filtering logic and removed redundant query wrapping
mikadamczyk Nov 25, 2025
a3b8119
Refactored ContentFilteringTest to use getContentInfo() for mainLocat…
mikadamczyk Dec 2, 2025
efc67f3
Refactored sorting expression methods for location query builders
mikadamczyk Dec 3, 2025
563fb12
Added unit test for BaseLocationSortClauseQueryBuilder
mikadamczyk Dec 3, 2025
15c916b
Added legacy location sort clause and query builder for filtering
mikadamczyk Dec 3, 2025
5d1425e
Refactored legacy filtering setup and improved type handling in tests
mikadamczyk Dec 3, 2025
8908de8
Rebuilt service container to ensure test-only services are loaded
mikadamczyk Dec 4, 2025
c38b6f0
Refactored LegacyContentFilteringTest to use RepositoryTestCase and i…
mikadamczyk Dec 4, 2025
55adf48
Refactored location sorting logic
mikadamczyk Dec 11, 2025
2ed3721
Refactored ContentFilteringTest to simplify non-main location retrieval
mikadamczyk Dec 11, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
192 changes: 62 additions & 130 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,17 @@ jobs:
php:
- '8.1'
steps:
- uses: actions/checkout@v5

- name: Setup PHP Action
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
extensions: 'pdo_sqlite, gd'
tools: cs2pr
- uses: actions/checkout@v5

- uses: ramsey/composer-install@v3
with:
dependency-versions: "highest"
- uses: ibexa/gh-workflows/actions/composer-install@main
with:
gh-client-id: ${{ secrets.AUTOMATION_CLIENT_ID }}
gh-client-secret: ${{ secrets.AUTOMATION_CLIENT_SECRET }}
satis-network-key: ${{ secrets.SATIS_NETWORK_KEY }}
satis-network-token: ${{ secrets.SATIS_NETWORK_TOKEN }}

- name: Run code style check
run: composer run-script check-cs -- --format=checkstyle | cs2pr
- name: Run code style check
run: composer run-script check-cs -- --format=checkstyle | cs2pr

tests:
name: Unit tests & SQLite integration tests
Expand All @@ -47,38 +42,33 @@ jobs:
- '8.1'

steps:
- uses: actions/checkout@v5

- name: Setup PHP Action
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
extensions: pdo_sqlite, gd
tools: cs2pr
- uses: actions/checkout@v5

- uses: ramsey/composer-install@v3
with:
dependency-versions: "highest"
- uses: ibexa/gh-workflows/actions/composer-install@main
with:
gh-client-id: ${{ secrets.AUTOMATION_CLIENT_ID }}
gh-client-secret: ${{ secrets.AUTOMATION_CLIENT_SECRET }}
satis-network-key: ${{ secrets.SATIS_NETWORK_KEY }}
satis-network-token: ${{ secrets.SATIS_NETWORK_TOKEN }}

- name: Setup problem matchers for PHPUnit
run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
- name: Setup problem matchers for PHPUnit
run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

- name: Run PHPStan analysis
run: composer run-script phpstan
- name: Run PHPStan analysis
run: composer run-script phpstan

- name: Run unit test suite
run: composer run-script unit
- name: Run unit test suite
run: composer run-script unit

- name: Run integration test suite
run: composer run-script integration
- name: Run integration test suite
run: composer run-script integration

integration-tests-postgres:
name: PostgreSQL integration tests
needs: tests
services:
postgres:
image: postgres:14
image: ${{ matrix.image }}
ports:
- 5432
env:
Expand All @@ -100,21 +90,19 @@ jobs:
- '7.4'
- '8.0'
- '8.1'
image:
- 'postgres:14'
- 'postgres:18'

steps:
- uses: actions/checkout@v5

- name: Setup PHP Action
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
extensions: pdo_pgsql, gd
tools: cs2pr

- uses: ramsey/composer-install@v3
- uses: ibexa/gh-workflows/actions/composer-install@main
with:
dependency-versions: "highest"
gh-client-id: ${{ secrets.AUTOMATION_CLIENT_ID }}
gh-client-secret: ${{ secrets.AUTOMATION_CLIENT_SECRET }}
satis-network-key: ${{ secrets.SATIS_NETWORK_KEY }}
satis-network-token: ${{ secrets.SATIS_NETWORK_TOKEN }}

- name: Setup problem matchers for PHPUnit
run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
Expand All @@ -126,12 +114,12 @@ jobs:
# Required by old repository tests
DATABASE: "pgsql://postgres:postgres@localhost:${{ job.services.postgres.ports[5432] }}/testdb"

integration-tests-mysql-80:
name: MySQL integration tests (8.0)
integration-tests-mysql:
name: MySQL integration tests
needs: tests
services:
mysql:
image: mysql:8.0
image: ${{ matrix.image }}
ports:
- 3306/tcp
env:
Expand All @@ -155,75 +143,19 @@ jobs:
- '7.4'
- '8.0'
- '8.1'
image:
- 'mysql:8.0'
- 'mysql:8.4'

steps:
- uses: actions/checkout@v5

- name: Setup PHP Action
uses: shivammathur/setup-php@v2
- uses: ibexa/gh-workflows/actions/composer-install@main
with:
php-version: ${{ matrix.php }}
coverage: none
extensions: pdo_mysql, gd, redis
tools: cs2pr

- uses: ramsey/composer-install@v3
with:
dependency-versions: "highest"

- name: Setup problem matchers for PHPUnit
run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

- name: Run integration test suite vs MySQL
run: composer run-script integration
env:
DATABASE_URL: "mysql://mysql:[email protected]:${{ job.services.mysql.ports[3306] }}/testdb"
DATABASE: "mysql://mysql:[email protected]:${{ job.services.mysql.ports[3306] }}/testdb"

integration-tests-mysql-84:
name: MySQL integration tests (8.4)
needs: tests
services:
mysql:
image: mysql:8.4
ports:
- 3306/tcp
env:
MYSQL_RANDOM_ROOT_PASSWORD: true
MYSQL_USER: mysql
MYSQL_PASSWORD: mysql
MYSQL_DATABASE: testdb
options: >-
--health-cmd="mysqladmin ping"
--health-interval=10s
--health-timeout=5s
--health-retries=5
--tmpfs=/var/lib/mysql
runs-on: "ubuntu-24.04"
timeout-minutes: 60

strategy:
fail-fast: false
matrix:
php:
- '7.4'
- '8.0'
- '8.1'

steps:
- uses: actions/checkout@v5

- name: Setup PHP Action
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
extensions: pdo_mysql, gd, redis
tools: cs2pr

- uses: ramsey/composer-install@v3
with:
dependency-versions: "highest"
gh-client-id: ${{ secrets.AUTOMATION_CLIENT_ID }}
gh-client-secret: ${{ secrets.AUTOMATION_CLIENT_SECRET }}
satis-network-key: ${{ secrets.SATIS_NETWORK_KEY }}
satis-network-token: ${{ secrets.SATIS_NETWORK_TOKEN }}

- name: Setup problem matchers for PHPUnit
run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
Expand Down Expand Up @@ -265,28 +197,28 @@ jobs:
- '8.0'
- '8.1'
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- uses: actions/checkout@v5
with:
fetch-depth: 0

- name: Setup PHP Action
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
- name: Setup PHP Action
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none

- name: Add solr dependency
run: |
VERSION=$(jq -r '.extra | ."branch-alias" | ."dev-main"' < composer.json)
composer require --no-update "ibexa/solr:$VERSION"
- name: Add solr dependency
run: |
VERSION=$(jq -r '.extra | ."branch-alias" | ."dev-main"' < composer.json)
composer require --no-update "ibexa/solr:$VERSION"

- uses: ramsey/composer-install@v3
with:
dependency-versions: "highest"
- uses: ramsey/composer-install@v3
with:
dependency-versions: "highest"

- name: Run integration test suite
run: composer test-integration-solr
env:
- name: Run integration test suite
run: composer test-integration-solr
env:
CUSTOM_CACHE_POOL: singleredis
CACHE_HOST: 127.0.0.1
CORES_SETUP: single
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Ibexa\Contracts\Core\Persistence\Filter\Doctrine\FilteringQueryBuilder;
use Ibexa\Contracts\Core\Repository\Values\Filter\CriterionQueryBuilder;
use Ibexa\Contracts\Core\Repository\Values\Filter\FilteringCriterion;
use Ibexa\Core\Persistence\Legacy\Content\Location\Gateway as LocationGateway;

/**
* @internal for internal use by Repository Filtering
Expand All @@ -21,10 +22,35 @@ public function buildQueryConstraint(
FilteringQueryBuilder $queryBuilder,
FilteringCriterion $criterion
): ?string {
$queryBuilder->joinAllLocations();
if ($this->isLocationFilteringContext($queryBuilder)) {
return null;
}

$expressionBuilder = $queryBuilder->expr();
$queryBuilder->joinOnce(
'content',
LocationGateway::CONTENT_TREE_TABLE,
'location',
(string)$expressionBuilder->andX(
'content.id = location.contentobject_id',
'location.node_id = location.main_node_id'
)
);

return null;
}

private function isLocationFilteringContext(FilteringQueryBuilder $queryBuilder): bool
{
$fromParts = $queryBuilder->getQueryPart('from');
foreach ($fromParts as $fromPart) {
if (($fromPart['alias'] ?? null) === 'location') {
return true;
}
}

return false;
}
}

class_alias(BaseLocationCriterionQueryBuilder::class, 'eZ\Publish\Core\Persistence\Legacy\Filter\CriterionQueryBuilder\Location\BaseLocationCriterionQueryBuilder');
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\FetchMode;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Query\QueryBuilder;
use Ibexa\Contracts\Core\Persistence\Filter\CriterionVisitor;
use Ibexa\Contracts\Core\Persistence\Filter\Doctrine\FilteringQueryBuilder;
use Ibexa\Contracts\Core\Persistence\Filter\SortClauseVisitor;
Expand All @@ -23,7 +22,6 @@
use Ibexa\Core\Persistence\Legacy\Content\Location\Gateway as LocationGateway;
use Ibexa\Core\Persistence\Legacy\Filter\Gateway\Gateway;
use function iterator_to_array;
use function sprintf;
use Traversable;

/**
Expand Down Expand Up @@ -110,14 +108,12 @@ public function find(
$names = $this->bulkFetchVersionNames(clone $query);
$fieldValues = $this->bulkFetchFieldValues(clone $query);

// wrap query to avoid duplicate entries for multiple Locations
$wrappedQuery = $this->wrapMainQuery($query);
$wrappedQuery->setFirstResult($offset);
$query->setFirstResult($offset);
if ($limit > 0) {
$wrappedQuery->setMaxResults($limit);
$query->setMaxResults($limit);
}

$resultStatement = $wrappedQuery->execute();
$resultStatement = $query->execute();
while (false !== ($row = $resultStatement->fetch(FetchMode::ASSOCIATIVE))) {
$contentId = (int)$row['content_id'];
$versionNo = (int)$row['content_version_no'];
Expand Down Expand Up @@ -274,21 +270,6 @@ private function getColumns(): Traversable
yield "{$columnName} AS {$columnAlias}";
}
}

/**
* Wrap query to avoid duplicate entries for multiple Locations.
*/
private function wrapMainQuery(FilteringQueryBuilder $query): QueryBuilder
{
$wrappedQuery = $this->connection->createQueryBuilder();
$wrappedQuery
->select(array_keys(self::COLUMN_MAP))
->distinct()
->from(sprintf('(%s)', $query->getSQL()), 'wrapped')
->setParameters($query->getParameters(), $query->getParameterTypes());

return $wrappedQuery;
}
}

class_alias(DoctrineGateway::class, 'eZ\Publish\Core\Persistence\Legacy\Filter\Gateway\Content\Doctrine\DoctrineGateway');
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public function buildQuery(
FilteringSortClause $sortClause
): void {
/** @var \Ibexa\Contracts\Core\Repository\Values\Content\Query\SortClause $sortClause */
$queryBuilder->addOrderBy('content.modified', $sortClause->direction);
$queryBuilder->addOrderBy('content_modified', $sortClause->direction);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public function buildQuery(
FilteringSortClause $sortClause
): void {
/** @var \Ibexa\Contracts\Core\Repository\Values\Content\Query\SortClause $sortClause */
$queryBuilder->addOrderBy('content.published', $sortClause->direction);
$queryBuilder->addOrderBy('content_published', $sortClause->direction);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public function buildQuery(
FilteringSortClause $sortClause
): void {
/** @var \Ibexa\Contracts\Core\Repository\Values\Content\Query\SortClause $sortClause */
$queryBuilder->addOrderBy('content.id', $sortClause->direction);
$queryBuilder->addOrderBy('content_id', $sortClause->direction);
}
}

Expand Down
Loading
Loading