public void addJoin(
        final String joinType, final Joinable j, final HashMap<String, String> variableBindings) {

      if (j == null) {
        LOG.info("Skipping join");
        return;
      }
      JoinConditions conditions = new JoinConditions();

      for (MappableNodePattern existingVar : this.joinVars()) {
        for (MappableNodePattern candidateVar : j.joinVars()) {

          String existingVarName = existingVar.getVarName();
          String candidateVarName = candidateVar.getVarName();
          String candidateBinding = variableBindings.get(candidateVar.getVarName());
          String existingBinding = existingVar.mappedName();

          if (existingVarName.equals(candidateVarName)
              && existingBinding.equals(candidateBinding)) {
            conditions.addCondition(existingBinding, " = ", candidateVar.mappedName());
          }
        }
      }

      addJoin(joinType, j, conditions);
    }
    public Set<MappableNodePattern> joinVars() {
      HashSet<MappableNodePattern> joinVars = new HashSet<MappableNodePattern>();

      for (Joinable joinable : joined) {
        joinVars.addAll(joinable.joinVars());
      }

      return joinVars;
    }