@@ -114,7 +114,7 @@ discard block |
||
| 114 | 114 | } |
| 115 | 115 | |
| 116 | 116 | /** |
| 117 | - * @return bool whether the PHP was built with IPv6 support enabled |
|
| 117 | + * @return boolean|null whether the PHP was built with IPv6 support enabled |
|
| 118 | 118 | */ |
| 119 | 119 | private static function ipv6Support() |
| 120 | 120 | { |
@@ -348,7 +348,7 @@ discard block |
||
| 348 | 348 | * |
| 349 | 349 | * @param NetAddress|string $address a {@link NetAddress} or anything {@link NetAddress::fromString()} accepts as |
| 350 | 350 | * its first argument |
| 351 | - * @return bool |
|
| 351 | + * @return null|boolean |
|
| 352 | 352 | */ |
| 353 | 353 | public function equals($address) |
| 354 | 354 | { |
@@ -287,7 +287,7 @@ |
||
| 287 | 287 | $i += $lzsLen - 1; |
| 288 | 288 | continue; |
| 289 | 289 | } |
| 290 | - $result .= (ltrim($fields[$i], '0') ? : '0'); |
|
| 290 | + $result .= (ltrim($fields[$i], '0') ?: '0'); |
|
| 291 | 291 | } |
| 292 | 292 | if ($lzsStart + $lzsLen == 8) { |
| 293 | 293 | $result .= ':'; |
@@ -136,8 +136,7 @@ discard block |
||
| 136 | 136 | |
| 137 | 137 | if ($netmaskLengthOrNetmask === null) { |
| 138 | 138 | $this->netmaskLength = ($this->ipVersion == 6 ? 128 : 32); |
| 139 | - } |
|
| 140 | - else { |
|
| 139 | + } else { |
|
| 141 | 140 | if (filter_var($netmaskLengthOrNetmask, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) { |
| 142 | 141 | if ($this->ipVersion == 4) { |
| 143 | 142 | // taken from http://php.net/manual/en/function.ip2long.php#94787 |
@@ -148,12 +147,10 @@ discard block |
||
| 148 | 147 | throw new \InvalidArgumentException('Invalid netmask'); |
| 149 | 148 | } |
| 150 | 149 | $this->netmaskLength = 32 - (int)$bits; |
| 151 | - } |
|
| 152 | - else { |
|
| 150 | + } else { |
|
| 153 | 151 | throw new \InvalidArgumentException('Netmask may only be used for an IPv4 address.'); |
| 154 | 152 | } |
| 155 | - } |
|
| 156 | - else { |
|
| 153 | + } else { |
|
| 157 | 154 | $this->netmaskLength = filter_var($netmaskLengthOrNetmask, FILTER_VALIDATE_INT); |
| 158 | 155 | if ($this->netmaskLength === false) { |
| 159 | 156 | throw new \InvalidArgumentException('$netmaskLengthOrNetmask'); |
@@ -212,8 +209,7 @@ discard block |
||
| 212 | 209 | { |
| 213 | 210 | if ($this->ipVersion == 4) { |
| 214 | 211 | return $this->addrStr; |
| 215 | - } |
|
| 216 | - else { |
|
| 212 | + } else { |
|
| 217 | 213 | if (!self::ipv6Support()) { |
| 218 | 214 | throw new NotImplementedException('PHP must be compiled with IPv6 support'); |
| 219 | 215 | } |
@@ -259,12 +255,10 @@ discard block |
||
| 259 | 255 | if ($czsStart === null) { |
| 260 | 256 | $czsStart = $i; |
| 261 | 257 | $czsLen = 1; |
| 262 | - } |
|
| 263 | - else { |
|
| 258 | + } else { |
|
| 264 | 259 | $czsLen++; |
| 265 | 260 | } |
| 266 | - } |
|
| 267 | - else { |
|
| 261 | + } else { |
|
| 268 | 262 | if ($czsStart !== null) { |
| 269 | 263 | if ($czsLen > $lzsLen) { |
| 270 | 264 | $lzsStart = $czsStart; |
@@ -302,8 +296,7 @@ discard block |
||
| 302 | 296 | { |
| 303 | 297 | if ($this->ipVersion == 6) { |
| 304 | 298 | return ($this->netmaskLength == 128); |
| 305 | - } |
|
| 306 | - else { |
|
| 299 | + } else { |
|
| 307 | 300 | return ($this->netmaskLength == 32); |
| 308 | 301 | } |
| 309 | 302 | } |
@@ -318,8 +311,7 @@ discard block |
||
| 318 | 311 | $hostPartLen = 32 - $this->netmaskLength; |
| 319 | 312 | $mask = (1 << $hostPartLen) - 1; |
| 320 | 313 | return ((ip2long($this->addrStr) & $mask) == 0); |
| 321 | - } |
|
| 322 | - else { |
|
| 314 | + } else { |
|
| 323 | 315 | $hostPartLen = 128 - $this->netmaskLength; |
| 324 | 316 | $hostPartOctets = (int)floor($hostPartLen / 8); |
| 325 | 317 | $hostPartLeadBits = $hostPartLen % 8; |
@@ -436,8 +428,7 @@ discard block |
||
| 436 | 428 | { |
| 437 | 429 | if ($this->isSingleHost()) { |
| 438 | 430 | return $this->addrStr; |
| 439 | - } |
|
| 440 | - else { |
|
| 431 | + } else { |
|
| 441 | 432 | return $this->toCidrString(); |
| 442 | 433 | } |
| 443 | 434 | } |
@@ -461,8 +452,7 @@ discard block |
||
| 461 | 452 | { |
| 462 | 453 | if ($this->ipVersion == 4 || self::ipv6Support()) { |
| 463 | 454 | return inet_pton($this->addrStr); |
| 464 | - } |
|
| 465 | - else { |
|
| 455 | + } else { |
|
| 466 | 456 | throw new NotImplementedException('PHP must be compiled with IPv6 support'); |
| 467 | 457 | } |
| 468 | 458 | } |
@@ -480,8 +470,7 @@ discard block |
||
| 480 | 470 | { |
| 481 | 471 | if ($this->ipVersion == 4) { |
| 482 | 472 | return ip2long($this->addrStr); |
| 483 | - } |
|
| 484 | - else { |
|
| 473 | + } else { |
|
| 485 | 474 | throw new \LogicException('IPv6 address cannot be converted to long'); |
| 486 | 475 | } |
| 487 | 476 | } |
@@ -166,6 +166,9 @@ discard block |
||
| 166 | 166 | return new Range($subtype, null, true, null, null, null, null); |
| 167 | 167 | } |
| 168 | 168 | |
| 169 | + /** |
|
| 170 | + * @param boolean $upperInc |
|
| 171 | + */ |
|
| 169 | 172 | private static function processBoundSpec($boundsOrLowerInc = '[)', $upperInc = null) |
| 170 | 173 | { |
| 171 | 174 | if (is_string($boundsOrLowerInc)) { |
@@ -193,6 +196,10 @@ discard block |
||
| 193 | 196 | } |
| 194 | 197 | |
| 195 | 198 | |
| 199 | + /** |
|
| 200 | + * @param IRangeCanonicalFunc|null $canonicalFunc |
|
| 201 | + * @param boolean $empty |
|
| 202 | + */ |
|
| 196 | 203 | private function __construct(ITotallyOrderedType $subtype, $canonicalFunc, $empty, $lower, $upper, $lowerInc, $upperInc) |
| 197 | 204 | { |
| 198 | 205 | $this->subtype = $subtype; |
@@ -372,7 +379,7 @@ discard block |
||
| 372 | 379 | |
| 373 | 380 | /** |
| 374 | 381 | * @param mixed $element a value of the range subtype |
| 375 | - * @return bool whether this range contains the given element; |
|
| 382 | + * @return null|boolean whether this range contains the given element; |
|
| 376 | 383 | * <tt>null</tt> on <tt>null</tt> input |
| 377 | 384 | */ |
| 378 | 385 | public function containsElement($element) |
@@ -403,7 +410,7 @@ discard block |
||
| 403 | 410 | |
| 404 | 411 | /** |
| 405 | 412 | * @param mixed $element value of the range subtype |
| 406 | - * @return bool <tt>true</tt> iff this range is left of the given element - value of the range subtype; |
|
| 413 | + * @return null|boolean <tt>true</tt> iff this range is left of the given element - value of the range subtype; |
|
| 407 | 414 | * <tt>false</tt> otherwise, especially if this range is empty; |
| 408 | 415 | * <tt>null</tt> on <tt>null</tt> input |
| 409 | 416 | */ |
@@ -425,7 +432,7 @@ discard block |
||
| 425 | 432 | |
| 426 | 433 | /** |
| 427 | 434 | * @param mixed $element value of the range subtype |
| 428 | - * @return bool <tt>true</tt> iff this range is right of the given element - value of the range subtype; |
|
| 435 | + * @return null|boolean <tt>true</tt> iff this range is right of the given element - value of the range subtype; |
|
| 429 | 436 | * <tt>false</tt> otherwise, especially if this range is empty; |
| 430 | 437 | * <tt>null</tt> on <tt>null</tt> input |
| 431 | 438 | */ |
@@ -447,7 +454,7 @@ discard block |
||
| 447 | 454 | |
| 448 | 455 | /** |
| 449 | 456 | * @param Range $other a range of the same subtype as this range |
| 450 | - * @return bool whether this range entirely contains the other range; |
|
| 457 | + * @return null|boolean whether this range entirely contains the other range; |
|
| 451 | 458 | * an empty range is considered to be contained in any range, even an empty one; |
| 452 | 459 | * <tt>null</tt> on <tt>null</tt> input |
| 453 | 460 | */ |
@@ -495,7 +502,7 @@ discard block |
||
| 495 | 502 | |
| 496 | 503 | /** |
| 497 | 504 | * @param Range $other a range of the same subtype as this range |
| 498 | - * @return bool whether this range is entirely contained in the other range; |
|
| 505 | + * @return null|boolean whether this range is entirely contained in the other range; |
|
| 499 | 506 | * an empty range is considered to be contained in any range, even an empty one; |
| 500 | 507 | * <tt>null</tt> on <tt>null</tt> input |
| 501 | 508 | */ |
@@ -512,7 +519,7 @@ discard block |
||
| 512 | 519 | |
| 513 | 520 | /** |
| 514 | 521 | * @param Range $other a range of the same subtype as this range |
| 515 | - * @return bool whether this and the other range overlap, i.e., have a non-empty intersection; |
|
| 522 | + * @return null|boolean whether this and the other range overlap, i.e., have a non-empty intersection; |
|
| 516 | 523 | * <tt>null</tt> on <tt>null</tt> input |
| 517 | 524 | */ |
| 518 | 525 | public function overlaps($other) |
@@ -626,7 +633,7 @@ discard block |
||
| 626 | 633 | |
| 627 | 634 | /** |
| 628 | 635 | * @param Range|null $other a range of the same subtype as this range |
| 629 | - * @return bool <tt>true</tt> iff this range is strictly left of the other range, i.e., it ends before the other |
|
| 636 | + * @return null|boolean <tt>true</tt> iff this range is strictly left of the other range, i.e., it ends before the other |
|
| 630 | 637 | * starts; |
| 631 | 638 | * <tt>false</tt> otherwise, especially if either range is empty; |
| 632 | 639 | * <tt>null</tt> on <tt>null</tt> input |
@@ -652,7 +659,7 @@ discard block |
||
| 652 | 659 | |
| 653 | 660 | /** |
| 654 | 661 | * @param Range|null $other a range of the same subtype as this range |
| 655 | - * @return bool <tt>true</tt> iff this range is strictly left of the other range, i.e., it ends before the other |
|
| 662 | + * @return null|boolean <tt>true</tt> iff this range is strictly left of the other range, i.e., it ends before the other |
|
| 656 | 663 | * starts; |
| 657 | 664 | * <tt>false</tt> otherwise, especially if either range is empty;; |
| 658 | 665 | * <tt>null</tt> on <tt>null</tt> input |
@@ -108,14 +108,12 @@ discard block |
||
| 108 | 108 | $comp = $subtype->compareValues($lower, $upper); |
| 109 | 109 | if ($comp > 0) { |
| 110 | 110 | return self::createEmpty($subtype); |
| 111 | - } |
|
| 112 | - elseif ($comp == 0) { |
|
| 111 | + } elseif ($comp == 0) { |
|
| 113 | 112 | if (!$loInc || !$upInc) { |
| 114 | 113 | return self::createEmpty($subtype); |
| 115 | 114 | } |
| 116 | 115 | } |
| 117 | - } |
|
| 118 | - else { |
|
| 116 | + } else { |
|
| 119 | 117 | if ($lower === null) { |
| 120 | 118 | $loInc = false; |
| 121 | 119 | } |
@@ -135,14 +133,12 @@ discard block |
||
| 135 | 133 | $comp = $subtype->compareValues($lower, $upper); |
| 136 | 134 | if ($comp > 0) { |
| 137 | 135 | return self::createEmpty($subtype); |
| 138 | - } |
|
| 139 | - elseif ($comp == 0) { |
|
| 136 | + } elseif ($comp == 0) { |
|
| 140 | 137 | if (!$loInc || !$upInc) { |
| 141 | 138 | return self::createEmpty($subtype); |
| 142 | 139 | } |
| 143 | 140 | } |
| 144 | - } |
|
| 145 | - else { |
|
| 141 | + } else { |
|
| 146 | 142 | if ($lower === null) { |
| 147 | 143 | $loInc = false; |
| 148 | 144 | } |
@@ -183,8 +179,7 @@ discard block |
||
| 183 | 179 | |
| 184 | 180 | $loInc = ($boundsOrLowerInc[0] == '['); |
| 185 | 181 | $upInc = ($boundsOrLowerInc[1] == ']'); |
| 186 | - } |
|
| 187 | - else { |
|
| 182 | + } else { |
|
| 188 | 183 | $loInc = (bool)$boundsOrLowerInc; |
| 189 | 184 | $upInc = (bool)$upperInc; |
| 190 | 185 | } |
@@ -263,8 +258,7 @@ discard block |
||
| 263 | 258 | { |
| 264 | 259 | if ($this->empty) { |
| 265 | 260 | return null; |
| 266 | - } |
|
| 267 | - else { |
|
| 261 | + } else { |
|
| 268 | 262 | return ($this->lowerInc ? '[' : '(') . ($this->upperInc ? ']' : ')'); |
| 269 | 263 | } |
| 270 | 264 | } |
@@ -289,8 +283,7 @@ discard block |
||
| 289 | 283 | $lo = ($this->lowerInc ? $this->lower : $this->subtype->step(1, $this->lower)); |
| 290 | 284 | $up = ($this->upperInc ? $this->upper : $this->subtype->step(-1, $this->upper)); |
| 291 | 285 | return ($this->subtype->compareValues($lo, $up) == 0); |
| 292 | - } |
|
| 293 | - else { |
|
| 286 | + } else { |
|
| 294 | 287 | return false; |
| 295 | 288 | } |
| 296 | 289 | } |
@@ -328,8 +321,7 @@ discard block |
||
| 328 | 321 | |
| 329 | 322 | if ($this->lower === null) { |
| 330 | 323 | $lo = null; |
| 331 | - } |
|
| 332 | - else { |
|
| 324 | + } else { |
|
| 333 | 325 | $lo = $this->lower; |
| 334 | 326 | $step = $loInc - $this->lowerInc; |
| 335 | 327 | if ($step) { |
@@ -339,8 +331,7 @@ discard block |
||
| 339 | 331 | |
| 340 | 332 | if ($this->upper === null) { |
| 341 | 333 | $up = null; |
| 342 | - } |
|
| 343 | - else { |
|
| 334 | + } else { |
|
| 344 | 335 | $up = $this->upper; |
| 345 | 336 | $step = $this->upperInc - $upInc; |
| 346 | 337 | if ($step) { |
@@ -469,8 +460,7 @@ discard block |
||
| 469 | 460 | if ($this->lower !== null) { |
| 470 | 461 | if ($other->lower === null) { |
| 471 | 462 | return false; |
| 472 | - } |
|
| 473 | - else { |
|
| 463 | + } else { |
|
| 474 | 464 | $cmp = $this->subtype->compareValues($this->lower, $other->lower); |
| 475 | 465 | if ($cmp > 0 || ($cmp == 0 && !$this->lowerInc && $other->lowerInc)) { |
| 476 | 466 | return false; |
@@ -481,8 +471,7 @@ discard block |
||
| 481 | 471 | if ($this->upper !== null) { |
| 482 | 472 | if ($other->upper === null) { |
| 483 | 473 | return false; |
| 484 | - } |
|
| 485 | - else { |
|
| 474 | + } else { |
|
| 486 | 475 | $cmp = $this->subtype->compareValues($this->upper, $other->upper); |
| 487 | 476 | if ($cmp < 0 || ($cmp == 0 && !$this->upperInc && $other->upperInc)) { |
| 488 | 477 | return false; |
@@ -567,22 +556,18 @@ discard block |
||
| 567 | 556 | if ($this->lower === null) { |
| 568 | 557 | $lo = $other->lower; |
| 569 | 558 | $loInc = $other->lowerInc; |
| 570 | - } |
|
| 571 | - elseif ($other->lower === null) { |
|
| 559 | + } elseif ($other->lower === null) { |
|
| 572 | 560 | $lo = $this->lower; |
| 573 | 561 | $loInc = $this->lowerInc; |
| 574 | - } |
|
| 575 | - else { |
|
| 562 | + } else { |
|
| 576 | 563 | $cmp = $this->subtype->compareValues($this->lower, $other->lower); |
| 577 | 564 | if ($cmp < 0) { |
| 578 | 565 | $lo = $other->lower; |
| 579 | 566 | $loInc = $other->lowerInc; |
| 580 | - } |
|
| 581 | - elseif ($cmp > 0) { |
|
| 567 | + } elseif ($cmp > 0) { |
|
| 582 | 568 | $lo = $this->lower; |
| 583 | 569 | $loInc = $this->lowerInc; |
| 584 | - } |
|
| 585 | - else { |
|
| 570 | + } else { |
|
| 586 | 571 | $lo = $this->lower; |
| 587 | 572 | $loInc = ($this->lowerInc && $other->lowerInc); |
| 588 | 573 | } |
@@ -591,22 +576,18 @@ discard block |
||
| 591 | 576 | if ($this->upper === null) { |
| 592 | 577 | $up = $other->upper; |
| 593 | 578 | $upInc = $other->upperInc; |
| 594 | - } |
|
| 595 | - elseif ($other->upper === null) { |
|
| 579 | + } elseif ($other->upper === null) { |
|
| 596 | 580 | $up = $this->upper; |
| 597 | 581 | $upInc = $this->upperInc; |
| 598 | - } |
|
| 599 | - else { |
|
| 582 | + } else { |
|
| 600 | 583 | $cmp = $this->subtype->compareValues($this->upper, $other->upper); |
| 601 | 584 | if ($cmp < 0) { |
| 602 | 585 | $up = $this->upper; |
| 603 | 586 | $upInc = $this->upperInc; |
| 604 | - } |
|
| 605 | - elseif ($cmp > 0) { |
|
| 587 | + } elseif ($cmp > 0) { |
|
| 606 | 588 | $up = $other->upper; |
| 607 | 589 | $upInc = $other->upperInc; |
| 608 | - } |
|
| 609 | - else { |
|
| 590 | + } else { |
|
| 610 | 591 | $up = $this->upper; |
| 611 | 592 | $upInc = ($this->upperInc && $other->upperInc); |
| 612 | 593 | } |
@@ -710,13 +691,11 @@ discard block |
||
| 710 | 691 | if ($object->lower !== null) { |
| 711 | 692 | return false; |
| 712 | 693 | } |
| 713 | - } |
|
| 714 | - elseif ($this->lower instanceof IComparable) { |
|
| 694 | + } elseif ($this->lower instanceof IComparable) { |
|
| 715 | 695 | if (!$this->lower->equals($object->lower)) { |
| 716 | 696 | return false; |
| 717 | 697 | } |
| 718 | - } |
|
| 719 | - else { |
|
| 698 | + } else { |
|
| 720 | 699 | if ($this->lower != $object->lower) { |
| 721 | 700 | return false; |
| 722 | 701 | } |
@@ -726,13 +705,11 @@ discard block |
||
| 726 | 705 | if ($object->upper !== null) { |
| 727 | 706 | return false; |
| 728 | 707 | } |
| 729 | - } |
|
| 730 | - elseif ($this->upper instanceof IComparable) { |
|
| 708 | + } elseif ($this->upper instanceof IComparable) { |
|
| 731 | 709 | if (!$this->upper->equals($object->upper)) { |
| 732 | 710 | return false; |
| 733 | 711 | } |
| 734 | - } |
|
| 735 | - else { |
|
| 712 | + } else { |
|
| 736 | 713 | if ($this->upper != $object->upper) { |
| 737 | 714 | return false; |
| 738 | 715 | } |
@@ -754,11 +731,9 @@ discard block |
||
| 754 | 731 | { |
| 755 | 732 | if ($offset == 0) { |
| 756 | 733 | return ($this->empty ? null : $this->lower); |
| 757 | - } |
|
| 758 | - elseif ($offset == 1) { |
|
| 734 | + } elseif ($offset == 1) { |
|
| 759 | 735 | return ($this->empty ? null : $this->upper); |
| 760 | - } |
|
| 761 | - else { |
|
| 736 | + } else { |
|
| 762 | 737 | trigger_error("Undefined range offset: $offset", E_USER_WARNING); |
| 763 | 738 | return null; |
| 764 | 739 | } |
@@ -38,11 +38,17 @@ |
||
| 38 | 38 | return new TextSearchQuery($queryString); |
| 39 | 39 | } |
| 40 | 40 | |
| 41 | + /** |
|
| 42 | + * @param string $queryString |
|
| 43 | + */ |
|
| 41 | 44 | private function __construct($queryString) |
| 42 | 45 | { |
| 43 | 46 | $this->queryString = $queryString; |
| 44 | 47 | } |
| 45 | 48 | |
| 49 | + /** |
|
| 50 | + * @return string |
|
| 51 | + */ |
|
| 46 | 52 | public function toString() |
| 47 | 53 | { |
| 48 | 54 | return $this->queryString; |
@@ -231,6 +231,9 @@ discard block |
||
| 231 | 231 | return self::fromParts($parts); |
| 232 | 232 | } |
| 233 | 233 | |
| 234 | + /** |
|
| 235 | + * @param string $str |
|
| 236 | + */ |
|
| 234 | 237 | private static function parseIsoDateStr($str) |
| 235 | 238 | { |
| 236 | 239 | if (preg_match('~^(-?\d+)-(-?\d+)-(-?\d+)$~', $str, $m)) { |
@@ -284,6 +287,9 @@ discard block |
||
| 284 | 287 | } |
| 285 | 288 | } |
| 286 | 289 | |
| 290 | + /** |
|
| 291 | + * @param string $str |
|
| 292 | + */ |
|
| 287 | 293 | private static function parsePostgresqlStr($str, $offset = 0) |
| 288 | 294 | { |
| 289 | 295 | static $pgUnits = [ |
@@ -341,6 +347,9 @@ discard block |
||
| 341 | 347 | return $parts; |
| 342 | 348 | } |
| 343 | 349 | |
| 350 | + /** |
|
| 351 | + * @param integer $offset |
|
| 352 | + */ |
|
| 344 | 353 | private static function parseQuantityUnitPairs($str, $offset, $units) |
| 345 | 354 | { |
| 346 | 355 | $result = []; |
@@ -450,7 +459,7 @@ discard block |
||
| 450 | 459 | /** |
| 451 | 460 | * Multiplies this time interval with a scalar and returns the result as a new time interval object. |
| 452 | 461 | * |
| 453 | - * @param number $multiplier |
|
| 462 | + * @param integer $multiplier |
|
| 454 | 463 | * @return TimeInterval |
| 455 | 464 | */ |
| 456 | 465 | public function multiply($multiplier) |
@@ -245,7 +245,7 @@ discard block |
||
| 245 | 245 | preg_match_all('~(-?\d+(?:\.\d+)?)([YMDW])~', $str, $matches, PREG_SET_ORDER); |
| 246 | 246 | static $units = ['Y' => self::YEAR, 'M' => self::MONTH, 'D' => self::DAY, 'W' => self::WEEK]; |
| 247 | 247 | foreach ($matches as $m) { |
| 248 | - $parts[ $units[$m[2]] ] = (float)$m[1]; |
|
| 248 | + $parts[$units[$m[2]]] = (float)$m[1]; |
|
| 249 | 249 | } |
| 250 | 250 | return $parts; |
| 251 | 251 | } |
@@ -278,7 +278,7 @@ discard block |
||
| 278 | 278 | preg_match_all('~(-?\d+(?:\.\d+)?)([HMS])~', $str, $matches, PREG_SET_ORDER, $offset); |
| 279 | 279 | static $units = ['H' => self::HOUR, 'M' => self::MINUTE, 'S' => self::SECOND]; |
| 280 | 280 | foreach ($matches as $m) { |
| 281 | - $parts[ $units[$m[2]] ] = (float)$m[1]; |
|
| 281 | + $parts[$units[$m[2]]] = (float)$m[1]; |
|
| 282 | 282 | } |
| 283 | 283 | return $parts; |
| 284 | 284 | } |
@@ -198,20 +198,16 @@ discard block |
||
| 198 | 198 | $timeDelimPos = strpos($str, 'T'); |
| 199 | 199 | if (!$timeDelimPos) { |
| 200 | 200 | $parts = self::parseIsoDateStr(substr($str, 1)); |
| 201 | - } |
|
| 202 | - elseif ($timeDelimPos == 1) { |
|
| 201 | + } elseif ($timeDelimPos == 1) { |
|
| 203 | 202 | $parts = self::parseTimeStr($str, 2); |
| 204 | - } |
|
| 205 | - else { |
|
| 203 | + } else { |
|
| 206 | 204 | $parts = self::parseIsoDateStr(substr($str, 1, $timeDelimPos - 1)) + |
| 207 | 205 | self::parseTimeStr($str, $timeDelimPos + 1); |
| 208 | 206 | } |
| 209 | - } |
|
| 210 | - elseif ($str[0] == '@') { |
|
| 207 | + } elseif ($str[0] == '@') { |
|
| 211 | 208 | // verbose PostgreSQL format |
| 212 | 209 | $parts = self::parsePostgresqlStr($str, 1); |
| 213 | - } |
|
| 214 | - elseif (preg_match('~^(?:(-)?(\d+)-(\d+))?\s*(-?\d+)??\s*(-?\d+(?::\d+(?::\d+(?:\.\d+)?)?)?)?$~', $str, $m)) { |
|
| 210 | + } elseif (preg_match('~^(?:(-)?(\d+)-(\d+))?\s*(-?\d+)??\s*(-?\d+(?::\d+(?::\d+(?:\.\d+)?)?)?)?$~', $str, $m)) { |
|
| 215 | 211 | // sql format |
| 216 | 212 | $parts = (isset($m[5]) ? self::parseTimeStr($m[5], 0, false) : []); |
| 217 | 213 | if (!empty($m[2]) || !empty($m[3])) { |
@@ -222,8 +218,7 @@ discard block |
||
| 222 | 218 | if (!empty($m[4])) { |
| 223 | 219 | $parts[self::DAY] = (int)$m[4]; |
| 224 | 220 | } |
| 225 | - } |
|
| 226 | - else { |
|
| 221 | + } else { |
|
| 227 | 222 | // PostgreSQL format |
| 228 | 223 | $parts = self::parsePostgresqlStr($str); |
| 229 | 224 | } |
@@ -239,8 +234,7 @@ discard block |
||
| 239 | 234 | self::MONTH => (int)$m[2], |
| 240 | 235 | self::DAY => (int)$m[3], |
| 241 | 236 | ]; |
| 242 | - } |
|
| 243 | - else { |
|
| 237 | + } else { |
|
| 244 | 238 | $parts = []; |
| 245 | 239 | preg_match_all('~(-?\d+(?:\.\d+)?)([YMDW])~', $str, $matches, PREG_SET_ORDER); |
| 246 | 240 | static $units = ['Y' => self::YEAR, 'M' => self::MONTH, 'D' => self::DAY, 'W' => self::WEEK]; |
@@ -266,14 +260,12 @@ discard block |
||
| 266 | 260 | self::MINUTE => $sgn * $m[2], |
| 267 | 261 | self::SECOND => $sgn * (isset($m[3]) ? (float)$m[3] : 0), |
| 268 | 262 | ]; |
| 269 | - } |
|
| 270 | - else { |
|
| 263 | + } else { |
|
| 271 | 264 | return [ |
| 272 | 265 | self::SECOND => (float)$m[1], |
| 273 | 266 | ]; |
| 274 | 267 | } |
| 275 | - } |
|
| 276 | - else { |
|
| 268 | + } else { |
|
| 277 | 269 | $parts = []; |
| 278 | 270 | preg_match_all('~(-?\d+(?:\.\d+)?)([HMS])~', $str, $matches, PREG_SET_ORDER, $offset); |
| 279 | 271 | static $units = ['H' => self::HOUR, 'M' => self::MINUTE, 'S' => self::SECOND]; |
@@ -56,6 +56,10 @@ |
||
| 56 | 56 | return self::fromParts($parts[0], $parts[1], $xipList); |
| 57 | 57 | } |
| 58 | 58 | |
| 59 | + /** |
|
| 60 | + * @param integer $xmin |
|
| 61 | + * @param integer $xmax |
|
| 62 | + */ |
|
| 59 | 63 | private function __construct($xmin, $xmax, $xipList) |
| 60 | 64 | { |
| 61 | 65 | $this->xmin = $xmin; |
@@ -14,14 +14,14 @@ |
||
| 14 | 14 | // VERSION 1: mutable relations |
| 15 | 15 | |
| 16 | 16 | foreach ($personRel as $row) { |
| 17 | - print_r($row); // prints just the 'id', 'firstname', and 'lastname' attributes |
|
| 17 | + print_r($row); // prints just the 'id', 'firstname', and 'lastname' attributes |
|
| 18 | 18 | } |
| 19 | 19 | |
| 20 | 20 | |
| 21 | 21 | // VERSION 2: immutable relations |
| 22 | 22 | |
| 23 | 23 | foreach ($personRel as $row) { |
| 24 | - print_r($row); // prints the whole person row, not just the three attributes |
|
| 24 | + print_r($row); // prints the whole person row, not just the three attributes |
|
| 25 | 25 | } |
| 26 | 26 | |
| 27 | 27 | // VERSION 2a: the project() and similar methods copy the entire object into a new one |
@@ -15,12 +15,12 @@ discard block |
||
| 15 | 15 | $availPersonRel = new DbViewRelation('vw_avail_person', 'datatemplate'); |
| 16 | 16 | |
| 17 | 17 | $sql = new StatementRelation( |
| 18 | - "SELECT avail.room_id, %ln@p, 'the % sign is not expanded inside string literals' |
|
| 18 | + "SELECT avail.room_id, %ln@p, 'the % sign is not expanded inside string literals' |
|
| 19 | 19 | FROM % avail |
| 20 | 20 | JOIN % p ON p.id = avail.person_id", |
| 21 | - $personRel->project('id', 'firstname', 'lastname'), |
|
| 22 | - $availPersonRel, |
|
| 23 | - $personRel |
|
| 21 | + $personRel->project('id', 'firstname', 'lastname'), |
|
| 22 | + $availPersonRel, |
|
| 23 | + $personRel |
|
| 24 | 24 | ); |
| 25 | 25 | // "%ln" denotes a list of identifiers; in this case, it is fed with a relation, which causes to take all its attributes |
| 26 | 26 | // the "@" sign denotes aliasing the relation of attributes |
@@ -33,11 +33,11 @@ discard block |
||
| 33 | 33 | $availPersonRel = new DbViewRelation('vw_avail_person', 'datatemplate'); |
| 34 | 34 | |
| 35 | 35 | $sql = new StatementRelation( |
| 36 | - "SELECT avail.room_id, %ln, 'the % sign is not expanded inside string literals' |
|
| 36 | + "SELECT avail.room_id, %ln, 'the % sign is not expanded inside string literals' |
|
| 37 | 37 | FROM % |
| 38 | 38 | JOIN % ON p.id = avail.person_id", |
| 39 | - $personRel->project('id', 'firstname', 'lastname'), |
|
| 40 | - $availPersonRel->aliased('avail'), |
|
| 41 | - $personRel |
|
| 39 | + $personRel->project('id', 'firstname', 'lastname'), |
|
| 40 | + $availPersonRel->aliased('avail'), |
|
| 41 | + $personRel |
|
| 42 | 42 | ); |
| 43 | 43 | // "%ln" denotes a list of identifiers; in this case, it is fed with a relation, which causes to take all its attributes |
@@ -9,32 +9,32 @@ |
||
| 9 | 9 | $joesRel = $personRel->findWhere('firstname = %', 'Joe'); // the percent sign for no conversion - take "string" |
| 10 | 10 | |
| 11 | 11 | foreach ($joesRel as $row) { |
| 12 | - printf("%s %s\n", $row['firstname'], $row['lastname']); |
|
| 12 | + printf("%s %s\n", $row['firstname'], $row['lastname']); |
|
| 13 | 13 | } |
| 14 | 14 | |
| 15 | 15 | $joesName = $joesRel->project(['firstname', 'lastname', 'dateofbirth']); // project() limits the attributes to be fetched only to the listed ones |
| 16 | 16 | foreach ($joesName as $i => $row) { |
| 17 | - printf("%d: %s %s, born on %s\n", |
|
| 18 | - $i, $row['firstname'], $row['lastname'], $row['dateofbirth']->format('Y-m-d') |
|
| 19 | - ); |
|
| 17 | + printf("%d: %s %s, born on %s\n", |
|
| 18 | + $i, $row['firstname'], $row['lastname'], $row['dateofbirth']->format('Y-m-d') |
|
| 19 | + ); |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | $joeRows = $joesRel->map('id'); // fetch all columns, map by id |
| 23 | 23 | foreach ($joeRows as $id => $row) { |
| 24 | - printf("person #%d:\n", $id); |
|
| 25 | - foreach ($row as $field => $value) { |
|
| 26 | - printf(" %s => %s\n", $field, $value); |
|
| 27 | - } |
|
| 24 | + printf("person #%d:\n", $id); |
|
| 25 | + foreach ($row as $field => $value) { |
|
| 26 | + printf(" %s => %s\n", $field, $value); |
|
| 27 | + } |
|
| 28 | 28 | } |
| 29 | 29 | |
| 30 | 30 | $joesLastnameMap = $joesRel->map('id', 'lastname'); // fetch a map of person ids to lastnames |
| 31 | 31 | foreach ($joesLastnameMap as $id => $lastname) { |
| 32 | - printf("%d: %s\n", $id, $lastname); |
|
| 32 | + printf("%d: %s\n", $id, $lastname); |
|
| 33 | 33 | } |
| 34 | 34 | |
| 35 | 35 | $joesRowMap = $joesRel->map('id', ['firstname', 'lastname', 'dateofbirth']); // fetch a map of person ids to rows containing the person firstname, lastname, and date of birth |
| 36 | 36 | foreach ($joesRowMap as $id => $row) { |
| 37 | - printf("%d: %s %s, born on %s\n", |
|
| 38 | - $id, $row['firstname'], $row['lastname'], $row['dateofbirth']->format('Y-m-d') |
|
| 39 | - ); |
|
| 37 | + printf("%d: %s %s, born on %s\n", |
|
| 38 | + $id, $row['firstname'], $row['lastname'], $row['dateofbirth']->format('Y-m-d') |
|
| 39 | + ); |
|
| 40 | 40 | } |
@@ -12,53 +12,53 @@ |
||
| 12 | 12 | $roomIds = [3, 4, 5]; |
| 13 | 13 | |
| 14 | 14 | $sql = new StatementRelation( |
| 15 | - "SELECT avail.room_id, %ln@p, 'the % sign is not expanded inside string literals' |
|
| 15 | + "SELECT avail.room_id, %ln@p, 'the % sign is not expanded inside string literals' |
|
| 16 | 16 | FROM % avail |
| 17 | 17 | JOIN % p ON p.id = avail.person_id |
| 18 | 18 | WHERE avail.room_id IN (%l) AND p.id IN (%l) |
| 19 | 19 | ORDER BY avail.room_id, p.lastname, p.firstname", |
| 20 | - $personRel->project('id', 'firstname', 'lastname'), // limit the person relation only to these attributes |
|
| 21 | - $availPersonRel, // the real power comes in: any relation shall be applicable in the query |
|
| 22 | - $personRel, |
|
| 23 | - $roomIds, $employeeIds |
|
| 20 | + $personRel->project('id', 'firstname', 'lastname'), // limit the person relation only to these attributes |
|
| 21 | + $availPersonRel, // the real power comes in: any relation shall be applicable in the query |
|
| 22 | + $personRel, |
|
| 23 | + $roomIds, $employeeIds |
|
| 24 | 24 | ); |
| 25 | 25 | // "%l" generally means a list of something; another formatting token may follow, specifying the list subtype |
| 26 | 26 | // the list subtype may be omitted to use the identity conversion, just like for any argument |
| 27 | 27 | // here, "%ln" denotes a list of identifiers; in this case, it is fed with a relation, which causes to take all its (three) attributes |
| 28 | 28 | // the "@" sign denotes aliasing the relation of attributes |
| 29 | 29 | foreach ($sql as $row) { |
| 30 | - printf("%s %s available for room #%d\n", $row['firstname'], $row['lastname'], $row['room_id']); |
|
| 30 | + printf("%s %s available for room #%d\n", $row['firstname'], $row['lastname'], $row['room_id']); |
|
| 31 | 31 | } |
| 32 | 32 | |
| 33 | 33 | |
| 34 | 34 | class PersonRole extends DbTableRelation |
| 35 | 35 | { |
| 36 | - public function __construct() |
|
| 37 | - { |
|
| 38 | - parent::__construct('person_role'); |
|
| 39 | - } |
|
| 36 | + public function __construct() |
|
| 37 | + { |
|
| 38 | + parent::__construct('person_role'); |
|
| 39 | + } |
|
| 40 | 40 | } |
| 41 | 41 | |
| 42 | 42 | class Role extends DbTableRelation |
| 43 | 43 | { |
| 44 | - const ADMIN = 1; |
|
| 44 | + const ADMIN = 1; |
|
| 45 | 45 | |
| 46 | - public function __construct() |
|
| 47 | - { |
|
| 48 | - parent::__construct('role'); |
|
| 49 | - } |
|
| 46 | + public function __construct() |
|
| 47 | + { |
|
| 48 | + parent::__construct('role'); |
|
| 49 | + } |
|
| 50 | 50 | } |
| 51 | 51 | |
| 52 | 52 | $adminInfo = $personRel->project([ |
| 53 | - 'id', |
|
| 54 | - 'fname' => 'firstname', |
|
| 55 | - 'lastname' => 'UPPER(lastname)', |
|
| 56 | - 'is_admin' => new Statement("EXISTS(SELECT 1 FROM %n WHERE role = %)", PersonRole::class, Role::ADMIN), // unfortunately, PHP implements ::class as mere string, not an object of a special class, thus, the explicit %n must be used |
|
| 53 | + 'id', |
|
| 54 | + 'fname' => 'firstname', |
|
| 55 | + 'lastname' => 'UPPER(lastname)', |
|
| 56 | + 'is_admin' => new Statement("EXISTS(SELECT 1 FROM %n WHERE role = %)", PersonRole::class, Role::ADMIN), // unfortunately, PHP implements ::class as mere string, not an object of a special class, thus, the explicit %n must be used |
|
| 57 | 57 | ]); |
| 58 | 58 | foreach ($adminInfo as $row) { |
| 59 | - echo $row['fname'] . ' ' . $row['lastname']; |
|
| 60 | - if ($row['is_admin']) { |
|
| 61 | - echo ' is admin'; |
|
| 62 | - } |
|
| 63 | - echo "\n"; |
|
| 59 | + echo $row['fname'] . ' ' . $row['lastname']; |
|
| 60 | + if ($row['is_admin']) { |
|
| 61 | + echo ' is admin'; |
|
| 62 | + } |
|
| 63 | + echo "\n"; |
|
| 64 | 64 | } |