code: private void join(ParserRuleContext ctx, Class<? extends Join> type)
    {
      QueryNode left = relationChain.get(relationIdx);
      QueryNode right = relationChain.get(relationIdx+1);
  
      try
      {
        Constructor<? extends Join> c = type.getConstructor(QueryNode.class);
        Join newJoin = c.newInstance(right);
        left.addOutgoingJoin(addParsedLocation(ctx, newJoin));
        
      }
      catch (NoSuchMethodException ex)
      {
        log.error(null, ex);
      }
      catch (InstantiationException ex)
      {
        log.error(null, ex);
      }
      catch (IllegalAccessException ex)
      {
        log.error(null, ex);
      }
      catch (InvocationTargetException ex)
      {
        log.error(null, ex);
      }
  
    }
docs: Automatically create a join from a node and a join class.
  
  This will automatically get the left and right hand refs
  and will construct a new join specified by the type using reflection.
  
  It will also add an parsed location to the join.
  
  @node
  @type00