diff options
| author | polo <ordipolo@gmx.fr> | 2024-08-13 23:45:21 +0200 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2024-08-13 23:45:21 +0200 |
| commit | bf6655a534a6775d30cafa67bd801276bda1d98d (patch) | |
| tree | c6381e3f6c81c33eab72508f410b165ba05f7e9c /vendor/doctrine/orm/src/Query/ResultSetMapping.php | |
| parent | 94d67a4b51f8e62e7d518cce26a526ae1ec48278 (diff) | |
| download | AppliGestionPHP-bf6655a534a6775d30cafa67bd801276bda1d98d.tar.gz AppliGestionPHP-bf6655a534a6775d30cafa67bd801276bda1d98d.tar.bz2 AppliGestionPHP-bf6655a534a6775d30cafa67bd801276bda1d98d.zip | |
VERSION 0.2 doctrine ORM et entités
Diffstat (limited to 'vendor/doctrine/orm/src/Query/ResultSetMapping.php')
| -rw-r--r-- | vendor/doctrine/orm/src/Query/ResultSetMapping.php | 547 |
1 files changed, 547 insertions, 0 deletions
diff --git a/vendor/doctrine/orm/src/Query/ResultSetMapping.php b/vendor/doctrine/orm/src/Query/ResultSetMapping.php new file mode 100644 index 0000000..612474d --- /dev/null +++ b/vendor/doctrine/orm/src/Query/ResultSetMapping.php | |||
| @@ -0,0 +1,547 @@ | |||
| 1 | <?php | ||
| 2 | |||
| 3 | declare(strict_types=1); | ||
| 4 | |||
| 5 | namespace Doctrine\ORM\Query; | ||
| 6 | |||
| 7 | use function count; | ||
| 8 | |||
| 9 | /** | ||
| 10 | * A ResultSetMapping describes how a result set of an SQL query maps to a Doctrine result. | ||
| 11 | * | ||
| 12 | * IMPORTANT NOTE: | ||
| 13 | * The properties of this class are only public for fast internal READ access and to (drastically) | ||
| 14 | * reduce the size of serialized instances for more effective caching due to better (un-)serialization | ||
| 15 | * performance. | ||
| 16 | * | ||
| 17 | * <b>Users should use the public methods.</b> | ||
| 18 | * | ||
| 19 | * @todo Think about whether the number of lookup maps can be reduced. | ||
| 20 | */ | ||
| 21 | class ResultSetMapping | ||
| 22 | { | ||
| 23 | /** | ||
| 24 | * Whether the result is mixed (contains scalar values together with field values). | ||
| 25 | * | ||
| 26 | * @ignore | ||
| 27 | */ | ||
| 28 | public bool $isMixed = false; | ||
| 29 | |||
| 30 | /** | ||
| 31 | * Whether the result is a select statement. | ||
| 32 | * | ||
| 33 | * @ignore | ||
| 34 | */ | ||
| 35 | public bool $isSelect = true; | ||
| 36 | |||
| 37 | /** | ||
| 38 | * Maps alias names to class names. | ||
| 39 | * | ||
| 40 | * @ignore | ||
| 41 | * @psalm-var array<string, class-string> | ||
| 42 | */ | ||
| 43 | public array $aliasMap = []; | ||
| 44 | |||
| 45 | /** | ||
| 46 | * Maps alias names to related association field names. | ||
| 47 | * | ||
| 48 | * @ignore | ||
| 49 | * @psalm-var array<string, string> | ||
| 50 | */ | ||
| 51 | public array $relationMap = []; | ||
| 52 | |||
| 53 | /** | ||
| 54 | * Maps alias names to parent alias names. | ||
| 55 | * | ||
| 56 | * @ignore | ||
| 57 | * @psalm-var array<string, string> | ||
| 58 | */ | ||
| 59 | public array $parentAliasMap = []; | ||
| 60 | |||
| 61 | /** | ||
| 62 | * Maps column names in the result set to field names for each class. | ||
| 63 | * | ||
| 64 | * @ignore | ||
| 65 | * @psalm-var array<string, string> | ||
| 66 | */ | ||
| 67 | public array $fieldMappings = []; | ||
| 68 | |||
| 69 | /** | ||
| 70 | * Maps column names in the result set to the alias/field name to use in the mapped result. | ||
| 71 | * | ||
| 72 | * @ignore | ||
| 73 | * @psalm-var array<string, string|int> | ||
| 74 | */ | ||
| 75 | public array $scalarMappings = []; | ||
| 76 | |||
| 77 | /** | ||
| 78 | * Maps scalar columns to enums | ||
| 79 | * | ||
| 80 | * @ignore | ||
| 81 | * @psalm-var array<string, string> | ||
| 82 | */ | ||
| 83 | public $enumMappings = []; | ||
| 84 | |||
| 85 | /** | ||
| 86 | * Maps column names in the result set to the alias/field type to use in the mapped result. | ||
| 87 | * | ||
| 88 | * @ignore | ||
| 89 | * @psalm-var array<string, string> | ||
| 90 | */ | ||
| 91 | public array $typeMappings = []; | ||
| 92 | |||
| 93 | /** | ||
| 94 | * Maps entities in the result set to the alias name to use in the mapped result. | ||
| 95 | * | ||
| 96 | * @ignore | ||
| 97 | * @psalm-var array<string, string|null> | ||
| 98 | */ | ||
| 99 | public array $entityMappings = []; | ||
| 100 | |||
| 101 | /** | ||
| 102 | * Maps column names of meta columns (foreign keys, discriminator columns, ...) to field names. | ||
| 103 | * | ||
| 104 | * @ignore | ||
| 105 | * @psalm-var array<string, string> | ||
| 106 | */ | ||
| 107 | public array $metaMappings = []; | ||
| 108 | |||
| 109 | /** | ||
| 110 | * Maps column names in the result set to the alias they belong to. | ||
| 111 | * | ||
| 112 | * @ignore | ||
| 113 | * @psalm-var array<string, string> | ||
| 114 | */ | ||
| 115 | public array $columnOwnerMap = []; | ||
| 116 | |||
| 117 | /** | ||
| 118 | * List of columns in the result set that are used as discriminator columns. | ||
| 119 | * | ||
| 120 | * @ignore | ||
| 121 | * @psalm-var array<string, string> | ||
| 122 | */ | ||
| 123 | public array $discriminatorColumns = []; | ||
| 124 | |||
| 125 | /** | ||
| 126 | * Maps alias names to field names that should be used for indexing. | ||
| 127 | * | ||
| 128 | * @ignore | ||
| 129 | * @psalm-var array<string, string> | ||
| 130 | */ | ||
| 131 | public array $indexByMap = []; | ||
| 132 | |||
| 133 | /** | ||
| 134 | * Map from column names to class names that declare the field the column is mapped to. | ||
| 135 | * | ||
| 136 | * @ignore | ||
| 137 | * @psalm-var array<string, class-string> | ||
| 138 | */ | ||
| 139 | public array $declaringClasses = []; | ||
| 140 | |||
| 141 | /** | ||
| 142 | * This is necessary to hydrate derivate foreign keys correctly. | ||
| 143 | * | ||
| 144 | * @psalm-var array<string, array<string, bool>> | ||
| 145 | */ | ||
| 146 | public array $isIdentifierColumn = []; | ||
| 147 | |||
| 148 | /** | ||
| 149 | * Maps column names in the result set to field names for each new object expression. | ||
| 150 | * | ||
| 151 | * @psalm-var array<string, array<string, mixed>> | ||
| 152 | */ | ||
| 153 | public array $newObjectMappings = []; | ||
| 154 | |||
| 155 | /** | ||
| 156 | * Maps metadata parameter names to the metadata attribute. | ||
| 157 | * | ||
| 158 | * @psalm-var array<int|string, string> | ||
| 159 | */ | ||
| 160 | public array $metadataParameterMapping = []; | ||
| 161 | |||
| 162 | /** | ||
| 163 | * Contains query parameter names to be resolved as discriminator values | ||
| 164 | * | ||
| 165 | * @psalm-var array<string, string> | ||
| 166 | */ | ||
| 167 | public array $discriminatorParameters = []; | ||
| 168 | |||
| 169 | /** | ||
| 170 | * Adds an entity result to this ResultSetMapping. | ||
| 171 | * | ||
| 172 | * @param string $class The class name of the entity. | ||
| 173 | * @param string $alias The alias for the class. The alias must be unique among all entity | ||
| 174 | * results or joined entity results within this ResultSetMapping. | ||
| 175 | * @param string|null $resultAlias The result alias with which the entity result should be | ||
| 176 | * placed in the result structure. | ||
| 177 | * @psalm-param class-string $class | ||
| 178 | * | ||
| 179 | * @return $this | ||
| 180 | * | ||
| 181 | * @todo Rename: addRootEntity | ||
| 182 | */ | ||
| 183 | public function addEntityResult(string $class, string $alias, string|null $resultAlias = null): static | ||
| 184 | { | ||
| 185 | $this->aliasMap[$alias] = $class; | ||
| 186 | $this->entityMappings[$alias] = $resultAlias; | ||
| 187 | |||
| 188 | if ($resultAlias !== null) { | ||
| 189 | $this->isMixed = true; | ||
| 190 | } | ||
| 191 | |||
| 192 | return $this; | ||
| 193 | } | ||
| 194 | |||
| 195 | /** | ||
| 196 | * Sets a discriminator column for an entity result or joined entity result. | ||
| 197 | * The discriminator column will be used to determine the concrete class name to | ||
| 198 | * instantiate. | ||
| 199 | * | ||
| 200 | * @param string $alias The alias of the entity result or joined entity result the discriminator | ||
| 201 | * column should be used for. | ||
| 202 | * @param string $discrColumn The name of the discriminator column in the SQL result set. | ||
| 203 | * | ||
| 204 | * @return $this | ||
| 205 | * | ||
| 206 | * @todo Rename: addDiscriminatorColumn | ||
| 207 | */ | ||
| 208 | public function setDiscriminatorColumn(string $alias, string $discrColumn): static | ||
| 209 | { | ||
| 210 | $this->discriminatorColumns[$alias] = $discrColumn; | ||
| 211 | $this->columnOwnerMap[$discrColumn] = $alias; | ||
| 212 | |||
| 213 | return $this; | ||
| 214 | } | ||
| 215 | |||
| 216 | /** | ||
| 217 | * Sets a field to use for indexing an entity result or joined entity result. | ||
| 218 | * | ||
| 219 | * @param string $alias The alias of an entity result or joined entity result. | ||
| 220 | * @param string $fieldName The name of the field to use for indexing. | ||
| 221 | * | ||
| 222 | * @return $this | ||
| 223 | */ | ||
| 224 | public function addIndexBy(string $alias, string $fieldName): static | ||
| 225 | { | ||
| 226 | $found = false; | ||
| 227 | |||
| 228 | foreach ([...$this->metaMappings, ...$this->fieldMappings] as $columnName => $columnFieldName) { | ||
| 229 | if (! ($columnFieldName === $fieldName && $this->columnOwnerMap[$columnName] === $alias)) { | ||
| 230 | continue; | ||
| 231 | } | ||
| 232 | |||
| 233 | $this->addIndexByColumn($alias, $columnName); | ||
| 234 | $found = true; | ||
| 235 | |||
| 236 | break; | ||
| 237 | } | ||
| 238 | |||
| 239 | /* TODO: check if this exception can be put back, for now it's gone because of assumptions made by some ORM internals | ||
| 240 | if ( ! $found) { | ||
| 241 | $message = sprintf( | ||
| 242 | 'Cannot add index by for DQL alias %s and field %s without calling addFieldResult() for them before.', | ||
| 243 | $alias, | ||
| 244 | $fieldName | ||
| 245 | ); | ||
| 246 | |||
| 247 | throw new \LogicException($message); | ||
| 248 | } | ||
| 249 | */ | ||
| 250 | |||
| 251 | return $this; | ||
| 252 | } | ||
| 253 | |||
| 254 | /** | ||
| 255 | * Sets to index by a scalar result column name. | ||
| 256 | * | ||
| 257 | * @return $this | ||
| 258 | */ | ||
| 259 | public function addIndexByScalar(string $resultColumnName): static | ||
| 260 | { | ||
| 261 | $this->indexByMap['scalars'] = $resultColumnName; | ||
| 262 | |||
| 263 | return $this; | ||
| 264 | } | ||
| 265 | |||
| 266 | /** | ||
| 267 | * Sets a column to use for indexing an entity or joined entity result by the given alias name. | ||
| 268 | * | ||
| 269 | * @return $this | ||
| 270 | */ | ||
| 271 | public function addIndexByColumn(string $alias, string $resultColumnName): static | ||
| 272 | { | ||
| 273 | $this->indexByMap[$alias] = $resultColumnName; | ||
| 274 | |||
| 275 | return $this; | ||
| 276 | } | ||
| 277 | |||
| 278 | /** | ||
| 279 | * Checks whether an entity result or joined entity result with a given alias has | ||
| 280 | * a field set for indexing. | ||
| 281 | * | ||
| 282 | * @todo Rename: isIndexed($alias) | ||
| 283 | */ | ||
| 284 | public function hasIndexBy(string $alias): bool | ||
| 285 | { | ||
| 286 | return isset($this->indexByMap[$alias]); | ||
| 287 | } | ||
| 288 | |||
| 289 | /** | ||
| 290 | * Checks whether the column with the given name is mapped as a field result | ||
| 291 | * as part of an entity result or joined entity result. | ||
| 292 | * | ||
| 293 | * @param string $columnName The name of the column in the SQL result set. | ||
| 294 | * | ||
| 295 | * @todo Rename: isField | ||
| 296 | */ | ||
| 297 | public function isFieldResult(string $columnName): bool | ||
| 298 | { | ||
| 299 | return isset($this->fieldMappings[$columnName]); | ||
| 300 | } | ||
| 301 | |||
| 302 | /** | ||
| 303 | * Adds a field to the result that belongs to an entity or joined entity. | ||
| 304 | * | ||
| 305 | * @param string $alias The alias of the root entity or joined entity to which the field belongs. | ||
| 306 | * @param string $columnName The name of the column in the SQL result set. | ||
| 307 | * @param string $fieldName The name of the field on the declaring class. | ||
| 308 | * @param string|null $declaringClass The name of the class that declares/owns the specified field. | ||
| 309 | * When $alias refers to a superclass in a mapped hierarchy but | ||
| 310 | * the field $fieldName is defined on a subclass, specify that here. | ||
| 311 | * If not specified, the field is assumed to belong to the class | ||
| 312 | * designated by $alias. | ||
| 313 | * @psalm-param class-string|null $declaringClass | ||
| 314 | * | ||
| 315 | * @return $this | ||
| 316 | * | ||
| 317 | * @todo Rename: addField | ||
| 318 | */ | ||
| 319 | public function addFieldResult(string $alias, string $columnName, string $fieldName, string|null $declaringClass = null): static | ||
| 320 | { | ||
| 321 | // column name (in result set) => field name | ||
| 322 | $this->fieldMappings[$columnName] = $fieldName; | ||
| 323 | // column name => alias of owner | ||
| 324 | $this->columnOwnerMap[$columnName] = $alias; | ||
| 325 | // field name => class name of declaring class | ||
| 326 | $this->declaringClasses[$columnName] = $declaringClass ?: $this->aliasMap[$alias]; | ||
| 327 | |||
| 328 | if (! $this->isMixed && $this->scalarMappings) { | ||
| 329 | $this->isMixed = true; | ||
| 330 | } | ||
| 331 | |||
| 332 | return $this; | ||
| 333 | } | ||
| 334 | |||
| 335 | /** | ||
| 336 | * Adds a joined entity result. | ||
| 337 | * | ||
| 338 | * @param string $class The class name of the joined entity. | ||
| 339 | * @param string $alias The unique alias to use for the joined entity. | ||
| 340 | * @param string $parentAlias The alias of the entity result that is the parent of this joined result. | ||
| 341 | * @param string $relation The association field that connects the parent entity result | ||
| 342 | * with the joined entity result. | ||
| 343 | * @psalm-param class-string $class | ||
| 344 | * | ||
| 345 | * @return $this | ||
| 346 | * | ||
| 347 | * @todo Rename: addJoinedEntity | ||
| 348 | */ | ||
| 349 | public function addJoinedEntityResult(string $class, string $alias, string $parentAlias, string $relation): static | ||
| 350 | { | ||
| 351 | $this->aliasMap[$alias] = $class; | ||
| 352 | $this->parentAliasMap[$alias] = $parentAlias; | ||
| 353 | $this->relationMap[$alias] = $relation; | ||
| 354 | |||
| 355 | return $this; | ||
| 356 | } | ||
| 357 | |||
| 358 | /** | ||
| 359 | * Adds a scalar result mapping. | ||
| 360 | * | ||
| 361 | * @param string $columnName The name of the column in the SQL result set. | ||
| 362 | * @param string|int $alias The result alias with which the scalar result should be placed in the result structure. | ||
| 363 | * @param string $type The column type | ||
| 364 | * | ||
| 365 | * @return $this | ||
| 366 | * | ||
| 367 | * @todo Rename: addScalar | ||
| 368 | */ | ||
| 369 | public function addScalarResult(string $columnName, string|int $alias, string $type = 'string'): static | ||
| 370 | { | ||
| 371 | $this->scalarMappings[$columnName] = $alias; | ||
| 372 | $this->typeMappings[$columnName] = $type; | ||
| 373 | |||
| 374 | if (! $this->isMixed && $this->fieldMappings) { | ||
| 375 | $this->isMixed = true; | ||
| 376 | } | ||
| 377 | |||
| 378 | return $this; | ||
| 379 | } | ||
| 380 | |||
| 381 | /** | ||
| 382 | * Adds a scalar result mapping. | ||
| 383 | * | ||
| 384 | * @param string $columnName The name of the column in the SQL result set. | ||
| 385 | * @param string $enumType The enum type | ||
| 386 | * | ||
| 387 | * @return $this | ||
| 388 | */ | ||
| 389 | public function addEnumResult(string $columnName, string $enumType): static | ||
| 390 | { | ||
| 391 | $this->enumMappings[$columnName] = $enumType; | ||
| 392 | |||
| 393 | return $this; | ||
| 394 | } | ||
| 395 | |||
| 396 | /** | ||
| 397 | * Adds a metadata parameter mappings. | ||
| 398 | */ | ||
| 399 | public function addMetadataParameterMapping(string|int $parameter, string $attribute): void | ||
| 400 | { | ||
| 401 | $this->metadataParameterMapping[$parameter] = $attribute; | ||
| 402 | } | ||
| 403 | |||
| 404 | /** | ||
| 405 | * Checks whether a column with a given name is mapped as a scalar result. | ||
| 406 | * | ||
| 407 | * @todo Rename: isScalar | ||
| 408 | */ | ||
| 409 | public function isScalarResult(string $columnName): bool | ||
| 410 | { | ||
| 411 | return isset($this->scalarMappings[$columnName]); | ||
| 412 | } | ||
| 413 | |||
| 414 | /** | ||
| 415 | * Gets the name of the class of an entity result or joined entity result, | ||
| 416 | * identified by the given unique alias. | ||
| 417 | * | ||
| 418 | * @psalm-return class-string | ||
| 419 | */ | ||
| 420 | public function getClassName(string $alias): string | ||
| 421 | { | ||
| 422 | return $this->aliasMap[$alias]; | ||
| 423 | } | ||
| 424 | |||
| 425 | /** | ||
| 426 | * Gets the field alias for a column that is mapped as a scalar value. | ||
| 427 | * | ||
| 428 | * @param string $columnName The name of the column in the SQL result set. | ||
| 429 | */ | ||
| 430 | public function getScalarAlias(string $columnName): string|int | ||
| 431 | { | ||
| 432 | return $this->scalarMappings[$columnName]; | ||
| 433 | } | ||
| 434 | |||
| 435 | /** | ||
| 436 | * Gets the name of the class that owns a field mapping for the specified column. | ||
| 437 | * | ||
| 438 | * @psalm-return class-string | ||
| 439 | */ | ||
| 440 | public function getDeclaringClass(string $columnName): string | ||
| 441 | { | ||
| 442 | return $this->declaringClasses[$columnName]; | ||
| 443 | } | ||
| 444 | |||
| 445 | public function getRelation(string $alias): string | ||
| 446 | { | ||
| 447 | return $this->relationMap[$alias]; | ||
| 448 | } | ||
| 449 | |||
| 450 | public function isRelation(string $alias): bool | ||
| 451 | { | ||
| 452 | return isset($this->relationMap[$alias]); | ||
| 453 | } | ||
| 454 | |||
| 455 | /** | ||
| 456 | * Gets the alias of the class that owns a field mapping for the specified column. | ||
| 457 | */ | ||
| 458 | public function getEntityAlias(string $columnName): string | ||
| 459 | { | ||
| 460 | return $this->columnOwnerMap[$columnName]; | ||
| 461 | } | ||
| 462 | |||
| 463 | /** | ||
| 464 | * Gets the parent alias of the given alias. | ||
| 465 | */ | ||
| 466 | public function getParentAlias(string $alias): string | ||
| 467 | { | ||
| 468 | return $this->parentAliasMap[$alias]; | ||
| 469 | } | ||
| 470 | |||
| 471 | /** | ||
| 472 | * Checks whether the given alias has a parent alias. | ||
| 473 | */ | ||
| 474 | public function hasParentAlias(string $alias): bool | ||
| 475 | { | ||
| 476 | return isset($this->parentAliasMap[$alias]); | ||
| 477 | } | ||
| 478 | |||
| 479 | /** | ||
| 480 | * Gets the field name for a column name. | ||
| 481 | */ | ||
| 482 | public function getFieldName(string $columnName): string | ||
| 483 | { | ||
| 484 | return $this->fieldMappings[$columnName]; | ||
| 485 | } | ||
| 486 | |||
| 487 | /** @psalm-return array<string, class-string> */ | ||
| 488 | public function getAliasMap(): array | ||
| 489 | { | ||
| 490 | return $this->aliasMap; | ||
| 491 | } | ||
| 492 | |||
| 493 | /** | ||
| 494 | * Gets the number of different entities that appear in the mapped result. | ||
| 495 | * | ||
| 496 | * @psalm-return 0|positive-int | ||
| 497 | */ | ||
| 498 | public function getEntityResultCount(): int | ||
| 499 | { | ||
| 500 | return count($this->aliasMap); | ||
| 501 | } | ||
| 502 | |||
| 503 | /** | ||
| 504 | * Checks whether this ResultSetMapping defines a mixed result. | ||
| 505 | * | ||
| 506 | * Mixed results can only occur in object and array (graph) hydration. In such a | ||
| 507 | * case a mixed result means that scalar values are mixed with objects/array in | ||
| 508 | * the result. | ||
| 509 | */ | ||
| 510 | public function isMixedResult(): bool | ||
| 511 | { | ||
| 512 | return $this->isMixed; | ||
| 513 | } | ||
| 514 | |||
| 515 | /** | ||
| 516 | * Adds a meta column (foreign key or discriminator column) to the result set. | ||
| 517 | * | ||
| 518 | * @param string $alias The result alias with which the meta result should be placed in the result structure. | ||
| 519 | * @param string $columnName The name of the column in the SQL result set. | ||
| 520 | * @param string $fieldName The name of the field on the declaring class. | ||
| 521 | * @param string|null $type The column type | ||
| 522 | * | ||
| 523 | * @return $this | ||
| 524 | * | ||
| 525 | * @todo Make all methods of this class require all parameters and not infer anything | ||
| 526 | */ | ||
| 527 | public function addMetaResult( | ||
| 528 | string $alias, | ||
| 529 | string $columnName, | ||
| 530 | string $fieldName, | ||
| 531 | bool $isIdentifierColumn = false, | ||
| 532 | string|null $type = null, | ||
| 533 | ): static { | ||
| 534 | $this->metaMappings[$columnName] = $fieldName; | ||
| 535 | $this->columnOwnerMap[$columnName] = $alias; | ||
| 536 | |||
| 537 | if ($isIdentifierColumn) { | ||
| 538 | $this->isIdentifierColumn[$alias][$columnName] = true; | ||
| 539 | } | ||
| 540 | |||
| 541 | if ($type) { | ||
| 542 | $this->typeMappings[$columnName] = $type; | ||
| 543 | } | ||
| 544 | |||
| 545 | return $this; | ||
| 546 | } | ||
| 547 | } | ||
