	join version 2.6d  20 Jan 10

Incompatibilities w/earlier versions:
	Compared with 2.6c, this version contains a bug fix.
Also, any discrepancies between the names "join" and "joinu"
have been resolved in favor of "join"
	2.6c was written in Aug 05.  Its incompatibilities w/
earlier versions are best derived from comments in the source.

	join attempts database-style joins on 2 JGOFS objects,
whose object specs it accepts as 2 command line arguments.  The order is
significant.
	join will perform inner, outer, rightouter and leftouter
types of join.  A default can be established at compile time by use
of the JOINTYPE macro.   A run time value can be established with the
JOINTYPE environment variable.  The macro and the environment variable 
can take the values INNER, LEFTOUTER, RIGHTOUTER, and OUTER.
In addition, the environment variable will accept lower case versions 
of the above strings.  Also, the environment variable will accept
FULLOUTER as a synonym for OUTER.  An environment variable value overrides
a compile-time value.  In the absence of any specification,
join will use INNER.

	Some documentation is in the source file.  In particular, a section
at the end (reproduced here at bottom) may provide a general overview.  
There has been a contentious history involving the levelization of the 
joined object.  Details about that will have to come from the source code.


join needs some routines from "the JGOFS library".  It needs utils v 1.9 or
higher

========================

/*	Scheme/"interesting" details:					*/
/*	  1) Read 2nd object into memory.				*/
/*	  2) The variable list of the constructed object is the union	*/
/*	     of the variable lists of the 2 input objects.  The		*/
/*	     "match set" of variables is the intersection of the 2 lists */
/*	  3) Within each level of the joined object, variables are	*/
/*	     arranged as follows:					*/
/*	 	1st: variables common to both objects			*/
/*	 	Next: variables belonging to the first object in the	*/
/*			order they appeared in the first object.	*/
/*	 	Last: variables belonging to the 2nd object in the	*/
/*			order they appeared in the 2nd object		*/
/*	     Common variables are ordered according to their order	*/
/*	     in the first object.  In all orderings, variables closest	*/
/*	     to level 0 precede others.					*/
/*	  4) Records of the 2 objects match when the values for all	*/
/*	     variables in the match set have the same value.		*/
/*	     Test is numeric if both vals are numeric; string else.	*/
/*	     Matching has nothing to do with levels - records that	*/
/*	     match are output w/the appropriate levelizing		*/
/*	  5) It is possible that many records from each object have	*/
/*	     the same set of values for the match set of variables.	*/
/*	     In such cases, every record from the 1st object is		*/
/*	     matched with the first record from the 2nd object.  Other	*/
/*	     records from the 2nd object are considered unmatched and	*/
/*	     appear depending on the type of join (item 6, below)	*/
/*	  6) Number of records in constructed object:			*/
/*	     a)	Inner join: number of records in the 1st object that	*/
/*		    have a match with some record in 2nd object.	*/
/*	     b) Left outer join: number of records in the 1st object.	*/
/*		    If no match is found in the 2nd object, constructed	*/
/*		    object variables that come from the 2nd object get	*/
/*		    a value of "nd"					*/
/*	     c) Right outer join: number of records in the 2nd object.	*/
/*		    If no match is found in the 1st object, constructed	*/
/*		    object variables that come from the 1st object get	*/
/*		    a value of "nd".  Unmatched records appear after	*/
/*		    all records from the 1st object have been processed	*/
/*	     d) (Full) outer join: number of matched records plus	*/
/*		    number of unmatched records in both objects.  Un-	*/
/*		    matched records from the 1st object appear ac-	*/
/*		    cording to the rules of 6b.  Unmatched records from	*/
/*		    the 2nd object appear according to the rules of 6c	*/
/*	The functionality described in 1, 2, 4 (except for string test), */
/*	5, and 6a was in the joinu code as of 30 Sep 98.		*/
