Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
163 changes: 141 additions & 22 deletions src/Element/Queries/AddressQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use CraftCms\Cms\Element\Queries\Exceptions\QueryAbortedException;
use CraftCms\Cms\FieldLayout\FieldLayout;
use CraftCms\Cms\Support\Arr;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Collection;
use Override;

Expand Down Expand Up @@ -366,31 +367,149 @@
$addressQuery->whereIn('addresses.primaryOwnerId', Arr::wrap($addressQuery->primaryOwnerId ?? $addressQuery->ownerId));
}

foreach ([
'countryCode',
'administrativeArea',
'locality',
'dependentLocality',
'postalCode',
'sortingCode',
'organization',
'organizationTaxId',
'addressLine1',
'addressLine2',
'addressLine3',
'lastName',
'firstName',
'fullName',
] as $property) {
if (! $addressQuery->$property) {
continue;
}

$addressQuery->whereParam("addresses.$property", $addressQuery->$property);
}
static::applyCountryCode($addressQuery, $addressQuery->countryCode);

Check failure on line 370 in src/Element/Queries/AddressQuery.php

View workflow job for this annotation

GitHub Actions / Code Quality / Phpstan

Parameter #1 $query of static method CraftCms\Cms\Element\Queries\AddressQuery::applyCountryCode() expects Illuminate\Database\Query\Builder, CraftCms\Cms\Element\Queries\AddressQuery given.
static::applyAdministrativeArea($addressQuery, $addressQuery->administrativeArea);

Check failure on line 371 in src/Element/Queries/AddressQuery.php

View workflow job for this annotation

GitHub Actions / Code Quality / Phpstan

Parameter #1 $query of static method CraftCms\Cms\Element\Queries\AddressQuery::applyAdministrativeArea() expects Illuminate\Database\Query\Builder, CraftCms\Cms\Element\Queries\AddressQuery given.
static::applyLocality($addressQuery, $addressQuery->locality);

Check failure on line 372 in src/Element/Queries/AddressQuery.php

View workflow job for this annotation

GitHub Actions / Code Quality / Phpstan

Parameter #1 $query of static method CraftCms\Cms\Element\Queries\AddressQuery::applyLocality() expects Illuminate\Database\Query\Builder, CraftCms\Cms\Element\Queries\AddressQuery given.
static::applyDependentLocality($addressQuery, $addressQuery->dependentLocality);

Check failure on line 373 in src/Element/Queries/AddressQuery.php

View workflow job for this annotation

GitHub Actions / Code Quality / Phpstan

Parameter #1 $query of static method CraftCms\Cms\Element\Queries\AddressQuery::applyDependentLocality() expects Illuminate\Database\Query\Builder, CraftCms\Cms\Element\Queries\AddressQuery given.
static::applyPostalCode($addressQuery, $addressQuery->postalCode);

Check failure on line 374 in src/Element/Queries/AddressQuery.php

View workflow job for this annotation

GitHub Actions / Code Quality / Phpstan

Parameter #1 $query of static method CraftCms\Cms\Element\Queries\AddressQuery::applyPostalCode() expects Illuminate\Database\Query\Builder, CraftCms\Cms\Element\Queries\AddressQuery given.
static::applySortingCode($addressQuery, $addressQuery->sortingCode);

Check failure on line 375 in src/Element/Queries/AddressQuery.php

View workflow job for this annotation

GitHub Actions / Code Quality / Phpstan

Parameter #1 $query of static method CraftCms\Cms\Element\Queries\AddressQuery::applySortingCode() expects Illuminate\Database\Query\Builder, CraftCms\Cms\Element\Queries\AddressQuery given.
static::applyOrganization($addressQuery, $addressQuery->organization);

Check failure on line 376 in src/Element/Queries/AddressQuery.php

View workflow job for this annotation

GitHub Actions / Code Quality / Phpstan

Parameter #1 $query of static method CraftCms\Cms\Element\Queries\AddressQuery::applyOrganization() expects Illuminate\Database\Query\Builder, CraftCms\Cms\Element\Queries\AddressQuery given.
static::applyOrganizationTaxId($addressQuery, $addressQuery->organizationTaxId);

Check failure on line 377 in src/Element/Queries/AddressQuery.php

View workflow job for this annotation

GitHub Actions / Code Quality / Phpstan

Parameter #1 $query of static method CraftCms\Cms\Element\Queries\AddressQuery::applyOrganizationTaxId() expects Illuminate\Database\Query\Builder, CraftCms\Cms\Element\Queries\AddressQuery given.
static::applyAddressLine1($addressQuery, $addressQuery->addressLine1);

Check failure on line 378 in src/Element/Queries/AddressQuery.php

View workflow job for this annotation

GitHub Actions / Code Quality / Phpstan

Parameter #1 $query of static method CraftCms\Cms\Element\Queries\AddressQuery::applyAddressLine1() expects Illuminate\Database\Query\Builder, CraftCms\Cms\Element\Queries\AddressQuery given.
static::applyAddressLine2($addressQuery, $addressQuery->addressLine2);

Check failure on line 379 in src/Element/Queries/AddressQuery.php

View workflow job for this annotation

GitHub Actions / Code Quality / Phpstan

Parameter #1 $query of static method CraftCms\Cms\Element\Queries\AddressQuery::applyAddressLine2() expects Illuminate\Database\Query\Builder, CraftCms\Cms\Element\Queries\AddressQuery given.
static::applyAddressLine3($addressQuery, $addressQuery->addressLine3);
static::applyLastName($addressQuery, $addressQuery->lastName);
static::applyFirstName($addressQuery, $addressQuery->firstName);
static::applyFullName($addressQuery, $addressQuery->fullName);
});
}

public static function applyCountryCode(Builder $query, mixed $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.countryCode', $value);
}

public static function applyAdministrativeArea(Builder $query, mixed $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.administrativeArea', $value);
}

public static function applyLocality(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.locality', $value);
}

public static function applyDependentLocality(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.dependentLocality', $value);
}

public static function applyPostalCode(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.postalCode', $value);
}

public static function applySortingCode(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.sortingCode', $value);
}

public static function applyOrganization(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.organization', $value);
}

public static function applyOrganizationTaxId(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.organizationTaxId', $value);
}

public static function applyAddressLine1(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.addressLine1', $value);
}

public static function applyAddressLine2(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.addressLine2', $value);
}

public static function applyAddressLine3(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.addressLine3', $value);
}

public static function applyLastName(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.lastName', $value);
}

public static function applyFirstName(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.firstName', $value);
}

public static function applyFullName(Builder $query, array|string|null $value): void
{
if (! $value) {
return;
}

$query->whereParam('addresses.fullName', $value);
}

/**
* Narrows the query results based on the country the addresses belong to.
*
Expand Down
35 changes: 20 additions & 15 deletions src/Element/Queries/Concerns/Asset/QueriesAlt.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,29 @@ trait QueriesAlt
protected function initQueriesAlt(): void
{
$this->beforeQuery(function (AssetQuery $assetQuery) {
if ($assetQuery->hasAlt === null) {
return;
}

if ($this->hasAlt) {
$assetQuery->where(function (Builder $query) {
$query->where('assets_sites.alt', '!=', '')
->whereNotNull('assets_sites.alt');
});
} else {
$assetQuery->where(function (Builder $query) {
$query->where('assets_sites.alt', '=', '')
->orWhereNull('assets_sites.alt');
});
}
static::applyHasAlt($assetQuery, $assetQuery->hasAlt);
});
}

public static function applyHasAlt(Builder $query, ?bool $value): void
{
if ($value === null) {
return;
}

if ($value) {
$query->where(function (Builder $query) {
$query->where('assets_sites.alt', '!=', '')
->whereNotNull('assets_sites.alt');
});
} else {
$query->where(function (Builder $query) {
$query->where('assets_sites.alt', '=', '')
->orWhereNull('assets_sites.alt');
});
}
}

/**
* Narrows the query results based on whether the assets have alternative text.
*
Expand Down
97 changes: 59 additions & 38 deletions src/Element/Queries/Concerns/Asset/QueriesAssetLocation.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,50 +75,71 @@ protected function initQueriesAssetLocation(): void

$assetQuery->join(new Alias(Table::VOLUMEFOLDERS, 'volumeFolders'), 'volumeFolders.id', '=', 'assets.folderId');

if ($assetQuery->volumeId) {
if ($assetQuery->volumeId === ':empty:') {
$assetQuery->whereNull('assets.volumeId');
} else {
$assetQuery->whereIn('assets.volumeId', Arr::wrap($this->volumeId));
}
}
static::applyVolumeId($assetQuery, $assetQuery->volumeId);
static::applyFolderId($assetQuery, $assetQuery->folderId);
static::applyFolderPath($assetQuery, $assetQuery->folderPath);
});
}

if ($assetQuery->folderId) {
// [X] => X, so includeSubfolders works with GraphQL
// (see https://github.com/craftcms/cms/issues/17023)
if (is_array($assetQuery->folderId) && count($assetQuery->folderId) === 1 && Arr::isNumeric($assetQuery->folderId)) {
$assetQuery->folderId = reset($assetQuery->folderId);
}

$assetQuery->where(function (Builder $query) use ($assetQuery) {
$query->whereNumericParam('assets.folderId', $assetQuery->folderId)
->when(
is_numeric($assetQuery->folderId) && $assetQuery->includeSubfolders,
function (Builder $query) use ($assetQuery) {
$descendants = Folders::getAllDescendantFolders(Folders::getFolderById($assetQuery->folderId));

$query->orWhereIn('assets.folderId', array_keys($descendants));
}
);
});
}
public static function applyVolumeId(Builder $query, mixed $value): void
{
if (! $value) {
return;
}

if ($value === ':empty:') {
$query->whereNull('assets.volumeId');
} else {
$query->whereIn('assets.volumeId', Arr::wrap($value));
}
}

public static function applyFolderId(Builder $query, mixed $value): void
{
assert($query instanceof AssetQuery);

if (! $value) {
return;
}

// [X] => X, so includeSubfolders works with GraphQL
// (see https://github.com/craftcms/cms/issues/17023)
if (is_array($value) && count($value) === 1 && Arr::isNumeric($value)) {
$value = reset($value);
}

if ($assetQuery->folderPath) {
$folderPath = Arr::wrap($assetQuery->folderPath);
$query->where(function (Builder $q) use ($query, $value) {
$q->whereNumericParam('assets.folderId', $value)
->when(
is_numeric($value) && $query->includeSubfolders,
function (Builder $q) use ($value) {
$descendants = Folders::getAllDescendantFolders(Folders::getFolderById($value));

foreach ($folderPath as &$path) {
if (
is_string($path) &&
! str_ends_with($path, '/') &&
Query::escapeParam($path) === $path
) {
$path .= '/';
$q->orWhereIn('assets.folderId', array_keys($descendants));
}
}
);
});
}

public static function applyFolderPath(Builder $query, mixed $value): void
{
if (! $value) {
return;
}

$folderPath = Arr::wrap($value);

$assetQuery->whereParam('volumeFolders.path', $folderPath);
foreach ($folderPath as &$path) {
if (
is_string($path) &&
! str_ends_with($path, '/') &&
Query::escapeParam($path) === $path
) {
$path .= '/';
}
});
}

$query->whereParam('volumeFolders.path', $folderPath);
}

/**
Expand Down
Loading
Loading