/**
  * @param arJoin $statement
  *
  * @return string
  */
 public function getSaveTableName(arJoin $statement)
 {
     $table_name = $statement->getTableName();
     if (in_array($table_name, $this->table_names)) {
         $vals = array_count_values($this->table_names);
         $next = $vals[$table_name] + 1;
         $statement->setFullNames(true);
         $statement->setIsMapped(true);
         return $table_name . '_' . $next;
     } else {
         return $table_name;
     }
 }
 /**
  * @param string $type
  * @param        $tablename
  * @param        $on_this
  * @param        $on_external
  * @param array  $fields
  * @param string $operator
  * @param bool   $both_external
  *
  * @return $this
  * @throws arException
  */
 protected function join($type = arJoin::TYPE_INNER, $tablename, $on_this, $on_external, $fields = array('*'), $operator = '=', $both_external = false)
 {
     if (!$this->getAR()->getArFieldList()->isField($on_this) and !$both_external) {
         throw new arException(arException::LIST_JOIN_ON_WRONG_FIELD, $on_this);
     }
     $full_names = false;
     foreach ($fields as $field_name) {
         if ($this->getAR()->getArFieldList()->isField($field_name)) {
             $full_names = true;
             break;
         }
     }
     $arJoin = new arJoin();
     $arJoin->setType($type);
     $arJoin->setFullNames($full_names);
     $arJoin->setTableName($tablename);
     $arJoin->setOnFirstField($on_this);
     $arJoin->setOnSecondField($on_external);
     $arJoin->setOperator($operator);
     $arJoin->setFields($fields);
     $arJoin->setBothExternal($both_external);
     $this->getArJoinCollection()->add($arJoin);
     foreach ($fields as $field) {
         $arSelect = new arSelect();
         $arSelect->setTableName($arJoin->getTableNameAs());
         $arSelect->setFieldName($field);
         $arSelect->setAs($arJoin->getTableNameAs() . '_' . $field);
         $this->getArSelectCollection()->add($arSelect);
     }
     return $this;
 }
 /**
  * @param arJoin $statement
  */
 public function add(arJoin $statement)
 {
     $statement->setTableNameAs($this->getSaveTableName($statement));
     $this->table_names[] = $statement->getTableName();
     parent::add($statement);
 }