head	1.14;
access;
symbols
	release_4_2:1.14
	aix_ok:1.14
	Version_2_1:1.10
	C_Demo_1:1.7
	Retrieve_x_qual:1.6
	Retrieve_x_all:1.5
	Retrieve_x_1:1.4;
locks; strict;
comment	@ * @;


1.14
date	92.07.12.10.57.31;	author joey;	state Exp;
branches;
next	1.13;

1.13
date	91.11.17.20.39.50;	author mer;	state Exp;
branches;
next	1.12;

1.12
date	91.11.15.16.27.23;	author hong;	state Exp;
branches;
next	1.11;

1.11
date	91.05.11.04.34.53;	author kemnitz;	state Exp;
branches;
next	1.10;

1.10
date	90.09.25.16.36.08;	author kemnitz;	state Exp;
branches;
next	1.9;

1.9
date	90.05.30.18.56.48;	author cimarron;	state Exp;
branches;
next	1.8;

1.8
date	89.10.13.17.59.37;	author hong;	state Exp;
branches;
next	1.7;

1.7
date	89.09.05.17.17.36;	author mao;	state C_Demo_1;
branches;
next	1.6;

1.6
date	89.08.04.14.27.29;	author goh;	state Exp;
branches;
next	1.5;

1.5
date	89.08.04.13.23.31;	author goh;	state Exp;
branches;
next	1.4;

1.4
date	89.08.01.14.40.13;	author goh;	state Exp;
branches;
next	1.3;

1.3
date	89.07.25.17.35.39;	author ong;	state Exp;
branches;
next	1.2;

1.2
date	89.07.21.14.55.34;	author ong;	state Exp;
branches;
next	1.1;

1.1
date	89.07.10.15.17.13;	author ong;	state Exp;
branches;
next	;


desc
@merge utilities
@


1.14
log
@CInfo->clause is now a LispValue, not an Expr
@
text
@
/*     
 *      FILE
 *     	mergeutils
 *     
 *      DESCRIPTION
 *     	Utilities for finding applicable merge clauses and pathkeys
 *     
 */

/* RcsId ("$Header: /private/joey/pg/src/planner/path/RCS/mergeutils.c,v 1.13 1991/11/17 20:39:50 mer Exp joey $"); */

/*     
 *      EXPORTS
 *     		group-clauses-by-order
 *     		match-order-mergeinfo
 */

#include "nodes/pg_lisp.h"
#include "nodes/relation.h"
#include "nodes/relation.a.h"

#include "planner/internal.h"
#include "planner/mergeutils.h"
#include "planner/clauses.h"

/*    
 *    	group-clauses-by-order
 *    
 *    	If a join clause node in 'clauseinfo-list' is mergesortable, store
 *    	it within a mergeinfo node containing other clause nodes with the same
 *    	mergesort ordering.
 *    
 *    	'clauseinfo-list' is the list of clauseinfo nodes
 *    	'inner-relid' is the relid of the inner join relation
 *    
 *    	Returns the new list of mergeinfo nodes.
 *    
 */
LispValue
group_clauses_by_order (clauseinfo_list,inner_relid)
     LispValue clauseinfo_list,inner_relid ;
{
     LispValue mergeinfo_list = LispNil;
     LispValue xclauseinfo = LispNil;
	
     foreach (xclauseinfo, clauseinfo_list) {
	  CInfo clauseinfo = (CInfo)CAR(xclauseinfo);
	  MergeOrder merge_ordering = get_mergesortorder (clauseinfo);
	  
	  if ( merge_ordering) {
	       /*    Create a new mergeinfo node and add it to */
	       /*    'mergeinfo-list' if one does not yet exist for this */
	       /*    merge ordering. */
	       MInfo xmergeinfo = 
		 match_order_mergeinfo (merge_ordering,mergeinfo_list);
	       LispValue clause = get_clause (clauseinfo);
	       Var leftop = get_leftop (clause);
	       Var rightop = get_rightop (clause);
	       JoinKey keys;
	       
	       if(equal ((Node)inner_relid,
			 (Node)lispInteger(get_varno (leftop)))) {
		    keys = MakeJoinKey ((LispValue)rightop,(LispValue)leftop);
	       } 
	       else {
		    keys = MakeJoinKey ((LispValue)leftop,(LispValue)rightop);
	       } 

	       if ( null (xmergeinfo)) {
		    xmergeinfo = RMakeMInfo();
		    set_m_ordering(xmergeinfo,merge_ordering);
		    mergeinfo_list = push ((LispValue)xmergeinfo,
					   mergeinfo_list);
	       }

	       set_clauses((JoinMethod)xmergeinfo,
	                push (clause,
			      joinmethod_clauses((JoinMethod)xmergeinfo)));
	       set_jmkeys((JoinMethod)xmergeinfo, 
			 push((LispValue)keys,
			      joinmethod_keys((JoinMethod)xmergeinfo)));
	  }
     }
     return(mergeinfo_list);

}  /* function end  */


dump_rel(rel)

Rel rel;

{
	printf("relids: %d\n", rel->relids);
	printf("indexed %c\n", (rel->indexed ? 't' : 'f'));
	printf("pages %d tuples %d size %d width %d\n", rel->pages, rel->tuples,
		   rel->size, rel->width);
	printf("targetlist: \n");
	lispDisplay(rel->targetlist);
	printf("\npathlist: \n");
	lispDisplay(rel->targetlist);
	printf("\nclauseinfo: \n");
	lispDisplay(rel->clauseinfo);
}


/*    
 *    	match-order-mergeinfo
 *    
 *    	Searches the list 'mergeinfo-list' for a mergeinfo node whose order
 *    	field equals 'ordering'.
 *    
 *    	Returns the node if it exists.
 *    
 */

/*  .. group-clauses-by-order, match-unsorted-inner, match-unsorted-outer
 */
MInfo
match_order_mergeinfo (ordering,mergeinfo_list)
     MergeOrder ordering;
     List mergeinfo_list ;
{
     MergeOrder xmergeorder;
     LispValue xmergeinfo = LispNil;
     bool temp1 ;
     bool temp2 ;
     foreach(xmergeinfo, mergeinfo_list) {
	  MInfo mergeinfo = (MInfo)CAR(xmergeinfo);
	  xmergeorder = get_m_ordering(mergeinfo);
	  temp1 =(bool)( IsA(ordering,MergeOrder) &&
			equal_merge_merge_ordering(ordering,xmergeorder));
	  temp2 = (bool) (!IsA(ordering,MergeOrder) &&
			  equal_path_merge_ordering(ordering,xmergeorder));
	  if (temp1 || temp2)
	    return(mergeinfo);
	  
     }
     return((MInfo) LispNil);
}
@


1.13
log
@prototyping
@
text
@d11 1
a11 1
/* RcsId ("$Header: /users/mer/postgres/src/planner/path/RCS/mergeutils.c,v 1.12 1991/11/15 16:27:23 hong Exp mer $"); */
d57 3
a59 3
	       Expr clause = get_clause (clauseinfo);
	       Var leftop = get_leftop ((LispValue)clause);
	       Var rightop = get_rightop ((LispValue)clause);
d78 1
a78 1
	                push ((LispValue)clause,
@


1.12
log
@planner prototyping
@
text
@d11 1
a11 1
/* RcsId ("$Header: RCS/mergeutils.c,v 1.11 91/05/11 04:34:53 kemnitz Exp $"); */
d62 2
a63 1
	       if(equal (inner_relid,lispInteger(get_varno (leftop)))) {
d73 2
a74 1
		    mergeinfo_list = push (xmergeinfo,mergeinfo_list);
d78 2
a79 1
	                push (clause,joinmethod_clauses((JoinMethod)xmergeinfo)));
d81 2
a82 1
			 push(keys,joinmethod_keys((JoinMethod)xmergeinfo)));
@


1.11
log
@added dump_rel which dumps the values of a Rel node (for debugging).
@
text
@d11 1
a11 1
/* RcsId ("$Header: RCS/mergeutils.c,v 1.10 90/09/25 16:36:08 kemnitz Exp Locker: kemnitz $"); */
a26 6
/* ----------------
 *	MInfo creator declaration
 * ----------------
 */
extern MInfo RMakeMInfo();

d58 2
a59 2
	       Var leftop = get_leftop (clause);
	       Var rightop = get_rightop (clause);
d63 1
a63 1
		    keys = MakeJoinKey (rightop,leftop);
d66 1
a66 1
		    keys = MakeJoinKey (leftop,rightop);
d75 4
a78 3
	       set_clauses(xmergeinfo,
	                push (clause,joinmethod_clauses (xmergeinfo)));
	       set_jmkeys(xmergeinfo, push(keys,joinmethod_keys (xmergeinfo)));
d118 2
a119 1
     LispValue ordering,mergeinfo_list ;
@


1.10
log
@Updating from revision 1.9 to revision 1.10
@
text
@d11 1
a11 1
/* RcsId ("$Header: RCS/mergeutils.c,v 1.10 90/08/14 11:10:07 cimarron Exp $"); */
d90 17
@


1.9
log
@CreateNode(Foo) --> RMakeFoo() change
@
text
@d11 1
a11 1
/* RcsId ("$Header: RCS/mergeutils.c,v 1.8 89/10/13 17:59:37 hong Exp $"); */
d19 4
a22 1
#include "pg_lisp.h"
a23 2
#include "relation.h"
#include "relation.a.h"
@


1.8
log
@some fixes for mergejoins
@
text
@d11 1
a11 1
/* RcsId ("$Header: RCS/mergeutils.c,v 1.7 89/09/05 17:17:36 mao C_Demo_1 Locker: hong $"); */
d26 5
a31 1

d75 1
a75 1
		    xmergeinfo = CreateNode (MInfo);
@


1.7
log
@Working version of C-only demo
@
text
@d11 1
a11 1
/* RcsId ("$Header: /usr6/postgres/mao/postgres/src/planner/path/RCS/mergeutils.c,v 1.6 89/08/04 14:27:29 goh Exp $"); */
d46 1
a46 1
     LispValue clauseinfo = LispNil;
d48 2
a49 1
     foreach (clauseinfo, clauseinfo_list) {
d56 1
a56 1
	       CInfo xmergeinfo = 
d63 1
a63 1
	       if(equal (inner_relid,get_varno (leftop))) {
d71 3
a73 3
		    xmergeinfo = CreateNode (CInfo);
		    set_mergesortorder(xmergeinfo,merge_ordering);
		    push (xmergeinfo,mergeinfo_list);
d75 4
a78 2
	       push (clause,joinmethod_clauses (xmergeinfo));
	       push (keys,joinmethod_keys (xmergeinfo));
d99 1
a99 1
CInfo
d108 2
a109 1
	  xmergeorder = get_mergesortorder(xmergeinfo);
d115 1
a115 1
	    return((CInfo)xmergeinfo);
d118 1
a118 1
     return((CInfo) LispNil);
@


1.6
log
@reorganised header files
@
text
@d11 1
a11 1
/* RcsId ("$Header: mergeutils.c,v 1.5 89/08/04 13:23:31 goh Locked $"); */
@


1.5
log
@checkin for retrieve (x.all)
@
text
@d11 1
a11 1
/* RcsId ("$Header: mergeutils.c,v 1.4 89/08/01 14:40:13 goh Locked $"); */
d20 1
a20 1
#include "internal.h"
d23 2
a24 2
#include "mergeutils.h"
#include "clauses.h"
@


1.4
log
@retrieve (x=1) checkin
@
text
@d11 1
a11 1
/* RcsId ("$Header: mergeutils.c,v 1.3 89/07/25 17:35:39 ong Exp $"); */
@


1.3
log
@Phase III
@
text
@d11 1
a11 1
/* RcsId ("$Header: mergeutils.c,v 1.2 89/07/21 14:55:34 ong Locked $"); */
d58 2
a59 2
	       LispValue leftop = get_leftop (clause);
	       LispValue rightop = get_rightop (clause);
d71 1
a71 1
		    set_mergesortorder(xmergeinfo,ordering(merge_ordering));
d106 1
a106 1
	  temp1 =(bool)( mergeorder_p(ordering) &&
d108 1
a108 1
	  temp2 = (bool) (!mergeorder_p(ordering) &&
@


1.2
log
@Phase II
@
text
@d6 1
a6 1
 *      DESC<RIPTION
d11 1
a11 1
/* RcsId ("$Header: mergeutils.c,v 1.1 89/07/10 15:17:13 ong Locked $"); */
@


1.1
log
@Initial revision
@
text
@d11 1
a11 1
/* RcsId ("$Header: mergeutils.c,v 1.1 89/04/27 21:04:26 ong Locked $"); */
d19 1
d21 4
a25 1
extern LispValue match_order_mergeinfo();
d27 1
a44 1
     /* XXX - let form, maybe incorrect */
d49 1
a49 2
	  /* XXX - let form, maybe incorrect */
	  LispValue merge_ordering = get_mergesortorder (clauseinfo);
d55 1
a55 1
	       LispValue xmergeinfo = 
d57 1
a57 1
	       LispValue clause = get_clause (clauseinfo);
d60 1
a60 1
	       LispValue keys = LispNil;
d63 1
a63 1
		    keys = make_joinkey (outer(rightop),inner(leftop));
d66 1
a66 1
		    keys = make_joinkey (outer(leftop),inner(rightop));
d70 2
a71 1
		    xmergeinfo = make_mergeinfo (ordering(merge_ordering));
a81 5
/*
 * lambda function used to search the list 
 * mergeinfo_list for a mergeinfo node whose order field
 * equals 'ordering'
 */
a82 11
bool
lambda_fun (xmergeinfo,ordering)
     LispValue xmergeinfo,ordering;
{
     LispValue xmergeorder = mergeinfo_ordering(xmergeinfo);
     
     return (( mergeorder_p(ordering) &&
	       equal_merge_merge_ordering(ordering,xmergeorder))
	     || (!mergeorder_p(ordering) &&
		 equal_path_merge_ordering(ordering,xmergeorder)));
}
d96 1
a96 1
LispValue
d100 15
a114 4
     /* XXX  lisp find_if function */

     return (find_if (lambda_fun(mergeinfo_list,ordering)));  /* XXX fix me  */

@
