123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- <?php
- /**
- * This file is part of the Propel package.
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @license MIT License
- */
- /**
- * Data object to describe a join between two tables, for example
- * <pre>
- * table_a LEFT JOIN table_b ON table_a.id = table_b.a_id
- * </pre>
- *
- * @author Francois Zaninotto (Propel)
- * @author Hans Lellelid <hans@xmpl.org> (Propel)
- * @author Kaspars Jaudzems <kaspars.jaudzems@inbox.lv> (Propel)
- * @author Frank Y. Kim <frank.kim@clearink.com> (Torque)
- * @author John D. McNally <jmcnally@collab.net> (Torque)
- * @author Brett McLaughlin <bmclaugh@algx.net> (Torque)
- * @author Eric Dobbs <eric@dobbse.net> (Torque)
- * @author Henning P. Schmiedehausen <hps@intermeta.de> (Torque)
- * @author Sam Joseph <sam@neurogrid.com> (Torque)
- * @package propel.runtime.query
- */
- class Join
- {
- // default comparison type
- const EQUAL = "=";
-
- // the left parts of the join condition
- protected $left = array();
- // the right parts of the join condition
- protected $right = array();
- // the comparison operators for each pair of columns in the join condition
- protected $operator = array();
-
- // the type of the join (LEFT JOIN, ...), or null for an implicit join
- protected $joinType = null;
-
- // the number of conditions in the join
- protected $count = 0;
- /**
- * Constructor
- * Use it preferably with no arguments, and then use addCondition() and setJoinType()
- * Syntax with arguments used mainly for backwards compatibility
- *
- * @param string $leftColumn The left column of the join condition
- * (may contain an alias name)
- * @param string $rightColumn The right column of the join condition
- * (may contain an alias name)
- * @param string $joinType The type of the join. Valid join types are null (implicit join),
- * Criteria::LEFT_JOIN, Criteria::RIGHT_JOIN, and Criteria::INNER_JOIN
- */
- public function __construct($leftColumn = null, $rightColumn = null, $joinType = null)
- {
- if(!is_null($leftColumn)) {
- if (!is_array($leftColumn)) {
- // simple join
- $this->addCondition($leftColumn, $rightColumn);
- } else {
- // join with multiple conditions
- if (count($leftColumn) != count($rightColumn) ) {
- throw new PropelException("Unable to create join because the left column count isn't equal to the right column count");
- }
- foreach ($leftColumn as $key => $value)
- {
- $this->addCondition($value, $rightColumn[$key]);
- }
- }
- $this->setJoinType($joinType);
- }
- }
-
- /**
- * Join condition definition
- *
- * @param string $left The left column of the join condition
- * (may contain an alias name)
- * @param string $right The right column of the join condition
- * (may contain an alias name)
- * @param string $operator The comparison operator of the join condition, default Join::EQUAL
- */
- public function addCondition($left, $right, $operator = self::EQUAL)
- {
- $this->left[] = $left;
- $this->right[] = $right;
- $this->operator[] = $operator;
- $this->count++;
- }
-
- /**
- * Retrieve the number of conditions in the join
- *
- * @return integer The number of conditions in the join
- */
- public function countConditions()
- {
- return $this->count;
- }
-
- /**
- * Return an array of the join conditions
- *
- * @return array An array of arrays representing (left, comparison, right) for each condition
- */
- public function getConditions()
- {
- $conditions = array();
- for ($i=0; $i < $this->count; $i++) {
- $conditions[] = array(
- 'left' => $this->getLeftColumn($i),
- 'operator' => $this->getOperator($i),
- 'right' => $this->getRightColumn($i)
- );
- }
- return $conditions;
- }
- /**
- * @return the comparison operator for the join condition
- */
- public function getOperator($index = 0)
- {
- return $this->operator[$index];
- }
-
- public function getOperators()
- {
- return $this->operator;
- }
-
- /**
- * Set the join type
- *
- * @param string $joinType The type of the join. Valid join types are
- * null (adding the join condition to the where clause),
- * Criteria::LEFT_JOIN(), Criteria::RIGHT_JOIN(), and Criteria::INNER_JOIN()
- */
- public function setJoinType($joinType = null)
- {
- $this->joinType = $joinType;
- }
-
- /**
- * Get the join type
- *
- * @return string The type of the join, i.e. Criteria::LEFT_JOIN(), ...,
- * or null for adding the join condition to the where Clause
- */
- public function getJoinType()
- {
- return $this->joinType;
- }
- /**
- * @return the left column of the join condition
- */
- public function getLeftColumn($index = 0)
- {
- return $this->left[$index];
- }
-
- /**
- * @return all right columns of the join condition
- */
- public function getLeftColumns()
- {
- return $this->left;
- }
- public function getLeftColumnName($index = 0)
- {
- return substr($this->left[$index], strrpos($this->left[$index], '.') + 1);
- }
- public function getLeftTableName($index = 0)
- {
- return substr($this->left[$index], 0, strrpos($this->left[$index], '.'));
- }
- /**
- * @return the right column of the join condition
- */
- public function getRightColumn($index = 0)
- {
- return $this->right[$index];
- }
-
- /**
- * @return all right columns of the join condition
- */
- public function getRightColumns()
- {
- return $this->right;
- }
- public function getRightColumnName($index = 0)
- {
- return substr($this->right[$index], strrpos($this->right[$index], '.') + 1);
- }
- public function getRightTableName($index = 0)
- {
- return substr($this->right[$index], 0, strrpos($this->right[$index], '.'));
- }
- public function equals($join)
- {
- return $join !== null
- && $join instanceof Join
- && $this->joinType == $join->getJoinType()
- && $this->getConditions() == $join->getConditions();
- }
-
- /**
- * returns a String representation of the class,
- * mainly for debugging purposes
- *
- * @return string A String representation of the class
- */
- public function toString()
- {
- $result = '';
- if ($this->joinType !== null) {
- $result .= $this->joinType . ' : ';
- }
- foreach ($this->getConditions() as $index => $condition) {
- $result .= implode($condition);
- if ($index + 1 < $this->count) {
- $result .= ' AND ';
- }
- }
- $result .= '(ignoreCase not considered)';
-
- return $result;
- }
-
- public function __toString()
- {
- return $this->toString();
- }
- }
-
|