code: public Set<String> joinFields(String fldName) {
  		Set<String> flds = new HashSet<String>();
  		flds.add(fldName);
  		Deque<String> queue = new LinkedList<String>();
  		queue.addLast(fldName);
  		/*
  		 * Handles the equal transitivity. For example, join fields of F1 in the
  		 * predicate "F1=F3 and F3=F4 and F4=F7" are F3, F4 and F7.
  		 */
  		while (!queue.isEmpty()) {
  			String fld = queue.removeFirst();
  			for (Term t : terms) {
  				String s = t.oppositeField(fld);
  				if (s != null && t.operator(fldName) == OP_EQ
  						&& !flds.contains(s)) {
  					flds.add(s);
  					queue.addLast(s);
  				}
  			}
  		}
  		flds.remove(fldName);
  		return flds.size() == 0 ? null : flds;
  	}
docs: Determines if there are terms of the form "F1=F2" or result in "F1=F2"
  via equal transitivity, where F1 is the specified field and F2 is another
  field (called join field). If so, the method returns the names of all
  join fields. If not, the method returns null.
  
  
  @param fldName
  the name of the field
  @return the names of the join fields, or null