/**
  * @param QOM\SelectorInterface|QOM\JoinInterface $left
  * @param QOM\SelectorInterface $right
  * @param QOM\JoinConditionInterface $condition
  *
  * @return string
  *
  * @throws NotImplementedException if a SameNodeJoinCondtion is used.
  */
 public function walkJoinCondition($left, QOM\SelectorInterface $right, QOM\JoinConditionInterface $condition)
 {
     if ($condition instanceof QOM\ChildNodeJoinConditionInterface) {
         return $this->walkChildNodeJoinCondition($condition);
     }
     if ($condition instanceof QOM\DescendantNodeJoinConditionInterface) {
         return $this->walkDescendantNodeJoinCondition($condition);
     }
     if ($condition instanceof QOM\EquiJoinConditionInterface) {
         if ($left instanceof QOM\SelectorInterface) {
             $selectorName = $left->getSelectorName();
         } else {
             $selectorName = $this->getRightJoinSelector($left->getJoinCondition());
         }
         return $this->walkEquiJoinCondition($selectorName, $right->getSelectorName(), $condition);
     }
     if ($condition instanceof QOM\SameNodeJoinConditionInterface) {
         throw new NotImplementedException("SameNodeJoinCondtion");
     }
 }
 /**
  * Selector ::= nodeTypeName ['AS' selectorName]
  * nodeTypeName ::= Name
  *
  * @param  QOM\SelectorInterface $selector
  * @return string
  */
 protected function convertSelector(QOM\SelectorInterface $selector)
 {
     return $this->generator->evalSelector($selector->getNodeTypeName(), $selector->getSelectorName());
 }