summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/utthesis
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/utthesis
Initial commit
Diffstat (limited to 'macros/latex/contrib/utthesis')
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/abstract.tex23
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/conclusion.tex49
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/eqlogexp.Q1-8.ps605
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/intro.tex82
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/model.tex831
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/p2v.tex139
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/paper.aux137
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/paper.bbl76
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/paper.blg0
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/paper.dvibin0 -> 97632 bytes
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/paper.log511
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/paper.ps6693
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/paper.tex251
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/preprint.ps6724
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/related.tex59
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/reprint.ps6693
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/results.tex473
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/runtime_Q1.ps519
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/runtime_Q2.ps507
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/runtime_Q3.ps561
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/runtime_Q4.ps549
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/runtime_Q5.ps375
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/runtime_Q6.ps401
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/runtime_Q7.ps396
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/runtime_Q8.ps384
-rw-r--r--macros/latex/contrib/utthesis/ICDE-11/stretch.sty10
-rw-r--r--macros/latex/contrib/utthesis/dissertation/diss.ps20653
-rw-r--r--macros/latex/contrib/utthesis/icde-11.ps6724
-rw-r--r--macros/latex/contrib/utthesis/tr94-16.ps7614
-rw-r--r--macros/latex/contrib/utthesis/utthesis.doc152
-rw-r--r--macros/latex/contrib/utthesis/utthesis.sty716
31 files changed, 62907 insertions, 0 deletions
diff --git a/macros/latex/contrib/utthesis/ICDE-11/abstract.tex b/macros/latex/contrib/utthesis/ICDE-11/abstract.tex
new file mode 100644
index 0000000000..c966ccb075
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/abstract.tex
@@ -0,0 +1,23 @@
+\firstpage
+\begin{abstract}
+{\itshape
+From our experience, current rule-based query optimizers do not provide
+a very intuitive and well-defined framework to define rules and
+actions. To remedy this situation, we propose an extensible and
+structured algebraic framework called Prairie for specifying rules.
+Prairie facilitates rule-writing by enabling a user to write rules and
+actions more quickly, correctly and in an easy-to-understand and
+easy-to-debug manner.
+
+Query optimizers consist of three major parts: a search space, a cost
+model and a search strategy. The approach we take is only to develop
+the algebra which defines the search space and the cost model and use
+the Volcano optimizer-generator as our search engine. Using Prairie as
+a front-end, we translate Prairie rules to Volcano to validate our
+claim that Prairie makes it easier to write rules.
+
+We describe our algebra and present experimental results which
+show that using a high-level framework like Prairie to design
+large-scale optimizers does not sacrifice efficiency.
+}
+\end{abstract}
diff --git a/macros/latex/contrib/utthesis/ICDE-11/conclusion.tex b/macros/latex/contrib/utthesis/ICDE-11/conclusion.tex
new file mode 100644
index 0000000000..fbfb02c0c5
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/conclusion.tex
@@ -0,0 +1,49 @@
+\section{Conclusion and future work}
+\label{sec:conclusion}
+
+Current rule-based query optimizers do not provide a very intuitive and
+conceptually streamlined framework to define rules and actions. Our
+experiences with the Volcano optimizer generator suggest that its model
+of rules and the expression of these rules is much more complicated and
+too low-level than it needs to be. As a consequence, rule sets in
+Volcano are fragile, hard to write, and debug. Similar problems may
+exist in other contemporary rule-based query optimizers.
+
+We believe that rule-based query optimizers will be standard tools
+of future database systems. The pragmatic difficulties of using
+existing rule-based optimizers led us to develop Prairie, an
+extensible and structured algebraic framework for specifying rules.
+Prairie is similar to existing optimizers in that it supports both
+transformation rules and implementation rules. However, Prairie
+makes several improvements:
+\begin{enumerate}
+\item it offers a conceptually more streamlined model for rule specification;
+\item rules are encapsulated, there are no ``hidden'' operators or
+ ``hidden'' algorithms;
+\item implementation hints (\eg enforcers) are deduced automatically;
+\item and it has efficient implementations.
+\end{enumerate}
+
+We have explained how the first three points are important for
+simplifying rule specifications and making rule sets less brittle for
+extensibility. A consequence is that Prairie rules are simpler and
+more robust than rules of existing optimizers (\eg Volcano). We
+addressed the fourth point by building a P2V pre-processor which uses
+sophisticated algorithms to compose and compact a Prairie rule set into
+a Volcano rule set. To demonstrate the scalability of our approach, we
+rewrote the TI Open OODB rule set as a Prairie rule set, generated its
+Volcano counterpart, and showed that the performance of the synthesized
+Volcano rule set closely matches the hand-crafted Volcano rule set.
+
+Our future work will concentrate on developing higher-level
+abstractions using Prairie, including automatically generating Prairie
+rule sets, and combining multiple Prairie rule sets to automatically
+generate efficient optimizers.
+
+\section*{Acknowledgments}
+\label{sec:acknowledgments}
+
+We wish to thank Texas Instruments, Inc.\ for making the Open OODB
+source code available to us. Comments by Jos\'e Blakeley, Anne Ngu,
+Vivek Singhal, Thomas Woo and the anonymous referees greatly improved
+the quality of the paper.
diff --git a/macros/latex/contrib/utthesis/ICDE-11/eqlogexp.Q1-8.ps b/macros/latex/contrib/utthesis/ICDE-11/eqlogexp.Q1-8.ps
new file mode 100644
index 0000000000..6c41dfdf1d
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/eqlogexp.Q1-8.ps
@@ -0,0 +1,605 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%BoundingBox: 18 18 552 482
+%%Creator: ACE/gr (xmgr) v2.10
+%%Title: /u/ddas/research/papers/eqlogexp.Q1-8.ps
+%%EndComments
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+72 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+91 scalefont
+ setfont
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+420 300 m
+gsave
+420 300 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 300 m
+gsave
+621 300 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 300 m
+gsave
+822 300 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 300 m
+gsave
+1023 300 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 300 m
+gsave
+1225 300 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 300 m
+gsave
+1426 300 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 300 m
+gsave
+1627 300 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 300 m
+gsave
+1828 300 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 300 m
+gsave
+2030 300 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 148 m
+gsave
+1225 148 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+440 376 l
+420 728 m
+440 728 l
+420 1081 m
+440 1081 l
+420 1433 m
+440 1433 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 728 m
+2010 728 l
+2030 1081 m
+2010 1081 l
+2030 1433 m
+2010 1433 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+366 376 m
+gsave
+366 376 translate
+0 rotate
+0 -30 m
+(100) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(0) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 728 m
+gsave
+366 728 translate
+0 rotate
+0 -30 m
+(102) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(2) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 1081 m
+gsave
+366 1081 translate
+0 rotate
+0 -30 m
+(104) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(4) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 1433 m
+gsave
+366 1433 translate
+0 rotate
+0 -30 m
+(106) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(6) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 1785 m
+gsave
+366 1785 translate
+0 rotate
+0 -30 m
+(108) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(8) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+187 1080 m
+gsave
+187 1080 translate
+90 rotate
+0 0 m
+(Equivalence classes) CS
+(Equivalence classes) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1953 m
+gsave
+1225 1953 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1855 m
+gsave
+1225 1855 translate
+0 rotate
+0 0 m
+(Number of Equivalence Classes) CS
+(Number of Equivalence Classes) show
+grestore
+newpath
+420 376 m
+621 429 l
+822 482 l
+1023 535 l
+1225 588 l
+1426 641 l
+1627 694 l
+1828 747 l
+2030 800 l
+stroke
+420 376 30 0 360 arc
+gsave fill grestore
+stroke
+621 429 30 0 360 arc
+gsave fill grestore
+stroke
+822 482 30 0 360 arc
+gsave fill grestore
+stroke
+1023 535 30 0 360 arc
+gsave fill grestore
+stroke
+1225 588 30 0 360 arc
+gsave fill grestore
+stroke
+1426 641 30 0 360 arc
+gsave fill grestore
+stroke
+1627 694 30 0 360 arc
+gsave fill grestore
+stroke
+1828 747 30 0 360 arc
+gsave fill grestore
+stroke
+2030 800 30 0 360 arc
+gsave fill grestore
+stroke
+420 376 m
+621 597 l
+822 734 l
+1023 871 l
+1225 1008 l
+1426 1145 l
+1627 1282 l
+1828 1419 l
+2030 1556 l
+stroke
+420 406 m
+390 376 l
+420 346 l
+450 376 l
+closepath
+gsave eofill grestore
+stroke
+621 627 m
+591 597 l
+621 567 l
+651 597 l
+closepath
+gsave eofill grestore
+stroke
+822 764 m
+792 734 l
+822 704 l
+852 734 l
+closepath
+gsave eofill grestore
+stroke
+1023 901 m
+993 871 l
+1023 841 l
+1053 871 l
+closepath
+gsave eofill grestore
+stroke
+1225 1038 m
+1195 1008 l
+1225 978 l
+1255 1008 l
+closepath
+gsave eofill grestore
+stroke
+1426 1175 m
+1396 1145 l
+1426 1115 l
+1456 1145 l
+closepath
+gsave eofill grestore
+stroke
+1627 1312 m
+1597 1282 l
+1627 1252 l
+1657 1282 l
+closepath
+gsave eofill grestore
+stroke
+1828 1449 m
+1798 1419 l
+1828 1389 l
+1858 1419 l
+closepath
+gsave eofill grestore
+stroke
+2030 1586 m
+2000 1556 l
+2030 1526 l
+2060 1556 l
+closepath
+gsave eofill grestore
+stroke
+420 376 m
+621 578 l
+822 805 l
+1023 1059 l
+stroke
+420 406 m
+390 346 l
+450 346 l
+closepath
+gsave eofill grestore
+stroke
+621 608 m
+591 548 l
+651 548 l
+closepath
+gsave eofill grestore
+stroke
+822 835 m
+792 775 l
+852 775 l
+closepath
+gsave eofill grestore
+stroke
+1023 1089 m
+993 1029 l
+1053 1029 l
+closepath
+gsave eofill grestore
+stroke
+420 513 m
+621 787 l
+822 1094 l
+1023 1428 l
+stroke
+390 543 m
+420 483 l
+450 543 l
+closepath
+gsave eofill grestore
+stroke
+591 817 m
+621 757 l
+651 817 l
+closepath
+gsave eofill grestore
+stroke
+792 1124 m
+822 1064 l
+852 1124 l
+closepath
+gsave eofill grestore
+stroke
+993 1458 m
+1023 1398 l
+1053 1458 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+72 scalefont
+ setfont
+1070 1369 m
+1070 1729 l
+1665 1729 l
+1665 1369 l
+1070 1369 l
+stroke
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1684 m
+1270 1684 l
+stroke
+1110 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1270 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1310 1684 m
+gsave
+1310 1684 translate
+0 rotate
+0 -24 m
+(Query 1, 2) show
+grestore
+newpath
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1594 m
+1270 1594 l
+stroke
+1110 1624 m
+1080 1594 l
+1110 1564 l
+1140 1594 l
+closepath
+gsave eofill grestore
+stroke
+1270 1624 m
+1240 1594 l
+1270 1564 l
+1300 1594 l
+closepath
+gsave eofill grestore
+stroke
+1310 1594 m
+gsave
+1310 1594 translate
+0 rotate
+0 -24 m
+(Query 3, 4) show
+grestore
+newpath
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1504 m
+1270 1504 l
+stroke
+1110 1534 m
+1080 1474 l
+1140 1474 l
+closepath
+gsave eofill grestore
+stroke
+1270 1534 m
+1240 1474 l
+1300 1474 l
+closepath
+gsave eofill grestore
+stroke
+1310 1504 m
+gsave
+1310 1504 translate
+0 rotate
+0 -24 m
+(Query 5, 6) show
+grestore
+newpath
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1414 m
+1270 1414 l
+stroke
+1080 1444 m
+1110 1384 l
+1140 1444 l
+closepath
+gsave eofill grestore
+stroke
+1240 1444 m
+1270 1384 l
+1300 1444 l
+closepath
+gsave eofill grestore
+stroke
+1310 1414 m
+gsave
+1310 1414 translate
+0 rotate
+0 -24 m
+(Query 7, 8) show
+grestore
+newpath
+showpage
+%%Trailer
diff --git a/macros/latex/contrib/utthesis/ICDE-11/intro.tex b/macros/latex/contrib/utthesis/ICDE-11/intro.tex
new file mode 100644
index 0000000000..b4ebebe580
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/intro.tex
@@ -0,0 +1,82 @@
+\section{Introduction}
+\label{sec:intro}
+
+Query optimization \cite{Grae93} is a fundamental part of database
+systems. It is the process of generating an efficient access plan for
+a database query. Informally, an access plan is an execution strategy
+for a query; it is the sequence of low-level database retrieval
+operations that, when executed, produce the database records that
+satisfy the query. There are three basic aspects that define and
+influence query optimization: the search space, the cost model, and the
+search strategy.
+
+The {\em search space} is the set of logically equivalent access plans
+that can be used to evaluate a query. All plans in a query's search
+space return the same result; however, some plans are more efficient
+than others. The {\em cost model} assigns a cost to each plan in the
+search space. The cost of a plan is an estimate of the resources used
+when the plan is executed; the lower the cost, the better the plan.
+The {\em search strategy} is a specification of which plans in the
+search space are to be examined.
+
+Traditionally, query optimizers have been built as monolithic
+subsystems of a DBMS. This simply reflects the fact that traditional
+database systems are themselves monolithic: the algorithms used for
+storing and retrieving data are hard-wired and are rather difficult to
+change. The need to have extensible database systems, and in turn
+extensible optimizers, has long been recognized in systems like Genesis
+\cite{Bato88a}, EXODUS \cite{Grae87b}, Starburst \cite{Haas88}, and
+Postgres \cite{Ston86b}. Rule-based query optimizers are among the
+major conceptual advances that have been proposed to deal with query
+optimizer extensibility \cite{Haas88,Frey87a,Grae87b,Grae90b}. The
+extensibility translates into the ability to incorporate new operators,
+algorithms, cost models, or search strategies without changing the
+optimization algorithm.
+
+In this paper, we describe an algebraic framework called \emph{Prairie}
+for specifying rules in a rule-based query optimizer. Prairie is
+similar to other rule specification languages like Starburst
+\cite{Haas88} and Volcano \cite{Grae90b}, and indeed, we have based our
+work on Volcano to capture most of the advantages of rule-based
+optimizers. However, Prairie attempts to provide some key features
+that, we have found, simplify the effort in writing rules:
+
+\begin{enumerate}
+ \item A framework in which users can define a query optimizer
+ concisely in terms of a well-defined set of operators and
+ algorithms. \emph{All} operators and algorithms are considered
+ first-class objects, \ie \emph{any} of them can occur in any
+ rule, and \emph{only} these operators and algorithms can appear
+ in rules. This scheme eliminates the need for special classes
+ of operators and algorithms, such as enforcers in Volcano and
+ glue in Starburst, that significantly complicate rule
+ specification.
+ \item A framework in which users can define a list of properties to
+ characterize the expressions generated in the optimization
+ process. Again, the goal here is to allow the user to treat
+ \emph{all} properties as having equal status. This is different
+ from Volcano where the user must classify properties as logical,
+ physical, or operator/algorithm arguments.
+ \item A framework in which users can specify mapping functions
+ between properties concomitantly with the corresponding rules.
+ This contrasts with existing approaches in which mappings
+ between properties are fragmented into multiple functions and at
+ logically different places than the corresponding rules.
+ Research into rule-based optimizers has revealed that
+ property-mapping functions are a major source of user effort, so
+ this is an important goal.
+ \item The format (Prairie) in which users can cleanly specify rules is
+ not necessarily the same format needed for generating efficient
+ optimizers. Thus, there is a need for a pre-processor (written
+ by us) that translates between these competing representations.
+\end{enumerate}
+
+Prairie strives for uniformity in dealing with issues that have been a
+source of most user effort and potential user errors. In the following
+sections, we present the Prairie framework. We explain how our P2V
+pre-processor maps Prairie rule specifications into Volcano rule
+specifications that can be processed efficiently. Experimental results
+to support this claim are given in Section~\ref{sec:results}, where we
+compare implementations of the Texas Instruments Open OODB query
+optimizer using both Prairie and Volcano. We conclude with a summary
+and related research.
diff --git a/macros/latex/contrib/utthesis/ICDE-11/model.tex b/macros/latex/contrib/utthesis/ICDE-11/model.tex
new file mode 100644
index 0000000000..3a3f916091
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/model.tex
@@ -0,0 +1,831 @@
+\section{Prairie: A language for rule specification}
+\label{sec:framework}
+
+The basic concepts and definitions that underlie the Prairie model are
+presented in this section. The goal is to lay a foundation for
+reasoning about query optimization algebraically; this is necessary for
+our subsequent discussion about translating Prairie specifications to
+those of Volcano.
+
+\subsection {Notation and assumptions}
+\label{sec:notation}
+
+\paragraph{Stored Files and Streams.}
+A file is \emph{stored} if its tuples reside on disk. In the case of
+relational databases, stored files are sometimes called \emph{base
+relations}; we will denote them by $R$ or $R_i$. In object-oriented
+schemas, stored files are \emph{classes}; we will denote them by
+$\textit{C}$ or $\textit{C}_i$. Henceforth, whenever we refer to a
+stored file, we mean a relation or a class; when the distinction is
+unimportant, we will use $F$ or $F_i$. A \emph{stream} is a sequence
+of tuples and is the result of a computation on one or more streams or
+stored files; tuples of streams are returned one at a time, typically
+on demand. Streams can be \emph{named}, denoted by $S_i$, or
+\emph{unnamed}.
+
+\paragraph{Database Operations.}
+An \emph{operation} is a computation on one or more streams or stored
+files. There are two types of database operations in Prairie:
+abstract (or implementation-unspecified) operators and concrete
+algorithms. Each is detailed below.
+\begin{description} % To achieve extra indentation.
+\begin{description}
+\item[Operators.]
+Abstract (or conceptual) \emph{operators} specify computations on
+streams or stored files; they are denoted by all capital
+letters (\eg JOIN). Operators have two types of parameters:
+essential and additional. \emph{Essential parameters} are the stream
+or file inputs to an operator; these are the primary inputs to be
+processed by an operator. \emph{Additional parameters} are
+``fine-grain'' qualifications of an operator; their purpose is to
+describe an operator in more detail than essential parameters.
+
+\item[Algorithms.]
+\emph{Algorithms} are concrete implementations of conceptual operators;
+they will be represented in lower case with the first letter
+capitalized (\eg Nested\_loops). Algorithms have at least the same
+essential and additional parameters as the conceptual operators that
+they implement.\footnote{Algorithms may have \emph{tuning parameters}
+which are not parameters of the operators they implement.}
+Furthermore, there can be, and usually are, several algorithms for a
+particular operator.
+\end{description}
+\end{description}
+Table~\ref{tab:operators} lists some operators and algorithms implementing
+them together with their additional parameters.
+
+\begin{centeredtable*}
+\begin{minipage}[b]{9.9cm}
+\nodesizes
+\newlength{\first}
+\settowidth{\first}{JOIN($S_1$, $S_2$)}
+\newlength{\second}
+\settowidth{\second}{Join streams $S_1$, $S_2$}
+\newlength{\third}
+\settowidth{\third}{projected\_attributes}
+\newlength{\fourth}
+\settowidth{\fourth}{Nested\_loops($S_1$, $S_2$)}
+\newlength{\linelength}
+\setlength{\linelength}{\fourth+\tabcolsep*2}
+\begin{tabular}{|l|l|l|p{\fourth}|} \thickhline
+\textbf{Operator}
+ & \textbf{Description}
+ & \textbf{Additional Parameters}
+ & \textbf{Algorithm} \\ \thickhline
+\multirow{2}{\first}{JOIN($S_1$, $S_2$)}
+ & \multirow{2}{\second}{Join streams $S_1$, $S_2$} & tuple\_order
+ & Nested\_loops($S_1$, $S_2$) \\ \cline{4-4}
+ & & join\_predicate & Merge\_join($S_1$, $S_2$) \\ \hline
+\multirow{3}{\first}{RET($F$)}
+ & \multirow{3}{\second}{Retrieve file $F$}
+ & tuple\_order
+ & \parbox[c][\baselineskip][b]{\fourth}{File\_scan($F$)} \\
+ & & selection\_predicate
+ & \parbox[c]{\linelength}
+ {\hspace*{-\tabcolsep}\rule{\linelength}{\arrayrulewidth}} \\
+ & & projected\_attributes
+ & \parbox[c][\baselineskip][t]{\fourth}{Index\_scan($F$)} \\ \hline
+\multirow{2}{\first}{SORT($S_1$)}
+ & \multirow{2}{\second}{Sort stream $S_1$}
+ & \multirow{2}{\third}{tuple\_order}
+ & Merge\_sort($S_1$) \\ \cline{4-4}
+ & & & Null($S_1$) \\ \thickhline
+\end{tabular}
+\caption{Operators and algorithms in a centralized query optimizer and
+ their additional parameters}
+\label{tab:operators}
+\end{minipage}
+\hfill
+\begin{minipage}[b]{6.5cm}
+\nodesizes
+\settowidth{\first}{projected\_attributes}
+\begin{tabular}{|l|l|} \thickhline
+\textbf{Property}
+ & \textbf{Description} \\ \thickhline
+join\_predicate
+ & join predicate for JOIN operator \\ \hline
+selection\_predicate
+ & selection predicate for RET operator \\ \hline
+\multirow{2}{\first}{tuple\_order}
+ & tuple order of resulting stream, \\
+ & DONT\_CARE if none \\ \hline
+num\_records
+ & number of tuples of resulting stream \\ \hline
+tuple\_size
+ & size of individual tuple in stream \\ \hline
+projected\_attributes
+ & projected attributes for RET operator \\ \hline
+attributes
+ & list of attributes \\ \hline
+cost
+ & estimated cost of algorithm \\ \thickhline
+\end{tabular}
+\caption{Properties of nodes in an operator tree}
+\label{tab:annotations}
+\end{minipage}
+\end{centeredtable*}
+
+\paragraph{Operator Trees.}
+An \emph{operator tree} is a rooted tree whose non-leaf, or
+\emph{interior}, nodes are database operations (operators or
+algorithms) and whose leaf nodes are stored files. The children of an
+interior node in an operator tree are the essential parameters (\ie the
+stream or file parameters) of the node. Additional parameters are
+implicitly attached to each node. Algebraically, operator trees are
+compositions of database operations; thus, we will also call operator
+trees \emph{expressions}; both terms will be used interchangeably.
+
+\begin{example}
+A simple expression and its operator tree representation are shown
+in Figure~\ref{fig:optreeexample}. Relations $R_1$ and $R_2$ are first
+RETrieved, then JOINed, and finally SORTed resulting in a stream
+sorted on a specific attribute. The figure shows only the essential
+parameters of the various operators, not the additional parameters.
+\end{example}
+
+\begin{comment}
+The figures which follow.
+
+ SORT
+ |
+ |
+ JOIN
+ /\
+ / \
+ RET RET
+ | |
+ | |
+ R1 R2
+
+ Merge_sort
+ |
+ |
+ Nested_loops
+ / \
+ / \
+ File_scan File_scan
+ | |
+ | |
+ R1 R2
+
+\end{comment}
+
+\begin{centeredfigure}
+\setlength{\unitlength}{0.6in}
+%
+\myshadowbox
+{
+\subfigure[An expression and its corresponding operator tree]
+{
+\begin{centeredinhalfminipage}
+\psset{unit=4mm}
+\psset{nodesep=1pt}
+\tiny
+\begin{pspicture}(0,0)(2,4)
+\rput(1,4){SORT (JOIN (RET ($R_1$), RET ($R_2$)))}
+\rput(1,3){\rnode{sort}{SORT}}
+\rput(1,2){\rnode{join}{JOIN}}
+\ncline{-}{sort}{join}
+\rput(0,1){\rnode{retr1}{RET}}
+\rput(2,1){\rnode{retr2}{RET}}
+\ncline{-}{join}{retr1}
+\ncline{-}{join}{retr2}
+\rput(0,0){\rnode{r1}{$R_1$}}
+\rput(2,0){\rnode{r2}{$R_2$}}
+\ncline{-}{retr1}{r1}
+\ncline{-}{retr2}{r2}
+\end{pspicture}
+\end{centeredinhalfminipage}
+\label{fig:optreeexample}
+}
+%
+\vrule
+%
+\subfigure[Possible access plan for operator tree in (a)]
+{
+\begin{centeredinhalfminipage}
+\psset{unit=4mm}
+\psset{nodesep=1pt}
+\tiny
+\begin{pspicture}(0,0)(2,3)
+\rput(1,3){\rnode{mergesort}{Merge\_sort}}
+\rput(1,2){\rnode{nestedloops}{Nested\_loops}}
+\ncline{-}{mergesort}{nestedloops}
+\rput(0,1){\rnode{filescanr1}{File\_scan}}
+\rput(2,1){\rnode{filescanr2}{File\_scan}}
+\ncline{-}{nestedloops}{filescanr1}
+\ncline{-}{nestedloops}{filescanr2}
+\rput(0,0){\rnode{r1}{$R_1$}}
+\rput(2,0){\rnode{r2}{$R_2$}}
+\ncline{-}{filescanr1}{r1}
+\ncline{-}{filescanr2}{r2}
+\end{pspicture}
+\end{centeredinhalfminipage}
+\label{fig:accplanexample}
+}
+}
+%
+\caption{Example of an operator tree and access plan}
+\label{fig:expexample}
+\end{centeredfigure}
+
+\paragraph{Descriptors.}
+A \emph{property} of a node is a (user-defined) variable that contains
+information used by an optimizer. An \emph{annotation} is a $\langle
+\emph{property, value} \rangle$ pair that is assigned to a node. A
+\emph{descriptor} is a list of annotations that describes a node of an
+operator tree; every node has its own descriptor. As an example,
+Table~\ref{tab:annotations} lists some typical properties that might be
+used in a descriptor. Note that descriptors for stream and stored
+files may have different properties. The following notations will be
+useful in our subsequent discussions. If $S_i$ is a stream, then
+$\mathbf{D_i}$ is its descriptor. Annotations of $S_i$ are accessed by
+a structure member relationship, \eg
+$\mathbf{D_i}.\text{num\_records}$. Also, let $E$ be an expression and
+let $\mathbf{D}$ be its descriptor. We will write this as
+$E:\mathbf{D}$.
+
+\begin{example}
+The expression,
+\begin{eqnarray*}
+{\scriptstyle \text{SORT}(\text{JOIN}(\text{RET}(R_1):\mathbf{D_3},
+ \text{RET}(R_2):\mathbf{D_4}):\mathbf{D_5}):\mathbf{D_6}} & &
+\end{eqnarray*}
+corresponds to the operator tree in Figure~\ref{fig:optreeexample}, and
+shows the descriptors of the various nodes.
+\end{example}
+
+A notational simplification can be made here. Additional parameters
+of operators can be treated the same way as other properties of a node;
+essential parameters, however, are \emph{expressions}. Thus, the term
+descriptor in the remainder of this paper will refer to a set of properties,
+including additional parameters, as shown in Table~\ref{tab:annotations}.
+
+Currently, descriptor properties are defined entirely by the user;
+however, we envision providing a hierarchy of pre-defined descriptor
+types to aid this process.
+
+\paragraph{Access Plans.}
+An \emph{access plan} is an operator tree in which all interior nodes
+are algorithms.
+
+\begin{example}
+An access plan for the operator tree in Figure~\ref{fig:optreeexample}
+is shown in Figure~\ref{fig:accplanexample}.
+\end{example}
+
+\subsection{Prairie optimization paradigm}
+\label{sec:topdown}
+
+Prairie admits two rather different means of optimization: top-down and
+bottom-up. A top-down query optimizer optimizes the parents of a node
+prior to optimizing the node itself. A bottom-up optimizer optimizes
+the children of a node prior to optimizing the node. The earliest
+optimizers (System R \cite{Seli79} and R$^*$ \cite{Dani82}) employed
+the bottom-up approach.
+
+Our research concentrates on a top-down optimization of operator
+trees. We have chosen this approach because we intend to translate
+Prairie rules into the format required by the Volcano query optimizer
+generator \cite{Grae90b} which is based on a top-down strategy.
+Given an appropriate search engine, Prairie can potentially also be
+used with a bottom-up optimization strategy; however, we will not
+discuss this approach in this paper.
+
+In query optimization, there are certain annotations (such as
+additional parameters) that are known before any optimization is
+begun. These annotations can be computed at the time that the operator
+tree is initialized, and will not change with application of rules.
+Our following discussions assume operator trees are initialized.
+
+There are two types of algebraic transformations (or \emph{rewrite
+rules}) in Prairie: T-rules (``transformation rules'') and I-rules
+(``implementation rules''). Each rule transforms an expression into
+another based on additional conditions; the transformation also results
+in a mapping of descriptors between expressions. We define T-rules and
+I-rules precisely in the following sections and illustrate them with
+examples. Our examples are chosen from rules that would be used in a
+centralized relational query optimizer; the operators, algorithms, and
+properties are subsets of those in Tables~\ref{tab:operators} and
+\ref{tab:annotations}.
+
+\subsection{Transformation rules}
+\label{sec:trules}
+
+\begin{centeredfigure}
+\def\subfigtopskip{0pt}
+\myshadowbox{
+\begin{tabular}{c}
+\subfigure[General form of a T-rule]
+{
+\setlength{\topsep}{0pt}
+\scriptsize
+\begin{minipage}[b]{0.86\linewidth}
+\begin{trule}
+E(x_1, \ldots, x_n):\mathbf{D_1} \Longrightarrow
+ E'(x_1, \ldots, x_n):\mathbf{D_2} \label{eq:generaltrule}
+\end{trule}
+\begin{trulepretest}
+\> pre-test statements
+\end{trulepretest}
+test
+\begin{truleposttest}
+\> post-test statements
+\end{truleposttest}
+\end{minipage}
+\label{fig:generaltrule}
+} \\ \hline
+%%%
+\subfigure[Join associativity]
+{
+\setlength{\topsep}{0pt}
+\scriptsize
+\begin{minipage}[b]{0.86\linewidth}
+\vspace*{4pt}
+\begin{trule}
+\text{JOIN}(\text{JOIN}(S_1, S_2):\mathbf{D_4}, S_3):\mathbf{D_5}
+\label{eq:associativity}
+\end{trule}
+%%% TODO: Remove extra space above eqnarray.
+\begin{eqnarray*}
+\rulespace \Longrightarrow
+ \text{JOIN}(S_1, \text{JOIN}(S_2, S_3):\mathbf{D_6}):\mathbf{D_7}
+% \label{eq:associativity}
+\end{eqnarray*}
+\begin{trulepretest}
+\> $\mathbf{D_6}.\text{attributes} =
+ \text{union}\ (\mathbf{D_2}.\text{attributes},
+ \mathbf{D_3}.\text{attributes})\ ;$
+\end{trulepretest}
+$\text{is\_associative}\ (\mathbf{D_6}.\text{join\_predicate},
+ \mathbf{D_6}.\text{attributes},
+ \mathbf{D_5}.\text{join\_predicate})$
+\begin{truleposttest}
+\> $\mathbf{D_7} = \mathbf{D_5}\ ;$ \\
+\> $\mathbf{D_7}.\text{join\_predicate} =
+ \mathbf{D_4}.\text{join\_predicate}\ ;$ \\
+\> $\mathbf{D_6}.\text{tuple\_size} =
+ \mathbf{D_2}.\text{tuple\_size}
+ + \mathbf{D_3}.\text{tuple\_size}\ ;$ \\
+\> $\mathbf{D_6}.\text{num\_records} =
+ \text{cardinality}\ (\mathbf{D_2}, \mathbf{D_3})\ ;$
+\end{truleposttest}
+\end{minipage}
+\label{fig:associativity}
+}
+\end{tabular}
+}
+\caption{T-rule}
+\label{fig:trules}
+\end{centeredfigure}
+
+Transformation rules, or T-rules for short, define equivalences among
+pairs of expressions; they define mappings from one operator tree to
+another. Let $E$ and $E'$ be expressions that involve only abstract
+operators. Equation~(\ref{eq:generaltrule}) (shown in
+Figure~\ref{fig:generaltrule}) shows the general form of a T-rule. The
+actions of a T-rule define the equivalences between the descriptors of
+nodes of the original operator tree $E$ with the nodes of the output
+tree $E'$; these actions consist of a series of (C or C++)
+assignment\footnote{The actions can be non-assignment statements (like
+function calls), but in this case, the P2V pre-processor (described in
+Section~\ref{sec:ptov}) needs some hints about the properties that
+are changed by the statement in order to correctly categorize each
+property. For simplicity, in this paper, we assume all actions consist
+of assignment statements.} statements. The left-hand sides of these
+statements refer to descriptors of expressions on the right-hand side
+of the T-rule; the right-hand sides of the statements can refer to any
+descriptor in the T-rule. Function (called \emph{helper} functions)
+calls can also appear on the right side of the assignment statements.
+Thus, descriptors on the \emph{left-hand side} of a T-rule are
+\emph{never} changed in the rule's actions. A \emph{test} is needed to
+determine if the transformations of the T-rule are in fact applicable.
+
+Purely as an optimization, it is usually the case that not all
+statements in a T-rule's actions need to be executed prior to a
+T-rule's test. For this reason, the actions of a T-rule are split into
+two groups; those that need to be executed prior to the T-rule's test,
+and those that can be executed after a successful test. These groups
+of statements comprise, respectively, the \emph{pre-test} and
+\emph{post-test} statements of the T-rule.\footnote{We suspect it is
+possible to use data-flow analysis to partition the assignment
+statements automatically, but for now, we let the rule-writer do the
+partitioning.}
+
+\begin{comment}
+We now define the actions and tests of a T-rule more precisely. Let
+$O_i$ be an abstract operator of $E'$, and let $\mathbf{O_i}$ be its
+descriptor. Similarly, let $I_i$ be an abstract operator of $E$ and
+let $\mathbf{I_i}$ be its descriptor. ($I_i$ is an operator that is
+input to the rule and $O_i$ is an operator that is output by the
+rule). Let $M_i$ denote the $i$th descriptor property. Thus,
+$\mathbf{O_i}.M_j$ is the value of the $j$th property of descriptor
+$\mathbf{O_i}$. We have found that actions of a T-rule are invariably
+assignment statements, since actions compute assignments to descriptor
+properties. Rather than admitting all possible computations, we will
+present our model in terms of assignment statements.\footnote{ The
+actions can be non-assignment statements (like function calls), but in
+this case, the P2V pre-processor (described in
+Section~\ref{sec:results}) needs some hints about the properties that
+are changed by the statement in order to correctly categorize each
+property. For simplicity, in this paper, we assume all actions consist
+of assignment statements. } The left-hand side of an assignment refers
+to an output descriptor ($\mathbf{O_i}$) or a member of an output
+descriptor ($\mathbf{O_i}.M_j$). The right-hand side is an expression
+or function that only references input descriptors and/or their
+members. (We call such functions \emph{helper} functions; they are
+defined externally to a rule). Here are a few examples:
+\[
+\begin{array}{rlll}
+\mathbf{O_i} & = & \mathbf{I_k}\ ; &
+ \text{$//$ copy descriptor $\mathbf{I_k}$ to $\mathbf{O_i}$} \nonumber \\
+\mathbf{O_i}.M_j & = & \mathbf{I_k}.M_j + 4\ ; &
+ \text{$//$ expression defining $\mathbf{O_i}.M_j$} \nonumber \\
+\mathbf{O_3}.M_5 & = & \text{helper}\ (\mathbf{I_1}.M_5, \mathbf{I_2}.M_5)\ ; &
+ \text{$//$ helper function that computes $\mathbf{O_3}.M_5$} \nonumber \\
+& & &
+ \text{$//$ from inputs $\mathbf{I_1}.M_5$ and $\mathbf{I_2}.M_5$.} \nonumber
+\end{array}
+\]
+
+The test for a T-rule's applicability is a boolean expression and
+normally involves checks on the values of output descriptors (\eg
+$\mathbf{O_3}.M_5 > 6$); occasionally, helper functions may be needed.
+
+Again, it is important to remember that the pre-test actions are
+carried out prior to the test; the post-test actions are performed only
+if a T-rule's test evaluates to TRUE, and all post-test actions are
+performed immediately, with no intermediate optimization of any
+descendant nodes of the root of $E$.
+
+Note that there are no actions that are carried out \emph{after} the
+essential parameters of the root of $E$ are optimized. This is because
+a T-rule only logically transforms a conceptual tree into another
+conceptual tree.
+\end{comment}
+
+\begin{example}
+\label{ex:joinassociativity}
+The associativity of JOINs is expressed by T-rule
+(\ref{eq:associativity}) in Figure~\ref{fig:associativity}.
+\end{example}
+
+\begin{comment}
+
+ b2=c1 JOIN JOIN a1=b1
+ /\ /\
+ / \ / \
+ a1=b1 JOIN RET RET JOIN b2=c1
+ /\ | ====> | /\
+ / \ R3 R1 / \
+ RET RET RET RET
+ | | | |
+ R1 R2 R2 R3
+
+ a2=c1 JOIN JOIN a1=b1
+ /\ /\
+ / \ / \
+ a1=b1 JOIN RET RET JOIN <empty>
+ /\ | ==/==> | /\
+ / \ R3 R1 / \
+ RET RET RET RET
+ | | | |
+ R1 R2 R2 R3
+
+\end{comment}
+
+\newsavebox{\lefttreeone}
+\newsavebox{\righttreeone}
+\newsavebox{\lefttreetwo}
+\newsavebox{\righttreetwo}
+\newsavebox{\rewritesto}
+\newsavebox{\doesnotrewriteto}
+
+\begin{lrbox}{\lefttreeone}
+\begin{minipage}[t]{3.0cm}
+\psset{unit=\edgesizes}
+\psset{nodesep=3pt}
+\nodesizes
+\begin{center}
+\begin{pspicture}(-0.5,0)(3,3)
+\rput(2,3){\rnode{joinr1r2r3}{JOIN}}
+\rput(0.5,3){$b_2 = c_1$}
+\rput(1,2){\rnode{joinr1r2}{JOIN}}
+\rput(-0.5,2){$a_1 = b_1$}
+\rput(0,1){\rnode{retr1}{RET}}
+\rput(2,1){\rnode{retr2}{RET}}
+\rput(3,2){\rnode{retr3}{RET}}
+\rput(0,0){\rnode{r1}{$R_1$}}
+\rput(2,0){\rnode{r2}{$R_2$}}
+\rput(3,1){\rnode{r3}{$R_3$}}
+\ncline{-}{joinr1r2}{retr1}
+\ncline{-}{joinr1r2}{retr2}
+\ncline{-}{joinr1r2r3}{joinr1r2}
+\ncline{-}{joinr1r2r3}{retr3}
+\ncline{-}{retr1}{r1}
+\ncline{-}{retr2}{r2}
+\ncline{-}{retr3}{r3}
+\end{pspicture}
+\end{center}
+\end{minipage}
+\end{lrbox}
+
+\begin{lrbox}{\rewritesto}
+\begin{minipage}[t]{0.6cm}
+\psset{unit=\edgesizes}
+\psset{nodesep=3pt}
+\nodesizes
+\begin{center}
+\begin{pspicture}(0,0)(1,3)
+\rput(0.5,1.5){$\Longrightarrow$}
+\end{pspicture}
+\end{center}
+\end{minipage}
+\end{lrbox}
+
+\begin{lrbox}{\righttreeone}
+\begin{minipage}[t]{3.0cm}
+\psset{unit=\edgesizes}
+\psset{nodesep=3pt}
+\nodesizes
+\begin{center}
+\begin{pspicture}(0,0)(3,3)
+\rput(1,3){\rnode{joinr1r2r3}{JOIN}}
+\rput(2.5,3){$a_1 = b_1$}
+\rput(2,2){\rnode{joinr2r3}{JOIN}}
+\rput(3.5,2){$b_2 = c_1$}
+\rput(0,2){\rnode{retr1}{RET}}
+\rput(1,1){\rnode{retr2}{RET}}
+\rput(3,1){\rnode{retr3}{RET}}
+\rput(0,1){\rnode{r1}{$R_1$}}
+\rput(1,0){\rnode{r2}{$R_2$}}
+\rput(3,0){\rnode{r3}{$R_3$}}
+\ncline{-}{joinr1r2r3}{retr1}
+\ncline{-}{joinr1r2r3}{joinr2r3}
+\ncline{-}{joinr2r3}{retr2}
+\ncline{-}{joinr2r3}{retr3}
+\ncline{-}{retr1}{r1}
+\ncline{-}{retr2}{r2}
+\ncline{-}{retr3}{r3}
+\end{pspicture}
+\end{center}
+\end{minipage}
+\end{lrbox}
+
+\begin{lrbox}{\lefttreetwo}
+\begin{minipage}[t]{3.0cm}
+\psset{unit=\edgesizes}
+\psset{nodesep=3pt}
+\nodesizes
+\begin{center}
+\begin{pspicture}(-0.5,0)(3,3)
+\rput(2,3){\rnode{joinr1r2r3}{JOIN}}
+\rput(0.5,3){$a_2 = c_1$}
+\rput(1,2){\rnode{joinr1r2}{JOIN}}
+\rput(-0.5,2){$a_1 = b_1$}
+\rput(0,1){\rnode{retr1}{RET}}
+\rput(2,1){\rnode{retr2}{RET}}
+\rput(3,2){\rnode{retr3}{RET}}
+\rput(0,0){\rnode{r1}{$R_1$}}
+\rput(2,0){\rnode{r2}{$R_2$}}
+\rput(3,1){\rnode{r3}{$R_3$}}
+\ncline{-}{joinr1r2}{retr1}
+\ncline{-}{joinr1r2}{retr2}
+\ncline{-}{joinr1r2r3}{joinr1r2}
+\ncline{-}{joinr1r2r3}{retr3}
+\ncline{-}{retr1}{r1}
+\ncline{-}{retr2}{r2}
+\ncline{-}{retr3}{r3}
+\end{pspicture}
+\end{center}
+\end{minipage}
+\end{lrbox}
+
+\begin{lrbox}{\doesnotrewriteto}
+\begin{minipage}[t]{0.6cm}
+\psset{unit=\edgesizes}
+\psset{nodesep=3pt}
+\nodesizes
+\begin{center}
+\begin{pspicture}(0,0)(1,3)
+\rput(0.5,1.5){$\Longrightarrow$}
+\rput(0.5,1.5){$/$}
+\end{pspicture}
+\end{center}
+\end{minipage}
+\end{lrbox}
+
+\begin{lrbox}{\righttreetwo}
+\begin{minipage}[t]{3.0cm}
+\psset{unit=\edgesizes}
+\psset{nodesep=3pt}
+\nodesizes
+\begin{center}
+\begin{pspicture}(0,0)(3,3)
+\rput(1,3){\rnode{joinr1r2r3}{JOIN}}
+\rput(2,2){\rnode{joinr2r3}{JOIN}}
+\rput(0,2){\rnode{retr1}{RET}}
+\rput(1,1){\rnode{retr2}{RET}}
+\rput(3,1){\rnode{retr3}{RET}}
+\rput(0,1){\rnode{r1}{$R_1$}}
+\rput(1,0){\rnode{r2}{$R_2$}}
+\rput(3,0){\rnode{r3}{$R_3$}}
+\ncline{-}{joinr1r2r3}{retr1}
+\ncline{-}{joinr1r2r3}{joinr2r3}
+\ncline{-}{joinr2r3}{retr2}
+\ncline{-}{joinr2r3}{retr3}
+\ncline{-}{retr1}{r1}
+\ncline{-}{retr2}{r2}
+\ncline{-}{retr3}{r3}
+\end{pspicture}
+\end{center}
+\end{minipage}
+\end{lrbox}
+
+\subsection{Implementation rules}
+\label{sec:irules}
+
+Implementation rules, or I-rules for short, define equivalences between
+expressions and their implementing algorithms. Let $E$ be an
+expression and $A$ be an algorithm that implements $E$. The general
+form of an I-rule is given by Equation~(\ref{eq:generalirule}) (shown
+in Figure~\ref{fig:generalirule}).
+
+\begin{centeredfigure}
+\def\subfigtopskip{0pt}
+\myshadowbox{
+\begin{tabular}{c}
+\subfigure[General form of an I-rule]
+{
+\setlength{\topsep}{0pt}
+\scriptsize
+\begin{minipage}[b]{0.86\linewidth}
+\begin{irule}
+E(x_1, \ldots, x_n):\mathbf{D_1} \Longrightarrow
+ A(x_1, \ldots, x_n):\mathbf{D_2} \label{eq:generalirule}
+\end{irule}
+test
+\begin{irulepreopt}
+\> pre-opt statements
+\end{irulepreopt}
+\begin{irulepostopt}
+\> post-opt statements
+\end{irulepostopt}
+\end{minipage}
+\label{fig:generalirule}
+} \\ \hline
+%%%
+\subfigure[Merge-sort sort algorithm]
+{
+\setlength{\topsep}{0pt}
+\scriptsize
+\begin{minipage}[b]{0.86\linewidth}
+\vspace*{4pt}
+\begin{irule}
+\text{SORT}(S_1):\mathbf{D_2} \Longrightarrow
+ \text{Merge\_sort}(S_1):\mathbf{D_3} \label{eq:msort}
+\end{irule}
+$(\mathbf{D_2}.\text{tuple\_order}\ !\negthinspace= \text{DONT\_CARE})$
+\begin{irulepreopt}
+\> $\mathbf{D_3} = \mathbf{D_2}\ ;$
+\end{irulepreopt}
+\begin{irulepostopt}
+\> $\mathbf{D_3}.\text{cost} = \mathbf{D_1}.\text{cost}$ \\
+\> \hspace{1.2cm} $+ (\mathbf{D_3}.\text{num\_records}) *
+ \log(\mathbf{D_3}.\text{num\_records})\ ;$
+\end{irulepostopt}
+\end{minipage}
+\label{fig:msort}
+}
+\end{tabular}
+}
+\caption{I-rule}
+\label{fig:irules}
+\end{centeredfigure}
+
+The actions associated with an I-rule are defined in three parts.
+The first part, or \emph{test}, is a boolean expression whose
+value determines whether or not the rule can be applied.
+
+The second part, or \emph{pre-opt statements}, is a set of descriptor
+assignment statements that are executed only if the test is true and
+\emph{before} any of the inputs $x_i$ of $E$ are optimized. Additional
+parameters of nodes are usually assigned in the pre-opt section. This
+is necessary before any of the nodes on the right side can be
+optimized.
+
+The third part, or \emph{post-opt statements}, is a set of descriptor
+assignment statements that are executed \emph{after} all $x_i$ are
+optimized. Normally, the post-opt statements compute cost properties
+that can only be determined once the inputs to the algorithm are
+completely optimized and their costs known. This \emph{does not},
+however, imply a bottom-up optimization strategy. It simply means that
+although I-rules are applied to parents before their children are
+optimized, the \emph{cost} (and other properties in the post-opt
+section) of the parent cannot be computed until the children have been
+optimized.
+
+\begin{example}
+\label{ex:mergesort}
+Equation~(\ref{eq:msort}) (in Figure~\ref{fig:msort}) shows the I-rule
+that implements the SORT operator by Merge\_sort.
+\end{example}
+
+\subsection{Null algorithm}
+\label{sec:null}
+Recall that, in Section~\ref{sec:intro}, we mentioned that Prairie
+allows users to treat all operators and algorithms as first-class
+objects, \ie all operators and algorithms are explicit, in contrast to
+enforcers in Volcano or glue in Starburst. This requires that Prairie
+provide a mechanism where users can also ``delete'' one or more of the
+explicit operators from expressions. This is done by having a special
+class of I-rules that have the form given by
+Equation~(\ref{eq:generalnullalg}) in Figure~\ref{fig:generalnullalg}.
+The left side of the rule is a single abstract operator $O$ with one
+stream input $S_1$. The right side of the rule is an algorithm called
+``Null'' with the same stream input but with a different descriptor.
+As the name suggests, the Null algorithm is supposed to pass its input
+unchanged to algorithms above it in an operator tree. This is
+accomplished in the I-rule as follows.
+
+The test for this I-rule is always TRUE, \ie any node in an operator
+tree with $O$ as its operator can be implemented by the Null
+algorithm. The actions associated with this rule have a specific
+pattern. The pre-opt section consists of three
+statements. The first statement copies the descriptor of the operator
+$O$ to the algorithm Null. The second statement sets the descriptor of
+the stream $S_1$ on the right side to the descriptor of the stream
+$S_1$ on the left side. Why is it necessary to do this? The key lies
+in the third statement. This statement copies the property
+``property'' of the operator $O$ node on the left side to the
+``property'' of the input stream $S_1$ on the right side. Since
+left-hand side descriptors cannot be changed in an I-rule, a new
+descriptor $\mathbf{D_3}$ is necessary for $S_1$ to convey the property
+propagation information.
+
+The post-opt section in the I-rule has only a cost-assignment
+statement; this simply sets the cost of the Null node to the cost of
+its optimized input stream.
+
+The Null algorithm, therefore, serves to effectively transform a single
+operator to a no-op.
+
+\begin{example}
+Equation~(\ref{eq:nullsort}) (in Figure~\ref{fig:nullsort}) shows the
+I-rule that rewrites the SORT operator to use a Null algorithm.
+\end{example}
+
+\begin{centeredfigure}
+\def\subfigtopskip{0pt}
+\myshadowbox{
+\begin{tabular}{c}
+\subfigure[General form of a ``Null'' I-rule]
+{
+\setlength{\topsep}{0pt}
+\scriptsize
+\begin{minipage}[b]{0.86\linewidth}
+\begin{irule}
+O(S_1):\mathbf{D_2} \Longrightarrow
+ \text{Null}(S_1:\mathbf{D_3}):\mathbf{D_4} \label{eq:generalnullalg}
+\end{irule}
+TRUE
+\begin{irulepreopt}
+\> $\mathbf{D_4} = \mathbf{D_2}\ ;$ \\
+\> $\mathbf{D_3} = \mathbf{D_1}\ ;$ \\
+\> $\mathbf{D_3}.\text{property} = \mathbf{D_2}.\text{property}\ ;$
+\end{irulepreopt}
+\begin{irulepostopt}
+\> $\mathbf{D_4}.\text{cost} = \mathbf{D_3}.\text{cost}\ ;$
+\end{irulepostopt}
+\end{minipage}
+\label{fig:generalnullalg}
+}
+\\ \hline
+%%%
+\subfigure[Null sort algorithm]
+{
+\setlength{\topsep}{0pt}
+\scriptsize
+\begin{minipage}[b]{0.86\linewidth}
+\vspace*{4pt}
+\begin{irule}
+\text{SORT}(S_1):\mathbf{D_2} \rulespace \Longrightarrow
+ \text{Null}(S_1:\mathbf{D_3}):\mathbf{D_4} \label{eq:nullsort}
+\end{irule}
+TRUE
+\begin{irulepreopt}
+\> $\mathbf{D_4} = \mathbf{D_2}\ ;$ \\
+\> $\mathbf{D_3} = \mathbf{D_1}\ ;$ \\
+\> $\mathbf{D_3}.\text{tuple\_order} = \mathbf{D_2}.\text{tuple\_order}\ ;$
+\end{irulepreopt}
+\begin{irulepostopt}
+\> $\mathbf{D_4}.\text{cost} = \mathbf{D_3}.\text{cost}\ ;$
+\end{irulepostopt}
+\end{minipage}
+\label{fig:nullsort}
+}
+\end{tabular}
+}
+\caption{The ``Null'' algorithm concept}
+\label{fig:null}
+\end{centeredfigure}
diff --git a/macros/latex/contrib/utthesis/ICDE-11/p2v.tex b/macros/latex/contrib/utthesis/ICDE-11/p2v.tex
new file mode 100644
index 0000000000..d8c344e302
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/p2v.tex
@@ -0,0 +1,139 @@
+\section{The P2V pre-processor}
+\label{sec:ptov}
+
+In Section~\ref{sec:intro}, we enumerated the four primary goals of
+Prairie, viz., uniformity in operator and algorithms; uniformity in
+properties; uniformity in property-transformations; and efficient
+generation of Prairie optimizers. The first three goals are driven by
+the need for conceptual simplicity; however, they alone do not
+necessarily generate efficient optimizers. The P2V pre-processor
+ensures that efficient optimizers can be realized from Prairie
+specifications, by translating them to the Volcano framework and then
+generating an optimizer by compiling with the Volcano search engine.
+This Prairie optimizer-generator paradigm is shown schematically in
+Figure~\ref{fig:ptovmodel}. The pre-processor itself is 4500 lines of
+\texttt{flex} and \texttt{bison} code. In this section, we briefly
+describe the pre-processor steps and explain why the Prairie-to-Volcano
+transformation is non-trivial. A more detailed description of the
+pre-processor is given in \cite{Das94}.
+
+\begin{centeredfigure}
+\myshadowbox
+{
+\scriptsize
+\begin{centeredinfullminipage}
+\begin{center}
+\psset{unit=6mm}
+\psset{nodesep=3pt}
+%\begin{pspicture}(-1.0,-0.5)(10,9.0)
+\begin{pspicture}(-1.0,-0.5)(8,9.0)
+\pspolygon[doubleline=true](1,1.5)(7,1.5)(7,7.5)(1,7.5)
+\pspolygon[fillcolor=white,fillstyle=solid](2,8)(6,8)(6,9)(2,9)
+\rput(4,8.5){\psframebox*{Prairie Rule Set}}
+\psline[border=2pt]{->}(4,8)(4,7)
+\pspolygon[doubleline=true](2,6)(6,6)(6,7)(2,7)
+\rput(4,6.5){P2V Pre-processor}
+\psline[border=2pt]{->}(4,6)(4,5)
+\pspolygon[fillcolor=gray,fillstyle=solid](2,4)(6,4)(6,5)(2,5)
+\rput(4,4.5){\psframebox*{Volcano Rule Set}}
+\psline[border=2pt]{->}(4,4)(4,3)
+\pspolygon[doubleline=true](2,2)(6,2)(6,3)(2,3)
+\rput(4,2.5){\begin{tabular}{c} Volcano \\ Optimizer-Generator \end{tabular}}
+\psline[border=2pt]{->}(4,2)(4,1)
+\pspolygon[fillcolor=gray,fillstyle=solid](2,0)(6,0)(6,1)(2,1)
+\rput(4,0.5){\psframebox*{Query Optimizer}}
+\rput[r](1,0.5){Operator Tree}
+\psline[border=2pt]{->}(1,0.5)(2,0.5)
+\psline[border=2pt]{->}(6,0.5)(7,0.5)
+\rput[l](7,0.5){Access Plan}
+\end{pspicture}
+\end{center}
+\end{centeredinfullminipage}
+}
+\caption{The Prairie optimizer-generator paradigm. Double-boxed modules
+ represent software generators, shaded boxes represent
+ generated programs. The outermost double-boxed portion
+ denotes the Prairie optimizer generator.}
+\label{fig:ptovmodel}
+\end{centeredfigure}
+
+The specification of an optimizer in Volcano consists of a set of
+transformation rules (called ``trans\_rules'') and implementation rules
+(called ``impl\_rules''), a set of properties, and some support
+functions. The join associativity trans\_rule
+(cf.\ Figure~\ref{fig:associativity}) in Volcano is as follows\footnote{There
+are conditions and actions associated with Volcano rules that are not
+shown here.}:
+\begin{eqnarray*}
+\scriptscriptstyle
+& &
+{\scriptstyle
+(\text{JOIN} \ \text{?op\_arg5}
+ \ ((\text{JOIN} \ \text{?op\_arg4} \ (?1 \ ?2)) \
+ ?3))} \\
+& &
+\rulespace
+{\scriptstyle -\!\!>}
+{\scriptstyle
+(\text{JOIN} \ \text{?op\_arg7}
+ \ (?1 \
+ (\text{JOIN} \ \text{?op\_arg6} \ (?2 \ ?3))))}
+\end{eqnarray*}
+The important point to note is the use of \emph{operator arguments}
+(denoted by ``op\_arg'' in rules); these arguments contain properties
+used in the rule's actions, but unlike Prairie, they do not contain
+\emph{all} the properties of an operator tree node. There are other
+property classes, like algorithm argument, logical property, system
+property, physical property, and cost. Thus, while Prairie uses a
+uniform descriptor to encode properties, Volcano partitions the
+properties into different classes. The P2V pre-processor partitions a
+Prairie descriptor into the different property classes required by
+Volcano. This is a non-trivial task, since it requires parsing the
+Prairie rules and their actions.
+
+Impl\_rules in Volcano defer most of the actions associated with the
+rules to support functions. Each algorithm has four support functions
+associated with it. A Prairie specification, on the other hand,
+contains all the actions in the corresponding rule. The P2V
+pre-processor parses a Prairie I-rule, and automatically generates all
+the Volcano support functions from the rule. This is also a complex
+process, since it depends partly on the partitioning of properties
+mentioned in the last paragraph, and also because it requires
+relocating pieces of code from Prairie rules to Volcano support
+functions.
+
+The third salient feature of a Volcano specification is the presence of
+implicit, or hidden, algorithms, called \emph{enforcers}. In Prairie,
+all algorithms are explicit. Consider, for example, the Merge\_sort
+algorithm in Figure~\ref{fig:msort}. In a Volcano specification, this
+algorithm would be classified as an enforcer, since it enforces the
+sortedness property. The P2V pre-processor determines the Prairie
+algorithms that are functionally Volcano enforcers, and deletes the
+corresponding Prairie rules to generate the Volcano specification.
+This requires the pre-processor to migrate the (deleted) rule's actions
+to Volcano support functions.
+
+The P2V pre-processor also generates a set of compact Volcano rules by
+merging Prairie rules whenever possible. Consider, for example, the
+following set of rules in Prairie:
+\begin{eqnarray*}
+{\scriptstyle \text{JOIN}(S_1, S_2):\mathbf{D_3}}
+ & \Longrightarrow &
+{\scriptstyle \text{JOPR}(\text{SORT}(S_1):\mathbf{D_4},
+ \text{SORT}(S_2):\mathbf{D_5}):\mathbf{D_6}} \\
+{\scriptstyle \text{SORT}(S_1):\mathbf{D_2}}
+ & \Longrightarrow &
+{\scriptstyle \text{Null}(S_1:\mathbf{D_3}):\mathbf{D_4}} \\
+{\scriptstyle \text{JOPR}(S_1, S_2):\mathbf{D_3}}
+ & \Longrightarrow &
+{\scriptstyle \text{Nested\_loops}(S_1:\mathbf{D_4}, S_2):\mathbf{D_5}}
+\end{eqnarray*}
+The first rule is a T-rule, and the next two are I-rules. The P2V
+pre-processor combines the above set of Prairie rules into a single
+I-rule,
+\begin{eqnarray*}
+{\scriptstyle \text{JOIN}(S_1, S_2):\mathbf{D_3}}
+ & \Longrightarrow &
+{\scriptstyle \text{Nested\_loops}(S_1:\mathbf{D_4}, S_2):\mathbf{D_5}}
+\end{eqnarray*}
+and then translates it into a single Volcano impl\_rule.
diff --git a/macros/latex/contrib/utthesis/ICDE-11/paper.aux b/macros/latex/contrib/utthesis/ICDE-11/paper.aux
new file mode 100644
index 0000000000..9c07f2af48
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/paper.aux
@@ -0,0 +1,137 @@
+\relax
+\citation{Grae93}
+\citation{Bato88a}
+\citation{Grae87b}
+\citation{Haas88}
+\citation{Ston86b}
+\citation{Haas88,Frey87a,Grae87b,Grae90b}
+\citation{Haas88}
+\citation{Grae90b}
+\@writefile{toc}{\protect \contentsline {section}{\protect \numberline {1}Introduction}{1}}
+\newlabel{sec:intro}{{1}{1}}
+\@writefile{toc}{\protect \contentsline {section}{\protect \numberline {2}Prairie: A language for rule specification}{2}}
+\newlabel{sec:framework}{{2}{2}}
+\@writefile{toc}{\protect \contentsline {subsection}{\protect \numberline {2.1}Notation and assumptions}{2}}
+\newlabel{sec:notation}{{2.1}{2}}
+\@writefile{toc}{\protect \contentsline {paragraph}{Stored Files and Streams.}{2}}
+\@writefile{toc}{\protect \contentsline {paragraph}{Database Operations.}{2}}
+\@writefile{toc}{\protect \contentsline {paragraph}{Operator Trees.}{2}}
+\citation{Seli79}
+\citation{Dani82}
+\citation{Grae90b}
+\@writefile{lot}{\protect \contentsline {table}{\protect \numberline {1}{\ignorespaces Operators and algorithms in a centralized query optimizer and their additional parameters}}{3}}
+\newlabel{tab:operators}{{1}{3}}
+\@writefile{lot}{\protect \contentsline {table}{\protect \numberline {2}{\ignorespaces Properties of nodes in an operator tree}}{3}}
+\newlabel{tab:annotations}{{2}{3}}
+\newlabel{fig:optreeexample}{{1(a)}{3}}
+\newlabel{fig:accplanexample}{{1(b)}{3}}
+\@writefile{lof}{\protect \contentsline {figure}{\protect \numberline {1}{\ignorespaces Example of an operator tree and access plan}}{3}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{1(a)}{\ignorespaces An expression and its corresponding operator tree}}{3}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{1(b)}{\ignorespaces Possible access plan for operator tree in (a)}}{3}}
+\newlabel{fig:expexample}{{1}{3}}
+\@writefile{toc}{\protect \contentsline {paragraph}{Descriptors.}{3}}
+\@writefile{toc}{\protect \contentsline {paragraph}{Access Plans.}{3}}
+\@writefile{toc}{\protect \contentsline {subsection}{\protect \numberline {2.2}Prairie optimization paradigm}{3}}
+\newlabel{sec:topdown}{{2.2}{3}}
+\newlabel{eq:generaltrule}{{1}{4}}
+\newlabel{fig:generaltrule}{{2(a)}{4}}
+\newlabel{eq:associativity}{{2}{4}}
+\newlabel{fig:associativity}{{2(b)}{4}}
+\@writefile{lof}{\protect \contentsline {figure}{\protect \numberline {2}{\ignorespaces T-rule}}{4}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{2(a)}{\ignorespaces General form of a T-rule}}{4}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{2(b)}{\ignorespaces Join associativity}}{4}}
+\newlabel{fig:trules}{{2}{4}}
+\@writefile{toc}{\protect \contentsline {subsection}{\protect \numberline {2.3}Transformation rules}{4}}
+\newlabel{sec:trules}{{2.3}{4}}
+\newlabel{eq:generalirule}{{3}{4}}
+\newlabel{fig:generalirule}{{3(a)}{4}}
+\newlabel{eq:msort}{{4}{4}}
+\newlabel{fig:msort}{{3(b)}{4}}
+\@writefile{lof}{\protect \contentsline {figure}{\protect \numberline {3}{\ignorespaces I-rule}}{4}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{3(a)}{\ignorespaces General form of an I-rule}}{4}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{3(b)}{\ignorespaces Merge-sort sort algorithm}}{4}}
+\newlabel{fig:irules}{{3}{4}}
+\newlabel{ex:joinassociativity}{{4.}{4}}
+\@writefile{toc}{\protect \contentsline {subsection}{\protect \numberline {2.4}Implementation rules}{4}}
+\newlabel{sec:irules}{{2.4}{4}}
+\citation{Das94}
+\newlabel{ex:mergesort}{{5.}{5}}
+\@writefile{toc}{\protect \contentsline {subsection}{\protect \numberline {2.5}Null algorithm}{5}}
+\newlabel{sec:null}{{2.5}{5}}
+\@writefile{toc}{\protect \contentsline {section}{\protect \numberline {3}The P2V pre-processor}{5}}
+\newlabel{sec:ptov}{{3}{5}}
+\newlabel{eq:generalnullalg}{{5}{5}}
+\newlabel{fig:generalnullalg}{{4(a)}{5}}
+\newlabel{eq:nullsort}{{6}{5}}
+\newlabel{fig:nullsort}{{4(b)}{5}}
+\@writefile{lof}{\protect \contentsline {figure}{\protect \numberline {4}{\ignorespaces The ``Null'' algorithm concept}}{5}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{4(a)}{\ignorespaces General form of a ``Null'' I-rule}}{5}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{4(b)}{\ignorespaces Null sort algorithm}}{5}}
+\newlabel{fig:null}{{4}{5}}
+\citation{Das93}
+\citation{Blak93}
+\@writefile{lof}{\protect \contentsline {figure}{\protect \numberline {5}{\ignorespaces The Prairie optimizer-generator paradigm. Double-boxed modules represent software generators, shaded boxes represent generated programs. The outermost double-boxed portion denotes the Prairie optimizer generator.}}{6}}
+\newlabel{fig:ptovmodel}{{5}{6}}
+\@writefile{toc}{\protect \contentsline {section}{\protect \numberline {4}Experimental results}{6}}
+\newlabel{sec:results}{{4}{6}}
+\@writefile{toc}{\protect \contentsline {subsection}{\protect \numberline {4.1}The Texas Instruments Open OODB query optimizer}{6}}
+\newlabel{sec:oodb}{{4.1}{6}}
+\@writefile{toc}{\protect \contentsline {subsection}{\protect \numberline {4.2}Programmer productivity}{7}}
+\newlabel{sec:productivity}{{4.2}{7}}
+\@writefile{toc}{\protect \contentsline {subsection}{\protect \numberline {4.3}Performance results using the Open OODB optimizer}{7}}
+\newlabel{sec:oodbexp}{{4.3}{7}}
+\citation{Seli79}
+\citation{Dani82}
+\newlabel{fig:Eone}{{6(a)}{8}}
+\newlabel{fig:Etwo}{{6(b)}{8}}
+\newlabel{fig:Ethree}{{6(c)}{8}}
+\newlabel{fig:Efour}{{6(d)}{8}}
+\@writefile{lof}{\protect \contentsline {figure}{\protect \numberline {6}{\ignorespaces Expressions used in generating queries for experiments}}{8}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{6(a)}{\ignorespaces E1}}{8}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{6(b)}{\ignorespaces E2}}{8}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{6(c)}{\ignorespaces E3}}{8}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{6(d)}{\ignorespaces E4}}{8}}
+\newlabel{fig:exps}{{6}{8}}
+\@writefile{lof}{\protect \contentsline {figure}{\protect \numberline {3}{\ignorespaces Queries used in experiments}}{8}}
+\newlabel{tab:queries}{{3}{8}}
+\@writefile{toc}{\protect \contentsline {section}{\protect \numberline {5}Related research}{8}}
+\newlabel{sec:related}{{5}{8}}
+\citation{Haas88}
+\citation{Frey87a}
+\citation{Grae87b}
+\citation{Grae90b}
+\newlabel{fig:q1}{{7(a)}{9}}
+\newlabel{fig:q2}{{7(b)}{9}}
+\newlabel{fig:q3}{{7(c)}{9}}
+\newlabel{fig:q4}{{7(d)}{9}}
+\newlabel{fig:q5}{{7(e)}{9}}
+\newlabel{fig:q6}{{7(f)}{9}}
+\newlabel{fig:q7}{{7(g)}{9}}
+\newlabel{fig:q8}{{7(h)}{9}}
+\@writefile{lof}{\protect \contentsline {figure}{\protect \numberline {7}{\ignorespaces Query optimization times for Q1 through Q8}}{9}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{7(a)}{\ignorespaces Query 1}}{9}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{7(b)}{\ignorespaces Query 2}}{9}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{7(c)}{\ignorespaces Query 3}}{9}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{7(d)}{\ignorespaces Query 4}}{9}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{7(e)}{\ignorespaces Query 5}}{9}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{7(f)}{\ignorespaces Query 6}}{9}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{7(g)}{\ignorespaces Query 7}}{9}}
+\@writefile{lof}{\protect \contentsline {subfigure}{\string\numberline{7(h)}{\ignorespaces Query 8}}{9}}
+\newlabel{fig:e4}{{7}{9}}
+\@writefile{toc}{\protect \contentsline {section}{\protect \numberline {6}Conclusion and future work}{9}}
+\newlabel{sec:conclusion}{{6}{9}}
+\bibstyle{plain}
+\bibdata{references}
+\bibcite{Bato88a}{1}
+\bibcite{Blak93}{2}
+\bibcite{Dani82}{3}
+\bibcite{Das93}{4}
+\bibcite{Das94}{5}
+\bibcite{Frey87a}{6}
+\bibcite{Grae90b}{7}
+\bibcite{Grae93}{8}
+\bibcite{Grae87b}{9}
+\bibcite{Haas88}{10}
+\bibcite{Seli79}{11}
+\bibcite{Ston86b}{12}
+\newlabel{sec:acknowledgments}{{6}{10}}
diff --git a/macros/latex/contrib/utthesis/ICDE-11/paper.bbl b/macros/latex/contrib/utthesis/ICDE-11/paper.bbl
new file mode 100644
index 0000000000..a7e1b3ccdf
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/paper.bbl
@@ -0,0 +1,76 @@
+\begin{thebibliography}{10}
+
+\bibitem{Bato88a}
+D.~S. Batory.
+\newblock Building blocks of database management systems.
+\newblock Technical Report TR--87--23, The University of Texas at Austin,
+ February 1988.
+
+\bibitem{Blak93}
+Jos\'e~A. Blakeley, William~J. McKenna, and Goetz Graefe.
+\newblock Experiences building the {O}pen {OODB} query optimizer.
+\newblock In {\em Proceedings 1993 ACM SIGMOD International Conference on
+ Management of Data}, pages 287--296, Washington, May 1993.
+
+\bibitem{Dani82}
+Dean Daniels, Patricia Selinger, Laura Haas, Bruce Lindsay, C.~Mohan, Adrian
+ Walker, and Paul Wilms.
+\newblock An introduction to distributed query compilation in {R}$^*$.
+\newblock In {\em Proceedings 2nd International Conference on Distributed
+ Databases}, pages 291--309, Berlin, September 1982.
+
+\bibitem{Das93}
+Dinesh Das and Don Batory.
+\newblock Prairie: An algebraic framework for rule specification in query
+ optimizers.
+\newblock In {\em Proceedings of the Workshop on Database Query Optimizer
+ Generators and Rule-Based Optimizers}, pages 139--154, Dallas, September
+ 1993.
+
+\bibitem{Das94}
+Dinesh Das and Don Batory.
+\newblock Prairie: A rule specification framework for query optimizers.
+\newblock Technical Report TR 94--16, The University of Texas at Austin, May
+ 1994.
+
+\bibitem{Frey87a}
+Johann~Christoph Freytag.
+\newblock A rule-based view of query optimization.
+\newblock In {\em Proceedings 1987 ACM SIGMOD International Conference on
+ Management of Data}, pages 173--180, San Francisco, May 1987.
+
+\bibitem{Grae90b}
+Goetz Graefe.
+\newblock Volcano, an extensible and parallel query evaluation system.
+\newblock Technical Report CU--CS--481--90, University of Colorado at Boulder,
+ July 1990.
+
+\bibitem{Grae93}
+Goetz Graefe.
+\newblock Query evaluation techniques for large databases.
+\newblock {\em ACM Computing Surveys}, 25(2):73--170, June 1993.
+
+\bibitem{Grae87b}
+Goetz Graefe and David~J. DeWitt.
+\newblock The {EXODUS} optimizer generator.
+\newblock In {\em Proceedings 1987 ACM SIGMOD International Conference on
+ Management of Data}, pages 387--394, San Francisco, May 1987.
+
+\bibitem{Haas88}
+L.~M. Haas, J.~C. Freytag, G.~M. Lohman, and H.~Pirahesh.
+\newblock Extensible query processing in {S}tarburst.
+\newblock Research Report RJ 6610, IBM Almaden Research Center, December 1988.
+
+\bibitem{Seli79}
+P.~G. Selinger, M.~M. Astrahan, D.~D. Chamberlin, R.~A. Lorie, and T.~G. Price.
+\newblock Access path selection in a relational database management system.
+\newblock In {\em Proceedings 1979 ACM SIGMOD International Conference on
+ Management of Data}, pages 23--34, Boston, May 1979.
+
+\bibitem{Ston86b}
+Michael Stonebraker and Lawrence~A. Rowe.
+\newblock The design of {P}ostgres.
+\newblock In {\em Proceedings 1986 ACM SIGMOD International Conference on
+ Management of Data}, pages 340--355, Washington, May 1986.
+
+\end{thebibliography}
diff --git a/macros/latex/contrib/utthesis/ICDE-11/paper.blg b/macros/latex/contrib/utthesis/ICDE-11/paper.blg
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/paper.blg
diff --git a/macros/latex/contrib/utthesis/ICDE-11/paper.dvi b/macros/latex/contrib/utthesis/ICDE-11/paper.dvi
new file mode 100644
index 0000000000..24b018fcfb
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/paper.dvi
Binary files differ
diff --git a/macros/latex/contrib/utthesis/ICDE-11/paper.log b/macros/latex/contrib/utthesis/ICDE-11/paper.log
new file mode 100644
index 0000000000..baa677fc30
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/paper.log
@@ -0,0 +1,511 @@
+This is TeX, Version 3.141 (C version d) (format=latex 94.8.3) 20 MAR 1995 11:32
+**&latex2e paper
+(paper.tex
+LaTeX2e <1994/06/01> patch level 3
+(/lusr/tex/lib/tex/macros/latex2e/article.cls
+Document Class: article 1994/07/13 v1.2u Standard LaTeX document class
+(/lusr/tex/lib/tex/macros/latex2e/size10.clo
+File: size10.clo 1994/07/13 v1.2u Standard LaTeX file (size option)
+)
+\c@part=\count82
+\c@section=\count83
+\c@subsection=\count84
+\c@subsubsection=\count85
+\c@paragraph=\count86
+\c@subparagraph=\count87
+\c@figure=\count88
+\c@table=\count89
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+)
+(/lusr/tex/lib/tex/macros/latex2e/amssymb.sty
+Package: amssymb 1994/10/27 v1.2beta
+
+(/lusr/tex/lib/tex/macros/latex2e/amsfonts.sty
+Package: amsfonts 1994/10/25 v1.2beta
+
+(/lusr/tex/lib/tex/macros/latex2e/amsgen.sty
+File: amsgen.sty 1994/10/26 v1.2beta
+\@emptytoks=\toks14
+\ex@=\dimen103
+)
+\Mathstrutbox@=\box25
+\strutbox@=\box26
+\big@size=\dimen104
+\symAMSa=\mathgroup4
+\symAMSb=\mathgroup5
+LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
+(Font) U/euf/m/n --> U/euf/b/n on input line 151.
+)
+LaTeX Font Info: Redeclaring math symbol \square on input line 55.
+LaTeX Font Info: Redeclaring math symbol \lozenge on input line 58.
+)
+(/lusr/tex/lib/tex/macros/latex2e/amstext.sty
+Package: amstext 1994/10/27 v1.2beta
+)
+(/lusr/tex/lib/tex/macros/latex2e/array.sty
+Package: array 1994/06/01 v2.2e Tabular extension package (FMi)
+\col@sep=\dimen105
+\extrarowheight=\dimen106
+\NC@list=\toks15
+)
+(/u/ddas/tex/latex2e/inputs/boxedminipage.sty)
+(/u/ddas/tex/latex2e/inputs/calc.sty
+Style Option: `calc' 3.7 <1993/09/26 19:56:43> (KKT and FJ)
+\global@count=\count90
+\local@count=\count91
+\global@dimen=\dimen107
+\local@dimen=\dimen108
+\global@skip=\skip43
+\local@skip=\skip44
+\global@muskip=\muskip10
+\local@muskip=\muskip11
+\ratio@count=\count92
+) (/u/ddas/tex/inputs/citesort.sty
+\@minsofar=\count93
+\@min=\count94
+\@cite@temp=\count95
+)
+(/lusr/tex/lib/tex/macros/latex2e/epsfig.sty
+Package: epsfig 1994/06/07 1.3 (SPQR)
+
+(/lusr/tex/lib/tex/macros/latex2e/graphicx.sty
+Package: graphicx 1994/05/30 v0.4b Enhanced LaTeX Graphics (DPC,SPQR)
+
+(/lusr/tex/lib/tex/macros/latex2e/keyval.sty
+Package: keyval 1994/03/15 v1.07 sin cos tan (DPC)
+Package: keyval 1994/02/01 v1.06 (DPC)
+Package: keyval 1994/02/01 v1.06 (DPC)
+)
+(/lusr/tex/lib/tex/macros/latex2e/graphics.sty
+Package: graphics 1994/05/30 v0.4e Standard LaTeX Graphics (DPC,SPQR)
+
+(/lusr/tex/lib/tex/macros/latex2e/trig.sty
+Package: trig 1994/03/15 v1.07 sin cos tan (DPC)
+)
+(/lusr/tex/lib/tex/macros/latex2e/dvips.def
+File: dvips.def 1994/06/08 v1.6 Driver-dependant file (DPC,SPQR)
+))
+\Gin@req@height=\dimen109
+\Gin@req@width=\dimen110
+)
+\epsfxsize=\dimen111
+\epsfysize=\dimen112
+)
+(/u/ddas/tex/pstricks/inputs/fancybox.sty
+Style option: `fancybox' v1.0 <93/02/10> (tvz)
+\@fancybox=\box27
+\shadowsize=\dimen113
+\@Sbox=\box28
+\do@VerbBox=\toks16
+\the@fancyput=\toks17
+\this@fancyput=\toks18
+\EndVerbatimTokens=\toks19
+\Verbatim@Outfile=\write4
+\Verbatim@Infile=\read1
+) (/u/ddas/tex/inputs/fancyheadings.sty
+\headrulewidth=\dimen114
+\footrulewidth=\dimen115
+\plainheadrulewidth=\dimen116
+\plainfootrulewidth=\dimen117
+\headwidth=\dimen118
+) (/lusr/tex/lib/tex/macros/fleqn.sty
+Document style option `fleqn' - Released 04 Nov 91
+\mathindent=\dimen119
+) (/lusr/tex/lib/tex/macros/latex2e/hhline.sty
+Package: hhline 1994/05/23 v2.03 Table rule package (DPC)
+)
+(/u/ddas/tex/latex2e/inputs/multirow.sty)
+(/u/ddas/tex/latex2e/inputs/psboxit.sty
+\gray@box=\box29
+\gray@space=\dimen120
+)
+(/u/ddas/tex/pstricks/inputs/pst-node.sty
+(/u/ddas/tex/pstricks/inputs/pst-node.tex
+(/u/ddas/tex/pstricks/inputs/pstricks.tex
+`PSTricks' v0.93a <93/03/12> (tvz)
+\pst@dima=\dimen121
+\pst@dimb=\dimen122
+\pst@dimc=\dimen123
+\pst@dimd=\dimen124
+\pst@dimg=\dimen125
+\pst@dimh=\dimen126
+\pst@hbox=\box30
+\pst@boxg=\box31
+\pst@cnta=\count96
+\pst@cntb=\count97
+\pst@cntc=\count98
+\pst@cntd=\count99
+\pst@cntg=\count100
+\pst@cnth=\count101
+(/u/ddas/tex/pstricks/inputs/pstricks.con)
+\psunit=\dimen127
+\psxunit=\dimen128
+\psyunit=\dimen129
+\pslinewidth=\dimen130
+\pst@customdefs=\toks20
+\pslinearc=\dimen131
+\everypsbox=\toks21
+\psframesep=\dimen132
+\pslabelsep=\dimen133
+\theoverlaybox=\box32
+)))
+(/u/ddas/tex/pstricks/inputs/pstricks.sty
+(/u/ddas/tex/pstricks/inputs/pstricks.tex)) (stretch.sty)
+(/u/ddas/tex/latex2e/inputs/subfigure.sty
+\c@subfigure=\count102
+\c@lofdepth=\count103
+\c@subtable=\count104
+\c@lotdepth=\count105
+)
+(/lusr/tex/lib/tex/macros/latex2e/theorem.sty
+Package: theorem 1994/02/03 LaTeX2e package v2.2a
+
+Package: `theorem' v2.2a <1994/02/03> (FMi)
+English documentation as of <1994/02/28> (FMi)
+\theorem@style=\toks22
+\theorem@bodyfont=\toks23
+\theorempreskipamount=\skip45
+\theorempostskipamount=\skip46
+(/lusr/tex/lib/tex/macros/latex2e/thp.sty
+File: thp.sty 1994/02/03 Theorem layout style v2.2a
+Theorem layout: `theorem-plain' v2.2a <1994/02/03> (FMi)
+))
+(/lusr/tex/lib/tex/macros/latex2e/times.sty
+Package: times 94/11/11 4.2 Times PSNFSS2e package
+) (/u/ddas/tex/inputs/timestamp.sty
+\hour=\count106
+\minute=\count107
+\wwwy=\count108
+\wwwm=\count109
+\wwwd=\count110
+\wwwc=\count111
+\wwwt=\count112
+\wwws=\count113
+) (/lusr/tex/lib/tex/macros/latex2e/verbatim.sty
+Package: verbatim 1994/06/10 v1.5e LaTeX2e package for verbatim enhancements
+
+Package: `verbatim' 4.2 <94/11/11> (RmS)
+English Documentation <94/11/06> (RmS)
+\every@verbatim=\toks24
+\verbatim@line=\toks25
+\verbatim@in@stream=\read2
+) (/lusr/tex/lib/tex/macros/latex2e/xspace.sty
+Package: xspace 1994/01/31 v1.02 Space after command names (DPC)
+)
+\edgesizes=\skip47
+LaTeX Font Info: Try loading font information for OT1+ptm on input line 93.
+
+(/lusr/tex/lib/tex/macros/latex2e/OT1ptm.fd)
+\c@myexample=\count114
+ (paper.aux)
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 235.
+LaTeX Font Info: ... okay on input line 235.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 235.
+LaTeX Font Info: ... okay on input line 235.
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 235.
+LaTeX Font Info: ... okay on input line 235.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 235.
+LaTeX Font Info: ... okay on input line 235.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 235.
+LaTeX Font Info: ... okay on input line 235.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 235.
+LaTeX Font Info: ... okay on input line 235.
+LaTeX Info: Redefining \" on input line 235.
+LaTeX Info: Redefining \" on input line 235.
+LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <17.28> not available
+(Font) Font shape `OT1/ptm/b/n' tried instead on input line 237.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <17.28> on input line 237.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <12> on input line 237.
+LaTeX Font Info: Try loading font information for U+msa on input line 237.
+
+(/lusr/tex/lib/tex/macros/latex2e/Umsa.fd
+File: Umsa.fd 1994/10/17 v2.2d AMS font definitions
+)
+LaTeX Font Info: Try loading font information for U+msb on input line 237.
+
+(/lusr/tex/lib/tex/macros/latex2e/Umsb.fd
+File: Umsb.fd 1994/10/17 v2.2d AMS font definitions
+)
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <8> on input line 237.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <6> on input line 237.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <5> on input line 237.
+LaTeX Font Info: Try loading font information for OT1+pcr on input line 237.
+
+
+(/lusr/tex/lib/tex/macros/latex2e/OT1pcr.fd) (abstract.tex
+LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <14.4> not available
+(Font) Font shape `OT1/ptm/b/n' tried instead on input line 2.
+) (intro.tex
+Underfull \hbox (badness 10000) has occurred while \output is active
+[]
+ []
+
+[1
+
+
+]
+Underfull \hbox (badness 2980) in paragraph at lines 60--68
+[][]\OT1/ptm/m/n/10 A frame-work in which users can spec-ify map-ping
+ []
+
+) (model.tex
+LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <12> not available
+(Font) Font shape `OT1/ptm/b/n' tried instead on input line 10.
+LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <10> not available
+(Font) Font shape `OT1/ptm/b/n' tried instead on input line 14.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <7> on input line 16.
+
+Underfull \hbox (badness 1515) in paragraph at lines 34--42
+\OT1/ptm/m/n/10 are de-noted by all cap-i-tal let-ters (e.g., JOIN).
+ []
+
+
+Underfull \hbox (badness 2799) in paragraph at lines 34--42
+\OT1/ptm/m/n/10 tial and ad-di-tional. \OT1/ptm/m/it/10 Es-sen-tial pa-ram-e-te
+rs \OT1/ptm/m/n/10 are
+ []
+
+
+Underfull \hbox (badness 1354) in paragraph at lines 34--42
+\OT1/ptm/m/n/10 the stream or file in-puts to an op-er-a-tor; these
+ []
+
+
+Underfull \hbox (badness 2158) in paragraph at lines 34--42
+\OT1/ptm/m/n/10 are the pri-mary in-puts to be pro-cessed by an
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 44--52
+[][]\OT1/ptm/m/it/10 Algorithms \OT1/ptm/m/n/10 are con-crete im-ple-men-
+ []
+
+
+Underfull \hbox (badness 4792) in paragraph at lines 44--52
+\OT1/ptm/m/n/10 ta-tions of con-cep-tual op-er-a-tors; they will be
+ []
+
+
+Underfull \hbox (badness 2809) in paragraph at lines 44--52
+\OT1/ptm/m/n/10 rep-re-sented in lower case with the first let-ter
+ []
+
+
+Underfull \hbox (badness 8000) in paragraph at lines 44--52
+\OT1/ptm/m/n/10 cap-i-tal-ized (e.g., Nested[]loops). Al-go-rithms
+ []
+
+
+Underfull \hbox (badness 2970) in paragraph at lines 44--52
+\OT1/ptm/m/n/10 implement.[] Fur-ther-more, there can be, and
+ []
+
+\first=\skip48
+\second=\skip49
+\third=\skip50
+\fourth=\skip51
+\linelength=\skip52
+LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <7> not available
+(Font) Font shape `OT1/ptm/b/n' tried instead on input line 71.
+
+Overfull \hbox (12.0pt too wide) in paragraph at lines 85--86
+[]|$[]$|
+ []
+
+
+Underfull \hbox (badness 4366) in paragraph at lines 200--200
+[]\OT1/ptm/m/n/8 (a) An ex-pres-sion and its
+ []
+
+[2]
+Underfull \hbox (badness 3271) in paragraph at lines 301--311
+ []\OT1/ptm/m/n/10 There are two types of al-ge-braic trans-for-ma-tions (or
+ []
+
+[3]
+\lefttreeone=\box33
+\righttreeone=\box34
+\lefttreetwo=\box35
+\righttreetwo=\box36
+\rewritesto=\box37
+\doesnotrewriteto=\box38
+ [4]
+Underfull \hbox (badness 6978) in paragraph at lines 766--769
+ []\OT1/ptm/m/n/10 The post-opt sec-tion in the I-rule has only a cost-
+ []
+
+
+Underfull \hbox (badness 4699) in paragraph at lines 766--769
+ \OT1/ptm/m/n/10 assignment state-ment; this sim-ply sets the cost of the
+ []
+
+) (p2v.tex
+Underfull \hbox (badness 1902) in paragraph at lines 4--19
+ \OT1/ptm/m/n/10 In Sec-tion 1[], we enu-mer-ated the four pri-mary goals of
+ []
+
+
+Underfull \hbox (badness 1577) in paragraph at lines 4--19
+ \OT1/ptm/m/n/10 and ef-fi-cient gen-er-a-tion of Prairie op-ti-miz-ers. The fi
+rst
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 56--56
+[]\OT1/ptm/m/n/10 Figure 5: The Prairie optimizer-generator paradigm.
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 56--56
+\OT1/ptm/m/n/10 Double-boxed mod-ules rep-re-sent soft-ware gen-er-a-tors,
+ []
+
+
+Underfull \hbox (badness 1194) in paragraph at lines 56--56
+\OT1/ptm/m/n/10 shaded boxes rep-re-sent gen-er-ated pro-grams. The out-er-
+ []
+
+
+Underfull \hbox (badness 1087) in paragraph at lines 56--56
+\OT1/ptm/m/n/10 most double-boxed por-tion de-notes the Prairie op-ti-mizer
+ []
+
+[5]
+Underfull \hbox (badness 1460) in paragraph at lines 105--115
+ []\OT1/ptm/m/n/10 The third salient fea-ture of a Vol-cano spec-i-fi-ca-tion i
+s
+ []
+
+
+Underfull \hbox (badness 2460) in paragraph at lines 105--115
+ \OT1/ptm/m/n/10 This re-quires the pre-processor to mi-grate the (deleted)
+ []
+
+) (results.tex
+Underfull \hbox (badness 4505) in paragraph at lines 24--26
+[][]\OT1/ptm/m/n/10 How is pro-gram-mer pro-duc-tiv-ity en-hanced by the
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 36--36
+ []\OT1/ptm/b/n/12 The Texas In-stru-ments Open OODB
+ []
+
+
+Underfull \hbox (badness 5105) in paragraph at lines 39--49
+ \OT1/ptm/m/n/10 The Texas In-stru-ments Open Object-Oriented Database
+ []
+
+
+Underfull \hbox (badness 7576) in paragraph at lines 39--49
+ \OT1/ptm/m/n/10 database sys-tem which pro-vides users an ar-chi-tec-tural
+ []
+
+
+Underfull \hbox (badness 1448) in paragraph at lines 39--49
+ \OT1/ptm/m/n/10 us-ing Vol-cano. It is writ-ten as a set of trans[]rules and
+ []
+
+
+Underfull \hbox (badness 3417) in paragraph at lines 39--49
+ \OT1/ptm/m/n/10 impl[]rules that de-fine the al-ge-bra of an object-oriented
+ []
+
+
+Underfull \hbox (badness 1122) in paragraph at lines 39--49
+ \OT1/ptm/m/n/10 database sys-tem. Cur-rently, there are 17 trans-for-ma-tion
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 39--49
+ \OT1/ptm/m/n/10 rules and 9 im-ple-men-ta-tion rules to-gether with about
+ []
+
+[6]
+Underfull \hbox (badness 10000) in paragraph at lines 86--86
+ []\OT1/ptm/b/n/12 Performance re-sults us-ing the Open
+ []
+
+\Eone=\box39
+\Etwo=\box40
+\Ethree=\box41
+\Efour=\box42
+\c@savectr=\count115
+\Lone=\skip53
+\Ltwo=\skip54
+\Lthree=\skip55
+\Lfour=\skip56
+\Lnum=\skip57
+
+Underfull \hbox (badness 10000) in paragraph at lines 351--356
+ []\OT1/ptm/m/n/10 Table 3[] also shows the num-ber of trans[]rules and
+ []
+
+
+Underfull \hbox (badness 1609) in paragraph at lines 351--356
+ \OT1/ptm/m/n/10 impl[]rules that are matched by each ex-pres-sion. These
+ []
+
+[7]
+File: runtime_Q1.ps Graphic file (type eps)
+ <runtime_Q1.ps>
+File: runtime_Q2.ps Graphic file (type eps)
+ <runtime_Q2.ps>
+File: runtime_Q3.ps Graphic file (type eps)
+ <runtime_Q3.ps>
+File: runtime_Q4.ps Graphic file (type eps)
+ <runtime_Q4.ps>
+File: runtime_Q5.ps Graphic file (type eps)
+
+<runtime_Q5.ps>
+File: runtime_Q6.ps Graphic file (type eps)
+ <runtime_Q6.ps>
+File: runtime_Q7.ps Graphic file (type eps)
+ <runtime_Q7.ps>
+File: runtime_Q8.ps Graphic file (type eps)
+ <runtime_Q8.ps>) (related.tex
+[8]) (conclusion.tex [9]) (paper.bbl
+Underfull \hbox (badness 1292) in paragraph at lines 10--14
+[][]\OT1/ptm/m/n/10 Jos[]e A. Blake-ley, William J. McKenna, and Goetz
+ []
+
+
+Underfull \hbox (badness 2418) in paragraph at lines 23--29
+\OT1/ptm/m/n/10 frame-work for rule spec-i-fi-ca-tion in query op-ti-miz-
+ []
+
+
+Underfull \hbox (badness 2401) in paragraph at lines 37--41
+\OT1/ptm/m/it/10 In-ter-na-tional Con-fer-ence on Man-age-ment of Data\OT1/ptm/
+m/n/10 ,
+ []
+
+
+Underfull \hbox (badness 2245) in paragraph at lines 54--58
+\OT1/ptm/m/it/10 MOD In-ter-na-tional Con-fer-ence on Man-age-ment of
+ []
+
+
+Underfull \hbox (badness 2245) in paragraph at lines 71--75
+\OT1/ptm/m/it/10 MOD In-ter-na-tional Con-fer-ence on Man-age-ment of
+ []
+
+) [10] (paper.aux) )
+Here is how much of TeX's memory you used:
+ 2739 strings out of 11045
+ 29194 string characters out of 75338
+ 125876 words of memory out of 262141
+ 5306 multiletter control sequences out of 9500
+ 18856 words of font info for 64 fonts, out of 100000 for 255
+ 14 hyphenation exceptions out of 607
+ 32i,17n,30p,345b,597s stack positions out of 300i,40n,60p,3000b,4000s
+
+Output written on paper.dvi (10 pages, 97632 bytes).
diff --git a/macros/latex/contrib/utthesis/ICDE-11/paper.ps b/macros/latex/contrib/utthesis/ICDE-11/paper.ps
new file mode 100644
index 0000000000..9ff44af284
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/paper.ps
@@ -0,0 +1,6693 @@
+%!PS-Adobe-2.0
+%%Creator: dvips 5.55 Copyright 1986, 1994 Radical Eye Software
+%%Title: paper.dvi
+%%CreationDate: Mon Mar 20 11:33:02 1995
+%%Pages: 10
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: Times-Roman Times-Italic Times-Bold Courier
+%%EndComments
+%DVIPSCommandLine: dvips -D 600 paper -o
+%DVIPSParameters: dpi=600, comments removed
+%DVIPSSource: TeX output 1995.03.20:1132
+%%BeginProcSet: tex.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]}
+if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage
+userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
+B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
+4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
+p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pstricks.pro
+% PostScript prologue for pstricks.tex.
+% Created 1993/3/12. Source file was pstricks.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@Dict 200 dict def tx@Dict begin
+/ADict 25 dict def
+/CM { matrix currentmatrix } bind def
+/SLW /setlinewidth load def
+/CLW /currentlinewidth load def
+/CP /currentpoint load def
+/ED { exch def } bind def
+/L /lineto load def
+/T /translate load def
+/Atan { /atan load stopped { pop pop 0 } if } def
+/Div { dup 0 eq { pop } { div } ifelse } def
+/NET { neg exch neg exch T } def
+/Pyth { dup mul exch dup mul add sqrt } def
+/PtoC { 2 copy cos mul 3 1 roll sin mul } def
+/PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def }
+def
+/PathLength { flattenpath /z 0 def { /y1 ED /x1 ED /y2 y1 def /x2 x1 def
+} { /y ED /x ED PathLength@ } {} { /y y2 def /x x2 def PathLength@ }
+pathforall z } def
+/STP { .996264 dup scale } def
+/STV { SDict begin normalscale end STP } def
+/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def
+PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y
+mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul
+/y ED x mul /x ED x 0 eq y 0 eq and { /x 1 def /y 1 def } if [ y x ] 1 a
+sub y mul setdash stroke } def
+/DotLine { /b PathLength def /a ED /z ED /y CLW def /z y z add def a 0 gt
+{ /b b a div def } { a 0 eq { /b b y sub def } { a -3 eq { /b b y add
+def } if } ifelse } ifelse [ 0 b b z Div round Div dup 0 le { pop 1 } if
+] a 0 gt { 0 } { y 2 div a -2 gt { neg } if } ifelse setdash 1
+setlinecap stroke } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap n { currentstrokeadjust == x1 y1 moveto x2 y1 L
+stroke /y1 y1 a add def } repeat grestore } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap systemdict /currentstrokeadjust known {
+currentstrokeadjust } { false } ifelse { /t { } def } { /t { transform
+0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }
+bind def } ifelse n { x1 y1 t moveto x2 y1 t L stroke /y1 y1 a add def }
+repeat grestore } def
+/BeginArrow { ADict begin /@mtrx CM def gsave 2 copy T 2 index sub neg
+exch 3 index sub exch Atan rotate newpath } def
+/EndArrow { @mtrx setmatrix CP grestore end } def
+/Arrow { CLW mul add dup 2 div /w ED mul dup /h ED mul /a ED { 0 h T 1 -1
+scale } if w neg h moveto 0 0 L w h L w neg a neg rlineto gsave fill
+grestore } def
+/Tbar { CLW mul add /z ED z -2 div CLW 2 div moveto z 0 rlineto stroke 0
+CLW moveto } def
+/Bracket { CLW mul add dup CLW sub 2 div /x ED mul CLW add /y ED /z CLW 2
+div def x neg y moveto x neg CLW 2 div L x CLW 2 div L x y L stroke 0
+CLW moveto } def
+/RoundBracket { CLW mul add dup 2 div /x ED mul /y ED /mtrx CM def 0 CLW
+2 div T x y mul 0 ne { x y scale } if 1 1 moveto .85 .5 .35 0 0 0
+curveto -.35 0 -.85 .5 -1 1 curveto mtrx setmatrix stroke 0 CLW moveto }
+def
+/Shadow { [ { /moveto load } { /lineto load } { /curveto load } {
+/closepath load } pathforall ] cvx newpath 3 1 roll T exec } def
+/SD { 0 360 arc fill } def
+/SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def
+/ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def
+/SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore }
+def
+/NArray { aload length 2 div dup dup cvi eq not { exch pop } if /n exch
+cvi def } def
+/NArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop } if
+f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def
+/Line { NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub
+def n { Lineto } repeat CP 4 2 roll ArrowB L pop pop } if } def
+/Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 }
+ifelse { pop } repeat a } def
+/CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq
+and { pop pop /n n 1 sub def } if } def
+/Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop }
+repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1
+ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1
+moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto
+Lineto pop pop closepath } ifelse } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1
+def CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp
+mul dy1 l0 c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos
+abs b exp a mul dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def
+/y2 y l0 dy mul m mul sub def /dx l1 dx mul m mul neg def /dy l1 dy mul
+m mul neg def } def
+/IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if }
+ifelse /a a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def }
+def
+/BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def
+/NC { CC x1 y1 x2 y2 x y curveto } def
+/EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def
+/BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def
+/NAC { x2 y2 x y curveto CC x1 y1 } def
+/EAC { x2 y2 x y ArrowB curveto pop pop } def
+/OpenCurve { NArray n 3 lt { n { pop pop } repeat } { BOC /n n 3 sub def
+n { NC } repeat EOC } ifelse } def
+/AltCurve { { false NArray n 2 mul 2 roll [ n 2 mul 3 sub 1 roll ] aload
+/Points ED n 2 mul -2 roll } { false NArray } ifelse n 4 lt { n { pop
+pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse } def
+/ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt {
+CheckClosed } if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC }
+repeat closepath pop pop } ifelse } def
+/EndDot { { /z DS def } { /z 0 def } ifelse /b ED 0 z DS SD b { 0 z DS
+CLW sub SD } if 0 DS z add CLW 4 div sub moveto } def
+/Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto
+x1 y1 lineto closepath } def
+/OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1
+y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div
+exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse
+/b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto
+x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath }
+ifelse } def
+/Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add
+/y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq {
+pop pop Rect } { OvalFrame } ifelse } def
+/Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1
+sub 3 div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA
+x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0
+y0 x0 2 mul x1 sub y1 ] def } def
+/Grid { /a 4 string def /b ED /d ED /n ED cvi dup 1 lt { pop 1 } if /c ED
+c div dup 0 eq { pop 1 } if /cy ED c div dup 0 eq { pop 1 } if /cx ED cy
+div cvi /y ED cx div cvi /x ED cy div cvi /y2 ED cx div cvi /x2 ED cy
+div cvi /y1 ED cx div cvi /x1 ED /h y2 y1 sub 0 gt { 1 } { -1 } ifelse
+def /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def b 0 gt { /z1 b 4 div CLW 2
+div add def /Helvetica findfont b scalefont setfont /b b .95 mul CLW 2
+div add def } if gsave n 0 gt { 1 setlinecap [ 0 cy n div ] 0 setdash }
+{ 2 setlinecap } ifelse /c x1 def /i 500 w mul x1 add def /e y cy mul
+def /f y1 cy mul def /g y2 cy mul def x1 cx mul 0 T { newpath 0 e moveto
+b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1} {z1 z2
+add neg} ifelse h 0 gt {b neg} {z1} ifelse rmoveto show grestore } if 0
+f moveto 0 g L stroke cx w mul 0 T c x2 eq c i eq or {exit} if /c c w
+add def } loop grestore gsave n 0 gt { 1 setlinecap [ 0 cx n div ] 0
+setdash } { 2 setlinecap } ifelse /c y1 def /i 500 h mul y1 add def /e x
+cx mul def /f x1 cx mul def /g x2 cx mul def 0 y1 cy mul T { newpath e 0
+moveto b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1 z2
+add neg} {z1} ifelse h 0 gt {z1} {b neg} ifelse rmoveto show grestore }
+if f 0 moveto g 0 L stroke 0 cy h mul T c y2 eq c i eq or {exit} if /c c
+h add def } loop grestore } def
+/ArcArrow { /d ED /b ED /a ED gsave newpath 0 -1000 moveto clip newpath 0
+1 0 0 b grestore c mul /e ED pop pop pop r a e d PtoC y add exch x add
+exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c
+mul neg d } def
+/Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def
+/Rot { CP CP translate 3 -1 roll neg rotate NET } def
+/PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def
+/PutBegin { /lmtrx [ tx@Dict /lmtrx known { lmtrx aload pop } if CM ] def
+CP 4 2 roll T moveto } def
+/PutEnd { CP /lmtrx [ lmtrx aload pop setmatrix ] def moveto } def
+/Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s
+abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b
+div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } {
+h1 abs h sub dup s mul abs } ifelse } def
+/UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s
+mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q
+{ x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add
+exch } def
+/BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { CP OLUnit T
+moveto /IfVisible true def } if } { IfVisible { CP OLUnit NET moveto
+/IfVisible false def } if } ifelse } def
+/InitOL { /OLUnit [ gsave CM STV 2890.79999 dup moveto setmatrix CP
+grestore ] cvx def /BOL { BeginOL } def /IfVisible true def } def
+end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pst-node.pro
+% PostScript prologue for pst-node.tex.
+% Created 1993/3/12. Source file was pst-node.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@NodeDict 200 dict def tx@NodeDict begin
+/NewNode { gsave /next ED dict dup 3 -1 roll ED begin tx@Dict begin STV
+CP T exec end /NodeMtrx CM def next end grestore } def
+/InitPnode { /Y ED /X ED /NodePos { Nodesep Cos mul Nodesep Sin mul } def
+} def
+/InitCnode { /r ED /Y ED /X ED /NodePos { Nodesep r add dup Cos mul exch
+Sin mul } def } def
+/GetRnodePos { Cos 0 gt { /dx r Nodesep add def } { /dx l Nodesep sub def
+} ifelse Sin 0 gt { /dy u Nodesep add def } { /dy d Nodesep sub def }
+ifelse dx Sin mul abs dy Cos mul abs gt { dy Cos mul Sin div dy } { dx
+dup Sin mul Cos Div } ifelse } def
+/InitRnode { /r ED r mul neg /l ED /r r l add def /X l neg def { neg /d
+ED /u ED /Y 0 def } { neg /Y ED Y sub /u ED u mul neg /d ED /u u d add
+def /Y Y d sub def } ifelse /NodePos { GetRnodePos } def } def
+/InitRNode { /Y ED /X ED /r ED /X r 2 div X add def /r r X sub def /l X
+neg def Y add neg /d ED Y sub /u ED /NodePos { GetRnodePos } def } def
+/GetOnodePos { /ww w Nodesep add def /hh h Nodesep add def Sin ww mul Cos
+hh mul Atan dup cos ww mul exch sin hh mul } def
+/GetCenter { begin X Y NodeMtrx transform CM itransform end } def
+/GetAngle { nodeA GetCenter nodeB GetCenter 3 -1 roll sub 3 1 roll sub
+neg Atan } def
+/GetEdge { begin /Nodesep ED dup 1 0 NodeMtrx dtransform CM idtransform
+exch atan sub dup sin /Sin ED cos /Cos ED NodePos Y add exch X add exch
+NodeMtrx transform CM itransform end 4 2 roll 1 index 0 eq { pop pop } {
+2 copy 5 2 roll cos mul add 4 1 roll sin mul sub exch } ifelse } def
+/GetPos { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED OffsetB
+AngleB NodesepB nodeB GetEdge /y2 ED /x2 ED } def
+/InitNC { /nodeB ED /nodeA ED /NodesepB ED /NodesepA ED /OffsetB ED
+/OffsetA ED tx@NodeDict nodeA known tx@NodeDict nodeB known and dup {
+/nodeA nodeA load def /nodeB nodeB load def } if } def
+/LineMP { 4 copy 1 t sub mul exch t mul add 3 1 roll 1 t sub mul exch t
+mul add exch 6 2 roll sub 3 1 roll sub Atan } def
+/NCCoor { GetAngle /AngleA ED /AngleB AngleA 180 add def GetPos /LPutVar
+[ x2 x1 y2 y1 ] cvx def /LPutPos { LPutVar LineMP } def x1 y1 x2 y2 }
+def
+/NCLine { NCCoor tx@Dict begin ArrowB 4 2 roll ArrowA lineto end } def
+/BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED
+/t ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3
+mul cx sub def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx
+sub def /ay y3 y0 sub cy sub by sub def ax t 3 exp mul bx t t mul mul
+add cx t mul add x0 add ay t 3 exp mul by t t mul mul add cy t mul add
+y0 add 3 ay t t mul mul mul 2 by t mul mul add cy add 3 ax t t mul mul
+mul 2 bx t mul mul add cx add atan } def
+/GetArms { /x1a armA AngleA cos mul x1 add def /y1a armA AngleA sin mul
+y1 add def /x2a armB AngleB cos mul x2 add def /y2a armB AngleB sin mul
+y2 add def } def
+/NCCurve { GetPos x1 x2 sub y1 y2 sub Pyth 2 div dup 3 -1 roll mul /armA
+ED mul /armB ED GetArms x1a y1a x1 y1 tx@Dict begin ArrowA end x2a y2a
+x2 y2 tx@Dict begin ArrowB end curveto /LPutVar [ x1 y1 x1a y1a x2a y2a
+x2 y2 ] cvx def /LPutPos { t LPutVar BezierMidpoint } def } def
+/AnglesMP { LPutVar t 3 gt { /t t 3 sub def } { t 2 gt { /t t 2 sub def
+10 -2 roll } { t 1 gt { /t t 1 sub def 10 -4 roll } { 10 4 roll } ifelse
+} ifelse } ifelse 6 { pop } repeat 3 -1 roll exch LineMP } def
+/NCAngles { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform exch pop mtrx itransform /y0 ED /x0
+ED mark armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1a y1a armA 0 ne { x1 y1 }
+if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a y2a x0 y0 x1a y1a
+x1 y1 ] cvx def /LPutPos { AnglesMP } def } def
+/NCAngle { GetPos /x2a armB AngleB cos mul x2 add def /y2a armB AngleB
+sin mul y2 add def /mtrx AngleA matrix rotate def x2a y2a mtrx transform
+pop x1 y1 mtrx transform exch pop mtrx itransform /y0 ED /x0 ED mark
+armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1 y1 tx@Dict begin false Line end
+/LPutVar [ x2 y2 x2 y2 x2a y2a x0 y0 x1 y1 ] cvx def /LPutPos { AnglesMP
+} def } def
+/NCBar { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform pop sub dup 0 mtrx itransform 3 -1
+roll 0 gt { /y2a exch y2a add def /x2a exch x2a add def } { /y1a exch
+neg y1a add def /x2a exch neg x2a add def } ifelse mark x2 y2 x2a y2a
+x1a y1a x1 y1 tx@Dict begin false Line end /LPutVar [ x2 y2 x2 y2 x2a
+y2a x1a y1a x1 y1 ] cvx def /LPutPos { LPutVar AnglesMP } def } def
+/NCDiag { GetPos GetArms mark x2 y2 x2a y2a x1a y1a x1 y1 tx@Dict begin
+false Line end /LPutVar [ x2 y2 x2 y2 x2a y2a x1a y1a x1 y1 ] cvx def
+/LPutPos { AnglesMP } def } def
+/NCDiagg { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED /x1a armA
+AngleA cos mul x1 add def /y1a armA AngleA sin mul y1 add def nodeB
+GetCenter y1a sub exch x1a sub Atan 180 add /AngleB ED OffsetB AngleB
+NodesepB nodeB GetEdge /y2 ED /x2 ED mark x2 y2 x1a y1a x1 y1 tx@Dict
+begin false Line end /LPutVar [ x2 y2 x2 y2 x2 y2 x1a y1a x1 y1] cvx def
+/LPutPos { AnglesMP } def } def
+/LoopMP { /t t abs def [ LPutVar ] length 2 div 1 sub dup t lt { /t ED }
+{ pop } ifelse mark LPutVar t cvi { /t t 1 sub def pop pop } repeat
+counttomark 1 add 4 roll cleartomark 3 -1 roll exch LineMP } def
+/NCLoop { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform loopsize add /y1b ED /x1b ED /x2b x2a y2a mtrx transform pop
+def x2b y1b mtrx itransform /y2b ED /x2b ED x1b y1b mtrx itransform /y1b
+ED /x1b ED mark armB 0 ne { x2 y2 } if x2a y2a x2b y2b x1b y1b x1a y1a
+armA 0 ne { x1 y1 } if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a
+y2a x2b y2b x1b y1b x1a y1a x1 y1 ] cvx def /LPutPos { LoopMP } def }
+def
+/NCCircle { nodeA GetCenter 0 0 NodesepA nodeA GetEdge pop 3 1 roll /Y ED
+/X ED X sub 2 div dup 2 exp r r mul sub abs sqrt atan 2 mul /a ED r
+AngleA 90 add PtoC Y add exch X add exch 2 copy /LPutVar [ 4 2 roll r a
+] def /LPutPos { LPutVar aload pop t 360 mul add dup 5 1 roll 90 sub
+PtoC 3 -1 roll add 3 1 roll add exch 3 -1 roll } def r AngleA 90 sub a
+add AngleA 270 add a sub tx@Dict begin /angleB ED /angleA ED /r ED /c
+57.2957 r Div def /y ED /x ED } def
+/LPutCoor { tx@NodeDict /LPutPos known { gsave LPutPos tx@Dict begin
+/langle ED CM 3 1 roll STV CP 3 -1 roll sub neg 3 1 roll sub exch moveto
+setmatrix CP end grestore } { 0 0 tx@Dict /langle 0 def end } ifelse }
+def
+end
+%%EndProcSet
+%%BeginProcSet: texps.pro
+TeXDict begin /rf{findfont dup length 1 add dict begin{1 index /FID ne 2
+index /UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics
+exch def dict begin Encoding{exch dup type /integertype ne{pop pop 1 sub
+dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}
+ifelse}forall Metrics /Metrics currentdict end def[2 index currentdict
+end definefont 3 -1 roll makefont /setfont load]cvx def}def
+/ObliqueSlant{dup sin S cos div neg}B /SlantFont{4 index mul add}def
+/ExtendFont{3 -1 roll mul exch}def /ReEncodeFont{/Encoding exch def}def
+end
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale false def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+%%EndProcSet
+TeXDict begin @defspecial
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+@fedspecial end TeXDict begin
+40258431 52099146 1000 600 600
+(/v/ahhnold/v3/ddas/research/papers/ICDE-11/paper.dvi)
+@start /Fa 188[28 67[{}1 41.666668 /Times-Italic rf /Fb
+1 60 df<38FEFEFFFFFF3B0303030706060E0C1C3830706008147A8614>59
+D E /Fc 7 57 df<003FC00000FFF00003E07C0007C03E000F801F000F000F001E000780
+1E0007803E0007C03E0007C07C0003E07C0003E07C0003E07C0003E07C0003E0FC0003F0
+FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0
+FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F07C0003E07C0003E07C0003E0
+7E0007E03E0007C03E0007C03E0007C01F000F800F000F000F801F0007C03E0003F0FC00
+00FFF000003FC0001C2D7DAB23>48 D<000C00003C00007C0003FC00FFFC00FC7C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000FE007FFF
+FE7FFFFE172C7AAB23>I<007F800001FFF0000780FC000E003F001C001F8038000FC070
+000FC0600007E0F00007E0FC0007F0FE0007F0FE0003F0FE0003F0FE0003F07C0007F000
+0007F0000007F0000007E000000FE000000FC000001FC000001F8000003F0000007E0000
+007C000000F8000001F0000003E0000007C000000F8000001E0000003C00000078000000
+F0003000E0003001C0003003800060070000600E0000E01FFFFFE03FFFFFE07FFFFFC0FF
+FFFFC0FFFFFFC01C2C7DAB23>I<003FC00001FFF00007C0FC000E007E001C003F001C00
+1F803F001FC03F001FC03F800FC03F000FC03F000FC00C001FC000001FC000001F800000
+1F8000003F0000003E0000007C000000F8000003F00000FFC00000FFF0000000FC000000
+3F0000001F8000001FC000000FC000000FE000000FE0000007F0000007F0380007F07C00
+07F0FE0007F0FE0007F0FE0007F0FE000FE0F8000FE060000FC070001FC038001F801E00
+3F000780FC0001FFF000007FC0001C2D7DAB23>I<00000E0000000E0000001E0000003E
+0000003E0000007E000000FE000000FE000001BE000003BE0000033E0000063E00000E3E
+00000C3E0000183E0000383E0000303E0000603E0000E03E0000C03E0001803E0003803E
+0003003E0006003E000E003E000C003E0018003E0038003E0030003E0060003E00E0003E
+00FFFFFFFCFFFFFFFC00003E0000003E0000003E0000003E0000003E0000003E0000003E
+0000003E0000003E0000007F00001FFFFC001FFFFC1E2D7EAC23>I<0C0001800FC01F80
+0FFFFF000FFFFE000FFFFC000FFFF0000FFFC0000C7E00000C0000000C0000000C000000
+0C0000000C0000000C0000000C0000000C0000000C1FC0000C7FF8000DE07C000F801F00
+0F001F800E000F800C0007C0000007E0000007E0000003E0000003F0000003F0000003F0
+000003F0780003F0FC0003F0FC0003F0FC0003F0FC0003F0F80007E0E00007E0600007C0
+70000FC038000F801C001F000E003E000780F80001FFE000007F80001C2D7DAB23>I<00
+1FC00000FFF00003E07C0007801E000F000F001E0007801E0007803C0003C03C0003C03C
+0003C03C0003C03E0003C03E0007C03F0007801FC00F801FE00F001FF81E000FFC3C0007
+FFF80003FFE00000FFE000003FF80000FFFC0003C7FF000783FF801F00FFC01E003FC03C
+001FE07C0007E0780003F0F80003F0F00001F0F00000F0F00000F0F00000F0F00000F0F8
+0000E0780001E07C0001C03C0003C01E0007800F800F0007E03C0001FFF000003FC0001C
+2D7DAB23>56 D E /Fd 135[50 3[50 50 3[50 50 50 50 2[50
+2[50 50 1[50 50 50 97[{}13 83.333336 /Courier rf /Fe
+1 49 df<038007C007C007C00F800F800F800F001F001E001E003E003C003C0038007800
+780070007000E000E0000A157D9612>48 D E /Ff 6 104 df<FFFFFFFFFEFFFFFFFFFE
+FFFFFFFFFE27037A8F34>0 D<003800003800003800003800003800403804F0381EF810
+3E7E10FC0F11E003938000FE0000380000FE000393800F11E07E10FCF8103EF0381E4038
+0400380000380000380000380000380017197B9A22>3 D<000000003000000000000000
+380000000000000038000000000000003C000000000000001E000000000000000E000000
+000000000F00000000000000078000000000000003C000007FFFFFFFFFE00000FFFFFFFF
+FFF00000FFFFFFFFFFFC000000000000003E000000000000000F8000000000000007E000
+000000000001FC000000000000007F800000000000003F80000000000000FC0000000000
+0003F00000000000000F800000000000001F000000000000003C0000FFFFFFFFFFF80000
+FFFFFFFFFFF000007FFFFFFFFFE000000000000003C00000000000000780000000000000
+0F000000000000000E000000000000001E000000000000003C0000000000000038000000
+0000000038000000000000003000000039237C9F42>41 D<00F001F803F803F803F807F0
+07F007F007E007E00FC00FC00FC00F801F801F001F001F003E003E003C003C007C007800
+78007000F000F000E0000D1D7D9F13>48 D<00007E0003FE0007E0000F00001E00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C0000780000780000F00003E000FF8000FC0000
+FF800003E00000F000007800007800003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+001E00000F000007E00003FE00007E173B7BAB22>102 D<FC0000FF800007E00001F000
+007800003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00001E00001E00000F000007C0
+0001FE00007E0001FE0007C0000F00001E00001E00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C0000780001F00007E000FF8000FC0000173B7BAB22>I
+E /Fg 7 56 df<001C00007C0007FC00FFFC00FFFC00F8FC0000FC0000FC0000FC0000FC
+0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC
+0000FC0000FC0000FC007FFFF87FFFF87FFFF8151C7B9B1F>49 D<03FE000FFFC03FFFF0
+7E07F8F803FCFC01FCFC00FEFC00FEFC007E7800FE0000FE0000FE0001FC0001F80003F0
+0007E0000F80003E00007C0000F00E01E00E07801C0FFFFC1FFFFC7FFFFCFFFFFCFFFFF8
+FFFFF8171C7C9B1F>I<00FF800003FFE0000FFFF8001F01FC003E00FE003F007E003F00
+7E003F007E003F00FE000C00FC000001FC000003F00000FFC00000FFF0000001FC000000
+FE0000007F0000003F8000003F8030003F80FC003F80FC003F80FC003F80FC007F00F800
+FF007E01FE003FFFF8000FFFF00001FF8000191D7D9B1F>I<0003F0000003F0000007F0
+00000FF000001DF0000039F0000039F0000071F00000E1F00001C1F0000381F0000701F0
+000701F0000E01F0001C01F0003801F0007001F000F001F000FFFFFF80FFFFFF80FFFFFF
+800003F0000003F0000003F0000003F00000FFFF8000FFFF8000FFFF80191C7D9B1F>I<
+3800783FFFF83FFFF03FFFE03FFF803FFE003FF0003C00003C00003C00003CFF003FFFC0
+3F03F03E01F83C00FC38007C00007E00007E00007E78007EFC007EFC007EFC00FCF800FC
+7801F87E03F03FFFE00FFF8003FE00171D7C9B1F>I<001FE00000FFF80003FFFC0007F0
+3E000FC07E001F807E003F007E003E007E007E003C007E000000FC3F8000FCFFF000FDC0
+FC00FF807E00FF003F00FE001F00FE001F80FC001F80FC001F80FC001F807C001F807E00
+1F807E001F803E003F003F003F001F80FE000FFFF80003FFF000007F8000191D7D9B1F>
+I<380000003FFFFF803FFFFF807FFFFF807FFFFF007FFFFE007FFFFC007000F800E001F0
+00E003E0000007C000000F8000001F0000001F0000003E0000007E0000007C0000007C00
+0000FC000000FC000000F8000001F8000001F8000001F8000001F8000001F8000001F800
+0001F8000000F00000191D7C9B1F>I E /Fh 7 62 df<007C00000000600001FF000000
+00F00003C380000001F0000700C0000001E0000E0060000003E0001E007000000FC0001C
+003C00001F80003C003F00007F80003C001BE003FF00007C0018FFFF9E00007800181FFC
+3E000078000C00007C0000F8000C0000780000F8000C0000F80000F8000C0001F00000F8
+000C0001E00000F8000C0003E00000F8000C0007C00000F8000C0007800000F8000C000F
+800000F8000C001F00000078000C001E000000780018003E0000007C0018007C0000003C
+001800780000003C003000F80000001C003001F00000001E006001E00000000E006003E0
+0000000700C007C000000003C380078000000001FF000F80000000007C001F0000000000
+00001E0007C0000000003E001FF0000000007C003C38000000007800700C00000000F800
+F00600000001F001E00600000001E001E00300000003E003C00300000007C003C0018000
+00078007C0018000000F800780018000001F000780018000001E000F8000C000003E000F
+8000C000007C000F8000C0000078000F8000C00000F8000F8000C00001F0000F8000C000
+01E0000F8000C00003E0000F8000C00007C0000F8000C0000780000F8000C0000F800007
+800180001F000007800180001E000007C00180003E000003C00180007C000003C0030000
+78000001E0030000F8000001E0060001F0000000F0060001E0000000700C0003E0000000
+3C380003C00000001FF000018000000007C0003A437BBD45>37 D<0003F80000001FFF00
+00007E0FC00000F803E00003E000F80003C000780007C0007C000F80003E000F80003E00
+1F00001F001F00001F003F00001F803F00001F803F00001F807E00000FC07E00000FC07E
+00000FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00
+000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE0000
+0FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000F
+C07E00000FC07E00000FC07E00000FC07F00001FC03F00001F803F00001F803F00001F80
+1F00001F001F00001F000F80003E000F80003E0007C0007C0003E000F80003E000F80000
+F803E000007E0FC000001FFF00000007FC000023387DB62A>48 D<000180000007800000
+0F8000003F800001FF8000FFFF8000FFDF8000FE1F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000003FC0007FFFFFE07FFFFFE07FFFFFE01B3779B62A
+>I<0007F80000003FFF000000FFFFC00001F00FE000038003F000070001F8000F0001FC
+000FC001FE001FE000FE001FE000FF001FE000FF001FE000FF000FE000FF000FC000FF00
+038000FF00000000FE00000000FE00000001FE00000001FC00000001F800000003F00000
+0003E000000007C00000000F800000007F0000001FFC0000001FFF800000000FE0000000
+03F000000001FC00000000FE00000000FF000000007F000000007F800000007FC0000000
+3FC00000003FC00000003FE00000003FE03E00003FE07F00003FE0FF80003FE0FF80003F
+E0FF80003FE0FF80003FC0FF00007FC07E00007F807C00007F80300000FF00380000FE00
+1C0001FC000F0003F80007F00FF00001FFFFC000007FFF8000000FFC000023387DB62A>
+51 D<0600000C000780003C0007F003F80007FFFFF00007FFFFE00007FFFFC00007FFFF
+800007FFFF000007FFFC0000067FE0000006000000000600000000060000000006000000
+000600000000060000000006000000000600000000060000000006000000000600000000
+0607F80000063FFF000006F80F800007C003C000070001F000060000F800040000F80000
+00007C000000007E000000007E000000003F000000003F000000003F000000003F800000
+003F800000003F803C00003F807E00003F80FF00003F80FF00003F80FF00003F80FF0000
+3F00FE00003F00FC00007F006000007E006000007E00300000FC00380000F800180001F8
+000E0003F000070007E00003E03F800001FFFF0000007FFC0000001FE0000021387CB62A
+>53 D<1C003E007F00FF80FF80FF807F003E001C00000000000000000000000000000000
+0000000000000000000000000000000000000000001C003E007F00FF80FF80FF807F003E
+001C00092479A317>58 D<7FFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFF
+FFFFFC000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFC
+FFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFFFFFFF836167B9F41>61
+D E /Fi 3 106 df<001FF00000FFFF0003E03FC00F801FE01F000FF01F800FF83FC007
+F83FE007F83FE007F83FE007F83FE00FF83FE00FF01FC00FF007001FE000003FE000007F
+800000FF00007FFC00007FF800007FFF0000003FC000000FF0000007F8000007FC0C0007
+FC3F0003FE7F8003FEFFC003FEFFC003FEFFC003FEFFC003FEFFC003FC7F8007FC7F0007
+F83F000FF01FC03FE007FFFFC001FFFF00003FF0001F277DA526>51
+D<FFFFFFFF000000FFFFFFFFF00000FFFFFFFFFC000003FE0007FF000003FE00007FC000
+03FE00003FE00003FE00000FF00003FE000007F80003FE000003F80003FE000003FC0003
+FE000001FE0003FE000001FE0003FE000000FF0003FE000000FF0003FE000000FF0003FE
+000000FF0003FE000000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE00
+0000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE0000
+00FF0003FE000000FF0003FE000000FF0003FE000001FE0003FE000001FE0003FE000003
+FC0003FE000003FC0003FE000007F80003FE00000FF00003FE00001FE00003FE00007FC0
+0003FE0003FF0000FFFFFFFFFE0000FFFFFFFFF00000FFFFFFFF00000031287DA739>68
+D<0F801FC03FE03FE03FE03FE03FE01FC00F80000000000000000000000000FFE0FFE0FF
+E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F
+E00FE00FE0FFFCFFFCFFFC0E297CA816>105 D E /Fj 1 69 df<FFFFFFFFFF800000FF
+FFFFFFFFF80000FFFFFFFFFFFF0000FFFFFFFFFFFFC000007FF80007FFF000007FF80000
+7FF800007FF800001FFE00007FF800000FFF00007FF8000003FF80007FF8000001FFC000
+7FF8000001FFC0007FF8000000FFE0007FF80000007FF0007FF80000007FF0007FF80000
+003FF8007FF80000003FF8007FF80000003FFC007FF80000001FFC007FF80000001FFC00
+7FF80000001FFE007FF80000001FFE007FF80000001FFE007FF80000001FFE007FF80000
+001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF00
+7FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000
+001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFE007FF80000001FFE00
+7FF80000001FFE007FF80000001FFE007FF80000001FFC007FF80000003FFC007FF80000
+003FFC007FF80000003FF8007FF80000007FF8007FF80000007FF0007FF8000000FFE000
+7FF8000000FFE0007FF8000001FFC0007FF8000003FF80007FF8000007FF00007FF80000
+1FFE00007FF800007FFC00007FF80007FFF000FFFFFFFFFFFFC000FFFFFFFFFFFF0000FF
+FFFFFFFFFC0000FFFFFFFFFF80000040397DB849>68 D E /Fk 3
+106 df<00000000003C00000000000000003C00000000000000003E0000000000000000
+1E00000000000000001F00000000000000000F8000000000000000078000000000000000
+07C00000000000000003E00000000000000001F00000000000000000F800000000000000
+00FC00007FFFFFFFFFFFFE0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF8000FFFFFFFFFF
+FFFFC00000000000000003E00000000000000001F80000000000000000FE000000000000
+00003F00000000000000001FE00000000000000007F80000000000000001FF0000000000
+000001FF0000000000000007F8000000000000001FE0000000000000003F000000000000
+0000FE0000000000000001F80000000000000003E000FFFFFFFFFFFFFFC000FFFFFFFFFF
+FFFF8000FFFFFFFFFFFFFF00007FFFFFFFFFFFFE0000000000000000FC00000000000000
+00F80000000000000001F00000000000000003E00000000000000007C000000000000000
+0780000000000000000F80000000000000001F00000000000000001E0000000000000000
+3E00000000000000003C00000000000000003C000000482E7BAB53>41
+D<0000C00001E00003E00003E00003C00007C00007C0000780000F80000F80001F00001F
+00001E00003E00003E00007C00007C0000780000F80000F80001F00001F00001E00003E0
+0003E00003C00007C00007C0000F80000F80000F00001F00001F00003E00003E00003C00
+007C00007C0000780000F80000F80000F80000F800007800007C00007C00003C00003E00
+003E00001F00001F00000F00000F80000F800007C00007C00003C00003E00003E00001E0
+0001F00001F00000F80000F800007800007C00007C00003E00003E00001E00001F00001F
+00000F80000F800007800007C00007C00003C00003E00003E00001E00000C0135278BD20
+>104 D<600000F00000F80000F800007800007C00007C00003C00003E00003E00001F00
+001F00000F00000F80000F800007C00007C00003C00003E00003E00001F00001F00000F0
+0000F80000F800007800007C00007C00003E00003E00001E00001F00001F00000F80000F
+800007800007C00007C00003C00003E00003E00003E00003E00003C00007C00007C00007
+80000F80000F80001F00001F00001E00003E00003E00007C00007C0000780000F80000F8
+0000F00001F00001F00003E00003E00003C00007C00007C0000F80000F80000F00001F00
+001F00003E00003E00003C00007C00007C0000780000F80000F80000F000006000001352
+7CBD20>I E /Fl 3 111 df<70F8F8F87005057A8413>58 D<03FFFFC00003FFFFF80000
+3C007E00003C001F00003C000F80003C000F800078000F800078000F800078000F800078
+001F0000F0003E0000F000780000F003E00000FFFE000001E007000001E003C00001E001
+C00001E001E00003C001E00003C001E00003C001E00003C001E000078003E000078003E0
+60078003E060078003E0C0FFF801F0C0FFF800F1800000003E00231D7B9B2B>82
+D<0F03F00033861C0021D81E0061F01E00C3E01E00C3C01E0003C01E0003C01E0007803C
+0007803C0007803C00078078200F0078600F00F0600F00F0C00F00F0C01E0071800C003E
+001B127D9125>110 D E /Fm 139[12 16 14 1[21 21 21 1[12
+2[12 1[21 1[18 21 18 1[18 12[25 23 28 2[30 30 37 25 1[16
+14 2[23 25 1[28 1[30 20[10 2[14 14 40[{}29 41.666668
+/Times-Roman rf /Fn 3 52 df<00600001E0000FE000FFE000F1E00001E00001E00001
+E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001
+E00001E00001E00001E00001E00001E00001E0007FFF807FFF80111C7B9B1C>49
+D<03FC000FFF801C0FC03003E06001F0E000F0E000F8F00078F000786000780000F80000
+F00001F00001E00003C0000700000E00001C0000300000E0000180180300180600180800
+383FFFF07FFFF0FFFFF0FFFFF0151C7D9B1C>I<03FC000FFF001C07C03001E07001F078
+01F07800F03001F00001F00001E00003C0000780001E0003FC000007800003C00001E000
+00F00000F80000F86000F8F000F8F000F8E000F06001F07003E03C07C00FFF0003FC0015
+1D7D9B1C>I E /Fo 81[32 51[26 29 29 1[29 29 16 23 19 1[29
+29 29 45 16 1[16 16 29 29 19 26 29 26 29 26 7[42 2[42
+42 36 32 39 42 32 42 42 52 2[23 19 1[42 32 36 42 39 1[42
+1[26 5[29 29 29 29 29 29 29 29 29 3[19 15 2[19 19 40[{}57
+58.333336 /Times-Roman rf /Fp 134[29 29 2[32 19 23 26
+1[32 29 32 48 16 2[16 32 29 1[26 32 26 1[29 14[42 45
+36 45 5[23 3[39 42 2[42 1[29 63[{}27 58.333336 /Times-Bold
+rf /Fq 138[33 18 26 26 1[33 1[33 48 3[18 1[33 1[29 3[33
+97[{}11 66.666664 /Times-Italic rf /Fr 7 56 df<00E00001E00007E000FFE000
+F9E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000
+01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000
+01E00001E00003F000FFFFC0FFFFC012217AA01E>49 D<01FC0007FF801C0FC03003E060
+01F06000F8F800F8FC00FCFC00FCFC007C78007C3000FC0000FC0000F80000F80001F000
+03E00003C0000780000F00001E0000380000700000E00001C00C03800C0600180C001818
+00183FFFF87FFFF8FFFFF0FFFFF016217CA01E>I<00FF0003FFC00F03E01C00F01C00F8
+3E00FC3E007C3E007C1E00FC0C00FC0000F80000F80001F00003E0000FC001FF0001FF00
+0003E00000F000007800007C00003E00003F30003F78003FFC003FFC003FFC003EF8007E
+60007C3800F81E03F00FFFC001FF0018227DA01E>I<0000E00001E00001E00003E00007
+E00007E0000DE0001DE00039E00031E00061E000E1E000C1E00181E00381E00701E00601
+E00C01E01C01E01801E03001E07001E0E001E0FFFFFFFFFFFF0001E00001E00001E00001
+E00001E00001E00003F0003FFF003FFF18227DA11E>I<1000301E01F01FFFE01FFFC01F
+FF801FFE001BF00018000018000018000018000018000018FE001BFF801F03C01C01E018
+00F01800F800007800007800007C00007C30007C78007CF8007CF8007CF80078F000F860
+00F07001E03801E01E078007FF0001F80016227CA01E>I<000FC0007FF001F03803C018
+07803C0F007C1E007C1C00383C00003C00007C0000780000787FC0F8FFE0F980F0FA0038
+FE003CFC001EFC001EF8001FF8001FF8001FF8001F78001F78001F78001F3C001E3C001E
+1C003C1E00380F00700781E001FFC0007F0018227DA01E>I<3000003C00003FFFFF3FFF
+FF7FFFFE7FFFFC60001C600038600070C000E0C000C00001C0000380000700000600000E
+00001C00001C0000380000380000780000780000780000F00000F00000F00000F00001F0
+0001F00001F00001F00001F00001F00001F00000E00018237CA11E>I
+E /Fs 1 4 df<7FFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFCF0
+00000000003CF000000000003CF000000000003CF000000000003CF000000000003CF000
+000000003CF000000000003CF000000000003CF000000000003CF000000000003CF00000
+0000003CF000000000003CF000000000003CF000000000003CF000000000003CF0000000
+00003CF000000000003CF000000000003CF000000000003CF000000000003CF000000000
+003CF000000000003CF000000000003CF000000000003CF000000000003CF00000000000
+3CF000000000003CF000000000003CF000000000003CF000000000003CF000000000003C
+F000000000003CF000000000003CF000000000003CF000000000003CF000000000003CF0
+00000000003CF000000000003CF000000000003CF000000000003CF000000000003CF000
+000000003CF000000000003CF000000000003CF000000000003CF000000000003CF00000
+0000003CF000000000003CFFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFF
+FFFFF836387BB741>3 D E /Ft 18 112 df<387CFEFEFEFEFEFE7C7C7C7C7C7C7C7C7C
+7C3838383838383838383810000000000038FEFEFEFEFE3807297BA813>33
+D<0006000C00180030006000E001C00380038007000F000E001E001E001C003C003C003C
+0078007800780078007800F800F000F000F000F000F000F000F000F000F000F000F000F8
+00780078007800780078003C003C003C001C001E001E000E000F0007000380038001C000
+E0006000300018000C00060F3B7AAB1A>40 D<C0006000300018000C000E000700038003
+8001C001E000E000F000F00070007800780078003C003C003C003C003C003E001E001E00
+1E001E001E001E001E001E001E001E001E003E003C003C003C003C003C00780078007800
+7000F000F000E001E001C00380038007000E000C00180030006000C0000F3B7DAB1A>I<
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E000000FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E0000002B2B7DA333>43 D<00380000780001F8001FF800FEF800E0F80000F80000
+F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000
+F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000
+F80000F80000F80000F80001FC00FFFFF8FFFFF815267BA521>49
+D<00FF000003FFE0000E03F0001800F80030007C0060003E0078001F00FC001F00FE001F
+80FE001F80FE000F80FE000F807C000F8000001F8000001F0000001F0000003F0000003E
+0000007C00000078000000F0000001E0000003C00000078000000F0000001C0000003800
+000070018000E0018001C0018003800300060003000C0003001FFFFF003FFFFF007FFFFE
+00FFFFFE00FFFFFE0019267DA521>I<00FF000003FFE0000F01F8001C007C0030003E00
+3C003E007E003F007E001F007E001F007E003F003C003F0000003E0000003E0000007C00
+0000F8000001F0000007E00001FF800001FF00000001E0000000F00000007C0000003E00
+00003F0000001F0000001F8000001F8038001F807C001F80FE001F80FE001F80FE001F00
+FC003F0078003E0070007C003800F8001F01F00007FFC00000FF000019277DA521>I<00
+00380000003800000078000000F8000001F8000001F8000003F8000007F8000006F80000
+0CF800001CF8000018F8000030F8000070F8000060F80000C0F80001C0F8000180F80003
+00F8000700F8000E00F8000C00F8001C00F8003800F8003000F8006000F800E000F800FF
+FFFFE0FFFFFFE00000F8000000F8000000F8000000F8000000F8000000F8000000F80000
+01FC00003FFFE0003FFFE01B277EA621>I<18000C001F007C001FFFF8001FFFF0001FFF
+E0001FFF800019FC00001800000018000000180000001800000018000000180000001800
+0000187F000019FFE0001F81F0001E0078001C003C0018003E0000003E0000001F000000
+1F0000001F8000001F8030001F807C001F80FC001F80FC001F80FC001F80FC001F00F000
+1F0060003E0070003E0030007C001C00F8000F03E00003FFC00000FE000019277DA521>
+I<000FE000003FF80000F81C0001E0060003801F0007003F000F003F001E003F001E003F
+003C001E003C0000007C0000007800000078040000783FC000F8FFF000F9807800FB003C
+00FA001E00FC001E00FC000F00FC000F00F8000F80F8000F80F8000F80F8000F8078000F
+8078000F8078000F8078000F803C000F003C000F001C001E001E001E000E003C00070078
+0003C0F00001FFC000007F000019277DA521>I<300000003C0000003FFFFFE03FFFFFE0
+3FFFFFC07FFFFF807FFFFF807000070060000E0060000C00C0001C00C0003800C0007000
+0000E0000000C0000001C000000380000003800000070000000F0000000E0000001E0000
+001E0000001E0000003E0000003C0000003C0000007C0000007C0000007C0000007C0000
+00FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000780000
+1B287DA621>I<387CFEFEFE7C380000000000000000000000387CFEFEFE7C3807197B98
+13>58 D<387CFEFEFE7C380000000000000000000000387CFCFEFE7E3E0606060C0C0C18
+1830702007247B9813>I<7FFFFFFFFFC0FFFFFFFFFFE0FFFFFFFFFFE000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000FFFFFFFFFFE0FFFFFFFFFFE07F
+FFFFFFFFC02B117D9633>61 D<01FF000FFFE01E01F038007860007CF8003EFC003EFC00
+3EFC003E78003E30007C00007C0000F80001F00003C0000780000F00000E00001C000018
+000038000030000030000030000030000030000030000030000020000000000000000000
+0000000000000000700001FC0001FC0001FC0001FC0001FC0000700017297DA81F>63
+D<007E03E001FF8FF00781F8F00F00F0F01E0078001C0038003C003C003C003C003C003C
+003C003C003C003C003C003C001C0038001E0078000F00F0000781E00009FF8000087E00
+0018000000180000001C0000001E0000000FFFF0000FFFFC0007FFFF000FFFFF801C001F
+C0380007C0780003E0F00001E0F00001E0F00001E0F00001E0780003C07C0007C03E000F
+800FC07E0003FFF800007FC0001C277E9921>103 D<0F80FF80FF801F800F800F800F80
+0F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F80
+0F800F800F800F800F800F800F800F800F800F800F800F801FC0FFF8FFF80D287EA713>
+108 D<003F800000FFE00003E0F80007803C000F001E001E000F003C0007803C00078078
+0003C0780003C0780003C0F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0F8
+0003E0780003C0780003C07C0007C03C0007801E000F001F001F000F803E0003E0F80001
+FFF000003F80001B1C7E9A21>111 D E /Fu 11 121 df<387CFEFEFE7C3807077A8614>
+58 D<387CFEFFFF7F3B0303030606060C1838702008127A8614>I<E000000000F8000000
+00FE000000003F800000000FE000000003F800000000FE000000003F800000000FE00000
+0003F800000000FE000000003F800000000FE000000003F800000000FE000000003F8000
+00000FE000000003F800000000FE000000003E00000000FE00000003F80000000FE00000
+003F80000000FE00000003F80000000FE00000003F80000000FE00000003F80000000FE0
+0000003F80000000FE00000003F80000000FE00000003F80000000FE00000000F8000000
+00E00000000027277AA134>62 D<00000001800000000003800000000007800000000007
+C0000000000FC0000000001FC0000000001FC00000000037C00000000037C00000000067
+C000000000C7C000000000C7E00000000183E00000000383E00000000303E00000000603
+E00000000E03E00000000C03E00000001803F00000001801F00000003001F00000006001
+F00000006001F0000000C001F0000001C001F00000018001F0000003FFFFF8000003FFFF
+F80000060000F800000C0000F800000C0000F80000180000F80000380000F80000300000
+FC00006000007C0000E000007C0000C000007C0001C000007C0003C000007C000FC00000
+FE00FFF8000FFFE0FFF8000FFFE02B2A7DA932>65 D<003FFFFFFFF8003FFFFFFFF80001
+F80003F80001F00000F80001F00000780003F00000300003F00000300003E00000300003
+E00000300007E00000300007E00000300007C00180300007C0018030000FC0038000000F
+C0030000000F80030000000F80070000001F801F0000001FFFFE0000001FFFFE0000001F
+001E0000003F000E0000003F000C0000003E000C0000003E000C0000007E001C01C0007E
+00180180007C00000180007C0000038000FC0000070000FC0000070000F800000E0000F8
+00000E0001F800001C0001F800003C0001F00000780001F00001F80003F0000FF000FFFF
+FFFFF000FFFFFFFFE0002D287CA731>69 D<003FFFFFFFE0003FFFFFFFE00001F80007E0
+0001F00003E00001F00001E00003F00000C00003F00000C00003E00000C00003E00000C0
+0007E00000C00007E00000C00007C00000C00007C00300C0000FC0070000000FC0060000
+000F80060000000F800E0000001F800E0000001F803C0000001FFFFC0000001FFFFC0000
+003F003C0000003F00180000003E00180000003E00180000007E00380000007E00300000
+007C00300000007C0000000000FC0000000000FC0000000000F80000000000F800000000
+01F80000000001F80000000001F00000000001F00000000003F000000000FFFFE0000000
+FFFFE00000002B287CA72A>I<000001FF000000001FFFE00000007E01F8000001F0007E
+000007C0001F00000F80000F80001E000007C0007C000007C000F8000003E001F0000003
+E001F0000001F003E0000001F007C0000001F00FC0000001F00F80000001F81F80000001
+F81F00000001F83F00000001F83F00000001F07E00000003F07E00000003F07E00000003
+F07E00000003F07E00000007E0FC00000007E0FC0000000FC0FC0000000FC0FC0000001F
+80FC0000001F807C0000003F007E0000003E007E0000007E003E000000FC003E000001F8
+001F000003F0001F800007C0000F80000F800007C0003F000003F000FC000000FC03F000
+00003FFFC000000007FC0000002D2A7DA832>79 D<003FFFFFC000003FFFFFF8000001F8
+00FE000001F0001F000001F0000F800003F0000FC00003F00007C00003E00007C00003E0
+0007E00007E00007E00007E0000FC00007C0000FC00007C0000FC0000FC0001F80000FC0
+001F00000F80003E00000F80007C00001F8001F000001F800FE000001FFFFF0000001FFF
+FE0000003F001F0000003F0007C000003E0007C000003E0003E000007E0003E000007E00
+03E000007C0003E000007C0003E00000FC0007E00000FC0007E00000F80007E00000F800
+07E00001F80007E01001F80007E03001F00007E03001F00007E07003F00007E0E0FFFF80
+03F1C0FFFF8001FF80000000007E002C297CA732>82 D<00001FE0080000FFFC180003E0
+1E380007000770000E0003F000180001F000300000F000700000E000E00000E000E00000
+E000E00000E001E00000C001E00000C001E000000001F000000000F800000000FE000000
+007FE00000007FFE0000003FFFE000000FFFF0000001FFF80000001FFC00000001FE0000
+00003E000000001F000000000F000000000F000000000F00180000070018000007003800
+000E003000000E003800000C003800001C0078000038007C000070007E0000E000770003
+C000E3E00F0000C0FFFE0000801FF00000252A7CA829>I<000E00001F00001F00001E00
+000C0000000000000000000000000000000000000000000000000003E00007F0000C7800
+183800303800303800607800607800C07800C0F00000F00001E00001E00001E00003C000
+03C0000780000781800781800F01800F03000F03000F06000F0C000F1C0007F00001E000
+11287DA617>105 D<00F807C001FE1FF0070738380E07B0381C03E0781803C0F83003C0
+F83003C07060078000600780000007800000078000000F0000000F0000000F0000000F00
+00001E0000001E0030001E0030301E0060783E0060F83E00C0F87E00C0F06E038061CF07
+007F83FC001E01F8001D1B7D9926>120 D E /Fv 11 121 df<1C007F00FF80FF80FF80
+FF80FF807F001C000909798817>58 D<1C007F00FF80FF80FFC0FFC0FFC07FC01CC000C0
+00C000C000C001C00180018003800300070006000E001C003800700060000A19798817>
+I<00000000006000000000000070000000000000F0000000000001F0000000000001F000
+0000000003F0000000000003F0000000000007F000000000000FF000000000000FF00000
+0000001FF800000000001FF8000000000033F8000000000073F8000000000063F8000000
+0000C3F80000000000C3F8000000000183F8000000000183F8000000000303F800000000
+0603F8000000000603FC000000000C03FC000000000C01FC000000001801FC0000000030
+01FC000000003001FC000000006001FC000000006001FC00000000C001FC00000001C001
+FC000000018001FC000000030001FE000000030001FE000000060000FE0000000E0000FE
+0000000C0000FE000000180000FE0000001FFFFFFE0000003FFFFFFE0000003FFFFFFE00
+0000600000FE000000C00000FE000000C00000FF000001800000FF0000018000007F0000
+030000007F0000060000007F0000060000007F00000C0000007F00000C0000007F000018
+0000007F0000380000007F0000700000007F0000F00000007F8001F80000007F8007F800
+0000FF80FFFF80003FFFFFFFFF80007FFFFFFFFF80007FFFFF383C7DBB3E>65
+D<0003FFFFFFFFFFF00007FFFFFFFFFFF00007FFFFFFFFFFF0000007F800003FF0000007
+F0000007F0000007F0000003E000000FF0000001E000000FF0000000E000000FE0000000
+E000000FE0000000E000001FE0000000E000001FE0000000E000001FC0000000E000001F
+C0000000C000003FC0000000C000003FC0000000C000003F80003000C000003F80003000
+C000007F80007000C000007F800070000000007F000060000000007F0000E000000000FF
+0000E000000000FF0001E000000000FE0003C000000000FE000FC000000001FFFFFFC000
+000001FFFFFFC000000001FFFFFF8000000001FC000F8000000003FC00078000000003FC
+00078000000003F800030000000003F800030000000007F800070000000007F800070003
+000007F000060003000007F00006000700000FF00006000600000FF00000000600000FE0
+0000000E00000FE00000000C00001FE00000001C00001FE00000001800001FC000000038
+00001FC00000003800003FC00000007000003FC0000000F000003F80000001E000003F80
+000001E000007F80000007E000007F8000000FC000007F0000003FC00000FF000003FF80
+00FFFFFFFFFFFF8000FFFFFFFFFFFF8000FFFFFFFFFFFF00003C397DB83D>69
+D<0003FFFFFFFFFFE00007FFFFFFFFFFE00007FFFFFFFFFFE0000007F800003FE0000007
+F000000FE0000007F0000003C000000FF0000003C000000FF0000001C000000FE0000001
+C000000FE0000001C000001FE0000001C000001FE0000001C000001FC0000001C000001F
+C00000018000003FC00000018000003FC00000018000003F800000018000003F80006001
+8000007F8000E0018000007F8000E0000000007F0000C0000000007F0000C000000000FF
+0001C000000000FF0001C000000000FE00038000000000FE00078000000001FE001F8000
+000001FFFFFF8000000001FFFFFF0000000001FFFFFF0000000003FC001F0000000003FC
+000F0000000003F8000E0000000003F8000E0000000007F8000E0000000007F8000E0000
+000007F0000C0000000007F0000C000000000FF0001C000000000FF0001C000000000FE0
+0000000000000FE00000000000001FE00000000000001FE00000000000001FC000000000
+00001FC00000000000003FC00000000000003FC00000000000003F800000000000003F80
+0000000000007F800000000000007F800000000000007F00000000000000FF8000000000
+00FFFFFFC000000000FFFFFFC000000000FFFFFFC0000000003B397DB835>I<0003FFF8
+00001FFFF80007FFFC00003FFFF80007FFFC00003FFFF8000007FC000001FF00000007FE
+0000007C00000006FE000000780000000EFF000000700000000E7F000000700000000C7F
+800000600000000C7F800000600000001C3F800000E00000001C3FC00000C0000000181F
+C00000C0000000181FE00000C0000000381FE00001C0000000380FF0000180000000300F
+F00001800000003007F00001800000007007F80003800000007003F80003000000006003
+FC0003000000006003FC000300000000E001FC000700000000E001FE000600000000C000
+FE000600000000C000FF000600000001C0007F000E00000001C0007F800C000000018000
+7F800C0000000180003F800C0000000380003FC01C0000000380001FC018000000030000
+1FE0180000000300000FE0180000000700000FF0380000000700000FF030000000060000
+07F03000000006000007F8300000000E000003F8700000000E000003FC600000000C0000
+03FC600000000C000001FE600000001C000001FEE00000001C000000FEC0000000180000
+00FFC0000000180000007FC0000000380000007FC0000000380000007F80000000300000
+003F80000000300000003F80000000700000001F80000000700000001F00000000F00000
+000F00000007FC0000000F000000FFFFE000000F000000FFFFE0000006000000FFFFE000
+000600000045397DB843>78 D<00000001FF00000000001FFFF000000000FE01FC000000
+03F0007E00000007C0001F8000001F80000FC000003E000007E00000FC000003F00001F8
+000003F00003F0000001F80007E0000001F8000FC0000000FC001F80000000FC003F0000
+0000FE007F000000007E00FE000000007E00FC000000007F01FC000000007F03F8000000
+007F03F8000000007F07F0000000007F07F0000000007F0FF0000000007F0FE000000000
+7F1FE000000000FF1FE000000000FF3FC000000000FF3FC000000000FF3FC000000000FF
+7F8000000001FE7F8000000001FE7F8000000001FE7F8000000001FEFF8000000003FCFF
+0000000003FCFF0000000003FCFF0000000007F8FF0000000007F8FF000000000FF0FF00
+0000000FF0FF000000000FE0FF000000001FE0FF000000001FC0FF000000003F807F0000
+00007F807F000000007F007F00000000FE007F00000001FC003F80000001F8003F800000
+03F8001F80000007F0001FC000000FE0000FC000001F800007E000003F000007F000007E
+000003F00001F8000001FC0003F00000007E000FC00000003F807F0000000007FFF80000
+000000FF80000000383D7CBA3F>I<0003FFFFFFF800000007FFFFFFFF80000007FFFFFF
+FFE000000007F8001FF800000007F00003FC00000007F00000FE0000000FF000007F0000
+000FF000007F0000000FE000003F8000000FE000003F8000001FE000003FC000001FE000
+003FC000001FC000003FC000001FC000003FC000003FC000003FC000003FC000007F8000
+003F8000007F8000003F8000007F8000007F800000FF0000007F800000FE0000007F0000
+01FC0000007F000003F8000000FF000007F0000000FF00000FE0000000FE00001F800000
+00FE00007F00000001FE0007F800000001FFFFFFE000000001FFFFFF0000000001FC000F
+C000000003FC0003F000000003FC0001F800000003F80000FC00000003F80000FE000000
+07F80000FE00000007F800007E00000007F000007E00000007F000007F0000000FF00000
+FF0000000FF00000FE0000000FE00000FE0000000FE00000FE0000001FE00001FE000000
+1FE00001FE0000001FC00001FE0000001FC00001FE0000003FC00001FE0000003FC00003
+FE0000003F800003FC0060003F800003FC0060007F800003FC00E0007F800003FC00C000
+7F000003FC01C000FF800001FC0180FFFFFF0001FC0380FFFFFF0000FE0700FFFFFF0000
+7E0E0000000000001FFC00000000000007F0003B3B7DB83F>82 D<0000001FE003800000
+00FFFC0300000003FFFE070000000FE01F8F0000003F0007DF0000007E0001FE000000F8
+0000FE000001F00000FE000003E000007E000003E000007C000007C000003C00000F8000
+003C00000F8000003C00001F8000003800001F0000003800001F0000003800001F000000
+3800003F0000003000003F0000003000003F8000003000003F8000000000003FC0000000
+00003FE000000000001FF000000000001FFE00000000001FFFE0000000000FFFFE000000
+0007FFFFC000000003FFFFF000000001FFFFF800000000FFFFFC000000001FFFFE000000
+0003FFFF00000000003FFF000000000003FF800000000000FF8000000000007F80000000
+00003F8000000000001F8000000000001F8000000000001F80000C0000001F80000C0000
+000F80000C0000000F80001C0000001F80001C0000001F00001C0000001F00001C000000
+1F00003C0000003E00003C0000003E00003C0000007C00003E000000F800007E000000F8
+00007F000001F000007F800003E000007FC0000FC00000F9F0001F800000F0FE00FE0000
+00E03FFFF8000000E00FFFE0000000C001FF00000000313D7CBA33>I<0000E00001F800
+03F80003F80003F80003F00001C000000000000000000000000000000000000000000000
+000000000000000000000000000000F80003FE00070F000E0F801C0F80180F80380F8030
+0F80701F80601F80603F80E03F00C03F00C07F00007E00007E0000FE0000FC0001FC0001
+FC0001F80003F80003F00003F00007F01807E01807E0380FE0300FC0300FC0700F80600F
+80E00F80C00F81C00F838007870003FE0000F80015397EB71D>105
+D<0007E001F000001FF807FE0000783E0E0F0000E01F1C0F0001C01F383F8003800FF03F
+8003000FE03F8007000FE03F000E000FC03F000C000FC01C000C001FC000001C001F8000
+0018001F80000018001F80000000003F80000000003F80000000003F00000000003F0000
+0000007F00000000007F00000000007E00000000007E0000000000FE0000000000FE0000
+000000FC000C000000FC000C000001FC001C000001FC0018001C01F80018007E01F80038
+007E03F8007000FE03F8006000FE07F800E000FE0E7C01C000781C7C03800078383E0F00
+003FF00FFC000007C003F0000029267EA42F>120 D E /Fw 139[28
+32 37 1[46 42 46 69 23 2[23 46 42 1[37 46 37 46 42 12[55
+46 2[51 65 8[51 1[60 2[60 18[21 46[{}24 83.333336 /Times-Bold
+rf /Fx 133[44 50 50 1[50 55 33 39 44 55 55 50 55 83 28
+2[28 55 50 33 44 55 44 1[50 12[66 3[61 78 72 4[39 4[72
+1[66 12[50 50 50 50 50 2[25 46[{}35 100.000000 /Times-Bold
+rf /Fy 135[40 2[40 40 40 2[40 2[40 3[40 2[40 40 40 40
+1[40 50[40 46[{}13 66.666664 /Courier rf /Fz 69[29 8[33
+1[37 37 3[29 47[29 33 33 48 33 33 18 26 22 33 33 33 33
+52 18 33 1[18 33 33 22 29 33 29 33 29 8[48 63 48 48 41
+37 44 48 37 48 48 59 41 1[26 22 1[48 37 41 48 44 1[48
+5[18 1[33 33 33 33 33 33 33 33 33 33 1[17 22 17 2[22
+22 40[{}67 66.666664 /Times-Roman rf /FA 2 122 df<0060000070000060000060
+00406020E06070F861F07C63E00F6F0003FC0000600003FC000F6F007C63E0F861F0E060
+7040602000600000600000700000600014157B9620>3 D<00600000F00000F00000F000
+00F00000F00000F0000060000060000060000060000060000060007861E0FFFFF0FFFFF0
+7861E000600000600000600000600000F00000F00000F00000F00000F00000F00000F000
+00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000
+006000006000006000006000006000006000006000142F7CA31E>121
+D E /FB 81[66 53[60 86 1[66 40 47 53 1[66 60 66 100 33
+66 1[33 66 60 40 53 66 53 66 60 10[86 1[80 1[86 1[73
+6[47 3[80 1[86 1[86 6[40 3[60 60 60 60 60 60 3[40 45[{}38
+119.999947 /Times-Bold rf /FC 78[50 55[50 50 1[50 50
+28 39 33 1[50 50 50 78 3[28 50 1[33 44 50 44 50 44 11[72
+61 55 14[72 66 66 72 92 7[50 50 4[50 50 2[25 1[25 44[{}34
+100.000000 /Times-Roman rf /FD 4 122 df<00007000000000F800000000F8000000
+00F800000000F800000000F800000000F800000000F800000000F8000000007000007800
+7000F07C007001F0FF007007F87F80700FF03FE0703FE00FF0707F8003F870FE0000FE73
+F800003F77E000000FFF80000003FE00000000F800000003FE0000000FFF8000003F77E0
+0000FE73F80003F870FE000FF0707F803FE0703FE07F80700FF0FF007007F87C007001F0
+78007000F000007000000000F800000000F800000000F800000000F800000000F8000000
+00F800000000F800000000F800000000700000252B7AAD32>3 D<0000000FE0000000FF
+E0000003FC0000000FE00000003FC00000007F80000000FF00000000FE00000001FC0000
+0001FC00000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000003F800000003F800000003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000007F000000007F00000000FE00000001FE00000
+003FC00000007F80000000FE00000007F8000000FFE0000000FFE000000007F800000000
+FE000000007F800000003FC00000001FE00000000FE000000007F000000007F000000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000003F800000003F80000
+0003F800000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000001FC00000001FC00000000FE00000000FF000000007F80000000
+3FC00000000FE000000003FC00000000FFE00000000FE0236479CA32>102
+D<FE00000000FFE000000007F800000000FE000000007F800000003FC00000001FE00000
+000FE000000007F000000007F000000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000003F800000003F800000003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000001FC00000001FC0000
+0000FE00000000FF000000007F800000003FC00000000FE000000003FC00000000FFE000
+0000FFE0000003FC0000000FE00000003FC00000007F80000000FF00000000FE00000001
+FC00000001FC00000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000003F800000003F80000
+0003F800000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000007F000000007F00000000FE00000001F
+E00000003FC00000007F80000000FE00000007F8000000FFE0000000FE00000000236479
+CA32>I<0001C000000007F000000007F000000007F000000007F000000007F000000007
+F000000007F000000007F000000007F000000007F000000003E000000003E000000003E0
+00000003E000000003E000000003E000000003E000000001C000000001C000000001C000
+000001C000000001C000000001C000003E01C03E00FFE1C3FF80FFFFFFFF80FFFFFFFF80
+FFFFFFFF80FFE1C3FF803E01C03E000001C000000001C000000001C000000001C0000000
+03E000000003E000000003E000000003E000000003E000000007F000000007F000000007
+F000000007F000000007F000000007F000000007F000000007F000000007F000000007F0
+00000007F000000007F000000007F000000007F000000007F000000007F000000007F000
+000007F000000007F000000007F000000007F000000007F000000007F000000007F00000
+0007F000000007F000000003E000000003E000000003E000000003E000000003E0000000
+03E000000003E000000003E000000003E000000003E000000003E000000003E000000003
+E000000003E000000003E000000001C000000001C000000001C000000001C000000001C0
+00000001C000000001C000000001C000000001C000000001C00000215B7BC52C>121
+D E /FE 81[80 51[64 72 1[104 1[80 48 56 64 1[80 72 80
+120 40 80 1[40 2[48 64 1[64 1[72 13[80 104 112 88 112
+8[88 4[104 6[48 58[{}27 144.000000 /Times-Bold rf /FF
+81[42 51[32 37 37 55 37 42 23 32 32 42 42 42 42 60 23
+37 23 23 42 42 23 37 42 37 42 42 9[69 51 60 46 42 51
+60 51 60 1[69 3[28 1[60 51 51 60 55 51 51 6[28 42 42
+42 42 2[42 42 42 2[21 28 21 44[{}56 83.333336 /Times-Italic
+rf /FG 47[83 13[28 7[37 8[42 1[46 46 3[37 47[37 42 42
+60 42 42 23 32 28 42 42 42 42 65 23 42 23 23 42 42 28
+37 42 37 42 37 3[28 1[28 2[60 78 60 60 51 46 55 60 46
+60 60 74 51 60 32 28 60 60 46 51 60 55 55 60 1[37 3[23
+23 42 42 42 42 42 42 42 42 42 42 23 21 28 21 47 1[28
+28 28 1[69 37[{}81 83.333336 /Times-Roman rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop -112 -352 3537 4 v -112 -227 4 125 v -84 -270
+a FG(In)20 b FF(Pr)m(oceedings)e(1)-6 b(1th)20 b(International)e
+(Confer)m(ence)h(on)h(Data)f(Engineering)p FG(,)f(pages)i(201\261210,)d
+(T)-6 b(aipei,)20 b(March)g(1995)p 3421 -227 V -112 -224
+3537 4 v 685 286 a FE(Prairie:)46 b(A)35 b(Rule)g(Speci\256cation)e
+(Framework)1267 469 y(for)i(Query)f(Optimizers)2600 417
+y FD(\003)-17 b(y)1160 710 y FC(Dinesh)24 b(Das)650 b(Don)25
+b(Batory)1262 826 y(Department)g(of)g(Computer)f(Sciences)1274
+942 y(The)h(University)f(of)g(T)-7 b(exas)25 b(at)g(Austin)1417
+1058 y(Austin,)f(T)-7 b(exas)24 b(78712\2611)l(188)1358
+1175 y FD(f)p FC(ddas,batory)p FD(g)p FC(@cs.utexas.edu)-112
+1500 y FB(Abstract)-112 1692 y FF(Fr)m(om)h(our)h(experience,)g(curr)m
+(ent)g(rule-based)f(query)g(optimizers)-112 1791 y(do)c(not)h(pr)m
+(ovide)g(a)g(very)h(intuitive)f(and)f(well-de\256ned)g(framework)-112
+1891 y(to)30 b(de\256ne)g(rules)h(and)e(actions.)57 b(T)-8
+b(o)32 b(r)m(emedy)e(this)h(situation,)h(we)-112 1991
+y(pr)m(opose)23 b(an)g(extensible)h(and)g(structur)m(ed)g(algebraic)f
+(framework)-112 2090 y(called)f(Prairie)h(for)h(specifying)e(rules.)35
+b(Prairie)24 b(facilitates)f(rule-)-112 2190 y(writing)h(by)f(enabling)
+f(a)i(user)g(to)g(write)h(rules)f(and)f(actions)g(mor)m(e)-116
+2289 y(quickly)-5 b(,)16 b(corr)m(ectly)g(and)g(in)h(an)f
+(easy-to-understand)d(and)i(easy-to-)-112 2389 y(debug)j(manner)-9
+b(.)-29 2492 y(Query)24 b(optimizers)h(consist)g(of)g(thr)m(ee)g(major)
+f(parts:)36 b(a)25 b(sear)m(ch)-116 2592 y(space,)17
+b(a)h(cost)f(model)g(and)f(a)i(sear)m(ch)f(strategy)-5
+b(.)26 b(The)18 b(appr)m(oach)d(we)-113 2691 y(take)k(is)i(only)e(to)h
+(develop)e(the)i(algebra)f(which)g(de\256nes)g(the)h(sear)m(ch)-112
+2791 y(space)29 b(and)g(the)h(cost)g(model)f(and)g(use)h(the)g(V)-9
+b(olcano)28 b(optimizer)n(-)-112 2891 y(generator)c(as)i(our)f(sear)m
+(ch)h(engine.)41 b(Using)26 b(Prairie)g(as)g(a)f(fr)m(ont-)-112
+2990 y(end,)j(we)h(translate)e(Prairie)h(rules)g(to)g(V)-9
+b(olcano)26 b(to)h(validate)g(our)-112 3090 y(claim)20
+b(that)g(Prairie)g(makes)g(it)h(easier)g(to)f(write)i(rules.)-33
+3193 y(W)-8 b(e)18 b(describe)e(our)h(algebra)f(and)g(pr)m(esent)h
+(experimental)f(r)m(esults)-118 3293 y(which)f(show)h(that)f(using)g(a)
+h(high-level)e(framework)i(like)f(Prairie)h(to)-117 3392
+y(design)e(lar)m(ge-scale)h(optimizers)i(does)e(not)h(sacri\256ce)f
+(ef\256ciency)-5 b(.)-112 3691 y FB(1)119 b(Intr)n(oduction)-119
+3883 y FG(Query)13 b(optimization)f([8])i(is)h(a)g(fundamental)d(part)i
+(of)g(database)g(sys-)-112 3982 y(tems.)26 b(It)20 b(is)h(the)f
+(process)g(of)f(generating)f(an)i(ef)o(\256cient)f(access)i(plan)-112
+4082 y(for)i(a)i(database)f(query)-5 b(.)37 b(Informally)-5
+b(,)22 b(an)i(access)h(plan)f(is)h(an)f(exe-)-112 4181
+y(cution)g(strategy)h(for)g(a)h(query;)g(it)g(is)h(the)e(sequence)g(of)
+g(low-level)-112 4281 y(database)e(retrieval)h(operations)f(that,)i
+(when)f(executed,)g(produce)-112 4381 y(the)f(database)g(records)f
+(that)i(satisfy)f(the)h(query)-5 b(.)34 b(There)23 b(are)g(three)-112
+4480 y(basic)h(aspects)h(that)f(de\256ne)g(and)g(in\257uence)f(query)g
+(optimization:)-112 4580 y(the)d(search)f(space,)h(the)h(cost)f(model,)
+f(and)h(the)g(search)g(strategy)-5 b(.)-30 4683 y(The)20
+b FF(sear)m(ch)f(space)h FG(is)g(the)g(set)h(of)e(logically)g
+(equivalent)g(access)-112 4783 y(plans)27 b(that)g(can)h(be)f(used)g
+(to)h(evaluate)f(a)g(query)-5 b(.)47 b(All)28 b(plans)g(in)f(a)p
+-112 4867 788 4 v -29 4921 a FA(\003)7 4944 y Fz(This)18
+b(research)h(was)f(supported)i(in)e(part)h(by)f(grants)h(from)e(The)h
+(University)i(of)-112 5023 y(T)-5 b(exas)23 b(Applied)h(Research)h
+(Laboratories,)h(Schlumber)o(ger)m(,)g(and)d(Digital)h(Equip-)-112
+5102 y(ment)17 b(Corporation.)-26 5160 y FA(y)7 5184
+y Fz(An)d(expanded)j(version)f(of)f(this)g(paper)h(is)e(available)k(as)
+d(T)-5 b(echnical)17 b(Report)f(TR)-112 5263 y(94\26116)h(by)g
+(anonymous)h(ftp)f(from)g Fy(ftp.cs.utexas.edu)p Fz(.)2044
+1500 y FG(query')-5 b(s)20 b(search)g(space)h(return)e(the)i(same)g
+(result;)g(however)m(,)e(some)2042 1600 y(plans)g(are)f(more)g(ef)o
+(\256cient)g(than)h(others.)25 b(The)19 b FF(cost)g(model)f
+FG(assigns)2043 1699 y(a)i(cost)g(to)g(each)f(plan)g(in)h(the)f(search)
+h(space.)26 b(The)19 b(cost)h(of)g(a)g(plan)f(is)2041
+1799 y(an)f(estimate)g(of)g(the)g(resources)f(used)g(when)h(the)g(plan)
+f(is)i(executed;)2040 1899 y(the)e(lower)g(the)g(cost,)h(the)f(better)g
+(the)g(plan.)25 b(The)17 b FF(sear)m(ch)g(strategy)g
+FG(is)2044 1998 y(a)23 b(speci\256cation)f(of)h(which)f(plans)h(in)g
+(the)g(search)f(space)h(are)g(to)g(be)2044 2098 y(examined.)2127
+2197 y(T)m(raditionally)-5 b(,)18 b(query)h(optimizers)h(have)g(been)g
+(built)g(as)i(mono-)2044 2297 y(lithic)i(subsystems)f(of)h(a)g(DBMS.)g
+(This)g(simply)f(re\257ects)h(the)g(fact)2040 2397 y(that)18
+b(traditional)e(database)h(systems)h(are)f(themselves)g(monolithic:)
+2043 2496 y(the)i(algorithms)f(used)g(for)h(storing)f(and)h(retrieving)
+e(data)i(are)h(hard-)2044 2596 y(wired)25 b(and)f(are)i(rather)e(dif)o
+(\256cult)g(to)i(change.)41 b(The)25 b(need)f(to)i(have)2041
+2696 y(extensible)18 b(database)f(systems,)i(and)f(in)g(turn)f
+(extensible)h(optimiz-)2044 2795 y(ers,)27 b(has)f(long)f(been)h
+(recognized)d(in)j(systems)h(like)f(Genesis)g([1],)2039
+2895 y(EXODUS)17 b([9],)g(Starburst)e([10],)h(and)g(Postgres)h([12].)24
+b(Rule-based)2043 2994 y(query)19 b(optimizers)g(are)h(among)e(the)i
+(major)f(conceptual)g(advances)2044 3094 y(that)28 b(have)g(been)g
+(proposed)f(to)i(deal)f(with)h(query)e(optimizer)g(ex-)2044
+3194 y(tensibility)d([6,)13 b(7,)g(9,)g(10].)39 b(The)24
+b(extensibility)f(translates)i(into)f(the)2044 3293 y(ability)e(to)g
+(incorporate)e(new)i(operators,)f(algorithms,)h(cost)g(mod-)2044
+3393 y(els,)27 b(or)e(search)g(strategies)g(without)f(changing)g(the)h
+(optimization)2044 3493 y(algorithm.)2127 3592 y(In)c(this)h(paper)m(,)
+e(we)i(describe)e(an)i(algebraic)e(framework)f(called)2042
+3692 y FF(Prairie)h FG(for)e(specifying)g(rules)h(in)g(a)g(rule-based)f
+(query)f(optimizer)-5 b(.)2044 3791 y(Prairie)27 b(is)h(similar)f(to)g
+(other)f(rule)h(speci\256cation)f(languages)g(like)2044
+3891 y(Starburst)d([10])f(and)h(V)-11 b(olcano)22 b([7],)i(and)f
+(indeed,)g(we)h(have)e(based)2044 3991 y(our)i(work)g(on)h(V)-11
+b(olcano)24 b(to)h(capture)e(most)i(of)g(the)g(advantages)e(of)2040
+4090 y(rule-based)16 b(optimizers.)25 b(However)m(,)16
+b(Prairie)h(attempts)g(to)g(provide)2040 4190 y(some)g(key)g(features)f
+(that,)i(we)g(have)e(found,)g(simplify)h(the)g(ef)o(fort)e(in)2044
+4290 y(writing)k(rules:)2106 4466 y(1.)41 b(A)26 b(framework)e(in)i
+(which)g(users)g(can)g(de\256ne)g(a)g(query)f(opti-)2210
+4565 y(mizer)c(concisely)f(in)h(terms)g(of)g(a)h(well-de\256ned)d(set)j
+(of)f(oper)n(-)2210 4665 y(ators)g(and)g(algorithms.)29
+b FF(All)22 b FG(operators)e(and)h(algorithms)f(are)2210
+4764 y(considered)f(\256rst-class)i(objects,)g(i.e.,)f
+FF(any)g FG(of)h(them)f(can)g(oc-)2210 4864 y(cur)15
+b(in)g(any)g(rule,)h(and)f FF(only)g FG(these)h(operators)d(and)i
+(algorithms)2210 4964 y(can)25 b(appear)f(in)h(rules.)42
+b(This)26 b(scheme)e(eliminates)i(the)f(need)2210 5063
+y(for)17 b(special)h(classes)i(of)d(operators)g(and)h(algorithms,)f
+(such)g(as)2210 5163 y(enforcers)i(in)i(V)-11 b(olcano)19
+b(and)h(glue)g(in)h(Starburst,)f(that)h(signif-)2210
+5263 y(icantly)f(complicate)f(rule)g(speci\256cation.)p
+eop
+%%Page: 2 2
+2 1 bop -50 21 a FG(2.)41 b(A)17 b(framework)d(in)j(which)f(users)h
+(can)f(de\256ne)g(a)h(list)h(of)f(proper)n(-)54 120 y(ties)g(to)f
+(characterize)f(the)h(expressions)f(generated)f(in)i(the)h(op-)54
+220 y(timization)g(process.)26 b(Again,)18 b(the)h(goal)e(here)h(is)i
+(to)e(allow)h(the)54 319 y(user)h(to)h(treat)g FF(all)g
+FG(properties)e(as)j(having)d(equal)h(status.)30 b(This)54
+419 y(is)22 b(dif)o(ferent)d(from)h(V)-11 b(olcano)20
+b(where)g(the)i(user)e(must)i(classify)54 519 y(properties)30
+b(as)i(logical,)h(physical,)h(or)d(operator/algorithm)54
+618 y(ar)o(guments.)-50 790 y(3.)41 b(A)h(framework)d(in)j(which)f
+(users)g(can)h(specify)f(mapping)54 889 y(functions)30
+b(between)h(properties)f(concomitantly)f(with)j(the)54
+989 y(corresponding)23 b(rules.)47 b(This)28 b(contrasts)e(with)i
+(existing)e(ap-)54 1088 y(proaches)32 b(in)i(which)g(mappings)e
+(between)h(properties)g(are)54 1188 y(fragmented)14 b(into)i(multiple)g
+(functions)f(and)h(at)h(logically)e(dif-)54 1288 y(ferent)27
+b(places)h(than)g(the)g(corresponding)d(rules.)51 b(Research)54
+1387 y(into)24 b(rule-based)f(optimizers)h(has)h(revealed)e(that)i
+(property-)54 1487 y(mapping)16 b(functions)h(are)h(a)h(major)e(source)
+h(of)f(user)i(ef)o(fort,)d(so)54 1587 y(this)k(is)h(an)g(important)d
+(goal.)-50 1758 y(4.)41 b(The)16 b(format)h(\(Prairie\))f(in)i(which)e
+(users)i(can)f(cleanly)f(specify)54 1857 y(rules)e(is)i(not)e
+(necessarily)h(the)f(same)h(format)f(needed)g(for)g(gen-)54
+1957 y(erating)25 b(ef)o(\256cient)g(optimizers.)43 b(Thus,)27
+b(there)e(is)i(a)f(need)f(for)54 2057 y(a)c(pre-processor)e(\(written)h
+(by)h(us\))g(that)g(translates)h(between)54 2156 y(these)e(competing)e
+(representations.)-29 2344 y(Prairie)26 b(strives)h(for)e(uniformity)g
+(in)h(dealing)g(with)g(issues)i(that)-114 2444 y(have)18
+b(been)g(a)i(source)e(of)g(most)h(user)g(ef)o(fort)e(and)i(potential)f
+(user)g(er)n(-)-117 2543 y(rors.)26 b(In)16 b(the)h(following)e
+(sections,)i(we)g(present)f(the)h(Prairie)f(frame-)-112
+2643 y(work.)26 b(W)-7 b(e)22 b(explain)d(how)h(our)f(P2V)i
+(pre-processor)d(maps)i(Prairie)-112 2742 y(rule)i(speci\256cations)h
+(into)g(V)-11 b(olcano)23 b(rule)g(speci\256cations)g(that)g(can)-118
+2842 y(be)16 b(processed)f(ef)o(\256ciently)-5 b(.)24
+b(Experimental)14 b(results)i(to)g(support)e(this)-120
+2942 y(claim)g(are)g(given)f(in)h(Section)g(4,)h(where)e(we)i(compare)d
+(implementa-)-117 3041 y(tions)17 b(of)g(the)f(T)-6 b(exas)17
+b(Instruments)e(Open)h(OODB)i(query)d(optimizer)-112
+3141 y(using)24 b(both)h(Prairie)g(and)g(V)-11 b(olcano.)41
+b(W)-7 b(e)26 b(conclude)e(with)h(a)h(sum-)-112 3241
+y(mary)19 b(and)h(related)f(research.)-117 3527 y FB(2)120
+b(Prairie:)37 b(A)26 b(language)f(for)g(rule)h(speci\256-)67
+3677 y(cation)-112 3864 y FG(The)c(basic)h(concepts)f(and)h
+(de\256nitions)f(that)h(underlie)f(the)h(Prairie)-118
+3964 y(model)14 b(are)i(presented)e(in)i(this)g(section.)25
+b(The)15 b(goal)g(is)h(to)g(lay)f(a)h(foun-)-117 4064
+y(dation)g(for)h(reasoning)e(about)h(query)f(optimization)g
+(algebraically;)-112 4163 y(this)21 b(is)i(necessary)d(for)h(our)f
+(subsequent)g(discussion)h(about)f(trans-)-112 4263 y(lating)f(Prairie)
+h(speci\256cations)g(to)h(those)f(of)f(V)-11 b(olcano.)-112
+4507 y Fx(2.1)99 b(Notation)24 b(and)i(assumptions)-114
+4665 y Fw(Stor)o(ed)19 b(Files)h(and)f(Str)o(eams.)82
+b FG(A)20 b(\256le)f(is)i FF(stor)m(ed)g FG(if)e(its)h(tuples)f(re-)
+-112 4764 y(side)h(on)g(disk.)27 b(In)20 b(the)h(case)g(of)f
+(relational)f(databases,)h(stored)g(\256les)-116 4864
+y(are)c(sometimes)h(called)g FF(base)f(r)m(elations)p
+FG(;)i(we)f(will)h(denote)e(them)g(by)-118 4964 y Fv(R)i
+FG(or)d Fv(R)111 4976 y Fu(i)139 4964 y FG(.)26 b(In)16
+b(object-oriented)d(schemas,)k(stored)e(\256les)i(are)f
+FF(classes)p FG(;)-112 5063 y(we)21 b(will)i(denote)d(them)h(by)g
+FF(C)i FG(or)e FF(C)918 5075 y Fu(i)946 5063 y FG(.)31
+b(Henceforth,)20 b(whenever)f(we)-115 5163 y(refer)f(to)g(a)h(stored)f
+(\256le,)h(we)g(mean)e(a)i(relation)f(or)g(a)g(class;)i(when)e(the)-118
+5263 y(distinction)c(is)i(unimportant,)d(we)j(will)g(use)f
+Fv(F)28 b FG(or)15 b Fv(F)1365 5275 y Fu(i)1393 5263
+y FG(.)26 b(A)16 b FF(str)m(eam)f FG(is)h(a)2042 21 y(sequence)i(of)h
+(tuples)g(and)f(is)i(the)f(result)g(of)g(a)g(computation)e(on)h(one)
+2037 120 y(or)d(more)f(streams)h(or)f(stored)h(\256les;)i(tuples)e(of)g
+(streams)g(are)f(returned)2044 220 y(one)20 b(at)i(a)f(time,)g
+(typically)f(on)g(demand.)28 b(Streams)21 b(can)g(be)f
+FF(named)p FG(,)2044 319 y(denoted)e(by)i Fv(S)2482 331
+y Fu(i)2510 319 y FG(,)g(or)g FF(unnamed)p FG(.)2044
+536 y Fw(Database)f(Operations.)82 b FG(An)20 b FF(operation)f
+FG(is)i(a)g(computation)d(on)2044 635 y(one)j(or)h(more)f(streams)i(or)
+f(stored)f(\256les.)34 b(There)21 b(are)h(two)g(types)g(of)2043
+735 y(database)c(operations)g(in)h(Prairie:)27 b(abstract)19
+b(\(or)g(implementation-)2043 835 y(unspeci\256ed\))g(operators)f(and)h
+(concrete)g(algorithms.)26 b(Each)19 b(is)i(de-)2044
+934 y(tailed)f(below)-5 b(.)2210 1103 y Fw(Operators.)39
+b FG(Abstract)28 b(\(or)f(conceptual\))e FF(operators)i
+FG(spec-)2392 1203 y(ify)c(computations)e(on)i(streams)g(or)g(stored)g
+(\256les;)j(they)2392 1302 y(are)38 b(denoted)d(by)i(all)h(capital)f
+(letters)h(\(e.g.,)i(JOIN\).)2392 1402 y(Operators)25
+b(have)h(two)g(types)g(of)f(parameters:)38 b(essen-)2392
+1502 y(tial)k(and)f(additional.)88 b FF(Essential)41
+b(parameters)g FG(are)2392 1601 y(the)c(stream)g(or)f(\256le)h(inputs)f
+(to)h(an)g(operator;)43 b(these)2392 1701 y(are)d(the)f(primary)f
+(inputs)h(to)g(be)h(processed)e(by)h(an)2392 1800 y(operator)-5
+b(.)31 b FF(Additional)20 b(parameters)i FG(are)g(\252\256ne-grain\272)
+2392 1900 y(quali\256cations)k(of)g(an)g(operator;)h(their)f(purpose)f
+(is)i(to)2392 2000 y(describe)19 b(an)g(operator)f(in)i(more)e(detail)i
+(than)f(essential)2392 2099 y(parameters.)2210 2223 y
+Fw(Algorithms.)40 b FF(Algorithms)75 b FG(are)h(concrete)e(implemen-)
+2392 2323 y(tations)46 b(of)f(conceptual)e(operators;)56
+b(they)45 b(will)h(be)2392 2422 y(represented)40 b(in)h(lower)g(case)g
+(with)h(the)f(\256rst)h(letter)2392 2522 y(capitalized)50
+b(\(e.g.,)56 b(Nested)p 3265 2522 25 4 v 29 w(loops\).)115
+b(Algorithms)2392 2621 y(have)34 b(at)g(least)h(the)f(same)g(essential)
+g(and)f(additional)2392 2721 y(parameters)24 b(as)h(the)f(conceptual)e
+(operators)h(that)i(they)2392 2821 y(implement.)2770
+2791 y Ft(1)2897 2821 y FG(Furthermore,)45 b(there)c(can)g(be,)47
+b(and)2392 2920 y(usually)35 b(are,)j(several)c(algorithms)g(for)g(a)h
+(particular)2392 3020 y(operator)-5 b(.)2044 3189 y(T)f(able)26
+b(1)h(lists)h(some)e(operators)f(and)h(algorithms)f(implementing)2044
+3288 y(them)20 b(together)e(with)j(their)f(additional)f(parameters.)
+2044 3505 y Fw(Operator)i(T)-6 b(r)o(ees.)82 b FG(An)22
+b FF(operator)g(tr)m(ee)h FG(is)g(a)g(rooted)e(tree)h(whose)2044
+3604 y(non-leaf,)27 b(or)g FF(interior)p FG(,)i(nodes)e(are)h(database)
+e(operations)g(\(oper)n(-)2044 3704 y(ators)g(or)g(algorithms\))f(and)g
+(whose)h(leaf)h(nodes)e(are)i(stored)e(\256les.)2044
+3804 y(The)e(children)g(of)g(an)h(interior)e(node)h(in)h(an)g(operator)
+e(tree)h(are)h(the)2044 3903 y(essential)i(parameters)e(\(i.e.,)i(the)g
+(stream)f(or)g(\256le)h(parameters\))e(of)2044 4003 y(the)h(node.)42
+b(Additional)24 b(parameters)h(are)g(implicitly)g(attached)g(to)2039
+4102 y(each)16 b(node.)25 b(Algebraically)-5 b(,)15 b(operator)g(trees)
+i(are)f(compositions)f(of)2039 4202 y(database)g(operations;)h(thus,)g
+(we)h(will)f(also)h(call)f(operator)e(trees)i FF(ex-)2044
+4302 y(pr)m(essions)p FG(;)k(both)g(terms)g(will)h(be)f(used)g
+(interchangeably)-5 b(.)2046 4487 y(E)t Fz(X)t(A)t(M)t(P)t(L)t(E)24
+b FG(1)t(.)150 b(A)23 b(simple)g(expression)f(and)g(its)i(operator)d
+(tree)2044 4587 y(representation)h(are)h(shown)h(in)g(Figure)f(1\(a\).)
+38 b(Relations)24 b Fv(R)3831 4599 y Ft(1)3893 4587 y
+FG(and)2044 4686 y Fv(R)2107 4698 y Ft(2)2171 4686 y
+FG(are)j(\256rst)h(RET)m(rieved,)f(then)f(JOINed,)i(and)e(\256nally)h
+(SOR)-5 b(T)f(ed)2044 4786 y(resulting)13 b(in)h(a)h(stream)f(sorted)g
+(on)g(a)g(speci\256c)h(attribute.)24 b(The)14 b(\256gure)2044
+4886 y(shows)g(only)f(the)h(essential)h(parameters)e(of)h(the)g
+(various)f(operators,)2044 4985 y(not)20 b(the)g(additional)f
+(parameters.)915 b Fs(\003)p 2044 5107 788 4 v 2129 5160
+a Fr(1)2163 5184 y Fz(Algorithms)20 b(may)e(have)h Fq(tuning)g
+(parameters)h Fz(which)f(are)f(not)h(parameters)h(of)2044
+5263 y(the)e(operators)g(they)g(implement.)p eop
+%%Page: 3 3
+3 2 bop -112 71 2323 13 v -112 138 4 67 v -59 118 a Fp(Operator)p
+330 138 V 211 w(Description)p 912 138 V 294 w(Additional)17
+b(Parameters)p 1582 138 V 102 w(Algorithm)p 2207 138
+V -112 150 2323 13 v -112 217 4 67 v -59 232 a Fo(JOIN\()p
+Fu(S)127 240 y Fn(1)159 232 y Fo(,)d Fu(S)229 240 y Fn(2)261
+232 y Fo(\))p 330 217 V 104 w(Join)g(streams)g Fu(S)728
+240 y Fn(1)760 232 y Fo(,)g Fu(S)830 240 y Fn(2)p 912
+217 V 965 197 a Fo(tuple)p 1084 197 18 4 v 22 w(order)p
+1582 217 4 67 v 410 w(Nested)p 1800 197 18 4 v 20 w(loops\()p
+Fu(S)2003 205 y Fn(1)2036 197 y Fo(,)g Fu(S)2106 205
+y Fn(2)2138 197 y Fo(\))p 2207 217 4 67 v 1585 220 626
+4 v -112 283 4 67 v 330 283 V 912 283 V 965 263 a(join)p
+1058 263 18 4 v 22 w(predicate)p 1582 283 4 67 v 345
+w(Mer)o(ge)p 1789 263 18 4 v 20 w(join\()p Fu(S)1956
+271 y Fn(1)1989 263 y Fo(,)g Fu(S)2059 271 y Fn(2)2092
+263 y Fo(\))p 2207 283 4 67 v -112 286 2323 4 v -112
+363 4 77 v -59 407 a(RET\()p Fu(F)9 b Fo(\))p 330 363
+V 384 412 a(Retrieve)14 b(\256le)h Fu(F)p 912 363 V 965
+339 a Fo(tuple)p 1084 339 18 4 v 22 w(order)p 1582 363
+4 77 v 1635 353 a(File)p 1728 353 18 4 v 21 w(scan\()p
+Fu(F)9 b Fo(\))p 2207 363 4 77 v -112 429 4 67 v 330
+429 V 912 429 V 965 410 a(selection)p 1175 410 18 4 v
+21 w(predicate)p 1582 429 4 67 v 1585 397 622 4 v 2207
+429 4 67 v -112 497 4 68 v 330 497 V 912 497 V 965 477
+a(projected)p 1184 477 18 4 v 22 w(attributes)p 1582
+497 4 68 v 1635 469 a(Index)p 1770 469 18 4 v 21 w(scan\()p
+Fu(F)g Fo(\))p 2207 497 4 68 v -112 500 2323 4 v -112
+567 4 67 v -59 582 a(SOR)m(T\()p Fu(S)147 590 y Fn(1)178
+582 y Fo(\))p 330 567 V 384 583 a(Sort)15 b(stream)f
+Fu(S)705 591 y Fn(1)p 912 567 V 965 580 a Fo(tuple)p
+1084 580 18 4 v 22 w(order)p 1582 567 4 67 v 1635 547
+a(Mer)o(ge)p 1789 547 18 4 v 20 w(sort\()p Fu(S)1953
+555 y Fn(1)1986 547 y Fo(\))p 2207 567 4 67 v 1585 570
+626 4 v -112 633 4 67 v 330 633 V 912 633 V 1582 633
+V 1635 613 a(Null\()p Fu(S)1798 621 y Fn(1)1831 613 y
+Fo(\))p 2207 633 V -112 646 2323 13 v -112 793 a FG(T)-6
+b(able)17 b(1:)27 b(Operators)17 b(and)h(algorithms)e(in)j(a)f
+(centralized)f(query)g(optimizer)g(and)-112 893 y(their)i(additional)g
+(parameters)p 2477 33 1525 13 v 2477 99 4 67 v 2530 80
+a Fp(Pr)o(operty)p 3033 99 V 335 w(Description)p 3998
+99 V 2477 112 1525 13 v 2477 178 4 67 v 2530 158 a Fo(join)p
+2623 158 18 4 v 22 w(predicate)p 3033 178 4 67 v 232
+w(join)c(predicate)f(for)h(JOIN)g(operator)p 3998 178
+V 2477 182 1525 4 v 2477 248 4 67 v 2530 228 a(selection)p
+2740 228 18 4 v 21 w(predicate)p 3033 248 4 67 v 116
+w(selection)f(predicate)g(for)i(RET)d(operator)p 3998
+248 V 2477 251 1525 4 v 2477 318 4 67 v 2530 331 a(tuple)p
+2649 331 18 4 v 21 w(order)p 3033 318 4 67 v 3087 298
+a(tuple)h(order)i(of)e(resulting)h(stream,)p 3998 318
+V 2477 384 V 3033 384 V 3087 364 a(DONT)p 3252 364 18
+4 v 20 w(CARE)e(if)i(none)p 3998 384 4 67 v 2477 388
+1525 4 v 2477 454 4 67 v 2530 434 a(num)p 2636 434 18
+4 v 21 w(records)p 3033 454 4 67 v 262 w(number)g(of)g(tuples)f(of)h
+(resulting)g(stream)p 3998 454 V 2477 457 1525 4 v 2477
+524 4 67 v 2530 504 a(tuple)p 2649 504 18 4 v 21 w(size)p
+3033 524 4 67 v 329 w(size)f(of)g(individual)i(tuple)e(in)h(stream)p
+3998 524 V 2477 527 1525 4 v 2477 593 4 67 v 2530 574
+a(projected)p 2749 574 18 4 v 21 w(attributes)p 3033
+593 4 67 v 104 w(projected)f(attributes)h(for)h(RET)d(operator)p
+3998 593 V 2477 597 1525 4 v 2477 663 4 67 v 2530 643
+a(attributes)p 3033 663 V 341 w(list)h(of)h(attributes)p
+3998 663 V 2477 666 1525 4 v 2477 733 4 67 v 2530 713
+a(cost)p 3033 733 V 463 w(estimated)f(cost)g(of)h(algorithm)p
+3998 733 V 2477 745 1525 13 v 2477 893 a FG(T)-6 b(able)16
+b(2:)26 b(Properties)15 b(of)h(nodes)g(in)g(an)h(operator)d(tree)p
+-105 1246 1938 4 v -105 2116 4 870 v 61 1362 a Fm(SOR)n(T)c(\(JOIN)g
+(\(RET)h(\()p Fl(R)449 1374 y Fn(1)481 1362 y Fm(\),)f(RET)h(\()p
+Fl(R)661 1374 y Fn(2)693 1362 y Fm(\)\)\))346 1463 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 3.39499
+0.05246 false .5 12.4799 InitRnode } NewNode end end
+
+346 1463 a Fm(SOR)n(T)353 1557 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 3.39499
+0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 353 1557 a Fm(JOIN)303
+1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303 1732 a 264 1652 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 264 1652 a Fm(RET)453 1652
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 453 1652 a Fm(RET)303 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 303 1732 a 303 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+
+303 1732 a 265 1740 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 265 1740 a Fl(R)308 1752 y Fn(1)455
+1740 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 455 1740 a Fl(R)498 1752 y Fn(2)303 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303
+1732 a 303 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303 1732 a 27 1915 a Fz(\(a\))37 b(An)f(expression)i
+(and)f(its)27 1994 y(corresponding)19 b(operator)g(tree)p
+872 2091 4 820 v 1237 1458 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodemergesort 16 { .5 3.34
+1.07994 false .5 22.25977 InitRnode } NewNode end end
+ 1237 1458 a Fm(Mer)o(ge)p
+1346 1458 13 4 v 16 w(sort)1219 1553 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodenestedloops 16 { .5 3.39499
+1.07994 false .5 26.5197 InitRnode } NewNode end end
+ 1219 1553 a Fm(Nested)p
+1336 1553 13 4 v 16 w(loops)1235 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodemergesort
+/TheNodenestedloops InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1158
+1652 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr1 16 { .5 3.39499
+0.05246 false .5 18.4647 InitRnode } NewNode end end
+ 1158 1652 a Fm(File)p 1225 1652 13 4 v 15 w(scan)1347
+1652 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr2 16 { .5 3.39499
+0.05246 false .5 18.4647 InitRnode } NewNode end end
+ 1347 1652 a Fm(File)p 1414 1652 13 4 v 15 w(scan)1235
+1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodenestedloops
+/TheNodefilescanr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1235 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodenestedloops
+/TheNodefilescanr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1197 1740
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 1197 1740 a Fl(R)1240 1752 y Fn(1)1386 1740 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 1386
+1740 a Fl(R)1429 1752 y Fn(2)1235 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodefilescanr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1235 1732 a
+1235 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodefilescanr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1235 1732 a 959 1915 a Fz(\(b\))h(Possible)i(access)g(plan)
+g(for)959 1994 y(operator)d(tree)f(in)f(\(a\))p 1829
+2116 4 870 v -105 2119 1938 4 v 1831 2136 19 877 v -89
+2136 1938 19 v -25 2319 a FG(Figure)j(1:)27 b(Example)19
+b(of)h(an)g(operator)e(tree)i(and)g(access)h(plan)-117
+2521 y Fw(Descriptors.)83 b FG(A)17 b FF(pr)m(operty)f
+FG(of)h(a)g(node)f(is)i(a)f(\(user)n(-de\256ned\))e(vari-)-112
+2620 y(able)31 b(that)h(contains)f(information)e(used)i(by)h(an)f
+(optimizer)-5 b(.)61 b(An)-112 2720 y FF(annotation)25
+b FG(is)k(a)f Fk(h)p FF(pr)m(operty)-5 b(,)20 b(value)o
+Fk(i)29 b FG(pair)e(that)h(is)h(assigned)e(to)h(a)-112
+2819 y(node.)39 b(A)25 b FF(descriptor)g FG(is)h(a)f(list)h(of)e
+(annotations)f(that)i(describes)f(a)-112 2919 y(node)j(of)g(an)h
+(operator)f(tree;)32 b(every)27 b(node)g(has)h(its)h(own)f(descrip-)
+-112 3019 y(tor)-5 b(.)54 b(As)30 b(an)f(example,)h(T)-6
+b(able)29 b(2)h(lists)g(some)f(typical)g(properties)-112
+3118 y(that)21 b(might)f(be)h(used)f(in)h(a)h(descriptor)-5
+b(.)28 b(Note)21 b(that)g(descriptors)e(for)-112 3218
+y(stream)24 b(and)h(stored)f(\256les)i(may)e(have)h(dif)o(ferent)e
+(properties.)39 b(The)-114 3318 y(following)17 b(notations)h(will)h(be)
+g(useful)f(in)h(our)f(subsequent)g(discus-)-119 3417
+y(sions.)26 b(If)14 b Fv(S)220 3429 y Fu(i)263 3417 y
+FG(is)i(a)g(stream,)f(then)g Fj(D)877 3429 y Fi(i)918
+3417 y FG(is)h(its)g(descriptor)-5 b(.)24 b(Annotations)-112
+3517 y(of)c Fv(S)29 3529 y Fu(i)78 3517 y FG(are)h(accessed)g(by)f(a)i
+(structure)e(member)f(relationship,)h(e.g.,)-113 3616
+y Fj(D)-40 3628 y Fi(i)-14 3616 y Fv(:)p FG(num)p 163
+3616 25 4 v 28 w(records)o(.)27 b(Also,)20 b(let)h Fv(E)k
+FG(be)20 b(an)g(expression)f(and)g(let)h Fj(D)h FG(be)-112
+3716 y(its)g(descriptor)-5 b(.)26 b(W)-7 b(e)21 b(will)g(write)f(this)h
+(as)g Fv(E)28 b Fh(:)23 b Fj(D)p FG(.)-110 3904 y(E)t
+Fz(X)t(A)t(M)t(P)t(L)t(E)h FG(2)t(.)147 b(The)19 b(expression,)-112
+4055 y Fo(SOR)m(T)o Ft(\()p Fo(JOIN)o Ft(\()p Fo(RET)o
+Ft(\()p Fu(R)396 4063 y Fn(1)428 4055 y Ft(\):)p Fi(D)530
+4063 y Fg(3)566 4055 y Fu(;)p Fo(RET)o Ft(\()p Fu(R)772
+4063 y Fn(2)804 4055 y Ft(\):)p Fi(D)906 4063 y Fg(4)942
+4055 y Ft(\):)p Fi(D)1044 4063 y Fg(5)1079 4055 y Ft(\):)p
+Fi(D)1181 4063 y Fg(6)-112 4206 y FG(corresponds)k(to)j(the)f(operator)
+f(tree)i(in)g(Figure)f(1\(a\),)h(and)f(shows)-112 4305
+y(the)20 b(descriptors)f(of)h(the)g(various)f(nodes.)704
+b Fs(\003)-30 4466 y FG(A)19 b(notational)f(simpli\256cation)h(can)g
+(be)g(made)g(here.)26 b(Additional)-117 4565 y(parameters)14
+b(of)i(operators)f(can)h(be)g(treated)f(the)h(same)h(way)f(as)h(other)
+-112 4665 y(properties)i(of)h(a)h(node;)f(essential)h(parameters,)e
+(however)m(,)f(are)j FF(ex-)-115 4764 y(pr)m(essions)p
+FG(.)27 b(Thus,)18 b(the)g(term)g(descriptor)f(in)h(the)g(remainder)f
+(of)h(this)-112 4864 y(paper)24 b(will)i(refer)f(to)h(a)g(set)h(of)e
+(properties,)g(including)f(additional)-112 4964 y(parameters,)18
+b(as)j(shown)f(in)g(T)-6 b(able)20 b(2.)-35 5063 y(Currently)-5
+b(,)15 b(descriptor)f(properties)h(are)g(de\256ned)g(entirely)g(by)g
+(the)-112 5163 y(user;)34 b(however)m(,)c(we)g(envision)f(providing)e
+(a)j(hierarchy)e(of)i(pre-)-112 5263 y(de\256ned)19 b(descriptor)f
+(types)i(to)h(aid)f(this)h(process.)2042 1243 y Fw(Access)e(Plans.)83
+b FG(An)18 b FF(access)h(plan)f FG(is)h(an)g(operator)d(tree)j(in)g
+(which)2044 1343 y(all)i(interior)e(nodes)g(are)h(algorithms.)2046
+1630 y(E)t Fz(X)t(A)t(M)t(P)t(L)t(E)k FG(3)t(.)142 b(An)15
+b(access)h(plan)f(for)f(the)h(operator)f(tree)h(in)g(Fig-)2044
+1729 y(ure)20 b(1\(a\))f(is)i(shown)f(in)g(Figure)f(1\(b\).)826
+b Fs(\003)2044 2047 y Fx(2.2)99 b(Prairie)25 b(optimization)f(paradigm)
+2044 2230 y FG(Prairie)k(admits)f(two)h(rather)g(dif)o(ferent)d(means)j
+(of)g(optimization:)2044 2329 y(top-down)19 b(and)j(bottom-up.)29
+b(A)23 b(top-down)d(query)g(optimizer)h(op-)2041 2429
+y(timizes)d(the)g(parents)g(of)f(a)i(node)d(prior)h(to)h(optimizing)f
+(the)h(node)e(it-)2038 2529 y(self.)25 b(A)16 b(bottom-up)d(optimizer)h
+(optimizes)g(the)i(children)e(of)g(a)i(node)2044 2628
+y(prior)22 b(to)i(optimizing)d(the)j(node.)35 b(The)23
+b(earliest)h(optimizers)e(\(Sys-)2044 2728 y(tem)e(R)h([1)m(1])e(and)h
+(R)2617 2698 y Ff(\003)2676 2728 y FG([3]\))f(employed)f(the)j
+(bottom-up)c(approach.)2126 2842 y(Our)i(research)f(concentrates)g(on)h
+(a)h(top-down)e(optimization)f(of)2044 2942 y(operator)24
+b(trees.)46 b(W)-7 b(e)28 b(have)d(chosen)h(this)h(approach)d(because)i
+(we)2044 3042 y(intend)d(to)h(translate)g(Prairie)g(rules)g(into)f(the)
+h(format)f(required)f(by)2044 3141 y(the)28 b(V)-11 b(olcano)28
+b(query)f(optimizer)g(generator)f([7])i(which)g(is)h(based)2044
+3241 y(on)h(a)h(top-down)d(strategy)-5 b(.)56 b(Given)30
+b(an)g(appropriate)e(search)i(en-)2044 3340 y(gine,)24
+b(Prairie)f(can)g(potentially)g(also)h(be)f(used)h(with)f(a)i
+(bottom-up)2043 3440 y(optimization)18 b(strategy;)i(however)m(,)d(we)k
+(will)f(not)g(discuss)g(this)g(ap-)2044 3540 y(proach)e(in)j(this)f
+(paper)-5 b(.)2125 3654 y(In)18 b(query)g(optimization,)f(there)h(are)g
+(certain)g(annotations)g(\(such)2044 3754 y(as)29 b(additional)f
+(parameters\))f(that)i(are)g(known)e(before)g(any)i(opti-)2037
+3853 y(mization)14 b(is)i(begun.)23 b(These)15 b(annotations)e(can)i
+(be)f(computed)f(at)j(the)2043 3953 y(time)j(that)g(the)g(operator)f
+(tree)h(is)h(initialized,)f(and)g(will)h(not)f(change)2040
+4052 y(with)f(application)d(of)i(rules.)26 b(Our)17 b(following)f
+(discussions)h(assume)2044 4152 y(operator)h(trees)j(are)f
+(initialized.)2127 4266 y(There)41 b(are)h(two)h(types)f(of)g
+(algebraic)f(transformations)f(\(or)2044 4366 y FF(r)m(ewrite)34
+b(rules)p FG(\))e(in)h(Prairie:)52 b(T)-8 b(-rules)32
+b(\(\252transformation)e(rules\272\))2044 4466 y(and)22
+b(I-rules)f(\(\252implementation)f(rules\272\).)33 b(Each)22
+b(rule)g(transforms)2044 4565 y(an)j(expression)g(into)g(another)f
+(based)i(on)f(additional)f(conditions;)2044 4665 y(the)h
+(transformation)d(also)j(results)g(in)g(a)g(mapping)e(of)h(descriptors)
+2037 4764 y(between)14 b(expressions.)24 b(W)-7 b(e)16
+b(de\256ne)e(T)-8 b(-rules)14 b(and)g(I-rules)g(precisely)2042
+4864 y(in)20 b(the)f(following)e(sections)i(and)g(illustrate)g(them)f
+(with)i(examples.)2044 4964 y(Our)33 b(examples)g(are)h(chosen)f(from)f
+(rules)i(that)g(would)f(be)g(used)2044 5063 y(in)e(a)h(centralized)e
+(relational)g(query)g(optimizer;)36 b(the)31 b(operators,)2044
+5163 y(algorithms,)25 b(and)f(properties)g(are)h(subsets)h(of)f(those)g
+(in)h(T)-6 b(ables)25 b(1)2044 5263 y(and)19 b(2.)p eop
+%%Page: 4 4
+4 3 bop -110 24 1947 4 v -110 1929 4 1905 v 31 101 a
+Fu(E)s Ft(\()p Fu(x)147 109 y Fn(1)178 101 y Fu(;)11
+b(:)h(:)f(:)g(;)g(x)372 109 y Fl(n)412 101 y Ft(\))19
+b(:)g Fi(D)552 109 y Fg(1)606 101 y Ft(=)-11 b Ff(\))19
+b Fu(E)783 72 y Fe(0)805 101 y Ft(\()p Fu(x)869 109 y
+Fn(1)901 101 y Fu(;)12 b(:)f(:)g(:)g(;)g(x)1095 109 y
+Fl(n)1135 101 y Ft(\))19 b(:)g Fi(D)1275 109 y Fg(2)1656
+101 y Fo(\(1\))31 167 y Ff(ff)244 234 y Fo(pre-test)c(statements)31
+300 y Ff(gg)31 367 y Fo(test)31 433 y Ff(ff)244 500 y
+Fo(post-test)g(statements)31 566 y Ff(gg)493 709 y Fz(\(a\))j(General)g
+(form)f(of)g(a)g(T)-6 b(-rule)p -61 807 1849 4 v 31 884
+a Fo(JOIN)o Ft(\()p Fo(JOIN)p Ft(\()p Fu(S)375 892 y
+Fn(1)407 884 y Fu(;)11 b(S)479 892 y Fn(2)512 884 y Ft(\))18
+b(:)h Fi(D)651 892 y Fg(4)687 884 y Fu(;)11 b(S)759 892
+y Fn(3)791 884 y Ft(\))19 b(:)g Fi(D)931 892 y Fg(5)1656
+884 y Fo(\(2\))89 983 y Ft(=)-11 b Ff(\))18 b Fo(JOIN)p
+Ft(\()p Fu(S)406 991 y Fn(1)438 983 y Fu(;)11 b Fo(JOIN)p
+Ft(\()p Fu(S)662 991 y Fn(2)694 983 y Fu(;)g(S)766 991
+y Fn(3)799 983 y Ft(\))18 b(:)h Fi(D)938 991 y Fg(6)974
+983 y Ft(\))g(:)g Fi(D)1114 991 y Fg(7)31 1066 y Ff(ff)244
+1133 y Fi(D)301 1141 y Fg(6)337 1133 y Fu(:)p Fo(attributes)g
+Ft(=)g Fo(union)c Ft(\()p Fi(D)892 1141 y Fg(2)928 1133
+y Fu(:)p Fo(attributes)p Fu(;)c Fi(D)1252 1141 y Fg(3)1288
+1133 y Fu(:)p Fo(attributes)p Ft(\))j(;)31 1199 y Ff(gg)31
+1265 y Fo(is)p 73 1265 18 4 v 20 w(associative)g Ft(\()p
+Fi(D)443 1273 y Fg(6)479 1265 y Fu(:)p Fo(join)p 592
+1265 V 21 w(predicate)p Fu(;)d Fi(D)911 1273 y Fg(6)947
+1265 y Fu(:)p Fo(attributes)p Fu(;)g Fi(D)1271 1273 y
+Fg(5)1306 1265 y Fu(:)p Fo(join)p 1419 1265 V 22 w(predicate)p
+Ft(\))31 1332 y Ff(ff)244 1398 y Fi(D)301 1406 y Fg(7)356
+1398 y Ft(=)19 b Fi(D)483 1406 y Fg(5)533 1398 y Ft(;)244
+1465 y Fi(D)301 1473 y Fg(7)337 1465 y Fu(:)p Fo(join)p
+450 1465 V 21 w(predicate)g Ft(=)g Fi(D)827 1473 y Fg(4)863
+1465 y Fu(:)p Fo(join)p 976 1465 V 21 w(predicate)14
+b Ft(;)244 1531 y Fi(D)301 1539 y Fg(6)337 1531 y Fu(:)p
+Fo(tuple)p 476 1531 V 21 w(size)k Ft(=)h Fi(D)730 1539
+y Fg(2)766 1531 y Fu(:)p Fo(tuple)p 905 1531 V 21 w(size)14
+b Ft(+)h Fi(D)1151 1539 y Fg(3)1187 1531 y Fu(:)p Fo(tuple)p
+1326 1531 V 21 w(size)f Ft(;)244 1598 y Fi(D)301 1606
+y Fg(6)337 1598 y Fu(:)p Fo(num)p 463 1598 V 21 w(records)19
+b Ft(=)g Fo(cardinality)c Ft(\()p Fi(D)1087 1606 y Fg(2)1123
+1598 y Fu(;)c Fi(D)1211 1606 y Fg(3)1247 1598 y Ft(\))j(;)31
+1664 y Ff(gg)587 1807 y Fz(\(b\))j(Join)g(associativity)p
+1834 1929 4 1905 v -110 1932 1947 4 v 1835 1949 19 1912
+v -93 1949 1947 19 v 607 2131 a FG(Figure)j(2:)27 b(T)-8
+b(-rule)-112 2372 y Fx(2.3)99 b(T)-7 b(ransformation)25
+b(rules)-112 2549 y FG(T)m(ransformation)k(rules,)35
+b(or)d(T)-8 b(-rules)32 b(for)g(short,)i(de\256ne)e(equiva-)-112
+2649 y(lences)e(among)g(pairs)h(of)f(expressions;)36
+b(they)30 b(de\256ne)g(mappings)-112 2748 y(from)g(one)i(operator)e
+(tree)h(to)h(another)-5 b(.)61 b(Let)32 b Fv(E)37 b FG(and)32
+b Fv(E)1584 2718 y Ff(0)1639 2748 y FG(be)g(ex-)-112
+2848 y(pressions)19 b(that)i(involve)e(only)h(abstract)g(operators.)26
+b(Equation)18 b(\(1\))-112 2948 y(\(shown)k(in)i(Figure)e(2\(a\)\))h
+(shows)g(the)h(general)e(form)h(of)g(a)h(T)-8 b(-rule.)-112
+3047 y(The)19 b(actions)h(of)g(a)h(T)-8 b(-rule)20 b(de\256ne)f(the)i
+(equivalences)d(between)i(the)-114 3147 y(descriptors)f(of)g(nodes)f
+(of)h(the)h(original)e(operator)f(tree)i Fv(E)25 b FG(with)20
+b(the)-112 3247 y(nodes)27 b(of)g(the)h(output)f(tree)g
+Fv(E)796 3216 y Ff(0)820 3247 y FG(;)32 b(these)c(actions)g(consist)g
+(of)f(a)h(se-)-112 3346 y(ries)f(of)f(\(C)i(or)f(C++\))g(assignment)918
+3316 y Ft(2)981 3346 y FG(statements.)47 b(The)27 b(left-hand)-112
+3446 y(sides)21 b(of)f(these)h(statements)g(refer)f(to)h(descriptors)e
+(of)i(expressions)-112 3545 y(on)g(the)h(right-hand)e(side)j(of)f(the)g
+(T)-8 b(-rule;)22 b(the)h(right-hand)c(sides)k(of)-119
+3645 y(the)14 b(statements)h(can)f(refer)g(to)h(any)f(descriptor)f(in)h
+(the)h(T)-8 b(-rule.)24 b(Func-)-112 3745 y(tion)j(\(called)h
+FF(helper)g FG(functions\))e(calls)j(can)f(also)g(appear)f(on)h(the)
+-118 3844 y(right)15 b(side)h(of)f(the)h(assignment)e(statements.)26
+b(Thus,)15 b(descriptors)g(on)-114 3944 y(the)k FF(left-hand)f(side)i
+FG(of)e(a)i(T)-8 b(-rule)19 b(are)g FF(never)g FG(changed)e(in)j(the)f
+(rule')-5 b(s)-114 4044 y(actions.)26 b(A)19 b FF(test)h
+FG(is)f(needed)f(to)g(determine)g(if)g(the)h(transformations)-112
+4143 y(of)g(the)i(T)-8 b(-rule)19 b(are)h(in)h(fact)f(applicable.)-34
+4254 y(Purely)c(as)i(an)e(optimization,)g(it)h(is)h(usually)e(the)g
+(case)h(that)g(not)f(all)-118 4354 y(statements)g(in)g(a)g(T)-8
+b(-rule')j(s)16 b(actions)f(need)g(to)h(be)g(executed)e(prior)h(to)h(a)
+-114 4454 y(T)-8 b(-rule')j(s)18 b(test.)28 b(For)18
+b(this)i(reason,)e(the)h(actions)f(of)h(a)g(T)-8 b(-rule)18
+b(are)h(split)-112 4553 y(into)i(two)g(groups;)g(those)h(that)f(need)g
+(to)h(be)f(executed)g(prior)f(to)i(the)-119 4653 y(T)-8
+b(-rule')j(s)14 b(test,)i(and)e(those)h(that)f(can)h(be)f(executed)g
+(after)g(a)h(successful)-113 4753 y(test.)27 b(These)19
+b(groups)f(of)h(statements)h(comprise,)e(respectively)-5
+b(,)18 b(the)p -112 4870 788 4 v -28 4924 a Fr(2)7 4947
+y Fz(The)13 b(actions)i(can)e(be)g(non-assignment)j(statements)e
+(\(like)h(function)g(calls\),)f(but)-112 5026 y(in)23
+b(this)h(case,)i(the)e(P2V)f(pre-processor)j(\(described)f(in)f
+(Section)h(3\))f(needs)g(some)-112 5105 y(hints)15 b(about)i(the)f
+(properties)h(that)f(are)g(changed)h(by)f(the)g(statement)h(in)e(order)
+h(to)g(cor)o(-)-112 5184 y(rectly)g(categorize)j(each)d(property)l(.)22
+b(For)15 b(simplicity)l(,)i(in)e(this)h(paper)m(,)g(we)f(assume)g(all)
+-112 5263 y(actions)j(consist)g(of)f(assignment)i(statements.)p
+2046 24 1947 4 v 2046 1688 4 1664 v 2187 92 a Fu(E)s
+Ft(\()p Fu(x)2303 100 y Fn(1)2335 92 y Fu(;)11 b(:)g(:)g(:)g(;)g(x)2528
+100 y Fl(n)2568 92 y Ft(\))19 b(:)g Fi(D)2708 100 y Fg(1)2763
+92 y Ft(=)-11 b Ff(\))18 b Fu(A)p Ft(\()p Fu(x)3001 100
+y Fn(1)3033 92 y Fu(;)11 b(:)g(:)g(:)g(;)h(x)3227 100
+y Fl(n)3267 92 y Ft(\))19 b(:)f Fi(D)3406 100 y Fg(2)3812
+92 y Fo(\(3\))2187 159 y(test)2187 225 y Ff(ff)2401 292
+y Fo(pre-opt)d(statements)2187 358 y Ff(gg)2187 424 y(ff)2401
+491 y Fo(post-opt)g(statements)2187 557 y Ff(gg)2639
+700 y Fz(\(a\))i(General)i(form)e(of)g(an)g(I-rule)p
+2095 798 1849 4 v 2187 875 a Fo(SOR)m(T)o Ft(\()p Fu(S)2399
+883 y Fn(1)2431 875 y Ft(\))i(:)f Fi(D)2570 883 y Fg(2)2625
+875 y Ft(=)-11 b Ff(\))19 b Fo(Mer)o(ge)p 2904 875 18
+4 v 21 w(sort)p Ft(\()p Fu(S)3076 883 y Fn(1)3108 875
+y Ft(\))g(:)f Fi(D)3247 883 y Fg(3)3812 875 y Fo(\(4\))2187
+958 y Ft(\()p Fi(D)2270 966 y Fg(2)2306 958 y Fu(:)p
+Fo(tuple)p 2445 958 V 20 w(order)e Ft(!)9 b(=)18 b Fo(DONT)p
+2862 958 V 21 w(CARE)o Ft(\))2187 1024 y Ff(ff)2401 1091
+y Fi(D)2458 1099 y Fg(3)2512 1091 y Ft(=)h Fi(D)2639
+1099 y Fg(2)2690 1091 y Ft(;)2187 1157 y Ff(gg)2187 1224
+y(ff)2401 1290 y Fi(D)2458 1298 y Fg(3)2493 1290 y Fu(:)p
+Fo(cost)g Ft(=)g Fi(D)2753 1298 y Fg(1)2788 1290 y Fu(:)p
+Fo(cost)2699 1356 y Ft(+\()p Fi(D)2833 1364 y Fg(3)2868
+1356 y Fu(:)p Fo(num)p 2994 1356 V 21 w(records)p Ft(\))c
+Ff(\003)h Ft(log\()p Fi(D)3442 1364 y Fg(3)3478 1356
+y Fu(:)p Fo(num)p 3604 1356 V 21 w(records)p Ft(\))f(;)2187
+1423 y Ff(gg)2630 1565 y Fz(\(b\))i(Mer)o(ge-sort)i(sort)e(algorithm)p
+3990 1688 4 1664 v 2046 1691 1947 4 v 3992 1708 19 1671
+v 2063 1708 1947 19 v 2771 1890 a FG(Figure)j(3:)27 b(I-rule)2044
+2113 y FF(pr)m(e-test)21 b FG(and)f FF(post-test)g FG(statements)h(of)f
+(the)g(T)-8 b(-rule.)3565 2083 y Ft(3)2046 2330 y FG(E)t
+Fz(X)t(A)t(M)t(P)t(L)t(E)24 b FG(4)t(.)142 b(The)14 b(associativity)h
+(of)g(JOINs)h(is)g(expressed)d(by)2044 2430 y(T)-8 b(-rule)19
+b(\(2\))h(in)g(Figure)g(2\(b\).)1082 b Fs(\003)2044 2683
+y Fx(2.4)99 b(Implementation)26 b(rules)2044 2844 y FG(Implementation)k
+(rules,)35 b(or)e(I-rules)f(for)g(short,)j(de\256ne)e(equiva-)2044
+2944 y(lences)e(between)g(expressions)g(and)g(their)g(implementing)f
+(algo-)2044 3043 y(rithms.)i(Let)23 b Fv(E)k FG(be)c(an)f(expression)f
+(and)g Fv(A)i FG(be)f(an)g(algorithm)f(that)2044 3143
+y(implements)26 b Fv(E)5 b FG(.)51 b(The)27 b(general)g(form)f(of)i(an)
+f(I-rule)g(is)i(given)d(by)2044 3242 y(Equation)18 b(\(3\))i(\(shown)f
+(in)h(Figure)g(3\(a\)\).)2127 3345 y(The)g(actions)h(associated)g(with)
+g(an)g(I-rule)f(are)h(de\256ned)e(in)j(three)2044 3445
+y(parts.)35 b(The)23 b(\256rst)h(part,)f(or)g FF(test)p
+FG(,)i(is)f(a)f(boolean)f(expression)f(whose)2044 3544
+y(value)e(determines)g(whether)h(or)f(not)h(the)h(rule)e(can)h(be)g
+(applied.)2123 3647 y(The)d(second)g(part,)g(or)g FF(pr)m(e-opt)f
+(statements)p FG(,)i(is)h(a)e(set)h(of)g(descrip-)2044
+3746 y(tor)23 b(assignment)g(statements)g(that)h(are)f(executed)f(only)
+h(if)h(the)f(test)2044 3846 y(is)i(true)f(and)f FF(befor)m(e)h
+FG(any)g(of)g(the)g(inputs)g Fv(x)3296 3858 y Fu(i)3349
+3846 y FG(of)g Fv(E)30 b FG(are)24 b(optimized.)2044
+3946 y(Additional)e(parameters)g(of)i(nodes)f(are)g(usually)g(assigned)
+g(in)h(the)2039 4045 y(pre-opt)15 b(section.)25 b(This)16
+b(is)h(necessary)f(before)f(any)h(of)f(the)i(nodes)e(on)2044
+4145 y(the)20 b(right)g(side)g(can)g(be)g(optimized.)2127
+4248 y(The)g(third)h(part,)g(or)f FF(post-opt)g(statements)p
+FG(,)h(is)h(a)g(set)f(of)g(descrip-)2044 4347 y(tor)i(assignment)f
+(statements)i(that)f(are)g(executed)f FF(after)i FG(all)g
+Fv(x)3859 4359 y Fu(i)3911 4347 y FG(are)2044 4447 y(optimized.)k
+(Normally)-5 b(,)19 b(the)i(post-opt)f(statements)h(compute)f(cost)2040
+4546 y(properties)c(that)h(can)g(only)g(be)g(determined)e(once)h(the)i
+(inputs)e(to)i(the)2044 4646 y(algorithm)i(are)i(completely)f
+(optimized)g(and)g(their)h(costs)h(known.)2044 4746 y(This)33
+b FF(does)g(not)p FG(,)j(however)m(,)e(imply)f(a)g(bottom-up)e
+(optimization)2044 4845 y(strategy)-5 b(.)41 b(It)26
+b(simply)e(means)h(that)h(although)d(I-rules)i(are)g(applied)2044
+4945 y(to)20 b(parents)g(before)g(their)g(children)f(are)i(optimized,)e
+(the)h FF(cost)i FG(\(and)p 2044 5028 788 4 v 2129 5081
+a Fr(3)2163 5105 y Fz(W)-5 b(e)19 b(suspect)i(it)e(is)h(possible)g(to)g
+(use)g(data-\257ow)g(analysis)h(to)f(partition)i(the)e(as-)2044
+5184 y(signment)i(statements)h(automatically)l(,)i(but)c(for)g(now)l(,)
+g(we)g(let)h(the)g(rule-writer)h(do)2044 5263 y(the)18
+b(partitioning.)p eop
+%%Page: 5 5
+5 4 bop -115 21 a FG(other)18 b(properties)f(in)h(the)h(post-opt)e
+(section\))g(of)h(the)h(parent)e(cannot)-112 120 y(be)j(computed)e
+(until)i(the)g(children)f(have)g(been)h(optimized.)-110
+326 y(E)t Fz(X)t(A)t(M)t(P)t(L)t(E)k FG(5)t(.)146 b(Equation)19
+b(\(4\))g(\(in)h(Figure)f(3\(b\)\))g(shows)h(the)g(I-)-112
+425 y(rule)f(that)i(implements)e(the)h(SOR)-5 b(T)21
+b(operator)d(by)i(Mer)o(ge)p 1564 425 25 4 v 28 w(sort.)59
+b Fs(\003)-112 668 y Fx(2.5)99 b(Null)24 b(algorithm)-112
+826 y FG(Recall)g(that,)i(in)e(Section)g(1,)h(we)g(mentioned)d(that)i
+(Prairie)g(allows)-112 925 y(users)g(to)g(treat)g(all)g(operators)f
+(and)g(algorithms)g(as)i(\256rst-class)g(ob-)-112 1025
+y(jects,)g(i.e.,)g(all)f(operators)e(and)i(algorithms)f(are)g
+(explicit,)i(in)f(con-)-112 1125 y(trast)i(to)g(enforcers)e(in)h(V)-11
+b(olcano)25 b(or)h(glue)f(in)h(Starburst.)42 b(This)26
+b(re-)-119 1224 y(quires)15 b(that)g(Prairie)g(provide)f(a)h(mechanism)
+f(where)g(users)i(can)f(also)-112 1324 y(\252delete\272)21
+b(one)g(or)h(more)f(of)h(the)g(explicit)g(operators)e(from)h(expres-)
+-112 1423 y(sions.)33 b(This)23 b(is)g(done)f(by)g(having)f(a)i
+(special)f(class)i(of)e(I-rules)g(that)-115 1523 y(have)c(the)g(form)f
+(given)g(by)h(Equation)e(\(5\))i(in)g(Figure)g(4\(a\).)25
+b(The)18 b(left)-120 1623 y(side)c(of)f(the)h(rule)f(is)i(a)f(single)g
+(abstract)f(operator)f Fv(O)17 b FG(with)d(one)f(stream)-112
+1722 y(input)25 b Fv(S)136 1734 y Ft(1)173 1722 y FG(.)46
+b(The)26 b(right)g(side)g(of)g(the)h(rule)f(is)h(an)f(algorithm)f
+(called)-112 1822 y(\252Null\272)f(with)h(the)g(same)g(stream)g(input)f
+(but)h(with)g(a)g(dif)o(ferent)e(de-)-112 1922 y(scriptor)-5
+b(.)42 b(As)26 b(the)g(name)e(suggests,)j(the)e(Null)h(algorithm)e(is)i
+(sup-)-112 2021 y(posed)21 b(to)i(pass)g(its)g(input)f(unchanged)e(to)i
+(algorithms)f(above)h(it)h(in)-112 2121 y(an)h(operator)f(tree.)41
+b(This)25 b(is)h(accomplished)c(in)j(the)g(I-rule)f(as)h(fol-)-112
+2220 y(lows.)-29 2321 y(The)c(test)i(for)e(this)i(I-rule)e(is)i(always)
+f(TRUE,)g(i.e.,)g(any)g(node)f(in)-112 2421 y(an)g(operator)f(tree)i
+(with)g Fv(O)k FG(as)c(its)h(operator)d(can)i(be)g(implemented)-113
+2520 y(by)e(the)g(Null)g(algorithm.)25 b(The)20 b(actions)f(associated)
+h(with)g(this)g(rule)-115 2620 y(have)d(a)h(speci\256c)g(pattern.)25
+b(The)18 b(pre-opt)e(section)h(consists)i(of)e(three)-112
+2720 y(statements.)36 b(The)23 b(\256rst)h(statement)f(copies)g(the)h
+(descriptor)e(of)h(the)-116 2819 y(operator)16 b Fv(O)21
+b FG(to)d(the)g(algorithm)e(Null.)26 b(The)17 b(second)g(statement)h
+(sets)-112 2919 y(the)25 b(descriptor)e(of)i(the)g(stream)g
+Fv(S)892 2931 y Ft(1)955 2919 y FG(on)g(the)g(right)f(side)i(to)f(the)g
+(de-)-117 3018 y(scriptor)15 b(of)h(the)g(stream)g Fv(S)646
+3030 y Ft(1)700 3018 y FG(on)f(the)h(left)h(side.)26
+b(Why)16 b(is)h(it)f(necessary)-119 3118 y(to)e(do)g(this?)26
+b(The)14 b(key)g(lies)h(in)f(the)h(third)f(statement.)24
+b(This)15 b(statement)-117 3218 y(copies)h(the)g(property)f
+(\252property\272)e(of)k(the)f(operator)f Fv(O)k FG(node)c(on)h(the)
+-116 3317 y(left)i(side)g(to)g(the)f(\252property\272)e(of)j(the)f
+(input)g(stream)h Fv(S)1427 3329 y Ft(1)1482 3317 y FG(on)f(the)h
+(right)-112 3417 y(side.)32 b(Since)22 b(left-hand)e(side)j
+(descriptors)e(cannot)g(be)g(changed)g(in)-115 3517 y(an)c(I-rule,)g(a)
+h(new)g(descriptor)e Fj(D)840 3529 y Fi(3)900 3517 y
+FG(is)j(necessary)e(for)g Fv(S)1481 3529 y Ft(1)1537
+3517 y FG(to)g(convey)-112 3616 y(the)j(property)e(propagation)f
+(information.)-29 3717 y(The)48 b(post-opt)f(section)h(in)h(the)g
+(I-rule)e(has)i(only)f(a)h(cost-)-112 3817 y(assignment)44
+b(statement;)57 b(this)46 b(simply)e(sets)j(the)e(cost)g(of)g(the)-112
+3916 y(Null)20 b(node)f(to)h(the)h(cost)f(of)g(its)h(optimized)e(input)
+g(stream.)-31 4017 y(The)f(Null)g(algorithm,)g(therefore,)e(serves)j
+(to)g(ef)o(fectively)d(trans-)-112 4116 y(form)j(a)h(single)g(operator)
+f(to)h(a)h(no-op.)-110 4322 y(E)t Fz(X)t(A)t(M)t(P)t(L)t(E)j
+FG(6)t(.)146 b(Equation)19 b(\(6\))g(\(in)h(Figure)f(4\(b\)\))g(shows)h
+(the)g(I-)-112 4422 y(rule)15 b(that)g(rewrites)g(the)h(SOR)-5
+b(T)16 b(operator)d(to)j(use)f(a)h(Null)g(algorithm.)-112
+4521 y Fs(\003)-112 4876 y FB(3)119 b(The)30 b(P2V)g(pr)n(e-pr)n
+(ocessor)-112 5063 y FG(In)38 b(Section)g(1,)43 b(we)c(enumerated)e
+(the)h(four)g(primary)f(goals)h(of)-112 5163 y(Prairie,)22
+b(viz.,)g(uniformity)e(in)i(operator)e(and)i(algorithms;)f(unifor)n(-)
+-112 5263 y(mity)i(in)h(properties;)h(uniformity)c(in)j
+(property-transformations;)p 2046 24 1947 4 v 2046 1887
+4 1864 v 2187 92 a Fu(O)r Ft(\()p Fu(S)2306 100 y Fn(1)2338
+92 y Ft(\))19 b(:)g Fi(D)2478 100 y Fg(2)2532 92 y Ft(=)-11
+b Ff(\))19 b Fo(Null)q Ft(\()p Fu(S)2828 100 y Fn(1)2879
+92 y Ft(:)f Fi(D)2973 100 y Fg(3)3009 92 y Ft(\))h(:)g
+Fi(D)3149 100 y Fg(4)3812 92 y Fo(\(5\))2187 159 y(TRUE)2187
+225 y Ff(ff)2401 292 y Fi(D)2458 300 y Fg(4)2512 292
+y Ft(=)g Fi(D)2639 300 y Fg(2)2690 292 y Ft(;)2401 358
+y Fi(D)2458 366 y Fg(3)2512 358 y Ft(=)g Fi(D)2639 366
+y Fg(1)2690 358 y Ft(;)2401 424 y Fi(D)2458 432 y Fg(3)2493
+424 y Fu(:)p Fo(property)h Ft(=)f Fi(D)2856 432 y Fg(2)2892
+424 y Fu(:)p Fo(property)c Ft(;)2187 491 y Ff(gg)2187
+557 y(ff)2401 624 y Fi(D)2458 632 y Fg(4)2493 624 y Fu(:)p
+Fo(cost)k Ft(=)g Fi(D)2753 632 y Fg(3)2788 624 y Fu(:)p
+Fo(cost)14 b Ft(;)2187 690 y Ff(gg)2559 833 y Fz(\(a\))j(General)i
+(form)e(of)g(a)g(\252Null\272)h(I-rule)p 2095 931 1849
+4 v 2187 1008 a Fo(SOR)m(T)o Ft(\()p Fu(S)2399 1016 y
+Fn(1)2431 1008 y Ft(\))h(:)f Fi(D)2570 1016 y Fg(2)2683
+1008 y Ft(=)-11 b Ff(\))19 b Fo(Null)p Ft(\()p Fu(S)2978
+1016 y Fn(1)3029 1008 y Ft(:)g Fi(D)3124 1016 y Fg(3)3160
+1008 y Ft(\))g(:)g Fi(D)3300 1016 y Fg(4)3812 1008 y
+Fo(\(6\))2187 1091 y(TRUE)2187 1157 y Ff(ff)2401 1224
+y Fi(D)2458 1232 y Fg(4)2512 1224 y Ft(=)g Fi(D)2639
+1232 y Fg(2)2690 1224 y Ft(;)2401 1290 y Fi(D)2458 1298
+y Fg(3)2512 1290 y Ft(=)g Fi(D)2639 1298 y Fg(1)2690
+1290 y Ft(;)2401 1356 y Fi(D)2458 1364 y Fg(3)2493 1356
+y Fu(:)p Fo(tuple)p 2632 1356 18 4 v 21 w(order)h Ft(=)f
+Fi(D)2919 1364 y Fg(2)2955 1356 y Fu(:)p Fo(tuple)p 3094
+1356 V 20 w(order)d Ft(;)2187 1423 y Ff(gg)2187 1489
+y(ff)2401 1556 y Fi(D)2458 1564 y Fg(4)2493 1556 y Fu(:)p
+Fo(cost)j Ft(=)g Fi(D)2753 1564 y Fg(3)2788 1556 y Fu(:)p
+Fo(cost)14 b Ft(;)2187 1622 y Ff(gg)2718 1765 y Fz(\(b\))j(Null)h(sort)
+f(algorithm)p 3990 1887 4 1864 v 2046 1890 1947 4 v 3992
+1907 19 1870 v 2063 1907 1947 19 v 2366 2090 a FG(Figure)j(4:)27
+b(The)20 b(\252Null\272)g(algorithm)f(concept)2044 2301
+y(and)37 b(ef)o(\256cient)f(generation)g(of)h(Prairie)g(optimizers.)78
+b(The)37 b(\256rst)2041 2401 y(three)18 b(goals)f(are)h(driven)f(by)g
+(the)h(need)g(for)f(conceptual)f(simplicity;)2044 2500
+y(however)m(,)33 b(they)f(alone)f(do)h(not)g(necessarily)g(generate)f
+(ef)o(\256cient)2044 2600 y(optimizers.)61 b(The)31 b(P2V)h
+(pre-processor)e(ensures)h(that)h(ef)o(\256cient)2044
+2700 y(optimizers)e(can)h(be)f(realized)h(from)f(Prairie)h
+(speci\256cations,)h(by)2044 2799 y(translating)c(them)i(to)f(the)h(V)
+-11 b(olcano)29 b(framework)e(and)i(then)g(gen-)2044
+2899 y(erating)22 b(an)h(optimizer)f(by)h(compiling)f(with)h(the)g(V)
+-11 b(olcano)22 b(search)2041 2999 y(engine.)j(This)18
+b(Prairie)g(optimizer)n(-generator)c(paradigm)i(is)j(shown)2044
+3098 y(schematically)j(in)h(Figure)f(5.)35 b(The)23 b(pre-processor)d
+(itself)k(is)f(4500)2044 3198 y(lines)f(of)g Fd(flex)g
+FG(and)g Fd(bison)f FG(code.)33 b(In)21 b(this)i(section,)f(we)h
+(brie\257y)2038 3297 y(describe)14 b(the)i(pre-processor)c(steps)k(and)
+f(explain)f(why)h(the)g(Prairie-)2044 3397 y(to-V)-11
+b(olcano)27 b(transformation)e(is)30 b(non-trivial.)49
+b(A)29 b(more)f(detailed)2044 3497 y(description)18 b(of)i(the)h
+(pre-processor)c(is)k(given)e(in)i([5].)2125 3596 y(The)d
+(speci\256cation)g(of)g(an)g(optimizer)f(in)i(V)-11 b(olcano)18
+b(consists)h(of)f(a)2043 3696 y(set)j(of)e(transformation)e(rules)j
+(\(called)f(\252trans)p 3386 3696 25 4 v 29 w(rules\272\))g(and)g
+(imple-)2037 3796 y(mentation)14 b(rules)h(\(called)f(\252impl)p
+2998 3796 V 29 w(rules\272\),)h(a)g(set)h(of)f(properties,)f(and)2038
+3895 y(some)h(support)e(functions.)24 b(The)15 b(join)g(associativity)g
+(trans)p 3737 3895 V 29 w(rule)g(\(cf.)2044 3995 y(Figure)k(2\(b\)\))g
+(in)h(V)-11 b(olcano)20 b(is)h(as)g(follows)3261 3965
+y Ft(4)3297 3995 y FG(:)2210 4155 y Ft(\()p Fo(JOIN)f(?op)p
+2469 4155 18 4 v 21 w(ar)o(g5)h Ft(\(\()p Fo(JOIN)g(?op)p
+2896 4155 V 21 w(ar)o(g4)g Ft(\(?1)g(?2\)\))g(?3\)\))2293
+4280 y Ff(\000)-23 b Fu(>)p Ft(\()p Fo(JOIN)20 b(?op)p
+2633 4280 V 21 w(ar)o(g7)h Ft(\(?1)g(\()p Fo(JOIN)g(?op)p
+3145 4280 V 21 w(ar)o(g6)g Ft(\(?2)g(?3\)\)\)\))2044
+4440 y FG(The)32 b(important)f(point)g(to)i(note)f(is)h(the)g(use)f(of)
+h FF(operator)e(ar)m(gu-)2044 4540 y(ments)21 b FG(\(denoted)e(by)h
+(\252op)p 2801 4540 25 4 v 29 w(ar)o(g\272)g(in)g(rules\);)h(these)g
+(ar)o(guments)e(con-)2044 4640 y(tain)i(properties)f(used)h(in)h(the)f
+(rule')-5 b(s)22 b(actions,)f(but)g(unlike)f(Prairie,)2044
+4739 y(they)31 b(do)g(not)h(contain)e FF(all)i FG(the)g(properties)e
+(of)i(an)f(operator)f(tree)2043 4839 y(node.)c(There)18
+b(are)i(other)f(property)e(classes,)k(like)e(algorithm)g(ar)o(gu-)2044
+4939 y(ment,)26 b(logical)e(property)-5 b(,)24 b(system)i(property)-5
+b(,)23 b(physical)i(property)-5 b(,)2044 5038 y(and)25
+b(cost.)44 b(Thus,)27 b(while)f(Prairie)g(uses)g(a)g(uniform)e
+(descriptor)h(to)p 2044 5107 788 4 v 2129 5160 a Fr(4)2163
+5184 y Fz(There)15 b(are)f(conditions)j(and)d(actions)i(associated)g
+(with)f(V)-9 b(olcano)16 b(rules)e(that)h(are)2044 5263
+y(not)i(shown)g(here.)p eop
+%%Page: 6 6
+6 5 bop -98 24 1923 4 v -98 1420 4 1397 v 371 1324 a
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 17.07164 128.0373
+119.50148 128.0373 119.50148 25.60745 17.07164 25.60745 /Lineto /lineto
+load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 153.64476
+102.42984 153.64476 102.42984 136.57312 34.14328 136.57312 /Lineto
+/lineto load def false Polygon gsave 1. setgray fill grestore gsave
+0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 754 139 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.07344
+neg 47.33029 7.75298 .5 Frame gsave 1. setgray fill grestore end
+
+
+@endspecial Fo(Prairie)15 b(Rule)f(Set)371 1324 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 119.50148 68.28656 136.57312
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 34.14328 119.50148
+102.42984 119.50148 102.42984 102.42984 34.14328 102.42984 /Lineto
+/lineto load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap
+stroke grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial
+719 416 a(P2V)h(Pre-processor)371 1324 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 85.3582 68.28656 102.42984
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 85.3582 102.42984
+85.3582 102.42984 68.28656 34.14328 68.28656 /Lineto /lineto load
+def false Polygon gsave 0.5 setgray fill grestore gsave 0.8 SLW 0.
+setgray 0 setlinecap stroke grestore end
+
+@endspecial
+736 706 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.07344
+neg 51.4815 7.75298 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(V)-7
+b(olcano)14 b(Rule)h(Set)371 1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 51.21492 68.28656 68.28656
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 34.14328 51.21492
+102.42984 51.21492 102.42984 34.14328 34.14328 34.14328 /Lineto /lineto
+load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial 843
+950 a(V)-7 b(olcano)694 1017 y(Optimizer)o(-Generator)371
+1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 17.07164 68.28656 34.14328
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 17.07164
+102.42984 17.07164 102.42984 0.0 34.14328 0.0 /Lineto /lineto load
+def false Polygon gsave 0.5 setgray fill grestore gsave 0.8 SLW 0.
+setgray 0 setlinecap stroke grestore end
+
+@endspecial 740 1267 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 4.51193
+neg 50.62743 7.75298 .5 Frame gsave 1. setgray fill grestore end
+
+
+@endspecial(Query)15 b(Optimizer)-948 b(Operator)15
+b(T)n(ree)371 1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 34.14328 8.53581 17.07164 8.53581
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 119.50148 8.53581 102.42984 8.53581
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial 1363 1273 a(Access)e(Plan)p
+1822 1420 V -98 1423 1923 4 v 1823 1440 19 1403 v -81
+1440 1923 19 v -112 1623 a FG(Figure)58 b(5:)105 b(The)59
+b(Prairie)g(optimizer)n(-generator)d(paradigm.)-112 1722
+y(Double-boxed)j(modules)k(represent)f(software)h(generators,)-112
+1822 y(shaded)35 b(boxes)g(represent)g(generated)f(programs.)72
+b(The)36 b(outer)n(-)-112 1922 y(most)f(double-boxed)d(portion)h
+(denotes)i(the)h(Prairie)f(optimizer)-112 2021 y(generator)-5
+b(.)-117 2223 y(encode)16 b(properties,)g(V)-11 b(olcano)16
+b(partitions)g(the)h(properties)e(into)h(dif-)-119 2323
+y(ferent)d(classes.)26 b(The)15 b(P2V)f(pre-processor)e(partitions)i(a)
+h(Prairie)f(de-)-112 2422 y(scriptor)22 b(into)g(the)h(dif)o(ferent)e
+(property)f(classes)k(required)d(by)i(V)-11 b(ol-)-112
+2522 y(cano.)26 b(This)21 b(is)g(a)g(non-trivial)d(task,)j(since)f(it)h
+(requires)e(parsing)h(the)-112 2621 y(Prairie)g(rules)g(and)f(their)h
+(actions.)-29 2721 y(Impl)p 134 2721 25 4 v 28 w(rules)29
+b(in)g(V)-11 b(olcano)28 b(defer)f(most)i(of)g(the)f(actions)h(associ-)
+-114 2821 y(ated)18 b(with)h(the)g(rules)f(to)h(support)e(functions.)25
+b(Each)18 b(algorithm)f(has)-119 2920 y(four)c(support)g(functions)g
+(associated)h(with)h(it.)26 b(A)15 b(Prairie)f(speci\256ca-)-113
+3020 y(tion,)19 b(on)g(the)h(other)f(hand,)f(contains)h(all)h(the)g
+(actions)f(in)h(the)g(corre-)-120 3120 y(sponding)13
+b(rule.)24 b(The)14 b(P2V)g(pre-processor)e(parses)i(a)h(Prairie)f
+(I-rule,)-112 3219 y(and)28 b(automatically)f(generates)g(all)j(the)e
+(V)-11 b(olcano)28 b(support)f(func-)-112 3319 y(tions)f(from)g(the)h
+(rule.)46 b(This)27 b(is)h(also)f(a)g(complex)e(process,)j(since)-116
+3418 y(it)17 b(depends)f(partly)g(on)h(the)g(partitioning)e(of)i
+(properties)f(mentioned)-114 3518 y(in)j(the)g(last)h(paragraph,)c(and)
+j(also)g(because)f(it)i(requires)e(relocating)-112 3618
+y(pieces)25 b(of)g(code)f(from)g(Prairie)h(rules)h(to)f(V)-11
+b(olcano)24 b(support)g(func-)-112 3717 y(tions.)-29
+3817 y(The)36 b(third)h(salient)g(feature)f(of)h(a)g(V)-11
+b(olcano)37 b(speci\256cation)f(is)-112 3917 y(the)27
+b(presence)g(of)h(implicit,)h(or)e(hidden,)h(algorithms,)h(called)e
+FF(en-)-112 4016 y(for)m(cers)p FG(.)59 b(In)30 b(Prairie,)j(all)f
+(algorithms)d(are)i(explicit.)58 b(Consider)m(,)-112
+4116 y(for)22 b(example,)h(the)g(Mer)o(ge)p 682 4116
+V 28 w(sort)h(algorithm)e(in)h(Figure)g(3\(b\).)35 b(In)23
+b(a)-112 4215 y(V)-11 b(olcano)20 b(speci\256cation,)g(this)h
+(algorithm)f(would)g(be)h(classi\256ed)g(as)-112 4315
+y(an)k(enforcer)m(,)f(since)h(it)h(enforces)e(the)i(sortedness)f
+(property)-5 b(.)39 b(The)-112 4415 y(P2V)33 b(pre-processor)d
+(determines)i(the)i(Prairie)f(algorithms)f(that)-112
+4514 y(are)d(functionally)f(V)-11 b(olcano)29 b(enforcers,)i(and)e
+(deletes)h(the)g(corre-)-115 4614 y(sponding)16 b(Prairie)h(rules)h(to)
+g(generate)f(the)h(V)-11 b(olcano)17 b(speci\256cation.)-112
+4714 y(This)40 b(requires)f(the)h(pre-processor)e(to)i(migrate)g(the)g
+(\(deleted\))-112 4813 y(rule')-5 b(s)20 b(actions)g(to)g(V)-11
+b(olcano)19 b(support)g(functions.)-29 4913 y(The)27
+b(P2V)i(pre-processor)c(also)k(generates)e(a)i(set)g(of)f(compact)-112
+5012 y(V)-11 b(olcano)24 b(rules)h(by)g(mer)o(ging)e(Prairie)i(rules)g
+(whenever)e(possible.)-112 5112 y(Consider)m(,)18 b(for)i(example,)f
+(the)h(following)f(set)i(of)f(rules)g(in)g(Prairie:)-103
+5263 y Fo(JOIN)p Ft(\()p Fu(S)90 5271 y Fn(1)122 5263
+y Fu(;S)183 5271 y Fn(2)215 5263 y Ft(\):)p Fi(D)317
+5271 y Fg(3)436 5263 y Fh(=)-14 b Fk(\))83 b Fo(JOPR)o
+Ft(\()p Fo(SOR)m(T)o Ft(\()p Fu(S)1026 5271 y Fn(1)1058
+5263 y Ft(\):)p Fi(D)1160 5271 y Fg(4)1196 5263 y Fu(;)p
+Fo(SOR)m(T)o Ft(\()p Fu(S)1428 5271 y Fn(2)1460 5263
+y Ft(\):)p Fi(D)1562 5271 y Fg(5)1597 5263 y Ft(\):)p
+Fi(D)1699 5271 y Fg(6)2127 21 y Fo(SOR)m(T)o Ft(\()p
+Fu(S)2339 29 y Fn(1)2371 21 y Ft(\):)p Fi(D)2473 29 y
+Fg(2)2592 21 y Fh(=)-14 b Fk(\))83 b Fo(Null)p Ft(\()p
+Fu(S)2979 29 y Fn(1)3011 21 y Ft(:)p Fi(D)3087 29 y Fg(3)3123
+21 y Ft(\):)p Fi(D)3225 29 y Fg(4)2044 145 y Fo(JOPR)o
+Ft(\()p Fu(S)2246 153 y Fn(1)2279 145 y Fu(;S)2340 153
+y Fn(2)2371 145 y Ft(\):)p Fi(D)2473 153 y Fg(3)2592
+145 y Fh(=)-14 b Fk(\))83 b Fo(Nested)p 2974 145 18 4
+v 20 w(loops)p Ft(\()p Fu(S)3184 153 y Fn(1)3216 145
+y Ft(:)p Fi(D)3292 153 y Fg(4)3328 145 y Fu(;S)3389 153
+y Fn(2)3421 145 y Ft(\):)p Fi(D)3523 153 y Fg(5)2044
+310 y FG(The)24 b(\256rst)g(rule)g(is)h(a)g(T)-8 b(-rule,)24
+b(and)g(the)g(next)f(two)i(are)f(I-rules.)37 b(The)2044
+410 y(P2V)25 b(pre-processor)e(combines)h(the)h(above)g(set)h(of)f
+(Prairie)g(rules)2044 509 y(into)20 b(a)g(single)g(I-rule,)2044
+674 y Fo(JOIN)p Ft(\()p Fu(S)2237 682 y Fn(1)2269 674
+y Fu(;S)2330 682 y Fn(2)2362 674 y Ft(\):)p Fi(D)2464
+682 y Fg(3)2582 674 y Fh(=)-14 b Fk(\))83 b Fo(Nested)p
+2964 674 V 20 w(loops)p Ft(\()p Fu(S)3174 682 y Fn(1)3206
+674 y Ft(:)p Fi(D)3282 682 y Fg(4)3318 674 y Fu(;S)3379
+682 y Fn(2)3411 674 y Ft(\):)p Fi(D)3513 682 y Fg(5)2044
+839 y FG(and)19 b(then)h(translates)g(it)h(into)f(a)h(single)f(V)-11
+b(olcano)19 b(impl)p 3625 839 25 4 v 29 w(rule.)2044
+1119 y FB(4)119 b(Experimental)30 b(r)n(esults)2044 1304
+y FG(This)k(section)g(presents)f(experimental)f(results)i(which)g
+(demon-)2044 1403 y(strate)e(the)g(value)g(of)g(Prairie)g(in)g
+(specifying)f(rule)h(sets)h(of)f(rule-)2044 1503 y(based)g(optimizers.)
+62 b(Our)32 b(experiments)e(consist)j(of)f(specifying)2043
+1603 y(rule-based)18 b(optimizers)h(using)g(Prairie)g(and)g(generating)
+f(optimiz-)2040 1702 y(ers)f(using)f(the)g(P2V)h(pre-processor)d(and)i
+(the)h(optimizer)n(-generator)2044 1802 y(paradigm)h(of)i(Figure)g(5.)
+2120 1901 y(In)14 b([4],)h(we)f(presented)g(an)g(implementation)e(of)i
+(a)h(centralized)e(re-)2041 2001 y(lational)18 b(query)f(optimizer)g
+(using)h(Prairie.)26 b(Using)18 b(the)g(P2V)h(trans-)2036
+2101 y(lator)m(,)14 b(we)g(translated)f(this)h(to)g(V)-11
+b(olcano)12 b(format)h(and)g(optimized)f(sev-)2044 2200
+y(eral)23 b(queries)g(using)f(the)h(resultant)g(optimizer)-5
+b(.)35 b(For)23 b(comparison,)2042 2300 y(we)18 b(hand-coded)e(the)i
+(same)h(optimizer)e(directly)h(in)g(V)-11 b(olcano.)26
+b(The)2039 2400 y(results)17 b(presented)f(there)g(showed)g(that,)h
+(using)f(Prairie)h(\(compared)2044 2499 y(to)30 b(directly)f(using)g(V)
+-11 b(olcano\))29 b(resulted)g(in)h(approximately)d(50\045)2044
+2599 y(savings)f(in)g(lines)g(of)g(code)g(with)g(negligible)f(\(less)i
+(than)e(5\045\))h(in-)2044 2698 y(crease)d(in)g(query)e(optimization)h
+(time.)35 b(However)m(,)22 b(the)h(optimizer)2044 2798
+y(was)i(quite)f(small)h(in)f(terms)h(of)f(the)g(number)f(of)h
+(operators,)g(algo-)2044 2898 y(rithms)c(and)f(rules.)2127
+2997 y(For)j(a)g(more)g(realistic)g(evaluation)f(of)h(Prairie,)g(we)h
+(needed)d(an-)2044 3097 y(swers)h(to)f(the)g(following)f(questions:)
+2106 3262 y(1.)41 b(Is)20 b(Prairie)h(adequate)d(for)i(lar)o(ge-scale)f
+(rule)h(sets?)2106 3427 y(2.)41 b(How)j(is)i(programmer)c(productivity)
+g(enhanced)h(by)h(the)2210 3527 y(high-level)18 b(abstractions)i(of)f
+(Prairie?)2106 3692 y(3.)41 b(Can)14 b(Prairie)h(rule)f(sets)h(be)g
+(translated)e(automatically)g(into)h(ef-)2210 3792 y(\256cient)20
+b(implementations?)2124 3957 y(W)-7 b(e)19 b(addressed)e(the)g(\256rst)
+i(question)e(by)g(using)g(the)h(T)-6 b(exas)18 b(Instru-)2044
+4057 y(ments)i(Open)g(OODB)i(query)d(optimizer)g(rule)i(set,)g(which)f
+(has)h(the)2036 4156 y(lar)o(gest)13 b(publicly)g(available)g(rule)h
+(set.)25 b(W)-7 b(e)15 b(describe)e(this)i(optimizer)2042
+4256 y(in)j(the)h(next)f(section,)g(and)g(then)g(give)g(our)f
+(assessments)i(to)g(the)f(last)2044 4356 y(two)i(questions)f(in)i
+(subsequent)d(sections.)2044 4592 y Fx(4.1)99 b(The)74
+b(T)-9 b(exas)73 b(Instruments)h(Open)g(OODB)2268 4709
+y(query)26 b(optimizer)2044 4864 y FG(The)45 b(T)-6 b(exas)46
+b(Instruments)e(Open)h(Object-Oriented)f(Database)2042
+4964 y(Management)17 b(System)i(is)h(an)f(open,)f(extensible,)g
+(object-oriented)2044 5063 y(database)49 b(system)g(which)g(provides)f
+(users)h(an)h(architectural)2044 5163 y(framework)27
+b(that)i(is)i(con\256gurable)c(in)i(an)g(incremental)f(manner)-5
+b(.)2044 5263 y(The)30 b(query)e(optimizer)h(in)i(the)f(Open)f(OODB)i
+([2])f(is)h(generated)p eop
+%%Page: 7 7
+7 6 bop -112 21 a FG(using)36 b(V)-11 b(olcano.)76 b(It)38
+b(is)g(written)e(as)i(a)g(set)f(of)g(trans)p 1513 21
+25 4 v 29 w(rules)g(and)-112 120 y(impl)p 46 120 V 29
+w(rules)42 b(that)h(de\256ne)f(the)g(algebra)g(of)g(an)h
+(object-oriented)-112 220 y(database)35 b(system.)73
+b(Currently)-5 b(,)38 b(there)d(are)g(17)g(transformation)-112
+319 y(rules)50 b(and)g(9)h(implementation)e(rules)h(together)g(with)h
+(about)-112 419 y Fh(13)p Fv(;)14 b Fh(000)21 b FG(lines)i(of)g(code)g
+(for)f(support)g(functions;)i(this,)g(of)f(course,)-112
+519 y(can)c(be)i(changed)d(by)i(an)g(Open)f(OODB)i(user)g(for)e
+(speci\256c)h(needs.)-112 769 y Fx(4.2)99 b(Pr)n(ogrammer)25
+b(pr)n(oductivity)-119 929 y FG(Programmer)13 b(productivity)f(can)j
+(be)g(measured)e(in)i(dif)o(ferent)e(ways.)-112 1029
+y(An)29 b(admittedly)f(simplistic)j(metric)e(is)h(the)g(number)e(of)h
+(lines)h(of)-112 1128 y(code)24 b(that)i(must)g(be)f(written.)43
+b(But)26 b(there)f(are)g(also)h(less)h(tangible)-116
+1228 y(measures,)17 b(such)h(as)g(the)f(amount)f(of)h(conceptual)f(ef)o
+(fort)g(needed)g(to)-112 1327 y(understand)k(a)k(particular)e
+(programming)d(task.)36 b(Our)23 b(experience)-112 1427
+y(with)d(the)h(Open)f(OODB)i(query)d(optimizer)g(suggests)i(that)g
+(Prairie)-113 1527 y(excels)g(on)e(the)i(latter)m(,)e(while)i(of)o
+(fering)c(modest)j(reductions)e(in)j(the)-112 1626 y(volume)d(of)i
+(code)g(that)g(needs)g(to)g(be)g(written.)-34 1728 y(W)-7
+b(e)17 b(converted)d(by)h(hand)g(the)i(Open)e(OODB)i(query)e(optimizer)
+s(')-5 b(s)-116 1828 y(V)-11 b(olcano)16 b(speci\256cations)g(to)h
+(Prairie.)26 b(This)17 b(was)h(a)f(non-trivial)e(task)-112
+1928 y(because)27 b(of)h(the)g(relatively)f(lar)o(ge)g(size)i(of)f(the)
+g(rule)f(set)i(and)f(the)-112 2027 y(complexity)f(of)j(the)g(support)e
+(functions.)55 b(This)30 b(was)g(where)f(we)-112 2127
+y(found)c(Prairie)j(helped)f(in)g(conceptually)f(simplifying)g(the)i
+(rules)-120 2226 y(and)13 b(actions.)24 b(W)-7 b(e)15
+b(then)e(used)h(our)f(P2V)h(pre-processor)d(to)j(reconsti-)-120
+2326 y(tute)g(these)f(Prairie)h(speci\256cations)f(as)i(V)-11
+b(olcano)13 b(speci\256cations.)24 b(As)-113 2426 y(described)18
+b(in)h(Section)h(3,)f(this)h(process)f(involved)f(a)i(considerable)-112
+2525 y(level)g(of)h(complexity)-5 b(,)19 b(partly)h(because)g(the)h
+(Prairie)g(speci\256cation)-116 2625 y(had)16 b(22)h(T)-8
+b(-rules)17 b(and)g(1)m(1)f(I-rules)h(compared)e(to)i(17)g(trans)p
+1537 2625 V 29 w(rules)g(and)-112 2725 y(9)24 b(impl)p
+112 2725 V 29 w(rules)g(in)g(the)g(V)-11 b(olcano)23
+b(speci\256cation;)i(the)f(reconstituted)-112 2824 y(V)-11
+b(olcano)28 b(speci\256cation)h(had)g(the)h(same)f(number)f(of)i(trans)
+p 1671 2824 V 29 w(rules)-112 2924 y(and)19 b(impl)p
+186 2924 V 29 w(rules)h(as)h(the)g(original)e(hand-coded)e
+(speci\256cation.)-36 3026 y(Converting)12 b(the)i(Open)g(OODB)h
+(optimizer)f(rule)g(set)h(into)f(Prairie)-112 3125 y(format)19
+b(actually)h(simpli\256ed)g(its)h(speci\256cation)f(as)h(the)g
+(complexi-)-112 3225 y(ties)i(of)g(the)g(V)-11 b(olcano)22
+b(model)h(were)f(removed.)34 b(The)22 b(reduction)g(in)-119
+3325 y(lines)16 b(of)e(code)h(was)g(modest)g(\320)g(there)g(was)g
+(about)f(a)i(10\045)e(savings.)1826 3295 y Ft(5)-112
+3424 y FG(However)m(,)24 b(as)h(mentioned)e(above,)h(savings)g(in)h
+(lines)g(of)f(code)g(do)-112 3524 y(not)j(adequately)f(re\257ect)i
+(increases)g(in)g(programmer)c(productiv-)-112 3624 y(ity)-5
+b(.)37 b(W)-7 b(e)24 b(found)e(the)i(encapsulated)e(speci\256cations)h
+(of)h(Prairie)f(\320)-117 3723 y(namely)-5 b(,)15 b(the)h(use)h(of)f(a)
+h(single)f(descriptor)f(and)g(fewer)h(explicit)g(sup-)-112
+3823 y(port)j(functions)g(\320)i(made)e(rule)h(programming)d
+FF(much)i FG(easier)-5 b(.)-112 4073 y Fx(4.3)99 b(Performance)81
+b(r)n(esults)f(using)f(the)i(Open)112 4189 y(OODB)24
+b(optimizer)-32 4349 y FG(The)17 b(acid)h(test)h(of)f(Prairie)g(was)g
+(whether)f(Prairie)h(speci\256cations)-117 4449 y(could)d(be)h
+(translated)g(into)g(ef)o(\256cient)f(optimizer)g(implementations.)-112
+4549 y(Our)24 b(experiments)f(using)h(the)h(Open)f(OODB)i(consisted)e
+(of)g(opti-)-112 4648 y(mizing)j(8)g(dif)o(ferent)f(queries)h(using)h
+(the)f(two)h(query)f(optimizers)-113 4748 y(generated,)19
+b(respectively)-5 b(,)18 b(using)i(Prairie)g(and)f(using)h(V)-11
+b(olcano)19 b(di-)-116 4847 y(rectly)e(\(in)g(the)g(remainder)f(of)h
+(this)h(section,)f(we)h(will)g(use)g(\252Prairie\272)-116
+4947 y(and)f(\252V)-11 b(olcano\272)17 b(to)g(denote)g(these)g(two)h
+(approaches\).)24 b(There)16 b(were)p -112 5028 788 4
+v -28 5081 a Fr(5)7 5105 y Fz(The)e(original)i(V)-9 b(olcano)17
+b(speci\256cation)g(had)e Fc(13)p Fb(;)d Fc(400)i Fz(lines,)i(the)f
+(Prairie)h(speci-)-112 5184 y(\256cation)d(had)g Fc(12)p
+Fb(;)f Fc(100)h Fz(lines,)g(and)g(the)g(P2V)-6 b(-generated)15
+b(V)-9 b(olcano)14 b(speci\256cation)h(had)-112 5263
+y Fc(15)p Fb(;)c Fc(800)18 b Fz(lines.)2042 21 y FG(4)h(distinct)g
+(expressions)e(that)i(were)g(used)f(to)h(generate)f(the)g(queries)2044
+120 y(used)i(in)h(the)g(experiments;)f(these)h(are)g(shown)f(in)h
+(Figure)f(6.)30 b(Each)2044 220 y(expression)19 b(represents)g(an)h
+Fv(N)9 b FG(-way)20 b(join)f(query)g(for)h(varying)e
+Fv(N)9 b FG(.)2127 329 y(The)26 b(\256rst)h(expression)f(E1)g(is)i(a)f
+(simple)f(retrieval)g(and)g(join)g(of)2044 429 y(base)21
+b(classes.)32 b(The)21 b(second,)f(E2,)h(is)i(also)e(a)h(join)f(of)g
+(base)h(classes;)2039 528 y(however)m(,)16 b(after)g(each)g(class)i
+(retrieval,)e(an)h(attribute)f(has)g(to)h(be)g(ma-)2043
+628 y(terialized)h(\(i.e.,)h(brought)e(into)i(view\))g(before)f(the)i
+(join.)26 b(The)19 b(third)2044 727 y(and)g(fourth)f(expressions)h
+(\(E3)h(and)f(E4\))h(are)g(the)g(same)g(as)h(the)f(\256rst)2044
+827 y(and)j(second)g(\(E1)g(and)g(E2\))g(respectively)-5
+b(,)22 b(except)h(that)h(there)f(is)i(a)2044 927 y(selection)e(of)g
+(attributes)g(\(the)g(select)h(operator)e(is)i(the)f(root)g(of)g(the)
+2044 1026 y(expressions\).)2482 996 y Ft(6)2127 1135
+y FG(The)e(algebra)f(that)h(was)h(used)f(in)g(the)h(Prairie)f(and)f(V)
+-11 b(olcano)21 b(op-)2044 1235 y(timizers)h(for)f(our)h(experiments)e
+(consisted)i(of)g(5)g(relational)f(oper)n(-)2044 1335
+y(ators)27 b(SELECT)-6 b(,)27 b(PROJECT)-6 b(,)28 b(JOIN,)f(RET)g(and)g
+(UNNEST)g(\(for)2042 1434 y(set-valued)18 b(attributes\))h(and)f(an)h
+(object-oriented)d(operator)i(called)2038 1534 y(MA)-9
+b(T)15 b(\(for)f(MA)-9 b(T)j(erialize;)16 b(it)g(is)g(fundamentally)c
+(a)k(pointer)n(-chasing)2044 1633 y(operator)i(for)i(attributes)f(of)h
+(a)h(class\).)27 b(There)20 b(were)g(8)g(algorithms.)2119
+1743 y(There)12 b(are)i(many)e(parameters)h(that)g(can)h(be)f(varied)g
+(when)g(bench-)2044 1842 y(marking)19 b(a)j(query)e(optimizer)-5
+b(.)30 b(Since)21 b(our)g(objective)f(was)i(to)f(ver)n(-)2043
+1942 y(ify)f(that)g(the)g(Prairie)g(approach)e(did)i(not)f(sacri\256ce)
+h(ef)o(\256ciency)-5 b(,)18 b(our)2044 2041 y(criteria)26
+b(for)f(the)i(queries)e(was)i(that)f(they)g(test)h(a)g(majority)e(of)h
+(the)2036 2141 y(rules,)14 b(with)g(varying)d(properties)i(of)g(the)g
+(base)h(classes.)25 b(T)-6 b(o)14 b(this)g(end,)2044
+2241 y(we)21 b(tested)h(our)e(optimizer)g(\(and)g(the)h(V)-11
+b(olcano)20 b(optimizer\))g(with)h(8)2044 2340 y(dif)o(ferent)g
+(queries)h(\(shown)g(in)i(T)-6 b(able)23 b(3\).)35 b(The)23
+b(eight)g(queries)f(Q1)2044 2440 y(through)d(Q8)j(are)g(derived)e(from)
+h(the)h(4)g(expressions)e(in)i(Figure)f(6.)2039 2540
+y(Each)16 b(expression)f(E1)i(through)d(E4)i(is)h(used)g(to)f(obtain)g
+(two)g(queries)2044 2639 y(for)k(a)h(\256xed)f(number)f
+Fv(N)29 b FG(of)21 b(JOINs)g(in)g(the)f(expression.)27
+b(The)20 b(only)2039 2739 y(dif)o(ference)13 b(between)i(the)h(two)g
+(queries)f(obtained)g(from)g(an)g(expres-)2043 2838 y(sion)k(is)i(that)
+e(the)h(\256rst)g(one)f(does)g(not)h(contain)e(any)h(indices)g(on)g
+(any)2044 2938 y(classes,)25 b(whereas)d(the)h(second)g(one)f(contains)
+h(a)g(single)g(index)f(on)2044 3038 y(each)f(base)i(class)g(occurring)c
+(in)j(the)g(expression.)31 b(In)22 b(expressions)2041
+3137 y(where)17 b(a)h(SELECT)g(is)g(present)f(\(E3)h(and)f(E4\),)g(the)
+h(selection)f(pred-)2044 3237 y(icate)k(is)g(a)g(conjunction)d(of)i
+(equality)g(predicates)f FF(bc)3584 3249 y Fu(i)3636
+3237 y Fh(==)k FF(const)3964 3249 y Fu(i)3992 3237 y
+FG(,)2042 3337 y(where)17 b FF(bc)2342 3349 y Fu(i)2388
+3337 y FG(is)j(an)e(attribute)g(of)g(class)h FF(C)3179
+3349 y Fu(i)3207 3337 y FG(,)g(and)f FF(const)3561 3349
+y Fu(i)3608 3337 y FG(is)h(a)g(constant)2044 3436 y(\(we)k(arbitrarily)
+e(set)j(this)f(to)g Fv(i)p FG(,)g(because)g(its)g(value)g(doesn')o(t)e
+(af)o(fect)2035 3536 y(the)14 b(correctness)e(or)h(performance)e(of)i
+(the)g(optimizer\).)23 b(In)13 b(addition,)2041 3635
+y(for)18 b(queries)g(with)g(a)h(SELECT)f(and)g(whose)g(base)g(classes)i
+(have)e(in-)2040 3735 y(dices)f(\(Q6)f(and)h(Q8)f(in)h(T)-6
+b(able)17 b(3\),)g(the)g(\(single\))f(index)g(of)g(each)h(base)2044
+3835 y(class)22 b(was)g(chosen)e(to)h(be)g(the)g(attribute)g
+(referenced)e(in)i(the)g(selec-)2044 3934 y(tion)27 b(predicate.)46
+b(For)27 b(example,)h(class)g FF(C)3293 3946 y Fu(i)3348
+3934 y FG(was)g(chosen)e(to)i(have)2042 4034 y(an)18
+b(index)g(on)g(attribute)g FF(bc)2819 4046 y Fu(i)2847
+4034 y FG(.)27 b(The)18 b(join)h(predicates)e(for)h(each)h(JOIN)2037
+4134 y(were)14 b(chosen)f(at)i(random,)f(and)f(were)h(always)h
+(equality)e(predicates.)2039 4233 y(The)j(choice)f(of)h(JOIN)h
+(predicates)e(was)i(such)f(that)g(the)h(queries)e(cor)n(-)2044
+4333 y(responded)j(to)j(linear)g(query)e(graphs.)27 b(In)21
+b(the)f(future,)g(we)h(will)g(ex-)2044 4432 y(periment)e(with)h
+(non-linear)e(\(e.g.,)h(star\))h(query)f(graphs.)2127
+4542 y(T)-6 b(able)52 b(3)g(also)h(shows)f(the)h(number)d(of)i(trans)p
+3654 4542 25 4 v 29 w(rules)h(and)p 2044 4633 788 4 v
+2129 4687 a Fr(6)2163 4710 y Fz(The)17 b(most)g(complex)i(expression)g
+(E4)e(consists)h(of)f(all)h(operators)h(in)f(the)g(alge-)2044
+4789 y(bra,)24 b(except)h(PROJECT)d(and)h(UNNEST)-5 b(.)21
+b(PROJECT)h(was)g(not)i(considered)h(be-)2044 4868 y(cause)16
+b(it)g(appeared)i(in)d(only)h(one)g(impl)p 2948 4868
+20 4 v 25 w(rule)g(and)g(no)f(trans)p 3411 4868 V 25
+w(rules,)h(and)g(thus,)f(would)2044 4947 y(not)22 b(af)o(fect)h(the)f
+(size)g(of)f(the)i(search)f(space)h(of)e(abstract)j(expressions.)37
+b(UNNEST)2044 5026 y(was)20 b(not)h(considered)h(because)g(it)f
+(appeared)i(in)d(exactly)j(one)e(trans)p 3657 5026 V
+25 w(rule)g(and)g(one)2044 5105 y(impl)p 2169 5105 V
+24 w(rule;)g(including)g(it)e(in)g(our)f(queries)i(would)g(have)f
+(increased)i(the)e(number)g(of)2044 5184 y(parameters)f(that)g(could)f
+(af)o(fect)h(our)f(run-times.)23 b(W)-5 b(e)16 b(preferred)i(to)f
+(concentrate)j(on)2044 5263 y(simple)d(JOIN)g(expressions.)p
+eop
+%%Page: 8 8
+8 7 bop -112 24 2130 4 v -112 1001 4 978 v -37 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+
+-37 707 a Fa(C)-10 719 y Fn(1)-47 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ -47 618 a Fm(RET)-7
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 152 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 152 707 a Fa(C)179 719 y Fn(2)142
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 142 618 a Fm(RET)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 42 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 3.39499 0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 42
+524 a Fm(JOIN)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 182
+415 a
+ tx@Dict begin 45. Rot end
+ 182 415 a 143 418 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 143 418 a Fl(:)10 b(:)g(:)182
+415 y
+ tx@Dict begin 45. neg Rot end
+ 182 415 a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ -7 699 a 331 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 331 429 a
+Fm(RET)336 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.32748 0.99998
+false .5 8.23895 InitRnode } NewNode end end
+ 336 520 a Fa(C)364 528 y Fl(n)-7 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 231 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.39499
+0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 231 335 a Fm(JOIN)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ -7 699
+a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 100 881 a Fz(\(a\))17 b(E1)p 447
+976 4 928 v 476 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 476 707 a Fa(C)504 719 y Fn(1)467
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 467 618 a Fm(RET)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 665 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+
+665 707 a Fa(C)693 719 y Fn(2)656 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 656 618 a Fm(RET)506
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 463 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 463 524 a Fm(MA)-5 b(T)506
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 652 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 652 524 a Fm(MA)g(T)506 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 556 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 3.39499 0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 556 429 a Fm(JOIN)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506
+699 a 506 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 695 321 a
+ tx@Dict begin 45. Rot end
+ 695 321 a 656 324
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 656 324 a Fl(:)11 b(:)f(:)695 321 y
+ tx@Dict begin 45. neg Rot end
+ 695 321 a 506 699
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 506 699 a 845 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 845 429 a Fm(RET)850 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.32748 0.99998
+false .5 8.23895 InitRnode } NewNode end end
+ 850
+520 a Fa(C)878 528 y Fl(n)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 841 335
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 841 335 a Fm(MA)-5 b(T)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 745 240
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.39499
+0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 745 240 a Fm(JOIN)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 506 699 a 506 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506
+699 a 611 881 a Fz(\(b\))17 b(E2)p 961 976 4 928 v 990
+707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 990 707 a Fa(C)1018 719 y Fn(1)981 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 981 618
+a Fm(RET)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1179 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 1179 707 a
+Fa(C)1207 719 y Fn(2)1170 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 1170 618 a Fm(RET)1020
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1070 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 3.39499 0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 1070 524 a Fm(JOIN)1020 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1209 415 a
+ tx@Dict begin 45. Rot end
+ 1209 415
+a 1170 418 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 1170 418 a Fl(:)11 b(:)f(:)1209 415 y
+ tx@Dict begin 45. neg Rot end
+ 1209
+415 a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699 a 1359 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 1359 429 a Fm(RET)1364
+520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.32748 0.99998
+false .5 8.23895 InitRnode } NewNode end end
+ 1364 520 a Fa(C)1392 528 y Fl(n)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020
+699 a 1259 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.39499
+0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 1259 335 a Fm(JOIN)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699
+a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1227 240 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 3.39499
+0.05246 false .5 18.3349 InitRnode } NewNode end end
+ 1227 240 a Fm(SELECT)1020
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699 a 1127 881 a Fz(\(c\))17 b(E3)p 1474 976
+4 928 v 1504 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 1504 707 a Fa(C)1531 719 y Fn(1)1495
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 1495 618 a Fm(RET)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1693 707
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 1693 707 a Fa(C)1720 719 y Fn(2)1684 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 1684 618
+a Fm(RET)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1490 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 1490 524 a
+Fm(MA)-5 b(T)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1679 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 1679 524
+a Fm(MA)g(T)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1583 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 3.39499 0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 1583 429
+a Fm(JOIN)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a
+1723 321 a
+ tx@Dict begin 45. Rot end
+ 1723 321 a 1684 324 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 1684 324 a Fl(:)10 b(:)h(:)1723
+321 y
+ tx@Dict begin 45. neg Rot end
+ 1723 321 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1873 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 1873
+429 a Fm(RET)1878 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.32748 0.99998
+false .5 8.23895 InitRnode } NewNode end end
+ 1878 520 a Fa(C)1905 528 y Fl(n)1534
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1868 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 1868 335 a Fm(MA)-5 b(T)1534
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1772 240 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.39499
+0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 1772 240 a Fm(JOIN)1534 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1741 146 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 3.39499
+0.05246 false .5 18.3349 InitRnode } NewNode end end
+ 1741 146
+a Fm(SELECT)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1639 881 a Fz(\(d\))17
+b(E4)p 2014 1001 4 978 v -112 1004 2130 4 v 2015 1021
+19 984 v -96 1021 2130 19 v -112 1204 a FG(Figure)g(6:)26
+b(Expressions)17 b(used)h(in)g(generating)e(queries)i(for)f
+(experiments)p 2359 357 1644 13 v 2359 423 4 67 v 2412
+437 a Fp(Query)p 2620 423 V 2673 443 a(Indices?)p 2930
+423 V 2983 437 a(Expr)o(ession)p 3306 423 V 3471 403
+a(Rules)e(matched)p 3999 423 V 3309 427 694 4 v 2359
+490 4 67 v 2620 490 V 2930 490 V 3306 490 V 3359 470
+a Fo(trans)p 3475 470 18 4 v 21 w(rules)p 3656 490 4
+67 v 103 w(impl)p 3818 470 18 4 v 22 w(rules)p 3999 490
+4 67 v 2359 502 1644 13 v 2359 569 4 67 v 2456 549 a(Q1)p
+2620 569 V 214 w(No)p 2930 569 V 3087 588 a(E1)p 3306
+569 V 316 w(3)p 3656 569 V 318 w(3)p 3999 569 V 2359
+572 575 4 v 2359 635 4 67 v 2456 615 a(Q2)p 2620 635
+V 207 w(Y)-6 b(es)p 2930 635 V 3306 635 V 3656 635 V
+3999 635 V 2359 638 1644 4 v 2359 705 4 67 v 2456 685
+a(Q3)p 2620 705 V 214 w(No)p 2930 705 V 3087 725 a(E2)p
+3306 705 V 3468 724 a(8)p 3656 705 V 3815 725 a(4)p 3999
+705 V 2359 708 575 4 v 2359 771 4 67 v 2456 751 a(Q4)p
+2620 771 V 207 w(Y)g(es)p 2930 771 V 3306 771 V 3656
+771 V 3999 771 V 2359 775 1644 4 v 2359 841 4 67 v 2456
+821 a(Q5)p 2620 841 V 214 w(No)p 2930 841 V 3087 860
+a(E3)p 3306 841 V 316 w(9)p 3656 841 V 3815 861 a(5)p
+3999 841 V 2359 844 575 4 v 2359 907 4 67 v 2456 887
+a(Q6)p 2620 907 V 207 w(Y)g(es)p 2930 907 V 3306 907
+V 3656 907 V 3999 907 V 2359 911 1644 4 v 2359 977 4
+67 v 2456 957 a(Q7)p 2620 977 V 214 w(No)p 2930 977 V
+3087 997 a(E4)p 3306 977 V 302 w(16)p 3656 977 V 3815
+996 a(7)p 3999 977 V 2359 980 575 4 v 2359 1044 4 67
+v 2456 1024 a(Q8)p 2620 1044 V 207 w(Y)g(es)p 2930 1044
+V 3306 1044 V 3656 1044 V 3999 1044 V 2359 1056 1644
+13 v 2566 1204 a FG(T)g(able)20 b(3:)27 b(Queries)20
+b(used)g(in)h(experiments)-112 1554 y(impl)p 46 1554
+25 4 v 29 w(rules)37 b(that)h(are)f(matched)g(by)g(each)g(expression.)
+78 b(These)-112 1653 y(are)21 b(the)g(rules)g(whose)g(left)g(hand)f
+(sides)i(match)f(a)g(sub-expression.)-112 1753 y(However)m(,)f(not)h
+(all)h(the)g(rules)f(were)h(necessarily)f(applicable.)30
+b(For)-112 1853 y(instance,)25 b(an)g(impl)p 469 1853
+V 29 w(rule)f(with)i(an)e(index)g(scan)h(would)f(not)h(apply)-112
+1952 y(to)20 b(Q3,)g(although)e(it)j(might)f(apply)f(to)h(Q4.)-29
+2054 y(Queries)32 b(Q1)h(through)e(Q8)i(were)g(optimized)f(for)g
+(increasing)-119 2153 y(number)12 b Fv(N)24 b FG(of)15
+b(JOINs.)25 b(For)15 b(a)g(\256xed)f(number)e(of)j(JOINs)g(in)g(a)g
+(query)-5 b(,)-112 2253 y(we)21 b(varied)f(the)g(cardinalities)h(of)f
+(the)h(base)g(classes)h(5)f(times,)g(each)-112 2353 y(time)g
+(generating)f(a)i(query)f(with)h(dif)o(ferent)d(class)k(properties,)d
+(and)-112 2452 y(averaged)e(the)j(run-times)e(over)h(the)h(5)f(query)g
+(instances)g(to)h(gener)n(-)-114 2552 y(ate)d(the)h(per)n(-query)d
+(optimization)h(time.)27 b(Thus,)18 b(each)g(point)g(in)h(our)-112
+2652 y(graphs)25 b(represents)g(the)h(average)f(of)h(5)g(queries.)44
+b(The)26 b(run-times)-112 2751 y(were)f(measured)395
+2721 y Ft(7)457 2751 y FG(using)h(the)g(GNU)g Fd(time)g
+FG(command.)43 b(All)26 b(ex-)-112 2851 y(periments)f(were)h(performed)
+e(on)i(a)h(lightly)f(loaded)f(DECstation)-112 2950 y(5000/200)17
+b(running)h(Ultrix)i(4.2.)-37 3052 y(The)14 b(optimization)e(times)i
+(for)g(each)f(query)g(for)g(both)g(approaches)-120 3152
+y(\(Prairie)h(and)g(V)-11 b(olcano\))13 b(are)h(shown)g(in)g(Figures)g
+(7\(a\))f(through)f(7\(h\).)-112 3251 y(The)25 b(number)f(of)i(joins)g
+(in)g(each)g(set)g(of)g(graphs)f(was)h(varied)f(to)h(a)-112
+3351 y(maximum)18 b(of)i(8,)g(or)g(until)g(virtual)f(memory)g(was)i
+(exhausted.)-29 3452 y(The)i(\256rst)h(set)g(of)f(graphs)f(\(Figures)h
+(7\(a\))g(and)f(7\(b\)\))g(shows)i(the)-112 3552 y(performance)j(of)k
+(a)g(simple)g(relational-type)d(query)-5 b(.)57 b(The)30
+b(opti-)-117 3652 y(mization)16 b(times)h(are)g(almost)g(identical)f
+(between)g(Prairie)h(and)f(V)-11 b(ol-)-112 3751 y(cano,)21
+b(and)h(the)g(notable)f(point)h(is)h(that)f(the)h(presence)e(of)h(an)g
+(index)-120 3851 y(does)14 b(not)g(change)f(the)h(optimizer)s(')-5
+b(s)13 b(behavior)m(,)g(i.e.,)i(the)f(two)g(graphs)-112
+3951 y(are)20 b(identical.)28 b(This)21 b(arises)g(because)f(the)g
+(optimizer)g(algebra)f(had)-118 4050 y(only)d(two)g(join)g(algorithms)e
+(\(pointer)h(join)g(and)h(hash)g(join\),)g(neither)-112
+4150 y(of)j(which)h(makes)g(use)g(of)g(any)g(indices.)-29
+4251 y(The)25 b(second)g(set)i(of)f(graphs)f(\(Figures)g(7\(c\))h(and)f
+(7\(d\)\))g(shows)-118 4351 y(the)16 b(results)g(of)f(optimizing)g(Q3)g
+(and)h(Q4.)25 b(Here,)16 b(as)h(in)f(Figures)f(7\(a\))-114
+4451 y(and)j(7\(b\),)g(the)h(presence)f(\(or)g(absence\))g(of)g
+(indices)h(makes)g(no)f(dif-)-118 4550 y(ference.)24
+b(Both)16 b(the)f(Prairie)h(and)f(V)-11 b(olcano)15 b(approaches)e
+(have)i(com-)-117 4650 y(parable)g(run-times.)24 b(The)16
+b(sharp)f(jump)g(in)i(the)f(graphs)f(from)g(7-way)-115
+4750 y(to)j(8-way)f(joins)h(is)h(due)e(to)h(the)g(fact)g(that)g(since)g
+(all)g(optimization)f(is)-113 4849 y(done)i(in)h(main)f(memory)-5
+b(,)17 b(dynamic)i(memory)f(allocation)g(\(caused)-112
+4949 y(by)j Fd(malloc)h FG(calls\))h(results)f(in)h(a)g(lot)f(of)g
+(thrashing)f(at)i(this)g(point.)p -112 5028 788 4 v -28
+5081 a Fr(7)7 5105 y Fz(Since)j(the)g(run-times)h(were)f(too)f(small)h
+(to)g(be)f(measured)h(accurately)j(with)-112 5184 y Fy(time)p
+Fz(,)19 b(each)i(query)g(instance)h(was)e(optimized)i(3000)f(times)f
+(\(in)h(a)f(loop\))h(and)f(the)-112 5263 y(total)e(time)g(was)f
+(divided)i(by)e(3000)g(to)g(get)h(the)g(per)o(-query)g(optimization)j
+(time.)2042 1554 y FG(W)-7 b(e)20 b(speculate)e(that)h(in)g(systems)g
+(with)g(more)f(virtual)g(memory)-5 b(,)17 b(the)2044
+1653 y(graphs)i(will)i(be)f(smoother)-5 b(.)2122 1758
+y(The)16 b(third)f(and)h(fourth)e(sets)j(of)f(graphs)f(in)h(Figures)g
+(7\(e\))f(through)2043 1857 y(7\(h\))k(are)h(optimizations)f(of)g
+(queries)h(with)g(a)g(selection)g(predicate.)2039 1957
+y(In)c(these)g(cases,)h(the)g(presence)e(of)g(an)i(index)e(makes)g(a)i
+(dif)o(ference)d(if)2044 2057 y(the)20 b(index)g(is)i(referenced)c(in)j
+(the)g(selection)f(predicate)f(\(as)i(we)g(de-)2042 2156
+y(signed\).)26 b(Also,)19 b(in)g(these)h(two)f(\256gures,)f(the)h
+(performance)e(of)h(both)2040 2256 y(Prairie)g(and)e(V)-11
+b(olcano)17 b(was)h(almost)f(identical,)g(except)g(that)h(Prairie)2044
+2356 y(does)29 b(slightly)g(worse)g(due)g(to)h(the)f(lar)o(ger)f
+(number)g(of)h Fd(malloc)2044 2455 y FG(calls)23 b(that)g(the)f(P2V)h
+(translator)f(introduces.)32 b(Also,)24 b(note)e(that)h(we)2043
+2555 y(could)c(only)g(go)g(up)h(to)g(3-way)f(joins)g(before)g(virtual)g
+(memory)f(was)2044 2654 y(exhausted.)31 b(As)23 b(the)f(available)g
+(memory)e(decreases,)i(there)g(is)h(in-)2039 2754 y(creased)16
+b(thrashing)f(\(as)i(shown)f(by)g(the)g(sharp)g(changes)g(in)g(slope)g
+(in)2044 2854 y(the)k(plots\))g(resulting)f(in)i(a)f(much)f(slower)h
+(optimization)f(process.)2127 2958 y(In)j(all)h(four)f(sets)i(of)e
+(plots,)h(we)g(can)f(see)i(that)e(Prairie)h(performs)2044
+3058 y(with)f(almost)g(\(less)h(than)f Fh(5\045)g FG(variation\))e(the)
+j(same)f(ef)o(\256ciency)e(as)2044 3158 y(V)-11 b(olcano.)29
+b(In)21 b(extreme)f(cases,)i(when)e(memory)g(is)i(scarce,)f(Prairie)
+2040 3257 y(runs)c(more)g(slowly)h(\(about)e Fh(15\045)p
+FG(\))h(\(e.g.,)g(Figure)f(7\(f\)\),)h(but)g(we)h(be-)2044
+3357 y(lieve)25 b(that)g(this)h(situation)f(already)f(represents)h(a)h
+(serious)f(bottle-)2044 3456 y(neck)19 b(for)h(both)f(V)-11
+b(olcano)19 b(and)h(Prairie.)2120 3561 y(The)14 b(results)i(presented)d
+(in)i(this)g(section)f(show)h(that)g(Prairie)f(opti-)2039
+3661 y(mizers)i(need)f(not)h(sacri\256ce)g(ef)o(\256ciency)e(for)i
+(clarity)-5 b(,)15 b(even)h(for)f(lar)o(ge)2038 3760
+y(rule)h(sets.)26 b(More)15 b(research)g(and)g(validation)f(is)j
+(necessary)e(to)h(verify)2044 3860 y(that)k(Prairie)g(is)h(an)f(ef)o
+(\256cient)g(tool)g(for)f(optimizer)g(speci\256cation.)2044
+4166 y FB(5)119 b(Related)31 b(r)n(esear)n(ch)2041 4361
+y FG(The)18 b(System)g(R)i(optimizer)d([1)m(1])g(was)h(the)h(most)f
+(important)e(devel-)2044 4461 y(opment)j(in)j(query)d(optimization)h
+(research.)28 b(It)22 b(was)g(a)f(cost-based)2044 4560
+y(centralized)h(relational)g(query)g(optimizer)g(and)g(introduced)f(a)i
+(va-)2044 4660 y(riety)i(of)h(key)f(concepts)g(like)h
+(\252interesting\272)f(expressions,)h(cardi-)2043 4759
+y(nality)20 b(estimation)f(using)h(selectivity)f(factors)h(and)f
+(dynamic)g(pro-)2044 4859 y(gramming)28 b(with)j(pruning)e(of)h(search)
+g(space.)59 b(These)30 b(concepts)2044 4959 y(continue)18
+b(to)j(be)f(important)f(in)h(query)f(optimizer)g(research.)2127
+5063 y(The)29 b(query)g(optimizer)g(in)h(R)3005 5033
+y Ff(\003)3074 5063 y FG([3])f(works)h(in)g(essentially)g(the)2039
+5163 y(same)17 b(way)f(as)h(that)g(of)f(System)g(R,)h(except)f(that)g
+(R)3480 5133 y Ff(\003)3536 5163 y FG(is)h(a)g(distributed)2044
+5263 y(database)32 b(system)g(which)g(introduces)f(some)h(subtle)g
+(complica-)p eop
+%%Page: 9 9
+9 8 bop -104 24 1935 4 v -104 3720 4 3696 v 66 714 a
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q1.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 611 m
+430 611 l
+420 846 m
+430 846 l
+420 1081 m
+430 1081 l
+420 1315 m
+430 1315 l
+420 1550 m
+430 1550 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 611 m
+2020 611 l
+2030 846 m
+2020 846 l
+2030 1081 m
+2020 1081 l
+2030 1315 m
+2020 1315 l
+2030 1550 m
+2020 1550 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 846 m
+440 846 l
+420 1315 m
+440 1315 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 846 m
+2010 846 l
+2030 1315 m
+2010 1315 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 846 m
+gsave
+348 846 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 1315 m
+gsave
+348 1315 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 418 m
+621 537 l
+822 661 l
+1023 789 l
+1225 909 l
+1426 1046 l
+1627 1183 l
+1828 1320 l
+2030 1449 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 537 30 0 360 arc
+gsave fill grestore
+stroke
+822 661 30 0 360 arc
+gsave fill grestore
+stroke
+1023 789 30 0 360 arc
+gsave fill grestore
+stroke
+1225 909 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1046 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1183 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1320 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1449 30 0 360 arc
+gsave fill grestore
+stroke
+420 421 m
+621 541 l
+822 670 l
+1023 801 l
+1225 935 l
+1426 1066 l
+1627 1229 l
+1828 1355 l
+2030 1504 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 451 m
+390 421 l
+420 391 l
+450 421 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 451 m
+390 421 l
+420 391 l
+450 421 l
+420 451 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 571 m
+591 541 l
+621 511 l
+651 541 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 571 m
+591 541 l
+621 511 l
+651 541 l
+621 571 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 700 m
+792 670 l
+822 640 l
+852 670 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 700 m
+792 670 l
+822 640 l
+852 670 l
+822 700 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 831 m
+993 801 l
+1023 771 l
+1053 801 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 831 m
+993 801 l
+1023 771 l
+1053 801 l
+1023 831 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 965 m
+1195 935 l
+1225 905 l
+1255 935 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 965 m
+1195 935 l
+1225 905 l
+1255 935 l
+1225 965 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 1096 m
+1396 1066 l
+1426 1036 l
+1456 1066 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 1096 m
+1396 1066 l
+1426 1036 l
+1456 1066 l
+1426 1096 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 1259 m
+1597 1229 l
+1627 1199 l
+1657 1229 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 1259 m
+1597 1229 l
+1627 1199 l
+1657 1229 l
+1627 1259 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+1828 1385 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+2030 1534 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 843 a Fz(\(a\))17 b(Query)h(1)974 714
+y @beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q2.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 611 m
+430 611 l
+420 846 m
+430 846 l
+420 1081 m
+430 1081 l
+420 1315 m
+430 1315 l
+420 1550 m
+430 1550 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 611 m
+2020 611 l
+2030 846 m
+2020 846 l
+2030 1081 m
+2020 1081 l
+2030 1315 m
+2020 1315 l
+2030 1550 m
+2020 1550 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 846 m
+440 846 l
+420 1315 m
+440 1315 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 846 m
+2010 846 l
+2030 1315 m
+2010 1315 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 846 m
+gsave
+348 846 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 1315 m
+gsave
+348 1315 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+420 418 m
+621 539 l
+822 664 l
+1023 783 l
+1225 906 l
+1426 1037 l
+1627 1176 l
+1828 1304 l
+2030 1451 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 539 30 0 360 arc
+gsave fill grestore
+stroke
+822 664 30 0 360 arc
+gsave fill grestore
+stroke
+1023 783 30 0 360 arc
+gsave fill grestore
+stroke
+1225 906 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1037 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1176 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1304 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1451 30 0 360 arc
+gsave fill grestore
+stroke
+420 412 m
+621 533 l
+822 661 l
+1023 796 l
+1225 926 l
+1426 1063 l
+1627 1212 l
+1828 1355 l
+2030 1504 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 442 m
+390 412 l
+420 382 l
+450 412 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 442 m
+390 412 l
+420 382 l
+450 412 l
+420 442 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 563 m
+591 533 l
+621 503 l
+651 533 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 563 m
+591 533 l
+621 503 l
+651 533 l
+621 563 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 691 m
+792 661 l
+822 631 l
+852 661 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 691 m
+792 661 l
+822 631 l
+852 661 l
+822 691 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 826 m
+993 796 l
+1023 766 l
+1053 796 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 826 m
+993 796 l
+1023 766 l
+1053 796 l
+1023 826 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 956 m
+1195 926 l
+1225 896 l
+1255 926 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 956 m
+1195 926 l
+1225 896 l
+1255 926 l
+1225 956 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 1093 m
+1396 1063 l
+1426 1033 l
+1456 1063 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 1093 m
+1396 1063 l
+1426 1033 l
+1456 1063 l
+1426 1093 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 1242 m
+1597 1212 l
+1627 1182 l
+1657 1212 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 1242 m
+1597 1212 l
+1627 1182 l
+1657 1212 l
+1627 1242 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+1828 1385 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+2030 1534 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 843 a(\(b\))f(Query)h(2)p -34 943 1816
+4 v 66 1633 a @beginspecial 50.187500 @llx 50.187500
+@lly 501.875000 @urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q3.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 401 m
+621 489 l
+822 578 l
+1023 672 l
+1225 762 l
+1426 865 l
+1627 969 l
+1828 1076 l
+2030 1574 l
+stroke
+420 401 30 0 360 arc
+gsave fill grestore
+stroke
+621 489 30 0 360 arc
+gsave fill grestore
+stroke
+822 578 30 0 360 arc
+gsave fill grestore
+stroke
+1023 672 30 0 360 arc
+gsave fill grestore
+stroke
+1225 762 30 0 360 arc
+gsave fill grestore
+stroke
+1426 865 30 0 360 arc
+gsave fill grestore
+stroke
+1627 969 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1076 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1574 30 0 360 arc
+gsave fill grestore
+stroke
+420 402 m
+621 485 l
+822 568 l
+1023 644 l
+1225 736 l
+1426 821 l
+1627 918 l
+1828 1019 l
+2030 1511 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 432 m
+390 402 l
+420 372 l
+450 402 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 432 m
+390 402 l
+420 372 l
+450 402 l
+420 432 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 515 m
+591 485 l
+621 455 l
+651 485 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 515 m
+591 485 l
+621 455 l
+651 485 l
+621 515 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 598 m
+792 568 l
+822 538 l
+852 568 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 598 m
+792 568 l
+822 538 l
+852 568 l
+822 598 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 674 m
+993 644 l
+1023 614 l
+1053 644 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 674 m
+993 644 l
+1023 614 l
+1053 644 l
+1023 674 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 766 m
+1195 736 l
+1225 706 l
+1255 736 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 766 m
+1195 736 l
+1225 706 l
+1255 736 l
+1225 766 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 851 m
+1396 821 l
+1426 791 l
+1456 821 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 851 m
+1396 821 l
+1426 791 l
+1456 821 l
+1426 851 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 948 m
+1597 918 l
+1627 888 l
+1657 918 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 948 m
+1597 918 l
+1627 888 l
+1657 918 l
+1627 948 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1049 m
+1798 1019 l
+1828 989 l
+1858 1019 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1049 m
+1798 1019 l
+1828 989 l
+1858 1019 l
+1828 1049 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1541 m
+2000 1511 l
+2030 1481 l
+2060 1511 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1541 m
+2000 1511 l
+2030 1481 l
+2060 1511 l
+2030 1541 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 1761 a(\(c\))f(Query)h(3)974 1633 y
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q4.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+420 400 m
+621 492 l
+822 575 l
+1023 669 l
+1225 759 l
+1426 866 l
+1627 962 l
+1828 1069 l
+2030 1578 l
+stroke
+420 400 30 0 360 arc
+gsave fill grestore
+stroke
+621 492 30 0 360 arc
+gsave fill grestore
+stroke
+822 575 30 0 360 arc
+gsave fill grestore
+stroke
+1023 669 30 0 360 arc
+gsave fill grestore
+stroke
+1225 759 30 0 360 arc
+gsave fill grestore
+stroke
+1426 866 30 0 360 arc
+gsave fill grestore
+stroke
+1627 962 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1069 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1578 30 0 360 arc
+gsave fill grestore
+stroke
+420 400 m
+621 484 l
+822 567 l
+1023 645 l
+1225 735 l
+1426 823 l
+1627 915 l
+1828 1024 l
+2030 1517 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+420 430 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 514 m
+591 484 l
+621 454 l
+651 484 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 514 m
+591 484 l
+621 454 l
+651 484 l
+621 514 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 597 m
+792 567 l
+822 537 l
+852 567 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 597 m
+792 567 l
+822 537 l
+852 567 l
+822 597 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 675 m
+993 645 l
+1023 615 l
+1053 645 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 675 m
+993 645 l
+1023 615 l
+1053 645 l
+1023 675 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 765 m
+1195 735 l
+1225 705 l
+1255 735 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 765 m
+1195 735 l
+1225 705 l
+1255 735 l
+1225 765 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 853 m
+1396 823 l
+1426 793 l
+1456 823 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 853 m
+1396 823 l
+1426 793 l
+1456 823 l
+1426 853 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 945 m
+1597 915 l
+1627 885 l
+1657 915 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 945 m
+1597 915 l
+1627 885 l
+1657 915 l
+1627 945 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1054 m
+1798 1024 l
+1828 994 l
+1858 1024 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1054 m
+1798 1024 l
+1828 994 l
+1858 1024 l
+1828 1054 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1547 m
+2000 1517 l
+2030 1487 l
+2060 1517 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1547 m
+2000 1517 l
+2030 1487 l
+2060 1517 l
+2030 1547 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 1761 a(\(d\))f(Query)h(4)p -34 1861
+V 66 2551 a @beginspecial 50.187500 @llx 50.187500 @lly
+501.875000 @urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q5.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 552 m
+430 552 l
+420 728 m
+430 728 l
+420 904 m
+430 904 l
+420 1081 m
+430 1081 l
+420 1257 m
+430 1257 l
+420 1433 m
+430 1433 l
+420 1609 m
+430 1609 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 552 m
+2020 552 l
+2030 728 m
+2020 728 l
+2030 904 m
+2020 904 l
+2030 1081 m
+2020 1081 l
+2030 1257 m
+2020 1257 l
+2030 1433 m
+2020 1433 l
+2030 1609 m
+2020 1609 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 728 m
+440 728 l
+420 1081 m
+440 1081 l
+420 1433 m
+440 1433 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 728 m
+2010 728 l
+2030 1081 m
+2010 1081 l
+2030 1433 m
+2010 1433 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 728 m
+gsave
+348 728 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1081 m
+gsave
+348 1081 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1433 m
+gsave
+348 1433 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 424 m
+956 511 l
+1493 671 l
+2030 1778 l
+stroke
+420 424 30 0 360 arc
+gsave fill grestore
+stroke
+956 511 30 0 360 arc
+gsave fill grestore
+stroke
+1493 671 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1778 30 0 360 arc
+gsave fill grestore
+stroke
+420 426 m
+956 522 l
+1493 688 l
+2030 1737 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 456 m
+390 426 l
+420 396 l
+450 426 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 456 m
+390 426 l
+420 396 l
+450 426 l
+420 456 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 552 m
+926 522 l
+956 492 l
+986 522 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 552 m
+926 522 l
+956 492 l
+986 522 l
+956 552 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 718 m
+1463 688 l
+1493 658 l
+1523 688 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 718 m
+1463 688 l
+1493 658 l
+1523 688 l
+1493 718 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1767 m
+2000 1737 l
+2030 1707 l
+2060 1737 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1767 m
+2000 1737 l
+2030 1707 l
+2060 1737 l
+2030 1767 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 2679 a(\(e\))f(Query)h(5)974 2551 y
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q6.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 386 l
+956 376 m
+956 386 l
+1493 376 m
+1493 386 l
+2030 376 m
+2030 386 l
+420 1785 m
+420 1775 l
+956 1785 m
+956 1775 l
+1493 1785 m
+1493 1775 l
+2030 1785 m
+2030 1775 l
+stroke
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+420 415 m
+956 490 l
+1493 633 l
+2030 1651 l
+stroke
+420 415 30 0 360 arc
+gsave fill grestore
+stroke
+956 490 30 0 360 arc
+gsave fill grestore
+stroke
+1493 633 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1651 30 0 360 arc
+gsave fill grestore
+stroke
+420 416 m
+956 493 l
+1493 631 l
+2030 1462 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 446 m
+390 416 l
+420 386 l
+450 416 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 446 m
+390 416 l
+420 386 l
+450 416 l
+420 446 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 523 m
+926 493 l
+956 463 l
+986 493 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 523 m
+926 493 l
+956 463 l
+986 493 l
+956 523 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 661 m
+1463 631 l
+1493 601 l
+1523 631 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 661 m
+1463 631 l
+1493 601 l
+1523 631 l
+1493 661 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1492 m
+2000 1462 l
+2030 1432 l
+2060 1462 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1492 m
+2000 1462 l
+2030 1432 l
+2060 1462 l
+2030 1492 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1178 2679 a(\(f\))f(Query)h(6)p -34 2780
+V 66 3469 a @beginspecial 50.187500 @llx 50.187500 @lly
+501.875000 @urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q7.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-83 1080 m
+gsave
+-83 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 425 m
+956 510 l
+1493 670 l
+2030 1637 l
+stroke
+420 425 30 0 360 arc
+gsave fill grestore
+stroke
+956 510 30 0 360 arc
+gsave fill grestore
+stroke
+1493 670 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1637 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 501 l
+1493 648 l
+2030 1470 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+420 450 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+956 531 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 678 m
+1463 648 l
+1493 618 l
+1523 648 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 678 m
+1463 648 l
+1493 618 l
+1523 648 l
+1493 678 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1500 m
+2000 1470 l
+2030 1440 l
+2060 1470 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1500 m
+2000 1470 l
+2030 1440 l
+2060 1470 l
+2030 1500 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 265 3597 a(\(g\))f(Query)h(7)974 3469 y
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q8.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+420 421 m
+956 504 l
+1493 650 l
+2030 1549 l
+stroke
+420 421 30 0 360 arc
+gsave fill grestore
+stroke
+956 504 30 0 360 arc
+gsave fill grestore
+stroke
+1493 650 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1549 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 502 l
+1493 647 l
+2030 1475 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+420 450 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 532 m
+926 502 l
+956 472 l
+986 502 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 532 m
+926 502 l
+956 472 l
+986 502 l
+956 532 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 677 m
+1463 647 l
+1493 617 l
+1523 647 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 677 m
+1463 647 l
+1493 617 l
+1523 647 l
+1493 677 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1505 m
+2000 1475 l
+2030 1445 l
+2060 1475 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1505 m
+2000 1475 l
+2030 1445 l
+2060 1475 l
+2030 1505 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 3597 a(\(h\))f(Query)h(8)p 1827 3720
+4 3696 v -104 3723 1935 4 v 1829 3740 19 3703 v -87 3740
+1935 19 v -38 3922 a FG(Figure)i(7:)27 b(Query)19 b(optimization)g
+(times)h(for)g(Q1)g(through)e(Q8)-112 4158 y(tions)i(in)g(its)h(query)e
+(optimizer)-5 b(.)-29 4266 y(The)23 b(Starburst)h(query)e(optimizer)h
+([10])g(uses)h(rules)g(for)g(all)g(de-)-112 4366 y(cisions)j(that)g
+(need)f(to)i(be)f(taken)f(by)h(the)g(query)e(optimizer)-5
+b(.)47 b(The)-116 4466 y(rules)18 b(are)f(functional)f(in)i(nature)e
+(and)h(transform)f(a)i(given)f(operator)-112 4565 y(tree)j(into)g
+(another)-5 b(.)26 b(The)20 b(rules)h(are)f(commonly)e(those)i(that)h
+(re\257ect)-112 4665 y(relational)26 b(calculus)i(facts.)49
+b(In)27 b(Starburst,)i(the)f(query)e(rewriting)-112 4764
+y(phase)21 b(is)i(dif)o(ferent)d(from)i(the)g(optimization)e(phase.)33
+b(The)21 b(rewrit-)-119 4864 y(ing)15 b(phase)f(transforms)f(the)i
+(query)f(itself)h(into)g(equivalent)e(operator)-112 4964
+y(trees)21 b(based)g(on)f(relational)g(calculus)h(rules.)30
+b(The)20 b(plan)h(optimiza-)-114 5063 y(tion)d(phase)h(selects)g
+(algorithms)f(for)g(each)g(operator)f(in)i(the)g(opera-)-114
+5163 y(tor)f(tree)h(that)g(is)g(obtained)e(after)i(rewriting.)25
+b(The)18 b(disadvantage)f(of)-112 5263 y(separating)k(the)h(query)f
+(rewrite)h(and)g(the)h(optimization)e(phases)h(is)2041
+21 y(that)c(pruning)e(of)h(the)h(search)g(space)g(is)h(not)e(possible)h
+(during)e(query)2044 120 y(rewrite,)j(since)i(the)f(rewrite)g(phase)g
+(is)h(non-cost-based.)2127 228 y(Freytag)h([6])h(describes)f(a)i
+(rule-based)d(query)h(optimizer)g(simi-)2044 328 y(lar)f(to)g
+(Starburst.)28 b(The)20 b(rules)h(are)g(based)f(on)g(LISP-like)h
+(represen-)2040 427 y(tations)c(of)f(access)i(plans.)25
+b(The)17 b(rules)f(themselves)h(are)g(recursively)2044
+527 y(de\256ned)26 b(on)g(smaller)i(expressions)e(\(operator)e
+(trees\).)48 b(Although)2044 627 y(several)22 b(expressions)g(can)h
+(contain)e(a)j(common)d(sub-expression,)2044 726 y(Freytag)e(doesn')o
+(t)f(consider)h(the)h(possibility)g(of)g(sharing.)25
+b(Expres-)2044 826 y(sions)c(are)g(evaluated)f(each)h(time)h(they)e
+(are)i(encountered.)27 b(This)21 b(is)2040 926 y(obviously)16
+b(inef)o(\256cient.)25 b(In)17 b(addition,)f(as)j(in)e(Starburst,)g(he)
+h(doesn')o(t)2044 1025 y(consider)i(the)h(cost)h(transformations)d
+(inherent)h(in)h(any)g(query)f(op-)2044 1125 y(timizer;)g(rules)g(are)g
+(syntactic)g(transformation)e(rules.)2127 1233 y(EXODUS)j([9])g
+(provides)e(an)i(optimizer)f(generator)g(which)g(ac-)2044
+1332 y(cepts)k(a)g(rule-based)e(speci\256cation)h(of)g(the)h(data)g
+(model)f(as)h(input.)2042 1432 y(The)19 b(optimizer)f(generator)f
+(compiles)i(these)g(rules,)g(together)f(with)2042 1532
+y(pre-de\256ned)e(rules,)j(to)f(generate)g(an)g(optimizer)g(for)g(the)g
+(particular)2044 1631 y(data)25 b(model)g(and)g(set)h(of)f(operators.)
+41 b(Unlike)25 b(Freytag,)h(the)g(opti-)2043 1731 y(mizer)18
+b(generator)f(for)i(EXODUS)g(allows)h(for)e(C)i(code)f(along)f(with)
+2037 1831 y(de\256nitions)13 b(of)i(new)f(rules.)25 b(This)15
+b(allows)f(the)h(database)f(implemen-)2039 1930 y(tor)i(the)g(freedom)f
+(to)h(associate)h(any)f(action)f(with)i(a)f(particular)f(rule.)2041
+2030 y(Operator)i(trees)h(in)g(EXODUS)g(are)g(constructed)e(bottom-up)g
+(from)2044 2129 y(previously)i(constructed)h(trees.)2121
+2237 y(The)d(V)-11 b(olcano)14 b(optimizer)h(generator)f(project)g([7])
+h(evolved)g(from)2044 2337 y(the)22 b(EXODUS)g(project.)31
+b(It)22 b(is)g(dif)o(ferent)e(from)h(all)h(the)g(above)f(op-)2044
+2437 y(timizers)j(in)h(one)e(signi\256cant)h(way:)35
+b(it)25 b(is)h(a)e(top-down)e(optimizer)2042 2536 y(compared)17
+b(with)i(the)f(bottom-up)f(strategy)h(of)g(the)h(others.)26
+b(Opera-)2041 2636 y(tor)17 b(trees)h(are)f(optimized)f(starting)i
+(from)e(the)i(root)e(while)i(sub-trees)2041 2735 y(are)h(not)e(yet)i
+(optimized.)25 b(This)18 b(leads)g(to)h(a)f(constraint-driven)d(gen-)
+2044 2835 y(eration)23 b(of)h(the)g(search)f(space.)38
+b(While)25 b(this)f(method)f(results)h(in)h(a)2040 2935
+y(tight)17 b(control)e(of)i(the)g(search)g(space,)g(it)h(is)f
+(unconventional)d(and)i(re-)2044 3034 y(quires)24 b(careful)f
+(attention)h(on)g(the)h(part)f(of)g(the)g(optimizer)g(imple-)2043
+3134 y(mentor)19 b(to)h(ensure)g(that)g(legal)g(operator)e(trees)i(are)
+g(not)g(accidently)2044 3234 y(left)25 b(out)f(of)h(the)g(search)f
+(space.)41 b(W)-7 b(e)26 b(have)f(used)f(V)-11 b(olcano)24
+b(as)i(our)2044 3333 y(back-end)18 b(search)i(engine.)2044
+3658 y FB(6)119 b(Conclusion)31 b(and)g(futur)n(e)f(work)2044
+3859 y FG(Current)24 b(rule-based)f(query)g(optimizers)h(do)g(not)h
+(provide)e(a)i(very)2044 3959 y(intuitive)20 b(and)g(conceptually)f
+(streamlined)h(framework)f(to)i(de\256ne)2044 4059 y(rules)26
+b(and)g(actions.)45 b(Our)26 b(experiences)e(with)j(the)f(V)-11
+b(olcano)26 b(opti-)2044 4158 y(mizer)e(generator)e(suggest)i(that)g
+(its)i(model)d(of)h(rules)g(and)g(the)g(ex-)2044 4258
+y(pression)i(of)h(these)g(rules)g(is)h(much)e(more)g(complicated)g(and)
+g(too)2042 4358 y(low-level)19 b(than)f(it)i(needs)f(to)g(be.)26
+b(As)20 b(a)g(consequence,)c(rule)j(sets)h(in)2043 4457
+y(V)-11 b(olcano)19 b(are)g(fragile,)g(hard)g(to)h(write,)f(and)h
+(debug.)25 b(Similar)19 b(prob-)2044 4557 y(lems)i(may)f(exist)h(in)g
+(other)f(contemporary)d(rule-based)i(query)h(op-)2044
+4656 y(timizers.)2126 4764 y(W)-7 b(e)21 b(believe)d(that)i(rule-based)
+e(query)g(optimizers)g(will)j(be)e(stan-)2044 4864 y(dard)i(tools)i(of)
+f(future)g(database)g(systems.)34 b(The)23 b(pragmatic)e(dif)o(\256-)
+2044 4964 y(culties)g(of)h(using)f(existing)f(rule-based)g(optimizers)h
+(led)g(us)h(to)f(de-)2044 5063 y(velop)f(Prairie,)g(an)h(extensible)f
+(and)g(structured)g(algebraic)f(frame-)2044 5163 y(work)j(for)h
+(specifying)f(rules.)36 b(Prairie)23 b(is)h(similar)g(to)f(existing)g
+(op-)2044 5263 y(timizers)33 b(in)g(that)f(it)i(supports)e(both)g
+(transformation)e(rules)j(and)p eop
+%%Page: 10 10
+10 9 bop -112 21 a FG(implementation)21 b(rules.)37 b(However)m(,)23
+b(Prairie)g(makes)h(several)f(im-)-112 120 y(provements:)-50
+291 y(1.)41 b(it)14 b(of)o(fers)e(a)i(conceptually)d(more)h
+(streamlined)h(model)f(for)h(rule)54 390 y(speci\256cation;)-50
+562 y(2.)41 b(rules)18 b(are)g(encapsulated,)e(there)i(are)g(no)g
+(\252hidden\272)e(operators)54 662 y(or)j(\252hidden\272)g(algorithms;)
+-50 834 y(3.)41 b(implementation)19 b(hints)i(\(e.g.,)f(enforcers\))g
+(are)h(deduced)e(au-)54 933 y(tomatically;)-50 1105 y(4.)41
+b(and)19 b(it)i(has)g(ef)o(\256cient)e(implementations.)-29
+1276 y(W)-7 b(e)26 b(have)e(explained)f(how)i(the)f(\256rst)i(three)f
+(points)f(are)h(impor)n(-)-113 1376 y(tant)20 b(for)f(simplifying)f
+(rule)h(speci\256cations)g(and)h(making)e(rule)h(sets)-112
+1475 y(less)27 b(brittle)g(for)f(extensibility)-5 b(.)45
+b(A)27 b(consequence)e(is)i(that)g(Prairie)-112 1575
+y(rules)20 b(are)h(simpler)f(and)g(more)g(robust)f(than)i(rules)f(of)g
+(existing)h(op-)-112 1674 y(timizers)j(\(e.g.,)h(V)-11
+b(olcano\).)40 b(W)-7 b(e)25 b(addressed)f(the)h(fourth)e(point)h(by)
+-112 1774 y(building)g(a)j(P2V)g(pre-processor)c(which)j(uses)h
+(sophisticated)f(al-)-112 1874 y(gorithms)e(to)j(compose)e(and)g
+(compact)g(a)i(Prairie)f(rule)g(set)h(into)e(a)-112 1973
+y(V)-11 b(olcano)23 b(rule)g(set.)39 b(T)-6 b(o)24 b(demonstrate)f(the)
+h(scalability)f(of)h(our)f(ap-)-113 2073 y(proach,)c(we)h(rewrote)g
+(the)g(TI)g(Open)g(OODB)h(rule)e(set)i(as)g(a)g(Prairie)-113
+2173 y(rule)e(set,)h(generated)d(its)k(V)-11 b(olcano)18
+b(counterpart,)f(and)i(showed)g(that)-113 2272 y(the)h(performance)d
+(of)j(the)f(synthesized)g(V)-11 b(olcano)19 b(rule)h(set)g(closely)-112
+2372 y(matches)f(the)i(hand-crafted)c(V)-11 b(olcano)19
+b(rule)h(set.)-29 2473 y(Our)25 b(future)g(work)g(will)i(concentrate)d
+(on)i(developing)d(higher)n(-)-120 2573 y(level)15 b(abstractions)e
+(using)h(Prairie,)h(including)d(automatically)h(gen-)-116
+2672 y(erating)k(Prairie)h(rule)f(sets,)i(and)e(combining)f(multiple)h
+(Prairie)g(rule)-112 2772 y(sets)k(to)f(automatically)f(generate)g(ef)o
+(\256cient)g(optimizers.)-112 3059 y FB(Acknowledgments)-112
+3247 y FG(W)-7 b(e)30 b(wish)g(to)g(thank)f(T)-6 b(exas)30
+b(Instruments,)g(Inc.)f(for)g(making)g(the)-119 3347
+y(Open)14 b(OODB)i(source)e(code)g(available)g(to)h(us.)25
+b(Comments)14 b(by)h(Jos)5 b(\302)-33 b(e)-112 3447 y(Blakeley)-5
+b(,)23 b(Anne)h(Ngu,)g(V)-5 b(ivek)23 b(Singhal,)h(Thomas)f(W)-7
+b(oo)24 b(and)g(the)-113 3546 y(anonymous)18 b(referees)h(greatly)h
+(improved)e(the)i(quality)f(of)h(the)g(pa-)-112 3646
+y(per)-5 b(.)-112 3934 y FB(Refer)n(ences)-71 4122 y
+FG([1])40 b(D.)16 b(S.)f(Batory)-5 b(.)19 b(Building)14
+b(blocks)g(of)h(database)f(management)67 4221 y(systems.)26
+b(T)-6 b(echnical)18 b(Report)g(TR\26187\26123,)e(The)i(University)67
+4321 y(of)i(T)-6 b(exas)20 b(at)h(Austin,)f(February)f(1988.)-71
+4493 y([2])40 b(Jos)5 b(\302)-33 b(e)37 b(A.)g(Blakeley)-5
+b(,)39 b(W)m(illiam)e(J.)g(McKenna,)i(and)d(Goetz)67
+4592 y(Graefe.)j(Experiences)21 b(building)f(the)j(Open)e(OODB)i(query)
+67 4692 y(optimizer)-5 b(.)27 b(In)19 b FF(Pr)m(oceedings)e(1993)h(ACM)
+i(SIGMOD)f(Inter)n(-)67 4792 y(national)27 b(Confer)m(ence)h(on)g
+(Management)e(of)i(Data)p FG(,)i(pages)67 4891 y(287\261296,)17
+b(W)-7 b(ashington,)20 b(May)f(1993.)-71 5063 y([3])40
+b(Dean)33 b(Daniels,)k(Patricia)c(Selinger)m(,)j(Laura)c(Haas,)37
+b(Bruce)67 5163 y(Lindsay)-5 b(,)25 b(C.)g(Mohan,)g(Adrian)f(W)-7
+b(alker)m(,)26 b(and)e(Paul)h(W)m(ilms.)67 5263 y(An)14
+b(introduction)c(to)k(distributed)e(query)g(compilation)f(in)j(R)1797
+5232 y Ff(\003)1835 5263 y FG(.)2224 21 y(In)22 b FF(Pr)m(oceedings)f
+(2nd)h(International)e(Confer)m(ence)i(on)h(Dis-)2224
+120 y(tributed)k(Databases)p FG(,)i(pages)f(291\261309,)f(Berlin,)j
+(Septem-)2224 220 y(ber)19 b(1982.)2085 386 y([4])41
+b(Dinesh)29 b(Das)h(and)e(Don)h(Batory)-5 b(.)74 b(Prairie:)45
+b(An)29 b(algebraic)2224 486 y(framework)37 b(for)j(rule)g
+(speci\256cation)f(in)h(query)f(optimiz-)2224 585 y(ers.)92
+b(In)33 b FF(Pr)m(oceedings)e(of)i(the)g(W)-8 b(orkshop)33
+b(on)f(Database)2224 685 y(Query)14 b(Optimizer)g(Generators)g(and)g
+(Rule-Based)e(Optimiz-)2224 784 y(ers)p FG(,)21 b(pages)e(139\261154,)e
+(Dallas,)k(September)e(1993.)2085 950 y([5])41 b(Dinesh)28
+b(Das)h(and)f(Don)g(Batory)-5 b(.)69 b(Prairie:)43 b(A)29
+b(rule)f(speci-)2224 1050 y(\256cation)h(framework)e(for)i(query)f
+(optimizers.)75 b(T)-6 b(echnical)2224 1150 y(Report)22
+b(TR)h(94\26116,)e(The)h(University)g(of)g(T)-6 b(exas)22
+b(at)h(Austin,)2224 1249 y(May)d(1994.)2085 1415 y([6])41
+b(Johann)15 b(Christoph)h(Freytag.)21 b(A)d(rule-based)d(view)h(of)g
+(query)2224 1515 y(optimization.)80 b(In)30 b FF(Pr)m(oceedings)f(1987)
+h(ACM)h(SIGMOD)2224 1615 y(International)37 b(Confer)m(ence)j(on)f
+(Management)f(of)j(Data)p FG(,)2224 1714 y(pages)19 b(173\261180,)e
+(San)k(Francisco,)e(May)h(1987.)2085 1880 y([7])41 b(Goetz)33
+b(Graefe.)94 b(V)-11 b(olcano,)36 b(an)d(extensible)g(and)g(parallel)
+2224 1980 y(query)23 b(evaluation)g(system.)53 b(T)-6
+b(echnical)24 b(Report)h(CU\261CS\261)2224 2080 y(481\26190,)14
+b(University)i(of)g(Colorado)f(at)i(Boulder)m(,)e(July)i(1990.)2085
+2246 y([8])41 b(Goetz)24 b(Graefe.)48 b(Query)24 b(evaluation)e
+(techniques)h(for)h(lar)o(ge)2224 2345 y(databases.)66
+b FF(ACM)28 b(Computing)f(Surveys)p FG(,)i(25\(2\):73\261170,)2224
+2445 y(June)20 b(1993.)2085 2611 y([9])41 b(Goetz)29
+b(Graefe)h(and)f(David)g(J.)i(DeW)m(itt.)78 b(The)30
+b(EXODUS)2224 2710 y(optimizer)21 b(generator)-5 b(.)42
+b(In)23 b FF(Pr)m(oceedings)e(1987)h(ACM)i(SIG-)2224
+2810 y(MOD)40 b(International)d(Confer)m(ence)i(on)g(Management)f(of)
+2224 2910 y(Data)p FG(,)19 b(pages)h(387\261394,)d(San)j(Francisco,)g
+(May)g(1987.)2044 3076 y([10])40 b(L.)23 b(M.)g(Haas,)h(J.)g(C.)g
+(Freytag,)e(G.)i(M.)f(Lohman,)f(and)g(H.)i(Pi-)2224 3175
+y(rahesh.)31 b(Extensible)20 b(query)f(processing)h(in)h(Starburst.)32
+b(Re-)2224 3275 y(search)20 b(Report)g(RJ)i(6610,)e(IBM)h(Almaden)e
+(Research)i(Cen-)2224 3375 y(ter)m(,)e(December)g(1988.)2047
+3541 y([1)m(1])40 b(P)-9 b(.)33 b(G.)g(Selinger)m(,)h(M.)f(M.)g
+(Astrahan,)i(D.)e(D.)g(Chamberlin,)2224 3640 y(R.)28
+b(A.)h(Lorie,)g(and)f(T)-6 b(.)28 b(G.)g(Price.)69 b(Access)29
+b(path)e(selection)2224 3740 y(in)d(a)g(relational)f(database)g
+(management)f(system.)47 b(In)23 b FF(Pr)m(o-)2224 3840
+y(ceedings)k(1979)g(ACM)i(SIGMOD)f(International)e(Confer)n(-)2224
+3939 y(ence)g(on)h(Management)e(of)i(Data)p FG(,)h(pages)e(23\26134,)g
+(Boston,)2224 4039 y(May)20 b(1979.)2044 4205 y([12])40
+b(Michael)30 b(Stonebraker)f(and)i(Lawrence)f(A.)i(Rowe.)84
+b(The)2224 4305 y(design)25 b(of)h(Postgres.)60 b(In)26
+b FF(Pr)m(oceedings)f(1986)g(ACM)i(SIG-)2224 4404 y(MOD)40
+b(International)d(Confer)m(ence)i(on)g(Management)f(of)2224
+4504 y(Data)p FG(,)19 b(pages)h(340\261355,)d(W)-7 b(ashington,)19
+b(May)h(1986.)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/macros/latex/contrib/utthesis/ICDE-11/paper.tex b/macros/latex/contrib/utthesis/ICDE-11/paper.tex
new file mode 100644
index 0000000000..369c8ea786
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/paper.tex
@@ -0,0 +1,251 @@
+\documentclass[twocolumn]{article}
+\setlength{\oddsidemargin}{-0.1875in}
+\setlength{\evensidemargin}{-0.1875in}
+\setlength{\columnsep}{0.3125in}
+\setlength{\topmargin}{-0.75in}
+\setlength{\textheight}{8.875in}
+\setlength{\textwidth}{6.875in}
+\setlength{\headheight}{0.3in}
+\setlength{\marginparwidth}{.7in}
+\setcounter{topnumber}{2}
+\setcounter{bottomnumber}{2}
+\renewcommand{\topfraction}{1.0}
+\renewcommand{\bottomfraction}{1.0}
+\renewcommand{\textfraction}{.00}
+\setcounter{totalnumber}{4}
+
+%\setlength{\floatsep}{0pt plus 2pt minus 2pt}
+\setlength{\textfloatsep}{4pt plus 2pt minus 4pt}
+
+\usepackage{amssymb}
+\usepackage{amstext}
+\usepackage{array}
+\usepackage{boxedminipage}
+\usepackage{calc}
+\usepackage{citesort}
+\usepackage[dvips]{epsfig}
+\usepackage{fancybox}
+\usepackage{fancyheadings}
+\usepackage{fleqn}
+\usepackage{hhline}
+\usepackage{multirow}
+\usepackage{psboxit}
+\usepackage{pst-node}
+\usepackage{pstricks}
+\usepackage{stretch}
+\usepackage{subfigure}
+\usepackage{theorem}
+\usepackage{times}
+\usepackage{timestamp}
+\usepackage{verbatim}
+\usepackage{xspace}
+
+\PScommands
+
+\setlength{\mathindent}{0in}
+
+\renewcommand{\baselinestretch}{1.0}
+\newcommand{\eg}{e.g.,\xspace}
+\newcommand{\ie}{i.e.,\xspace}
+\newcommand{\etc}{etc.\@\xspace}
+\makeatletter
+\newcommand{\preprint}
+ {\pagestyle{empty}
+ \newcommand{\firstpage}
+ {\thispagestyle{plain}
+ \makeatletter
+ \renewcommand{\ps@plain}{
+ \renewcommand{\@oddhead}{\fbox{To appear in \textit{Proceedings
+ 11th International Conference on
+ Data Engineering},
+ Taipei, March 1995}}
+ \renewcommand{\@evenhead}{}
+ \renewcommand{\@evenfoot}{}
+ \renewcommand{\@oddfoot}{}}
+ \makeatother}}
+\newcommand{\reprint}
+ {\pagestyle{empty}
+ \newcommand{\firstpage}
+ {\thispagestyle{plain}
+ \makeatletter
+ \renewcommand{\ps@plain}{
+ \renewcommand{\@oddhead}{\fbox{In \textit{Proceedings
+ 11th International Conference on
+ Data Engineering}, pages 201--210,
+ Taipei, March 1995}}
+ \renewcommand{\@evenhead}{}
+ \renewcommand{\@evenfoot}{}
+ \renewcommand{\@oddfoot}{}}
+ \makeatother}}
+\makeatother
+\newcommand{\final}
+ {\pagestyle{empty}
+ \newcommand{\firstpage}{\thispagestyle{empty}}}
+\newcommand{\myshadowsize}{2pt}
+\newcommand{\myshadowbox}{\setlength{\shadowsize}{\myshadowsize}\shadowbox}
+\newcommand{\doubleopenbraces}{\{\{}
+\newcommand{\doubleclosebraces}{\}\}}
+\newcommand{\nodesizes}{\scriptsize}
+\newlength{\edgesizes}
+\setlength{\edgesizes}{6mm}
+\newcommand{\graybox}[3]{\psboxit{box .5 setgray fill}{\makebox[#1][#2]{#3}}}
+
+\theoremstyle{plain}
+\theoremheaderfont{\scshape}
+\theorembodyfont{\rmfamily}
+\newtheorem{myexample}{Example}
+\renewcommand{\themyexample}{\arabic{myexample}.}
+\newenvironment{example}
+ {\begin{myexample}\quad}
+ {\hfill$\Box$\end{myexample}}
+\newenvironment{smalleqnarray*}[1]
+ {#1
+ \begin{eqnarray*}}
+ {\end{eqnarray*}
+ \normalsize}
+
+\newenvironment{quarterminipage}
+ {\begin{minipage}[b]{0.22\linewidth}}
+ {\end{minipage}}
+\newenvironment{halfminipage}
+ {\begin{minipage}[b]{0.44\linewidth}}
+ {\end{minipage}}
+\newenvironment{fullminipage}
+ {\begin{minipage}[b]{0.93\linewidth}}
+ {\end{minipage}}
+
+\newenvironment{fullminipagerule}
+ {\setlength{\topsep}{0pt}
+ \scriptsize
+ \begin{fullminipage}}
+ {\end{fullminipage}}
+\newenvironment{halfminipagerule}
+ {\setlength{\topsep}{0pt}
+ \footnotesize
+ \begin{halfminipage}}
+ {\end{halfminipage}}
+
+% Command to add space to second line of rule definitions.
+\newcommand{\rulespace}{\quad}
+\newenvironment{ruleactions}
+ {$\doubleopenbraces$
+ \begin{tabbing}
+ \hspace{2pc} \= \kill}
+ {\end{tabbing}
+ $\doubleclosebraces$}
+
+\newenvironment{trule}
+ {\begin{equation}}
+ {\end{equation}}
+\newenvironment{trulepretest}
+ {\begin{ruleactions}}
+ {\end{ruleactions} \\}
+\newenvironment{truleposttest}
+ {\\
+ \begin{ruleactions}}
+ {\end{ruleactions}}
+\newenvironment{fullminipagetrule}
+ {\begin{fullminipagerule}}
+ {\end{fullminipagerule}}
+\newenvironment{halfminipagetrule}
+ {\begin{halfminipagerule}}
+ {\end{halfminipagerule}}
+
+\newenvironment{irule}
+ {\begin{equation}}
+ {\end{equation}}
+\newenvironment{irulepreopt}
+ {\\
+ \begin{ruleactions}}
+ {\end{ruleactions}}
+\newenvironment{irulepostopt}
+ {\\
+ \begin{ruleactions}}
+ {\end{ruleactions}}
+\newenvironment{fullminipageirule}
+ {\begin{fullminipagerule}}
+ {\end{fullminipagerule}}
+\newenvironment{halfminipageirule}
+ {\begin{halfminipagerule}}
+ {\end{halfminipagerule}}
+
+\newenvironment{centeredfigure}
+ {\begin{figure}[tb]
+ \begin{center}}
+ {\end{center}
+ \end{figure}}
+\newenvironment{centeredfigure*}
+ {\begin{figure*}[tb]
+ \begin{center}}
+ {\end{center}
+ \end{figure*}}
+
+\newenvironment{centeredtable}
+ {\begin{table}[tb]
+ \begin{center}}
+ {\end{center}
+ \normalsize
+ \end{table}}
+\newenvironment{centeredtable*}
+ {\begin{table*}[tb]
+ \begin{center}}
+ {\end{center}
+ \normalsize
+ \end{table*}}
+
+\newenvironment{centeredinquarterminipage}
+ {\begin{quarterminipage}
+ \begin{center}}
+ {\end{center}
+ \end{quarterminipage}}
+\newenvironment{centeredinhalfminipage}
+ {\begin{halfminipage}
+ \begin{center}}
+ {\end{center}
+ \end{halfminipage}}
+\newenvironment{centeredinfullminipage}
+ {\begin{fullminipage}
+ \begin{center}}
+ {\end{center}
+ \end{fullminipage}}
+
+\title{\textbf{Prairie: A Rule Specification Framework \\
+ for Query Optimizers}\thanks{
+ This research was supported in part by grants from The University
+ of Texas Applied Research Laboratories, Schlumberger, and
+ Digital Equipment Corporation.}\ \thanks{
+ An expanded version of this paper is available as Technical
+ Report TR 94--16 by anonymous ftp from \texttt{ftp.cs.utexas.edu}.}}
+\author{Dinesh Das \hspace{1in} Don Batory \\
+ Department of Computer Sciences \\
+ The University of Texas at Austin \\
+ Austin, Texas 78712--1188 \\
+ \{ddas,batory\}@cs.utexas.edu}
+\date{}
+
+%\final
+%\preprint
+\reprint
+
+\makeatletter
+\def\thickhline{\noalign{\ifnum0=`}\fi\hrule \@height 1.5pt \futurelet
+ \@tempa\@xhline}
+\makeatother
+
+\begin{document}
+
+\maketitle
+
+\pagenumbering{arabic}
+\input{abstract.tex}
+\input{intro.tex}
+\input{model.tex}
+\input{p2v.tex}
+\input{results.tex}
+\input{related.tex}
+\input{conclusion.tex}
+
+\bibliographystyle{plain}
+\bibliography{references}
+
+\end{document}
diff --git a/macros/latex/contrib/utthesis/ICDE-11/preprint.ps b/macros/latex/contrib/utthesis/ICDE-11/preprint.ps
new file mode 100644
index 0000000000..00e36a2b29
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/preprint.ps
@@ -0,0 +1,6724 @@
+%!PS-Adobe-2.0
+%%Creator: dvips 5.55 Copyright 1986, 1994 Radical Eye Software
+%%Title: paper.dvi
+%%CreationDate: Thu Dec 1 10:58:49 1994
+%%Pages: 10
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: Times-Roman Times-Italic Times-Bold Courier
+%%EndComments
+%DVIPSCommandLine: dvips -D 600 paper -o
+%DVIPSParameters: dpi=600, comments removed
+%DVIPSSource: TeX output 1994.12.01:1057
+%%BeginProcSet: tex.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]}
+if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage
+userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
+B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
+4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
+p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pstricks.pro
+% PostScript prologue for pstricks.tex.
+% Created 1993/3/12. Source file was pstricks.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@Dict 200 dict def tx@Dict begin
+/ADict 25 dict def
+/CM { matrix currentmatrix } bind def
+/SLW /setlinewidth load def
+/CLW /currentlinewidth load def
+/CP /currentpoint load def
+/ED { exch def } bind def
+/L /lineto load def
+/T /translate load def
+/Atan { /atan load stopped { pop pop 0 } if } def
+/Div { dup 0 eq { pop } { div } ifelse } def
+/NET { neg exch neg exch T } def
+/Pyth { dup mul exch dup mul add sqrt } def
+/PtoC { 2 copy cos mul 3 1 roll sin mul } def
+/PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def }
+def
+/PathLength { flattenpath /z 0 def { /y1 ED /x1 ED /y2 y1 def /x2 x1 def
+} { /y ED /x ED PathLength@ } {} { /y y2 def /x x2 def PathLength@ }
+pathforall z } def
+/STP { .996264 dup scale } def
+/STV { SDict begin normalscale end STP } def
+/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def
+PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y
+mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul
+/y ED x mul /x ED x 0 eq y 0 eq and { /x 1 def /y 1 def } if [ y x ] 1 a
+sub y mul setdash stroke } def
+/DotLine { /b PathLength def /a ED /z ED /y CLW def /z y z add def a 0 gt
+{ /b b a div def } { a 0 eq { /b b y sub def } { a -3 eq { /b b y add
+def } if } ifelse } ifelse [ 0 b b z Div round Div dup 0 le { pop 1 } if
+] a 0 gt { 0 } { y 2 div a -2 gt { neg } if } ifelse setdash 1
+setlinecap stroke } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap n { currentstrokeadjust == x1 y1 moveto x2 y1 L
+stroke /y1 y1 a add def } repeat grestore } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap systemdict /currentstrokeadjust known {
+currentstrokeadjust } { false } ifelse { /t { } def } { /t { transform
+0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }
+bind def } ifelse n { x1 y1 t moveto x2 y1 t L stroke /y1 y1 a add def }
+repeat grestore } def
+/BeginArrow { ADict begin /@mtrx CM def gsave 2 copy T 2 index sub neg
+exch 3 index sub exch Atan rotate newpath } def
+/EndArrow { @mtrx setmatrix CP grestore end } def
+/Arrow { CLW mul add dup 2 div /w ED mul dup /h ED mul /a ED { 0 h T 1 -1
+scale } if w neg h moveto 0 0 L w h L w neg a neg rlineto gsave fill
+grestore } def
+/Tbar { CLW mul add /z ED z -2 div CLW 2 div moveto z 0 rlineto stroke 0
+CLW moveto } def
+/Bracket { CLW mul add dup CLW sub 2 div /x ED mul CLW add /y ED /z CLW 2
+div def x neg y moveto x neg CLW 2 div L x CLW 2 div L x y L stroke 0
+CLW moveto } def
+/RoundBracket { CLW mul add dup 2 div /x ED mul /y ED /mtrx CM def 0 CLW
+2 div T x y mul 0 ne { x y scale } if 1 1 moveto .85 .5 .35 0 0 0
+curveto -.35 0 -.85 .5 -1 1 curveto mtrx setmatrix stroke 0 CLW moveto }
+def
+/Shadow { [ { /moveto load } { /lineto load } { /curveto load } {
+/closepath load } pathforall ] cvx newpath 3 1 roll T exec } def
+/SD { 0 360 arc fill } def
+/SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def
+/ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def
+/SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore }
+def
+/NArray { aload length 2 div dup dup cvi eq not { exch pop } if /n exch
+cvi def } def
+/NArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop } if
+f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def
+/Line { NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub
+def n { Lineto } repeat CP 4 2 roll ArrowB L pop pop } if } def
+/Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 }
+ifelse { pop } repeat a } def
+/CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq
+and { pop pop /n n 1 sub def } if } def
+/Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop }
+repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1
+ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1
+moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto
+Lineto pop pop closepath } ifelse } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1
+def CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp
+mul dy1 l0 c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos
+abs b exp a mul dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def
+/y2 y l0 dy mul m mul sub def /dx l1 dx mul m mul neg def /dy l1 dy mul
+m mul neg def } def
+/IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if }
+ifelse /a a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def }
+def
+/BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def
+/NC { CC x1 y1 x2 y2 x y curveto } def
+/EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def
+/BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def
+/NAC { x2 y2 x y curveto CC x1 y1 } def
+/EAC { x2 y2 x y ArrowB curveto pop pop } def
+/OpenCurve { NArray n 3 lt { n { pop pop } repeat } { BOC /n n 3 sub def
+n { NC } repeat EOC } ifelse } def
+/AltCurve { { false NArray n 2 mul 2 roll [ n 2 mul 3 sub 1 roll ] aload
+/Points ED n 2 mul -2 roll } { false NArray } ifelse n 4 lt { n { pop
+pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse } def
+/ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt {
+CheckClosed } if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC }
+repeat closepath pop pop } ifelse } def
+/EndDot { { /z DS def } { /z 0 def } ifelse /b ED 0 z DS SD b { 0 z DS
+CLW sub SD } if 0 DS z add CLW 4 div sub moveto } def
+/Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto
+x1 y1 lineto closepath } def
+/OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1
+y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div
+exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse
+/b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto
+x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath }
+ifelse } def
+/Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add
+/y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq {
+pop pop Rect } { OvalFrame } ifelse } def
+/Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1
+sub 3 div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA
+x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0
+y0 x0 2 mul x1 sub y1 ] def } def
+/Grid { /a 4 string def /b ED /d ED /n ED cvi dup 1 lt { pop 1 } if /c ED
+c div dup 0 eq { pop 1 } if /cy ED c div dup 0 eq { pop 1 } if /cx ED cy
+div cvi /y ED cx div cvi /x ED cy div cvi /y2 ED cx div cvi /x2 ED cy
+div cvi /y1 ED cx div cvi /x1 ED /h y2 y1 sub 0 gt { 1 } { -1 } ifelse
+def /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def b 0 gt { /z1 b 4 div CLW 2
+div add def /Helvetica findfont b scalefont setfont /b b .95 mul CLW 2
+div add def } if gsave n 0 gt { 1 setlinecap [ 0 cy n div ] 0 setdash }
+{ 2 setlinecap } ifelse /c x1 def /i 500 w mul x1 add def /e y cy mul
+def /f y1 cy mul def /g y2 cy mul def x1 cx mul 0 T { newpath 0 e moveto
+b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1} {z1 z2
+add neg} ifelse h 0 gt {b neg} {z1} ifelse rmoveto show grestore } if 0
+f moveto 0 g L stroke cx w mul 0 T c x2 eq c i eq or {exit} if /c c w
+add def } loop grestore gsave n 0 gt { 1 setlinecap [ 0 cx n div ] 0
+setdash } { 2 setlinecap } ifelse /c y1 def /i 500 h mul y1 add def /e x
+cx mul def /f x1 cx mul def /g x2 cx mul def 0 y1 cy mul T { newpath e 0
+moveto b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1 z2
+add neg} {z1} ifelse h 0 gt {z1} {b neg} ifelse rmoveto show grestore }
+if f 0 moveto g 0 L stroke 0 cy h mul T c y2 eq c i eq or {exit} if /c c
+h add def } loop grestore } def
+/ArcArrow { /d ED /b ED /a ED gsave newpath 0 -1000 moveto clip newpath 0
+1 0 0 b grestore c mul /e ED pop pop pop r a e d PtoC y add exch x add
+exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c
+mul neg d } def
+/Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def
+/Rot { CP CP translate 3 -1 roll neg rotate NET } def
+/PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def
+/PutBegin { /lmtrx [ tx@Dict /lmtrx known { lmtrx aload pop } if CM ] def
+CP 4 2 roll T moveto } def
+/PutEnd { CP /lmtrx [ lmtrx aload pop setmatrix ] def moveto } def
+/Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s
+abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b
+div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } {
+h1 abs h sub dup s mul abs } ifelse } def
+/UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s
+mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q
+{ x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add
+exch } def
+/BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { CP OLUnit T
+moveto /IfVisible true def } if } { IfVisible { CP OLUnit NET moveto
+/IfVisible false def } if } ifelse } def
+/InitOL { /OLUnit [ gsave CM STV 2890.79999 dup moveto setmatrix CP
+grestore ] cvx def /BOL { BeginOL } def /IfVisible true def } def
+end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pst-node.pro
+% PostScript prologue for pst-node.tex.
+% Created 1993/3/12. Source file was pst-node.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@NodeDict 200 dict def tx@NodeDict begin
+/NewNode { gsave /next ED dict dup 3 -1 roll ED begin tx@Dict begin STV
+CP T exec end /NodeMtrx CM def next end grestore } def
+/InitPnode { /Y ED /X ED /NodePos { Nodesep Cos mul Nodesep Sin mul } def
+} def
+/InitCnode { /r ED /Y ED /X ED /NodePos { Nodesep r add dup Cos mul exch
+Sin mul } def } def
+/GetRnodePos { Cos 0 gt { /dx r Nodesep add def } { /dx l Nodesep sub def
+} ifelse Sin 0 gt { /dy u Nodesep add def } { /dy d Nodesep sub def }
+ifelse dx Sin mul abs dy Cos mul abs gt { dy Cos mul Sin div dy } { dx
+dup Sin mul Cos Div } ifelse } def
+/InitRnode { /r ED r mul neg /l ED /r r l add def /X l neg def { neg /d
+ED /u ED /Y 0 def } { neg /Y ED Y sub /u ED u mul neg /d ED /u u d add
+def /Y Y d sub def } ifelse /NodePos { GetRnodePos } def } def
+/InitRNode { /Y ED /X ED /r ED /X r 2 div X add def /r r X sub def /l X
+neg def Y add neg /d ED Y sub /u ED /NodePos { GetRnodePos } def } def
+/GetOnodePos { /ww w Nodesep add def /hh h Nodesep add def Sin ww mul Cos
+hh mul Atan dup cos ww mul exch sin hh mul } def
+/GetCenter { begin X Y NodeMtrx transform CM itransform end } def
+/GetAngle { nodeA GetCenter nodeB GetCenter 3 -1 roll sub 3 1 roll sub
+neg Atan } def
+/GetEdge { begin /Nodesep ED dup 1 0 NodeMtrx dtransform CM idtransform
+exch atan sub dup sin /Sin ED cos /Cos ED NodePos Y add exch X add exch
+NodeMtrx transform CM itransform end 4 2 roll 1 index 0 eq { pop pop } {
+2 copy 5 2 roll cos mul add 4 1 roll sin mul sub exch } ifelse } def
+/GetPos { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED OffsetB
+AngleB NodesepB nodeB GetEdge /y2 ED /x2 ED } def
+/InitNC { /nodeB ED /nodeA ED /NodesepB ED /NodesepA ED /OffsetB ED
+/OffsetA ED tx@NodeDict nodeA known tx@NodeDict nodeB known and dup {
+/nodeA nodeA load def /nodeB nodeB load def } if } def
+/LineMP { 4 copy 1 t sub mul exch t mul add 3 1 roll 1 t sub mul exch t
+mul add exch 6 2 roll sub 3 1 roll sub Atan } def
+/NCCoor { GetAngle /AngleA ED /AngleB AngleA 180 add def GetPos /LPutVar
+[ x2 x1 y2 y1 ] cvx def /LPutPos { LPutVar LineMP } def x1 y1 x2 y2 }
+def
+/NCLine { NCCoor tx@Dict begin ArrowB 4 2 roll ArrowA lineto end } def
+/BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED
+/t ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3
+mul cx sub def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx
+sub def /ay y3 y0 sub cy sub by sub def ax t 3 exp mul bx t t mul mul
+add cx t mul add x0 add ay t 3 exp mul by t t mul mul add cy t mul add
+y0 add 3 ay t t mul mul mul 2 by t mul mul add cy add 3 ax t t mul mul
+mul 2 bx t mul mul add cx add atan } def
+/GetArms { /x1a armA AngleA cos mul x1 add def /y1a armA AngleA sin mul
+y1 add def /x2a armB AngleB cos mul x2 add def /y2a armB AngleB sin mul
+y2 add def } def
+/NCCurve { GetPos x1 x2 sub y1 y2 sub Pyth 2 div dup 3 -1 roll mul /armA
+ED mul /armB ED GetArms x1a y1a x1 y1 tx@Dict begin ArrowA end x2a y2a
+x2 y2 tx@Dict begin ArrowB end curveto /LPutVar [ x1 y1 x1a y1a x2a y2a
+x2 y2 ] cvx def /LPutPos { t LPutVar BezierMidpoint } def } def
+/AnglesMP { LPutVar t 3 gt { /t t 3 sub def } { t 2 gt { /t t 2 sub def
+10 -2 roll } { t 1 gt { /t t 1 sub def 10 -4 roll } { 10 4 roll } ifelse
+} ifelse } ifelse 6 { pop } repeat 3 -1 roll exch LineMP } def
+/NCAngles { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform exch pop mtrx itransform /y0 ED /x0
+ED mark armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1a y1a armA 0 ne { x1 y1 }
+if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a y2a x0 y0 x1a y1a
+x1 y1 ] cvx def /LPutPos { AnglesMP } def } def
+/NCAngle { GetPos /x2a armB AngleB cos mul x2 add def /y2a armB AngleB
+sin mul y2 add def /mtrx AngleA matrix rotate def x2a y2a mtrx transform
+pop x1 y1 mtrx transform exch pop mtrx itransform /y0 ED /x0 ED mark
+armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1 y1 tx@Dict begin false Line end
+/LPutVar [ x2 y2 x2 y2 x2a y2a x0 y0 x1 y1 ] cvx def /LPutPos { AnglesMP
+} def } def
+/NCBar { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform pop sub dup 0 mtrx itransform 3 -1
+roll 0 gt { /y2a exch y2a add def /x2a exch x2a add def } { /y1a exch
+neg y1a add def /x2a exch neg x2a add def } ifelse mark x2 y2 x2a y2a
+x1a y1a x1 y1 tx@Dict begin false Line end /LPutVar [ x2 y2 x2 y2 x2a
+y2a x1a y1a x1 y1 ] cvx def /LPutPos { LPutVar AnglesMP } def } def
+/NCDiag { GetPos GetArms mark x2 y2 x2a y2a x1a y1a x1 y1 tx@Dict begin
+false Line end /LPutVar [ x2 y2 x2 y2 x2a y2a x1a y1a x1 y1 ] cvx def
+/LPutPos { AnglesMP } def } def
+/NCDiagg { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED /x1a armA
+AngleA cos mul x1 add def /y1a armA AngleA sin mul y1 add def nodeB
+GetCenter y1a sub exch x1a sub Atan 180 add /AngleB ED OffsetB AngleB
+NodesepB nodeB GetEdge /y2 ED /x2 ED mark x2 y2 x1a y1a x1 y1 tx@Dict
+begin false Line end /LPutVar [ x2 y2 x2 y2 x2 y2 x1a y1a x1 y1] cvx def
+/LPutPos { AnglesMP } def } def
+/LoopMP { /t t abs def [ LPutVar ] length 2 div 1 sub dup t lt { /t ED }
+{ pop } ifelse mark LPutVar t cvi { /t t 1 sub def pop pop } repeat
+counttomark 1 add 4 roll cleartomark 3 -1 roll exch LineMP } def
+/NCLoop { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform loopsize add /y1b ED /x1b ED /x2b x2a y2a mtrx transform pop
+def x2b y1b mtrx itransform /y2b ED /x2b ED x1b y1b mtrx itransform /y1b
+ED /x1b ED mark armB 0 ne { x2 y2 } if x2a y2a x2b y2b x1b y1b x1a y1a
+armA 0 ne { x1 y1 } if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a
+y2a x2b y2b x1b y1b x1a y1a x1 y1 ] cvx def /LPutPos { LoopMP } def }
+def
+/NCCircle { nodeA GetCenter 0 0 NodesepA nodeA GetEdge pop 3 1 roll /Y ED
+/X ED X sub 2 div dup 2 exp r r mul sub abs sqrt atan 2 mul /a ED r
+AngleA 90 add PtoC Y add exch X add exch 2 copy /LPutVar [ 4 2 roll r a
+] def /LPutPos { LPutVar aload pop t 360 mul add dup 5 1 roll 90 sub
+PtoC 3 -1 roll add 3 1 roll add exch 3 -1 roll } def r AngleA 90 sub a
+add AngleA 270 add a sub tx@Dict begin /angleB ED /angleA ED /r ED /c
+57.2957 r Div def /y ED /x ED } def
+/LPutCoor { tx@NodeDict /LPutPos known { gsave LPutPos tx@Dict begin
+/langle ED CM 3 1 roll STV CP 3 -1 roll sub neg 3 1 roll sub exch moveto
+setmatrix CP end grestore } { 0 0 tx@Dict /langle 0 def end } ifelse }
+def
+end
+%%EndProcSet
+%%BeginProcSet: texps.pro
+TeXDict begin /rf{findfont dup length 1 add dict begin{1 index /FID ne 2
+index /UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics
+exch def dict begin Encoding{exch dup type /integertype ne{pop pop 1 sub
+dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}
+ifelse}forall Metrics /Metrics currentdict end def[2 index currentdict
+end definefont 3 -1 roll makefont /setfont load]cvx def}def
+/ObliqueSlant{dup sin S cos div neg}B /SlantFont{4 index mul add}def
+/ExtendFont{3 -1 roll mul exch}def /ReEncodeFont{/Encoding exch def}def
+end
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale false def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+%%EndProcSet
+TeXDict begin @defspecial
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+@fedspecial end TeXDict begin
+40258431 52099146 1000 600 600
+(/v/ahhnold/v3/ddas/research/papers/ICDE-11/paper.dvi)
+@start /Fa 188[28 67[{}1 41.666668 /Times-Italic rf /Fb
+1 60 df<38FEFEFFFFFF3B0303030706060E0C1C3830706008147A8614>59
+D E /Fc 7 57 df<003FC00000FFF00003E07C0007C03E000F801F000F000F001E000780
+1E0007803E0007C03E0007C07C0003E07C0003E07C0003E07C0003E07C0003E0FC0003F0
+FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0
+FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F07C0003E07C0003E07C0003E0
+7E0007E03E0007C03E0007C03E0007C01F000F800F000F000F801F0007C03E0003F0FC00
+00FFF000003FC0001C2D7DAB23>48 D<000C00003C00007C0003FC00FFFC00FC7C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000FE007FFF
+FE7FFFFE172C7AAB23>I<007F800001FFF0000780FC000E003F001C001F8038000FC070
+000FC0600007E0F00007E0FC0007F0FE0007F0FE0003F0FE0003F0FE0003F07C0007F000
+0007F0000007F0000007E000000FE000000FC000001FC000001F8000003F0000007E0000
+007C000000F8000001F0000003E0000007C000000F8000001E0000003C00000078000000
+F0003000E0003001C0003003800060070000600E0000E01FFFFFE03FFFFFE07FFFFFC0FF
+FFFFC0FFFFFFC01C2C7DAB23>I<003FC00001FFF00007C0FC000E007E001C003F001C00
+1F803F001FC03F001FC03F800FC03F000FC03F000FC00C001FC000001FC000001F800000
+1F8000003F0000003E0000007C000000F8000003F00000FFC00000FFF0000000FC000000
+3F0000001F8000001FC000000FC000000FE000000FE0000007F0000007F0380007F07C00
+07F0FE0007F0FE0007F0FE0007F0FE000FE0F8000FE060000FC070001FC038001F801E00
+3F000780FC0001FFF000007FC0001C2D7DAB23>I<00000E0000000E0000001E0000003E
+0000003E0000007E000000FE000000FE000001BE000003BE0000033E0000063E00000E3E
+00000C3E0000183E0000383E0000303E0000603E0000E03E0000C03E0001803E0003803E
+0003003E0006003E000E003E000C003E0018003E0038003E0030003E0060003E00E0003E
+00FFFFFFFCFFFFFFFC00003E0000003E0000003E0000003E0000003E0000003E0000003E
+0000003E0000003E0000007F00001FFFFC001FFFFC1E2D7EAC23>I<0C0001800FC01F80
+0FFFFF000FFFFE000FFFFC000FFFF0000FFFC0000C7E00000C0000000C0000000C000000
+0C0000000C0000000C0000000C0000000C0000000C1FC0000C7FF8000DE07C000F801F00
+0F001F800E000F800C0007C0000007E0000007E0000003E0000003F0000003F0000003F0
+000003F0780003F0FC0003F0FC0003F0FC0003F0FC0003F0F80007E0E00007E0600007C0
+70000FC038000F801C001F000E003E000780F80001FFE000007F80001C2D7DAB23>I<00
+1FC00000FFF00003E07C0007801E000F000F001E0007801E0007803C0003C03C0003C03C
+0003C03C0003C03E0003C03E0007C03F0007801FC00F801FE00F001FF81E000FFC3C0007
+FFF80003FFE00000FFE000003FF80000FFFC0003C7FF000783FF801F00FFC01E003FC03C
+001FE07C0007E0780003F0F80003F0F00001F0F00000F0F00000F0F00000F0F00000F0F8
+0000E0780001E07C0001C03C0003C01E0007800F800F0007E03C0001FFF000003FC0001C
+2D7DAB23>56 D E /Fd 135[50 3[50 50 3[50 50 50 50 2[50
+2[50 50 1[50 50 50 97[{}13 83.333336 /Courier rf /Fe
+1 49 df<038007C007C007C00F800F800F800F001F001E001E003E003C003C0038007800
+780070007000E000E0000A157D9612>48 D E /Ff 6 104 df<FFFFFFFFFEFFFFFFFFFE
+FFFFFFFFFE27037A8F34>0 D<003800003800003800003800003800403804F0381EF810
+3E7E10FC0F11E003938000FE0000380000FE000393800F11E07E10FCF8103EF0381E4038
+0400380000380000380000380000380017197B9A22>3 D<000000003000000000000000
+380000000000000038000000000000003C000000000000001E000000000000000E000000
+000000000F00000000000000078000000000000003C000007FFFFFFFFFE00000FFFFFFFF
+FFF00000FFFFFFFFFFFC000000000000003E000000000000000F8000000000000007E000
+000000000001FC000000000000007F800000000000003F80000000000000FC0000000000
+0003F00000000000000F800000000000001F000000000000003C0000FFFFFFFFFFF80000
+FFFFFFFFFFF000007FFFFFFFFFE000000000000003C00000000000000780000000000000
+0F000000000000000E000000000000001E000000000000003C0000000000000038000000
+0000000038000000000000003000000039237C9F42>41 D<00F001F803F803F803F807F0
+07F007F007E007E00FC00FC00FC00F801F801F001F001F003E003E003C003C007C007800
+78007000F000F000E0000D1D7D9F13>48 D<00007E0003FE0007E0000F00001E00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C0000780000780000F00003E000FF8000FC0000
+FF800003E00000F000007800007800003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+001E00000F000007E00003FE00007E173B7BAB22>102 D<FC0000FF800007E00001F000
+007800003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00001E00001E00000F000007C0
+0001FE00007E0001FE0007C0000F00001E00001E00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C0000780001F00007E000FF8000FC0000173B7BAB22>I
+E /Fg 7 56 df<001C00007C0007FC00FFFC00FFFC00F8FC0000FC0000FC0000FC0000FC
+0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC
+0000FC0000FC0000FC007FFFF87FFFF87FFFF8151C7B9B1F>49 D<03FE000FFFC03FFFF0
+7E07F8F803FCFC01FCFC00FEFC00FEFC007E7800FE0000FE0000FE0001FC0001F80003F0
+0007E0000F80003E00007C0000F00E01E00E07801C0FFFFC1FFFFC7FFFFCFFFFFCFFFFF8
+FFFFF8171C7C9B1F>I<00FF800003FFE0000FFFF8001F01FC003E00FE003F007E003F00
+7E003F007E003F00FE000C00FC000001FC000003F00000FFC00000FFF0000001FC000000
+FE0000007F0000003F8000003F8030003F80FC003F80FC003F80FC003F80FC007F00F800
+FF007E01FE003FFFF8000FFFF00001FF8000191D7D9B1F>I<0003F0000003F0000007F0
+00000FF000001DF0000039F0000039F0000071F00000E1F00001C1F0000381F0000701F0
+000701F0000E01F0001C01F0003801F0007001F000F001F000FFFFFF80FFFFFF80FFFFFF
+800003F0000003F0000003F0000003F00000FFFF8000FFFF8000FFFF80191C7D9B1F>I<
+3800783FFFF83FFFF03FFFE03FFF803FFE003FF0003C00003C00003C00003CFF003FFFC0
+3F03F03E01F83C00FC38007C00007E00007E00007E78007EFC007EFC007EFC00FCF800FC
+7801F87E03F03FFFE00FFF8003FE00171D7C9B1F>I<001FE00000FFF80003FFFC0007F0
+3E000FC07E001F807E003F007E003E007E007E003C007E000000FC3F8000FCFFF000FDC0
+FC00FF807E00FF003F00FE001F00FE001F80FC001F80FC001F80FC001F807C001F807E00
+1F807E001F803E003F003F003F001F80FE000FFFF80003FFF000007F8000191D7D9B1F>
+I<380000003FFFFF803FFFFF807FFFFF807FFFFF007FFFFE007FFFFC007000F800E001F0
+00E003E0000007C000000F8000001F0000001F0000003E0000007E0000007C0000007C00
+0000FC000000FC000000F8000001F8000001F8000001F8000001F8000001F8000001F800
+0001F8000000F00000191D7C9B1F>I E /Fh 7 62 df<007C00000000600001FF000000
+00F00003C380000001F0000700C0000001E0000E0060000003E0001E007000000FC0001C
+003C00001F80003C003F00007F80003C001BE003FF00007C0018FFFF9E00007800181FFC
+3E000078000C00007C0000F8000C0000780000F8000C0000F80000F8000C0001F00000F8
+000C0001E00000F8000C0003E00000F8000C0007C00000F8000C0007800000F8000C000F
+800000F8000C001F00000078000C001E000000780018003E0000007C0018007C0000003C
+001800780000003C003000F80000001C003001F00000001E006001E00000000E006003E0
+0000000700C007C000000003C380078000000001FF000F80000000007C001F0000000000
+00001E0007C0000000003E001FF0000000007C003C38000000007800700C00000000F800
+F00600000001F001E00600000001E001E00300000003E003C00300000007C003C0018000
+00078007C0018000000F800780018000001F000780018000001E000F8000C000003E000F
+8000C000007C000F8000C0000078000F8000C00000F8000F8000C00001F0000F8000C000
+01E0000F8000C00003E0000F8000C00007C0000F8000C0000780000F8000C0000F800007
+800180001F000007800180001E000007C00180003E000003C00180007C000003C0030000
+78000001E0030000F8000001E0060001F0000000F0060001E0000000700C0003E0000000
+3C380003C00000001FF000018000000007C0003A437BBD45>37 D<0003F80000001FFF00
+00007E0FC00000F803E00003E000F80003C000780007C0007C000F80003E000F80003E00
+1F00001F001F00001F003F00001F803F00001F803F00001F807E00000FC07E00000FC07E
+00000FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00
+000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE0000
+0FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000F
+C07E00000FC07E00000FC07E00000FC07F00001FC03F00001F803F00001F803F00001F80
+1F00001F001F00001F000F80003E000F80003E0007C0007C0003E000F80003E000F80000
+F803E000007E0FC000001FFF00000007FC000023387DB62A>48 D<000180000007800000
+0F8000003F800001FF8000FFFF8000FFDF8000FE1F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000003FC0007FFFFFE07FFFFFE07FFFFFE01B3779B62A
+>I<0007F80000003FFF000000FFFFC00001F00FE000038003F000070001F8000F0001FC
+000FC001FE001FE000FE001FE000FF001FE000FF001FE000FF000FE000FF000FC000FF00
+038000FF00000000FE00000000FE00000001FE00000001FC00000001F800000003F00000
+0003E000000007C00000000F800000007F0000001FFC0000001FFF800000000FE0000000
+03F000000001FC00000000FE00000000FF000000007F000000007F800000007FC0000000
+3FC00000003FC00000003FE00000003FE03E00003FE07F00003FE0FF80003FE0FF80003F
+E0FF80003FE0FF80003FC0FF00007FC07E00007F807C00007F80300000FF00380000FE00
+1C0001FC000F0003F80007F00FF00001FFFFC000007FFF8000000FFC000023387DB62A>
+51 D<0600000C000780003C0007F003F80007FFFFF00007FFFFE00007FFFFC00007FFFF
+800007FFFF000007FFFC0000067FE0000006000000000600000000060000000006000000
+000600000000060000000006000000000600000000060000000006000000000600000000
+0607F80000063FFF000006F80F800007C003C000070001F000060000F800040000F80000
+00007C000000007E000000007E000000003F000000003F000000003F000000003F800000
+003F800000003F803C00003F807E00003F80FF00003F80FF00003F80FF00003F80FF0000
+3F00FE00003F00FC00007F006000007E006000007E00300000FC00380000F800180001F8
+000E0003F000070007E00003E03F800001FFFF0000007FFC0000001FE0000021387CB62A
+>53 D<1C003E007F00FF80FF80FF807F003E001C00000000000000000000000000000000
+0000000000000000000000000000000000000000001C003E007F00FF80FF80FF807F003E
+001C00092479A317>58 D<7FFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFF
+FFFFFC000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFC
+FFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFFFFFFF836167B9F41>61
+D E /Fi 3 106 df<001FF00000FFFF0003E03FC00F801FE01F000FF01F800FF83FC007
+F83FE007F83FE007F83FE007F83FE00FF83FE00FF01FC00FF007001FE000003FE000007F
+800000FF00007FFC00007FF800007FFF0000003FC000000FF0000007F8000007FC0C0007
+FC3F0003FE7F8003FEFFC003FEFFC003FEFFC003FEFFC003FEFFC003FC7F8007FC7F0007
+F83F000FF01FC03FE007FFFFC001FFFF00003FF0001F277DA526>51
+D<FFFFFFFF000000FFFFFFFFF00000FFFFFFFFFC000003FE0007FF000003FE00007FC000
+03FE00003FE00003FE00000FF00003FE000007F80003FE000003F80003FE000003FC0003
+FE000001FE0003FE000001FE0003FE000000FF0003FE000000FF0003FE000000FF0003FE
+000000FF0003FE000000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE00
+0000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE0000
+00FF0003FE000000FF0003FE000000FF0003FE000001FE0003FE000001FE0003FE000003
+FC0003FE000003FC0003FE000007F80003FE00000FF00003FE00001FE00003FE00007FC0
+0003FE0003FF0000FFFFFFFFFE0000FFFFFFFFF00000FFFFFFFF00000031287DA739>68
+D<0F801FC03FE03FE03FE03FE03FE01FC00F80000000000000000000000000FFE0FFE0FF
+E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F
+E00FE00FE0FFFCFFFCFFFC0E297CA816>105 D E /Fj 1 69 df<FFFFFFFFFF800000FF
+FFFFFFFFF80000FFFFFFFFFFFF0000FFFFFFFFFFFFC000007FF80007FFF000007FF80000
+7FF800007FF800001FFE00007FF800000FFF00007FF8000003FF80007FF8000001FFC000
+7FF8000001FFC0007FF8000000FFE0007FF80000007FF0007FF80000007FF0007FF80000
+003FF8007FF80000003FF8007FF80000003FFC007FF80000001FFC007FF80000001FFC00
+7FF80000001FFE007FF80000001FFE007FF80000001FFE007FF80000001FFE007FF80000
+001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF00
+7FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000
+001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFE007FF80000001FFE00
+7FF80000001FFE007FF80000001FFE007FF80000001FFC007FF80000003FFC007FF80000
+003FFC007FF80000003FF8007FF80000007FF8007FF80000007FF0007FF8000000FFE000
+7FF8000000FFE0007FF8000001FFC0007FF8000003FF80007FF8000007FF00007FF80000
+1FFE00007FF800007FFC00007FF80007FFF000FFFFFFFFFFFFC000FFFFFFFFFFFF0000FF
+FFFFFFFFFC0000FFFFFFFFFF80000040397DB849>68 D E /Fk 3
+106 df<00000000003C00000000000000003C00000000000000003E0000000000000000
+1E00000000000000001F00000000000000000F8000000000000000078000000000000000
+07C00000000000000003E00000000000000001F00000000000000000F800000000000000
+00FC00007FFFFFFFFFFFFE0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF8000FFFFFFFFFF
+FFFFC00000000000000003E00000000000000001F80000000000000000FE000000000000
+00003F00000000000000001FE00000000000000007F80000000000000001FF0000000000
+000001FF0000000000000007F8000000000000001FE0000000000000003F000000000000
+0000FE0000000000000001F80000000000000003E000FFFFFFFFFFFFFFC000FFFFFFFFFF
+FFFF8000FFFFFFFFFFFFFF00007FFFFFFFFFFFFE0000000000000000FC00000000000000
+00F80000000000000001F00000000000000003E00000000000000007C000000000000000
+0780000000000000000F80000000000000001F00000000000000001E0000000000000000
+3E00000000000000003C00000000000000003C000000482E7BAB53>41
+D<0000C00001E00003E00003E00003C00007C00007C0000780000F80000F80001F00001F
+00001E00003E00003E00007C00007C0000780000F80000F80001F00001F00001E00003E0
+0003E00003C00007C00007C0000F80000F80000F00001F00001F00003E00003E00003C00
+007C00007C0000780000F80000F80000F80000F800007800007C00007C00003C00003E00
+003E00001F00001F00000F00000F80000F800007C00007C00003C00003E00003E00001E0
+0001F00001F00000F80000F800007800007C00007C00003E00003E00001E00001F00001F
+00000F80000F800007800007C00007C00003C00003E00003E00001E00000C0135278BD20
+>104 D<600000F00000F80000F800007800007C00007C00003C00003E00003E00001F00
+001F00000F00000F80000F800007C00007C00003C00003E00003E00001F00001F00000F0
+0000F80000F800007800007C00007C00003E00003E00001E00001F00001F00000F80000F
+800007800007C00007C00003C00003E00003E00003E00003E00003C00007C00007C00007
+80000F80000F80001F00001F00001E00003E00003E00007C00007C0000780000F80000F8
+0000F00001F00001F00003E00003E00003C00007C00007C0000F80000F80000F00001F00
+001F00003E00003E00003C00007C00007C0000780000F80000F80000F000006000001352
+7CBD20>I E /Fl 3 111 df<70F8F8F87005057A8413>58 D<03FFFFC00003FFFFF80000
+3C007E00003C001F00003C000F80003C000F800078000F800078000F800078000F800078
+001F0000F0003E0000F000780000F003E00000FFFE000001E007000001E003C00001E001
+C00001E001E00003C001E00003C001E00003C001E00003C001E000078003E000078003E0
+60078003E060078003E0C0FFF801F0C0FFF800F1800000003E00231D7B9B2B>82
+D<0F03F00033861C0021D81E0061F01E00C3E01E00C3C01E0003C01E0003C01E0007803C
+0007803C0007803C00078078200F0078600F00F0600F00F0C00F00F0C01E0071800C003E
+001B127D9125>110 D E /Fm 139[12 16 14 1[21 21 21 1[12
+2[12 1[21 1[18 21 18 1[18 12[25 23 28 2[30 30 37 25 1[16
+14 2[23 25 1[28 1[30 20[10 2[14 14 40[{}29 41.666668
+/Times-Roman rf /Fn 3 52 df<00600001E0000FE000FFE000F1E00001E00001E00001
+E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001
+E00001E00001E00001E00001E00001E00001E0007FFF807FFF80111C7B9B1C>49
+D<03FC000FFF801C0FC03003E06001F0E000F0E000F8F00078F000786000780000F80000
+F00001F00001E00003C0000700000E00001C0000300000E0000180180300180600180800
+383FFFF07FFFF0FFFFF0FFFFF0151C7D9B1C>I<03FC000FFF001C07C03001E07001F078
+01F07800F03001F00001F00001E00003C0000780001E0003FC000007800003C00001E000
+00F00000F80000F86000F8F000F8F000F8E000F06001F07003E03C07C00FFF0003FC0015
+1D7D9B1C>I E /Fo 81[32 51[26 29 29 1[29 29 16 23 19 1[29
+29 29 45 16 1[16 16 29 29 19 26 29 26 29 26 7[42 2[42
+42 36 32 39 42 32 42 42 52 2[23 19 1[42 32 36 42 39 1[42
+1[26 5[29 29 29 29 29 29 29 29 29 3[19 15 2[19 19 40[{}57
+58.333336 /Times-Roman rf /Fp 134[29 29 2[32 19 23 26
+1[32 29 32 48 16 2[16 32 29 1[26 32 26 1[29 14[42 45
+36 45 5[23 3[39 42 2[42 1[29 63[{}27 58.333336 /Times-Bold
+rf /Fq 138[33 18 26 26 1[33 1[33 48 3[18 1[33 1[29 3[33
+97[{}11 66.666664 /Times-Italic rf /Fr 7 56 df<00E00001E00007E000FFE000
+F9E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000
+01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000
+01E00001E00003F000FFFFC0FFFFC012217AA01E>49 D<01FC0007FF801C0FC03003E060
+01F06000F8F800F8FC00FCFC00FCFC007C78007C3000FC0000FC0000F80000F80001F000
+03E00003C0000780000F00001E0000380000700000E00001C00C03800C0600180C001818
+00183FFFF87FFFF8FFFFF0FFFFF016217CA01E>I<00FF0003FFC00F03E01C00F01C00F8
+3E00FC3E007C3E007C1E00FC0C00FC0000F80000F80001F00003E0000FC001FF0001FF00
+0003E00000F000007800007C00003E00003F30003F78003FFC003FFC003FFC003EF8007E
+60007C3800F81E03F00FFFC001FF0018227DA01E>I<0000E00001E00001E00003E00007
+E00007E0000DE0001DE00039E00031E00061E000E1E000C1E00181E00381E00701E00601
+E00C01E01C01E01801E03001E07001E0E001E0FFFFFFFFFFFF0001E00001E00001E00001
+E00001E00001E00003F0003FFF003FFF18227DA11E>I<1000301E01F01FFFE01FFFC01F
+FF801FFE001BF00018000018000018000018000018000018FE001BFF801F03C01C01E018
+00F01800F800007800007800007C00007C30007C78007CF8007CF8007CF80078F000F860
+00F07001E03801E01E078007FF0001F80016227CA01E>I<000FC0007FF001F03803C018
+07803C0F007C1E007C1C00383C00003C00007C0000780000787FC0F8FFE0F980F0FA0038
+FE003CFC001EFC001EF8001FF8001FF8001FF8001F78001F78001F78001F3C001E3C001E
+1C003C1E00380F00700781E001FFC0007F0018227DA01E>I<3000003C00003FFFFF3FFF
+FF7FFFFE7FFFFC60001C600038600070C000E0C000C00001C0000380000700000600000E
+00001C00001C0000380000380000780000780000780000F00000F00000F00000F00001F0
+0001F00001F00001F00001F00001F00001F00000E00018237CA11E>I
+E /Fs 1 4 df<7FFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFCF0
+00000000003CF000000000003CF000000000003CF000000000003CF000000000003CF000
+000000003CF000000000003CF000000000003CF000000000003CF000000000003CF00000
+0000003CF000000000003CF000000000003CF000000000003CF000000000003CF0000000
+00003CF000000000003CF000000000003CF000000000003CF000000000003CF000000000
+003CF000000000003CF000000000003CF000000000003CF000000000003CF00000000000
+3CF000000000003CF000000000003CF000000000003CF000000000003CF000000000003C
+F000000000003CF000000000003CF000000000003CF000000000003CF000000000003CF0
+00000000003CF000000000003CF000000000003CF000000000003CF000000000003CF000
+000000003CF000000000003CF000000000003CF000000000003CF000000000003CF00000
+0000003CF000000000003CFFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFF
+FFFFF836387BB741>3 D E /Ft 18 112 df<387CFEFEFEFEFEFE7C7C7C7C7C7C7C7C7C
+7C3838383838383838383810000000000038FEFEFEFEFE3807297BA813>33
+D<0006000C00180030006000E001C00380038007000F000E001E001E001C003C003C003C
+0078007800780078007800F800F000F000F000F000F000F000F000F000F000F000F000F8
+00780078007800780078003C003C003C001C001E001E000E000F0007000380038001C000
+E0006000300018000C00060F3B7AAB1A>40 D<C0006000300018000C000E000700038003
+8001C001E000E000F000F00070007800780078003C003C003C003C003C003E001E001E00
+1E001E001E001E001E001E001E001E001E003E003C003C003C003C003C00780078007800
+7000F000F000E001E001C00380038007000E000C00180030006000C0000F3B7DAB1A>I<
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E000000FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E0000002B2B7DA333>43 D<00380000780001F8001FF800FEF800E0F80000F80000
+F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000
+F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000
+F80000F80000F80000F80001FC00FFFFF8FFFFF815267BA521>49
+D<00FF000003FFE0000E03F0001800F80030007C0060003E0078001F00FC001F00FE001F
+80FE001F80FE000F80FE000F807C000F8000001F8000001F0000001F0000003F0000003E
+0000007C00000078000000F0000001E0000003C00000078000000F0000001C0000003800
+000070018000E0018001C0018003800300060003000C0003001FFFFF003FFFFF007FFFFE
+00FFFFFE00FFFFFE0019267DA521>I<00FF000003FFE0000F01F8001C007C0030003E00
+3C003E007E003F007E001F007E001F007E003F003C003F0000003E0000003E0000007C00
+0000F8000001F0000007E00001FF800001FF00000001E0000000F00000007C0000003E00
+00003F0000001F0000001F8000001F8038001F807C001F80FE001F80FE001F80FE001F00
+FC003F0078003E0070007C003800F8001F01F00007FFC00000FF000019277DA521>I<00
+00380000003800000078000000F8000001F8000001F8000003F8000007F8000006F80000
+0CF800001CF8000018F8000030F8000070F8000060F80000C0F80001C0F8000180F80003
+00F8000700F8000E00F8000C00F8001C00F8003800F8003000F8006000F800E000F800FF
+FFFFE0FFFFFFE00000F8000000F8000000F8000000F8000000F8000000F8000000F80000
+01FC00003FFFE0003FFFE01B277EA621>I<18000C001F007C001FFFF8001FFFF0001FFF
+E0001FFF800019FC00001800000018000000180000001800000018000000180000001800
+0000187F000019FFE0001F81F0001E0078001C003C0018003E0000003E0000001F000000
+1F0000001F8000001F8030001F807C001F80FC001F80FC001F80FC001F80FC001F00F000
+1F0060003E0070003E0030007C001C00F8000F03E00003FFC00000FE000019277DA521>
+I<000FE000003FF80000F81C0001E0060003801F0007003F000F003F001E003F001E003F
+003C001E003C0000007C0000007800000078040000783FC000F8FFF000F9807800FB003C
+00FA001E00FC001E00FC000F00FC000F00F8000F80F8000F80F8000F80F8000F8078000F
+8078000F8078000F8078000F803C000F003C000F001C001E001E001E000E003C00070078
+0003C0F00001FFC000007F000019277DA521>I<300000003C0000003FFFFFE03FFFFFE0
+3FFFFFC07FFFFF807FFFFF807000070060000E0060000C00C0001C00C0003800C0007000
+0000E0000000C0000001C000000380000003800000070000000F0000000E0000001E0000
+001E0000001E0000003E0000003C0000003C0000007C0000007C0000007C0000007C0000
+00FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000780000
+1B287DA621>I<387CFEFEFE7C380000000000000000000000387CFEFEFE7C3807197B98
+13>58 D<387CFEFEFE7C380000000000000000000000387CFCFEFE7E3E0606060C0C0C18
+1830702007247B9813>I<7FFFFFFFFFC0FFFFFFFFFFE0FFFFFFFFFFE000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000FFFFFFFFFFE0FFFFFFFFFFE07F
+FFFFFFFFC02B117D9633>61 D<01FF000FFFE01E01F038007860007CF8003EFC003EFC00
+3EFC003E78003E30007C00007C0000F80001F00003C0000780000F00000E00001C000018
+000038000030000030000030000030000030000030000030000020000000000000000000
+0000000000000000700001FC0001FC0001FC0001FC0001FC0000700017297DA81F>63
+D<007E03E001FF8FF00781F8F00F00F0F01E0078001C0038003C003C003C003C003C003C
+003C003C003C003C003C003C001C0038001E0078000F00F0000781E00009FF8000087E00
+0018000000180000001C0000001E0000000FFFF0000FFFFC0007FFFF000FFFFF801C001F
+C0380007C0780003E0F00001E0F00001E0F00001E0F00001E0780003C07C0007C03E000F
+800FC07E0003FFF800007FC0001C277E9921>103 D<0F80FF80FF801F800F800F800F80
+0F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F80
+0F800F800F800F800F800F800F800F800F800F800F800F801FC0FFF8FFF80D287EA713>
+108 D<003F800000FFE00003E0F80007803C000F001E001E000F003C0007803C00078078
+0003C0780003C0780003C0F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0F8
+0003E0780003C0780003C07C0007C03C0007801E000F001F001F000F803E0003E0F80001
+FFF000003F80001B1C7E9A21>111 D E /Fu 11 121 df<387CFEFEFE7C3807077A8614>
+58 D<387CFEFFFF7F3B0303030606060C1838702008127A8614>I<E000000000F8000000
+00FE000000003F800000000FE000000003F800000000FE000000003F800000000FE00000
+0003F800000000FE000000003F800000000FE000000003F800000000FE000000003F8000
+00000FE000000003F800000000FE000000003E00000000FE00000003F80000000FE00000
+003F80000000FE00000003F80000000FE00000003F80000000FE00000003F80000000FE0
+0000003F80000000FE00000003F80000000FE00000003F80000000FE00000000F8000000
+00E00000000027277AA134>62 D<00000001800000000003800000000007800000000007
+C0000000000FC0000000001FC0000000001FC00000000037C00000000037C00000000067
+C000000000C7C000000000C7E00000000183E00000000383E00000000303E00000000603
+E00000000E03E00000000C03E00000001803F00000001801F00000003001F00000006001
+F00000006001F0000000C001F0000001C001F00000018001F0000003FFFFF8000003FFFF
+F80000060000F800000C0000F800000C0000F80000180000F80000380000F80000300000
+FC00006000007C0000E000007C0000C000007C0001C000007C0003C000007C000FC00000
+FE00FFF8000FFFE0FFF8000FFFE02B2A7DA932>65 D<003FFFFFFFF8003FFFFFFFF80001
+F80003F80001F00000F80001F00000780003F00000300003F00000300003E00000300003
+E00000300007E00000300007E00000300007C00180300007C0018030000FC0038000000F
+C0030000000F80030000000F80070000001F801F0000001FFFFE0000001FFFFE0000001F
+001E0000003F000E0000003F000C0000003E000C0000003E000C0000007E001C01C0007E
+00180180007C00000180007C0000038000FC0000070000FC0000070000F800000E0000F8
+00000E0001F800001C0001F800003C0001F00000780001F00001F80003F0000FF000FFFF
+FFFFF000FFFFFFFFE0002D287CA731>69 D<003FFFFFFFE0003FFFFFFFE00001F80007E0
+0001F00003E00001F00001E00003F00000C00003F00000C00003E00000C00003E00000C0
+0007E00000C00007E00000C00007C00000C00007C00300C0000FC0070000000FC0060000
+000F80060000000F800E0000001F800E0000001F803C0000001FFFFC0000001FFFFC0000
+003F003C0000003F00180000003E00180000003E00180000007E00380000007E00300000
+007C00300000007C0000000000FC0000000000FC0000000000F80000000000F800000000
+01F80000000001F80000000001F00000000001F00000000003F000000000FFFFE0000000
+FFFFE00000002B287CA72A>I<000001FF000000001FFFE00000007E01F8000001F0007E
+000007C0001F00000F80000F80001E000007C0007C000007C000F8000003E001F0000003
+E001F0000001F003E0000001F007C0000001F00FC0000001F00F80000001F81F80000001
+F81F00000001F83F00000001F83F00000001F07E00000003F07E00000003F07E00000003
+F07E00000003F07E00000007E0FC00000007E0FC0000000FC0FC0000000FC0FC0000001F
+80FC0000001F807C0000003F007E0000003E007E0000007E003E000000FC003E000001F8
+001F000003F0001F800007C0000F80000F800007C0003F000003F000FC000000FC03F000
+00003FFFC000000007FC0000002D2A7DA832>79 D<003FFFFFC000003FFFFFF8000001F8
+00FE000001F0001F000001F0000F800003F0000FC00003F00007C00003E00007C00003E0
+0007E00007E00007E00007E0000FC00007C0000FC00007C0000FC0000FC0001F80000FC0
+001F00000F80003E00000F80007C00001F8001F000001F800FE000001FFFFF0000001FFF
+FE0000003F001F0000003F0007C000003E0007C000003E0003E000007E0003E000007E00
+03E000007C0003E000007C0003E00000FC0007E00000FC0007E00000F80007E00000F800
+07E00001F80007E01001F80007E03001F00007E03001F00007E07003F00007E0E0FFFF80
+03F1C0FFFF8001FF80000000007E002C297CA732>82 D<00001FE0080000FFFC180003E0
+1E380007000770000E0003F000180001F000300000F000700000E000E00000E000E00000
+E000E00000E001E00000C001E00000C001E000000001F000000000F800000000FE000000
+007FE00000007FFE0000003FFFE000000FFFF0000001FFF80000001FFC00000001FE0000
+00003E000000001F000000000F000000000F000000000F00180000070018000007003800
+000E003000000E003800000C003800001C0078000038007C000070007E0000E000770003
+C000E3E00F0000C0FFFE0000801FF00000252A7CA829>I<000E00001F00001F00001E00
+000C0000000000000000000000000000000000000000000000000003E00007F0000C7800
+183800303800303800607800607800C07800C0F00000F00001E00001E00001E00003C000
+03C0000780000781800781800F01800F03000F03000F06000F0C000F1C0007F00001E000
+11287DA617>105 D<00F807C001FE1FF0070738380E07B0381C03E0781803C0F83003C0
+F83003C07060078000600780000007800000078000000F0000000F0000000F0000000F00
+00001E0000001E0030001E0030301E0060783E0060F83E00C0F87E00C0F06E038061CF07
+007F83FC001E01F8001D1B7D9926>120 D E /Fv 11 121 df<1C007F00FF80FF80FF80
+FF80FF807F001C000909798817>58 D<1C007F00FF80FF80FFC0FFC0FFC07FC01CC000C0
+00C000C000C001C00180018003800300070006000E001C003800700060000A19798817>
+I<00000000006000000000000070000000000000F0000000000001F0000000000001F000
+0000000003F0000000000003F0000000000007F000000000000FF000000000000FF00000
+0000001FF800000000001FF8000000000033F8000000000073F8000000000063F8000000
+0000C3F80000000000C3F8000000000183F8000000000183F8000000000303F800000000
+0603F8000000000603FC000000000C03FC000000000C01FC000000001801FC0000000030
+01FC000000003001FC000000006001FC000000006001FC00000000C001FC00000001C001
+FC000000018001FC000000030001FE000000030001FE000000060000FE0000000E0000FE
+0000000C0000FE000000180000FE0000001FFFFFFE0000003FFFFFFE0000003FFFFFFE00
+0000600000FE000000C00000FE000000C00000FF000001800000FF0000018000007F0000
+030000007F0000060000007F0000060000007F00000C0000007F00000C0000007F000018
+0000007F0000380000007F0000700000007F0000F00000007F8001F80000007F8007F800
+0000FF80FFFF80003FFFFFFFFF80007FFFFFFFFF80007FFFFF383C7DBB3E>65
+D<0003FFFFFFFFFFF00007FFFFFFFFFFF00007FFFFFFFFFFF0000007F800003FF0000007
+F0000007F0000007F0000003E000000FF0000001E000000FF0000000E000000FE0000000
+E000000FE0000000E000001FE0000000E000001FE0000000E000001FC0000000E000001F
+C0000000C000003FC0000000C000003FC0000000C000003F80003000C000003F80003000
+C000007F80007000C000007F800070000000007F000060000000007F0000E000000000FF
+0000E000000000FF0001E000000000FE0003C000000000FE000FC000000001FFFFFFC000
+000001FFFFFFC000000001FFFFFF8000000001FC000F8000000003FC00078000000003FC
+00078000000003F800030000000003F800030000000007F800070000000007F800070003
+000007F000060003000007F00006000700000FF00006000600000FF00000000600000FE0
+0000000E00000FE00000000C00001FE00000001C00001FE00000001800001FC000000038
+00001FC00000003800003FC00000007000003FC0000000F000003F80000001E000003F80
+000001E000007F80000007E000007F8000000FC000007F0000003FC00000FF000003FF80
+00FFFFFFFFFFFF8000FFFFFFFFFFFF8000FFFFFFFFFFFF00003C397DB83D>69
+D<0003FFFFFFFFFFE00007FFFFFFFFFFE00007FFFFFFFFFFE0000007F800003FE0000007
+F000000FE0000007F0000003C000000FF0000003C000000FF0000001C000000FE0000001
+C000000FE0000001C000001FE0000001C000001FE0000001C000001FC0000001C000001F
+C00000018000003FC00000018000003FC00000018000003F800000018000003F80006001
+8000007F8000E0018000007F8000E0000000007F0000C0000000007F0000C000000000FF
+0001C000000000FF0001C000000000FE00038000000000FE00078000000001FE001F8000
+000001FFFFFF8000000001FFFFFF0000000001FFFFFF0000000003FC001F0000000003FC
+000F0000000003F8000E0000000003F8000E0000000007F8000E0000000007F8000E0000
+000007F0000C0000000007F0000C000000000FF0001C000000000FF0001C000000000FE0
+0000000000000FE00000000000001FE00000000000001FE00000000000001FC000000000
+00001FC00000000000003FC00000000000003FC00000000000003F800000000000003F80
+0000000000007F800000000000007F800000000000007F00000000000000FF8000000000
+00FFFFFFC000000000FFFFFFC000000000FFFFFFC0000000003B397DB835>I<0003FFF8
+00001FFFF80007FFFC00003FFFF80007FFFC00003FFFF8000007FC000001FF00000007FE
+0000007C00000006FE000000780000000EFF000000700000000E7F000000700000000C7F
+800000600000000C7F800000600000001C3F800000E00000001C3FC00000C0000000181F
+C00000C0000000181FE00000C0000000381FE00001C0000000380FF0000180000000300F
+F00001800000003007F00001800000007007F80003800000007003F80003000000006003
+FC0003000000006003FC000300000000E001FC000700000000E001FE000600000000C000
+FE000600000000C000FF000600000001C0007F000E00000001C0007F800C000000018000
+7F800C0000000180003F800C0000000380003FC01C0000000380001FC018000000030000
+1FE0180000000300000FE0180000000700000FF0380000000700000FF030000000060000
+07F03000000006000007F8300000000E000003F8700000000E000003FC600000000C0000
+03FC600000000C000001FE600000001C000001FEE00000001C000000FEC0000000180000
+00FFC0000000180000007FC0000000380000007FC0000000380000007F80000000300000
+003F80000000300000003F80000000700000001F80000000700000001F00000000F00000
+000F00000007FC0000000F000000FFFFE000000F000000FFFFE0000006000000FFFFE000
+000600000045397DB843>78 D<00000001FF00000000001FFFF000000000FE01FC000000
+03F0007E00000007C0001F8000001F80000FC000003E000007E00000FC000003F00001F8
+000003F00003F0000001F80007E0000001F8000FC0000000FC001F80000000FC003F0000
+0000FE007F000000007E00FE000000007E00FC000000007F01FC000000007F03F8000000
+007F03F8000000007F07F0000000007F07F0000000007F0FF0000000007F0FE000000000
+7F1FE000000000FF1FE000000000FF3FC000000000FF3FC000000000FF3FC000000000FF
+7F8000000001FE7F8000000001FE7F8000000001FE7F8000000001FEFF8000000003FCFF
+0000000003FCFF0000000003FCFF0000000007F8FF0000000007F8FF000000000FF0FF00
+0000000FF0FF000000000FE0FF000000001FE0FF000000001FC0FF000000003F807F0000
+00007F807F000000007F007F00000000FE007F00000001FC003F80000001F8003F800000
+03F8001F80000007F0001FC000000FE0000FC000001F800007E000003F000007F000007E
+000003F00001F8000001FC0003F00000007E000FC00000003F807F0000000007FFF80000
+000000FF80000000383D7CBA3F>I<0003FFFFFFF800000007FFFFFFFF80000007FFFFFF
+FFE000000007F8001FF800000007F00003FC00000007F00000FE0000000FF000007F0000
+000FF000007F0000000FE000003F8000000FE000003F8000001FE000003FC000001FE000
+003FC000001FC000003FC000001FC000003FC000003FC000003FC000003FC000007F8000
+003F8000007F8000003F8000007F8000007F800000FF0000007F800000FE0000007F0000
+01FC0000007F000003F8000000FF000007F0000000FF00000FE0000000FE00001F800000
+00FE00007F00000001FE0007F800000001FFFFFFE000000001FFFFFF0000000001FC000F
+C000000003FC0003F000000003FC0001F800000003F80000FC00000003F80000FE000000
+07F80000FE00000007F800007E00000007F000007E00000007F000007F0000000FF00000
+FF0000000FF00000FE0000000FE00000FE0000000FE00000FE0000001FE00001FE000000
+1FE00001FE0000001FC00001FE0000001FC00001FE0000003FC00001FE0000003FC00003
+FE0000003F800003FC0060003F800003FC0060007F800003FC00E0007F800003FC00C000
+7F000003FC01C000FF800001FC0180FFFFFF0001FC0380FFFFFF0000FE0700FFFFFF0000
+7E0E0000000000001FFC00000000000007F0003B3B7DB83F>82 D<0000001FE003800000
+00FFFC0300000003FFFE070000000FE01F8F0000003F0007DF0000007E0001FE000000F8
+0000FE000001F00000FE000003E000007E000003E000007C000007C000003C00000F8000
+003C00000F8000003C00001F8000003800001F0000003800001F0000003800001F000000
+3800003F0000003000003F0000003000003F8000003000003F8000000000003FC0000000
+00003FE000000000001FF000000000001FFE00000000001FFFE0000000000FFFFE000000
+0007FFFFC000000003FFFFF000000001FFFFF800000000FFFFFC000000001FFFFE000000
+0003FFFF00000000003FFF000000000003FF800000000000FF8000000000007F80000000
+00003F8000000000001F8000000000001F8000000000001F80000C0000001F80000C0000
+000F80000C0000000F80001C0000001F80001C0000001F00001C0000001F00001C000000
+1F00003C0000003E00003C0000003E00003C0000007C00003E000000F800007E000000F8
+00007F000001F000007F800003E000007FC0000FC00000F9F0001F800000F0FE00FE0000
+00E03FFFF8000000E00FFFE0000000C001FF00000000313D7CBA33>I<0000E00001F800
+03F80003F80003F80003F00001C000000000000000000000000000000000000000000000
+000000000000000000000000000000F80003FE00070F000E0F801C0F80180F80380F8030
+0F80701F80601F80603F80E03F00C03F00C07F00007E00007E0000FE0000FC0001FC0001
+FC0001F80003F80003F00003F00007F01807E01807E0380FE0300FC0300FC0700F80600F
+80E00F80C00F81C00F838007870003FE0000F80015397EB71D>105
+D<0007E001F000001FF807FE0000783E0E0F0000E01F1C0F0001C01F383F8003800FF03F
+8003000FE03F8007000FE03F000E000FC03F000C000FC01C000C001FC000001C001F8000
+0018001F80000018001F80000000003F80000000003F80000000003F00000000003F0000
+0000007F00000000007F00000000007E00000000007E0000000000FE0000000000FE0000
+000000FC000C000000FC000C000001FC001C000001FC0018001C01F80018007E01F80038
+007E03F8007000FE03F8006000FE07F800E000FE0E7C01C000781C7C03800078383E0F00
+003FF00FFC000007C003F0000029267EA42F>120 D E /Fw 139[28
+32 37 1[46 42 46 69 23 2[23 46 42 1[37 46 37 46 42 12[55
+46 2[51 65 8[51 1[60 2[60 18[21 46[{}24 83.333336 /Times-Bold
+rf /Fx 133[44 50 50 1[50 55 33 39 44 55 55 50 55 83 28
+2[28 55 50 33 44 55 44 1[50 12[66 3[61 78 72 4[39 4[72
+1[66 12[50 50 50 50 50 2[25 46[{}35 100.000000 /Times-Bold
+rf /Fy 135[40 2[40 40 40 2[40 2[40 3[40 2[40 40 40 40
+1[40 50[40 46[{}13 66.666664 /Courier rf /Fz 69[29 8[33
+1[37 37 3[29 47[29 33 33 48 33 33 18 26 22 33 33 33 33
+52 18 33 1[18 33 33 22 29 33 29 33 29 8[48 63 48 48 41
+37 44 48 37 48 48 59 41 1[26 22 1[48 37 41 48 44 1[48
+5[18 1[33 33 33 33 33 33 33 33 33 33 1[17 22 17 2[22
+22 40[{}67 66.666664 /Times-Roman rf /FA 2 122 df<0060000070000060000060
+00406020E06070F861F07C63E00F6F0003FC0000600003FC000F6F007C63E0F861F0E060
+7040602000600000600000700000600014157B9620>3 D<00600000F00000F00000F000
+00F00000F00000F0000060000060000060000060000060000060007861E0FFFFF0FFFFF0
+7861E000600000600000600000600000F00000F00000F00000F00000F00000F00000F000
+00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000
+006000006000006000006000006000006000006000142F7CA31E>121
+D E /FB 81[66 53[60 86 1[66 40 47 53 1[66 60 66 100 33
+66 1[33 66 60 40 53 66 53 66 60 10[86 1[80 1[86 1[73
+6[47 3[80 1[86 1[86 6[40 3[60 60 60 60 60 60 3[40 45[{}38
+119.999947 /Times-Bold rf /FC 78[50 55[50 50 1[50 50
+28 39 33 1[50 50 50 78 3[28 50 1[33 44 50 44 50 44 11[72
+61 55 14[72 66 66 72 92 7[50 50 4[50 50 2[25 1[25 44[{}34
+100.000000 /Times-Roman rf /FD 4 122 df<00007000000000F800000000F8000000
+00F800000000F800000000F800000000F800000000F800000000F8000000007000007800
+7000F07C007001F0FF007007F87F80700FF03FE0703FE00FF0707F8003F870FE0000FE73
+F800003F77E000000FFF80000003FE00000000F800000003FE0000000FFF8000003F77E0
+0000FE73F80003F870FE000FF0707F803FE0703FE07F80700FF0FF007007F87C007001F0
+78007000F000007000000000F800000000F800000000F800000000F800000000F8000000
+00F800000000F800000000F800000000700000252B7AAD32>3 D<0000000FE0000000FF
+E0000003FC0000000FE00000003FC00000007F80000000FF00000000FE00000001FC0000
+0001FC00000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000003F800000003F800000003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000007F000000007F00000000FE00000001FE00000
+003FC00000007F80000000FE00000007F8000000FFE0000000FFE000000007F800000000
+FE000000007F800000003FC00000001FE00000000FE000000007F000000007F000000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000003F800000003F80000
+0003F800000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000001FC00000001FC00000000FE00000000FF000000007F80000000
+3FC00000000FE000000003FC00000000FFE00000000FE0236479CA32>102
+D<FE00000000FFE000000007F800000000FE000000007F800000003FC00000001FE00000
+000FE000000007F000000007F000000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000003F800000003F800000003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000001FC00000001FC0000
+0000FE00000000FF000000007F800000003FC00000000FE000000003FC00000000FFE000
+0000FFE0000003FC0000000FE00000003FC00000007F80000000FF00000000FE00000001
+FC00000001FC00000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000003F800000003F80000
+0003F800000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000007F000000007F00000000FE00000001F
+E00000003FC00000007F80000000FE00000007F8000000FFE0000000FE00000000236479
+CA32>I<0001C000000007F000000007F000000007F000000007F000000007F000000007
+F000000007F000000007F000000007F000000007F000000003E000000003E000000003E0
+00000003E000000003E000000003E000000003E000000001C000000001C000000001C000
+000001C000000001C000000001C000003E01C03E00FFE1C3FF80FFFFFFFF80FFFFFFFF80
+FFFFFFFF80FFE1C3FF803E01C03E000001C000000001C000000001C000000001C0000000
+03E000000003E000000003E000000003E000000003E000000007F000000007F000000007
+F000000007F000000007F000000007F000000007F000000007F000000007F000000007F0
+00000007F000000007F000000007F000000007F000000007F000000007F000000007F000
+000007F000000007F000000007F000000007F000000007F000000007F000000007F00000
+0007F000000007F000000003E000000003E000000003E000000003E000000003E0000000
+03E000000003E000000003E000000003E000000003E000000003E000000003E000000003
+E000000003E000000003E000000001C000000001C000000001C000000001C000000001C0
+00000001C000000001C000000001C000000001C000000001C00000215B7BC52C>121
+D E /FE 81[80 51[64 72 1[104 1[80 48 56 64 1[80 72 80
+120 40 80 1[40 2[48 64 1[64 1[72 13[80 104 112 88 112
+8[88 4[104 6[48 58[{}27 144.000000 /Times-Bold rf /FF
+81[42 51[32 37 37 55 37 42 23 32 32 42 42 42 42 60 23
+37 23 23 42 42 23 37 42 37 42 42 9[69 51 60 46 42 51
+60 51 60 1[69 3[28 1[60 51 51 60 55 51 51 6[28 42 42
+42 42 2[42 42 42 2[21 28 21 44[{}56 83.333336 /Times-Italic
+rf /FG 47[83 13[28 7[37 8[42 1[46 46 3[37 47[37 42 42
+60 42 42 23 32 28 42 42 42 42 65 23 42 23 23 42 42 28
+37 42 37 42 37 3[28 1[28 2[60 78 60 60 51 46 55 60 46
+60 60 74 51 60 32 28 60 60 46 51 60 55 55 60 1[37 3[23
+23 42 42 42 42 42 42 42 42 42 42 23 21 28 21 47 1[28
+28 28 1[69 37[{}81 83.333336 /Times-Roman rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop -112 -353 3343 4 v -112 -227 4 126 v -84 -270
+a FG(T)-7 b(o)20 b(appear)f(in)h FF(Pr)l(oceedings)f(11th)h
+(International)e(Confer)m(ence)h(on)h(Data)g(Engineering)p
+FG(,)e(T)-7 b(aipei,)20 b(March)f(1995)p 3227 -227 V
+-112 -224 3343 4 v 684 286 a FE(Prairie:)49 b(A)36 b(Rule)f
+(Speci\256cation)e(Framew)o(ork)1268 469 y(f)l(or)j(Query)e(Optimizers)
+2598 417 y FD(\003)-16 b(y)1160 710 y FC(Dinesh)24 b(Das)650
+b(Don)25 b(Batory)1262 826 y(Department)g(of)g(Computer)f(Sciences)1277
+942 y(The)h(Uni)n(v)o(ersity)d(of)j(T)-7 b(e)o(xas)25
+b(at)f(Austin)1416 1058 y(Austin,)g(T)-7 b(e)o(xas)24
+b(78712\2611188)1358 1175 y FD(f)p FC(ddas,batory)p FD(g)p
+FC(@cs.ute)o(xas.edu)-112 1500 y FB(Abstract)-112 1692
+y FF(F)-5 b(r)l(om)28 b(our)f(e)n(xperience)o(,)h(curr)m(ent)f
+(rule-based)f(query)h(optimizer)o(s)-112 1792 y(do)22
+b(not)g(pr)l(o)o(vide)h(a)f(very)i(intuitive)e(and)g(well-de\256ned)f
+(fr)o(ame)o(work)-112 1891 y(to)30 b(de\256ne)f(rules)i(and)e(actions.)
+59 b(T)-8 b(o)31 b(r)m(emedy)f(this)h(situation,)h(we)-112
+1991 y(pr)l(opose)24 b(an)h(e)n(xtensible)g(and)g(structur)m(ed)g(alg)o
+(ebr)o(aic)f(fr)o(ame)o(work)-112 2090 y(called)e(Pr)o(airie)h(for)g
+(specifying)g(rules.)38 b(Pr)o(airie)23 b(facilitates)g(rule-)-112
+2190 y(writing)h(by)f(enabling)f(a)i(user)g(to)g(write)h(rules)f(and)f
+(actions)g(mor)m(e)-112 2290 y(quic)n(kly)-5 b(,)30 b(corr)m(ectly)f
+(and)e(in)i(an)f(easy-to-under)o(stand)d(and)j(easy-)-112
+2389 y(to-deb)n(ug)18 b(manner)-9 b(.)-29 2492 y(Query)24
+b(optimizer)o(s)h(consist)g(of)g(thr)m(ee)g(major)f(parts:)39
+b(a)24 b(sear)m(c)o(h)-112 2592 y(space)o(,)17 b(a)g(cost)h(model)e
+(and)h(a)g(sear)m(c)o(h)g(str)o(ate)m(gy)-5 b(.)28 b(The)17
+b(appr)l(oac)o(h)e(we)-112 2692 y(tak)o(e)20 b(is)h(only)f(to)g(de)o
+(velop)f(the)h(alg)o(ebr)o(a)f(whic)o(h)h(de\256nes)f(the)h(sear)m(c)o
+(h)-112 2791 y(space)29 b(and)g(the)h(cost)g(model)f(and)g(use)h(the)g
+(V)-9 b(olcano)28 b(optimizer)n(-)-112 2891 y(g)o(ener)o(ator)c(as)j
+(our)e(sear)m(c)o(h)h(engine)o(.)45 b(Using)26 b(Pr)o(airie)g(as)g(a)g
+(fr)l(ont-)-112 2990 y(end,)i(we)h(tr)o(anslate)f(Pr)o(airie)g(rules)g
+(to)g(V)-9 b(olcano)26 b(to)i(validate)f(our)-112 3090
+y(claim)20 b(that)g(Pr)o(airie)g(mak)o(es)g(it)h(easier)g(to)f(write)i
+(rules.)-29 3193 y(W)-8 b(e)17 b(describe)f(our)g(alg)o(ebr)o(a)f(and)h
+(pr)m(esent)g(e)n(xperimental)g(r)m(esults)-112 3293
+y(whic)o(h)e(show)h(that)g(using)g(a)g(high-le)o(vel)e(fr)o(ame)o(work)
+i(lik)o(e)g(Pr)o(airie)h(to)-112 3392 y(design)d(lar)m(g)o(e-scale)g
+(optimizer)o(s)h(does)g(not)f(sacri\256ce)h(ef)o(\256ciency)-5
+b(.)-112 3691 y FB(1)119 b(Intr)n(oduction)-112 3883
+y FG(Query)30 b(optimization)f([8])i(is)h(a)f(fundamental)e(part)i(of)f
+(database)-112 3982 y(systems.)43 b(It)26 b(is)g(the)f(process)f(of)h
+(generating)e(an)i(ef)n(\256cient)f(access)-112 4082
+y(plan)f(for)h(a)g(database)g(query)-5 b(.)39 b(Informally)-5
+b(,)22 b(an)i(access)g(plan)g(is)h(an)-112 4182 y(e)o(x)o(ecution)12
+b(strate)o(gy)i(for)h(a)g(query;)g(it)h(is)g(the)f(sequence)e(of)i(lo)n
+(w-le)n(v)o(el)-112 4281 y(database)24 b(retrie)n(v)n(al)h(operations)f
+(that,)i(when)f(e)o(x)o(ecuted,)g(produce)-112 4381 y(the)e(database)f
+(records)g(that)i(satisfy)f(the)g(query)-5 b(.)37 b(There)22
+b(are)h(three)-112 4481 y(basic)h(aspects)h(that)f(de\256ne)g(and)g
+(in\257uence)f(query)g(optimization:)-112 4580 y(the)d(search)g(space,)
+f(the)i(cost)f(model,)f(and)h(the)g(search)g(strate)o(gy)-5
+b(.)-29 4683 y(The)20 b FF(sear)m(c)o(h)f(space)h FG(is)i(the)e(set)h
+(of)f(logically)g(equi)n(v)n(alent)e(access)-112 4783
+y(plans)27 b(that)h(can)f(be)h(used)f(to)h(e)n(v)n(aluate)e(a)i(query)
+-5 b(.)50 b(All)28 b(plans)g(in)f(a)p -112 4867 788 4
+v -29 4921 a FA(\003)7 4944 y Fz(This)18 b(research)i(w)o(as)e
+(supported)i(in)f(part)g(by)f(grants)h(from)f(The)g(Uni)n(v)o(ersity)j
+(of)-112 5023 y(T)-5 b(e)o(xas)23 b(Applied)h(Research)h(Laboratories,)
+h(Schlumber)o(ger)m(,)g(and)e(Digital)g(Equip-)-112 5102
+y(ment)17 b(Corporation.)-26 5160 y FA(y)7 5184 y Fz(An)e(e)o(xpanded)i
+(v)o(ersion)f(of)f(this)h(paper)g(is)f(a)o(v)n(ailable)k(as)c(T)-5
+b(echnical)18 b(Report)e(TR)-112 5263 y(94\26116)h(by)g(anon)o(ymous)h
+(ftp)f(from)g Fy(ftp.cs.utexas.edu)p Fz(.)2044 1500 y
+FG(query')-5 b(s)20 b(search)h(space)h(return)e(the)h(same)h(result;)g
+(ho)n(we)n(v)o(er)m(,)d(some)2044 1600 y(plans)f(are)g(more)f(ef)n
+(\256cient)h(than)g(others.)28 b(The)17 b FF(cost)i(model)f
+FG(assigns)2044 1699 y(a)h(cost)h(to)g(each)f(plan)f(in)i(the)f(search)
+g(space.)29 b(The)19 b(cost)h(of)f(a)g(plan)g(is)2044
+1799 y(an)e(estimate)h(of)g(the)f(resources)g(used)g(when)g(the)h(plan)
+f(is)i(e)o(x)o(ecuted;)2044 1899 y(the)k(lo)n(wer)h(the)f(cost,)i(the)f
+(better)f(the)h(plan.)39 b(The)23 b FF(sear)m(c)o(h)h(str)o(ate)m(gy)
+2044 1998 y FG(is)i(a)f(speci\256cation)f(of)h(which)f(plans)h(in)g
+(the)g(search)g(space)g(are)g(to)2044 2098 y(be)20 b(e)o(xamined.)2127
+2197 y(T)m(raditionally)-5 b(,)19 b(query)h(optimizers)g(ha)n(v)o(e)h
+(been)f(b)n(uilt)i(as)g(mono-)2044 2297 y(lithic)i(subsystems)f(of)h(a)
+g(DBMS.)h(This)f(simply)f(re\257ects)h(the)g(f)o(act)2044
+2397 y(that)16 b(traditional)g(database)g(systems)g(are)h(themselv)o
+(es)f(monolithic:)2044 2496 y(the)j(algorithms)f(used)h(for)f(storing)g
+(and)h(retrie)n(ving)e(data)i(are)g(hard-)2044 2596 y(wired)25
+b(and)g(are)g(rather)g(dif)n(\256cult)f(to)i(change.)43
+b(The)25 b(need)g(to)h(ha)n(v)o(e)2044 2696 y(e)o(xtensible)16
+b(database)i(systems,)g(and)f(in)h(turn)f(e)o(xtensible)g(optimiz-)2044
+2795 y(ers,)27 b(has)g(long)e(been)g(recognized)f(in)i(systems)g(lik)o
+(e)h(Genesis)f([1],)2044 2895 y(EXODUS)15 b([9],)g(Starb)n(urst)g
+([10],)f(and)h(Postgres)g([12].)26 b(Rule-based)2044
+2994 y(query)18 b(optimizers)i(are)g(among)e(the)j(major)e(conceptual)f
+(adv)n(ances)2044 3094 y(that)29 b(ha)n(v)o(e)f(been)h(proposed)e(to)i
+(deal)g(with)g(query)f(optimizer)g(e)o(x-)2044 3194 y(tensibility)c
+([6,)13 b(7,)g(9,)g(10].)40 b(The)24 b(e)o(xtensibility)g(translates)g
+(into)g(the)2044 3293 y(ability)e(to)h(incorporate)d(ne)n(w)i
+(operators,)g(algorithms,)f(cost)i(mod-)2044 3393 y(els,)k(or)e(search)
+g(strate)o(gies)g(without)g(changing)e(the)j(optimization)2044
+3493 y(algorithm.)2127 3592 y(In)21 b(this)i(paper)m(,)d(we)i(describe)
+f(an)h(algebraic)f(frame)n(w)o(ork)e(called)2044 3692
+y FF(Pr)o(airie)g FG(for)f(specifying)f(rules)i(in)g(a)g(rule-based)f
+(query)f(optimizer)-5 b(.)2044 3791 y(Prairie)27 b(is)h(similar)f(to)h
+(other)e(rule)h(speci\256cation)f(languages)g(lik)o(e)2044
+3891 y(Starb)n(urst)d([10])g(and)h(V)-11 b(olcano)23
+b([7],)h(and)f(indeed,)h(we)g(ha)n(v)o(e)f(based)2044
+3991 y(our)h(w)o(ork)h(on)g(V)-11 b(olcano)24 b(to)h(capture)f(most)i
+(of)f(the)g(adv)n(antages)e(of)2044 4090 y(rule-based)15
+b(optimizers.)27 b(Ho)n(we)n(v)o(er)m(,)15 b(Prairie)i(attempts)f(to)h
+(pro)o(vide)2044 4190 y(some)26 b(k)o(e)o(y)f(features)g(that,)j(we)e
+(ha)n(v)o(e)f(found,)h(simplify)f(the)h(ef)n(fort)2044
+4290 y(in)20 b(writing)g(rules:)2106 4466 y(1.)41 b(A)27
+b(frame)n(w)o(ork)d(in)i(which)g(users)h(can)f(de\256ne)g(a)h(query)e
+(opti-)2210 4565 y(mizer)i(concisely)h(in)g(terms)g(of)g(a)g
+(well-de\256ned)f(set)i(of)f(op-)2210 4665 y(erators)g(and)g
+(algorithms.)52 b FF(All)29 b FG(operators)e(and)h(algorithms)2210
+4764 y(are)21 b(considered)e(\256rst-class)j(objects,)f(i.e.,)h
+FF(any)e FG(of)h(them)g(can)2210 4864 y(occur)26 b(in)h(an)o(y)g(rule,)
+h(and)f FF(only)g FG(these)g(operators)f(and)h(algo-)2210
+4964 y(rithms)19 b(can)g(appear)f(in)h(rules.)29 b(This)19
+b(scheme)g(eliminates)g(the)2210 5063 y(need)29 b(for)h(special)g
+(classes)h(of)f(operators)e(and)i(algorithms,)2210 5163
+y(such)17 b(as)i(enforcers)d(in)i(V)-11 b(olcano)17 b(and)h(glue)f(in)h
+(Starb)n(urst,)g(that)2210 5263 y(signi\256cantly)h(complicate)g(rule)h
+(speci\256cation.)p eop
+%%Page: 2 2
+2 1 bop -50 21 a FG(2.)41 b(A)17 b(frame)n(w)o(ork)e(in)i(which)f
+(users)h(can)g(de\256ne)g(a)g(list)h(of)f(proper)n(-)54
+120 y(ties)g(to)f(characterize)f(the)h(e)o(xpressions)f(generated)g(in)
+h(the)h(op-)54 220 y(timization)g(process.)28 b(Again,)18
+b(the)h(goal)e(here)h(is)i(to)e(allo)n(w)h(the)54 319
+y(user)h(to)h(treat)g FF(all)g FG(properties)e(as)j(ha)n(ving)d(equal)h
+(status.)32 b(This)54 419 y(is)22 b(dif)n(ferent)d(from)h(V)-11
+b(olcano)21 b(where)f(the)h(user)g(must)h(classify)54
+519 y(properties)30 b(as)i(logical,)h(physical,)g(or)f
+(operator/algorithm)54 618 y(ar)o(guments.)-50 789 y(3.)41
+b(A)15 b(frame)n(w)o(ork)d(in)j(which)g(users)g(can)f(specify)g
+(mapping)f(func-)54 889 y(tions)k(between)g(properties)g(concomitantly)
+e(with)j(the)g(corre-)54 988 y(sponding)13 b(rules.)23
+b(This)13 b(contrasts)g(with)g(e)o(xisting)g(approach)o(es)54
+1088 y(in)20 b(which)f(mappings)g(between)g(properties)g(are)h
+(fragmented)54 1188 y(into)d(multiple)g(functions)f(and)g(at)i
+(logically)f(dif)n(ferent)f(places)54 1287 y(than)h(the)h
+(corresponding)d(rules.)28 b(Research)18 b(into)f(rule-based)54
+1387 y(optimizers)31 b(has)i(re)n(v)o(ealed)d(that)j(property-mapping)
+27 b(func-)54 1487 y(tions)k(are)g(a)h(major)f(source)g(of)g(user)g(ef)
+n(fort,)i(so)f(this)g(is)g(an)54 1586 y(important)18
+b(goal.)-50 1757 y(4.)41 b(The)16 b(format)h(\(Prairie\))f(in)i(which)e
+(users)i(can)f(cleanly)f(specify)54 1857 y(rules)e(is)i(not)e
+(necessarily)h(the)f(same)h(format)f(needed)g(for)g(gen-)54
+1956 y(erating)24 b(ef)n(\256cient)i(optimizers.)45 b(Thus,)26
+b(there)f(is)i(a)f(need)f(for)54 2056 y(a)c(pre-processor)e(\(written)h
+(by)h(us\))g(that)g(translates)h(between)54 2156 y(these)e(competing)e
+(representations.)-29 2343 y(Prairie)26 b(stri)n(v)o(es)h(for)f
+(uniformity)f(in)i(dealing)f(with)h(issues)h(that)-112
+2443 y(ha)n(v)o(e)h(been)g(a)h(source)f(of)h(most)g(user)g(ef)n(fort)f
+(and)g(potential)g(user)-112 2542 y(errors.)69 b(In)33
+b(the)h(follo)n(wing)f(sections,)k(we)d(present)f(the)h(Prairie)-112
+2642 y(frame)n(w)o(ork.)45 b(W)-7 b(e)27 b(e)o(xplain)e(ho)n(w)h(our)f
+(P2V)h(pre-processor)e(maps)-112 2742 y(Prairie)30 b(rule)g
+(speci\256cations)g(into)g(V)-11 b(olcano)29 b(rule)h(speci\256cations)
+-112 2841 y(that)g(can)g(be)g(processed)f(ef)n(\256ciently)-5
+b(.)58 b(Experimental)28 b(results)j(to)-112 2941 y(support)26
+b(this)i(claim)g(are)g(gi)n(v)o(en)f(in)h(Section)f(4,)j(where)d(we)i
+(com-)-112 3041 y(pare)13 b(implementations)f(of)i(the)h(T)-6
+b(e)o(xas)14 b(Instruments)e(Open)i(OODB)-112 3140 y(query)25
+b(optimizer)h(using)h(both)f(Prairie)h(and)g(V)-11 b(olcano.)49
+b(W)-7 b(e)29 b(con-)-112 3240 y(clude)19 b(with)h(a)h(summary)e(and)g
+(related)h(research.)-112 3527 y FB(2)119 b(Prairie:)55
+b(A)37 b(language)f(f)m(or)f(rule)i(speci-)67 3676 y(\256cation)-112
+3864 y FG(The)22 b(basic)h(concepts)f(and)h(de\256nitions)f(that)h
+(underlie)f(the)h(Prairie)-112 3964 y(model)13 b(are)h(presented)f(in)h
+(this)h(section.)27 b(The)14 b(goal)g(is)h(to)f(lay)h(a)f(foun-)-112
+4063 y(dation)g(for)h(reasoning)f(about)g(query)h(optimization)e
+(algebraically;)-112 4163 y(this)21 b(is)i(necessary)d(for)h(our)f
+(subsequent)g(discussion)h(about)f(trans-)-112 4262 y(lating)f(Prairie)
+h(speci\256cations)g(to)h(those)f(of)f(V)-11 b(olcano.)-112
+4507 y Fx(2.1)99 b(Notation)24 b(and)i(assumptions)-112
+4665 y Fw(Stor)o(ed)k(Files)i(and)g(Str)o(eams.)81 b
+FG(A)32 b(\256le)g(is)g FF(stor)m(ed)i FG(if)e(its)g(tuples)-112
+4764 y(reside)c(on)g(disk.)54 b(In)29 b(the)f(case)h(of)g(relational)e
+(databases,)j(stored)-112 4864 y(\256les)i(are)f(sometimes)g(called)g
+FF(base)g(r)m(elations)p FG(;)37 b(we)32 b(will)g(denote)-112
+4964 y(them)25 b(by)h Fv(R)h FG(or)e Fv(R)438 4976 y
+Fu(i)466 4964 y FG(.)47 b(In)25 b(object-oriented)f(schemas,)i(stored)g
+(\256les)-112 5063 y(are)g FF(classes)p FG(;)j(we)e(will)g(denote)e
+(them)g(by)h FF(C)h FG(or)f FF(C)1366 5075 y Fu(i)1394
+5063 y FG(.)47 b(Henceforth,)-112 5163 y(whene)n(v)o(er)21
+b(we)j(refer)f(to)h(a)g(stored)f(\256le,)i(we)f(mean)f(a)h(relation)f
+(or)g(a)-112 5263 y(class;)d(when)f(the)g(distinction)g(is)h
+(unimportant,)d(we)j(will)g(use)f Fv(F)32 b FG(or)2044
+21 y Fv(F)2097 33 y Fu(i)2125 21 y FG(.)44 b(A)26 b FF(str)m(eam)f
+FG(is)i(a)e(sequence)f(of)h(tuples)g(and)f(is)j(the)e(result)g(of)g(a)
+2044 120 y(computation)d(on)i(one)f(or)h(more)g(streams)g(or)g(stored)g
+(\256les;)j(tuples)2044 220 y(of)21 b(streams)i(are)e(returned)g(one)g
+(at)i(a)f(time,)g(typically)f(on)h(demand.)2044 319 y(Streams)e(can)g
+(be)g FF(named)p FG(,)f(denoted)g(by)g Fv(S)3268 331
+y Fu(i)3296 319 y FG(,)h(or)g FF(unnamed)p FG(.)2044
+559 y Fw(Database)f(Operations.)82 b FG(An)21 b FF(oper)o(ation)d
+FG(is)k(a)f(computation)d(on)2044 659 y(one)j(or)h(more)f(streams)h(or)
+g(stored)g(\256les.)35 b(There)21 b(are)h(tw)o(o)h(types)e(of)2044
+759 y(database)d(operations)e(in)j(Prairie:)29 b(abstract)18
+b(\(or)g(implementation-)2044 858 y(unspeci\256ed\))34
+b(operators)f(and)i(concrete)g(algorithms.)73 b(Each)35
+b(is)2044 958 y(detailed)19 b(belo)n(w)-5 b(.)2210 1157
+y Fw(Operators.)39 b FG(Abstract)13 b(\(or)g(conceptual\))g
+FF(op)o(er)o(ato)o(r)o(s)g FG(specify)2392 1257 y(computations)20
+b(on)i(streams)g(or)g(stored)g(\256les;)i(the)o(y)d(are)2392
+1357 y(denoted)d(by)h(all)h(capital)g(letters)f(\(e.g.,)g(JOIN\).)g
+(Opera-)2392 1456 y(tors)24 b(ha)n(v)o(e)f(tw)o(o)h(types)f(of)g
+(parameters:)35 b(essential)24 b(and)2392 1556 y(additional.)49
+b FF(Essential)28 b(par)o(ameter)o(s)f FG(are)g(the)g(stream)2392
+1656 y(or)18 b(\256le)g(inputs)f(to)g(an)h(operator;)e(these)i(are)f
+(the)h(primary)2392 1755 y(inputs)g(to)h(be)f(processed)f(by)h(an)g
+(operator)-5 b(.)27 b FF(Additional)2392 1855 y(par)o(ameter)o(s)j
+FG(are)f(\252\256ne-grain\272)f(quali\256cations)h(of)g(an)2392
+1954 y(operator;)21 b(their)g(purpose)e(is)k(to)e(describe)g(an)g
+(operator)2392 2054 y(in)g(more)e(detail)h(than)g(essential)h
+(parameters.)2210 2194 y Fw(Algorithms.)40 b FF(Algorithms)55
+b FG(are)h(concrete)e(implementa-)2392 2293 y(tions)21
+b(of)g(conceptual)e(operators;)h(the)o(y)g(will)i(be)e(repre-)2392
+2393 y(sented)13 b(in)g(lo)n(wer)g(case)g(with)g(the)g(\256rst)g
+(letter)g(capitalized)2392 2493 y(\(e.g.,)k(Nested)p
+2815 2493 25 4 v 29 w(loops\).)28 b(Algorithms)15 b(ha)n(v)o(e)i(at)g
+(least)h(the)2392 2592 y(same)30 b(essential)f(and)f(additional)g
+(parameters)f(as)j(the)2392 2692 y(conceptual)21 b(operators)h(that)g
+(the)o(y)g(implement.)3798 2662 y Ft(1)3871 2692 y FG(Fur)n(-)2392
+2792 y(thermore,)28 b(there)g(can)g(be,)h(and)f(usually)f(are,)j(se)n
+(v)o(eral)2392 2891 y(algorithms)19 b(for)h(a)h(particular)d(operator)
+-5 b(.)2044 3091 y(T)e(able)26 b(1)h(lists)h(some)f(operators)e(and)h
+(algorithms)f(implementing)2044 3191 y(them)20 b(together)e(with)j
+(their)f(additional)f(parameters.)2044 3430 y Fw(Operator)i(T)-6
+b(r)o(ees.)82 b FG(An)23 b FF(oper)o(ator)e(tr)m(ee)i
+FG(is)h(a)f(rooted)e(tree)h(whose)2044 3530 y(non-leaf,)27
+b(or)g FF(interior)p FG(,)i(nodes)e(are)h(database)e(operations)g
+(\(oper)n(-)2044 3630 y(ators)g(or)g(algorithms\))f(and)g(whose)h(leaf)
+h(nodes)e(are)i(stored)e(\256les.)2044 3729 y(The)e(children)g(of)g(an)
+h(interior)e(node)h(in)h(an)g(operator)e(tree)h(are)h(the)2044
+3829 y(essential)i(parameters)e(\(i.e.,)i(the)g(stream)f(or)g(\256le)h
+(parameters\))e(of)2044 3928 y(the)h(node.)43 b(Additional)24
+b(parameters)g(are)i(implicitly)e(attached)h(to)2044
+4028 y(each)h(node.)49 b(Algebraically)-5 b(,)26 b(operator)f(trees)j
+(are)f(compositions)2044 4128 y(of)18 b(database)g(operations;)g(thus,)
+g(we)h(will)g(also)g(call)g(operator)e(trees)2044 4227
+y FF(e)n(xpr)m(essions)p FG(;)j(both)g(terms)g(will)h(be)f(used)g
+(interchangeably)-5 b(.)2044 4447 y(E)p Fz(XAMPLE)19
+b FG(1.)153 b(A)29 b(simple)f(e)o(xpression)f(and)h(its)h(operator)e
+(tree)2044 4547 y(representation)22 b(are)h(sho)n(wn)h(in)g(Figure)f
+(1\(a\).)40 b(Relations)24 b Fv(R)3831 4559 y Ft(1)3893
+4547 y FG(and)2044 4646 y Fv(R)2107 4658 y Ft(2)2172
+4646 y FG(are)j(\256rst)h(RET)m(rie)n(v)o(ed,)f(then)g(JOINed,)h(and)f
+(\256nally)g(SOR)-5 b(T)f(ed)2044 4746 y(resulting)13
+b(in)h(a)h(stream)f(sorted)g(on)f(a)i(speci\256c)f(attrib)n(ute.)27
+b(The)14 b(\256gure)2044 4846 y(sho)n(ws)g(only)g(the)h(essential)g
+(parameters)e(of)i(the)f(v)n(arious)g(operators,)2044
+4945 y(not)20 b(the)g(additional)f(parameters.)915 b
+Fs(\003)p 2044 5107 788 4 v 2129 5160 a Fr(1)2163 5184
+y Fz(Algorithms)20 b(may)f(ha)o(v)o(e)g Fq(tuning)h(par)o(ameter)o(s)g
+Fz(which)f(are)h(not)f(parameters)h(of)2044 5263 y(the)e(operators)g
+(the)o(y)g(implement.)p eop
+%%Page: 3 3
+3 2 bop -112 71 2323 13 v -112 138 4 67 v -59 118 a Fp(Operator)p
+330 138 V 211 w(Description)p 912 138 V 294 w(Additional)17
+b(P)o(arameters)p 1581 138 V 102 w(Algorithm)p 2206 138
+V -112 150 2323 13 v -112 216 4 67 v -59 231 a Fo(JOIN\()p
+Fu(S)127 239 y Fn(1)159 231 y Fo(,)d Fu(S)229 239 y Fn(2)261
+231 y Fo(\))p 330 216 V 384 232 a(Join)g(streams)g Fu(S)728
+240 y Fn(1)760 232 y Fo(,)g Fu(S)830 240 y Fn(2)p 912
+216 V 965 197 a Fo(tuple)p 1084 197 18 4 v 22 w(order)p
+1581 216 4 67 v 409 w(Nested)p 1799 197 18 4 v 21 w(loops\()p
+Fu(S)2003 205 y Fn(1)2035 197 y Fo(,)g Fu(S)2105 205
+y Fn(2)2137 197 y Fo(\))p 2206 216 4 67 v 1585 220 626
+4 v -112 283 4 67 v 330 283 V 912 283 V 965 263 a(join)p
+1058 263 18 4 v 22 w(predicate)p 1581 283 4 67 v 344
+w(Mer)o(ge)p 1788 263 18 4 v 21 w(join\()p Fu(S)1956
+271 y Fn(1)1989 263 y Fo(,)g Fu(S)2059 271 y Fn(2)2091
+263 y Fo(\))p 2206 283 4 67 v -112 286 2323 4 v -112
+363 4 77 v -59 407 a(RET\()p Fu(F)9 b Fo(\))p 330 363
+V 384 412 a(Retrie)o(v)o(e)14 b(\256le)g Fu(F)p 912 363
+V 965 339 a Fo(tuple)p 1084 339 18 4 v 22 w(order)p 1581
+363 4 77 v 1634 352 a(File)p 1727 352 18 4 v 22 w(scan\()p
+Fu(F)9 b Fo(\))p 2206 363 4 77 v -112 429 4 67 v 330
+429 V 912 429 V 965 410 a(selection)p 1175 410 18 4 v
+21 w(predicate)p 1581 429 4 67 v 1585 397 622 4 v 2206
+429 4 67 v -112 497 4 68 v 330 497 V 912 497 V 965 477
+a(projected)p 1184 477 18 4 v 22 w(attrib)o(utes)p 1581
+497 4 68 v 1634 469 a(Inde)o(x)p 1768 469 18 4 v 22 w(scan\()p
+Fu(F)g Fo(\))p 2206 497 4 68 v -112 500 2323 4 v -112
+567 4 67 v -59 582 a(SOR)m(T\()p Fu(S)147 590 y Fn(1)178
+582 y Fo(\))p 330 567 V 384 583 a(Sort)15 b(stream)f
+Fu(S)705 591 y Fn(1)p 912 567 V 965 580 a Fo(tuple)p
+1084 580 18 4 v 22 w(order)p 1581 567 4 67 v 1634 547
+a(Mer)o(ge)p 1788 547 18 4 v 21 w(sort\()p Fu(S)1953
+555 y Fn(1)1986 547 y Fo(\))p 2206 567 4 67 v 1585 570
+626 4 v -112 633 4 67 v 330 633 V 912 633 V 1581 633
+V 1634 613 a(Null\()p Fu(S)1797 621 y Fn(1)1830 613 y
+Fo(\))p 2206 633 V -112 646 2323 13 v -112 793 a FG(T)-7
+b(able)18 b(1:)28 b(Operators)17 b(and)g(algorithms)g(in)h(a)h
+(centralized)e(query)f(optimizer)h(and)-112 893 y(their)i(additional)g
+(parameters)p 2477 33 1523 13 v 2477 99 4 67 v 2530 80
+a Fp(Pr)o(operty)p 3032 99 V 333 w(Description)p 3996
+99 V 2477 112 1523 13 v 2477 178 4 67 v 2530 158 a Fo(join)p
+2623 158 18 4 v 22 w(predicate)p 3032 178 4 67 v 230
+w(join)c(predicate)g(for)g(JOIN)g(operator)p 3996 178
+V 2477 182 1523 4 v 2477 248 4 67 v 2530 228 a(selection)p
+2740 228 18 4 v 21 w(predicate)p 3032 248 4 67 v 114
+w(selection)g(predicate)f(for)h(RET)f(operator)p 3996
+248 V 2477 251 1523 4 v 2477 318 4 67 v 2530 331 a(tuple)p
+2649 331 18 4 v 21 w(order)p 3032 318 4 67 v 3085 298
+a(tuple)h(order)g(of)g(resulting)g(stream,)p 3996 318
+V 2477 384 V 3032 384 V 3085 364 a(DONT)p 3250 364 18
+4 v 21 w(CARE)e(if)i(none)p 3996 384 4 67 v 2477 388
+1523 4 v 2477 454 4 67 v 2530 434 a(num)p 2636 434 18
+4 v 21 w(records)p 3032 454 4 67 v 260 w(number)h(of)e(tuples)h(of)g
+(resulting)g(stream)p 3996 454 V 2477 457 1523 4 v 2477
+524 4 67 v 2530 504 a(tuple)p 2649 504 18 4 v 21 w(size)p
+3032 524 4 67 v 327 w(size)f(of)h(indi)o(vidual)g(tuple)g(in)g(stream)p
+3996 524 V 2477 527 1523 4 v 2477 593 4 67 v 2530 574
+a(projected)p 2749 574 18 4 v 21 w(attrib)o(utes)p 3032
+593 4 67 v 103 w(projected)g(attrib)o(utes)g(for)g(RET)f(operator)p
+3996 593 V 2477 597 1523 4 v 2477 663 4 67 v 2530 643
+a(attrib)o(utes)p 3032 663 V 340 w(list)h(of)g(attrib)o(utes)p
+3996 663 V 2477 666 1523 4 v 2477 733 4 67 v 2530 713
+a(cost)p 3032 733 V 461 w(estimated)g(cost)f(of)h(algorithm)p
+3996 733 V 2477 745 1523 13 v 2477 893 a FG(T)-7 b(able)16
+b(2:)28 b(Properties)15 b(of)h(nodes)f(in)i(an)f(operator)e(tree)p
+-105 1246 1938 4 v -105 2116 4 870 v 61 1362 a Fm(SOR)n(T)c(\(JOIN)g
+(\(RET)h(\()p Fl(R)449 1374 y Fn(1)481 1362 y Fm(\),)f(RET)h(\()p
+Fl(R)661 1374 y Fn(2)693 1362 y Fm(\)\)\))346 1462 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 3.36499
+0.06248 false .5 12.47998 InitRnode } NewNode end end
+
+346 1462 a Fm(SOR)n(T)353 1557 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 3.36499
+0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 353 1557 a Fm(JOIN)303
+1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303 1732 a 264 1651 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 264 1651 a Fm(RET)453 1651
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 453 1651 a Fm(RET)303 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 303 1732 a 303 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+
+303 1732 a 265 1740 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 265 1740 a Fl(R)308 1752 y Fn(1)455
+1740 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 455 1740 a Fl(R)498 1752 y Fn(2)303 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303
+1732 a 303 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303 1732 a 27 1914 a Fz(\(a\))37 b(An)f(e)o
+(xpression)j(and)e(its)27 1993 y(corresponding)19 b(operator)g(tree)p
+872 2091 4 820 v 1237 1457 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodemergesort 16 { .5 3.36499
+1.09 false .5 22.25996 InitRnode } NewNode end end
+ 1237 1457 a Fm(Mer)o(ge)p
+1346 1457 13 4 v 16 w(sort)1219 1552 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodenestedloops 16 { .5 3.36499
+1.07999 false .5 26.51999 InitRnode } NewNode end end
+ 1219 1552 a Fm(Nested)p
+1336 1552 13 4 v 16 w(loops)1235 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodemergesort
+/TheNodenestedloops InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1158
+1651 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr1 16 { .5 3.36499
+0.04 false .5 18.465 InitRnode } NewNode end end
+ 1158 1651 a Fm(File)p 1225 1651 13 4 v 15 w(scan)1347
+1651 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr2 16 { .5 3.36499
+0.04 false .5 18.465 InitRnode } NewNode end end
+ 1347 1651 a Fm(File)p 1414 1651 13 4 v 15 w(scan)1235
+1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodenestedloops
+/TheNodefilescanr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1235 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodenestedloops
+/TheNodefilescanr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1197 1740
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 1197 1740 a Fl(R)1240 1752 y Fn(1)1386 1740 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 1386
+1740 a Fl(R)1429 1752 y Fn(2)1235 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodefilescanr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1235 1732 a
+1235 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodefilescanr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1235 1732 a 959 1914 a Fz(\(b\))h(Possible)i(access)g(plan)
+g(for)959 1993 y(operator)d(tree)f(in)f(\(a\))p 1829
+2116 4 870 v -105 2119 1938 4 v 1831 2136 19 877 v -89
+2136 1938 19 v -26 2318 a FG(Figure)i(1:)30 b(Example)19
+b(of)h(an)g(operator)e(tree)i(and)g(access)h(plan)-112
+2520 y Fw(Descriptors.)82 b FG(A)16 b FF(pr)l(operty)g
+FG(of)g(a)h(node)e(is)i(a)g(\(user)n(-de\256ned\))d(v)n(ari-)-112
+2620 y(able)31 b(that)g(contains)g(information)e(used)i(by)g(an)h
+(optimizer)-5 b(.)62 b(An)-112 2720 y FF(annotation)25
+b FG(is)k(a)f Fk(h)p FF(pr)l(operty)-5 b(,)21 b(value)n
+Fk(i)29 b FG(pair)f(that)g(is)h(assigned)e(to)h(a)-112
+2819 y(node.)40 b(A)25 b FF(descriptor)h FG(is)g(a)f(list)g(of)f
+(annotations)f(that)h(describes)g(a)-112 2919 y(node)j(of)h(an)h
+(operator)e(tree;)33 b(e)n(v)o(ery)27 b(node)g(has)i(its)h(o)n(wn)e
+(descrip-)-112 3019 y(tor)-5 b(.)56 b(As)30 b(an)f(e)o(xample,)h(T)-7
+b(able)29 b(2)h(lists)g(some)f(typical)g(properties)-112
+3118 y(that)20 b(might)g(be)h(used)g(in)f(a)i(descriptor)-5
+b(.)29 b(Note)21 b(that)g(descriptors)e(for)-112 3218
+y(stream)24 b(and)h(stored)f(\256les)i(may)f(ha)n(v)o(e)f(dif)n(ferent)
+g(properties.)42 b(The)-112 3317 y(follo)n(wing)17 b(notations)g(will)j
+(be)e(useful)g(in)h(our)f(subsequent)f(discus-)-112 3417
+y(sions.)27 b(If)14 b Fv(S)228 3429 y Fu(i)268 3417 y
+FG(is)g(a)g(stream,)g(then)g Fj(D)876 3429 y Fi(i)913
+3417 y FG(is)g(its)g(descriptor)-5 b(.)26 b(Annotations)-112
+3517 y(of)20 b Fv(S)29 3529 y Fu(i)78 3517 y FG(are)h(accessed)g(by)f
+(a)i(structure)e(member)f(relationship,)h(e.g.,)-112
+3616 y Fj(D)-39 3628 y Fi(i)-14 3616 y Fv(:)p FG(num)p
+163 3616 25 4 v 29 w(records)n(.)29 b(Also,)20 b(let)h
+Fv(E)k FG(be)20 b(an)g(e)o(xpression)e(and)h(let)h Fj(D)h
+FG(be)-112 3716 y(its)g(descriptor)-5 b(.)28 b(W)-7 b(e)21
+b(will)g(write)g(this)f(as)h Fv(E)28 b Fh(:)23 b Fj(D)p
+FG(.)-112 3904 y(E)p Fz(XAMPLE)c FG(2.)145 b(The)19 b(e)o(xpression,)
+-112 4055 y Fo(SOR)m(T)o Ft(\()p Fo(JOIN)o Ft(\()p Fo(RET)o
+Ft(\()p Fu(R)396 4063 y Fn(1)428 4055 y Ft(\):)p Fi(D)530
+4063 y Fg(3)566 4055 y Fu(;)p Fo(RET)o Ft(\()p Fu(R)772
+4063 y Fn(2)804 4055 y Ft(\):)p Fi(D)906 4063 y Fg(4)942
+4055 y Ft(\):)p Fi(D)1044 4063 y Fg(5)1079 4055 y Ft(\):)p
+Fi(D)1181 4063 y Fg(6)-112 4206 y FG(corresponds)k(to)j(the)g(operator)
+e(tree)i(in)g(Figure)f(1\(a\),)h(and)g(sho)n(ws)-112
+4305 y(the)20 b(descriptors)f(of)h(the)g(v)n(arious)f(nodes.)706
+b Fs(\003)-29 4466 y FG(A)19 b(notational)e(simpli\256cation)h(can)g
+(be)h(made)f(here.)28 b(Additional)-112 4565 y(parameters)13
+b(of)i(operators)f(can)h(be)g(treated)g(the)g(same)g(w)o(ay)h(as)g
+(other)-112 4665 y(properties)j(of)i(a)h(node;)f(essential)h
+(parameters,)e(ho)n(we)n(v)o(er)m(,)f(are)j FF(e)n(x-)-112
+4764 y(pr)m(essions)p FG(.)28 b(Thus,)17 b(the)h(term)f(descriptor)f
+(in)h(the)h(remainder)d(of)i(this)-112 4864 y(paper)24
+b(will)i(refer)f(to)h(a)g(set)h(of)e(properties,)g(including)f
+(additional)-112 4964 y(parameters,)18 b(as)j(sho)n(wn)f(in)g(T)-7
+b(able)20 b(2.)-29 5063 y(Currently)-5 b(,)34 b(descriptor)e
+(properties)g(are)h(de\256ned)f(entirely)g(by)-112 5163
+y(the)i(user;)42 b(ho)n(we)n(v)o(er)m(,)36 b(we)f(en)m(vision)e(pro)o
+(viding)f(a)j(hierarchy)d(of)-112 5263 y(pre-de\256ned)17
+b(descriptor)i(types)h(to)g(aid)h(this)f(process.)2044
+1243 y Fw(Access)f(Plans.)82 b FG(An)18 b FF(access)h(plan)e
+FG(is)i(an)f(operator)e(tree)i(in)h(which)2044 1342 y(all)i(interior)e
+(nodes)g(are)h(algorithms.)2044 1593 y(E)p Fz(XAMPLE)f
+FG(3.)144 b(An)19 b(access)h(plan)f(for)g(the)g(operator)e(tree)j(in)f
+(Fig-)2044 1692 y(ure)h(1\(a\))f(is)i(sho)n(wn)f(in)g(Figure)f(1\(b\).)
+828 b Fs(\003)2044 1977 y Fx(2.2)99 b(Prairie)25 b(optimization)f
+(paradigm)2044 2149 y FG(Prairie)k(admits)g(tw)o(o)g(rather)g(dif)n
+(ferent)e(means)i(of)g(optimization:)2044 2248 y(top-do)n(wn)20
+b(and)h(bottom-up.)33 b(A)22 b(top-do)n(wn)e(query)h(optimizer)g(op-)
+2044 2348 y(timizes)27 b(the)f(parents)g(of)h(a)g(node)e(prior)h(to)h
+(optimizing)d(the)j(node)2044 2447 y(itself.)54 b(A)28
+b(bottom-up)e(optimizer)h(optimizes)h(the)g(children)f(of)h(a)2044
+2547 y(node)i(prior)h(to)g(optimizing)f(the)h(node.)62
+b(The)31 b(earliest)h(optimiz-)2044 2647 y(ers)g(\(System)g(R)h([11])e
+(and)h(R)2945 2617 y Ff(\003)3016 2647 y FG([3]\))f(emplo)o(yed)f(the)j
+(bottom-up)2044 2746 y(approach.)2127 2854 y(Our)19 b(research)f
+(concentrates)g(on)h(a)h(top-do)n(wn)e(optimization)f(of)2044
+2954 y(operator)24 b(trees.)49 b(W)-7 b(e)27 b(ha)n(v)o(e)f(chosen)g
+(this)h(approach)d(because)i(we)2044 3054 y(intend)d(to)h(translate)g
+(Prairie)g(rules)g(into)f(the)h(format)f(required)f(by)2044
+3153 y(the)28 b(V)-11 b(olcano)28 b(query)f(optimizer)g(generator)f
+([7])i(which)g(is)h(based)2044 3253 y(on)h(a)h(top-do)n(wn)e(strate)o
+(gy)-5 b(.)60 b(Gi)n(v)o(en)30 b(an)h(appropriate)d(search)i(en-)2044
+3353 y(gine,)24 b(Prairie)f(can)g(potentially)g(also)h(be)f(used)h
+(with)f(a)i(bottom-up)2044 3452 y(optimization)19 b(strate)o(gy;)g(ho)n
+(we)n(v)o(er)m(,)f(we)j(will)g(not)g(discuss)f(this)h(ap-)2044
+3552 y(proach)d(in)j(this)f(paper)-5 b(.)2127 3660 y(In)18
+b(query)e(optimization,)h(there)h(are)g(certain)f(annotations)g(\(such)
+2044 3760 y(as)30 b(additional)e(parameters\))f(that)j(are)f(kno)n(wn)e
+(before)h(an)o(y)h(opti-)2044 3859 y(mization)c(is)j(be)o(gun.)46
+b(These)26 b(annotations)f(can)i(be)f(computed)f(at)2044
+3959 y(the)32 b(time)g(that)g(the)g(operator)f(tree)h(is)h
+(initialized,)h(and)e(will)g(not)2044 4059 y(change)16
+b(with)i(application)e(of)h(rules.)28 b(Our)17 b(follo)n(wing)f
+(discussions)2044 4158 y(assume)k(operator)e(trees)j(are)f
+(initialized.)2127 4266 y(There)41 b(are)i(tw)o(o)f(types)g(of)g
+(algebraic)g(transformations)e(\(or)2044 4366 y FF(r)m(e)o(write)33
+b(rules)p FG(\))g(in)f(Prairie:)54 b(T)-8 b(-rules)32
+b(\(\252transformation)e(rules\272\))2044 4466 y(and)21
+b(I-rules)h(\(\252implementation)d(rules\272\).)35 b(Each)22
+b(rule)f(transforms)2044 4565 y(an)26 b(e)o(xpression)e(into)i(another)
+e(based)h(on)h(additional)e(conditions;)2044 4665 y(the)h
+(transformation)d(also)j(results)g(in)g(a)g(mapping)e(of)h(descriptors)
+2044 4764 y(between)13 b(e)o(xpressions.)24 b(W)-7 b(e)13
+b(de\256ne)g(T)-8 b(-rules)13 b(and)g(I-rules)g(precisely)2044
+4864 y(in)19 b(the)g(follo)n(wing)f(sections)h(and)f(illustrate)h(them)
+g(with)g(e)o(xamples.)2044 4964 y(Our)f(e)o(xamples)f(are)i(chosen)e
+(from)h(rules)g(that)h(w)o(ould)e(be)i(used)f(in)h(a)2044
+5063 y(centralized)24 b(relational)g(query)g(optimizer;)j(the)e
+(operators,)g(algo-)2044 5163 y(rithms,)h(and)e(properties)g(are)h
+(subsets)g(of)g(those)g(in)g(T)-7 b(ables)25 b(1)h(and)2044
+5263 y(2.)p eop
+%%Page: 4 4
+4 3 bop -110 24 1947 4 v -110 1928 4 1905 v 31 101 a
+Fu(E)s Ft(\()p Fu(x)147 109 y Fn(1)178 101 y Fu(;)11
+b(:)h(:)f(:)g(;)g(x)372 109 y Fl(n)412 101 y Ft(\))19
+b(:)g Fi(D)552 109 y Fg(1)606 101 y Ft(=)-11 b Ff(\))19
+b Fu(E)783 72 y Fe(0)805 101 y Ft(\()p Fu(x)869 109 y
+Fn(1)901 101 y Fu(;)12 b(:)f(:)g(:)g(;)g(x)1095 109 y
+Fl(n)1135 101 y Ft(\))19 b(:)g Fi(D)1275 109 y Fg(2)1656
+101 y Fo(\(1\))31 167 y Ff(ff)244 234 y Fo(pre-test)c(statements)31
+300 y Ff(gg)31 367 y Fo(test)31 433 y Ff(ff)244 500 y
+Fo(post-test)g(statements)31 566 y Ff(gg)493 708 y Fz(\(a\))j(General)g
+(form)f(of)g(a)g(T)-6 b(-rule)p -61 806 1849 4 v 31 883
+a Fo(JOIN)o Ft(\()p Fo(JOIN)p Ft(\()p Fu(S)375 891 y
+Fn(1)407 883 y Fu(;)11 b(S)479 891 y Fn(2)512 883 y Ft(\))18
+b(:)h Fi(D)651 891 y Fg(4)687 883 y Fu(;)11 b(S)759 891
+y Fn(3)791 883 y Ft(\))19 b(:)g Fi(D)931 891 y Fg(5)1656
+883 y Fo(\(2\))89 983 y Ft(=)-11 b Ff(\))18 b Fo(JOIN)p
+Ft(\()p Fu(S)406 991 y Fn(1)438 983 y Fu(;)11 b Fo(JOIN)p
+Ft(\()p Fu(S)662 991 y Fn(2)694 983 y Fu(;)g(S)766 991
+y Fn(3)799 983 y Ft(\))18 b(:)h Fi(D)938 991 y Fg(6)974
+983 y Ft(\))g(:)g Fi(D)1114 991 y Fg(7)31 1066 y Ff(ff)244
+1132 y Fi(D)301 1140 y Fg(6)337 1132 y Fu(:)p Fo(attrib)o(utes)g
+Ft(=)g Fo(union)c Ft(\()p Fi(D)891 1140 y Fg(2)927 1132
+y Fu(:)p Fo(attrib)o(utes)o Fu(;)c Fi(D)1249 1140 y Fg(3)1285
+1132 y Fu(:)p Fo(attrib)o(utes)p Ft(\))k(;)31 1199 y
+Ff(gg)31 1265 y Fo(is)p 73 1265 18 4 v 20 w(associati)o(v)o(e)e
+Ft(\()p Fi(D)440 1273 y Fg(6)476 1265 y Fu(:)p Fo(join)p
+589 1265 V 21 w(predicate)p Fu(;)e Fi(D)908 1273 y Fg(6)944
+1265 y Fu(:)p Fo(attrib)o(utes)p Fu(;)g Fi(D)1267 1273
+y Fg(5)1303 1265 y Fu(:)p Fo(join)p 1416 1265 V 21 w(predicate)p
+Ft(\))31 1332 y Ff(ff)244 1398 y Fi(D)301 1406 y Fg(7)356
+1398 y Ft(=)19 b Fi(D)483 1406 y Fg(5)533 1398 y Ft(;)244
+1464 y Fi(D)301 1472 y Fg(7)337 1464 y Fu(:)p Fo(join)p
+450 1464 V 21 w(predicate)g Ft(=)g Fi(D)827 1472 y Fg(4)863
+1464 y Fu(:)p Fo(join)p 976 1464 V 21 w(predicate)14
+b Ft(;)244 1531 y Fi(D)301 1539 y Fg(6)337 1531 y Fu(:)p
+Fo(tuple)p 476 1531 V 21 w(size)k Ft(=)h Fi(D)730 1539
+y Fg(2)766 1531 y Fu(:)p Fo(tuple)p 905 1531 V 21 w(size)14
+b Ft(+)h Fi(D)1151 1539 y Fg(3)1187 1531 y Fu(:)p Fo(tuple)p
+1326 1531 V 21 w(size)f Ft(;)244 1597 y Fi(D)301 1605
+y Fg(6)337 1597 y Fu(:)p Fo(num)p 463 1597 V 21 w(records)19
+b Ft(=)g Fo(cardinality)c Ft(\()p Fi(D)1087 1605 y Fg(2)1123
+1597 y Fu(;)c Fi(D)1211 1605 y Fg(3)1247 1597 y Ft(\))j(;)31
+1664 y Ff(gg)588 1806 y Fz(\(b\))j(Join)g(associati)n(vity)p
+1834 1928 4 1905 v -110 1931 1947 4 v 1835 1948 19 1912
+v -93 1948 1947 19 v 606 2131 a FG(Figure)i(2:)30 b(T)-8
+b(-rule)-112 2371 y Fx(2.3)99 b(T)-7 b(ransf)n(ormation)24
+b(rules)-112 2549 y FG(T)m(ransformation)30 b(rules,)35
+b(or)e(T)-8 b(-rules)32 b(for)h(short,)i(de\256ne)d(equi)n(v)n(a-)-112
+2649 y(lences)f(among)f(pairs)h(of)g(e)o(xpressions;)k(the)o(y)c
+(de\256ne)f(mappings)-112 2748 y(from)g(one)h(operator)f(tree)i(to)g
+(another)-5 b(.)63 b(Let)32 b Fv(E)37 b FG(and)31 b Fv(E)1585
+2718 y Ff(0)1641 2748 y FG(be)g(e)o(x-)-112 2848 y(pressions)20
+b(that)h(in)m(v)n(olv)o(e)e(only)h(abstract)h(operators.)29
+b(Equation)19 b(\(1\))-112 2948 y(\(sho)n(wn)j(in)i(Figure)g(2\(a\)\))e
+(sho)n(ws)i(the)g(general)f(form)g(of)g(a)i(T)-8 b(-rule.)-112
+3047 y(The)20 b(actions)g(of)h(a)g(T)-8 b(-rule)20 b(de\256ne)g(the)h
+(equi)n(v)n(alences)e(between)h(the)-112 3147 y(descriptors)d(of)i
+(nodes)g(of)f(the)i(original)d(operator)h(tree)h Fv(E)25
+b FG(with)19 b(the)-112 3246 y(nodes)g(of)g(the)h(output)e(tree)i
+Fv(E)756 3216 y Ff(0)780 3246 y FG(;)g(these)g(actions)g(consist)g(of)f
+(a)h(series)-112 3346 y(of)h(\(C)i(or)f(C++\))g(assignment)751
+3316 y Ft(2)809 3346 y FG(statements.)35 b(The)22 b(left-hand)e(sides)
+-112 3446 y(of)30 b(these)i(statements)f(refer)g(to)g(descriptors)f(of)
+h(e)o(xpressions)f(on)-112 3545 y(the)20 b(right-hand)e(side)j(of)f
+(the)g(T)-8 b(-rule;)20 b(the)h(right-hand)d(sides)j(of)f(the)-112
+3645 y(statements)14 b(can)h(refer)e(to)i(an)o(y)f(descriptor)f(in)i
+(the)f(T)-8 b(-rule.)27 b(Function)-112 3745 y(\(called)d
+FF(helper)i FG(functions\))d(calls)j(can)e(also)i(appear)d(on)i(the)f
+(right)-112 3844 y(side)d(of)g(the)g(assignment)f(statements.)32
+b(Thus,)20 b(descriptors)g(on)h(the)-112 3944 y FF(left-hand)29
+b(side)i FG(of)g(a)g(T)-8 b(-rule)31 b(are)g FF(ne)o(ver)h
+FG(changed)e(in)h(the)g(rule')-5 b(s)-112 4043 y(actions.)28
+b(A)18 b FF(test)i FG(is)f(needed)d(to)i(determine)e(if)i(the)g
+(transformations)-112 4143 y(of)h(the)i(T)-8 b(-rule)19
+b(are)h(in)h(f)o(act)f(applicable.)-29 4254 y(Purely)15
+b(as)h(an)g(optimization,)f(it)h(is)h(usually)f(the)f(case)i(that)f
+(not)f(all)-112 4354 y(statements)g(in)g(a)g(T)-8 b(-rule')j(s)15
+b(actions)g(need)f(to)h(be)g(e)o(x)o(ecuted)e(prior)h(to)h(a)-112
+4454 y(T)-8 b(-rule')j(s)18 b(test.)29 b(F)o(or)18 b(this)h(reason,)f
+(the)g(actions)g(of)g(a)h(T)-8 b(-rule)18 b(are)g(split)-112
+4553 y(into)j(tw)o(o)h(groups;)f(those)h(that)g(need)f(to)h(be)g(e)o(x)
+o(ecuted)e(prior)h(to)h(the)-112 4653 y(T)-8 b(-rule')j(s)13
+b(test,)i(and)e(those)g(that)h(can)f(be)g(e)o(x)o(ecuted)f(after)h(a)h
+(successful)-112 4752 y(test.)29 b(These)19 b(groups)f(of)h(statements)
+g(comprise,)g(respecti)n(v)o(ely)-5 b(,)17 b(the)p -112
+4870 788 4 v -28 4924 a Fr(2)7 4947 y Fz(The)c(actions)i(can)f(be)f
+(non-assignment)j(statements)f(\(lik)o(e)g(function)g(calls\),)g(b)o
+(ut)-112 5026 y(in)23 b(this)h(case,)i(the)e(P2V)f(pre-processor)j
+(\(described)f(in)f(Section)h(3\))f(needs)g(some)-112
+5105 y(hints)h(about)i(the)f(properties)h(that)g(are)f(changed)h(by)e
+(the)h(statement)h(in)f(order)g(to)-112 5184 y(correctly)17
+b(cate)o(gorize)h(each)d(property)l(.)25 b(F)o(or)14
+b(simplicity)l(,)j(in)d(this)h(paper)m(,)h(we)f(assume)-112
+5263 y(all)j(actions)g(consist)g(of)f(assignment)i(statements.)p
+2046 24 1947 4 v 2046 1687 4 1664 v 2187 92 a Fu(E)s
+Ft(\()p Fu(x)2303 100 y Fn(1)2335 92 y Fu(;)11 b(:)g(:)g(:)g(;)g(x)2528
+100 y Fl(n)2568 92 y Ft(\))19 b(:)g Fi(D)2708 100 y Fg(1)2763
+92 y Ft(=)-11 b Ff(\))18 b Fu(A)p Ft(\()p Fu(x)3001 100
+y Fn(1)3033 92 y Fu(;)11 b(:)g(:)g(:)g(;)h(x)3227 100
+y Fl(n)3267 92 y Ft(\))19 b(:)f Fi(D)3406 100 y Fg(2)3812
+92 y Fo(\(3\))2187 159 y(test)2187 225 y Ff(ff)2401 292
+y Fo(pre-opt)d(statements)2187 358 y Ff(gg)2187 424 y(ff)2401
+491 y Fo(post-opt)g(statements)2187 557 y Ff(gg)2639
+700 y Fz(\(a\))i(General)i(form)e(of)g(an)g(I-rule)p
+2095 798 1849 4 v 2187 875 a Fo(SOR)m(T)o Ft(\()p Fu(S)2399
+883 y Fn(1)2431 875 y Ft(\))i(:)f Fi(D)2570 883 y Fg(2)2625
+875 y Ft(=)-11 b Ff(\))19 b Fo(Mer)o(ge)p 2904 875 18
+4 v 21 w(sort)p Ft(\()p Fu(S)3076 883 y Fn(1)3108 875
+y Ft(\))g(:)f Fi(D)3247 883 y Fg(3)3812 875 y Fo(\(4\))2187
+958 y Ft(\()p Fi(D)2270 966 y Fg(2)2306 958 y Fu(:)p
+Fo(tuple)p 2445 958 V 20 w(order)e Ft(!)9 b(=)18 b Fo(DONT)p
+2862 958 V 21 w(CARE)o Ft(\))2187 1024 y Ff(ff)2401 1090
+y Fi(D)2458 1098 y Fg(3)2512 1090 y Ft(=)h Fi(D)2639
+1098 y Fg(2)2690 1090 y Ft(;)2187 1157 y Ff(gg)2187 1223
+y(ff)2401 1290 y Fi(D)2458 1298 y Fg(3)2493 1290 y Fu(:)p
+Fo(cost)g Ft(=)g Fi(D)2753 1298 y Fg(1)2788 1290 y Fu(:)p
+Fo(cost)2699 1356 y Ft(+\()p Fi(D)2833 1364 y Fg(3)2868
+1356 y Fu(:)p Fo(num)p 2994 1356 V 21 w(records)p Ft(\))c
+Ff(\003)h Ft(log\()p Fi(D)3442 1364 y Fg(3)3478 1356
+y Fu(:)p Fo(num)p 3604 1356 V 21 w(records)p Ft(\))f(;)2187
+1423 y Ff(gg)2630 1565 y Fz(\(b\))i(Mer)o(ge-sort)i(sort)e(algorithm)p
+3990 1687 4 1664 v 2046 1690 1947 4 v 3992 1707 19 1670
+v 2063 1707 1947 19 v 2770 1890 a FG(Figure)i(3:)30 b(I-rule)2044
+2113 y FF(pr)m(e-test)22 b FG(and)d FF(post-test)j FG(statements)e(of)g
+(the)g(T)-8 b(-rule.)3566 2083 y Ft(3)2044 2330 y FG(E)p
+Fz(XAMPLE)19 b FG(4.)145 b(The)21 b(associati)n(vity)f(of)h(JOINs)g(is)
+h(e)o(xpressed)d(by)2044 2429 y(T)-8 b(-rule)19 b(\(2\))h(in)g(Figure)g
+(2\(b\).)1082 b Fs(\003)2044 2683 y Fx(2.4)99 b(Implementation)26
+b(rules)2044 2844 y FG(Implementation)k(rules,)37 b(or)c(I-rules)f(for)
+h(short,)j(de\256ne)d(equi)n(v)n(a-)2044 2944 y(lences)f(between)f(e)o
+(xpressions)f(and)i(their)f(implementing)f(algo-)2044
+3043 y(rithms.)k(Let)23 b Fv(E)k FG(be)22 b(an)g(e)o(xpression)f(and)g
+Fv(A)i FG(be)f(an)g(algorithm)f(that)2044 3143 y(implements)27
+b Fv(E)5 b FG(.)52 b(The)28 b(general)e(form)h(of)h(an)f(I-rule)g(is)i
+(gi)n(v)o(en)d(by)2044 3243 y(Equation)18 b(\(3\))i(\(sho)n(wn)f(in)h
+(Figure)g(3\(a\)\).)2127 3345 y(The)g(actions)h(associated)g(with)g(an)
+g(I-rule)f(are)h(de\256ned)e(in)j(three)2044 3445 y(parts.)37
+b(The)23 b(\256rst)h(part,)f(or)g FF(test)p FG(,)h(is)g(a)g(boolean)d
+(e)o(xpression)g(whose)2044 3544 y(v)n(alue)e(determines)g(whether)g
+(or)h(not)g(the)g(rule)g(can)g(be)g(applied.)2127 3647
+y(The)c(second)g(part,)h(or)f FF(pr)m(e-opt)f(statements)p
+FG(,)j(is)f(a)g(set)h(of)e(descrip-)2044 3747 y(tor)23
+b(assignment)g(statements)h(that)g(are)g(e)o(x)o(ecuted)d(only)i(if)h
+(the)g(test)2044 3846 y(is)h(true)f(and)g FF(befor)m(e)g
+FG(an)o(y)f(of)h(the)h(inputs)e Fv(x)3295 3858 y Fu(i)3348
+3846 y FG(of)h Fv(E)30 b FG(are)25 b(optimized.)2044
+3946 y(Additional)d(parameters)g(of)i(nodes)f(are)g(usually)g(assigned)
+g(in)h(the)2044 4045 y(pre-opt)f(section.)45 b(This)25
+b(is)h(necessary)f(before)f(an)o(y)g(of)h(the)h(nodes)2044
+4145 y(on)20 b(the)g(right)f(side)i(can)f(be)g(optimized.)2127
+4248 y(The)g(third)h(part,)g(or)f FF(post-opt)g(statements)p
+FG(,)h(is)h(a)g(set)f(of)g(descrip-)2044 4347 y(tor)i(assignment)g
+(statements)g(that)h(are)f(e)o(x)o(ecuted)e FF(after)26
+b FG(all)e Fv(x)3859 4359 y Fu(i)3911 4347 y FG(are)2044
+4447 y(optimized.)29 b(Normally)-5 b(,)19 b(the)i(post-opt)f
+(statements)g(compute)g(cost)2044 4546 y(properties)15
+b(that)h(can)h(only)e(be)i(determined)d(once)i(the)g(inputs)g(to)h(the)
+2044 4646 y(algorithm)k(are)h(completely)f(optimized)g(and)h(their)g
+(costs)h(kno)n(wn.)2044 4746 y(This)34 b FF(does)f(not)p
+FG(,)k(ho)n(we)n(v)o(er)m(,)e(imply)e(a)h(bottom-up)e(optimization)2044
+4845 y(strate)o(gy)-5 b(.)43 b(It)25 b(simply)g(means)g(that)g
+(although)f(I-rules)g(are)h(applied)2044 4945 y(to)20
+b(parents)g(before)f(their)i(children)e(are)h(optimized,)f(the)i
+FF(cost)h FG(\(and)p 2044 5028 788 4 v 2129 5081 a Fr(3)2163
+5105 y Fz(W)-5 b(e)28 b(suspect)h(it)g(is)f(possible)i(to)f(use)f
+(data-\257o)n(w)i(analysis)g(to)e(partition)j(the)2044
+5184 y(assignment)17 b(statements)h(automatically)l(,)h(b)o(ut)d(for)g
+(no)n(w)l(,)g(we)f(let)i(the)g(rule-writer)h(do)2044
+5263 y(the)g(partitioning.)p eop
+%%Page: 5 5
+5 4 bop -112 21 a FG(other)17 b(properties)f(in)i(the)g(post-opt)e
+(section\))i(of)f(the)h(parent)f(cannot)-112 120 y(be)j(computed)e
+(until)i(the)g(children)f(ha)n(v)o(e)g(been)h(optimized.)-112
+325 y(E)p Fz(XAMPLE)f FG(5.)149 b(Equation)24 b(\(4\))g(\(in)g(Figure)h
+(3\(b\)\))e(sho)n(ws)i(the)g(I-)-112 425 y(rule)19 b(that)i(implements)
+e(the)h(SOR)-5 b(T)21 b(operator)d(by)i(Mer)o(ge)p 1564
+425 25 4 v 28 w(sort.)59 b Fs(\003)-112 668 y Fx(2.5)99
+b(Null)24 b(algorithm)-112 826 y FG(Recall)h(that,)g(in)g(Section)f(1,)
+h(we)g(mentioned)e(that)h(Prairie)h(allo)n(ws)-112 925
+y(users)f(to)g(treat)g(all)g(operators)f(and)g(algorithms)g(as)i
+(\256rst-class)g(ob-)-112 1025 y(jects,)g(i.e.,)g(all)f(operators)f
+(and)h(algorithms)e(are)i(e)o(xplicit,)h(in)f(con-)-112
+1125 y(trast)36 b(to)h(enforcers)e(in)h(V)-11 b(olcano)36
+b(or)g(glue)g(in)g(Starb)n(urst.)78 b(This)-112 1224
+y(requires)23 b(that)h(Prairie)h(pro)o(vide)d(a)j(mechanism)e(where)g
+(users)i(can)-112 1324 y(also)20 b(\252delete\272)g(one)g(or)g(more)g
+(of)g(the)g(e)o(xplicit)g(operators)f(from)g(e)o(x-)-112
+1423 y(pressions.)37 b(This)24 b(is)g(done)e(by)h(ha)n(ving)f(a)h
+(special)h(class)g(of)f(I-rules)-112 1523 y(that)16 b(ha)n(v)o(e)g(the)
+h(form)f(gi)n(v)o(en)f(by)i(Equation)e(\(5\))h(in)h(Figure)f(4\(a\).)27
+b(The)-112 1623 y(left)21 b(side)h(of)g(the)f(rule)g(is)i(a)f(single)g
+(abstract)f(operator)f Fv(O)25 b FG(with)c(one)-112 1722
+y(stream)j(input)f Fv(S)380 1734 y Ft(1)418 1722 y FG(.)42
+b(The)24 b(right)g(side)g(of)g(the)h(rule)f(is)h(an)f(algorithm)-112
+1822 y(called)f(\252Null\272)g(with)h(the)f(same)h(stream)f(input)g(b)n
+(ut)g(with)h(a)g(dif)n(fer)n(-)-112 1922 y(ent)d(descriptor)-5
+b(.)34 b(As)23 b(the)f(name)f(suggests,)h(the)g(Null)g(algorithm)f(is)
+-112 2021 y(supposed)26 b(to)i(pass)h(its)f(input)g(unchanged)d(to)j
+(algorithms)e(abo)o(v)o(e)-112 2121 y(it)e(in)f(an)g(operator)f(tree.)
+39 b(This)23 b(is)h(accomplished)e(in)h(the)h(I-rule)e(as)-112
+2220 y(follo)n(ws.)-29 2321 y(The)g(test)h(for)f(this)h(I-rule)f(is)h
+(al)o(w)o(ays)g(TR)m(UE,)f(i.e.,)h(an)o(y)f(node)g(in)-112
+2421 y(an)f(operator)f(tree)i(with)g Fv(O)k FG(as)c(its)h(operator)d
+(can)i(be)g(implemented)-112 2520 y(by)d(the)g(Null)h(algorithm.)27
+b(The)20 b(actions)f(associated)g(with)h(this)g(rule)-112
+2620 y(ha)n(v)o(e)c(a)i(speci\256c)f(pattern.)27 b(The)17
+b(pre-opt)f(section)h(consists)g(of)g(three)-112 2720
+y(statements.)38 b(The)22 b(\256rst)i(statement)f(copies)g(the)g
+(descriptor)f(of)h(the)-112 2819 y(operator)29 b Fv(O)35
+b FG(to)d(the)g(algorithm)e(Null.)65 b(The)31 b(second)g(statement)-112
+2919 y(sets)36 b(the)f(descriptor)e(of)i(the)g(stream)g
+Fv(S)1102 2931 y Ft(1)1174 2919 y FG(on)g(the)g(right)f(side)i(to)-112
+3018 y(the)31 b(descriptor)g(of)g(the)h(stream)g Fv(S)926
+3030 y Ft(1)996 3018 y FG(on)f(the)h(left)g(side.)64
+b(Why)32 b(is)-112 3118 y(it)23 b(necessary)f(to)h(do)f(this?)38
+b(The)22 b(k)o(e)o(y)h(lies)g(in)g(the)g(third)f(statement.)-112
+3218 y(This)13 b(statement)g(copies)g(the)g(property)g(\252prop)o(erty)
+o(\272)g(of)g(the)f(oper)o(ator)-112 3317 y Fv(O)21 b
+FG(node)d(on)g(the)g(left)h(side)g(to)g(the)f(\252property\272)e(of)j
+(the)f(input)g(stream)-112 3417 y Fv(S)-61 3429 y Ft(1)-5
+3417 y FG(on)g(the)g(right)g(side.)29 b(Since)18 b(left-hand)f(side)i
+(descriptors)e(cannot)-112 3517 y(be)25 b(changed)g(in)h(an)g(I-rule,)g
+(a)h(ne)n(w)e(descriptor)g Fj(D)1383 3529 y Fi(3)1452
+3517 y FG(is)i(necessary)-112 3616 y(for)19 b Fv(S)56
+3628 y Ft(1)114 3616 y FG(to)h(con)m(v)o(e)o(y)e(the)i(property)e
+(propagation)f(information.)-29 3717 y(The)48 b(post-opt)f(section)h
+(in)h(the)g(I-rule)e(has)i(only)f(a)h(cost-)-112 3816
+y(assignment)23 b(statement;)k(this)e(simply)g(sets)h(the)e(cost)h(of)g
+(the)g(Null)-112 3916 y(node)19 b(to)h(the)g(cost)h(of)f(its)h
+(optimized)e(input)g(stream.)-29 4017 y(The)f(Null)h(algorithm,)e
+(therefore,)g(serv)o(es)h(to)h(ef)n(fecti)n(v)o(ely)e(trans-)-112
+4116 y(form)i(a)h(single)g(operator)f(to)h(a)h(no-op.)-112
+4322 y(E)p Fz(XAMPLE)e FG(6.)149 b(Equation)24 b(\(6\))g(\(in)g(Figure)
+h(4\(b\)\))e(sho)n(ws)i(the)g(I-)-112 4421 y(rule)15
+b(that)g(re)n(writes)h(the)f(SOR)-5 b(T)17 b(operator)c(to)j(use)g(a)g
+(Null)g(algorithm.)-112 4521 y Fs(\003)-112 4876 y FB(3)119
+b(The)30 b(P2V)g(pr)n(e-pr)n(ocessor)-112 5063 y FG(In)38
+b(Section)g(1,)43 b(we)c(enumerated)e(the)h(four)g(primary)f(goals)h
+(of)-112 5163 y(Prairie,)22 b(viz.,)g(uniformity)e(in)i(operator)e(and)
+i(algorithms;)f(unifor)n(-)-112 5263 y(mity)i(in)h(properties;)h
+(uniformity)c(in)j(property-transformations;)p 2046 24
+1947 4 v 2046 1886 4 1863 v 2187 92 a Fu(O)r Ft(\()p
+Fu(S)2306 100 y Fn(1)2338 92 y Ft(\))19 b(:)g Fi(D)2478
+100 y Fg(2)2532 92 y Ft(=)-11 b Ff(\))19 b Fo(Null)q
+Ft(\()p Fu(S)2828 100 y Fn(1)2879 92 y Ft(:)f Fi(D)2973
+100 y Fg(3)3009 92 y Ft(\))h(:)g Fi(D)3149 100 y Fg(4)3812
+92 y Fo(\(5\))2187 159 y(TR)n(UE)2187 225 y Ff(ff)2401
+292 y Fi(D)2458 300 y Fg(4)2512 292 y Ft(=)g Fi(D)2639
+300 y Fg(2)2690 292 y Ft(;)2401 358 y Fi(D)2458 366 y
+Fg(3)2512 358 y Ft(=)g Fi(D)2639 366 y Fg(1)2690 358
+y Ft(;)2401 424 y Fi(D)2458 432 y Fg(3)2493 424 y Fu(:)p
+Fo(property)h Ft(=)f Fi(D)2856 432 y Fg(2)2892 424 y
+Fu(:)p Fo(property)c Ft(;)2187 491 y Ff(gg)2187 557 y(ff)2401
+624 y Fi(D)2458 632 y Fg(4)2493 624 y Fu(:)p Fo(cost)k
+Ft(=)g Fi(D)2753 632 y Fg(3)2788 624 y Fu(:)p Fo(cost)14
+b Ft(;)2187 690 y Ff(gg)2559 832 y Fz(\(a\))j(General)i(form)e(of)g(a)g
+(\252Null\272)h(I-rule)p 2095 931 1849 4 v 2187 1007
+a Fo(SOR)m(T)o Ft(\()p Fu(S)2399 1015 y Fn(1)2431 1007
+y Ft(\))h(:)f Fi(D)2570 1015 y Fg(2)2683 1007 y Ft(=)-11
+b Ff(\))19 b Fo(Null)p Ft(\()p Fu(S)2978 1015 y Fn(1)3029
+1007 y Ft(:)g Fi(D)3124 1015 y Fg(3)3160 1007 y Ft(\))g(:)g
+Fi(D)3300 1015 y Fg(4)3812 1007 y Fo(\(6\))2187 1090
+y(TR)n(UE)2187 1157 y Ff(ff)2401 1223 y Fi(D)2458 1231
+y Fg(4)2512 1223 y Ft(=)g Fi(D)2639 1231 y Fg(2)2690
+1223 y Ft(;)2401 1290 y Fi(D)2458 1298 y Fg(3)2512 1290
+y Ft(=)g Fi(D)2639 1298 y Fg(1)2690 1290 y Ft(;)2401
+1356 y Fi(D)2458 1364 y Fg(3)2493 1356 y Fu(:)p Fo(tuple)p
+2632 1356 18 4 v 21 w(order)h Ft(=)f Fi(D)2919 1364 y
+Fg(2)2955 1356 y Fu(:)p Fo(tuple)p 3094 1356 V 20 w(order)d
+Ft(;)2187 1423 y Ff(gg)2187 1489 y(ff)2401 1555 y Fi(D)2458
+1563 y Fg(4)2493 1555 y Fu(:)p Fo(cost)j Ft(=)g Fi(D)2753
+1563 y Fg(3)2788 1555 y Fu(:)p Fo(cost)14 b Ft(;)2187
+1622 y Ff(gg)2718 1764 y Fz(\(b\))j(Null)h(sort)f(algorithm)p
+3990 1886 4 1863 v 2046 1889 1947 4 v 3992 1906 19 1870
+v 2063 1906 1947 19 v 2365 2089 a FG(Figure)j(4:)29 b(The)20
+b(\252Null\272)g(algorithm)f(concept)2044 2301 y(and)36
+b(ef)n(\256cient)h(generation)f(of)h(Prairie)g(optimizers.)79
+b(The)37 b(\256rst)2044 2401 y(three)17 b(goals)h(are)f(dri)n(v)o(en)f
+(by)i(the)f(need)g(for)g(conceptual)f(simplicity;)2044
+2500 y(ho)n(we)n(v)o(er)m(,)34 b(the)o(y)e(alone)h(do)g(not)g
+(necessarily)f(generate)h(ef)n(\256cient)2044 2600 y(optimizers.)62
+b(The)32 b(P2V)g(pre-processor)d(ensures)i(that)h(ef)n(\256cient)2044
+2699 y(optimizers)e(can)h(be)f(realized)h(from)f(Prairie)h
+(speci\256cations,)h(by)2044 2799 y(translating)d(them)g(to)h(the)g(V)
+-11 b(olcano)29 b(frame)n(w)o(ork)f(and)i(then)f(gen-)2044
+2899 y(erating)22 b(an)h(optimizer)f(by)h(compiling)f(with)h(the)g(V)
+-11 b(olcano)22 b(search)2044 2998 y(engine.)27 b(This)17
+b(Prairie)g(optimizer)n(-generator)c(paradigm)i(is)j(sho)n(wn)2044
+3098 y(schematically)k(in)g(Figure)g(5.)37 b(The)22 b(pre-processor)f
+(itself)i(is)g(4500)2044 3198 y(lines)f(of)j Fd(flex)d
+FG(and)f Fd(bison)g FG(code.)33 b(In)21 b(this)h(section,)g(we)g
+(brie\257y)2044 3297 y(describe)13 b(the)h(pre-processor)d(steps)k(and)
+f(e)o(xplain)e(why)h(the)i(Prairie-)2044 3397 y(to-V)-11
+b(olcano)26 b(transformation)g(is)k(non-tri)n(vial.)51
+b(A)29 b(more)f(detailed)2044 3496 y(description)18 b(of)i(the)h
+(pre-processor)c(is)k(gi)n(v)o(en)e(in)i([5].)2127 3596
+y(The)c(speci\256cation)h(of)f(an)h(optimizer)f(in)h(V)-11
+b(olcano)17 b(consists)i(of)f(a)2044 3696 y(set)i(of)f(transformation)e
+(rules)j(\(called)f(\252trans)p 3386 3696 25 4 v 29 w(rules\272\))g
+(and)g(imple-)2044 3795 y(mentation)14 b(rules)g(\(called)g(\252impl)p
+3004 3795 V 24 w(rules\272\),)g(a)g(set)g(of)g(properties,)e(and)2044
+3895 y(some)i(support)g(functions.)22 b(The)14 b(join)g(associati)n
+(vity)g(trans)p 3736 3895 V 26 w(rule)g(\(cf.)2044 3995
+y(Figure)19 b(2\(b\)\))g(in)h(V)-11 b(olcano)20 b(is)h(as)g(follo)n(ws)
+3259 3964 y Ft(4)3295 3995 y FG(:)2210 4155 y Ft(\()p
+Fo(JOIN)f(?op)p 2469 4155 18 4 v 21 w(ar)o(g5)h Ft(\(\()p
+Fo(JOIN)g(?op)p 2896 4155 V 21 w(ar)o(g4)g Ft(\(?1)g(?2\)\))g(?3\)\))
+2293 4280 y Ff(\000)-23 b Fu(>)p Ft(\()p Fo(JOIN)20 b(?op)p
+2633 4280 V 21 w(ar)o(g7)h Ft(\(?1)g(\()p Fo(JOIN)g(?op)p
+3145 4280 V 21 w(ar)o(g6)g Ft(\(?2)g(?3\)\)\)\))2044
+4440 y FG(The)32 b(important)f(point)h(to)g(note)h(is)g(the)g(use)f(of)
+h FF(oper)o(ator)e(ar)m(gu-)2044 4540 y(ments)21 b FG(\(denoted)e(by)h
+(\252op)p 2801 4540 25 4 v 29 w(ar)o(g\272)g(in)g(rules\);)h(these)g
+(ar)o(guments)e(con-)2044 4640 y(tain)i(properties)g(used)g(in)h(the)g
+(rule')-5 b(s)21 b(actions,)h(b)n(ut)f(unlik)o(e)g(Prairie,)2044
+4739 y(the)o(y)31 b(do)g(not)h(contain)e FF(all)j FG(the)e(properties)g
+(of)g(an)h(operator)e(tree)2044 4839 y(node.)e(There)18
+b(are)h(other)f(property)f(classes,)k(lik)o(e)e(algorithm)f(ar)o(gu-)
+2044 4939 y(ment,)26 b(logical)f(property)-5 b(,)23 b(system)j
+(property)-5 b(,)24 b(physical)g(property)-5 b(,)2044
+5038 y(and)25 b(cost.)46 b(Thus,)26 b(while)g(Prairie)g(uses)g(a)g
+(uniform)e(descriptor)g(to)p 2044 5107 788 4 v 2129 5160
+a Fr(4)2163 5184 y Fz(There)15 b(are)f(conditions)j(and)d(actions)i
+(associated)g(with)f(V)-9 b(olcano)16 b(rules)e(that)h(are)2044
+5263 y(not)i(sho)n(wn)h(here.)p eop
+%%Page: 6 6
+6 5 bop -98 24 1923 4 v -98 1420 4 1397 v 371 1324 a
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 17.07164 128.0373
+119.50148 128.0373 119.50148 25.60745 17.07164 25.60745 /Lineto /lineto
+load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 153.64476
+102.42984 153.64476 102.42984 136.57312 34.14328 136.57312 /Lineto
+/lineto load def false Polygon gsave 1. setgray fill grestore gsave
+0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 754 139 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.0875
+neg 47.33098 7.711 .5 Frame gsave 1. setgray fill grestore end
+
+
+@endspecial Fo(Prairie)15 b(Rule)f(Set)371 1324 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 119.50148 68.28656 136.57312
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 34.14328 119.50148
+102.42984 119.50148 102.42984 102.42984 34.14328 102.42984 /Lineto
+/lineto load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap
+stroke grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial
+719 416 a(P2V)h(Pre-processor)371 1324 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 85.3582 68.28656 102.42984
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 85.3582 102.42984
+85.3582 102.42984 68.28656 34.14328 68.28656 /Lineto /lineto load
+def false Polygon gsave 0.5 setgray fill grestore gsave 0.8 SLW 0.
+setgray 0 setlinecap stroke grestore end
+
+@endspecial
+736 706 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.0875
+neg 51.482 7.711 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(V)-7
+b(olcano)14 b(Rule)h(Set)371 1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 51.21492 68.28656 68.28656
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 34.14328 51.21492
+102.42984 51.21492 102.42984 34.14328 34.14328 34.14328 /Lineto /lineto
+load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial 843
+950 a(V)-7 b(olcano)694 1017 y(Optimizer)o(-Generator)371
+1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 17.07164 68.28656 34.14328
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 17.07164
+102.42984 17.07164 102.42984 0.0 34.14328 0.0 /Lineto /lineto load
+def false Polygon gsave 0.5 setgray fill grestore gsave 0.8 SLW 0.
+setgray 0 setlinecap stroke grestore end
+
+@endspecial 740 1267 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 4.526
+neg 50.62799 7.711 .5 Frame gsave 1. setgray fill grestore end
+
+
+@endspecial(Query)15 b(Optimizer)-948 b(Operator)15
+b(T)n(ree)371 1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 34.14328 8.53581 17.07164 8.53581
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 119.50148 8.53581 102.42984 8.53581
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial 1363 1273 a(Access)e(Plan)p
+1822 1420 V -98 1423 1923 4 v 1823 1440 19 1403 v -81
+1440 1923 19 v -112 1623 a FG(Figure)58 b(5:)107 b(The)58
+b(Prairie)h(optimizer)n(-generator)c(paradigm.)-112 1722
+y(Double-box)o(ed)60 b(modules)j(represent)f(softw)o(are)i(generators,)
+-112 1822 y(shaded)17 b(box)o(es)g(represent)g(generated)g(programs.)26
+b(The)18 b(outermost)-112 1922 y(double-box)o(ed)e(portion)k(denotes)g
+(the)h(Prairie)g(optimizer)f(genera-)-112 2021 y(tor)-5
+b(.)-112 2214 y(encode)14 b(properties,)h(V)-11 b(olcano)14
+b(partitions)h(the)h(properties)e(into)h(dif-)-112 2314
+y(ferent)27 b(classes.)53 b(The)27 b(P2V)h(pre-processor)e(partitions)h
+(a)h(Prairie)-112 2414 y(descriptor)33 b(into)i(the)h(dif)n(ferent)d
+(property)g(classes)k(required)c(by)-112 2513 y(V)-11
+b(olcano.)30 b(This)22 b(is)g(a)f(non-tri)n(vial)e(task,)j(since)f(it)h
+(requires)e(parsing)-112 2613 y(the)g(Prairie)g(rules)g(and)g(their)g
+(actions.)-29 2713 y(Impl)p 134 2713 25 4 v 28 w(rules)15
+b(in)g(V)-11 b(olcano)14 b(defer)g(most)h(of)g(the)f(actions)h
+(associated)-112 2812 y(with)j(the)g(rules)f(to)h(support)f(functions.)
+27 b(Each)17 b(algorithm)g(has)h(four)-112 2912 y(support)d(functions)g
+(associated)i(with)g(it.)29 b(A)17 b(Prairie)g(speci\256cation,)-112
+3011 y(on)f(the)g(other)g(hand,)g(contains)g(all)h(the)g(actions)f(in)h
+(the)g(correspond-)-112 3111 y(ing)i(rule.)29 b(The)19
+b(P2V)h(pre-processor)e(parses)i(a)g(Prairie)g(I-rule,)e(and)-112
+3211 y(automatically)29 b(generates)h(all)i(the)f(V)-11
+b(olcano)30 b(support)g(functions)-112 3310 y(from)24
+b(the)h(rule.)44 b(This)26 b(is)g(also)g(a)f(comple)o(x)f(process,)i
+(since)f(it)h(de-)-112 3410 y(pends)c(partly)h(on)g(the)h(partitioning)
+e(of)h(properties)f(mentioned)g(in)-112 3510 y(the)28
+b(last)i(paragraph,)e(and)h(also)g(because)f(it)h(requires)f
+(relocating)-112 3609 y(pieces)d(of)g(code)f(from)g(Prairie)h(rules)h
+(to)f(V)-11 b(olcano)24 b(support)g(func-)-112 3709 y(tions.)-29
+3808 y(The)d(third)g(salient)h(feature)e(of)i(a)g(V)-11
+b(olcano)20 b(speci\256cation)h(is)i(the)-112 3908 y(presence)13
+b(of)h(implicit,)i(or)e(hidden,)g(algorithms,)g(called)h
+FF(enfor)m(cer)o(s)p FG(.)-112 4008 y(In)f(Prairie,)h(all)g(algorithms)
+e(are)h(e)o(xplicit.)26 b(Consider)m(,)15 b(for)e(e)o(xample,)-112
+4107 y(the)18 b(Mer)o(ge)p 230 4107 V 28 w(sort)h(algorithm)e(in)i
+(Figure)f(3\(b\).)27 b(In)18 b(a)h(V)-11 b(olcano)18
+b(spec-)-112 4207 y(i\256cation,)24 b(this)g(algorithm)f(w)o(ould)g(be)
+h(classi\256ed)h(as)f(an)g(enforcer)m(,)-112 4307 y(since)34
+b(it)h(enforces)e(the)h(sortedness)g(property)-5 b(.)69
+b(The)34 b(P2V)h(pre-)-112 4406 y(processor)27 b(determines)h(the)h
+(Prairie)g(algorithms)f(that)h(are)g(func-)-112 4506
+y(tionally)g(V)-11 b(olcano)30 b(enforcers,)h(and)e(deletes)i(the)f
+(corresponding)-112 4605 y(Prairie)k(rules)g(to)g(generate)f(the)h(V)
+-11 b(olcano)33 b(speci\256cation.)71 b(This)-112 4705
+y(requires)33 b(the)i(pre-processor)e(to)i(migrate)f(the)h(\(deleted\))
+f(rule')-5 b(s)-112 4805 y(actions)19 b(to)i(V)-11 b(olcano)19
+b(support)g(functions.)-29 4904 y(The)27 b(P2V)i(pre-processor)c(also)k
+(generates)e(a)i(set)g(of)f(compact)-112 5004 y(V)-11
+b(olcano)24 b(rules)i(by)f(mer)o(ging)f(Prairie)h(rules)h(whene)n(v)o
+(er)d(possible.)-112 5104 y(Consider)m(,)18 b(for)i(e)o(xample,)f(the)h
+(follo)n(wing)e(set)j(of)f(rules)g(in)h(Prairie:)-103
+5263 y Fo(JOIN)p Ft(\()p Fu(S)90 5271 y Fn(1)122 5263
+y Fu(;S)183 5271 y Fn(2)215 5263 y Ft(\):)p Fi(D)317
+5271 y Fg(3)436 5263 y Fh(=)-14 b Fk(\))83 b Fo(JOPR)o
+Ft(\()p Fo(SOR)m(T)o Ft(\()p Fu(S)1026 5271 y Fn(1)1058
+5263 y Ft(\):)p Fi(D)1160 5271 y Fg(4)1196 5263 y Fu(;)p
+Fo(SOR)m(T)o Ft(\()p Fu(S)1428 5271 y Fn(2)1460 5263
+y Ft(\):)p Fi(D)1562 5271 y Fg(5)1597 5263 y Ft(\):)p
+Fi(D)1699 5271 y Fg(6)2127 21 y Fo(SOR)m(T)o Ft(\()p
+Fu(S)2339 29 y Fn(1)2371 21 y Ft(\):)p Fi(D)2473 29 y
+Fg(2)2592 21 y Fh(=)-14 b Fk(\))83 b Fo(Null)p Ft(\()p
+Fu(S)2979 29 y Fn(1)3011 21 y Ft(:)p Fi(D)3087 29 y Fg(3)3123
+21 y Ft(\):)p Fi(D)3225 29 y Fg(4)2044 145 y Fo(JOPR)o
+Ft(\()p Fu(S)2246 153 y Fn(1)2279 145 y Fu(;S)2340 153
+y Fn(2)2371 145 y Ft(\):)p Fi(D)2473 153 y Fg(3)2592
+145 y Fh(=)-14 b Fk(\))83 b Fo(Nested)p 2974 145 18 4
+v 20 w(loops)p Ft(\()p Fu(S)3184 153 y Fn(1)3216 145
+y Ft(:)p Fi(D)3292 153 y Fg(4)3328 145 y Fu(;S)3389 153
+y Fn(2)3421 145 y Ft(\):)p Fi(D)3523 153 y Fg(5)2044
+316 y FG(The)24 b(\256rst)g(rule)g(is)h(a)g(T)-8 b(-rule,)24
+b(and)f(the)i(ne)o(xt)e(tw)o(o)h(are)g(I-rules.)40 b(The)2044
+416 y(P2V)26 b(pre-processor)d(combines)h(the)i(abo)o(v)o(e)e(set)i(of)
+g(Prairie)f(rules)2044 515 y(into)20 b(a)g(single)g(I-rule,)2044
+686 y Fo(JOIN)p Ft(\()p Fu(S)2237 694 y Fn(1)2269 686
+y Fu(;S)2330 694 y Fn(2)2362 686 y Ft(\):)p Fi(D)2464
+694 y Fg(3)2582 686 y Fh(=)-14 b Fk(\))83 b Fo(Nested)p
+2964 686 V 20 w(loops)p Ft(\()p Fu(S)3174 694 y Fn(1)3206
+686 y Ft(:)p Fi(D)3282 694 y Fg(4)3318 686 y Fu(;S)3379
+694 y Fn(2)3411 686 y Ft(\):)p Fi(D)3513 694 y Fg(5)2044
+857 y FG(and)19 b(then)h(translates)g(it)h(into)f(a)h(single)f(V)-11
+b(olcano)19 b(impl)p 3625 857 25 4 v 29 w(rule.)2044
+1151 y FB(4)119 b(Experimental)30 b(r)n(esults)2044 1341
+y FG(This)k(section)g(presents)g(e)o(xperimental)e(results)i(which)g
+(demon-)2044 1441 y(strate)e(the)h(v)n(alue)f(of)g(Prairie)g(in)g
+(specifying)f(rule)h(sets)i(of)e(rule-)2044 1541 y(based)f(optimizers.)
+64 b(Our)32 b(e)o(xperiments)e(consist)j(of)f(specifying)2044
+1640 y(rule-based)17 b(optimizers)i(using)g(Prairie)g(and)g(generating)
+e(optimiz-)2044 1740 y(ers)f(using)f(the)g(P2V)h(pre-processor)c(and)j
+(the)h(optimizer)n(-generator)2044 1839 y(paradigm)i(of)i(Figure)g(5.)
+2127 1942 y(In)26 b([4],)g(we)h(presented)d(an)i(implementation)e(of)i
+(a)g(centralized)2044 2041 y(relational)33 b(query)f(optimizer)h(using)
+h(Prairie.)70 b(Using)34 b(the)g(P2V)2044 2141 y(translator)m(,)g(we)e
+(translated)g(this)g(to)h(V)-11 b(olcano)31 b(format)g(and)h(opti-)2044
+2240 y(mized)h(se)n(v)o(eral)h(queries)f(using)g(the)h(resultant)g
+(optimizer)-5 b(.)69 b(F)o(or)2044 2340 y(comparison,)22
+b(we)h(hand-coded)d(the)k(same)f(optimizer)f(directly)h(in)2044
+2440 y(V)-11 b(olcano.)66 b(The)32 b(results)h(presented)f(there)g(sho)
+n(wed)g(that,)k(using)2044 2539 y(Prairie)19 b(\(compared)f(to)i
+(directly)f(using)g(V)-11 b(olcano\))18 b(resulted)i(in)f(ap-)2044
+2639 y(proximately)27 b(50\045)j(sa)n(vings)f(in)h(lines)g(of)g(code)f
+(with)h(ne)o(gligible)2044 2739 y(\(less)d(than)e(5\045\))h(increase)g
+(in)g(query)f(optimization)f(time.)48 b(Ho)n(w-)2044
+2838 y(e)n(v)o(er)m(,)23 b(the)h(optimizer)e(w)o(as)j(quite)e(small)i
+(in)f(terms)g(of)f(the)h(number)2044 2938 y(of)c(operators,)e
+(algorithms)h(and)h(rules.)2127 3040 y(F)o(or)i(a)h(more)f(realistic)h
+(e)n(v)n(aluation)e(of)i(Prairie,)g(we)g(needed)e(an-)2044
+3139 y(swers)g(to)f(the)g(follo)n(wing)f(questions:)2106
+3313 y(1.)41 b(Is)20 b(Prairie)h(adequate)d(for)i(lar)o(ge-scale)f
+(rule)h(sets?)2106 3489 y(2.)41 b(Ho)n(w)13 b(is)i(programmer)c
+(producti)n(vity)g(enhanced)h(by)h(the)h(high-)2210 3588
+y(le)n(v)o(el)20 b(abstractions)f(of)h(Prairie?)2106
+3764 y(3.)41 b(Can)30 b(Prairie)f(rule)h(sets)g(be)g(translated)f
+(automatically)f(into)2210 3864 y(ef)n(\256cient)20 b(implementations?)
+2127 4037 y(W)-7 b(e)18 b(addressed)e(the)i(\256rst)g(question)e(by)h
+(using)g(the)g(T)-6 b(e)o(xas)17 b(Instru-)2044 4137
+y(ments)j(Open)g(OODB)i(query)d(optimizer)g(rule)i(set,)g(which)f(has)h
+(the)2044 4237 y(lar)o(gest)29 b(publicly)h(a)n(v)n(ailable)f(rule)h
+(set.)61 b(W)-7 b(e)31 b(describe)f(this)h(opti-)2044
+4336 y(mizer)22 b(in)i(the)f(ne)o(xt)f(section,)h(and)g(then)f(gi)n(v)o
+(e)h(our)f(assessments)i(to)2044 4436 y(the)c(last)h(tw)o(o)f
+(questions)g(in)g(subsequent)f(sections.)2044 4687 y
+Fx(4.1)99 b(The)74 b(T)-9 b(exas)73 b(Instruments)h(Open)g(OODB)2268
+4803 y(query)26 b(optimizer)2044 4964 y FG(The)45 b(T)-6
+b(e)o(xas)46 b(Instruments)f(Open)g(Object-Oriented)f(Database)2044
+5063 y(Management)16 b(System)j(is)h(an)e(open,)g(e)o(xtensible,)g
+(object-oriented)2044 5163 y(database)49 b(system)g(which)h(pro)o
+(vides)d(users)j(an)g(architectural)2044 5263 y(frame)n(w)o(ork)27
+b(that)j(is)h(con\256gurable)c(in)j(an)g(incremental)e(manner)-5
+b(.)p eop
+%%Page: 7 7
+7 6 bop -112 21 a FG(The)42 b(query)f(optimizer)g(in)i(the)g(Open)f
+(OODB)h([2])f(is)i(gener)n(-)-112 120 y(ated)35 b(using)f(V)-11
+b(olcano.)74 b(It)36 b(is)g(written)f(as)h(a)f(set)i(of)e(trans)p
+1671 120 25 4 v 29 w(rules)-112 220 y(and)21 b(impl)p
+188 220 V 29 w(rules)h(that)h(de\256ne)e(the)i(algebra)e(of)h(an)g
+(object-oriented)-112 319 y(database)34 b(system.)75
+b(Currently)-5 b(,)37 b(there)e(are)g(17)g(transformation)-112
+419 y(rules)13 b(and)g(9)h(implementation)e(rules)i(together)e(with)i
+(about)f Fh(13)p Fv(;)h Fh(000)-112 519 y FG(lines)26
+b(of)f(code)g(for)g(support)f(functions;)j(this,)g(of)f(course,)f(can)h
+(be)-112 618 y(changed)18 b(by)i(an)g(Open)f(OODB)i(user)f(for)g
+(speci\256c)g(needs.)-112 895 y Fx(4.2)99 b(Pr)n(ogrammer)25
+b(pr)n(oducti)o(vity)-112 1064 y FG(Programmer)11 b(producti)n(vity)g
+(can)i(be)h(measured)e(in)i(dif)n(ferent)e(w)o(ays.)-112
+1164 y(An)29 b(admittedly)f(simplistic)j(metric)e(is)h(the)g(number)e
+(of)h(lines)h(of)-112 1263 y(code)24 b(that)i(must)f(be)g(written.)45
+b(But)26 b(there)e(are)i(also)f(less)i(tangible)-112
+1363 y(measures,)16 b(such)h(as)g(the)g(amount)e(of)i(conceptual)e(ef)n
+(fort)g(needed)h(to)-112 1463 y(understand)k(a)k(particular)d
+(programming)f(task.)37 b(Our)23 b(e)o(xperience)-112
+1562 y(with)d(the)h(Open)f(OODB)i(query)d(optimizer)g(suggests)i(that)g
+(Prairie)-112 1662 y(e)o(xcels)f(on)g(the)g(latter)m(,)g(while)g(of)n
+(fering)f(modest)g(reductions)g(in)i(the)-112 1762 y(v)n(olume)e(of)h
+(code)f(that)h(needs)g(to)h(be)f(written.)-29 1868 y(W)-7
+b(e)16 b(con)m(v)o(erted)e(by)h(hand)g(the)h(Open)f(OODB)h(query)f
+(optimizer')-5 b(s)-112 1968 y(V)-11 b(olcano)15 b(speci\256cations)g
+(to)h(Prairie.)28 b(This)16 b(w)o(as)h(a)f(non-tri)n(vial)f(task)-112
+2068 y(because)27 b(of)h(the)h(relati)n(v)o(ely)e(lar)o(ge)g(size)i(of)
+f(the)h(rule)f(set)h(and)f(the)-112 2167 y(comple)o(xity)f(of)j(the)g
+(support)e(functions.)57 b(This)30 b(w)o(as)g(where)f(we)-112
+2267 y(found)c(Prairie)j(helped)f(in)g(conceptually)f(simplifying)g
+(the)i(rules)-112 2366 y(and)j(actions.)63 b(W)-7 b(e)33
+b(then)e(used)g(our)g(P2V)h(pre-processor)d(to)j(re-)-112
+2466 y(constitute)22 b(these)i(Prairie)f(speci\256cations)g(as)i(V)-11
+b(olcano)22 b(speci\256ca-)-112 2566 y(tions.)59 b(As)31
+b(described)e(in)i(Section)f(3,)i(this)f(process)f(in)m(v)n(olv)o(ed)e
+(a)-112 2665 y(considerable)19 b(le)n(v)o(el)i(of)h(comple)o(xity)-5
+b(,)19 b(partly)i(because)f(the)i(Prairie)-112 2765 y(speci\256cation)h
+(had)g(22)g(T)-8 b(-rules)24 b(and)f(11)g(I-rules)h(compared)d(to)j(17)
+-112 2865 y(trans)p 55 2865 V 29 w(rules)32 b(and)g(9)h(impl)p
+659 2865 V 29 w(rules)g(in)f(the)h(V)-11 b(olcano)31
+b(speci\256cation;)-112 2964 y(the)25 b(reconstituted)f(V)-11
+b(olcano)24 b(speci\256cation)g(had)h(the)h(same)f(num-)-112
+3064 y(ber)19 b(of)g(trans)p 270 3064 V 29 w(rules)h(and)f(impl)p
+774 3064 V 29 w(rules)h(as)g(the)g(original)e(hand-coded)-112
+3163 y(speci\256cation.)-29 3270 y(Con)m(v)o(erting)c(the)g(Open)g
+(OODB)g(op)o(timizer)f(ru)o(le)h(set)g(into)f(Prair)o(ie)-112
+3370 y(format)19 b(actually)h(simpli\256ed)g(its)i(speci\256cation)e
+(as)h(the)g(comple)o(xi-)-112 3469 y(ties)i(of)g(the)g(V)-11
+b(olcano)22 b(model)h(were)f(remo)o(v)o(ed.)36 b(The)22
+b(reduction)g(in)-112 3569 y(lines)14 b(of)g(code)f(w)o(as)i(modest)f
+(\320)h(there)e(w)o(as)i(about)e(a)i(10\045)f(sa)n(vings.)1820
+3539 y Ft(5)-112 3669 y FG(Ho)n(we)n(v)o(er)m(,)24 b(as)j(mentioned)c
+(abo)o(v)o(e,)j(sa)n(vings)f(in)h(lines)g(of)f(code)g(do)-112
+3768 y(not)i(adequately)g(re\257ect)h(increases)g(in)g(programmer)d
+(producti)n(v-)-112 3868 y(ity)-5 b(.)38 b(W)-7 b(e)25
+b(found)d(the)h(encapsulated)f(speci\256cations)h(of)g(Prairie)g(\320)
+-112 3968 y(namely)-5 b(,)34 b(the)f(use)h(of)e(a)i(single)f
+(descriptor)e(and)i(fe)n(wer)f(e)o(xplicit)-112 4067
+y(support)18 b(functions)h(\320)i(made)e(rule)h(programming)d
+FF(muc)o(h)i FG(easier)-5 b(.)-112 4344 y Fx(4.3)99 b(P)n(erf)n
+(ormance)81 b(r)n(esults)g(using)g(the)h(Open)112 4460
+y(OODB)24 b(optimizer)-29 4629 y FG(The)17 b(acid)g(test)h(of)f
+(Prairie)g(w)o(as)i(whether)d(Prairie)h(speci\256cations)-112
+4729 y(could)c(be)i(translated)f(into)g(ef)n(\256cient)h(optimizer)e
+(implementations.)-112 4828 y(Our)24 b(e)o(xperiments)f(using)h(the)h
+(Open)g(OODB)g(consisted)g(of)f(opti-)-112 4928 y(mizing)j(8)h(dif)n
+(ferent)e(queries)h(using)h(the)g(tw)o(o)g(query)f(optimizers)p
+-112 5028 788 4 v -28 5081 a Fr(5)7 5105 y Fz(The)16
+b(original)j(V)-9 b(olcano)18 b(speci\256cation)i(had)c
+Fc(13)p Fb(;)c Fc(400)17 b Fz(lines,)g(the)g(Prairie)h(spec-)-112
+5184 y(i\256cation)25 b(had)f Fc(12)p Fb(;)12 b Fc(100)23
+b Fz(lines,)j(and)e(the)g(P2V)-7 b(-generated)26 b(V)-9
+b(olcano)26 b(speci\256cation)-112 5263 y(had)17 b Fc(15)p
+Fb(;)12 b Fc(800)17 b Fz(lines.)2044 21 y FG(generated,)h(respecti)n(v)
+o(ely)-5 b(,)19 b(using)h(Prairie)g(and)g(using)h(V)-11
+b(olcano)19 b(di-)2044 120 y(rectly)d(\(in)g(the)h(remainder)e(of)h
+(this)h(section,)g(we)g(will)h(use)e(\252Prairie\272)2044
+220 y(and)g(\252V)-11 b(olcano\272)15 b(to)h(denote)g(these)g(tw)o(o)h
+(approaches\).)26 b(There)15 b(were)2044 319 y(4)j(distinct)h(e)o
+(xpressions)e(that)i(were)f(used)g(to)h(generate)e(the)i(queries)2044
+419 y(used)h(in)i(the)f(e)o(xperiments;)e(these)i(are)g(sho)n(wn)f(in)i
+(Figure)e(6.)32 b(Each)2044 519 y(e)o(xpression)18 b(represents)i(an)g
+Fv(N)9 b FG(-w)o(ay)19 b(join)h(query)f(for)h(v)n(arying)e
+Fv(N)9 b FG(.)2127 627 y(The)27 b(\256rst)g(e)o(xpression)f(E1)h(is)h
+(a)g(simple)f(retrie)n(v)n(al)f(and)g(join)h(of)2044
+726 y(base)21 b(classes.)33 b(The)21 b(second,)f(E2,)h(is)i(also)e(a)h
+(join)f(of)g(base)g(classes;)2044 826 y(ho)n(we)n(v)o(er)m(,)33
+b(after)f(each)h(class)g(retrie)n(v)n(al,)i(an)d(attrib)n(ute)g(has)h
+(to)g(be)2044 926 y(materialized)25 b(\(i.e.,)j(brought)d(into)h(vie)n
+(w\))g(before)f(the)i(join.)48 b(The)2044 1025 y(third)17
+b(and)g(fourth)f(e)o(xpressions)g(\(E3)h(and)g(E4\))g(are)g(the)h(same)
+g(as)g(the)2044 1125 y(\256rst)23 b(and)f(second)g(\(E1)g(and)h(E2\))f
+(respecti)n(v)o(ely)-5 b(,)21 b(e)o(xcept)h(that)h(there)2044
+1224 y(is)g(a)g(selection)e(of)h(attrib)n(utes)g(\(the)g(select)h
+(operator)d(is)k(the)e(root)f(of)2044 1324 y(the)f(e)o(xpressions\).)
+2603 1294 y Ft(6)2127 1432 y FG(The)35 b(algebra)g(that)i(w)o(as)f
+(used)g(in)g(the)g(Prairie)g(and)g(V)-11 b(olcano)2044
+1532 y(optimizers)19 b(for)g(our)g(e)o(xperiments)e(consisted)j(of)f(5)
+h(relational)f(op-)2044 1631 y(erators)f(SELECT)-6 b(,)18
+b(PR)m(OJECT)-6 b(,)18 b(JOIN,)h(RET)g(and)f(UNNEST)g(\(for)2044
+1731 y(set-v)n(alued)g(attrib)n(utes\))h(and)f(an)h(object-oriented)e
+(operator)g(called)2044 1831 y(MA)-9 b(T)13 b(\(for)f(MA)-9
+b(T)j(erialize;)15 b(it)f(is)g(fundamentally)d(a)j(pointer)n(-chasing)
+2044 1930 y(operator)k(for)i(attrib)n(utes)g(of)g(a)g(class\).)30
+b(There)19 b(were)i(8)f(algorithms.)2127 2038 y(There)13
+b(are)g(man)o(y)g(param)o(eters)g(th)o(at)g(can)f(be)g(v)m(aried)g(whe)
+o(n)h(b)o(en)o(ch-)2044 2138 y(marking)f(a)j(query)e(optimizer)-5
+b(.)26 b(Since)14 b(our)f(objecti)n(v)o(e)g(w)o(as)i(to)f(v)o(erify)
+2044 2237 y(that)j(the)h(Prairie)f(approach)f(did)h(not)g(sacri\256ce)h
+(ef)n(\256cienc)o(y)-5 b(,)16 b(our)g(cri-)2044 2337
+y(teria)g(for)g(the)g(queries)g(w)o(as)h(that)f(the)o(y)g(test)h(a)g
+(majority)e(of)h(the)g(rules,)2044 2437 y(with)32 b(v)n(arying)d
+(properties)i(of)g(the)h(base)f(classes.)65 b(T)-7 b(o)32
+b(this)g(end,)2044 2536 y(we)21 b(tested)h(our)e(optimizer)g(\(and)g
+(the)h(V)-11 b(olcano)20 b(optimizer\))g(with)h(8)2044
+2636 y(dif)n(ferent)g(queries)i(\(sho)n(wn)f(in)h(T)-7
+b(able)24 b(3\).)38 b(The)23 b(eight)f(queries)h(Q1)2044
+2736 y(through)d(Q8)i(are)g(deri)n(v)o(ed)f(from)g(the)h(4)g(e)o
+(xpressions)f(in)i(Figure)e(6.)2044 2835 y(Each)15 b(e)o(xpression)f
+(E1)i(through)d(E4)j(is)g(used)g(to)g(obtain)f(tw)o(o)h(queries)2044
+2935 y(for)k(a)h(\256x)o(ed)f(number)e Fv(N)30 b FG(of)20
+b(JOINs)i(in)e(the)h(e)o(xpression.)29 b(The)20 b(only)2044
+3034 y(dif)n(ference)13 b(between)h(the)h(tw)o(o)g(queries)f(obtained)g
+(from)g(an)g(e)o(xpres-)2044 3134 y(sion)19 b(is)i(that)e(the)h
+(\256rst)g(one)f(does)h(not)f(contain)g(an)o(y)f(indices)i(on)f(an)o(y)
+2044 3234 y(classes,)25 b(whereas)e(the)g(second)f(one)h(contains)g(a)g
+(single)g(inde)o(x)f(on)2044 3333 y(each)f(base)i(class)g(occurring)c
+(in)j(the)h(e)o(xpression.)33 b(In)21 b(e)o(xpressions)2044
+3433 y(where)16 b(a)i(SELECT)f(is)h(present)e(\(E3)h(and)f(E4\),)h(the)
+h(selection)e(pred-)2044 3533 y(icate)21 b(is)g(a)g(conjunction)e(of)h
+(equality)g(predicates)f FF(bc)3585 3545 y Fu(i)3636
+3533 y Fh(==)k FF(const)3964 3545 y Fu(i)3992 3533 y
+FG(,)2044 3632 y(where)17 b FF(bc)2344 3644 y Fu(i)2390
+3632 y FG(is)i(an)f(attrib)n(ute)g(of)g(class)h FF(C)3178
+3644 y Fu(i)3206 3632 y FG(,)g(and)e FF(const)3560 3644
+y Fu(i)3606 3632 y FG(is)i(a)g(constant)2044 3732 y(\(we)k(arbitrarily)
+f(set)h(this)h(to)f Fv(i)p FG(,)h(because)e(its)j(v)n(alue)d(doesn')o
+(t)g(af)n(fect)2044 3831 y(the)j(correctness)g(or)g(performance)d(of)k
+(the)f(optimizer\).)44 b(In)25 b(addi-)2044 3931 y(tion,)32
+b(for)e(queries)g(with)h(a)g(SELECT)g(and)f(whose)g(base)h(classes)2044
+4031 y(ha)n(v)o(e)24 b(indices)h(\(Q6)g(and)g(Q8)g(in)h(T)-7
+b(able)25 b(3\),)h(the)f(\(single\))f(inde)o(x)g(of)2044
+4130 y(each)c(base)h(class)h(w)o(as)g(chosen)e(to)h(be)g(the)g(attrib)n
+(ute)f(referenced)f(in)2044 4230 y(the)25 b(selection)g(predicate.)44
+b(F)o(or)25 b(e)o(xample,)g(class)i FF(C)3574 4242 y
+Fu(i)3628 4230 y FG(w)o(as)f(chosen)2044 4330 y(to)i(ha)n(v)o(e)g(an)g
+(inde)o(x)f(on)g(attrib)n(ute)h FF(bc)3132 4342 y Fu(i)3160
+4330 y FG(.)54 b(The)28 b(join)f(predicates)h(for)2044
+4429 y(each)13 b(JOIN)i(were)f(chosen)f(at)i(random,)e(and)h(were)f(al)
+o(w)o(ays)i(equality)2044 4529 y(predicates.)27 b(The)17
+b(choice)g(of)g(JOIN)h(predicates)f(w)o(as)h(such)f(that)h(the)p
+2044 4633 V 2129 4687 a Fr(6)2163 4710 y Fz(The)23 b(most)g(comple)o(x)
+i(e)o(xpression)f(E4)f(consists)h(of)f(all)h(operators)h(in)f(the)f
+(al-)2044 4789 y(gebra,)17 b(e)o(xcept)i(PR)m(OJECT)d(and)h(UNNEST)-5
+b(.)15 b(PR)m(OJECT)h(w)o(as)h(not)h(considered)h(be-)2044
+4868 y(cause)d(it)g(appeared)i(in)d(only)h(one)g(impl)p
+2948 4868 20 4 v 25 w(rule)g(and)g(no)g(trans)p 3412
+4868 V 25 w(rules,)g(and)g(thus,)f(w)o(ould)2044 4947
+y(not)22 b(af)n(fect)h(the)f(size)h(of)e(the)h(search)h(space)f(of)f
+(abstract)j(e)o(xpressions.)39 b(UNNEST)2044 5026 y(w)o(as)20
+b(not)h(considered)i(because)f(it)f(appeared)i(in)e(e)o(xactly)h(one)f
+(trans)p 3656 5026 V 25 w(rule)h(and)f(one)2044 5105
+y(impl)p 2169 5105 V 24 w(rule;)g(including)h(it)d(in)g(our)g(queries)h
+(w)o(ould)g(ha)o(v)o(e)f(increased)i(the)f(number)f(of)2044
+5184 y(parameters)f(that)f(could)h(af)n(fect)g(our)f(run-times.)25
+b(W)-5 b(e)15 b(preferred)k(to)d(concentrate)k(on)2044
+5263 y(simple)d(JOIN)g(e)o(xpressions.)p eop
+%%Page: 8 8
+8 7 bop -112 24 2130 4 v -112 1001 4 978 v -37 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+
+-37 707 a Fa(C)-10 719 y Fn(1)-47 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ -47 618 a Fm(RET)-7
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 152 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 152 707 a Fa(C)179 719 y Fn(2)142
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 142 618 a Fm(RET)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 42 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 3.36499 0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 42
+524 a Fm(JOIN)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 182
+415 a
+ tx@Dict begin 45. Rot end
+ 182 415 a 143 418 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 143 418 a Fl(:)10 b(:)g(:)182
+415 y
+ tx@Dict begin 45. neg Rot end
+ 182 415 a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ -7 699 a 331 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 331 429 a
+Fm(RET)336 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.37999 0.99998
+false .5 8.23898 InitRnode } NewNode end end
+ 336 520 a Fa(C)364 528 y Fl(n)-7 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 231 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.36499
+0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 231 335 a Fm(JOIN)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ -7 699
+a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 100 881 a Fz(\(a\))17 b(E1)p 447
+976 4 928 v 476 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 476 707 a Fa(C)504 719 y Fn(1)467
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 467 618 a Fm(RET)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 665 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+
+665 707 a Fa(C)693 719 y Fn(2)656 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 656 618 a Fm(RET)506
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 463 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 463 524 a Fm(MA)-5 b(T)506
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 652 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 652 524 a Fm(MA)g(T)506 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 556 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 3.36499 0.06248 false .5 10.82999 InitRnode } NewNode end
+end
+ 556 429 a Fm(JOIN)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506
+699 a 506 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 695 321 a
+ tx@Dict begin 45. Rot end
+ 695 321 a 656 324
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 656 324 a Fl(:)11 b(:)f(:)695 321 y
+ tx@Dict begin 45. neg Rot end
+ 695 321 a 506 699
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 506 699 a 845 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 845 429 a Fm(RET)850 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.37999 0.99998
+false .5 8.23898 InitRnode } NewNode end end
+ 850
+520 a Fa(C)878 528 y Fl(n)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 841 335
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 841 335 a Fm(MA)-5 b(T)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 745 240
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.36499
+0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 745 240 a Fm(JOIN)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 506 699 a 506 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506
+699 a 611 881 a Fz(\(b\))17 b(E2)p 961 976 4 928 v 990
+707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 990 707 a Fa(C)1018 719 y Fn(1)981 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 981 618
+a Fm(RET)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1179 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 1179 707 a
+Fa(C)1207 719 y Fn(2)1170 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 1170 618 a Fm(RET)1020
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1070 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 3.36499 0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 1070 524 a Fm(JOIN)1020 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1209 415 a
+ tx@Dict begin 45. Rot end
+ 1209 415
+a 1170 418 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 1170 418 a Fl(:)11 b(:)f(:)1209 415 y
+ tx@Dict begin 45. neg Rot end
+ 1209
+415 a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699 a 1359 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 1359 429 a Fm(RET)1364
+520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.37999 0.99998
+false .5 8.23898 InitRnode } NewNode end end
+ 1364 520 a Fa(C)1392 528 y Fl(n)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020
+699 a 1259 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.36499
+0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 1259 335 a Fm(JOIN)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699
+a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1227 240 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 3.36499
+0.06248 false .5 18.33496 InitRnode } NewNode end end
+ 1227 240 a Fm(SELECT)1020
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699 a 1127 881 a Fz(\(c\))17 b(E3)p 1474 976
+4 928 v 1504 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 1504 707 a Fa(C)1531 719 y Fn(1)1495
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 1495 618 a Fm(RET)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1693 707
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 1693 707 a Fa(C)1720 719 y Fn(2)1684 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 1684 618
+a Fm(RET)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1490 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 1490 524 a
+Fm(MA)-5 b(T)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1679 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 1679 524
+a Fm(MA)g(T)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1583 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 3.36499 0.06248 false .5 10.82999 InitRnode } NewNode end
+end
+ 1583 429
+a Fm(JOIN)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a
+1723 321 a
+ tx@Dict begin 45. Rot end
+ 1723 321 a 1684 324 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 1684 324 a Fl(:)10 b(:)h(:)1723
+321 y
+ tx@Dict begin 45. neg Rot end
+ 1723 321 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1873 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 1873
+429 a Fm(RET)1878 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.37999 0.99998
+false .5 8.23898 InitRnode } NewNode end end
+ 1878 520 a Fa(C)1905 528 y Fl(n)1534
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1868 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 1868 335 a Fm(MA)-5 b(T)1534
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1772 240 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.36499
+0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 1772 240 a Fm(JOIN)1534 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1741 146 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 3.36499
+0.06248 false .5 18.33496 InitRnode } NewNode end end
+ 1741 146
+a Fm(SELECT)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1639 881 a Fz(\(d\))17
+b(E4)p 2014 1001 4 978 v -112 1004 2130 4 v 2015 1021
+19 984 v -96 1021 2130 19 v -112 1204 a FG(Figure)g(6:)28
+b(Expressions)17 b(used)h(in)g(generating)e(queries)h(for)h(e)o
+(xperiments)p 2359 358 1644 13 v 2359 424 4 67 v 2412
+438 a Fp(Query)p 2620 424 V 2673 443 a(Indices?)p 2930
+424 V 2983 438 a(Expr)o(ession)p 3306 424 V 3471 404
+a(Rules)d(matched)p 3999 424 V 3309 427 694 4 v 2359
+491 4 67 v 2620 491 V 2930 491 V 3306 491 V 3359 471
+a Fo(trans)p 3475 471 18 4 v 21 w(rules)p 3656 491 4
+67 v 103 w(impl)p 3818 471 18 4 v 22 w(rules)p 3999 491
+4 67 v 2359 503 1644 13 v 2359 569 4 67 v 2456 549 a(Q1)p
+2620 569 V 214 w(No)p 2930 569 V 3087 589 a(E1)p 3306
+569 V 316 w(3)p 3656 569 V 318 w(3)p 3999 569 V 2359
+573 575 4 v 2359 636 4 67 v 2456 616 a(Q2)p 2620 636
+V 207 w(Y)-6 b(es)p 2930 636 V 3306 636 V 3656 636 V
+3999 636 V 2359 639 1644 4 v 2359 706 4 67 v 2456 686
+a(Q3)p 2620 706 V 214 w(No)p 2930 706 V 3087 725 a(E2)p
+3306 706 V 316 w(8)p 3656 706 V 318 w(4)p 3999 706 V
+2359 709 575 4 v 2359 772 4 67 v 2456 752 a(Q4)p 2620
+772 V 207 w(Y)g(es)p 2930 772 V 3306 772 V 3656 772 V
+3999 772 V 2359 775 1644 4 v 2359 842 4 67 v 2456 822
+a(Q5)p 2620 842 V 214 w(No)p 2930 842 V 3087 861 a(E3)p
+3306 842 V 316 w(9)p 3656 842 V 3815 862 a(5)p 3999 842
+V 2359 845 575 4 v 2359 908 4 67 v 2456 888 a(Q6)p 2620
+908 V 207 w(Y)g(es)p 2930 908 V 3306 908 V 3656 908 V
+3999 908 V 2359 911 1644 4 v 2359 978 4 67 v 2456 958
+a(Q7)p 2620 978 V 214 w(No)p 2930 978 V 3087 997 a(E4)p
+3306 978 V 302 w(16)p 3656 978 V 303 w(7)p 3999 978 V
+2359 981 575 4 v 2359 1044 4 67 v 2456 1024 a(Q8)p 2620
+1044 V 207 w(Y)g(es)p 2930 1044 V 3306 1044 V 3656 1044
+V 3999 1044 V 2359 1057 1644 13 v 2566 1204 a FG(T)f(able)20
+b(3:)30 b(Queries)20 b(used)g(in)g(e)o(xperiments)-112
+1554 y(queries)i(corresponded)e(to)k(linear)f(query)f(graphs.)38
+b(In)23 b(the)g(future,)-112 1654 y(we)16 b(will)h(e)o(xperiment)d
+(with)i(non-linear)e(\(e.g.,)i(star\))g(query)f(graphs.)-29
+1755 y(T)-7 b(able)52 b(3)h(also)g(sho)n(ws)g(the)f(number)f(of)h
+(trans)p 1497 1755 25 4 v 30 w(rules)g(and)-112 1855
+y(impl)p 46 1855 V 29 w(rules)23 b(that)h(are)f(matched)g(by)g(each)g
+(e)o(xpression.)38 b(These)23 b(are)-112 1954 y(the)36
+b(rules)h(whose)f(left)h(hand)f(sides)h(match)g(a)g(sub-e)o(xpression.)
+-112 2054 y(Ho)n(we)n(v)o(er)m(,)20 b(not)i(all)g(the)g(rules)g(were)g
+(necessarily)g(applicable.)33 b(F)o(or)-112 2153 y(instance,)25
+b(an)g(impl)p 469 2153 V 29 w(rule)g(with)g(an)h(inde)o(x)d(scan)j(w)o
+(ould)e(not)h(apply)-112 2253 y(to)20 b(Q3,)g(although)e(it)j(might)f
+(apply)f(to)h(Q4.)-29 2354 y(Queries)32 b(Q1)h(through)e(Q8)i(were)g
+(optimized)f(for)g(increasing)-112 2454 y(number)d Fv(N)41
+b FG(of)31 b(JOINs.)64 b(F)o(or)32 b(a)g(\256x)o(ed)e(number)g(of)h
+(JOINs)i(in)e(a)-112 2554 y(query)-5 b(,)14 b(we)i(v)n(aried)f(the)h
+(cardinalities)f(of)g(the)h(base)g(classes)h(5)f(times,)-112
+2653 y(each)h(time)h(generating)e(a)i(query)f(with)h(dif)n(ferent)e
+(class)i(properties,)-112 2753 y(and)30 b(a)n(v)o(eraged)g(the)h
+(run-times)f(o)o(v)o(er)g(the)h(5)h(query)d(instances)j(to)-112
+2852 y(generate)20 b(the)h(per)n(-query)f(optimization)g(time.)33
+b(Thus,)21 b(each)h(point)-112 2952 y(in)g(our)f(graphs)g(represents)h
+(the)g(a)n(v)o(erage)f(of)h(5)g(queries.)34 b(The)22
+b(run-)-112 3052 y(times)c(were)f(measured)585 3022 y
+Ft(7)639 3052 y FG(using)g(the)h(GNU)g Fd(time)g FG(command.)26
+b(All)-112 3151 y(e)o(xperiments)13 b(were)i(performed)e(on)i(a)h
+(lightly)f(loaded)f(DECstation)-112 3251 y(5000/200)j(running)h(Ultrix)
+i(4.2.)-29 3352 y(The)13 b(optimization)g(times)g(for)g(ea)o(ch)f(qu)o
+(ery)g(fo)o(r)h(b)o(oth)f(ap)o(pr)o(oach)o(es)-112 3452
+y(\(Prairie)h(and)g(V)-11 b(olcano\))13 b(are)g(sho)n(wn)g(in)g
+(Figures)g(7\(a\))g(thro)o(ug)o(h)g(7\()o(h\))o(.)-112
+3552 y(The)25 b(number)g(of)h(joins)g(in)g(each)g(set)h(of)f(graphs)f
+(w)o(as)i(v)n(aried)e(to)h(a)-112 3651 y(maximum)18 b(of)i(8,)g(or)g
+(until)g(virtual)f(memory)g(w)o(as)i(e)o(xhausted.)-29
+3753 y(The)i(\256rst)h(set)h(of)e(graphs)f(\(Figures)h(7\(a\))g(and)g
+(7\(b\)\))f(sho)n(ws)i(the)-112 3852 y(performance)32
+b(of)k(a)g(simple)f(relational-type)f(query)-5 b(.)73
+b(The)36 b(op-)-112 3952 y(timization)30 b(times)j(are)e(almost)h
+(identical)f(between)g(Prairie)g(and)-112 4051 y(V)-11
+b(olcano,)32 b(and)f(the)h(notable)e(point)h(is)h(that)f(the)h
+(presence)e(of)h(an)-112 4151 y(inde)o(x)16 b(does)h(not)g(change)f
+(the)i(optimizer')-5 b(s)16 b(beha)n(vior)m(,)g(i.e.,)i(the)g(tw)o(o)
+-112 4251 y(graphs)24 b(are)i(identical.)46 b(This)26
+b(arises)h(because)e(the)h(optimizer)f(al-)-112 4350
+y(gebra)g(had)h(only)g(tw)o(o)h(join)f(algorithms)g(\(pointer)f(join)h
+(and)g(hash)-112 4450 y(join\),)19 b(neither)g(of)h(which)g(mak)o(es)g
+(use)g(of)g(an)o(y)f(indices.)-29 4551 y(The)13 b(second)f(set)i(of)g
+(graphs)e(\(Figures)h(7\(c\))f(and)h(7\(d\)\))f(sho)n(ws)i(the)-112
+4651 y(results)25 b(of)g(optimizing)f(Q3)i(and)f(Q4.)44
+b(Here,)27 b(as)f(in)g(Figures)f(7\(a\))-112 4750 y(and)33
+b(7\(b\),)i(the)f(presence)f(\(or)g(absence\))g(of)g(indices)h(mak)o
+(es)f(no)-112 4850 y(dif)n(ference.)46 b(Both)26 b(the)h(Prairie)f(and)
+g(V)-11 b(olcano)26 b(approaches)e(ha)n(v)o(e)-112 4950
+y(comparable)d(run-times.)40 b(The)24 b(sharp)f(jump)h(in)g(the)g
+(graphs)f(from)p -112 5028 788 4 v -28 5081 a Fr(7)7
+5105 y Fz(Since)j(the)g(run-times)h(were)f(too)f(small)h(to)g(be)f
+(measured)h(accurately)j(with)-112 5184 y Fy(time)p Fz(,)19
+b(each)i(query)g(instance)h(w)o(as)f(optimized)h(3000)f(times)f(\(in)h
+(a)f(loop\))h(and)f(the)-112 5263 y(total)e(time)g(w)o(as)f(di)n(vided)
+i(by)e(3000)h(to)f(get)h(the)g(per)o(-query)g(optimization)i(time.)2044
+1554 y FG(7-w)o(ay)12 b(to)i(8-w)o(ay)f(joins)g(is)i(due)d(to)i(the)f
+(f)o(act)h(that)g(since)f(all)h(optimiza-)2044 1654 y(tion)25
+b(is)h(done)f(in)h(main)f(memory)-5 b(,)24 b(dynamic)g(memory)g
+(allocation)2044 1753 y(\(caused)29 b(by)h Fd(malloc)g
+FG(calls\))h(results)g(in)f(a)h(lot)f(of)h(thrashing)e(at)2044
+1853 y(this)d(point.)44 b(W)-7 b(e)26 b(speculate)f(that)g(in)h
+(systems)g(with)f(more)g(virtual)2044 1952 y(memory)-5
+b(,)18 b(the)i(graphs)f(will)i(be)f(smoother)-5 b(.)2127
+2057 y(The)15 b(third)f(and)g(fourth)g(sets)i(of)f(graphs)f(in)h
+(Figures)g(7\(e\))f(through)2044 2157 y(7\(h\))k(are)i(optimizations)f
+(of)g(queries)h(with)g(a)g(selection)f(predicate.)2044
+2257 y(In)c(these)h(cases,)g(the)g(presence)e(of)i(an)f(inde)o(x)f(mak)
+o(es)h(a)h(dif)n(ference)e(if)2044 2356 y(the)21 b(inde)o(x)e(is)j
+(referenced)c(in)j(the)g(selection)g(predicate)e(\(as)i(we)g(de-)2044
+2456 y(signed\).)27 b(Also,)19 b(in)g(these)g(tw)o(o)f(\256gures,)h
+(the)f(performance)e(of)i(both)2044 2556 y(Prairie)e(and)h(V)-11
+b(olcano)16 b(w)o(as)h(almost)g(identical,)g(e)o(xcept)e(that)i
+(Prairie)2044 2655 y(does)29 b(slightly)f(w)o(orse)h(due)g(to)g(the)g
+(lar)o(ger)f(number)f(of)33 b Fd(malloc)2044 2755 y FG(calls)23
+b(that)f(the)h(P2V)f(translator)g(introduces.)34 b(Also,)23
+b(note)f(that)h(we)2044 2854 y(could)c(only)g(go)g(up)h(to)g(3-w)o(ay)f
+(joins)g(before)g(virtual)g(memory)f(w)o(as)2044 2954
+y(e)o(xhausted.)34 b(As)23 b(the)g(a)n(v)n(ailable)f(memory)e
+(decreases,)j(there)f(is)h(in-)2044 3054 y(creased)15
+b(thrashing)f(\(as)i(sho)n(wn)f(by)h(the)g(sharp)f(changes)f(in)i
+(slope)g(in)2044 3153 y(the)k(plots\))g(resulting)f(in)i(a)f(much)f
+(slo)n(wer)h(optimization)f(process.)2127 3258 y(In)j(all)h(four)f
+(sets)i(of)e(plots,)h(we)g(can)f(see)i(that)e(Prairie)h(performs)2044
+3358 y(with)34 b(almost)g(\(less)h(than)e Fh(5\045)i
+FG(v)n(ariation\))d(the)i(same)g(ef)n(\256cienc)o(y)2044
+3457 y(as)i(V)-11 b(olcano.)76 b(In)36 b(e)o(xtreme)e(cases,)41
+b(when)35 b(memory)f(is)j(scarce,)2044 3557 y(Prairie)17
+b(runs)f(more)h(slo)n(wly)g(\(about)e Fh(15\045)p FG(\))i(\(e.g.,)f
+(Figure)h(7\(f\)\),)f(b)n(ut)2044 3657 y(we)31 b(belie)n(v)o(e)f(that)h
+(this)h(situation)e(already)g(represents)g(a)h(serious)2044
+3756 y(bottleneck)18 b(for)i(both)f(V)-11 b(olcano)20
+b(and)f(Prairie.)2127 3861 y(The)13 b(results)h(presented)e(in)h(this)h
+(section)g(sho)n(w)f(that)g(Prairie)h(opti-)2044 3961
+y(mizers)h(need)g(not)g(sacri\256ce)h(ef)n(\256cienc)o(y)e(for)g
+(clarity)-5 b(,)16 b(e)n(v)o(en)e(for)h(lar)o(ge)2044
+4060 y(rule)f(sets.)28 b(More)14 b(research)g(and)g(v)n(alidation)f(is)
+i(necessary)f(to)g(v)o(erify)2044 4160 y(that)20 b(Prairie)g(is)h(an)f
+(ef)n(\256cient)g(tool)g(for)g(optimizer)f(speci\256cation.)2044
+4469 y FB(5)119 b(Related)31 b(r)n(esear)n(ch)2044 4665
+y FG(The)d(System)h(R)g(optimizer)f([11])f(w)o(as)j(the)f(most)f
+(important)f(de-)2044 4764 y(v)o(elopment)g(in)j(query)f(optimization)f
+(research.)57 b(It)30 b(w)o(as)h(a)f(cost-)2044 4864
+y(based)19 b(centralized)f(relational)g(query)g(optimizer)h(and)f
+(introduced)2044 4964 y(a)g(v)n(ariety)e(of)h(k)o(e)o(y)g(concepts)f
+(lik)o(e)i(\252interesting\272)e(e)o(xpressions,)g(car)n(-)2044
+5063 y(dinality)35 b(estimation)g(using)h(selecti)n(vity)g(f)o(actors)f
+(and)h(dynamic)2044 5163 y(programming)14 b(with)j(pruning)e(of)i
+(search)g(space.)28 b(These)17 b(concepts)2044 5263 y(continue)h(to)j
+(be)f(important)f(in)h(query)f(optimizer)g(research.)p
+eop
+%%Page: 9 9
+9 8 bop -104 24 1935 4 v -104 3720 4 3696 v 66 714 a
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q1.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 611 m
+430 611 l
+420 846 m
+430 846 l
+420 1081 m
+430 1081 l
+420 1315 m
+430 1315 l
+420 1550 m
+430 1550 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 611 m
+2020 611 l
+2030 846 m
+2020 846 l
+2030 1081 m
+2020 1081 l
+2030 1315 m
+2020 1315 l
+2030 1550 m
+2020 1550 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 846 m
+440 846 l
+420 1315 m
+440 1315 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 846 m
+2010 846 l
+2030 1315 m
+2010 1315 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 846 m
+gsave
+348 846 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 1315 m
+gsave
+348 1315 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 418 m
+621 537 l
+822 661 l
+1023 789 l
+1225 909 l
+1426 1046 l
+1627 1183 l
+1828 1320 l
+2030 1449 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 537 30 0 360 arc
+gsave fill grestore
+stroke
+822 661 30 0 360 arc
+gsave fill grestore
+stroke
+1023 789 30 0 360 arc
+gsave fill grestore
+stroke
+1225 909 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1046 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1183 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1320 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1449 30 0 360 arc
+gsave fill grestore
+stroke
+420 421 m
+621 541 l
+822 670 l
+1023 801 l
+1225 935 l
+1426 1066 l
+1627 1229 l
+1828 1355 l
+2030 1504 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 451 m
+390 421 l
+420 391 l
+450 421 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 451 m
+390 421 l
+420 391 l
+450 421 l
+420 451 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 571 m
+591 541 l
+621 511 l
+651 541 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 571 m
+591 541 l
+621 511 l
+651 541 l
+621 571 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 700 m
+792 670 l
+822 640 l
+852 670 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 700 m
+792 670 l
+822 640 l
+852 670 l
+822 700 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 831 m
+993 801 l
+1023 771 l
+1053 801 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 831 m
+993 801 l
+1023 771 l
+1053 801 l
+1023 831 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 965 m
+1195 935 l
+1225 905 l
+1255 935 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 965 m
+1195 935 l
+1225 905 l
+1255 935 l
+1225 965 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 1096 m
+1396 1066 l
+1426 1036 l
+1456 1066 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 1096 m
+1396 1066 l
+1426 1036 l
+1456 1066 l
+1426 1096 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 1259 m
+1597 1229 l
+1627 1199 l
+1657 1229 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 1259 m
+1597 1229 l
+1627 1199 l
+1657 1229 l
+1627 1259 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+1828 1385 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+2030 1534 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 842 a Fz(\(a\))17 b(Query)h(1)974 714
+y @beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q2.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 611 m
+430 611 l
+420 846 m
+430 846 l
+420 1081 m
+430 1081 l
+420 1315 m
+430 1315 l
+420 1550 m
+430 1550 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 611 m
+2020 611 l
+2030 846 m
+2020 846 l
+2030 1081 m
+2020 1081 l
+2030 1315 m
+2020 1315 l
+2030 1550 m
+2020 1550 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 846 m
+440 846 l
+420 1315 m
+440 1315 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 846 m
+2010 846 l
+2030 1315 m
+2010 1315 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 846 m
+gsave
+348 846 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 1315 m
+gsave
+348 1315 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+420 418 m
+621 539 l
+822 664 l
+1023 783 l
+1225 906 l
+1426 1037 l
+1627 1176 l
+1828 1304 l
+2030 1451 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 539 30 0 360 arc
+gsave fill grestore
+stroke
+822 664 30 0 360 arc
+gsave fill grestore
+stroke
+1023 783 30 0 360 arc
+gsave fill grestore
+stroke
+1225 906 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1037 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1176 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1304 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1451 30 0 360 arc
+gsave fill grestore
+stroke
+420 412 m
+621 533 l
+822 661 l
+1023 796 l
+1225 926 l
+1426 1063 l
+1627 1212 l
+1828 1355 l
+2030 1504 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 442 m
+390 412 l
+420 382 l
+450 412 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 442 m
+390 412 l
+420 382 l
+450 412 l
+420 442 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 563 m
+591 533 l
+621 503 l
+651 533 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 563 m
+591 533 l
+621 503 l
+651 533 l
+621 563 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 691 m
+792 661 l
+822 631 l
+852 661 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 691 m
+792 661 l
+822 631 l
+852 661 l
+822 691 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 826 m
+993 796 l
+1023 766 l
+1053 796 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 826 m
+993 796 l
+1023 766 l
+1053 796 l
+1023 826 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 956 m
+1195 926 l
+1225 896 l
+1255 926 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 956 m
+1195 926 l
+1225 896 l
+1255 926 l
+1225 956 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 1093 m
+1396 1063 l
+1426 1033 l
+1456 1063 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 1093 m
+1396 1063 l
+1426 1033 l
+1456 1063 l
+1426 1093 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 1242 m
+1597 1212 l
+1627 1182 l
+1657 1212 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 1242 m
+1597 1212 l
+1627 1182 l
+1657 1212 l
+1627 1242 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+1828 1385 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+2030 1534 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 842 a(\(b\))f(Query)h(2)p -34 943 1816
+4 v 66 1632 a @beginspecial 50.187500 @llx 50.187500
+@lly 501.875000 @urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q3.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 401 m
+621 489 l
+822 578 l
+1023 672 l
+1225 762 l
+1426 865 l
+1627 969 l
+1828 1076 l
+2030 1574 l
+stroke
+420 401 30 0 360 arc
+gsave fill grestore
+stroke
+621 489 30 0 360 arc
+gsave fill grestore
+stroke
+822 578 30 0 360 arc
+gsave fill grestore
+stroke
+1023 672 30 0 360 arc
+gsave fill grestore
+stroke
+1225 762 30 0 360 arc
+gsave fill grestore
+stroke
+1426 865 30 0 360 arc
+gsave fill grestore
+stroke
+1627 969 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1076 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1574 30 0 360 arc
+gsave fill grestore
+stroke
+420 402 m
+621 485 l
+822 568 l
+1023 644 l
+1225 736 l
+1426 821 l
+1627 918 l
+1828 1019 l
+2030 1511 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 432 m
+390 402 l
+420 372 l
+450 402 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 432 m
+390 402 l
+420 372 l
+450 402 l
+420 432 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 515 m
+591 485 l
+621 455 l
+651 485 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 515 m
+591 485 l
+621 455 l
+651 485 l
+621 515 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 598 m
+792 568 l
+822 538 l
+852 568 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 598 m
+792 568 l
+822 538 l
+852 568 l
+822 598 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 674 m
+993 644 l
+1023 614 l
+1053 644 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 674 m
+993 644 l
+1023 614 l
+1053 644 l
+1023 674 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 766 m
+1195 736 l
+1225 706 l
+1255 736 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 766 m
+1195 736 l
+1225 706 l
+1255 736 l
+1225 766 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 851 m
+1396 821 l
+1426 791 l
+1456 821 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 851 m
+1396 821 l
+1426 791 l
+1456 821 l
+1426 851 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 948 m
+1597 918 l
+1627 888 l
+1657 918 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 948 m
+1597 918 l
+1627 888 l
+1657 918 l
+1627 948 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1049 m
+1798 1019 l
+1828 989 l
+1858 1019 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1049 m
+1798 1019 l
+1828 989 l
+1858 1019 l
+1828 1049 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1541 m
+2000 1511 l
+2030 1481 l
+2060 1511 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1541 m
+2000 1511 l
+2030 1481 l
+2060 1511 l
+2030 1541 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 1760 a(\(c\))f(Query)h(3)974 1632 y
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q4.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+420 400 m
+621 492 l
+822 575 l
+1023 669 l
+1225 759 l
+1426 866 l
+1627 962 l
+1828 1069 l
+2030 1578 l
+stroke
+420 400 30 0 360 arc
+gsave fill grestore
+stroke
+621 492 30 0 360 arc
+gsave fill grestore
+stroke
+822 575 30 0 360 arc
+gsave fill grestore
+stroke
+1023 669 30 0 360 arc
+gsave fill grestore
+stroke
+1225 759 30 0 360 arc
+gsave fill grestore
+stroke
+1426 866 30 0 360 arc
+gsave fill grestore
+stroke
+1627 962 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1069 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1578 30 0 360 arc
+gsave fill grestore
+stroke
+420 400 m
+621 484 l
+822 567 l
+1023 645 l
+1225 735 l
+1426 823 l
+1627 915 l
+1828 1024 l
+2030 1517 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+420 430 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 514 m
+591 484 l
+621 454 l
+651 484 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 514 m
+591 484 l
+621 454 l
+651 484 l
+621 514 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 597 m
+792 567 l
+822 537 l
+852 567 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 597 m
+792 567 l
+822 537 l
+852 567 l
+822 597 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 675 m
+993 645 l
+1023 615 l
+1053 645 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 675 m
+993 645 l
+1023 615 l
+1053 645 l
+1023 675 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 765 m
+1195 735 l
+1225 705 l
+1255 735 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 765 m
+1195 735 l
+1225 705 l
+1255 735 l
+1225 765 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 853 m
+1396 823 l
+1426 793 l
+1456 823 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 853 m
+1396 823 l
+1426 793 l
+1456 823 l
+1426 853 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 945 m
+1597 915 l
+1627 885 l
+1657 915 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 945 m
+1597 915 l
+1627 885 l
+1657 915 l
+1627 945 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1054 m
+1798 1024 l
+1828 994 l
+1858 1024 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1054 m
+1798 1024 l
+1828 994 l
+1858 1024 l
+1828 1054 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1547 m
+2000 1517 l
+2030 1487 l
+2060 1517 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1547 m
+2000 1517 l
+2030 1487 l
+2060 1517 l
+2030 1547 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 1760 a(\(d\))f(Query)h(4)p -34 1861
+V 66 2550 a @beginspecial 50.187500 @llx 50.187500 @lly
+501.875000 @urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q5.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 552 m
+430 552 l
+420 728 m
+430 728 l
+420 904 m
+430 904 l
+420 1081 m
+430 1081 l
+420 1257 m
+430 1257 l
+420 1433 m
+430 1433 l
+420 1609 m
+430 1609 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 552 m
+2020 552 l
+2030 728 m
+2020 728 l
+2030 904 m
+2020 904 l
+2030 1081 m
+2020 1081 l
+2030 1257 m
+2020 1257 l
+2030 1433 m
+2020 1433 l
+2030 1609 m
+2020 1609 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 728 m
+440 728 l
+420 1081 m
+440 1081 l
+420 1433 m
+440 1433 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 728 m
+2010 728 l
+2030 1081 m
+2010 1081 l
+2030 1433 m
+2010 1433 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 728 m
+gsave
+348 728 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1081 m
+gsave
+348 1081 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1433 m
+gsave
+348 1433 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 424 m
+956 511 l
+1493 671 l
+2030 1778 l
+stroke
+420 424 30 0 360 arc
+gsave fill grestore
+stroke
+956 511 30 0 360 arc
+gsave fill grestore
+stroke
+1493 671 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1778 30 0 360 arc
+gsave fill grestore
+stroke
+420 426 m
+956 522 l
+1493 688 l
+2030 1737 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 456 m
+390 426 l
+420 396 l
+450 426 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 456 m
+390 426 l
+420 396 l
+450 426 l
+420 456 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 552 m
+926 522 l
+956 492 l
+986 522 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 552 m
+926 522 l
+956 492 l
+986 522 l
+956 552 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 718 m
+1463 688 l
+1493 658 l
+1523 688 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 718 m
+1463 688 l
+1493 658 l
+1523 688 l
+1493 718 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1767 m
+2000 1737 l
+2030 1707 l
+2060 1737 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1767 m
+2000 1737 l
+2030 1707 l
+2060 1737 l
+2030 1767 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 2680 a(\(e\))f(Query)h(5)974 2550 y
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q6.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 386 l
+956 376 m
+956 386 l
+1493 376 m
+1493 386 l
+2030 376 m
+2030 386 l
+420 1785 m
+420 1775 l
+956 1785 m
+956 1775 l
+1493 1785 m
+1493 1775 l
+2030 1785 m
+2030 1775 l
+stroke
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+420 415 m
+956 490 l
+1493 633 l
+2030 1651 l
+stroke
+420 415 30 0 360 arc
+gsave fill grestore
+stroke
+956 490 30 0 360 arc
+gsave fill grestore
+stroke
+1493 633 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1651 30 0 360 arc
+gsave fill grestore
+stroke
+420 416 m
+956 493 l
+1493 631 l
+2030 1462 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 446 m
+390 416 l
+420 386 l
+450 416 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 446 m
+390 416 l
+420 386 l
+450 416 l
+420 446 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 523 m
+926 493 l
+956 463 l
+986 493 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 523 m
+926 493 l
+956 463 l
+986 493 l
+956 523 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 661 m
+1463 631 l
+1493 601 l
+1523 631 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 661 m
+1463 631 l
+1493 601 l
+1523 631 l
+1493 661 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1492 m
+2000 1462 l
+2030 1432 l
+2060 1462 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1492 m
+2000 1462 l
+2030 1432 l
+2060 1462 l
+2030 1492 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1178 2678 a(\(f\))f(Query)h(6)p -34 2780
+V 66 3470 a @beginspecial 50.187500 @llx 50.187500 @lly
+501.875000 @urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q7.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-83 1080 m
+gsave
+-83 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 425 m
+956 510 l
+1493 670 l
+2030 1637 l
+stroke
+420 425 30 0 360 arc
+gsave fill grestore
+stroke
+956 510 30 0 360 arc
+gsave fill grestore
+stroke
+1493 670 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1637 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 501 l
+1493 648 l
+2030 1470 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+420 450 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+956 531 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 678 m
+1463 648 l
+1493 618 l
+1523 648 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 678 m
+1463 648 l
+1493 618 l
+1523 648 l
+1493 678 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1500 m
+2000 1470 l
+2030 1440 l
+2060 1470 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1500 m
+2000 1470 l
+2030 1440 l
+2060 1470 l
+2030 1500 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 265 3597 a(\(g\))f(Query)h(7)974 3470 y
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q8.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+420 421 m
+956 504 l
+1493 650 l
+2030 1549 l
+stroke
+420 421 30 0 360 arc
+gsave fill grestore
+stroke
+956 504 30 0 360 arc
+gsave fill grestore
+stroke
+1493 650 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1549 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 502 l
+1493 647 l
+2030 1475 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+420 450 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 532 m
+926 502 l
+956 472 l
+986 502 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 532 m
+926 502 l
+956 472 l
+986 502 l
+956 532 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 677 m
+1463 647 l
+1493 617 l
+1523 647 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 677 m
+1463 647 l
+1493 617 l
+1523 647 l
+1493 677 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1505 m
+2000 1475 l
+2030 1445 l
+2060 1475 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1505 m
+2000 1475 l
+2030 1445 l
+2060 1475 l
+2030 1505 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 3597 a(\(h\))f(Query)h(8)p 1827 3720
+4 3696 v -104 3723 1935 4 v 1829 3740 19 3703 v -87 3740
+1935 19 v -39 3922 a FG(Figure)i(7:)29 b(Query)19 b(optimization)g
+(times)h(for)g(Q1)g(through)e(Q8)-29 4158 y(The)29 b(query)g(optimizer)
+g(in)h(R)849 4128 y Ff(\003)918 4158 y FG([3])g(w)o(orks)f(in)i
+(essentially)f(the)-112 4257 y(same)16 b(w)o(ay)g(as)g(that)g(of)g
+(System)g(R,)h(e)o(xcept)d(that)i(R)1322 4227 y Ff(\003)1378
+4257 y FG(is)g(a)h(distrib)n(uted)-112 4357 y(database)31
+b(system)i(which)f(introduces)f(some)h(subtle)g(complica-)-112
+4457 y(tions)20 b(in)g(its)h(query)e(optimizer)-5 b(.)-29
+4565 y(The)23 b(Starb)n(urst)h(query)f(optimizer)g([10])g(uses)i(rules)
+f(for)f(all)i(de-)-112 4665 y(cisions)i(that)g(need)f(to)h(be)g(tak)o
+(en)f(by)h(the)g(query)e(optimizer)-5 b(.)49 b(The)-112
+4764 y(rules)17 b(are)g(functional)e(in)j(nature)e(and)g(transform)g(a)
+i(gi)n(v)o(en)e(operator)-112 4864 y(tree)k(into)g(another)-5
+b(.)28 b(The)19 b(rules)i(are)f(commonly)e(those)i(that)g(re\257ect)
+-112 4964 y(relational)27 b(calculus)g(f)o(acts.)53 b(In)27
+b(Starb)n(urst,)j(the)d(query)g(re)n(writing)-112 5063
+y(phase)21 b(is)i(dif)n(ferent)e(from)g(the)h(optimization)f(phase.)35
+b(The)21 b(re)n(writ-)-112 5163 y(ing)13 b(phase)g(transforms)g(the)g
+(query)g(itself)h(into)g(equi)n(v)n(alent)e(operator)-112
+5263 y(trees)21 b(based)f(on)h(relational)f(calculus)g(rules.)31
+b(The)21 b(plan)f(optimiza-)2044 21 y(tion)e(phase)g(selects)h
+(algorithms)e(for)h(each)g(operator)f(in)h(the)g(opera-)2044
+120 y(tor)g(tree)g(that)h(is)g(obtained)e(after)h(re)n(writing.)28
+b(The)18 b(disadv)n(antage)e(of)2044 220 y(separating)21
+b(the)i(query)e(re)n(write)i(and)f(the)g(optimization)g(phases)g(is)
+2044 319 y(that)17 b(pruning)e(of)j(the)f(search)g(space)g(is)i(not)e
+(possible)g(during)e(query)2044 419 y(re)n(write,)k(since)i(the)f(re)n
+(write)g(phase)f(is)j(non-cost-based.)2127 519 y(Fre)o(ytag)13
+b([6])i(describes)f(a)h(rule-based)e(query)g(optimizer)h(similar)2044
+618 y(to)26 b(Starb)n(urst.)45 b(The)25 b(rules)h(are)g(based)f(on)g
+(LISP-lik)o(e)h(representa-)2044 718 y(tions)d(of)g(access)h(plans.)37
+b(The)23 b(rules)g(themselv)o(es)g(are)g(recursi)n(v)o(ely)2044
+818 y(de\256ned)j(on)g(smaller)h(e)o(xpressions)f(\(operator)f
+(trees\).)49 b(Although)2044 917 y(se)n(v)o(eral)23 b(e)o(xpressions)f
+(can)i(contain)f(a)h(common)e(sub-e)o(xpression,)2044
+1017 y(Fre)o(ytag)d(doesn')o(t)f(consider)g(the)i(possibility)g(of)f
+(sharing.)28 b(Expres-)2044 1116 y(sions)22 b(are)f(e)n(v)n(aluated)f
+(each)h(time)h(the)o(y)f(are)g(encountered.)30 b(This)22
+b(is)2044 1216 y(ob)o(viously)14 b(inef)n(\256cient.)27
+b(In)17 b(addition,)f(as)h(in)g(Starb)n(urst,)g(he)g(doesn')o(t)2044
+1316 y(consider)j(the)i(cost)f(transformations)e(inherent)i(in)g(an)o
+(y)g(query)f(op-)2044 1415 y(timizer;)g(rules)g(are)g(syntactic)g
+(transformation)e(rules.)2127 1515 y(EXODUS)j([9])g(pro)o(vides)f(an)h
+(optimizer)f(generator)f(which)i(ac-)2044 1615 y(cepts)j(a)g
+(rule-based)e(speci\256cation)h(of)g(the)h(data)g(model)f(as)h(input.)
+2044 1714 y(The)18 b(optimizer)g(generator)f(compiles)h(these)h(rules,)
+f(together)g(with)2044 1814 y(pre-de\256ned)d(rules,)k(to)f(generate)f
+(an)h(optimizer)f(for)g(the)h(particular)2044 1913 y(data)25
+b(model)g(and)g(set)h(of)f(operators.)44 b(Unlik)o(e)25
+b(Fre)o(ytag,)g(the)h(opti-)2044 2013 y(mizer)18 b(generator)g(for)g
+(EXODUS)h(allo)n(ws)h(for)e(C)i(code)f(along)f(with)2044
+2113 y(de\256nitions)28 b(of)h(ne)n(w)g(rules.)56 b(This)29
+b(allo)n(ws)g(the)g(database)g(imple-)2044 2212 y(mentor)17
+b(the)h(freedom)e(to)i(associate)g(an)o(y)f(action)h(with)g(a)g
+(particular)2044 2312 y(rule.)28 b(Operator)15 b(trees)j(in)f(EXODUS)h
+(are)f(constructed)f(bottom-up)2044 2412 y(from)j(pre)n(viously)f
+(constructed)h(trees.)2127 2511 y(The)14 b(V)-11 b(olcano)14
+b(optimizer)g(generator)f(project)h([7])g(e)n(v)n(olv)o(ed)f(from)2044
+2611 y(the)22 b(EXODUS)g(project.)33 b(It)22 b(is)h(dif)n(ferent)d
+(from)h(all)i(the)f(abo)o(v)o(e)e(op-)2044 2710 y(timizers)k(in)h(one)e
+(signi\256cant)h(w)o(ay:)38 b(it)25 b(is)g(a)g(top-do)n(wn)d(optimizer)
+2044 2810 y(compared)16 b(with)i(the)g(bottom-up)e(strate)o(gy)h(of)h
+(the)g(others.)28 b(Opera-)2044 2910 y(tor)16 b(trees)i(are)e
+(optimized)g(starting)g(from)g(the)h(root)f(while)h(sub-trees)2044
+3009 y(are)g(not)h(yet)g(optimized.)27 b(This)18 b(leads)g(to)g(a)g
+(constraint-dri)n(v)o(en)c(gen-)2044 3109 y(eration)23
+b(of)g(the)h(search)f(space.)40 b(While)25 b(this)f(method)f(results)h
+(in)g(a)2044 3209 y(tight)k(control)g(of)g(the)h(search)f(space,)i(it)g
+(is)f(uncon)m(v)o(entional)c(and)2044 3308 y(requires)16
+b(careful)g(attention)h(on)g(the)g(part)g(of)g(the)h(optimizer)e
+(imple-)2044 3408 y(mentor)j(to)h(ensure)f(that)h(le)o(gal)g(operator)e
+(trees)i(are)h(not)e(accidently)2044 3508 y(left)25 b(out)g(of)f(the)h
+(search)g(space.)43 b(W)-7 b(e)26 b(ha)n(v)o(e)e(used)h(V)-11
+b(olcano)24 b(as)i(our)2044 3607 y(back-end)18 b(search)i(engine.)2044
+3881 y FB(6)119 b(Conclusion)31 b(and)g(futur)n(e)f(w)o(ork)2044
+4067 y FG(Current)24 b(rule-based)f(query)h(optimizers)g(do)h(not)g
+(pro)o(vide)e(a)i(v)o(ery)2044 4167 y(intuiti)n(v)o(e)c(and)g
+(conceptually)f(streamlined)h(frame)n(w)o(ork)f(to)i(de\256ne)2044
+4266 y(rules)31 b(and)f(actions.)61 b(Our)30 b(e)o(xperiences)f(with)i
+(the)g(V)-11 b(olcano)30 b(op-)2044 4366 y(timizer)j(generator)f
+(suggest)h(that)h(its)h(model)e(of)g(rules)h(and)f(the)2044
+4466 y(e)o(xpression)17 b(of)h(these)h(rules)f(is)h(much)f(more)g
+(complicated)e(and)i(too)2044 4565 y(lo)n(w-le)n(v)o(el)25
+b(than)h(it)h(needs)e(to)i(be.)47 b(As)27 b(a)g(consequence,)e(rule)h
+(sets)2044 4665 y(in)k(V)-11 b(olcano)28 b(are)i(fragile,)h(hard)e(to)h
+(write,)i(and)d(deb)n(ug.)56 b(Similar)2044 4764 y(problems)16
+b(may)i(e)o(xist)g(in)g(other)f(contemporary)e(rule-based)h(query)2044
+4864 y(optimizers.)2127 4964 y(W)-7 b(e)21 b(belie)n(v)o(e)d(that)i
+(rule-based)e(query)g(optimizers)h(will)h(be)g(stan-)2044
+5063 y(dard)h(tools)i(of)f(future)f(database)h(systems.)36
+b(The)23 b(pragmatic)e(dif)n(\256-)2044 5163 y(culties)h(of)f(using)g
+(e)o(xisting)g(rule-based)f(optimizers)g(led)i(us)g(to)f(de-)2044
+5263 y(v)o(elop)f(Prairie,)h(an)g(e)o(xtensible)f(and)h(structured)e
+(algebraic)h(frame-)p eop
+%%Page: 10 10
+10 9 bop -112 21 a FG(w)o(ork)36 b(for)g(specifying)f(rules.)78
+b(Prairie)37 b(is)h(similar)f(to)g(e)o(xisting)-112 120
+y(optimizers)21 b(in)i(that)f(it)h(supports)f(both)f(transformation)f
+(rules)i(and)-112 220 y(implementation)g(rules.)42 b(Ho)n(we)n(v)o(er)m
+(,)23 b(Prairie)i(mak)o(es)f(se)n(v)o(eral)g(im-)-112
+319 y(pro)o(v)o(ements:)-50 503 y(1.)41 b(it)14 b(of)n(fers)e(a)i
+(conceptually)e(more)g(streamlined)h(model)f(for)h(rule)54
+603 y(speci\256cation;)-50 793 y(2.)41 b(rules)18 b(are)g
+(encapsulated,)e(there)i(are)g(no)g(\252hidden\272)e(operators)54
+893 y(or)j(\252hidden\272)g(algorithms;)-50 1083 y(3.)41
+b(implementation)19 b(hints)i(\(e.g.,)f(enforcers\))g(are)h(deduced)e
+(au-)54 1182 y(tomatically;)-50 1372 y(4.)41 b(and)19
+b(it)i(has)g(ef)n(\256cient)e(implementations.)-29 1556
+y(W)-7 b(e)26 b(ha)n(v)o(e)f(e)o(xplained)f(ho)n(w)h(the)h(\256rst)g
+(three)f(points)g(are)h(impor)n(-)-112 1656 y(tant)19
+b(for)g(simplifying)f(rule)h(speci\256cations)g(and)g(making)g(rule)g
+(sets)-112 1755 y(less)27 b(brittle)g(for)f(e)o(xtensibility)-5
+b(.)46 b(A)27 b(consequence)e(is)i(that)g(Prairie)-112
+1855 y(rules)20 b(are)h(simpler)g(and)f(more)g(rob)n(ust)h(than)f
+(rules)h(of)f(e)o(xisting)h(op-)-112 1955 y(timizers)j(\(e.g.,)h(V)-11
+b(olcano\).)41 b(W)-7 b(e)25 b(addressed)f(the)g(fourth)f(point)h(by)
+-112 2054 y(b)n(uilding)h(a)i(P2V)g(pre-processor)d(which)i(uses)h
+(sophisticated)f(al-)-112 2154 y(gorithms)e(to)j(compose)e(and)g
+(compact)g(a)i(Prairie)f(rule)g(set)h(into)e(a)-112 2253
+y(V)-11 b(olcano)22 b(rule)i(set.)41 b(T)-7 b(o)24 b(demonstrate)e(the)
+i(scalability)g(of)f(our)g(ap-)-112 2353 y(proach,)18
+b(we)j(re)n(wrote)e(the)i(TI)f(Open)g(OODB)h(rule)f(set)h(as)g(a)g
+(Prairie)-112 2453 y(rule)e(set,)h(generated)d(its)k(V)-11
+b(olcano)18 b(counterpart,)f(and)i(sho)n(wed)g(that)-112
+2552 y(the)g(performance)e(of)j(the)f(synthesized)g(V)-11
+b(olcano)19 b(rule)g(set)i(closely)-112 2652 y(matches)e(the)i
+(hand-crafted)c(V)-11 b(olcano)19 b(rule)h(set.)-29 2758
+y(Our)26 b(future)f(w)o(ork)h(will)h(concentrate)e(on)h(de)n(v)o
+(eloping)e(higher)n(-)-112 2857 y(le)n(v)o(el)13 b(abstractions)g
+(using)g(Prairie,)c(including)k(automatically)g(gen-)-112
+2957 y(erating)i(Prairie)i(rule)g(sets,)h(and)f(combining)d(multiple)i
+(Prairie)h(rule)-112 3056 y(sets)k(to)f(automatically)f(generate)g(ef)n
+(\256cient)h(optimizers.)-112 3369 y FB(Ackno)o(wledgments)-112
+3566 y FG(W)-7 b(e)31 b(wish)f(to)g(thank)f(T)-6 b(e)o(xas)29
+b(Instruments,)i(Inc.)e(for)g(making)g(the)-112 3666
+y(Open)h(OODB)h(source)g(code)f(a)n(v)n(ailable)g(to)h(us.)62
+b(Comments)30 b(by)-112 3766 y(Jos)-1 3765 y(\302)-6
+3766 y(e)20 b(Blak)o(ele)o(y)-5 b(,)19 b(Anne)g(Ngu,)g(V)-5
+b(i)n(v)o(ek)19 b(Singhal,)g(Thomas)f(W)-7 b(oo)20 b(and)-112
+3865 y(the)h(anon)o(ymous)d(referees)i(greatly)h(impro)o(v)o(ed)d(the)j
+(quality)g(of)g(the)-112 3965 y(paper)-5 b(.)-112 4278
+y FB(Refer)n(ences)-71 4475 y FG([1])40 b(D.)15 b(S.)h(Batory)-5
+b(.)19 b(Building)14 b(blocks)g(of)h(database)f(management)67
+4574 y(systems.)28 b(T)-6 b(echnical)18 b(Report)g(TR\26187\26123,)f
+(The)h(Uni)n(v)o(ersity)67 4674 y(of)i(T)-6 b(e)o(xas)20
+b(at)h(Austin,)f(February)e(1988.)-71 4864 y([2])40 b(Jos)178
+4863 y(\302)173 4864 y(e)e(A.)f(Blak)o(ele)o(y)-5 b(,)40
+b(W)m(illiam)d(J.)h(McK)n(enna,)i(and)c(Goetz)67 4964
+y(Graefe.)h(Experiences)21 b(b)n(uilding)h(the)h(Open)f(OODB)i(query)67
+5063 y(optimizer)-5 b(.)28 b(In)19 b FF(Pr)l(oceedings)f(1993)h(A)n(CM)
+h(SIGMOD)f(Inter)n(-)67 5163 y(national)27 b(Confer)m(ence)h(on)g(Mana)
+o(g)o(ement)f(of)i(Data)p FG(,)h(pages)67 5263 y(287\261296,)17
+b(W)-7 b(ashington,)20 b(May)f(1993.)2085 21 y([3])41
+b(Dean)33 b(Daniels,)k(P)o(atricia)c(Selinger)m(,)j(Laura)c(Haas,)37
+b(Bruce)2224 120 y(Lindsay)-5 b(,)24 b(C.)i(Mohan,)f(Adrian)g(W)-7
+b(alk)o(er)m(,)26 b(and)f(P)o(aul)g(W)m(ilms.)2224 220
+y(An)13 b(introduction)e(to)j(distrib)n(uted)f(query)f(compilation)f
+(in)j(R)3953 190 y Ff(\003)3992 220 y FG(.)2224 319 y(In)22
+b FF(Pr)l(oceedings)g(2nd)g(International)e(Confer)m(ence)i(on)h(Dis-)
+2224 419 y(trib)n(uted)14 b(Databases)p FG(,)e(pages)i(291\261309,)c
+(Berlin,)k(September)2224 519 y(1982.)2085 685 y([4])41
+b(Dinesh)31 b(Das)g(and)g(Don)g(Batory)-5 b(.)57 b(Prairie:)52
+b(An)31 b(algebraic)2224 784 y(frame)n(w)o(ork)38 b(for)i(rule)g
+(speci\256cation)g(in)h(query)e(optimiz-)2224 884 y(ers.)72
+b(In)36 b FF(Pr)l(oceedings)f(of)i(the)f(W)-8 b(orkshop)36
+b(on)g(Database)2224 984 y(Query)14 b(Optimizer)h(Gener)o(ator)o(s)f
+(and)g(Rule-Based)f(Optimiz-)2224 1083 y(er)o(s)p FG(,)21
+b(pages)f(139\261154,)d(Dallas,)j(September)f(1993.)2085
+1249 y([5])41 b(Dinesh)31 b(Das)i(and)f(Don)g(Batory)-5
+b(.)60 b(Prairie:)53 b(A)33 b(rule)e(spec-)2224 1349
+y(i\256cation)e(frame)n(w)o(ork)f(for)h(query)f(optimizers.)54
+b(T)-6 b(echnical)2224 1449 y(Report)22 b(TR)i(94\26116,)e(The)g(Uni)n
+(v)o(ersity)g(of)h(T)-6 b(e)o(xas)23 b(at)g(Austin,)2224
+1548 y(May)d(1994.)2085 1714 y([6])41 b(Johann)15 b(Christoph)h(Fre)o
+(ytag.)23 b(A)18 b(rule-based)d(vie)n(w)i(of)f(query)2224
+1814 y(optimization.)22 b(In)17 b FF(Pr)l(oceedings)f(1987)g(A)n(CM)i
+(SIGMOD)f(In-)2224 1913 y(ternational)12 b(Confer)m(ence)g(on)h(Mana)o
+(g)o(ement)f(of)h(Data)p FG(,)h(pages)2224 2013 y(173\261180,)j(San)j
+(Francisco,)f(May)h(1987.)2085 2179 y([7])41 b(Goetz)c(Graefe.)74
+b(V)-11 b(olcano,)41 b(an)c(e)o(xtensible)g(and)g(parallel)2224
+2279 y(query)25 b(e)n(v)n(aluation)h(system.)48 b(T)-6
+b(echnical)26 b(Report)h(CU\261CS\261)2224 2378 y(481\26190,)15
+b(Uni)n(v)o(ersity)g(of)i(Colorado)e(at)j(Boulder)m(,)e(July)h(1990.)
+2085 2544 y([8])41 b(Goetz)25 b(Graefe.)44 b(Query)26
+b(e)n(v)n(aluation)e(techniques)h(for)g(lar)o(ge)2224
+2644 y(databases.)58 b FF(A)n(CM)32 b(Computing)e(Surve)n(ys)p
+FG(,)k(25\(2\):73\261170,)2224 2744 y(June)20 b(1993.)2085
+2910 y([9])41 b(Goetz)32 b(Graefe)g(and)g(Da)n(vid)h(J.)g(DeW)m(itt.)63
+b(The)33 b(EXODUS)2224 3009 y(optimizer)23 b(generator)-5
+b(.)38 b(In)24 b FF(Pr)l(oceedings)f(1987)g(A)n(CM)i(SIG-)2224
+3109 y(MOD)40 b(International)e(Confer)m(ence)h(on)h(Mana)o(g)o(ement)e
+(of)2224 3209 y(Data)p FG(,)19 b(pages)h(387\261394,)d(San)j
+(Francisco,)g(May)g(1987.)2044 3375 y([10])40 b(L.)23
+b(M.)g(Haas,)h(J.)g(C.)g(Fre)o(ytag,)f(G.)g(M.)h(Lohman,)e(and)g(H.)i
+(Pi-)2224 3474 y(rahesh.)31 b(Extensible)20 b(query)g(processing)g(in)i
+(Starb)n(urst.)32 b(Re-)2224 3574 y(search)20 b(Report)g(RJ)i(6610,)e
+(IBM)h(Almaden)e(Research)i(Cen-)2224 3674 y(ter)m(,)e(December)g
+(1988.)2044 3840 y([11])40 b(P)-9 b(.)33 b(G.)g(Selinger)m(,)h(M.)f(M.)
+g(Astrahan,)i(D.)e(D.)g(Chamberlin,)2224 3939 y(R.)17
+b(A.)g(Lorie,)g(and)f(T)-6 b(.)17 b(G.)g(Price.)24 b(Access)18
+b(path)e(selection)h(in)g(a)2224 4039 y(relational)24
+b(database)g(management)f(system.)41 b(In)25 b FF(Pr)l(oceed-)2224
+4138 y(ings)34 b(1979)f(A)n(CM)i(SIGMOD)g(International)d(Confer)m
+(ence)2224 4238 y(on)26 b(Mana)o(g)o(ement)f(of)i(Data)p
+FG(,)h(pages)f(23\26134,)f(Boston,)i(May)2224 4338 y(1979.)2044
+4504 y([12])40 b(Michael)18 b(Stonebrak)o(er)e(and)i(La)o(wrence)g(A.)h
+(Ro)n(we.)26 b(The)18 b(de-)2224 4603 y(sign)g(of)g(Postgres.)27
+b(In)18 b FF(Pr)l(oceedings)f(1986)g(A)n(CM)i(SIGMOD)2224
+4703 y(International)38 b(Confer)m(ence)h(on)h(Mana)o(g)o(ement)f(of)i
+(Data)p FG(,)2224 4803 y(pages)19 b(340\261355,)e(W)-7
+b(ashington,)20 b(May)g(1986.)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/macros/latex/contrib/utthesis/ICDE-11/related.tex b/macros/latex/contrib/utthesis/ICDE-11/related.tex
new file mode 100644
index 0000000000..76f83db64e
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/related.tex
@@ -0,0 +1,59 @@
+\section{Related research}
+\label{sec:related}
+
+The System R optimizer \cite{Seli79} was the most important development
+in query optimization research. It was a cost-based centralized
+relational query optimizer and introduced a variety of key concepts
+like ``interesting'' expressions, cardinality estimation using
+selectivity factors and dynamic programming with pruning of search
+space. These concepts continue to be important in query optimizer
+research.
+
+The query optimizer in R$^*$ \cite{Dani82} works in essentially
+the same way as that of System R, except that R$^*$ is a distributed
+database system which introduces some subtle complications in its query
+optimizer.
+
+The Starburst query optimizer \cite{Haas88} uses rules for all
+decisions that need to be taken by the query optimizer. The rules are
+functional in nature and transform a given operator tree into another.
+The rules are commonly those that reflect relational calculus facts.
+In Starburst, the query rewriting phase is different from the
+optimization phase. The rewriting phase transforms the query itself
+into equivalent operator trees based on relational calculus rules. The
+plan optimization phase selects algorithms for each operator in the
+operator tree that is obtained after rewriting. The disadvantage of
+separating the query rewrite and the optimization phases is that
+pruning of the search space is not possible during query rewrite, since
+the rewrite phase is non-cost-based.
+
+Freytag \cite{Frey87a} describes a rule-based query optimizer similar
+to Starburst. The rules are based on LISP-like representations of
+access plans. The rules themselves are recursively defined on smaller
+expressions (operator trees). Although several expressions can contain
+a common sub-expression, Freytag doesn't consider the possibility of
+sharing. Expressions are evaluated each time they are encountered.
+This is obviously inefficient. In addition, as in Starburst, he
+doesn't consider the cost transformations inherent in any query
+optimizer; rules are syntactic transformation rules.
+
+EXODUS \cite{Grae87b} provides an optimizer generator which accepts a
+rule-based specification of the data model as input. The optimizer
+generator compiles these rules, together with pre-defined rules, to
+generate an optimizer for the particular data model and set of
+operators. Unlike Freytag, the optimizer generator for EXODUS allows
+for C code along with definitions of new rules. This allows the
+database implementor the freedom to associate any action with a
+particular rule. Operator trees in EXODUS are constructed bottom-up
+from previously constructed trees.
+
+The Volcano optimizer generator project \cite{Grae90b} evolved from the
+EXODUS project. It is different from all the above optimizers in one
+significant way: it is a top-down optimizer compared with the bottom-up
+strategy of the others. Operator trees are optimized starting from the
+root while sub-trees are not yet optimized. This leads to a
+constraint-driven generation of the search space. While this method
+results in a tight control of the search space, it is unconventional
+and requires careful attention on the part of the optimizer implementor
+to ensure that legal operator trees are not accidently left out of
+the search space. We have used Volcano as our back-end search engine.
diff --git a/macros/latex/contrib/utthesis/ICDE-11/reprint.ps b/macros/latex/contrib/utthesis/ICDE-11/reprint.ps
new file mode 100644
index 0000000000..9ff44af284
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/reprint.ps
@@ -0,0 +1,6693 @@
+%!PS-Adobe-2.0
+%%Creator: dvips 5.55 Copyright 1986, 1994 Radical Eye Software
+%%Title: paper.dvi
+%%CreationDate: Mon Mar 20 11:33:02 1995
+%%Pages: 10
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: Times-Roman Times-Italic Times-Bold Courier
+%%EndComments
+%DVIPSCommandLine: dvips -D 600 paper -o
+%DVIPSParameters: dpi=600, comments removed
+%DVIPSSource: TeX output 1995.03.20:1132
+%%BeginProcSet: tex.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]}
+if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage
+userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
+B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
+4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
+p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pstricks.pro
+% PostScript prologue for pstricks.tex.
+% Created 1993/3/12. Source file was pstricks.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@Dict 200 dict def tx@Dict begin
+/ADict 25 dict def
+/CM { matrix currentmatrix } bind def
+/SLW /setlinewidth load def
+/CLW /currentlinewidth load def
+/CP /currentpoint load def
+/ED { exch def } bind def
+/L /lineto load def
+/T /translate load def
+/Atan { /atan load stopped { pop pop 0 } if } def
+/Div { dup 0 eq { pop } { div } ifelse } def
+/NET { neg exch neg exch T } def
+/Pyth { dup mul exch dup mul add sqrt } def
+/PtoC { 2 copy cos mul 3 1 roll sin mul } def
+/PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def }
+def
+/PathLength { flattenpath /z 0 def { /y1 ED /x1 ED /y2 y1 def /x2 x1 def
+} { /y ED /x ED PathLength@ } {} { /y y2 def /x x2 def PathLength@ }
+pathforall z } def
+/STP { .996264 dup scale } def
+/STV { SDict begin normalscale end STP } def
+/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def
+PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y
+mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul
+/y ED x mul /x ED x 0 eq y 0 eq and { /x 1 def /y 1 def } if [ y x ] 1 a
+sub y mul setdash stroke } def
+/DotLine { /b PathLength def /a ED /z ED /y CLW def /z y z add def a 0 gt
+{ /b b a div def } { a 0 eq { /b b y sub def } { a -3 eq { /b b y add
+def } if } ifelse } ifelse [ 0 b b z Div round Div dup 0 le { pop 1 } if
+] a 0 gt { 0 } { y 2 div a -2 gt { neg } if } ifelse setdash 1
+setlinecap stroke } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap n { currentstrokeadjust == x1 y1 moveto x2 y1 L
+stroke /y1 y1 a add def } repeat grestore } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap systemdict /currentstrokeadjust known {
+currentstrokeadjust } { false } ifelse { /t { } def } { /t { transform
+0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }
+bind def } ifelse n { x1 y1 t moveto x2 y1 t L stroke /y1 y1 a add def }
+repeat grestore } def
+/BeginArrow { ADict begin /@mtrx CM def gsave 2 copy T 2 index sub neg
+exch 3 index sub exch Atan rotate newpath } def
+/EndArrow { @mtrx setmatrix CP grestore end } def
+/Arrow { CLW mul add dup 2 div /w ED mul dup /h ED mul /a ED { 0 h T 1 -1
+scale } if w neg h moveto 0 0 L w h L w neg a neg rlineto gsave fill
+grestore } def
+/Tbar { CLW mul add /z ED z -2 div CLW 2 div moveto z 0 rlineto stroke 0
+CLW moveto } def
+/Bracket { CLW mul add dup CLW sub 2 div /x ED mul CLW add /y ED /z CLW 2
+div def x neg y moveto x neg CLW 2 div L x CLW 2 div L x y L stroke 0
+CLW moveto } def
+/RoundBracket { CLW mul add dup 2 div /x ED mul /y ED /mtrx CM def 0 CLW
+2 div T x y mul 0 ne { x y scale } if 1 1 moveto .85 .5 .35 0 0 0
+curveto -.35 0 -.85 .5 -1 1 curveto mtrx setmatrix stroke 0 CLW moveto }
+def
+/Shadow { [ { /moveto load } { /lineto load } { /curveto load } {
+/closepath load } pathforall ] cvx newpath 3 1 roll T exec } def
+/SD { 0 360 arc fill } def
+/SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def
+/ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def
+/SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore }
+def
+/NArray { aload length 2 div dup dup cvi eq not { exch pop } if /n exch
+cvi def } def
+/NArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop } if
+f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def
+/Line { NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub
+def n { Lineto } repeat CP 4 2 roll ArrowB L pop pop } if } def
+/Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 }
+ifelse { pop } repeat a } def
+/CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq
+and { pop pop /n n 1 sub def } if } def
+/Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop }
+repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1
+ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1
+moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto
+Lineto pop pop closepath } ifelse } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1
+def CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp
+mul dy1 l0 c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos
+abs b exp a mul dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def
+/y2 y l0 dy mul m mul sub def /dx l1 dx mul m mul neg def /dy l1 dy mul
+m mul neg def } def
+/IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if }
+ifelse /a a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def }
+def
+/BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def
+/NC { CC x1 y1 x2 y2 x y curveto } def
+/EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def
+/BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def
+/NAC { x2 y2 x y curveto CC x1 y1 } def
+/EAC { x2 y2 x y ArrowB curveto pop pop } def
+/OpenCurve { NArray n 3 lt { n { pop pop } repeat } { BOC /n n 3 sub def
+n { NC } repeat EOC } ifelse } def
+/AltCurve { { false NArray n 2 mul 2 roll [ n 2 mul 3 sub 1 roll ] aload
+/Points ED n 2 mul -2 roll } { false NArray } ifelse n 4 lt { n { pop
+pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse } def
+/ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt {
+CheckClosed } if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC }
+repeat closepath pop pop } ifelse } def
+/EndDot { { /z DS def } { /z 0 def } ifelse /b ED 0 z DS SD b { 0 z DS
+CLW sub SD } if 0 DS z add CLW 4 div sub moveto } def
+/Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto
+x1 y1 lineto closepath } def
+/OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1
+y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div
+exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse
+/b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto
+x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath }
+ifelse } def
+/Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add
+/y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq {
+pop pop Rect } { OvalFrame } ifelse } def
+/Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1
+sub 3 div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA
+x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0
+y0 x0 2 mul x1 sub y1 ] def } def
+/Grid { /a 4 string def /b ED /d ED /n ED cvi dup 1 lt { pop 1 } if /c ED
+c div dup 0 eq { pop 1 } if /cy ED c div dup 0 eq { pop 1 } if /cx ED cy
+div cvi /y ED cx div cvi /x ED cy div cvi /y2 ED cx div cvi /x2 ED cy
+div cvi /y1 ED cx div cvi /x1 ED /h y2 y1 sub 0 gt { 1 } { -1 } ifelse
+def /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def b 0 gt { /z1 b 4 div CLW 2
+div add def /Helvetica findfont b scalefont setfont /b b .95 mul CLW 2
+div add def } if gsave n 0 gt { 1 setlinecap [ 0 cy n div ] 0 setdash }
+{ 2 setlinecap } ifelse /c x1 def /i 500 w mul x1 add def /e y cy mul
+def /f y1 cy mul def /g y2 cy mul def x1 cx mul 0 T { newpath 0 e moveto
+b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1} {z1 z2
+add neg} ifelse h 0 gt {b neg} {z1} ifelse rmoveto show grestore } if 0
+f moveto 0 g L stroke cx w mul 0 T c x2 eq c i eq or {exit} if /c c w
+add def } loop grestore gsave n 0 gt { 1 setlinecap [ 0 cx n div ] 0
+setdash } { 2 setlinecap } ifelse /c y1 def /i 500 h mul y1 add def /e x
+cx mul def /f x1 cx mul def /g x2 cx mul def 0 y1 cy mul T { newpath e 0
+moveto b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1 z2
+add neg} {z1} ifelse h 0 gt {z1} {b neg} ifelse rmoveto show grestore }
+if f 0 moveto g 0 L stroke 0 cy h mul T c y2 eq c i eq or {exit} if /c c
+h add def } loop grestore } def
+/ArcArrow { /d ED /b ED /a ED gsave newpath 0 -1000 moveto clip newpath 0
+1 0 0 b grestore c mul /e ED pop pop pop r a e d PtoC y add exch x add
+exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c
+mul neg d } def
+/Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def
+/Rot { CP CP translate 3 -1 roll neg rotate NET } def
+/PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def
+/PutBegin { /lmtrx [ tx@Dict /lmtrx known { lmtrx aload pop } if CM ] def
+CP 4 2 roll T moveto } def
+/PutEnd { CP /lmtrx [ lmtrx aload pop setmatrix ] def moveto } def
+/Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s
+abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b
+div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } {
+h1 abs h sub dup s mul abs } ifelse } def
+/UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s
+mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q
+{ x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add
+exch } def
+/BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { CP OLUnit T
+moveto /IfVisible true def } if } { IfVisible { CP OLUnit NET moveto
+/IfVisible false def } if } ifelse } def
+/InitOL { /OLUnit [ gsave CM STV 2890.79999 dup moveto setmatrix CP
+grestore ] cvx def /BOL { BeginOL } def /IfVisible true def } def
+end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pst-node.pro
+% PostScript prologue for pst-node.tex.
+% Created 1993/3/12. Source file was pst-node.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@NodeDict 200 dict def tx@NodeDict begin
+/NewNode { gsave /next ED dict dup 3 -1 roll ED begin tx@Dict begin STV
+CP T exec end /NodeMtrx CM def next end grestore } def
+/InitPnode { /Y ED /X ED /NodePos { Nodesep Cos mul Nodesep Sin mul } def
+} def
+/InitCnode { /r ED /Y ED /X ED /NodePos { Nodesep r add dup Cos mul exch
+Sin mul } def } def
+/GetRnodePos { Cos 0 gt { /dx r Nodesep add def } { /dx l Nodesep sub def
+} ifelse Sin 0 gt { /dy u Nodesep add def } { /dy d Nodesep sub def }
+ifelse dx Sin mul abs dy Cos mul abs gt { dy Cos mul Sin div dy } { dx
+dup Sin mul Cos Div } ifelse } def
+/InitRnode { /r ED r mul neg /l ED /r r l add def /X l neg def { neg /d
+ED /u ED /Y 0 def } { neg /Y ED Y sub /u ED u mul neg /d ED /u u d add
+def /Y Y d sub def } ifelse /NodePos { GetRnodePos } def } def
+/InitRNode { /Y ED /X ED /r ED /X r 2 div X add def /r r X sub def /l X
+neg def Y add neg /d ED Y sub /u ED /NodePos { GetRnodePos } def } def
+/GetOnodePos { /ww w Nodesep add def /hh h Nodesep add def Sin ww mul Cos
+hh mul Atan dup cos ww mul exch sin hh mul } def
+/GetCenter { begin X Y NodeMtrx transform CM itransform end } def
+/GetAngle { nodeA GetCenter nodeB GetCenter 3 -1 roll sub 3 1 roll sub
+neg Atan } def
+/GetEdge { begin /Nodesep ED dup 1 0 NodeMtrx dtransform CM idtransform
+exch atan sub dup sin /Sin ED cos /Cos ED NodePos Y add exch X add exch
+NodeMtrx transform CM itransform end 4 2 roll 1 index 0 eq { pop pop } {
+2 copy 5 2 roll cos mul add 4 1 roll sin mul sub exch } ifelse } def
+/GetPos { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED OffsetB
+AngleB NodesepB nodeB GetEdge /y2 ED /x2 ED } def
+/InitNC { /nodeB ED /nodeA ED /NodesepB ED /NodesepA ED /OffsetB ED
+/OffsetA ED tx@NodeDict nodeA known tx@NodeDict nodeB known and dup {
+/nodeA nodeA load def /nodeB nodeB load def } if } def
+/LineMP { 4 copy 1 t sub mul exch t mul add 3 1 roll 1 t sub mul exch t
+mul add exch 6 2 roll sub 3 1 roll sub Atan } def
+/NCCoor { GetAngle /AngleA ED /AngleB AngleA 180 add def GetPos /LPutVar
+[ x2 x1 y2 y1 ] cvx def /LPutPos { LPutVar LineMP } def x1 y1 x2 y2 }
+def
+/NCLine { NCCoor tx@Dict begin ArrowB 4 2 roll ArrowA lineto end } def
+/BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED
+/t ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3
+mul cx sub def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx
+sub def /ay y3 y0 sub cy sub by sub def ax t 3 exp mul bx t t mul mul
+add cx t mul add x0 add ay t 3 exp mul by t t mul mul add cy t mul add
+y0 add 3 ay t t mul mul mul 2 by t mul mul add cy add 3 ax t t mul mul
+mul 2 bx t mul mul add cx add atan } def
+/GetArms { /x1a armA AngleA cos mul x1 add def /y1a armA AngleA sin mul
+y1 add def /x2a armB AngleB cos mul x2 add def /y2a armB AngleB sin mul
+y2 add def } def
+/NCCurve { GetPos x1 x2 sub y1 y2 sub Pyth 2 div dup 3 -1 roll mul /armA
+ED mul /armB ED GetArms x1a y1a x1 y1 tx@Dict begin ArrowA end x2a y2a
+x2 y2 tx@Dict begin ArrowB end curveto /LPutVar [ x1 y1 x1a y1a x2a y2a
+x2 y2 ] cvx def /LPutPos { t LPutVar BezierMidpoint } def } def
+/AnglesMP { LPutVar t 3 gt { /t t 3 sub def } { t 2 gt { /t t 2 sub def
+10 -2 roll } { t 1 gt { /t t 1 sub def 10 -4 roll } { 10 4 roll } ifelse
+} ifelse } ifelse 6 { pop } repeat 3 -1 roll exch LineMP } def
+/NCAngles { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform exch pop mtrx itransform /y0 ED /x0
+ED mark armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1a y1a armA 0 ne { x1 y1 }
+if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a y2a x0 y0 x1a y1a
+x1 y1 ] cvx def /LPutPos { AnglesMP } def } def
+/NCAngle { GetPos /x2a armB AngleB cos mul x2 add def /y2a armB AngleB
+sin mul y2 add def /mtrx AngleA matrix rotate def x2a y2a mtrx transform
+pop x1 y1 mtrx transform exch pop mtrx itransform /y0 ED /x0 ED mark
+armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1 y1 tx@Dict begin false Line end
+/LPutVar [ x2 y2 x2 y2 x2a y2a x0 y0 x1 y1 ] cvx def /LPutPos { AnglesMP
+} def } def
+/NCBar { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform pop sub dup 0 mtrx itransform 3 -1
+roll 0 gt { /y2a exch y2a add def /x2a exch x2a add def } { /y1a exch
+neg y1a add def /x2a exch neg x2a add def } ifelse mark x2 y2 x2a y2a
+x1a y1a x1 y1 tx@Dict begin false Line end /LPutVar [ x2 y2 x2 y2 x2a
+y2a x1a y1a x1 y1 ] cvx def /LPutPos { LPutVar AnglesMP } def } def
+/NCDiag { GetPos GetArms mark x2 y2 x2a y2a x1a y1a x1 y1 tx@Dict begin
+false Line end /LPutVar [ x2 y2 x2 y2 x2a y2a x1a y1a x1 y1 ] cvx def
+/LPutPos { AnglesMP } def } def
+/NCDiagg { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED /x1a armA
+AngleA cos mul x1 add def /y1a armA AngleA sin mul y1 add def nodeB
+GetCenter y1a sub exch x1a sub Atan 180 add /AngleB ED OffsetB AngleB
+NodesepB nodeB GetEdge /y2 ED /x2 ED mark x2 y2 x1a y1a x1 y1 tx@Dict
+begin false Line end /LPutVar [ x2 y2 x2 y2 x2 y2 x1a y1a x1 y1] cvx def
+/LPutPos { AnglesMP } def } def
+/LoopMP { /t t abs def [ LPutVar ] length 2 div 1 sub dup t lt { /t ED }
+{ pop } ifelse mark LPutVar t cvi { /t t 1 sub def pop pop } repeat
+counttomark 1 add 4 roll cleartomark 3 -1 roll exch LineMP } def
+/NCLoop { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform loopsize add /y1b ED /x1b ED /x2b x2a y2a mtrx transform pop
+def x2b y1b mtrx itransform /y2b ED /x2b ED x1b y1b mtrx itransform /y1b
+ED /x1b ED mark armB 0 ne { x2 y2 } if x2a y2a x2b y2b x1b y1b x1a y1a
+armA 0 ne { x1 y1 } if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a
+y2a x2b y2b x1b y1b x1a y1a x1 y1 ] cvx def /LPutPos { LoopMP } def }
+def
+/NCCircle { nodeA GetCenter 0 0 NodesepA nodeA GetEdge pop 3 1 roll /Y ED
+/X ED X sub 2 div dup 2 exp r r mul sub abs sqrt atan 2 mul /a ED r
+AngleA 90 add PtoC Y add exch X add exch 2 copy /LPutVar [ 4 2 roll r a
+] def /LPutPos { LPutVar aload pop t 360 mul add dup 5 1 roll 90 sub
+PtoC 3 -1 roll add 3 1 roll add exch 3 -1 roll } def r AngleA 90 sub a
+add AngleA 270 add a sub tx@Dict begin /angleB ED /angleA ED /r ED /c
+57.2957 r Div def /y ED /x ED } def
+/LPutCoor { tx@NodeDict /LPutPos known { gsave LPutPos tx@Dict begin
+/langle ED CM 3 1 roll STV CP 3 -1 roll sub neg 3 1 roll sub exch moveto
+setmatrix CP end grestore } { 0 0 tx@Dict /langle 0 def end } ifelse }
+def
+end
+%%EndProcSet
+%%BeginProcSet: texps.pro
+TeXDict begin /rf{findfont dup length 1 add dict begin{1 index /FID ne 2
+index /UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics
+exch def dict begin Encoding{exch dup type /integertype ne{pop pop 1 sub
+dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}
+ifelse}forall Metrics /Metrics currentdict end def[2 index currentdict
+end definefont 3 -1 roll makefont /setfont load]cvx def}def
+/ObliqueSlant{dup sin S cos div neg}B /SlantFont{4 index mul add}def
+/ExtendFont{3 -1 roll mul exch}def /ReEncodeFont{/Encoding exch def}def
+end
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale false def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+%%EndProcSet
+TeXDict begin @defspecial
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+@fedspecial end TeXDict begin
+40258431 52099146 1000 600 600
+(/v/ahhnold/v3/ddas/research/papers/ICDE-11/paper.dvi)
+@start /Fa 188[28 67[{}1 41.666668 /Times-Italic rf /Fb
+1 60 df<38FEFEFFFFFF3B0303030706060E0C1C3830706008147A8614>59
+D E /Fc 7 57 df<003FC00000FFF00003E07C0007C03E000F801F000F000F001E000780
+1E0007803E0007C03E0007C07C0003E07C0003E07C0003E07C0003E07C0003E0FC0003F0
+FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0
+FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F07C0003E07C0003E07C0003E0
+7E0007E03E0007C03E0007C03E0007C01F000F800F000F000F801F0007C03E0003F0FC00
+00FFF000003FC0001C2D7DAB23>48 D<000C00003C00007C0003FC00FFFC00FC7C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000FE007FFF
+FE7FFFFE172C7AAB23>I<007F800001FFF0000780FC000E003F001C001F8038000FC070
+000FC0600007E0F00007E0FC0007F0FE0007F0FE0003F0FE0003F0FE0003F07C0007F000
+0007F0000007F0000007E000000FE000000FC000001FC000001F8000003F0000007E0000
+007C000000F8000001F0000003E0000007C000000F8000001E0000003C00000078000000
+F0003000E0003001C0003003800060070000600E0000E01FFFFFE03FFFFFE07FFFFFC0FF
+FFFFC0FFFFFFC01C2C7DAB23>I<003FC00001FFF00007C0FC000E007E001C003F001C00
+1F803F001FC03F001FC03F800FC03F000FC03F000FC00C001FC000001FC000001F800000
+1F8000003F0000003E0000007C000000F8000003F00000FFC00000FFF0000000FC000000
+3F0000001F8000001FC000000FC000000FE000000FE0000007F0000007F0380007F07C00
+07F0FE0007F0FE0007F0FE0007F0FE000FE0F8000FE060000FC070001FC038001F801E00
+3F000780FC0001FFF000007FC0001C2D7DAB23>I<00000E0000000E0000001E0000003E
+0000003E0000007E000000FE000000FE000001BE000003BE0000033E0000063E00000E3E
+00000C3E0000183E0000383E0000303E0000603E0000E03E0000C03E0001803E0003803E
+0003003E0006003E000E003E000C003E0018003E0038003E0030003E0060003E00E0003E
+00FFFFFFFCFFFFFFFC00003E0000003E0000003E0000003E0000003E0000003E0000003E
+0000003E0000003E0000007F00001FFFFC001FFFFC1E2D7EAC23>I<0C0001800FC01F80
+0FFFFF000FFFFE000FFFFC000FFFF0000FFFC0000C7E00000C0000000C0000000C000000
+0C0000000C0000000C0000000C0000000C0000000C1FC0000C7FF8000DE07C000F801F00
+0F001F800E000F800C0007C0000007E0000007E0000003E0000003F0000003F0000003F0
+000003F0780003F0FC0003F0FC0003F0FC0003F0FC0003F0F80007E0E00007E0600007C0
+70000FC038000F801C001F000E003E000780F80001FFE000007F80001C2D7DAB23>I<00
+1FC00000FFF00003E07C0007801E000F000F001E0007801E0007803C0003C03C0003C03C
+0003C03C0003C03E0003C03E0007C03F0007801FC00F801FE00F001FF81E000FFC3C0007
+FFF80003FFE00000FFE000003FF80000FFFC0003C7FF000783FF801F00FFC01E003FC03C
+001FE07C0007E0780003F0F80003F0F00001F0F00000F0F00000F0F00000F0F00000F0F8
+0000E0780001E07C0001C03C0003C01E0007800F800F0007E03C0001FFF000003FC0001C
+2D7DAB23>56 D E /Fd 135[50 3[50 50 3[50 50 50 50 2[50
+2[50 50 1[50 50 50 97[{}13 83.333336 /Courier rf /Fe
+1 49 df<038007C007C007C00F800F800F800F001F001E001E003E003C003C0038007800
+780070007000E000E0000A157D9612>48 D E /Ff 6 104 df<FFFFFFFFFEFFFFFFFFFE
+FFFFFFFFFE27037A8F34>0 D<003800003800003800003800003800403804F0381EF810
+3E7E10FC0F11E003938000FE0000380000FE000393800F11E07E10FCF8103EF0381E4038
+0400380000380000380000380000380017197B9A22>3 D<000000003000000000000000
+380000000000000038000000000000003C000000000000001E000000000000000E000000
+000000000F00000000000000078000000000000003C000007FFFFFFFFFE00000FFFFFFFF
+FFF00000FFFFFFFFFFFC000000000000003E000000000000000F8000000000000007E000
+000000000001FC000000000000007F800000000000003F80000000000000FC0000000000
+0003F00000000000000F800000000000001F000000000000003C0000FFFFFFFFFFF80000
+FFFFFFFFFFF000007FFFFFFFFFE000000000000003C00000000000000780000000000000
+0F000000000000000E000000000000001E000000000000003C0000000000000038000000
+0000000038000000000000003000000039237C9F42>41 D<00F001F803F803F803F807F0
+07F007F007E007E00FC00FC00FC00F801F801F001F001F003E003E003C003C007C007800
+78007000F000F000E0000D1D7D9F13>48 D<00007E0003FE0007E0000F00001E00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C0000780000780000F00003E000FF8000FC0000
+FF800003E00000F000007800007800003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+001E00000F000007E00003FE00007E173B7BAB22>102 D<FC0000FF800007E00001F000
+007800003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00001E00001E00000F000007C0
+0001FE00007E0001FE0007C0000F00001E00001E00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C0000780001F00007E000FF8000FC0000173B7BAB22>I
+E /Fg 7 56 df<001C00007C0007FC00FFFC00FFFC00F8FC0000FC0000FC0000FC0000FC
+0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC
+0000FC0000FC0000FC007FFFF87FFFF87FFFF8151C7B9B1F>49 D<03FE000FFFC03FFFF0
+7E07F8F803FCFC01FCFC00FEFC00FEFC007E7800FE0000FE0000FE0001FC0001F80003F0
+0007E0000F80003E00007C0000F00E01E00E07801C0FFFFC1FFFFC7FFFFCFFFFFCFFFFF8
+FFFFF8171C7C9B1F>I<00FF800003FFE0000FFFF8001F01FC003E00FE003F007E003F00
+7E003F007E003F00FE000C00FC000001FC000003F00000FFC00000FFF0000001FC000000
+FE0000007F0000003F8000003F8030003F80FC003F80FC003F80FC003F80FC007F00F800
+FF007E01FE003FFFF8000FFFF00001FF8000191D7D9B1F>I<0003F0000003F0000007F0
+00000FF000001DF0000039F0000039F0000071F00000E1F00001C1F0000381F0000701F0
+000701F0000E01F0001C01F0003801F0007001F000F001F000FFFFFF80FFFFFF80FFFFFF
+800003F0000003F0000003F0000003F00000FFFF8000FFFF8000FFFF80191C7D9B1F>I<
+3800783FFFF83FFFF03FFFE03FFF803FFE003FF0003C00003C00003C00003CFF003FFFC0
+3F03F03E01F83C00FC38007C00007E00007E00007E78007EFC007EFC007EFC00FCF800FC
+7801F87E03F03FFFE00FFF8003FE00171D7C9B1F>I<001FE00000FFF80003FFFC0007F0
+3E000FC07E001F807E003F007E003E007E007E003C007E000000FC3F8000FCFFF000FDC0
+FC00FF807E00FF003F00FE001F00FE001F80FC001F80FC001F80FC001F807C001F807E00
+1F807E001F803E003F003F003F001F80FE000FFFF80003FFF000007F8000191D7D9B1F>
+I<380000003FFFFF803FFFFF807FFFFF807FFFFF007FFFFE007FFFFC007000F800E001F0
+00E003E0000007C000000F8000001F0000001F0000003E0000007E0000007C0000007C00
+0000FC000000FC000000F8000001F8000001F8000001F8000001F8000001F8000001F800
+0001F8000000F00000191D7C9B1F>I E /Fh 7 62 df<007C00000000600001FF000000
+00F00003C380000001F0000700C0000001E0000E0060000003E0001E007000000FC0001C
+003C00001F80003C003F00007F80003C001BE003FF00007C0018FFFF9E00007800181FFC
+3E000078000C00007C0000F8000C0000780000F8000C0000F80000F8000C0001F00000F8
+000C0001E00000F8000C0003E00000F8000C0007C00000F8000C0007800000F8000C000F
+800000F8000C001F00000078000C001E000000780018003E0000007C0018007C0000003C
+001800780000003C003000F80000001C003001F00000001E006001E00000000E006003E0
+0000000700C007C000000003C380078000000001FF000F80000000007C001F0000000000
+00001E0007C0000000003E001FF0000000007C003C38000000007800700C00000000F800
+F00600000001F001E00600000001E001E00300000003E003C00300000007C003C0018000
+00078007C0018000000F800780018000001F000780018000001E000F8000C000003E000F
+8000C000007C000F8000C0000078000F8000C00000F8000F8000C00001F0000F8000C000
+01E0000F8000C00003E0000F8000C00007C0000F8000C0000780000F8000C0000F800007
+800180001F000007800180001E000007C00180003E000003C00180007C000003C0030000
+78000001E0030000F8000001E0060001F0000000F0060001E0000000700C0003E0000000
+3C380003C00000001FF000018000000007C0003A437BBD45>37 D<0003F80000001FFF00
+00007E0FC00000F803E00003E000F80003C000780007C0007C000F80003E000F80003E00
+1F00001F001F00001F003F00001F803F00001F803F00001F807E00000FC07E00000FC07E
+00000FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00
+000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE0000
+0FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000F
+C07E00000FC07E00000FC07E00000FC07F00001FC03F00001F803F00001F803F00001F80
+1F00001F001F00001F000F80003E000F80003E0007C0007C0003E000F80003E000F80000
+F803E000007E0FC000001FFF00000007FC000023387DB62A>48 D<000180000007800000
+0F8000003F800001FF8000FFFF8000FFDF8000FE1F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000003FC0007FFFFFE07FFFFFE07FFFFFE01B3779B62A
+>I<0007F80000003FFF000000FFFFC00001F00FE000038003F000070001F8000F0001FC
+000FC001FE001FE000FE001FE000FF001FE000FF001FE000FF000FE000FF000FC000FF00
+038000FF00000000FE00000000FE00000001FE00000001FC00000001F800000003F00000
+0003E000000007C00000000F800000007F0000001FFC0000001FFF800000000FE0000000
+03F000000001FC00000000FE00000000FF000000007F000000007F800000007FC0000000
+3FC00000003FC00000003FE00000003FE03E00003FE07F00003FE0FF80003FE0FF80003F
+E0FF80003FE0FF80003FC0FF00007FC07E00007F807C00007F80300000FF00380000FE00
+1C0001FC000F0003F80007F00FF00001FFFFC000007FFF8000000FFC000023387DB62A>
+51 D<0600000C000780003C0007F003F80007FFFFF00007FFFFE00007FFFFC00007FFFF
+800007FFFF000007FFFC0000067FE0000006000000000600000000060000000006000000
+000600000000060000000006000000000600000000060000000006000000000600000000
+0607F80000063FFF000006F80F800007C003C000070001F000060000F800040000F80000
+00007C000000007E000000007E000000003F000000003F000000003F000000003F800000
+003F800000003F803C00003F807E00003F80FF00003F80FF00003F80FF00003F80FF0000
+3F00FE00003F00FC00007F006000007E006000007E00300000FC00380000F800180001F8
+000E0003F000070007E00003E03F800001FFFF0000007FFC0000001FE0000021387CB62A
+>53 D<1C003E007F00FF80FF80FF807F003E001C00000000000000000000000000000000
+0000000000000000000000000000000000000000001C003E007F00FF80FF80FF807F003E
+001C00092479A317>58 D<7FFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFF
+FFFFFC000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFC
+FFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFFFFFFF836167B9F41>61
+D E /Fi 3 106 df<001FF00000FFFF0003E03FC00F801FE01F000FF01F800FF83FC007
+F83FE007F83FE007F83FE007F83FE00FF83FE00FF01FC00FF007001FE000003FE000007F
+800000FF00007FFC00007FF800007FFF0000003FC000000FF0000007F8000007FC0C0007
+FC3F0003FE7F8003FEFFC003FEFFC003FEFFC003FEFFC003FEFFC003FC7F8007FC7F0007
+F83F000FF01FC03FE007FFFFC001FFFF00003FF0001F277DA526>51
+D<FFFFFFFF000000FFFFFFFFF00000FFFFFFFFFC000003FE0007FF000003FE00007FC000
+03FE00003FE00003FE00000FF00003FE000007F80003FE000003F80003FE000003FC0003
+FE000001FE0003FE000001FE0003FE000000FF0003FE000000FF0003FE000000FF0003FE
+000000FF0003FE000000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE00
+0000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE0000
+00FF0003FE000000FF0003FE000000FF0003FE000001FE0003FE000001FE0003FE000003
+FC0003FE000003FC0003FE000007F80003FE00000FF00003FE00001FE00003FE00007FC0
+0003FE0003FF0000FFFFFFFFFE0000FFFFFFFFF00000FFFFFFFF00000031287DA739>68
+D<0F801FC03FE03FE03FE03FE03FE01FC00F80000000000000000000000000FFE0FFE0FF
+E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F
+E00FE00FE0FFFCFFFCFFFC0E297CA816>105 D E /Fj 1 69 df<FFFFFFFFFF800000FF
+FFFFFFFFF80000FFFFFFFFFFFF0000FFFFFFFFFFFFC000007FF80007FFF000007FF80000
+7FF800007FF800001FFE00007FF800000FFF00007FF8000003FF80007FF8000001FFC000
+7FF8000001FFC0007FF8000000FFE0007FF80000007FF0007FF80000007FF0007FF80000
+003FF8007FF80000003FF8007FF80000003FFC007FF80000001FFC007FF80000001FFC00
+7FF80000001FFE007FF80000001FFE007FF80000001FFE007FF80000001FFE007FF80000
+001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF00
+7FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000
+001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFE007FF80000001FFE00
+7FF80000001FFE007FF80000001FFE007FF80000001FFC007FF80000003FFC007FF80000
+003FFC007FF80000003FF8007FF80000007FF8007FF80000007FF0007FF8000000FFE000
+7FF8000000FFE0007FF8000001FFC0007FF8000003FF80007FF8000007FF00007FF80000
+1FFE00007FF800007FFC00007FF80007FFF000FFFFFFFFFFFFC000FFFFFFFFFFFF0000FF
+FFFFFFFFFC0000FFFFFFFFFF80000040397DB849>68 D E /Fk 3
+106 df<00000000003C00000000000000003C00000000000000003E0000000000000000
+1E00000000000000001F00000000000000000F8000000000000000078000000000000000
+07C00000000000000003E00000000000000001F00000000000000000F800000000000000
+00FC00007FFFFFFFFFFFFE0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF8000FFFFFFFFFF
+FFFFC00000000000000003E00000000000000001F80000000000000000FE000000000000
+00003F00000000000000001FE00000000000000007F80000000000000001FF0000000000
+000001FF0000000000000007F8000000000000001FE0000000000000003F000000000000
+0000FE0000000000000001F80000000000000003E000FFFFFFFFFFFFFFC000FFFFFFFFFF
+FFFF8000FFFFFFFFFFFFFF00007FFFFFFFFFFFFE0000000000000000FC00000000000000
+00F80000000000000001F00000000000000003E00000000000000007C000000000000000
+0780000000000000000F80000000000000001F00000000000000001E0000000000000000
+3E00000000000000003C00000000000000003C000000482E7BAB53>41
+D<0000C00001E00003E00003E00003C00007C00007C0000780000F80000F80001F00001F
+00001E00003E00003E00007C00007C0000780000F80000F80001F00001F00001E00003E0
+0003E00003C00007C00007C0000F80000F80000F00001F00001F00003E00003E00003C00
+007C00007C0000780000F80000F80000F80000F800007800007C00007C00003C00003E00
+003E00001F00001F00000F00000F80000F800007C00007C00003C00003E00003E00001E0
+0001F00001F00000F80000F800007800007C00007C00003E00003E00001E00001F00001F
+00000F80000F800007800007C00007C00003C00003E00003E00001E00000C0135278BD20
+>104 D<600000F00000F80000F800007800007C00007C00003C00003E00003E00001F00
+001F00000F00000F80000F800007C00007C00003C00003E00003E00001F00001F00000F0
+0000F80000F800007800007C00007C00003E00003E00001E00001F00001F00000F80000F
+800007800007C00007C00003C00003E00003E00003E00003E00003C00007C00007C00007
+80000F80000F80001F00001F00001E00003E00003E00007C00007C0000780000F80000F8
+0000F00001F00001F00003E00003E00003C00007C00007C0000F80000F80000F00001F00
+001F00003E00003E00003C00007C00007C0000780000F80000F80000F000006000001352
+7CBD20>I E /Fl 3 111 df<70F8F8F87005057A8413>58 D<03FFFFC00003FFFFF80000
+3C007E00003C001F00003C000F80003C000F800078000F800078000F800078000F800078
+001F0000F0003E0000F000780000F003E00000FFFE000001E007000001E003C00001E001
+C00001E001E00003C001E00003C001E00003C001E00003C001E000078003E000078003E0
+60078003E060078003E0C0FFF801F0C0FFF800F1800000003E00231D7B9B2B>82
+D<0F03F00033861C0021D81E0061F01E00C3E01E00C3C01E0003C01E0003C01E0007803C
+0007803C0007803C00078078200F0078600F00F0600F00F0C00F00F0C01E0071800C003E
+001B127D9125>110 D E /Fm 139[12 16 14 1[21 21 21 1[12
+2[12 1[21 1[18 21 18 1[18 12[25 23 28 2[30 30 37 25 1[16
+14 2[23 25 1[28 1[30 20[10 2[14 14 40[{}29 41.666668
+/Times-Roman rf /Fn 3 52 df<00600001E0000FE000FFE000F1E00001E00001E00001
+E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001
+E00001E00001E00001E00001E00001E00001E0007FFF807FFF80111C7B9B1C>49
+D<03FC000FFF801C0FC03003E06001F0E000F0E000F8F00078F000786000780000F80000
+F00001F00001E00003C0000700000E00001C0000300000E0000180180300180600180800
+383FFFF07FFFF0FFFFF0FFFFF0151C7D9B1C>I<03FC000FFF001C07C03001E07001F078
+01F07800F03001F00001F00001E00003C0000780001E0003FC000007800003C00001E000
+00F00000F80000F86000F8F000F8F000F8E000F06001F07003E03C07C00FFF0003FC0015
+1D7D9B1C>I E /Fo 81[32 51[26 29 29 1[29 29 16 23 19 1[29
+29 29 45 16 1[16 16 29 29 19 26 29 26 29 26 7[42 2[42
+42 36 32 39 42 32 42 42 52 2[23 19 1[42 32 36 42 39 1[42
+1[26 5[29 29 29 29 29 29 29 29 29 3[19 15 2[19 19 40[{}57
+58.333336 /Times-Roman rf /Fp 134[29 29 2[32 19 23 26
+1[32 29 32 48 16 2[16 32 29 1[26 32 26 1[29 14[42 45
+36 45 5[23 3[39 42 2[42 1[29 63[{}27 58.333336 /Times-Bold
+rf /Fq 138[33 18 26 26 1[33 1[33 48 3[18 1[33 1[29 3[33
+97[{}11 66.666664 /Times-Italic rf /Fr 7 56 df<00E00001E00007E000FFE000
+F9E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000
+01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000
+01E00001E00003F000FFFFC0FFFFC012217AA01E>49 D<01FC0007FF801C0FC03003E060
+01F06000F8F800F8FC00FCFC00FCFC007C78007C3000FC0000FC0000F80000F80001F000
+03E00003C0000780000F00001E0000380000700000E00001C00C03800C0600180C001818
+00183FFFF87FFFF8FFFFF0FFFFF016217CA01E>I<00FF0003FFC00F03E01C00F01C00F8
+3E00FC3E007C3E007C1E00FC0C00FC0000F80000F80001F00003E0000FC001FF0001FF00
+0003E00000F000007800007C00003E00003F30003F78003FFC003FFC003FFC003EF8007E
+60007C3800F81E03F00FFFC001FF0018227DA01E>I<0000E00001E00001E00003E00007
+E00007E0000DE0001DE00039E00031E00061E000E1E000C1E00181E00381E00701E00601
+E00C01E01C01E01801E03001E07001E0E001E0FFFFFFFFFFFF0001E00001E00001E00001
+E00001E00001E00003F0003FFF003FFF18227DA11E>I<1000301E01F01FFFE01FFFC01F
+FF801FFE001BF00018000018000018000018000018000018FE001BFF801F03C01C01E018
+00F01800F800007800007800007C00007C30007C78007CF8007CF8007CF80078F000F860
+00F07001E03801E01E078007FF0001F80016227CA01E>I<000FC0007FF001F03803C018
+07803C0F007C1E007C1C00383C00003C00007C0000780000787FC0F8FFE0F980F0FA0038
+FE003CFC001EFC001EF8001FF8001FF8001FF8001F78001F78001F78001F3C001E3C001E
+1C003C1E00380F00700781E001FFC0007F0018227DA01E>I<3000003C00003FFFFF3FFF
+FF7FFFFE7FFFFC60001C600038600070C000E0C000C00001C0000380000700000600000E
+00001C00001C0000380000380000780000780000780000F00000F00000F00000F00001F0
+0001F00001F00001F00001F00001F00001F00000E00018237CA11E>I
+E /Fs 1 4 df<7FFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFCF0
+00000000003CF000000000003CF000000000003CF000000000003CF000000000003CF000
+000000003CF000000000003CF000000000003CF000000000003CF000000000003CF00000
+0000003CF000000000003CF000000000003CF000000000003CF000000000003CF0000000
+00003CF000000000003CF000000000003CF000000000003CF000000000003CF000000000
+003CF000000000003CF000000000003CF000000000003CF000000000003CF00000000000
+3CF000000000003CF000000000003CF000000000003CF000000000003CF000000000003C
+F000000000003CF000000000003CF000000000003CF000000000003CF000000000003CF0
+00000000003CF000000000003CF000000000003CF000000000003CF000000000003CF000
+000000003CF000000000003CF000000000003CF000000000003CF000000000003CF00000
+0000003CF000000000003CFFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFF
+FFFFF836387BB741>3 D E /Ft 18 112 df<387CFEFEFEFEFEFE7C7C7C7C7C7C7C7C7C
+7C3838383838383838383810000000000038FEFEFEFEFE3807297BA813>33
+D<0006000C00180030006000E001C00380038007000F000E001E001E001C003C003C003C
+0078007800780078007800F800F000F000F000F000F000F000F000F000F000F000F000F8
+00780078007800780078003C003C003C001C001E001E000E000F0007000380038001C000
+E0006000300018000C00060F3B7AAB1A>40 D<C0006000300018000C000E000700038003
+8001C001E000E000F000F00070007800780078003C003C003C003C003C003E001E001E00
+1E001E001E001E001E001E001E001E001E003E003C003C003C003C003C00780078007800
+7000F000F000E001E001C00380038007000E000C00180030006000C0000F3B7DAB1A>I<
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E000000FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E0000002B2B7DA333>43 D<00380000780001F8001FF800FEF800E0F80000F80000
+F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000
+F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000
+F80000F80000F80000F80001FC00FFFFF8FFFFF815267BA521>49
+D<00FF000003FFE0000E03F0001800F80030007C0060003E0078001F00FC001F00FE001F
+80FE001F80FE000F80FE000F807C000F8000001F8000001F0000001F0000003F0000003E
+0000007C00000078000000F0000001E0000003C00000078000000F0000001C0000003800
+000070018000E0018001C0018003800300060003000C0003001FFFFF003FFFFF007FFFFE
+00FFFFFE00FFFFFE0019267DA521>I<00FF000003FFE0000F01F8001C007C0030003E00
+3C003E007E003F007E001F007E001F007E003F003C003F0000003E0000003E0000007C00
+0000F8000001F0000007E00001FF800001FF00000001E0000000F00000007C0000003E00
+00003F0000001F0000001F8000001F8038001F807C001F80FE001F80FE001F80FE001F00
+FC003F0078003E0070007C003800F8001F01F00007FFC00000FF000019277DA521>I<00
+00380000003800000078000000F8000001F8000001F8000003F8000007F8000006F80000
+0CF800001CF8000018F8000030F8000070F8000060F80000C0F80001C0F8000180F80003
+00F8000700F8000E00F8000C00F8001C00F8003800F8003000F8006000F800E000F800FF
+FFFFE0FFFFFFE00000F8000000F8000000F8000000F8000000F8000000F8000000F80000
+01FC00003FFFE0003FFFE01B277EA621>I<18000C001F007C001FFFF8001FFFF0001FFF
+E0001FFF800019FC00001800000018000000180000001800000018000000180000001800
+0000187F000019FFE0001F81F0001E0078001C003C0018003E0000003E0000001F000000
+1F0000001F8000001F8030001F807C001F80FC001F80FC001F80FC001F80FC001F00F000
+1F0060003E0070003E0030007C001C00F8000F03E00003FFC00000FE000019277DA521>
+I<000FE000003FF80000F81C0001E0060003801F0007003F000F003F001E003F001E003F
+003C001E003C0000007C0000007800000078040000783FC000F8FFF000F9807800FB003C
+00FA001E00FC001E00FC000F00FC000F00F8000F80F8000F80F8000F80F8000F8078000F
+8078000F8078000F8078000F803C000F003C000F001C001E001E001E000E003C00070078
+0003C0F00001FFC000007F000019277DA521>I<300000003C0000003FFFFFE03FFFFFE0
+3FFFFFC07FFFFF807FFFFF807000070060000E0060000C00C0001C00C0003800C0007000
+0000E0000000C0000001C000000380000003800000070000000F0000000E0000001E0000
+001E0000001E0000003E0000003C0000003C0000007C0000007C0000007C0000007C0000
+00FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000780000
+1B287DA621>I<387CFEFEFE7C380000000000000000000000387CFEFEFE7C3807197B98
+13>58 D<387CFEFEFE7C380000000000000000000000387CFCFEFE7E3E0606060C0C0C18
+1830702007247B9813>I<7FFFFFFFFFC0FFFFFFFFFFE0FFFFFFFFFFE000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000FFFFFFFFFFE0FFFFFFFFFFE07F
+FFFFFFFFC02B117D9633>61 D<01FF000FFFE01E01F038007860007CF8003EFC003EFC00
+3EFC003E78003E30007C00007C0000F80001F00003C0000780000F00000E00001C000018
+000038000030000030000030000030000030000030000030000020000000000000000000
+0000000000000000700001FC0001FC0001FC0001FC0001FC0000700017297DA81F>63
+D<007E03E001FF8FF00781F8F00F00F0F01E0078001C0038003C003C003C003C003C003C
+003C003C003C003C003C003C001C0038001E0078000F00F0000781E00009FF8000087E00
+0018000000180000001C0000001E0000000FFFF0000FFFFC0007FFFF000FFFFF801C001F
+C0380007C0780003E0F00001E0F00001E0F00001E0F00001E0780003C07C0007C03E000F
+800FC07E0003FFF800007FC0001C277E9921>103 D<0F80FF80FF801F800F800F800F80
+0F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F80
+0F800F800F800F800F800F800F800F800F800F800F800F801FC0FFF8FFF80D287EA713>
+108 D<003F800000FFE00003E0F80007803C000F001E001E000F003C0007803C00078078
+0003C0780003C0780003C0F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0F8
+0003E0780003C0780003C07C0007C03C0007801E000F001F001F000F803E0003E0F80001
+FFF000003F80001B1C7E9A21>111 D E /Fu 11 121 df<387CFEFEFE7C3807077A8614>
+58 D<387CFEFFFF7F3B0303030606060C1838702008127A8614>I<E000000000F8000000
+00FE000000003F800000000FE000000003F800000000FE000000003F800000000FE00000
+0003F800000000FE000000003F800000000FE000000003F800000000FE000000003F8000
+00000FE000000003F800000000FE000000003E00000000FE00000003F80000000FE00000
+003F80000000FE00000003F80000000FE00000003F80000000FE00000003F80000000FE0
+0000003F80000000FE00000003F80000000FE00000003F80000000FE00000000F8000000
+00E00000000027277AA134>62 D<00000001800000000003800000000007800000000007
+C0000000000FC0000000001FC0000000001FC00000000037C00000000037C00000000067
+C000000000C7C000000000C7E00000000183E00000000383E00000000303E00000000603
+E00000000E03E00000000C03E00000001803F00000001801F00000003001F00000006001
+F00000006001F0000000C001F0000001C001F00000018001F0000003FFFFF8000003FFFF
+F80000060000F800000C0000F800000C0000F80000180000F80000380000F80000300000
+FC00006000007C0000E000007C0000C000007C0001C000007C0003C000007C000FC00000
+FE00FFF8000FFFE0FFF8000FFFE02B2A7DA932>65 D<003FFFFFFFF8003FFFFFFFF80001
+F80003F80001F00000F80001F00000780003F00000300003F00000300003E00000300003
+E00000300007E00000300007E00000300007C00180300007C0018030000FC0038000000F
+C0030000000F80030000000F80070000001F801F0000001FFFFE0000001FFFFE0000001F
+001E0000003F000E0000003F000C0000003E000C0000003E000C0000007E001C01C0007E
+00180180007C00000180007C0000038000FC0000070000FC0000070000F800000E0000F8
+00000E0001F800001C0001F800003C0001F00000780001F00001F80003F0000FF000FFFF
+FFFFF000FFFFFFFFE0002D287CA731>69 D<003FFFFFFFE0003FFFFFFFE00001F80007E0
+0001F00003E00001F00001E00003F00000C00003F00000C00003E00000C00003E00000C0
+0007E00000C00007E00000C00007C00000C00007C00300C0000FC0070000000FC0060000
+000F80060000000F800E0000001F800E0000001F803C0000001FFFFC0000001FFFFC0000
+003F003C0000003F00180000003E00180000003E00180000007E00380000007E00300000
+007C00300000007C0000000000FC0000000000FC0000000000F80000000000F800000000
+01F80000000001F80000000001F00000000001F00000000003F000000000FFFFE0000000
+FFFFE00000002B287CA72A>I<000001FF000000001FFFE00000007E01F8000001F0007E
+000007C0001F00000F80000F80001E000007C0007C000007C000F8000003E001F0000003
+E001F0000001F003E0000001F007C0000001F00FC0000001F00F80000001F81F80000001
+F81F00000001F83F00000001F83F00000001F07E00000003F07E00000003F07E00000003
+F07E00000003F07E00000007E0FC00000007E0FC0000000FC0FC0000000FC0FC0000001F
+80FC0000001F807C0000003F007E0000003E007E0000007E003E000000FC003E000001F8
+001F000003F0001F800007C0000F80000F800007C0003F000003F000FC000000FC03F000
+00003FFFC000000007FC0000002D2A7DA832>79 D<003FFFFFC000003FFFFFF8000001F8
+00FE000001F0001F000001F0000F800003F0000FC00003F00007C00003E00007C00003E0
+0007E00007E00007E00007E0000FC00007C0000FC00007C0000FC0000FC0001F80000FC0
+001F00000F80003E00000F80007C00001F8001F000001F800FE000001FFFFF0000001FFF
+FE0000003F001F0000003F0007C000003E0007C000003E0003E000007E0003E000007E00
+03E000007C0003E000007C0003E00000FC0007E00000FC0007E00000F80007E00000F800
+07E00001F80007E01001F80007E03001F00007E03001F00007E07003F00007E0E0FFFF80
+03F1C0FFFF8001FF80000000007E002C297CA732>82 D<00001FE0080000FFFC180003E0
+1E380007000770000E0003F000180001F000300000F000700000E000E00000E000E00000
+E000E00000E001E00000C001E00000C001E000000001F000000000F800000000FE000000
+007FE00000007FFE0000003FFFE000000FFFF0000001FFF80000001FFC00000001FE0000
+00003E000000001F000000000F000000000F000000000F00180000070018000007003800
+000E003000000E003800000C003800001C0078000038007C000070007E0000E000770003
+C000E3E00F0000C0FFFE0000801FF00000252A7CA829>I<000E00001F00001F00001E00
+000C0000000000000000000000000000000000000000000000000003E00007F0000C7800
+183800303800303800607800607800C07800C0F00000F00001E00001E00001E00003C000
+03C0000780000781800781800F01800F03000F03000F06000F0C000F1C0007F00001E000
+11287DA617>105 D<00F807C001FE1FF0070738380E07B0381C03E0781803C0F83003C0
+F83003C07060078000600780000007800000078000000F0000000F0000000F0000000F00
+00001E0000001E0030001E0030301E0060783E0060F83E00C0F87E00C0F06E038061CF07
+007F83FC001E01F8001D1B7D9926>120 D E /Fv 11 121 df<1C007F00FF80FF80FF80
+FF80FF807F001C000909798817>58 D<1C007F00FF80FF80FFC0FFC0FFC07FC01CC000C0
+00C000C000C001C00180018003800300070006000E001C003800700060000A19798817>
+I<00000000006000000000000070000000000000F0000000000001F0000000000001F000
+0000000003F0000000000003F0000000000007F000000000000FF000000000000FF00000
+0000001FF800000000001FF8000000000033F8000000000073F8000000000063F8000000
+0000C3F80000000000C3F8000000000183F8000000000183F8000000000303F800000000
+0603F8000000000603FC000000000C03FC000000000C01FC000000001801FC0000000030
+01FC000000003001FC000000006001FC000000006001FC00000000C001FC00000001C001
+FC000000018001FC000000030001FE000000030001FE000000060000FE0000000E0000FE
+0000000C0000FE000000180000FE0000001FFFFFFE0000003FFFFFFE0000003FFFFFFE00
+0000600000FE000000C00000FE000000C00000FF000001800000FF0000018000007F0000
+030000007F0000060000007F0000060000007F00000C0000007F00000C0000007F000018
+0000007F0000380000007F0000700000007F0000F00000007F8001F80000007F8007F800
+0000FF80FFFF80003FFFFFFFFF80007FFFFFFFFF80007FFFFF383C7DBB3E>65
+D<0003FFFFFFFFFFF00007FFFFFFFFFFF00007FFFFFFFFFFF0000007F800003FF0000007
+F0000007F0000007F0000003E000000FF0000001E000000FF0000000E000000FE0000000
+E000000FE0000000E000001FE0000000E000001FE0000000E000001FC0000000E000001F
+C0000000C000003FC0000000C000003FC0000000C000003F80003000C000003F80003000
+C000007F80007000C000007F800070000000007F000060000000007F0000E000000000FF
+0000E000000000FF0001E000000000FE0003C000000000FE000FC000000001FFFFFFC000
+000001FFFFFFC000000001FFFFFF8000000001FC000F8000000003FC00078000000003FC
+00078000000003F800030000000003F800030000000007F800070000000007F800070003
+000007F000060003000007F00006000700000FF00006000600000FF00000000600000FE0
+0000000E00000FE00000000C00001FE00000001C00001FE00000001800001FC000000038
+00001FC00000003800003FC00000007000003FC0000000F000003F80000001E000003F80
+000001E000007F80000007E000007F8000000FC000007F0000003FC00000FF000003FF80
+00FFFFFFFFFFFF8000FFFFFFFFFFFF8000FFFFFFFFFFFF00003C397DB83D>69
+D<0003FFFFFFFFFFE00007FFFFFFFFFFE00007FFFFFFFFFFE0000007F800003FE0000007
+F000000FE0000007F0000003C000000FF0000003C000000FF0000001C000000FE0000001
+C000000FE0000001C000001FE0000001C000001FE0000001C000001FC0000001C000001F
+C00000018000003FC00000018000003FC00000018000003F800000018000003F80006001
+8000007F8000E0018000007F8000E0000000007F0000C0000000007F0000C000000000FF
+0001C000000000FF0001C000000000FE00038000000000FE00078000000001FE001F8000
+000001FFFFFF8000000001FFFFFF0000000001FFFFFF0000000003FC001F0000000003FC
+000F0000000003F8000E0000000003F8000E0000000007F8000E0000000007F8000E0000
+000007F0000C0000000007F0000C000000000FF0001C000000000FF0001C000000000FE0
+0000000000000FE00000000000001FE00000000000001FE00000000000001FC000000000
+00001FC00000000000003FC00000000000003FC00000000000003F800000000000003F80
+0000000000007F800000000000007F800000000000007F00000000000000FF8000000000
+00FFFFFFC000000000FFFFFFC000000000FFFFFFC0000000003B397DB835>I<0003FFF8
+00001FFFF80007FFFC00003FFFF80007FFFC00003FFFF8000007FC000001FF00000007FE
+0000007C00000006FE000000780000000EFF000000700000000E7F000000700000000C7F
+800000600000000C7F800000600000001C3F800000E00000001C3FC00000C0000000181F
+C00000C0000000181FE00000C0000000381FE00001C0000000380FF0000180000000300F
+F00001800000003007F00001800000007007F80003800000007003F80003000000006003
+FC0003000000006003FC000300000000E001FC000700000000E001FE000600000000C000
+FE000600000000C000FF000600000001C0007F000E00000001C0007F800C000000018000
+7F800C0000000180003F800C0000000380003FC01C0000000380001FC018000000030000
+1FE0180000000300000FE0180000000700000FF0380000000700000FF030000000060000
+07F03000000006000007F8300000000E000003F8700000000E000003FC600000000C0000
+03FC600000000C000001FE600000001C000001FEE00000001C000000FEC0000000180000
+00FFC0000000180000007FC0000000380000007FC0000000380000007F80000000300000
+003F80000000300000003F80000000700000001F80000000700000001F00000000F00000
+000F00000007FC0000000F000000FFFFE000000F000000FFFFE0000006000000FFFFE000
+000600000045397DB843>78 D<00000001FF00000000001FFFF000000000FE01FC000000
+03F0007E00000007C0001F8000001F80000FC000003E000007E00000FC000003F00001F8
+000003F00003F0000001F80007E0000001F8000FC0000000FC001F80000000FC003F0000
+0000FE007F000000007E00FE000000007E00FC000000007F01FC000000007F03F8000000
+007F03F8000000007F07F0000000007F07F0000000007F0FF0000000007F0FE000000000
+7F1FE000000000FF1FE000000000FF3FC000000000FF3FC000000000FF3FC000000000FF
+7F8000000001FE7F8000000001FE7F8000000001FE7F8000000001FEFF8000000003FCFF
+0000000003FCFF0000000003FCFF0000000007F8FF0000000007F8FF000000000FF0FF00
+0000000FF0FF000000000FE0FF000000001FE0FF000000001FC0FF000000003F807F0000
+00007F807F000000007F007F00000000FE007F00000001FC003F80000001F8003F800000
+03F8001F80000007F0001FC000000FE0000FC000001F800007E000003F000007F000007E
+000003F00001F8000001FC0003F00000007E000FC00000003F807F0000000007FFF80000
+000000FF80000000383D7CBA3F>I<0003FFFFFFF800000007FFFFFFFF80000007FFFFFF
+FFE000000007F8001FF800000007F00003FC00000007F00000FE0000000FF000007F0000
+000FF000007F0000000FE000003F8000000FE000003F8000001FE000003FC000001FE000
+003FC000001FC000003FC000001FC000003FC000003FC000003FC000003FC000007F8000
+003F8000007F8000003F8000007F8000007F800000FF0000007F800000FE0000007F0000
+01FC0000007F000003F8000000FF000007F0000000FF00000FE0000000FE00001F800000
+00FE00007F00000001FE0007F800000001FFFFFFE000000001FFFFFF0000000001FC000F
+C000000003FC0003F000000003FC0001F800000003F80000FC00000003F80000FE000000
+07F80000FE00000007F800007E00000007F000007E00000007F000007F0000000FF00000
+FF0000000FF00000FE0000000FE00000FE0000000FE00000FE0000001FE00001FE000000
+1FE00001FE0000001FC00001FE0000001FC00001FE0000003FC00001FE0000003FC00003
+FE0000003F800003FC0060003F800003FC0060007F800003FC00E0007F800003FC00C000
+7F000003FC01C000FF800001FC0180FFFFFF0001FC0380FFFFFF0000FE0700FFFFFF0000
+7E0E0000000000001FFC00000000000007F0003B3B7DB83F>82 D<0000001FE003800000
+00FFFC0300000003FFFE070000000FE01F8F0000003F0007DF0000007E0001FE000000F8
+0000FE000001F00000FE000003E000007E000003E000007C000007C000003C00000F8000
+003C00000F8000003C00001F8000003800001F0000003800001F0000003800001F000000
+3800003F0000003000003F0000003000003F8000003000003F8000000000003FC0000000
+00003FE000000000001FF000000000001FFE00000000001FFFE0000000000FFFFE000000
+0007FFFFC000000003FFFFF000000001FFFFF800000000FFFFFC000000001FFFFE000000
+0003FFFF00000000003FFF000000000003FF800000000000FF8000000000007F80000000
+00003F8000000000001F8000000000001F8000000000001F80000C0000001F80000C0000
+000F80000C0000000F80001C0000001F80001C0000001F00001C0000001F00001C000000
+1F00003C0000003E00003C0000003E00003C0000007C00003E000000F800007E000000F8
+00007F000001F000007F800003E000007FC0000FC00000F9F0001F800000F0FE00FE0000
+00E03FFFF8000000E00FFFE0000000C001FF00000000313D7CBA33>I<0000E00001F800
+03F80003F80003F80003F00001C000000000000000000000000000000000000000000000
+000000000000000000000000000000F80003FE00070F000E0F801C0F80180F80380F8030
+0F80701F80601F80603F80E03F00C03F00C07F00007E00007E0000FE0000FC0001FC0001
+FC0001F80003F80003F00003F00007F01807E01807E0380FE0300FC0300FC0700F80600F
+80E00F80C00F81C00F838007870003FE0000F80015397EB71D>105
+D<0007E001F000001FF807FE0000783E0E0F0000E01F1C0F0001C01F383F8003800FF03F
+8003000FE03F8007000FE03F000E000FC03F000C000FC01C000C001FC000001C001F8000
+0018001F80000018001F80000000003F80000000003F80000000003F00000000003F0000
+0000007F00000000007F00000000007E00000000007E0000000000FE0000000000FE0000
+000000FC000C000000FC000C000001FC001C000001FC0018001C01F80018007E01F80038
+007E03F8007000FE03F8006000FE07F800E000FE0E7C01C000781C7C03800078383E0F00
+003FF00FFC000007C003F0000029267EA42F>120 D E /Fw 139[28
+32 37 1[46 42 46 69 23 2[23 46 42 1[37 46 37 46 42 12[55
+46 2[51 65 8[51 1[60 2[60 18[21 46[{}24 83.333336 /Times-Bold
+rf /Fx 133[44 50 50 1[50 55 33 39 44 55 55 50 55 83 28
+2[28 55 50 33 44 55 44 1[50 12[66 3[61 78 72 4[39 4[72
+1[66 12[50 50 50 50 50 2[25 46[{}35 100.000000 /Times-Bold
+rf /Fy 135[40 2[40 40 40 2[40 2[40 3[40 2[40 40 40 40
+1[40 50[40 46[{}13 66.666664 /Courier rf /Fz 69[29 8[33
+1[37 37 3[29 47[29 33 33 48 33 33 18 26 22 33 33 33 33
+52 18 33 1[18 33 33 22 29 33 29 33 29 8[48 63 48 48 41
+37 44 48 37 48 48 59 41 1[26 22 1[48 37 41 48 44 1[48
+5[18 1[33 33 33 33 33 33 33 33 33 33 1[17 22 17 2[22
+22 40[{}67 66.666664 /Times-Roman rf /FA 2 122 df<0060000070000060000060
+00406020E06070F861F07C63E00F6F0003FC0000600003FC000F6F007C63E0F861F0E060
+7040602000600000600000700000600014157B9620>3 D<00600000F00000F00000F000
+00F00000F00000F0000060000060000060000060000060000060007861E0FFFFF0FFFFF0
+7861E000600000600000600000600000F00000F00000F00000F00000F00000F00000F000
+00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000
+006000006000006000006000006000006000006000142F7CA31E>121
+D E /FB 81[66 53[60 86 1[66 40 47 53 1[66 60 66 100 33
+66 1[33 66 60 40 53 66 53 66 60 10[86 1[80 1[86 1[73
+6[47 3[80 1[86 1[86 6[40 3[60 60 60 60 60 60 3[40 45[{}38
+119.999947 /Times-Bold rf /FC 78[50 55[50 50 1[50 50
+28 39 33 1[50 50 50 78 3[28 50 1[33 44 50 44 50 44 11[72
+61 55 14[72 66 66 72 92 7[50 50 4[50 50 2[25 1[25 44[{}34
+100.000000 /Times-Roman rf /FD 4 122 df<00007000000000F800000000F8000000
+00F800000000F800000000F800000000F800000000F800000000F8000000007000007800
+7000F07C007001F0FF007007F87F80700FF03FE0703FE00FF0707F8003F870FE0000FE73
+F800003F77E000000FFF80000003FE00000000F800000003FE0000000FFF8000003F77E0
+0000FE73F80003F870FE000FF0707F803FE0703FE07F80700FF0FF007007F87C007001F0
+78007000F000007000000000F800000000F800000000F800000000F800000000F8000000
+00F800000000F800000000F800000000700000252B7AAD32>3 D<0000000FE0000000FF
+E0000003FC0000000FE00000003FC00000007F80000000FF00000000FE00000001FC0000
+0001FC00000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000003F800000003F800000003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000007F000000007F00000000FE00000001FE00000
+003FC00000007F80000000FE00000007F8000000FFE0000000FFE000000007F800000000
+FE000000007F800000003FC00000001FE00000000FE000000007F000000007F000000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000003F800000003F80000
+0003F800000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000001FC00000001FC00000000FE00000000FF000000007F80000000
+3FC00000000FE000000003FC00000000FFE00000000FE0236479CA32>102
+D<FE00000000FFE000000007F800000000FE000000007F800000003FC00000001FE00000
+000FE000000007F000000007F000000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000003F800000003F800000003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000001FC00000001FC0000
+0000FE00000000FF000000007F800000003FC00000000FE000000003FC00000000FFE000
+0000FFE0000003FC0000000FE00000003FC00000007F80000000FF00000000FE00000001
+FC00000001FC00000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000003F800000003F80000
+0003F800000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000007F000000007F00000000FE00000001F
+E00000003FC00000007F80000000FE00000007F8000000FFE0000000FE00000000236479
+CA32>I<0001C000000007F000000007F000000007F000000007F000000007F000000007
+F000000007F000000007F000000007F000000007F000000003E000000003E000000003E0
+00000003E000000003E000000003E000000003E000000001C000000001C000000001C000
+000001C000000001C000000001C000003E01C03E00FFE1C3FF80FFFFFFFF80FFFFFFFF80
+FFFFFFFF80FFE1C3FF803E01C03E000001C000000001C000000001C000000001C0000000
+03E000000003E000000003E000000003E000000003E000000007F000000007F000000007
+F000000007F000000007F000000007F000000007F000000007F000000007F000000007F0
+00000007F000000007F000000007F000000007F000000007F000000007F000000007F000
+000007F000000007F000000007F000000007F000000007F000000007F000000007F00000
+0007F000000007F000000003E000000003E000000003E000000003E000000003E0000000
+03E000000003E000000003E000000003E000000003E000000003E000000003E000000003
+E000000003E000000003E000000001C000000001C000000001C000000001C000000001C0
+00000001C000000001C000000001C000000001C000000001C00000215B7BC52C>121
+D E /FE 81[80 51[64 72 1[104 1[80 48 56 64 1[80 72 80
+120 40 80 1[40 2[48 64 1[64 1[72 13[80 104 112 88 112
+8[88 4[104 6[48 58[{}27 144.000000 /Times-Bold rf /FF
+81[42 51[32 37 37 55 37 42 23 32 32 42 42 42 42 60 23
+37 23 23 42 42 23 37 42 37 42 42 9[69 51 60 46 42 51
+60 51 60 1[69 3[28 1[60 51 51 60 55 51 51 6[28 42 42
+42 42 2[42 42 42 2[21 28 21 44[{}56 83.333336 /Times-Italic
+rf /FG 47[83 13[28 7[37 8[42 1[46 46 3[37 47[37 42 42
+60 42 42 23 32 28 42 42 42 42 65 23 42 23 23 42 42 28
+37 42 37 42 37 3[28 1[28 2[60 78 60 60 51 46 55 60 46
+60 60 74 51 60 32 28 60 60 46 51 60 55 55 60 1[37 3[23
+23 42 42 42 42 42 42 42 42 42 42 23 21 28 21 47 1[28
+28 28 1[69 37[{}81 83.333336 /Times-Roman rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop -112 -352 3537 4 v -112 -227 4 125 v -84 -270
+a FG(In)20 b FF(Pr)m(oceedings)e(1)-6 b(1th)20 b(International)e
+(Confer)m(ence)h(on)h(Data)f(Engineering)p FG(,)f(pages)i(201\261210,)d
+(T)-6 b(aipei,)20 b(March)g(1995)p 3421 -227 V -112 -224
+3537 4 v 685 286 a FE(Prairie:)46 b(A)35 b(Rule)g(Speci\256cation)e
+(Framework)1267 469 y(for)i(Query)f(Optimizers)2600 417
+y FD(\003)-17 b(y)1160 710 y FC(Dinesh)24 b(Das)650 b(Don)25
+b(Batory)1262 826 y(Department)g(of)g(Computer)f(Sciences)1274
+942 y(The)h(University)f(of)g(T)-7 b(exas)25 b(at)g(Austin)1417
+1058 y(Austin,)f(T)-7 b(exas)24 b(78712\2611)l(188)1358
+1175 y FD(f)p FC(ddas,batory)p FD(g)p FC(@cs.utexas.edu)-112
+1500 y FB(Abstract)-112 1692 y FF(Fr)m(om)h(our)h(experience,)g(curr)m
+(ent)g(rule-based)f(query)g(optimizers)-112 1791 y(do)c(not)h(pr)m
+(ovide)g(a)g(very)h(intuitive)f(and)f(well-de\256ned)g(framework)-112
+1891 y(to)30 b(de\256ne)g(rules)h(and)e(actions.)57 b(T)-8
+b(o)32 b(r)m(emedy)e(this)h(situation,)h(we)-112 1991
+y(pr)m(opose)23 b(an)g(extensible)h(and)g(structur)m(ed)g(algebraic)f
+(framework)-112 2090 y(called)f(Prairie)h(for)h(specifying)e(rules.)35
+b(Prairie)24 b(facilitates)f(rule-)-112 2190 y(writing)h(by)f(enabling)
+f(a)i(user)g(to)g(write)h(rules)f(and)f(actions)g(mor)m(e)-116
+2289 y(quickly)-5 b(,)16 b(corr)m(ectly)g(and)g(in)h(an)f
+(easy-to-understand)d(and)i(easy-to-)-112 2389 y(debug)j(manner)-9
+b(.)-29 2492 y(Query)24 b(optimizers)h(consist)g(of)g(thr)m(ee)g(major)
+f(parts:)36 b(a)25 b(sear)m(ch)-116 2592 y(space,)17
+b(a)h(cost)f(model)g(and)f(a)i(sear)m(ch)f(strategy)-5
+b(.)26 b(The)18 b(appr)m(oach)d(we)-113 2691 y(take)k(is)i(only)e(to)h
+(develop)e(the)i(algebra)f(which)g(de\256nes)g(the)h(sear)m(ch)-112
+2791 y(space)29 b(and)g(the)h(cost)g(model)f(and)g(use)h(the)g(V)-9
+b(olcano)28 b(optimizer)n(-)-112 2891 y(generator)c(as)i(our)f(sear)m
+(ch)h(engine.)41 b(Using)26 b(Prairie)g(as)g(a)f(fr)m(ont-)-112
+2990 y(end,)j(we)h(translate)e(Prairie)h(rules)g(to)g(V)-9
+b(olcano)26 b(to)h(validate)g(our)-112 3090 y(claim)20
+b(that)g(Prairie)g(makes)g(it)h(easier)g(to)f(write)i(rules.)-33
+3193 y(W)-8 b(e)18 b(describe)e(our)h(algebra)f(and)g(pr)m(esent)h
+(experimental)f(r)m(esults)-118 3293 y(which)f(show)h(that)f(using)g(a)
+h(high-level)e(framework)i(like)f(Prairie)h(to)-117 3392
+y(design)e(lar)m(ge-scale)h(optimizers)i(does)e(not)h(sacri\256ce)f
+(ef\256ciency)-5 b(.)-112 3691 y FB(1)119 b(Intr)n(oduction)-119
+3883 y FG(Query)13 b(optimization)f([8])i(is)h(a)g(fundamental)d(part)i
+(of)g(database)g(sys-)-112 3982 y(tems.)26 b(It)20 b(is)h(the)f
+(process)g(of)f(generating)f(an)i(ef)o(\256cient)f(access)i(plan)-112
+4082 y(for)i(a)i(database)f(query)-5 b(.)37 b(Informally)-5
+b(,)22 b(an)i(access)h(plan)f(is)h(an)f(exe-)-112 4181
+y(cution)g(strategy)h(for)g(a)h(query;)g(it)g(is)h(the)e(sequence)g(of)
+g(low-level)-112 4281 y(database)e(retrieval)h(operations)f(that,)i
+(when)f(executed,)g(produce)-112 4381 y(the)f(database)g(records)f
+(that)i(satisfy)f(the)h(query)-5 b(.)34 b(There)23 b(are)g(three)-112
+4480 y(basic)h(aspects)h(that)f(de\256ne)g(and)g(in\257uence)f(query)g
+(optimization:)-112 4580 y(the)d(search)f(space,)h(the)h(cost)f(model,)
+f(and)h(the)g(search)g(strategy)-5 b(.)-30 4683 y(The)20
+b FF(sear)m(ch)f(space)h FG(is)g(the)g(set)h(of)e(logically)g
+(equivalent)g(access)-112 4783 y(plans)27 b(that)g(can)h(be)f(used)g
+(to)h(evaluate)f(a)g(query)-5 b(.)47 b(All)28 b(plans)g(in)f(a)p
+-112 4867 788 4 v -29 4921 a FA(\003)7 4944 y Fz(This)18
+b(research)h(was)f(supported)i(in)e(part)h(by)f(grants)h(from)e(The)h
+(University)i(of)-112 5023 y(T)-5 b(exas)23 b(Applied)h(Research)h
+(Laboratories,)h(Schlumber)o(ger)m(,)g(and)d(Digital)h(Equip-)-112
+5102 y(ment)17 b(Corporation.)-26 5160 y FA(y)7 5184
+y Fz(An)d(expanded)j(version)f(of)f(this)g(paper)h(is)e(available)k(as)
+d(T)-5 b(echnical)17 b(Report)f(TR)-112 5263 y(94\26116)h(by)g
+(anonymous)h(ftp)f(from)g Fy(ftp.cs.utexas.edu)p Fz(.)2044
+1500 y FG(query')-5 b(s)20 b(search)g(space)h(return)e(the)i(same)g
+(result;)g(however)m(,)e(some)2042 1600 y(plans)g(are)f(more)g(ef)o
+(\256cient)g(than)h(others.)25 b(The)19 b FF(cost)g(model)f
+FG(assigns)2043 1699 y(a)i(cost)g(to)g(each)f(plan)g(in)h(the)f(search)
+h(space.)26 b(The)19 b(cost)h(of)g(a)g(plan)f(is)2041
+1799 y(an)f(estimate)g(of)g(the)g(resources)f(used)g(when)h(the)g(plan)
+f(is)i(executed;)2040 1899 y(the)e(lower)g(the)g(cost,)h(the)f(better)g
+(the)g(plan.)25 b(The)17 b FF(sear)m(ch)g(strategy)g
+FG(is)2044 1998 y(a)23 b(speci\256cation)f(of)h(which)f(plans)h(in)g
+(the)g(search)f(space)h(are)g(to)g(be)2044 2098 y(examined.)2127
+2197 y(T)m(raditionally)-5 b(,)18 b(query)h(optimizers)h(have)g(been)g
+(built)g(as)i(mono-)2044 2297 y(lithic)i(subsystems)f(of)h(a)g(DBMS.)g
+(This)g(simply)f(re\257ects)h(the)g(fact)2040 2397 y(that)18
+b(traditional)e(database)h(systems)h(are)f(themselves)g(monolithic:)
+2043 2496 y(the)i(algorithms)f(used)g(for)h(storing)f(and)h(retrieving)
+e(data)i(are)h(hard-)2044 2596 y(wired)25 b(and)f(are)i(rather)e(dif)o
+(\256cult)g(to)i(change.)41 b(The)25 b(need)f(to)i(have)2041
+2696 y(extensible)18 b(database)f(systems,)i(and)f(in)g(turn)f
+(extensible)h(optimiz-)2044 2795 y(ers,)27 b(has)f(long)f(been)h
+(recognized)d(in)j(systems)h(like)f(Genesis)g([1],)2039
+2895 y(EXODUS)17 b([9],)g(Starburst)e([10],)h(and)g(Postgres)h([12].)24
+b(Rule-based)2043 2994 y(query)19 b(optimizers)g(are)h(among)e(the)i
+(major)f(conceptual)g(advances)2044 3094 y(that)28 b(have)g(been)g
+(proposed)f(to)i(deal)f(with)h(query)e(optimizer)g(ex-)2044
+3194 y(tensibility)d([6,)13 b(7,)g(9,)g(10].)39 b(The)24
+b(extensibility)f(translates)i(into)f(the)2044 3293 y(ability)e(to)g
+(incorporate)e(new)i(operators,)f(algorithms,)h(cost)g(mod-)2044
+3393 y(els,)27 b(or)e(search)g(strategies)g(without)f(changing)g(the)h
+(optimization)2044 3493 y(algorithm.)2127 3592 y(In)c(this)h(paper)m(,)
+e(we)i(describe)e(an)i(algebraic)e(framework)f(called)2042
+3692 y FF(Prairie)h FG(for)e(specifying)g(rules)h(in)g(a)g(rule-based)f
+(query)f(optimizer)-5 b(.)2044 3791 y(Prairie)27 b(is)h(similar)f(to)g
+(other)f(rule)h(speci\256cation)f(languages)g(like)2044
+3891 y(Starburst)d([10])f(and)h(V)-11 b(olcano)22 b([7],)i(and)f
+(indeed,)g(we)h(have)e(based)2044 3991 y(our)i(work)g(on)h(V)-11
+b(olcano)24 b(to)h(capture)e(most)i(of)g(the)g(advantages)e(of)2040
+4090 y(rule-based)16 b(optimizers.)25 b(However)m(,)16
+b(Prairie)h(attempts)g(to)g(provide)2040 4190 y(some)g(key)g(features)f
+(that,)i(we)g(have)e(found,)g(simplify)h(the)g(ef)o(fort)e(in)2044
+4290 y(writing)k(rules:)2106 4466 y(1.)41 b(A)26 b(framework)e(in)i
+(which)g(users)g(can)g(de\256ne)g(a)g(query)f(opti-)2210
+4565 y(mizer)c(concisely)f(in)h(terms)g(of)g(a)h(well-de\256ned)d(set)j
+(of)f(oper)n(-)2210 4665 y(ators)g(and)g(algorithms.)29
+b FF(All)22 b FG(operators)e(and)h(algorithms)f(are)2210
+4764 y(considered)f(\256rst-class)i(objects,)g(i.e.,)f
+FF(any)g FG(of)h(them)f(can)g(oc-)2210 4864 y(cur)15
+b(in)g(any)g(rule,)h(and)f FF(only)g FG(these)h(operators)d(and)i
+(algorithms)2210 4964 y(can)25 b(appear)f(in)h(rules.)42
+b(This)26 b(scheme)e(eliminates)i(the)f(need)2210 5063
+y(for)17 b(special)h(classes)i(of)d(operators)g(and)h(algorithms,)f
+(such)g(as)2210 5163 y(enforcers)i(in)i(V)-11 b(olcano)19
+b(and)h(glue)g(in)h(Starburst,)f(that)h(signif-)2210
+5263 y(icantly)f(complicate)f(rule)g(speci\256cation.)p
+eop
+%%Page: 2 2
+2 1 bop -50 21 a FG(2.)41 b(A)17 b(framework)d(in)j(which)f(users)h
+(can)f(de\256ne)g(a)h(list)h(of)f(proper)n(-)54 120 y(ties)g(to)f
+(characterize)f(the)h(expressions)f(generated)f(in)i(the)h(op-)54
+220 y(timization)g(process.)26 b(Again,)18 b(the)h(goal)e(here)h(is)i
+(to)e(allow)h(the)54 319 y(user)h(to)h(treat)g FF(all)g
+FG(properties)e(as)j(having)d(equal)h(status.)30 b(This)54
+419 y(is)22 b(dif)o(ferent)d(from)h(V)-11 b(olcano)20
+b(where)g(the)i(user)e(must)i(classify)54 519 y(properties)30
+b(as)i(logical,)h(physical,)h(or)d(operator/algorithm)54
+618 y(ar)o(guments.)-50 790 y(3.)41 b(A)h(framework)d(in)j(which)f
+(users)g(can)h(specify)f(mapping)54 889 y(functions)30
+b(between)h(properties)f(concomitantly)f(with)j(the)54
+989 y(corresponding)23 b(rules.)47 b(This)28 b(contrasts)e(with)i
+(existing)e(ap-)54 1088 y(proaches)32 b(in)i(which)g(mappings)e
+(between)h(properties)g(are)54 1188 y(fragmented)14 b(into)i(multiple)g
+(functions)f(and)h(at)h(logically)e(dif-)54 1288 y(ferent)27
+b(places)h(than)g(the)g(corresponding)d(rules.)51 b(Research)54
+1387 y(into)24 b(rule-based)f(optimizers)h(has)h(revealed)e(that)i
+(property-)54 1487 y(mapping)16 b(functions)h(are)h(a)h(major)e(source)
+h(of)f(user)i(ef)o(fort,)d(so)54 1587 y(this)k(is)h(an)g(important)d
+(goal.)-50 1758 y(4.)41 b(The)16 b(format)h(\(Prairie\))f(in)i(which)e
+(users)i(can)f(cleanly)f(specify)54 1857 y(rules)e(is)i(not)e
+(necessarily)h(the)f(same)h(format)f(needed)g(for)g(gen-)54
+1957 y(erating)25 b(ef)o(\256cient)g(optimizers.)43 b(Thus,)27
+b(there)e(is)i(a)f(need)f(for)54 2057 y(a)c(pre-processor)e(\(written)h
+(by)h(us\))g(that)g(translates)h(between)54 2156 y(these)e(competing)e
+(representations.)-29 2344 y(Prairie)26 b(strives)h(for)e(uniformity)g
+(in)h(dealing)g(with)g(issues)i(that)-114 2444 y(have)18
+b(been)g(a)i(source)e(of)g(most)h(user)g(ef)o(fort)e(and)i(potential)f
+(user)g(er)n(-)-117 2543 y(rors.)26 b(In)16 b(the)h(following)e
+(sections,)i(we)g(present)f(the)h(Prairie)f(frame-)-112
+2643 y(work.)26 b(W)-7 b(e)22 b(explain)d(how)h(our)f(P2V)i
+(pre-processor)d(maps)i(Prairie)-112 2742 y(rule)i(speci\256cations)h
+(into)g(V)-11 b(olcano)23 b(rule)g(speci\256cations)g(that)g(can)-118
+2842 y(be)16 b(processed)f(ef)o(\256ciently)-5 b(.)24
+b(Experimental)14 b(results)i(to)g(support)e(this)-120
+2942 y(claim)g(are)g(given)f(in)h(Section)g(4,)h(where)e(we)i(compare)d
+(implementa-)-117 3041 y(tions)17 b(of)g(the)f(T)-6 b(exas)17
+b(Instruments)e(Open)h(OODB)i(query)d(optimizer)-112
+3141 y(using)24 b(both)h(Prairie)g(and)g(V)-11 b(olcano.)41
+b(W)-7 b(e)26 b(conclude)e(with)h(a)h(sum-)-112 3241
+y(mary)19 b(and)h(related)f(research.)-117 3527 y FB(2)120
+b(Prairie:)37 b(A)26 b(language)f(for)g(rule)h(speci\256-)67
+3677 y(cation)-112 3864 y FG(The)c(basic)h(concepts)f(and)h
+(de\256nitions)f(that)h(underlie)f(the)h(Prairie)-118
+3964 y(model)14 b(are)i(presented)e(in)i(this)g(section.)25
+b(The)15 b(goal)g(is)h(to)g(lay)f(a)h(foun-)-117 4064
+y(dation)g(for)h(reasoning)e(about)h(query)f(optimization)g
+(algebraically;)-112 4163 y(this)21 b(is)i(necessary)d(for)h(our)f
+(subsequent)g(discussion)h(about)f(trans-)-112 4263 y(lating)f(Prairie)
+h(speci\256cations)g(to)h(those)f(of)f(V)-11 b(olcano.)-112
+4507 y Fx(2.1)99 b(Notation)24 b(and)i(assumptions)-114
+4665 y Fw(Stor)o(ed)19 b(Files)h(and)f(Str)o(eams.)82
+b FG(A)20 b(\256le)f(is)i FF(stor)m(ed)g FG(if)e(its)h(tuples)f(re-)
+-112 4764 y(side)h(on)g(disk.)27 b(In)20 b(the)h(case)g(of)f
+(relational)f(databases,)h(stored)g(\256les)-116 4864
+y(are)c(sometimes)h(called)g FF(base)f(r)m(elations)p
+FG(;)i(we)f(will)h(denote)e(them)g(by)-118 4964 y Fv(R)i
+FG(or)d Fv(R)111 4976 y Fu(i)139 4964 y FG(.)26 b(In)16
+b(object-oriented)d(schemas,)k(stored)e(\256les)i(are)f
+FF(classes)p FG(;)-112 5063 y(we)21 b(will)i(denote)d(them)h(by)g
+FF(C)i FG(or)e FF(C)918 5075 y Fu(i)946 5063 y FG(.)31
+b(Henceforth,)20 b(whenever)f(we)-115 5163 y(refer)f(to)g(a)h(stored)f
+(\256le,)h(we)g(mean)e(a)i(relation)f(or)g(a)g(class;)i(when)e(the)-118
+5263 y(distinction)c(is)i(unimportant,)d(we)j(will)g(use)f
+Fv(F)28 b FG(or)15 b Fv(F)1365 5275 y Fu(i)1393 5263
+y FG(.)26 b(A)16 b FF(str)m(eam)f FG(is)h(a)2042 21 y(sequence)i(of)h
+(tuples)g(and)f(is)i(the)f(result)g(of)g(a)g(computation)e(on)h(one)
+2037 120 y(or)d(more)f(streams)h(or)f(stored)h(\256les;)i(tuples)e(of)g
+(streams)g(are)f(returned)2044 220 y(one)20 b(at)i(a)f(time,)g
+(typically)f(on)g(demand.)28 b(Streams)21 b(can)g(be)f
+FF(named)p FG(,)2044 319 y(denoted)e(by)i Fv(S)2482 331
+y Fu(i)2510 319 y FG(,)g(or)g FF(unnamed)p FG(.)2044
+536 y Fw(Database)f(Operations.)82 b FG(An)20 b FF(operation)f
+FG(is)i(a)g(computation)d(on)2044 635 y(one)j(or)h(more)f(streams)i(or)
+f(stored)f(\256les.)34 b(There)21 b(are)h(two)g(types)g(of)2043
+735 y(database)c(operations)g(in)h(Prairie:)27 b(abstract)19
+b(\(or)g(implementation-)2043 835 y(unspeci\256ed\))g(operators)f(and)h
+(concrete)g(algorithms.)26 b(Each)19 b(is)i(de-)2044
+934 y(tailed)f(below)-5 b(.)2210 1103 y Fw(Operators.)39
+b FG(Abstract)28 b(\(or)f(conceptual\))e FF(operators)i
+FG(spec-)2392 1203 y(ify)c(computations)e(on)i(streams)g(or)g(stored)g
+(\256les;)j(they)2392 1302 y(are)38 b(denoted)d(by)i(all)h(capital)f
+(letters)h(\(e.g.,)i(JOIN\).)2392 1402 y(Operators)25
+b(have)h(two)g(types)g(of)f(parameters:)38 b(essen-)2392
+1502 y(tial)k(and)f(additional.)88 b FF(Essential)41
+b(parameters)g FG(are)2392 1601 y(the)c(stream)g(or)f(\256le)h(inputs)f
+(to)h(an)g(operator;)43 b(these)2392 1701 y(are)d(the)f(primary)f
+(inputs)h(to)g(be)h(processed)e(by)h(an)2392 1800 y(operator)-5
+b(.)31 b FF(Additional)20 b(parameters)i FG(are)g(\252\256ne-grain\272)
+2392 1900 y(quali\256cations)k(of)g(an)g(operator;)h(their)f(purpose)f
+(is)i(to)2392 2000 y(describe)19 b(an)g(operator)f(in)i(more)e(detail)i
+(than)f(essential)2392 2099 y(parameters.)2210 2223 y
+Fw(Algorithms.)40 b FF(Algorithms)75 b FG(are)h(concrete)e(implemen-)
+2392 2323 y(tations)46 b(of)f(conceptual)e(operators;)56
+b(they)45 b(will)h(be)2392 2422 y(represented)40 b(in)h(lower)g(case)g
+(with)h(the)f(\256rst)h(letter)2392 2522 y(capitalized)50
+b(\(e.g.,)56 b(Nested)p 3265 2522 25 4 v 29 w(loops\).)115
+b(Algorithms)2392 2621 y(have)34 b(at)g(least)h(the)f(same)g(essential)
+g(and)f(additional)2392 2721 y(parameters)24 b(as)h(the)f(conceptual)e
+(operators)h(that)i(they)2392 2821 y(implement.)2770
+2791 y Ft(1)2897 2821 y FG(Furthermore,)45 b(there)c(can)g(be,)47
+b(and)2392 2920 y(usually)35 b(are,)j(several)c(algorithms)g(for)g(a)h
+(particular)2392 3020 y(operator)-5 b(.)2044 3189 y(T)f(able)26
+b(1)h(lists)h(some)e(operators)f(and)h(algorithms)f(implementing)2044
+3288 y(them)20 b(together)e(with)j(their)f(additional)f(parameters.)
+2044 3505 y Fw(Operator)i(T)-6 b(r)o(ees.)82 b FG(An)22
+b FF(operator)g(tr)m(ee)h FG(is)g(a)g(rooted)e(tree)h(whose)2044
+3604 y(non-leaf,)27 b(or)g FF(interior)p FG(,)i(nodes)e(are)h(database)
+e(operations)g(\(oper)n(-)2044 3704 y(ators)g(or)g(algorithms\))f(and)g
+(whose)h(leaf)h(nodes)e(are)i(stored)e(\256les.)2044
+3804 y(The)e(children)g(of)g(an)h(interior)e(node)h(in)h(an)g(operator)
+e(tree)h(are)h(the)2044 3903 y(essential)i(parameters)e(\(i.e.,)i(the)g
+(stream)f(or)g(\256le)h(parameters\))e(of)2044 4003 y(the)h(node.)42
+b(Additional)24 b(parameters)h(are)g(implicitly)g(attached)g(to)2039
+4102 y(each)16 b(node.)25 b(Algebraically)-5 b(,)15 b(operator)g(trees)
+i(are)f(compositions)f(of)2039 4202 y(database)g(operations;)h(thus,)g
+(we)h(will)f(also)h(call)f(operator)e(trees)i FF(ex-)2044
+4302 y(pr)m(essions)p FG(;)k(both)g(terms)g(will)h(be)f(used)g
+(interchangeably)-5 b(.)2046 4487 y(E)t Fz(X)t(A)t(M)t(P)t(L)t(E)24
+b FG(1)t(.)150 b(A)23 b(simple)g(expression)f(and)g(its)i(operator)d
+(tree)2044 4587 y(representation)h(are)h(shown)h(in)g(Figure)f(1\(a\).)
+38 b(Relations)24 b Fv(R)3831 4599 y Ft(1)3893 4587 y
+FG(and)2044 4686 y Fv(R)2107 4698 y Ft(2)2171 4686 y
+FG(are)j(\256rst)h(RET)m(rieved,)f(then)f(JOINed,)i(and)e(\256nally)h
+(SOR)-5 b(T)f(ed)2044 4786 y(resulting)13 b(in)h(a)h(stream)f(sorted)g
+(on)g(a)g(speci\256c)h(attribute.)24 b(The)14 b(\256gure)2044
+4886 y(shows)g(only)f(the)h(essential)h(parameters)e(of)h(the)g
+(various)f(operators,)2044 4985 y(not)20 b(the)g(additional)f
+(parameters.)915 b Fs(\003)p 2044 5107 788 4 v 2129 5160
+a Fr(1)2163 5184 y Fz(Algorithms)20 b(may)e(have)h Fq(tuning)g
+(parameters)h Fz(which)f(are)f(not)h(parameters)h(of)2044
+5263 y(the)e(operators)g(they)g(implement.)p eop
+%%Page: 3 3
+3 2 bop -112 71 2323 13 v -112 138 4 67 v -59 118 a Fp(Operator)p
+330 138 V 211 w(Description)p 912 138 V 294 w(Additional)17
+b(Parameters)p 1582 138 V 102 w(Algorithm)p 2207 138
+V -112 150 2323 13 v -112 217 4 67 v -59 232 a Fo(JOIN\()p
+Fu(S)127 240 y Fn(1)159 232 y Fo(,)d Fu(S)229 240 y Fn(2)261
+232 y Fo(\))p 330 217 V 104 w(Join)g(streams)g Fu(S)728
+240 y Fn(1)760 232 y Fo(,)g Fu(S)830 240 y Fn(2)p 912
+217 V 965 197 a Fo(tuple)p 1084 197 18 4 v 22 w(order)p
+1582 217 4 67 v 410 w(Nested)p 1800 197 18 4 v 20 w(loops\()p
+Fu(S)2003 205 y Fn(1)2036 197 y Fo(,)g Fu(S)2106 205
+y Fn(2)2138 197 y Fo(\))p 2207 217 4 67 v 1585 220 626
+4 v -112 283 4 67 v 330 283 V 912 283 V 965 263 a(join)p
+1058 263 18 4 v 22 w(predicate)p 1582 283 4 67 v 345
+w(Mer)o(ge)p 1789 263 18 4 v 20 w(join\()p Fu(S)1956
+271 y Fn(1)1989 263 y Fo(,)g Fu(S)2059 271 y Fn(2)2092
+263 y Fo(\))p 2207 283 4 67 v -112 286 2323 4 v -112
+363 4 77 v -59 407 a(RET\()p Fu(F)9 b Fo(\))p 330 363
+V 384 412 a(Retrieve)14 b(\256le)h Fu(F)p 912 363 V 965
+339 a Fo(tuple)p 1084 339 18 4 v 22 w(order)p 1582 363
+4 77 v 1635 353 a(File)p 1728 353 18 4 v 21 w(scan\()p
+Fu(F)9 b Fo(\))p 2207 363 4 77 v -112 429 4 67 v 330
+429 V 912 429 V 965 410 a(selection)p 1175 410 18 4 v
+21 w(predicate)p 1582 429 4 67 v 1585 397 622 4 v 2207
+429 4 67 v -112 497 4 68 v 330 497 V 912 497 V 965 477
+a(projected)p 1184 477 18 4 v 22 w(attributes)p 1582
+497 4 68 v 1635 469 a(Index)p 1770 469 18 4 v 21 w(scan\()p
+Fu(F)g Fo(\))p 2207 497 4 68 v -112 500 2323 4 v -112
+567 4 67 v -59 582 a(SOR)m(T\()p Fu(S)147 590 y Fn(1)178
+582 y Fo(\))p 330 567 V 384 583 a(Sort)15 b(stream)f
+Fu(S)705 591 y Fn(1)p 912 567 V 965 580 a Fo(tuple)p
+1084 580 18 4 v 22 w(order)p 1582 567 4 67 v 1635 547
+a(Mer)o(ge)p 1789 547 18 4 v 20 w(sort\()p Fu(S)1953
+555 y Fn(1)1986 547 y Fo(\))p 2207 567 4 67 v 1585 570
+626 4 v -112 633 4 67 v 330 633 V 912 633 V 1582 633
+V 1635 613 a(Null\()p Fu(S)1798 621 y Fn(1)1831 613 y
+Fo(\))p 2207 633 V -112 646 2323 13 v -112 793 a FG(T)-6
+b(able)17 b(1:)27 b(Operators)17 b(and)h(algorithms)e(in)j(a)f
+(centralized)f(query)g(optimizer)g(and)-112 893 y(their)i(additional)g
+(parameters)p 2477 33 1525 13 v 2477 99 4 67 v 2530 80
+a Fp(Pr)o(operty)p 3033 99 V 335 w(Description)p 3998
+99 V 2477 112 1525 13 v 2477 178 4 67 v 2530 158 a Fo(join)p
+2623 158 18 4 v 22 w(predicate)p 3033 178 4 67 v 232
+w(join)c(predicate)f(for)h(JOIN)g(operator)p 3998 178
+V 2477 182 1525 4 v 2477 248 4 67 v 2530 228 a(selection)p
+2740 228 18 4 v 21 w(predicate)p 3033 248 4 67 v 116
+w(selection)f(predicate)g(for)i(RET)d(operator)p 3998
+248 V 2477 251 1525 4 v 2477 318 4 67 v 2530 331 a(tuple)p
+2649 331 18 4 v 21 w(order)p 3033 318 4 67 v 3087 298
+a(tuple)h(order)i(of)e(resulting)h(stream,)p 3998 318
+V 2477 384 V 3033 384 V 3087 364 a(DONT)p 3252 364 18
+4 v 20 w(CARE)e(if)i(none)p 3998 384 4 67 v 2477 388
+1525 4 v 2477 454 4 67 v 2530 434 a(num)p 2636 434 18
+4 v 21 w(records)p 3033 454 4 67 v 262 w(number)g(of)g(tuples)f(of)h
+(resulting)g(stream)p 3998 454 V 2477 457 1525 4 v 2477
+524 4 67 v 2530 504 a(tuple)p 2649 504 18 4 v 21 w(size)p
+3033 524 4 67 v 329 w(size)f(of)g(individual)i(tuple)e(in)h(stream)p
+3998 524 V 2477 527 1525 4 v 2477 593 4 67 v 2530 574
+a(projected)p 2749 574 18 4 v 21 w(attributes)p 3033
+593 4 67 v 104 w(projected)f(attributes)h(for)h(RET)d(operator)p
+3998 593 V 2477 597 1525 4 v 2477 663 4 67 v 2530 643
+a(attributes)p 3033 663 V 341 w(list)h(of)h(attributes)p
+3998 663 V 2477 666 1525 4 v 2477 733 4 67 v 2530 713
+a(cost)p 3033 733 V 463 w(estimated)f(cost)g(of)h(algorithm)p
+3998 733 V 2477 745 1525 13 v 2477 893 a FG(T)-6 b(able)16
+b(2:)26 b(Properties)15 b(of)h(nodes)g(in)g(an)h(operator)d(tree)p
+-105 1246 1938 4 v -105 2116 4 870 v 61 1362 a Fm(SOR)n(T)c(\(JOIN)g
+(\(RET)h(\()p Fl(R)449 1374 y Fn(1)481 1362 y Fm(\),)f(RET)h(\()p
+Fl(R)661 1374 y Fn(2)693 1362 y Fm(\)\)\))346 1463 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 3.39499
+0.05246 false .5 12.4799 InitRnode } NewNode end end
+
+346 1463 a Fm(SOR)n(T)353 1557 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 3.39499
+0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 353 1557 a Fm(JOIN)303
+1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303 1732 a 264 1652 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 264 1652 a Fm(RET)453 1652
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 453 1652 a Fm(RET)303 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 303 1732 a 303 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+
+303 1732 a 265 1740 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 265 1740 a Fl(R)308 1752 y Fn(1)455
+1740 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 455 1740 a Fl(R)498 1752 y Fn(2)303 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303
+1732 a 303 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303 1732 a 27 1915 a Fz(\(a\))37 b(An)f(expression)i
+(and)f(its)27 1994 y(corresponding)19 b(operator)g(tree)p
+872 2091 4 820 v 1237 1458 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodemergesort 16 { .5 3.34
+1.07994 false .5 22.25977 InitRnode } NewNode end end
+ 1237 1458 a Fm(Mer)o(ge)p
+1346 1458 13 4 v 16 w(sort)1219 1553 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodenestedloops 16 { .5 3.39499
+1.07994 false .5 26.5197 InitRnode } NewNode end end
+ 1219 1553 a Fm(Nested)p
+1336 1553 13 4 v 16 w(loops)1235 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodemergesort
+/TheNodenestedloops InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1158
+1652 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr1 16 { .5 3.39499
+0.05246 false .5 18.4647 InitRnode } NewNode end end
+ 1158 1652 a Fm(File)p 1225 1652 13 4 v 15 w(scan)1347
+1652 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr2 16 { .5 3.39499
+0.05246 false .5 18.4647 InitRnode } NewNode end end
+ 1347 1652 a Fm(File)p 1414 1652 13 4 v 15 w(scan)1235
+1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodenestedloops
+/TheNodefilescanr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1235 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodenestedloops
+/TheNodefilescanr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1197 1740
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 1197 1740 a Fl(R)1240 1752 y Fn(1)1386 1740 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 1386
+1740 a Fl(R)1429 1752 y Fn(2)1235 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodefilescanr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1235 1732 a
+1235 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodefilescanr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1235 1732 a 959 1915 a Fz(\(b\))h(Possible)i(access)g(plan)
+g(for)959 1994 y(operator)d(tree)f(in)f(\(a\))p 1829
+2116 4 870 v -105 2119 1938 4 v 1831 2136 19 877 v -89
+2136 1938 19 v -25 2319 a FG(Figure)j(1:)27 b(Example)19
+b(of)h(an)g(operator)e(tree)i(and)g(access)h(plan)-117
+2521 y Fw(Descriptors.)83 b FG(A)17 b FF(pr)m(operty)f
+FG(of)h(a)g(node)f(is)i(a)f(\(user)n(-de\256ned\))e(vari-)-112
+2620 y(able)31 b(that)h(contains)f(information)e(used)i(by)h(an)f
+(optimizer)-5 b(.)61 b(An)-112 2720 y FF(annotation)25
+b FG(is)k(a)f Fk(h)p FF(pr)m(operty)-5 b(,)20 b(value)o
+Fk(i)29 b FG(pair)e(that)h(is)h(assigned)e(to)h(a)-112
+2819 y(node.)39 b(A)25 b FF(descriptor)g FG(is)h(a)f(list)h(of)e
+(annotations)f(that)i(describes)f(a)-112 2919 y(node)j(of)g(an)h
+(operator)f(tree;)32 b(every)27 b(node)g(has)h(its)h(own)f(descrip-)
+-112 3019 y(tor)-5 b(.)54 b(As)30 b(an)f(example,)h(T)-6
+b(able)29 b(2)h(lists)g(some)f(typical)g(properties)-112
+3118 y(that)21 b(might)f(be)h(used)f(in)h(a)h(descriptor)-5
+b(.)28 b(Note)21 b(that)g(descriptors)e(for)-112 3218
+y(stream)24 b(and)h(stored)f(\256les)i(may)e(have)h(dif)o(ferent)e
+(properties.)39 b(The)-114 3318 y(following)17 b(notations)h(will)h(be)
+g(useful)f(in)h(our)f(subsequent)g(discus-)-119 3417
+y(sions.)26 b(If)14 b Fv(S)220 3429 y Fu(i)263 3417 y
+FG(is)i(a)g(stream,)f(then)g Fj(D)877 3429 y Fi(i)918
+3417 y FG(is)h(its)g(descriptor)-5 b(.)24 b(Annotations)-112
+3517 y(of)c Fv(S)29 3529 y Fu(i)78 3517 y FG(are)h(accessed)g(by)f(a)i
+(structure)e(member)f(relationship,)h(e.g.,)-113 3616
+y Fj(D)-40 3628 y Fi(i)-14 3616 y Fv(:)p FG(num)p 163
+3616 25 4 v 28 w(records)o(.)27 b(Also,)20 b(let)h Fv(E)k
+FG(be)20 b(an)g(expression)f(and)g(let)h Fj(D)h FG(be)-112
+3716 y(its)g(descriptor)-5 b(.)26 b(W)-7 b(e)21 b(will)g(write)f(this)h
+(as)g Fv(E)28 b Fh(:)23 b Fj(D)p FG(.)-110 3904 y(E)t
+Fz(X)t(A)t(M)t(P)t(L)t(E)h FG(2)t(.)147 b(The)19 b(expression,)-112
+4055 y Fo(SOR)m(T)o Ft(\()p Fo(JOIN)o Ft(\()p Fo(RET)o
+Ft(\()p Fu(R)396 4063 y Fn(1)428 4055 y Ft(\):)p Fi(D)530
+4063 y Fg(3)566 4055 y Fu(;)p Fo(RET)o Ft(\()p Fu(R)772
+4063 y Fn(2)804 4055 y Ft(\):)p Fi(D)906 4063 y Fg(4)942
+4055 y Ft(\):)p Fi(D)1044 4063 y Fg(5)1079 4055 y Ft(\):)p
+Fi(D)1181 4063 y Fg(6)-112 4206 y FG(corresponds)k(to)j(the)f(operator)
+f(tree)i(in)g(Figure)f(1\(a\),)h(and)f(shows)-112 4305
+y(the)20 b(descriptors)f(of)h(the)g(various)f(nodes.)704
+b Fs(\003)-30 4466 y FG(A)19 b(notational)f(simpli\256cation)h(can)g
+(be)g(made)g(here.)26 b(Additional)-117 4565 y(parameters)14
+b(of)i(operators)f(can)h(be)g(treated)f(the)h(same)h(way)f(as)h(other)
+-112 4665 y(properties)i(of)h(a)h(node;)f(essential)h(parameters,)e
+(however)m(,)f(are)j FF(ex-)-115 4764 y(pr)m(essions)p
+FG(.)27 b(Thus,)18 b(the)g(term)g(descriptor)f(in)h(the)g(remainder)f
+(of)h(this)-112 4864 y(paper)24 b(will)i(refer)f(to)h(a)g(set)h(of)e
+(properties,)g(including)f(additional)-112 4964 y(parameters,)18
+b(as)j(shown)f(in)g(T)-6 b(able)20 b(2.)-35 5063 y(Currently)-5
+b(,)15 b(descriptor)f(properties)h(are)g(de\256ned)g(entirely)g(by)g
+(the)-112 5163 y(user;)34 b(however)m(,)c(we)g(envision)f(providing)e
+(a)j(hierarchy)e(of)i(pre-)-112 5263 y(de\256ned)19 b(descriptor)f
+(types)i(to)h(aid)f(this)h(process.)2042 1243 y Fw(Access)e(Plans.)83
+b FG(An)18 b FF(access)h(plan)f FG(is)h(an)g(operator)d(tree)j(in)g
+(which)2044 1343 y(all)i(interior)e(nodes)g(are)h(algorithms.)2046
+1630 y(E)t Fz(X)t(A)t(M)t(P)t(L)t(E)k FG(3)t(.)142 b(An)15
+b(access)h(plan)f(for)f(the)h(operator)f(tree)h(in)g(Fig-)2044
+1729 y(ure)20 b(1\(a\))f(is)i(shown)f(in)g(Figure)f(1\(b\).)826
+b Fs(\003)2044 2047 y Fx(2.2)99 b(Prairie)25 b(optimization)f(paradigm)
+2044 2230 y FG(Prairie)k(admits)f(two)h(rather)g(dif)o(ferent)d(means)j
+(of)g(optimization:)2044 2329 y(top-down)19 b(and)j(bottom-up.)29
+b(A)23 b(top-down)d(query)g(optimizer)h(op-)2041 2429
+y(timizes)d(the)g(parents)g(of)f(a)i(node)d(prior)h(to)h(optimizing)f
+(the)h(node)e(it-)2038 2529 y(self.)25 b(A)16 b(bottom-up)d(optimizer)h
+(optimizes)g(the)i(children)e(of)g(a)i(node)2044 2628
+y(prior)22 b(to)i(optimizing)d(the)j(node.)35 b(The)23
+b(earliest)h(optimizers)e(\(Sys-)2044 2728 y(tem)e(R)h([1)m(1])e(and)h
+(R)2617 2698 y Ff(\003)2676 2728 y FG([3]\))f(employed)f(the)j
+(bottom-up)c(approach.)2126 2842 y(Our)i(research)f(concentrates)g(on)h
+(a)h(top-down)e(optimization)f(of)2044 2942 y(operator)24
+b(trees.)46 b(W)-7 b(e)28 b(have)d(chosen)h(this)h(approach)d(because)i
+(we)2044 3042 y(intend)d(to)h(translate)g(Prairie)g(rules)g(into)f(the)
+h(format)f(required)f(by)2044 3141 y(the)28 b(V)-11 b(olcano)28
+b(query)f(optimizer)g(generator)f([7])i(which)g(is)h(based)2044
+3241 y(on)h(a)h(top-down)d(strategy)-5 b(.)56 b(Given)30
+b(an)g(appropriate)e(search)i(en-)2044 3340 y(gine,)24
+b(Prairie)f(can)g(potentially)g(also)h(be)f(used)h(with)f(a)i
+(bottom-up)2043 3440 y(optimization)18 b(strategy;)i(however)m(,)d(we)k
+(will)f(not)g(discuss)g(this)g(ap-)2044 3540 y(proach)e(in)j(this)f
+(paper)-5 b(.)2125 3654 y(In)18 b(query)g(optimization,)f(there)h(are)g
+(certain)g(annotations)g(\(such)2044 3754 y(as)29 b(additional)f
+(parameters\))f(that)i(are)g(known)e(before)g(any)i(opti-)2037
+3853 y(mization)14 b(is)i(begun.)23 b(These)15 b(annotations)e(can)i
+(be)f(computed)f(at)j(the)2043 3953 y(time)j(that)g(the)g(operator)f
+(tree)h(is)h(initialized,)f(and)g(will)h(not)f(change)2040
+4052 y(with)f(application)d(of)i(rules.)26 b(Our)17 b(following)f
+(discussions)h(assume)2044 4152 y(operator)h(trees)j(are)f
+(initialized.)2127 4266 y(There)41 b(are)h(two)h(types)f(of)g
+(algebraic)f(transformations)f(\(or)2044 4366 y FF(r)m(ewrite)34
+b(rules)p FG(\))e(in)h(Prairie:)52 b(T)-8 b(-rules)32
+b(\(\252transformation)e(rules\272\))2044 4466 y(and)22
+b(I-rules)f(\(\252implementation)f(rules\272\).)33 b(Each)22
+b(rule)g(transforms)2044 4565 y(an)j(expression)g(into)g(another)f
+(based)i(on)f(additional)f(conditions;)2044 4665 y(the)h
+(transformation)d(also)j(results)g(in)g(a)g(mapping)e(of)h(descriptors)
+2037 4764 y(between)14 b(expressions.)24 b(W)-7 b(e)16
+b(de\256ne)e(T)-8 b(-rules)14 b(and)g(I-rules)g(precisely)2042
+4864 y(in)20 b(the)f(following)e(sections)i(and)g(illustrate)g(them)f
+(with)i(examples.)2044 4964 y(Our)33 b(examples)g(are)h(chosen)f(from)f
+(rules)i(that)g(would)f(be)g(used)2044 5063 y(in)e(a)h(centralized)e
+(relational)g(query)g(optimizer;)36 b(the)31 b(operators,)2044
+5163 y(algorithms,)25 b(and)f(properties)g(are)h(subsets)h(of)f(those)g
+(in)h(T)-6 b(ables)25 b(1)2044 5263 y(and)19 b(2.)p eop
+%%Page: 4 4
+4 3 bop -110 24 1947 4 v -110 1929 4 1905 v 31 101 a
+Fu(E)s Ft(\()p Fu(x)147 109 y Fn(1)178 101 y Fu(;)11
+b(:)h(:)f(:)g(;)g(x)372 109 y Fl(n)412 101 y Ft(\))19
+b(:)g Fi(D)552 109 y Fg(1)606 101 y Ft(=)-11 b Ff(\))19
+b Fu(E)783 72 y Fe(0)805 101 y Ft(\()p Fu(x)869 109 y
+Fn(1)901 101 y Fu(;)12 b(:)f(:)g(:)g(;)g(x)1095 109 y
+Fl(n)1135 101 y Ft(\))19 b(:)g Fi(D)1275 109 y Fg(2)1656
+101 y Fo(\(1\))31 167 y Ff(ff)244 234 y Fo(pre-test)c(statements)31
+300 y Ff(gg)31 367 y Fo(test)31 433 y Ff(ff)244 500 y
+Fo(post-test)g(statements)31 566 y Ff(gg)493 709 y Fz(\(a\))j(General)g
+(form)f(of)g(a)g(T)-6 b(-rule)p -61 807 1849 4 v 31 884
+a Fo(JOIN)o Ft(\()p Fo(JOIN)p Ft(\()p Fu(S)375 892 y
+Fn(1)407 884 y Fu(;)11 b(S)479 892 y Fn(2)512 884 y Ft(\))18
+b(:)h Fi(D)651 892 y Fg(4)687 884 y Fu(;)11 b(S)759 892
+y Fn(3)791 884 y Ft(\))19 b(:)g Fi(D)931 892 y Fg(5)1656
+884 y Fo(\(2\))89 983 y Ft(=)-11 b Ff(\))18 b Fo(JOIN)p
+Ft(\()p Fu(S)406 991 y Fn(1)438 983 y Fu(;)11 b Fo(JOIN)p
+Ft(\()p Fu(S)662 991 y Fn(2)694 983 y Fu(;)g(S)766 991
+y Fn(3)799 983 y Ft(\))18 b(:)h Fi(D)938 991 y Fg(6)974
+983 y Ft(\))g(:)g Fi(D)1114 991 y Fg(7)31 1066 y Ff(ff)244
+1133 y Fi(D)301 1141 y Fg(6)337 1133 y Fu(:)p Fo(attributes)g
+Ft(=)g Fo(union)c Ft(\()p Fi(D)892 1141 y Fg(2)928 1133
+y Fu(:)p Fo(attributes)p Fu(;)c Fi(D)1252 1141 y Fg(3)1288
+1133 y Fu(:)p Fo(attributes)p Ft(\))j(;)31 1199 y Ff(gg)31
+1265 y Fo(is)p 73 1265 18 4 v 20 w(associative)g Ft(\()p
+Fi(D)443 1273 y Fg(6)479 1265 y Fu(:)p Fo(join)p 592
+1265 V 21 w(predicate)p Fu(;)d Fi(D)911 1273 y Fg(6)947
+1265 y Fu(:)p Fo(attributes)p Fu(;)g Fi(D)1271 1273 y
+Fg(5)1306 1265 y Fu(:)p Fo(join)p 1419 1265 V 22 w(predicate)p
+Ft(\))31 1332 y Ff(ff)244 1398 y Fi(D)301 1406 y Fg(7)356
+1398 y Ft(=)19 b Fi(D)483 1406 y Fg(5)533 1398 y Ft(;)244
+1465 y Fi(D)301 1473 y Fg(7)337 1465 y Fu(:)p Fo(join)p
+450 1465 V 21 w(predicate)g Ft(=)g Fi(D)827 1473 y Fg(4)863
+1465 y Fu(:)p Fo(join)p 976 1465 V 21 w(predicate)14
+b Ft(;)244 1531 y Fi(D)301 1539 y Fg(6)337 1531 y Fu(:)p
+Fo(tuple)p 476 1531 V 21 w(size)k Ft(=)h Fi(D)730 1539
+y Fg(2)766 1531 y Fu(:)p Fo(tuple)p 905 1531 V 21 w(size)14
+b Ft(+)h Fi(D)1151 1539 y Fg(3)1187 1531 y Fu(:)p Fo(tuple)p
+1326 1531 V 21 w(size)f Ft(;)244 1598 y Fi(D)301 1606
+y Fg(6)337 1598 y Fu(:)p Fo(num)p 463 1598 V 21 w(records)19
+b Ft(=)g Fo(cardinality)c Ft(\()p Fi(D)1087 1606 y Fg(2)1123
+1598 y Fu(;)c Fi(D)1211 1606 y Fg(3)1247 1598 y Ft(\))j(;)31
+1664 y Ff(gg)587 1807 y Fz(\(b\))j(Join)g(associativity)p
+1834 1929 4 1905 v -110 1932 1947 4 v 1835 1949 19 1912
+v -93 1949 1947 19 v 607 2131 a FG(Figure)j(2:)27 b(T)-8
+b(-rule)-112 2372 y Fx(2.3)99 b(T)-7 b(ransformation)25
+b(rules)-112 2549 y FG(T)m(ransformation)k(rules,)35
+b(or)d(T)-8 b(-rules)32 b(for)g(short,)i(de\256ne)e(equiva-)-112
+2649 y(lences)e(among)g(pairs)h(of)f(expressions;)36
+b(they)30 b(de\256ne)g(mappings)-112 2748 y(from)g(one)i(operator)e
+(tree)h(to)h(another)-5 b(.)61 b(Let)32 b Fv(E)37 b FG(and)32
+b Fv(E)1584 2718 y Ff(0)1639 2748 y FG(be)g(ex-)-112
+2848 y(pressions)19 b(that)i(involve)e(only)h(abstract)g(operators.)26
+b(Equation)18 b(\(1\))-112 2948 y(\(shown)k(in)i(Figure)e(2\(a\)\))h
+(shows)g(the)h(general)e(form)h(of)g(a)h(T)-8 b(-rule.)-112
+3047 y(The)19 b(actions)h(of)g(a)h(T)-8 b(-rule)20 b(de\256ne)f(the)i
+(equivalences)d(between)i(the)-114 3147 y(descriptors)f(of)g(nodes)f
+(of)h(the)h(original)e(operator)f(tree)i Fv(E)25 b FG(with)20
+b(the)-112 3247 y(nodes)27 b(of)g(the)h(output)f(tree)g
+Fv(E)796 3216 y Ff(0)820 3247 y FG(;)32 b(these)c(actions)g(consist)g
+(of)f(a)h(se-)-112 3346 y(ries)f(of)f(\(C)i(or)f(C++\))g(assignment)918
+3316 y Ft(2)981 3346 y FG(statements.)47 b(The)27 b(left-hand)-112
+3446 y(sides)21 b(of)f(these)h(statements)g(refer)f(to)h(descriptors)e
+(of)i(expressions)-112 3545 y(on)g(the)h(right-hand)e(side)j(of)f(the)g
+(T)-8 b(-rule;)22 b(the)h(right-hand)c(sides)k(of)-119
+3645 y(the)14 b(statements)h(can)f(refer)g(to)h(any)f(descriptor)f(in)h
+(the)h(T)-8 b(-rule.)24 b(Func-)-112 3745 y(tion)j(\(called)h
+FF(helper)g FG(functions\))e(calls)j(can)f(also)g(appear)f(on)h(the)
+-118 3844 y(right)15 b(side)h(of)f(the)h(assignment)e(statements.)26
+b(Thus,)15 b(descriptors)g(on)-114 3944 y(the)k FF(left-hand)f(side)i
+FG(of)e(a)i(T)-8 b(-rule)19 b(are)g FF(never)g FG(changed)e(in)j(the)f
+(rule')-5 b(s)-114 4044 y(actions.)26 b(A)19 b FF(test)h
+FG(is)f(needed)f(to)g(determine)g(if)g(the)h(transformations)-112
+4143 y(of)g(the)i(T)-8 b(-rule)19 b(are)h(in)h(fact)f(applicable.)-34
+4254 y(Purely)c(as)i(an)e(optimization,)g(it)h(is)h(usually)e(the)g
+(case)h(that)g(not)f(all)-118 4354 y(statements)g(in)g(a)g(T)-8
+b(-rule')j(s)16 b(actions)f(need)g(to)h(be)g(executed)e(prior)h(to)h(a)
+-114 4454 y(T)-8 b(-rule')j(s)18 b(test.)28 b(For)18
+b(this)i(reason,)e(the)h(actions)f(of)h(a)g(T)-8 b(-rule)18
+b(are)h(split)-112 4553 y(into)i(two)g(groups;)g(those)h(that)f(need)g
+(to)h(be)f(executed)g(prior)f(to)i(the)-119 4653 y(T)-8
+b(-rule')j(s)14 b(test,)i(and)e(those)h(that)f(can)h(be)f(executed)g
+(after)g(a)h(successful)-113 4753 y(test.)27 b(These)19
+b(groups)f(of)h(statements)h(comprise,)e(respectively)-5
+b(,)18 b(the)p -112 4870 788 4 v -28 4924 a Fr(2)7 4947
+y Fz(The)13 b(actions)i(can)e(be)g(non-assignment)j(statements)e
+(\(like)h(function)g(calls\),)f(but)-112 5026 y(in)23
+b(this)h(case,)i(the)e(P2V)f(pre-processor)j(\(described)f(in)f
+(Section)h(3\))f(needs)g(some)-112 5105 y(hints)15 b(about)i(the)f
+(properties)h(that)f(are)g(changed)h(by)f(the)g(statement)h(in)e(order)
+h(to)g(cor)o(-)-112 5184 y(rectly)g(categorize)j(each)d(property)l(.)22
+b(For)15 b(simplicity)l(,)i(in)e(this)h(paper)m(,)g(we)f(assume)g(all)
+-112 5263 y(actions)j(consist)g(of)f(assignment)i(statements.)p
+2046 24 1947 4 v 2046 1688 4 1664 v 2187 92 a Fu(E)s
+Ft(\()p Fu(x)2303 100 y Fn(1)2335 92 y Fu(;)11 b(:)g(:)g(:)g(;)g(x)2528
+100 y Fl(n)2568 92 y Ft(\))19 b(:)g Fi(D)2708 100 y Fg(1)2763
+92 y Ft(=)-11 b Ff(\))18 b Fu(A)p Ft(\()p Fu(x)3001 100
+y Fn(1)3033 92 y Fu(;)11 b(:)g(:)g(:)g(;)h(x)3227 100
+y Fl(n)3267 92 y Ft(\))19 b(:)f Fi(D)3406 100 y Fg(2)3812
+92 y Fo(\(3\))2187 159 y(test)2187 225 y Ff(ff)2401 292
+y Fo(pre-opt)d(statements)2187 358 y Ff(gg)2187 424 y(ff)2401
+491 y Fo(post-opt)g(statements)2187 557 y Ff(gg)2639
+700 y Fz(\(a\))i(General)i(form)e(of)g(an)g(I-rule)p
+2095 798 1849 4 v 2187 875 a Fo(SOR)m(T)o Ft(\()p Fu(S)2399
+883 y Fn(1)2431 875 y Ft(\))i(:)f Fi(D)2570 883 y Fg(2)2625
+875 y Ft(=)-11 b Ff(\))19 b Fo(Mer)o(ge)p 2904 875 18
+4 v 21 w(sort)p Ft(\()p Fu(S)3076 883 y Fn(1)3108 875
+y Ft(\))g(:)f Fi(D)3247 883 y Fg(3)3812 875 y Fo(\(4\))2187
+958 y Ft(\()p Fi(D)2270 966 y Fg(2)2306 958 y Fu(:)p
+Fo(tuple)p 2445 958 V 20 w(order)e Ft(!)9 b(=)18 b Fo(DONT)p
+2862 958 V 21 w(CARE)o Ft(\))2187 1024 y Ff(ff)2401 1091
+y Fi(D)2458 1099 y Fg(3)2512 1091 y Ft(=)h Fi(D)2639
+1099 y Fg(2)2690 1091 y Ft(;)2187 1157 y Ff(gg)2187 1224
+y(ff)2401 1290 y Fi(D)2458 1298 y Fg(3)2493 1290 y Fu(:)p
+Fo(cost)g Ft(=)g Fi(D)2753 1298 y Fg(1)2788 1290 y Fu(:)p
+Fo(cost)2699 1356 y Ft(+\()p Fi(D)2833 1364 y Fg(3)2868
+1356 y Fu(:)p Fo(num)p 2994 1356 V 21 w(records)p Ft(\))c
+Ff(\003)h Ft(log\()p Fi(D)3442 1364 y Fg(3)3478 1356
+y Fu(:)p Fo(num)p 3604 1356 V 21 w(records)p Ft(\))f(;)2187
+1423 y Ff(gg)2630 1565 y Fz(\(b\))i(Mer)o(ge-sort)i(sort)e(algorithm)p
+3990 1688 4 1664 v 2046 1691 1947 4 v 3992 1708 19 1671
+v 2063 1708 1947 19 v 2771 1890 a FG(Figure)j(3:)27 b(I-rule)2044
+2113 y FF(pr)m(e-test)21 b FG(and)f FF(post-test)g FG(statements)h(of)f
+(the)g(T)-8 b(-rule.)3565 2083 y Ft(3)2046 2330 y FG(E)t
+Fz(X)t(A)t(M)t(P)t(L)t(E)24 b FG(4)t(.)142 b(The)14 b(associativity)h
+(of)g(JOINs)h(is)g(expressed)d(by)2044 2430 y(T)-8 b(-rule)19
+b(\(2\))h(in)g(Figure)g(2\(b\).)1082 b Fs(\003)2044 2683
+y Fx(2.4)99 b(Implementation)26 b(rules)2044 2844 y FG(Implementation)k
+(rules,)35 b(or)e(I-rules)f(for)g(short,)j(de\256ne)e(equiva-)2044
+2944 y(lences)e(between)g(expressions)g(and)g(their)g(implementing)f
+(algo-)2044 3043 y(rithms.)i(Let)23 b Fv(E)k FG(be)c(an)f(expression)f
+(and)g Fv(A)i FG(be)f(an)g(algorithm)f(that)2044 3143
+y(implements)26 b Fv(E)5 b FG(.)51 b(The)27 b(general)g(form)f(of)i(an)
+f(I-rule)g(is)i(given)d(by)2044 3242 y(Equation)18 b(\(3\))i(\(shown)f
+(in)h(Figure)g(3\(a\)\).)2127 3345 y(The)g(actions)h(associated)g(with)
+g(an)g(I-rule)f(are)h(de\256ned)e(in)j(three)2044 3445
+y(parts.)35 b(The)23 b(\256rst)h(part,)f(or)g FF(test)p
+FG(,)i(is)f(a)f(boolean)f(expression)f(whose)2044 3544
+y(value)e(determines)g(whether)h(or)f(not)h(the)h(rule)e(can)h(be)g
+(applied.)2123 3647 y(The)d(second)g(part,)g(or)g FF(pr)m(e-opt)f
+(statements)p FG(,)i(is)h(a)e(set)h(of)g(descrip-)2044
+3746 y(tor)23 b(assignment)g(statements)g(that)h(are)f(executed)f(only)
+h(if)h(the)f(test)2044 3846 y(is)i(true)f(and)f FF(befor)m(e)h
+FG(any)g(of)g(the)g(inputs)g Fv(x)3296 3858 y Fu(i)3349
+3846 y FG(of)g Fv(E)30 b FG(are)24 b(optimized.)2044
+3946 y(Additional)e(parameters)g(of)i(nodes)f(are)g(usually)g(assigned)
+g(in)h(the)2039 4045 y(pre-opt)15 b(section.)25 b(This)16
+b(is)h(necessary)f(before)f(any)h(of)f(the)i(nodes)e(on)2044
+4145 y(the)20 b(right)g(side)g(can)g(be)g(optimized.)2127
+4248 y(The)g(third)h(part,)g(or)f FF(post-opt)g(statements)p
+FG(,)h(is)h(a)g(set)f(of)g(descrip-)2044 4347 y(tor)i(assignment)f
+(statements)i(that)f(are)g(executed)f FF(after)i FG(all)g
+Fv(x)3859 4359 y Fu(i)3911 4347 y FG(are)2044 4447 y(optimized.)k
+(Normally)-5 b(,)19 b(the)i(post-opt)f(statements)h(compute)f(cost)2040
+4546 y(properties)c(that)h(can)g(only)g(be)g(determined)e(once)h(the)i
+(inputs)e(to)i(the)2044 4646 y(algorithm)i(are)i(completely)f
+(optimized)g(and)g(their)h(costs)h(known.)2044 4746 y(This)33
+b FF(does)g(not)p FG(,)j(however)m(,)e(imply)f(a)g(bottom-up)e
+(optimization)2044 4845 y(strategy)-5 b(.)41 b(It)26
+b(simply)e(means)h(that)h(although)d(I-rules)i(are)g(applied)2044
+4945 y(to)20 b(parents)g(before)g(their)g(children)f(are)i(optimized,)e
+(the)h FF(cost)i FG(\(and)p 2044 5028 788 4 v 2129 5081
+a Fr(3)2163 5105 y Fz(W)-5 b(e)19 b(suspect)i(it)e(is)h(possible)g(to)g
+(use)g(data-\257ow)g(analysis)h(to)f(partition)i(the)e(as-)2044
+5184 y(signment)i(statements)h(automatically)l(,)i(but)c(for)g(now)l(,)
+g(we)g(let)h(the)g(rule-writer)h(do)2044 5263 y(the)18
+b(partitioning.)p eop
+%%Page: 5 5
+5 4 bop -115 21 a FG(other)18 b(properties)f(in)h(the)h(post-opt)e
+(section\))g(of)h(the)h(parent)e(cannot)-112 120 y(be)j(computed)e
+(until)i(the)g(children)f(have)g(been)h(optimized.)-110
+326 y(E)t Fz(X)t(A)t(M)t(P)t(L)t(E)k FG(5)t(.)146 b(Equation)19
+b(\(4\))g(\(in)h(Figure)f(3\(b\)\))g(shows)h(the)g(I-)-112
+425 y(rule)f(that)i(implements)e(the)h(SOR)-5 b(T)21
+b(operator)d(by)i(Mer)o(ge)p 1564 425 25 4 v 28 w(sort.)59
+b Fs(\003)-112 668 y Fx(2.5)99 b(Null)24 b(algorithm)-112
+826 y FG(Recall)g(that,)i(in)e(Section)g(1,)h(we)g(mentioned)d(that)i
+(Prairie)g(allows)-112 925 y(users)g(to)g(treat)g(all)g(operators)f
+(and)g(algorithms)g(as)i(\256rst-class)g(ob-)-112 1025
+y(jects,)g(i.e.,)g(all)f(operators)e(and)i(algorithms)f(are)g
+(explicit,)i(in)f(con-)-112 1125 y(trast)i(to)g(enforcers)e(in)h(V)-11
+b(olcano)25 b(or)h(glue)f(in)h(Starburst.)42 b(This)26
+b(re-)-119 1224 y(quires)15 b(that)g(Prairie)g(provide)f(a)h(mechanism)
+f(where)g(users)i(can)f(also)-112 1324 y(\252delete\272)21
+b(one)g(or)h(more)f(of)h(the)g(explicit)g(operators)e(from)h(expres-)
+-112 1423 y(sions.)33 b(This)23 b(is)g(done)f(by)g(having)f(a)i
+(special)f(class)i(of)e(I-rules)g(that)-115 1523 y(have)c(the)g(form)f
+(given)g(by)h(Equation)e(\(5\))i(in)g(Figure)g(4\(a\).)25
+b(The)18 b(left)-120 1623 y(side)c(of)f(the)h(rule)f(is)i(a)f(single)g
+(abstract)f(operator)f Fv(O)17 b FG(with)d(one)f(stream)-112
+1722 y(input)25 b Fv(S)136 1734 y Ft(1)173 1722 y FG(.)46
+b(The)26 b(right)g(side)g(of)g(the)h(rule)f(is)h(an)f(algorithm)f
+(called)-112 1822 y(\252Null\272)f(with)h(the)g(same)g(stream)g(input)f
+(but)h(with)g(a)g(dif)o(ferent)e(de-)-112 1922 y(scriptor)-5
+b(.)42 b(As)26 b(the)g(name)e(suggests,)j(the)e(Null)h(algorithm)e(is)i
+(sup-)-112 2021 y(posed)21 b(to)i(pass)g(its)g(input)f(unchanged)e(to)i
+(algorithms)f(above)h(it)h(in)-112 2121 y(an)h(operator)f(tree.)41
+b(This)25 b(is)h(accomplished)c(in)j(the)g(I-rule)f(as)h(fol-)-112
+2220 y(lows.)-29 2321 y(The)c(test)i(for)e(this)i(I-rule)e(is)i(always)
+f(TRUE,)g(i.e.,)g(any)g(node)f(in)-112 2421 y(an)g(operator)f(tree)i
+(with)g Fv(O)k FG(as)c(its)h(operator)d(can)i(be)g(implemented)-113
+2520 y(by)e(the)g(Null)g(algorithm.)25 b(The)20 b(actions)f(associated)
+h(with)g(this)g(rule)-115 2620 y(have)d(a)h(speci\256c)g(pattern.)25
+b(The)18 b(pre-opt)e(section)h(consists)i(of)e(three)-112
+2720 y(statements.)36 b(The)23 b(\256rst)h(statement)f(copies)g(the)h
+(descriptor)e(of)h(the)-116 2819 y(operator)16 b Fv(O)21
+b FG(to)d(the)g(algorithm)e(Null.)26 b(The)17 b(second)g(statement)h
+(sets)-112 2919 y(the)25 b(descriptor)e(of)i(the)g(stream)g
+Fv(S)892 2931 y Ft(1)955 2919 y FG(on)g(the)g(right)f(side)i(to)f(the)g
+(de-)-117 3018 y(scriptor)15 b(of)h(the)g(stream)g Fv(S)646
+3030 y Ft(1)700 3018 y FG(on)f(the)h(left)h(side.)26
+b(Why)16 b(is)h(it)f(necessary)-119 3118 y(to)e(do)g(this?)26
+b(The)14 b(key)g(lies)h(in)f(the)h(third)f(statement.)24
+b(This)15 b(statement)-117 3218 y(copies)h(the)g(property)f
+(\252property\272)e(of)k(the)f(operator)f Fv(O)k FG(node)c(on)h(the)
+-116 3317 y(left)i(side)g(to)g(the)f(\252property\272)e(of)j(the)f
+(input)g(stream)h Fv(S)1427 3329 y Ft(1)1482 3317 y FG(on)f(the)h
+(right)-112 3417 y(side.)32 b(Since)22 b(left-hand)e(side)j
+(descriptors)e(cannot)g(be)g(changed)g(in)-115 3517 y(an)c(I-rule,)g(a)
+h(new)g(descriptor)e Fj(D)840 3529 y Fi(3)900 3517 y
+FG(is)j(necessary)e(for)g Fv(S)1481 3529 y Ft(1)1537
+3517 y FG(to)g(convey)-112 3616 y(the)j(property)e(propagation)f
+(information.)-29 3717 y(The)48 b(post-opt)f(section)h(in)h(the)g
+(I-rule)e(has)i(only)f(a)h(cost-)-112 3817 y(assignment)44
+b(statement;)57 b(this)46 b(simply)e(sets)j(the)e(cost)g(of)g(the)-112
+3916 y(Null)20 b(node)f(to)h(the)h(cost)f(of)g(its)h(optimized)e(input)
+g(stream.)-31 4017 y(The)f(Null)g(algorithm,)g(therefore,)e(serves)j
+(to)g(ef)o(fectively)d(trans-)-112 4116 y(form)j(a)h(single)g(operator)
+f(to)h(a)h(no-op.)-110 4322 y(E)t Fz(X)t(A)t(M)t(P)t(L)t(E)j
+FG(6)t(.)146 b(Equation)19 b(\(6\))g(\(in)h(Figure)f(4\(b\)\))g(shows)h
+(the)g(I-)-112 4422 y(rule)15 b(that)g(rewrites)g(the)h(SOR)-5
+b(T)16 b(operator)d(to)j(use)f(a)h(Null)g(algorithm.)-112
+4521 y Fs(\003)-112 4876 y FB(3)119 b(The)30 b(P2V)g(pr)n(e-pr)n
+(ocessor)-112 5063 y FG(In)38 b(Section)g(1,)43 b(we)c(enumerated)e
+(the)h(four)g(primary)f(goals)h(of)-112 5163 y(Prairie,)22
+b(viz.,)g(uniformity)e(in)i(operator)e(and)i(algorithms;)f(unifor)n(-)
+-112 5263 y(mity)i(in)h(properties;)h(uniformity)c(in)j
+(property-transformations;)p 2046 24 1947 4 v 2046 1887
+4 1864 v 2187 92 a Fu(O)r Ft(\()p Fu(S)2306 100 y Fn(1)2338
+92 y Ft(\))19 b(:)g Fi(D)2478 100 y Fg(2)2532 92 y Ft(=)-11
+b Ff(\))19 b Fo(Null)q Ft(\()p Fu(S)2828 100 y Fn(1)2879
+92 y Ft(:)f Fi(D)2973 100 y Fg(3)3009 92 y Ft(\))h(:)g
+Fi(D)3149 100 y Fg(4)3812 92 y Fo(\(5\))2187 159 y(TRUE)2187
+225 y Ff(ff)2401 292 y Fi(D)2458 300 y Fg(4)2512 292
+y Ft(=)g Fi(D)2639 300 y Fg(2)2690 292 y Ft(;)2401 358
+y Fi(D)2458 366 y Fg(3)2512 358 y Ft(=)g Fi(D)2639 366
+y Fg(1)2690 358 y Ft(;)2401 424 y Fi(D)2458 432 y Fg(3)2493
+424 y Fu(:)p Fo(property)h Ft(=)f Fi(D)2856 432 y Fg(2)2892
+424 y Fu(:)p Fo(property)c Ft(;)2187 491 y Ff(gg)2187
+557 y(ff)2401 624 y Fi(D)2458 632 y Fg(4)2493 624 y Fu(:)p
+Fo(cost)k Ft(=)g Fi(D)2753 632 y Fg(3)2788 624 y Fu(:)p
+Fo(cost)14 b Ft(;)2187 690 y Ff(gg)2559 833 y Fz(\(a\))j(General)i
+(form)e(of)g(a)g(\252Null\272)h(I-rule)p 2095 931 1849
+4 v 2187 1008 a Fo(SOR)m(T)o Ft(\()p Fu(S)2399 1016 y
+Fn(1)2431 1008 y Ft(\))h(:)f Fi(D)2570 1016 y Fg(2)2683
+1008 y Ft(=)-11 b Ff(\))19 b Fo(Null)p Ft(\()p Fu(S)2978
+1016 y Fn(1)3029 1008 y Ft(:)g Fi(D)3124 1016 y Fg(3)3160
+1008 y Ft(\))g(:)g Fi(D)3300 1016 y Fg(4)3812 1008 y
+Fo(\(6\))2187 1091 y(TRUE)2187 1157 y Ff(ff)2401 1224
+y Fi(D)2458 1232 y Fg(4)2512 1224 y Ft(=)g Fi(D)2639
+1232 y Fg(2)2690 1224 y Ft(;)2401 1290 y Fi(D)2458 1298
+y Fg(3)2512 1290 y Ft(=)g Fi(D)2639 1298 y Fg(1)2690
+1290 y Ft(;)2401 1356 y Fi(D)2458 1364 y Fg(3)2493 1356
+y Fu(:)p Fo(tuple)p 2632 1356 18 4 v 21 w(order)h Ft(=)f
+Fi(D)2919 1364 y Fg(2)2955 1356 y Fu(:)p Fo(tuple)p 3094
+1356 V 20 w(order)d Ft(;)2187 1423 y Ff(gg)2187 1489
+y(ff)2401 1556 y Fi(D)2458 1564 y Fg(4)2493 1556 y Fu(:)p
+Fo(cost)j Ft(=)g Fi(D)2753 1564 y Fg(3)2788 1556 y Fu(:)p
+Fo(cost)14 b Ft(;)2187 1622 y Ff(gg)2718 1765 y Fz(\(b\))j(Null)h(sort)
+f(algorithm)p 3990 1887 4 1864 v 2046 1890 1947 4 v 3992
+1907 19 1870 v 2063 1907 1947 19 v 2366 2090 a FG(Figure)j(4:)27
+b(The)20 b(\252Null\272)g(algorithm)f(concept)2044 2301
+y(and)37 b(ef)o(\256cient)f(generation)g(of)h(Prairie)g(optimizers.)78
+b(The)37 b(\256rst)2041 2401 y(three)18 b(goals)f(are)h(driven)f(by)g
+(the)h(need)g(for)f(conceptual)f(simplicity;)2044 2500
+y(however)m(,)33 b(they)f(alone)f(do)h(not)g(necessarily)g(generate)f
+(ef)o(\256cient)2044 2600 y(optimizers.)61 b(The)31 b(P2V)h
+(pre-processor)e(ensures)h(that)h(ef)o(\256cient)2044
+2700 y(optimizers)e(can)h(be)f(realized)h(from)f(Prairie)h
+(speci\256cations,)h(by)2044 2799 y(translating)c(them)i(to)f(the)h(V)
+-11 b(olcano)29 b(framework)e(and)i(then)g(gen-)2044
+2899 y(erating)22 b(an)h(optimizer)f(by)h(compiling)f(with)h(the)g(V)
+-11 b(olcano)22 b(search)2041 2999 y(engine.)j(This)18
+b(Prairie)g(optimizer)n(-generator)c(paradigm)i(is)j(shown)2044
+3098 y(schematically)j(in)h(Figure)f(5.)35 b(The)23 b(pre-processor)d
+(itself)k(is)f(4500)2044 3198 y(lines)f(of)g Fd(flex)g
+FG(and)g Fd(bison)f FG(code.)33 b(In)21 b(this)i(section,)f(we)h
+(brie\257y)2038 3297 y(describe)14 b(the)i(pre-processor)c(steps)k(and)
+f(explain)f(why)h(the)g(Prairie-)2044 3397 y(to-V)-11
+b(olcano)27 b(transformation)e(is)30 b(non-trivial.)49
+b(A)29 b(more)f(detailed)2044 3497 y(description)18 b(of)i(the)h
+(pre-processor)c(is)k(given)e(in)i([5].)2125 3596 y(The)d
+(speci\256cation)g(of)g(an)g(optimizer)f(in)i(V)-11 b(olcano)18
+b(consists)h(of)f(a)2043 3696 y(set)j(of)e(transformation)e(rules)j
+(\(called)f(\252trans)p 3386 3696 25 4 v 29 w(rules\272\))g(and)g
+(imple-)2037 3796 y(mentation)14 b(rules)h(\(called)f(\252impl)p
+2998 3796 V 29 w(rules\272\),)h(a)g(set)h(of)f(properties,)f(and)2038
+3895 y(some)h(support)e(functions.)24 b(The)15 b(join)g(associativity)g
+(trans)p 3737 3895 V 29 w(rule)g(\(cf.)2044 3995 y(Figure)k(2\(b\)\))g
+(in)h(V)-11 b(olcano)20 b(is)h(as)g(follows)3261 3965
+y Ft(4)3297 3995 y FG(:)2210 4155 y Ft(\()p Fo(JOIN)f(?op)p
+2469 4155 18 4 v 21 w(ar)o(g5)h Ft(\(\()p Fo(JOIN)g(?op)p
+2896 4155 V 21 w(ar)o(g4)g Ft(\(?1)g(?2\)\))g(?3\)\))2293
+4280 y Ff(\000)-23 b Fu(>)p Ft(\()p Fo(JOIN)20 b(?op)p
+2633 4280 V 21 w(ar)o(g7)h Ft(\(?1)g(\()p Fo(JOIN)g(?op)p
+3145 4280 V 21 w(ar)o(g6)g Ft(\(?2)g(?3\)\)\)\))2044
+4440 y FG(The)32 b(important)f(point)g(to)i(note)f(is)h(the)g(use)f(of)
+h FF(operator)e(ar)m(gu-)2044 4540 y(ments)21 b FG(\(denoted)e(by)h
+(\252op)p 2801 4540 25 4 v 29 w(ar)o(g\272)g(in)g(rules\);)h(these)g
+(ar)o(guments)e(con-)2044 4640 y(tain)i(properties)f(used)h(in)h(the)f
+(rule')-5 b(s)22 b(actions,)f(but)g(unlike)f(Prairie,)2044
+4739 y(they)31 b(do)g(not)h(contain)e FF(all)i FG(the)g(properties)e
+(of)i(an)f(operator)f(tree)2043 4839 y(node.)c(There)18
+b(are)i(other)f(property)e(classes,)k(like)e(algorithm)g(ar)o(gu-)2044
+4939 y(ment,)26 b(logical)e(property)-5 b(,)24 b(system)i(property)-5
+b(,)23 b(physical)i(property)-5 b(,)2044 5038 y(and)25
+b(cost.)44 b(Thus,)27 b(while)f(Prairie)g(uses)g(a)g(uniform)e
+(descriptor)h(to)p 2044 5107 788 4 v 2129 5160 a Fr(4)2163
+5184 y Fz(There)15 b(are)f(conditions)j(and)d(actions)i(associated)g
+(with)f(V)-9 b(olcano)16 b(rules)e(that)h(are)2044 5263
+y(not)i(shown)g(here.)p eop
+%%Page: 6 6
+6 5 bop -98 24 1923 4 v -98 1420 4 1397 v 371 1324 a
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 17.07164 128.0373
+119.50148 128.0373 119.50148 25.60745 17.07164 25.60745 /Lineto /lineto
+load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 153.64476
+102.42984 153.64476 102.42984 136.57312 34.14328 136.57312 /Lineto
+/lineto load def false Polygon gsave 1. setgray fill grestore gsave
+0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 754 139 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.07344
+neg 47.33029 7.75298 .5 Frame gsave 1. setgray fill grestore end
+
+
+@endspecial Fo(Prairie)15 b(Rule)f(Set)371 1324 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 119.50148 68.28656 136.57312
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 34.14328 119.50148
+102.42984 119.50148 102.42984 102.42984 34.14328 102.42984 /Lineto
+/lineto load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap
+stroke grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial
+719 416 a(P2V)h(Pre-processor)371 1324 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 85.3582 68.28656 102.42984
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 85.3582 102.42984
+85.3582 102.42984 68.28656 34.14328 68.28656 /Lineto /lineto load
+def false Polygon gsave 0.5 setgray fill grestore gsave 0.8 SLW 0.
+setgray 0 setlinecap stroke grestore end
+
+@endspecial
+736 706 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.07344
+neg 51.4815 7.75298 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(V)-7
+b(olcano)14 b(Rule)h(Set)371 1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 51.21492 68.28656 68.28656
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 34.14328 51.21492
+102.42984 51.21492 102.42984 34.14328 34.14328 34.14328 /Lineto /lineto
+load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial 843
+950 a(V)-7 b(olcano)694 1017 y(Optimizer)o(-Generator)371
+1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 17.07164 68.28656 34.14328
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 17.07164
+102.42984 17.07164 102.42984 0.0 34.14328 0.0 /Lineto /lineto load
+def false Polygon gsave 0.5 setgray fill grestore gsave 0.8 SLW 0.
+setgray 0 setlinecap stroke grestore end
+
+@endspecial 740 1267 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 4.51193
+neg 50.62743 7.75298 .5 Frame gsave 1. setgray fill grestore end
+
+
+@endspecial(Query)15 b(Optimizer)-948 b(Operator)15
+b(T)n(ree)371 1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 34.14328 8.53581 17.07164 8.53581
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 119.50148 8.53581 102.42984 8.53581
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial 1363 1273 a(Access)e(Plan)p
+1822 1420 V -98 1423 1923 4 v 1823 1440 19 1403 v -81
+1440 1923 19 v -112 1623 a FG(Figure)58 b(5:)105 b(The)59
+b(Prairie)g(optimizer)n(-generator)d(paradigm.)-112 1722
+y(Double-boxed)j(modules)k(represent)f(software)h(generators,)-112
+1822 y(shaded)35 b(boxes)g(represent)g(generated)f(programs.)72
+b(The)36 b(outer)n(-)-112 1922 y(most)f(double-boxed)d(portion)h
+(denotes)i(the)h(Prairie)f(optimizer)-112 2021 y(generator)-5
+b(.)-117 2223 y(encode)16 b(properties,)g(V)-11 b(olcano)16
+b(partitions)g(the)h(properties)e(into)h(dif-)-119 2323
+y(ferent)d(classes.)26 b(The)15 b(P2V)f(pre-processor)e(partitions)i(a)
+h(Prairie)f(de-)-112 2422 y(scriptor)22 b(into)g(the)h(dif)o(ferent)e
+(property)f(classes)k(required)d(by)i(V)-11 b(ol-)-112
+2522 y(cano.)26 b(This)21 b(is)g(a)g(non-trivial)d(task,)j(since)f(it)h
+(requires)e(parsing)h(the)-112 2621 y(Prairie)g(rules)g(and)f(their)h
+(actions.)-29 2721 y(Impl)p 134 2721 25 4 v 28 w(rules)29
+b(in)g(V)-11 b(olcano)28 b(defer)f(most)i(of)g(the)f(actions)h(associ-)
+-114 2821 y(ated)18 b(with)h(the)g(rules)f(to)h(support)e(functions.)25
+b(Each)18 b(algorithm)f(has)-119 2920 y(four)c(support)g(functions)g
+(associated)h(with)h(it.)26 b(A)15 b(Prairie)f(speci\256ca-)-113
+3020 y(tion,)19 b(on)g(the)h(other)f(hand,)f(contains)h(all)h(the)g
+(actions)f(in)h(the)g(corre-)-120 3120 y(sponding)13
+b(rule.)24 b(The)14 b(P2V)g(pre-processor)e(parses)i(a)h(Prairie)f
+(I-rule,)-112 3219 y(and)28 b(automatically)f(generates)g(all)j(the)e
+(V)-11 b(olcano)28 b(support)f(func-)-112 3319 y(tions)f(from)g(the)h
+(rule.)46 b(This)27 b(is)h(also)f(a)g(complex)e(process,)j(since)-116
+3418 y(it)17 b(depends)f(partly)g(on)h(the)g(partitioning)e(of)i
+(properties)f(mentioned)-114 3518 y(in)j(the)g(last)h(paragraph,)c(and)
+j(also)g(because)f(it)i(requires)e(relocating)-112 3618
+y(pieces)25 b(of)g(code)f(from)g(Prairie)h(rules)h(to)f(V)-11
+b(olcano)24 b(support)g(func-)-112 3717 y(tions.)-29
+3817 y(The)36 b(third)h(salient)g(feature)f(of)h(a)g(V)-11
+b(olcano)37 b(speci\256cation)f(is)-112 3917 y(the)27
+b(presence)g(of)h(implicit,)h(or)e(hidden,)h(algorithms,)h(called)e
+FF(en-)-112 4016 y(for)m(cers)p FG(.)59 b(In)30 b(Prairie,)j(all)f
+(algorithms)d(are)i(explicit.)58 b(Consider)m(,)-112
+4116 y(for)22 b(example,)h(the)g(Mer)o(ge)p 682 4116
+V 28 w(sort)h(algorithm)e(in)h(Figure)g(3\(b\).)35 b(In)23
+b(a)-112 4215 y(V)-11 b(olcano)20 b(speci\256cation,)g(this)h
+(algorithm)f(would)g(be)h(classi\256ed)g(as)-112 4315
+y(an)k(enforcer)m(,)f(since)h(it)h(enforces)e(the)i(sortedness)f
+(property)-5 b(.)39 b(The)-112 4415 y(P2V)33 b(pre-processor)d
+(determines)i(the)i(Prairie)f(algorithms)f(that)-112
+4514 y(are)d(functionally)f(V)-11 b(olcano)29 b(enforcers,)i(and)e
+(deletes)h(the)g(corre-)-115 4614 y(sponding)16 b(Prairie)h(rules)h(to)
+g(generate)f(the)h(V)-11 b(olcano)17 b(speci\256cation.)-112
+4714 y(This)40 b(requires)f(the)h(pre-processor)e(to)i(migrate)g(the)g
+(\(deleted\))-112 4813 y(rule')-5 b(s)20 b(actions)g(to)g(V)-11
+b(olcano)19 b(support)g(functions.)-29 4913 y(The)27
+b(P2V)i(pre-processor)c(also)k(generates)e(a)i(set)g(of)f(compact)-112
+5012 y(V)-11 b(olcano)24 b(rules)h(by)g(mer)o(ging)e(Prairie)i(rules)g
+(whenever)e(possible.)-112 5112 y(Consider)m(,)18 b(for)i(example,)f
+(the)h(following)f(set)i(of)f(rules)g(in)g(Prairie:)-103
+5263 y Fo(JOIN)p Ft(\()p Fu(S)90 5271 y Fn(1)122 5263
+y Fu(;S)183 5271 y Fn(2)215 5263 y Ft(\):)p Fi(D)317
+5271 y Fg(3)436 5263 y Fh(=)-14 b Fk(\))83 b Fo(JOPR)o
+Ft(\()p Fo(SOR)m(T)o Ft(\()p Fu(S)1026 5271 y Fn(1)1058
+5263 y Ft(\):)p Fi(D)1160 5271 y Fg(4)1196 5263 y Fu(;)p
+Fo(SOR)m(T)o Ft(\()p Fu(S)1428 5271 y Fn(2)1460 5263
+y Ft(\):)p Fi(D)1562 5271 y Fg(5)1597 5263 y Ft(\):)p
+Fi(D)1699 5271 y Fg(6)2127 21 y Fo(SOR)m(T)o Ft(\()p
+Fu(S)2339 29 y Fn(1)2371 21 y Ft(\):)p Fi(D)2473 29 y
+Fg(2)2592 21 y Fh(=)-14 b Fk(\))83 b Fo(Null)p Ft(\()p
+Fu(S)2979 29 y Fn(1)3011 21 y Ft(:)p Fi(D)3087 29 y Fg(3)3123
+21 y Ft(\):)p Fi(D)3225 29 y Fg(4)2044 145 y Fo(JOPR)o
+Ft(\()p Fu(S)2246 153 y Fn(1)2279 145 y Fu(;S)2340 153
+y Fn(2)2371 145 y Ft(\):)p Fi(D)2473 153 y Fg(3)2592
+145 y Fh(=)-14 b Fk(\))83 b Fo(Nested)p 2974 145 18 4
+v 20 w(loops)p Ft(\()p Fu(S)3184 153 y Fn(1)3216 145
+y Ft(:)p Fi(D)3292 153 y Fg(4)3328 145 y Fu(;S)3389 153
+y Fn(2)3421 145 y Ft(\):)p Fi(D)3523 153 y Fg(5)2044
+310 y FG(The)24 b(\256rst)g(rule)g(is)h(a)g(T)-8 b(-rule,)24
+b(and)g(the)g(next)f(two)i(are)f(I-rules.)37 b(The)2044
+410 y(P2V)25 b(pre-processor)e(combines)h(the)h(above)g(set)h(of)f
+(Prairie)g(rules)2044 509 y(into)20 b(a)g(single)g(I-rule,)2044
+674 y Fo(JOIN)p Ft(\()p Fu(S)2237 682 y Fn(1)2269 674
+y Fu(;S)2330 682 y Fn(2)2362 674 y Ft(\):)p Fi(D)2464
+682 y Fg(3)2582 674 y Fh(=)-14 b Fk(\))83 b Fo(Nested)p
+2964 674 V 20 w(loops)p Ft(\()p Fu(S)3174 682 y Fn(1)3206
+674 y Ft(:)p Fi(D)3282 682 y Fg(4)3318 674 y Fu(;S)3379
+682 y Fn(2)3411 674 y Ft(\):)p Fi(D)3513 682 y Fg(5)2044
+839 y FG(and)19 b(then)h(translates)g(it)h(into)f(a)h(single)f(V)-11
+b(olcano)19 b(impl)p 3625 839 25 4 v 29 w(rule.)2044
+1119 y FB(4)119 b(Experimental)30 b(r)n(esults)2044 1304
+y FG(This)k(section)g(presents)f(experimental)f(results)i(which)g
+(demon-)2044 1403 y(strate)e(the)g(value)g(of)g(Prairie)g(in)g
+(specifying)f(rule)h(sets)h(of)f(rule-)2044 1503 y(based)g(optimizers.)
+62 b(Our)32 b(experiments)e(consist)j(of)f(specifying)2043
+1603 y(rule-based)18 b(optimizers)h(using)g(Prairie)g(and)g(generating)
+f(optimiz-)2040 1702 y(ers)f(using)f(the)g(P2V)h(pre-processor)d(and)i
+(the)h(optimizer)n(-generator)2044 1802 y(paradigm)h(of)i(Figure)g(5.)
+2120 1901 y(In)14 b([4],)h(we)f(presented)g(an)g(implementation)e(of)i
+(a)h(centralized)e(re-)2041 2001 y(lational)18 b(query)f(optimizer)g
+(using)h(Prairie.)26 b(Using)18 b(the)g(P2V)h(trans-)2036
+2101 y(lator)m(,)14 b(we)g(translated)f(this)h(to)g(V)-11
+b(olcano)12 b(format)h(and)g(optimized)f(sev-)2044 2200
+y(eral)23 b(queries)g(using)f(the)h(resultant)g(optimizer)-5
+b(.)35 b(For)23 b(comparison,)2042 2300 y(we)18 b(hand-coded)e(the)i
+(same)h(optimizer)e(directly)h(in)g(V)-11 b(olcano.)26
+b(The)2039 2400 y(results)17 b(presented)f(there)g(showed)g(that,)h
+(using)f(Prairie)h(\(compared)2044 2499 y(to)30 b(directly)f(using)g(V)
+-11 b(olcano\))29 b(resulted)g(in)h(approximately)d(50\045)2044
+2599 y(savings)f(in)g(lines)g(of)g(code)g(with)g(negligible)f(\(less)i
+(than)e(5\045\))h(in-)2044 2698 y(crease)d(in)g(query)e(optimization)h
+(time.)35 b(However)m(,)22 b(the)h(optimizer)2044 2798
+y(was)i(quite)f(small)h(in)f(terms)h(of)f(the)g(number)f(of)h
+(operators,)g(algo-)2044 2898 y(rithms)c(and)f(rules.)2127
+2997 y(For)j(a)g(more)g(realistic)g(evaluation)f(of)h(Prairie,)g(we)h
+(needed)d(an-)2044 3097 y(swers)h(to)f(the)g(following)f(questions:)
+2106 3262 y(1.)41 b(Is)20 b(Prairie)h(adequate)d(for)i(lar)o(ge-scale)f
+(rule)h(sets?)2106 3427 y(2.)41 b(How)j(is)i(programmer)c(productivity)
+g(enhanced)h(by)h(the)2210 3527 y(high-level)18 b(abstractions)i(of)f
+(Prairie?)2106 3692 y(3.)41 b(Can)14 b(Prairie)h(rule)f(sets)h(be)g
+(translated)e(automatically)g(into)h(ef-)2210 3792 y(\256cient)20
+b(implementations?)2124 3957 y(W)-7 b(e)19 b(addressed)e(the)g(\256rst)
+i(question)e(by)g(using)g(the)h(T)-6 b(exas)18 b(Instru-)2044
+4057 y(ments)i(Open)g(OODB)i(query)d(optimizer)g(rule)i(set,)g(which)f
+(has)h(the)2036 4156 y(lar)o(gest)13 b(publicly)g(available)g(rule)h
+(set.)25 b(W)-7 b(e)15 b(describe)e(this)i(optimizer)2042
+4256 y(in)j(the)h(next)f(section,)g(and)g(then)g(give)g(our)f
+(assessments)i(to)g(the)f(last)2044 4356 y(two)i(questions)f(in)i
+(subsequent)d(sections.)2044 4592 y Fx(4.1)99 b(The)74
+b(T)-9 b(exas)73 b(Instruments)h(Open)g(OODB)2268 4709
+y(query)26 b(optimizer)2044 4864 y FG(The)45 b(T)-6 b(exas)46
+b(Instruments)e(Open)h(Object-Oriented)f(Database)2042
+4964 y(Management)17 b(System)i(is)h(an)f(open,)f(extensible,)g
+(object-oriented)2044 5063 y(database)49 b(system)g(which)g(provides)f
+(users)h(an)h(architectural)2044 5163 y(framework)27
+b(that)i(is)i(con\256gurable)c(in)i(an)g(incremental)f(manner)-5
+b(.)2044 5263 y(The)30 b(query)e(optimizer)h(in)i(the)f(Open)f(OODB)i
+([2])f(is)h(generated)p eop
+%%Page: 7 7
+7 6 bop -112 21 a FG(using)36 b(V)-11 b(olcano.)76 b(It)38
+b(is)g(written)e(as)i(a)g(set)f(of)g(trans)p 1513 21
+25 4 v 29 w(rules)g(and)-112 120 y(impl)p 46 120 V 29
+w(rules)42 b(that)h(de\256ne)f(the)g(algebra)g(of)g(an)h
+(object-oriented)-112 220 y(database)35 b(system.)73
+b(Currently)-5 b(,)38 b(there)d(are)g(17)g(transformation)-112
+319 y(rules)50 b(and)g(9)h(implementation)e(rules)h(together)g(with)h
+(about)-112 419 y Fh(13)p Fv(;)14 b Fh(000)21 b FG(lines)i(of)g(code)g
+(for)f(support)g(functions;)i(this,)g(of)f(course,)-112
+519 y(can)c(be)i(changed)d(by)i(an)g(Open)f(OODB)i(user)g(for)e
+(speci\256c)h(needs.)-112 769 y Fx(4.2)99 b(Pr)n(ogrammer)25
+b(pr)n(oductivity)-119 929 y FG(Programmer)13 b(productivity)f(can)j
+(be)g(measured)e(in)i(dif)o(ferent)e(ways.)-112 1029
+y(An)29 b(admittedly)f(simplistic)j(metric)e(is)h(the)g(number)e(of)h
+(lines)h(of)-112 1128 y(code)24 b(that)i(must)g(be)f(written.)43
+b(But)26 b(there)f(are)g(also)h(less)h(tangible)-116
+1228 y(measures,)17 b(such)h(as)g(the)f(amount)f(of)h(conceptual)f(ef)o
+(fort)g(needed)g(to)-112 1327 y(understand)k(a)k(particular)e
+(programming)d(task.)36 b(Our)23 b(experience)-112 1427
+y(with)d(the)h(Open)f(OODB)i(query)d(optimizer)g(suggests)i(that)g
+(Prairie)-113 1527 y(excels)g(on)e(the)i(latter)m(,)e(while)i(of)o
+(fering)c(modest)j(reductions)e(in)j(the)-112 1626 y(volume)d(of)i
+(code)g(that)g(needs)g(to)g(be)g(written.)-34 1728 y(W)-7
+b(e)17 b(converted)d(by)h(hand)g(the)i(Open)e(OODB)i(query)e(optimizer)
+s(')-5 b(s)-116 1828 y(V)-11 b(olcano)16 b(speci\256cations)g(to)h
+(Prairie.)26 b(This)17 b(was)h(a)f(non-trivial)e(task)-112
+1928 y(because)27 b(of)h(the)g(relatively)f(lar)o(ge)g(size)i(of)f(the)
+g(rule)f(set)i(and)f(the)-112 2027 y(complexity)f(of)j(the)g(support)e
+(functions.)55 b(This)30 b(was)g(where)f(we)-112 2127
+y(found)c(Prairie)j(helped)f(in)g(conceptually)f(simplifying)g(the)i
+(rules)-120 2226 y(and)13 b(actions.)24 b(W)-7 b(e)15
+b(then)e(used)h(our)f(P2V)h(pre-processor)d(to)j(reconsti-)-120
+2326 y(tute)g(these)f(Prairie)h(speci\256cations)f(as)i(V)-11
+b(olcano)13 b(speci\256cations.)24 b(As)-113 2426 y(described)18
+b(in)h(Section)h(3,)f(this)h(process)f(involved)f(a)i(considerable)-112
+2525 y(level)g(of)h(complexity)-5 b(,)19 b(partly)h(because)g(the)h
+(Prairie)g(speci\256cation)-116 2625 y(had)16 b(22)h(T)-8
+b(-rules)17 b(and)g(1)m(1)f(I-rules)h(compared)e(to)i(17)g(trans)p
+1537 2625 V 29 w(rules)g(and)-112 2725 y(9)24 b(impl)p
+112 2725 V 29 w(rules)g(in)g(the)g(V)-11 b(olcano)23
+b(speci\256cation;)i(the)f(reconstituted)-112 2824 y(V)-11
+b(olcano)28 b(speci\256cation)h(had)g(the)h(same)f(number)f(of)i(trans)
+p 1671 2824 V 29 w(rules)-112 2924 y(and)19 b(impl)p
+186 2924 V 29 w(rules)h(as)h(the)g(original)e(hand-coded)e
+(speci\256cation.)-36 3026 y(Converting)12 b(the)i(Open)g(OODB)h
+(optimizer)f(rule)g(set)h(into)f(Prairie)-112 3125 y(format)19
+b(actually)h(simpli\256ed)g(its)h(speci\256cation)f(as)h(the)g
+(complexi-)-112 3225 y(ties)i(of)g(the)g(V)-11 b(olcano)22
+b(model)h(were)f(removed.)34 b(The)22 b(reduction)g(in)-119
+3325 y(lines)16 b(of)e(code)h(was)g(modest)g(\320)g(there)g(was)g
+(about)f(a)i(10\045)e(savings.)1826 3295 y Ft(5)-112
+3424 y FG(However)m(,)24 b(as)h(mentioned)e(above,)h(savings)g(in)h
+(lines)g(of)f(code)g(do)-112 3524 y(not)j(adequately)f(re\257ect)i
+(increases)g(in)g(programmer)c(productiv-)-112 3624 y(ity)-5
+b(.)37 b(W)-7 b(e)24 b(found)e(the)i(encapsulated)e(speci\256cations)h
+(of)h(Prairie)f(\320)-117 3723 y(namely)-5 b(,)15 b(the)h(use)h(of)f(a)
+h(single)f(descriptor)f(and)g(fewer)h(explicit)g(sup-)-112
+3823 y(port)j(functions)g(\320)i(made)e(rule)h(programming)d
+FF(much)i FG(easier)-5 b(.)-112 4073 y Fx(4.3)99 b(Performance)81
+b(r)n(esults)f(using)f(the)i(Open)112 4189 y(OODB)24
+b(optimizer)-32 4349 y FG(The)17 b(acid)h(test)h(of)f(Prairie)g(was)g
+(whether)f(Prairie)h(speci\256cations)-117 4449 y(could)d(be)h
+(translated)g(into)g(ef)o(\256cient)f(optimizer)g(implementations.)-112
+4549 y(Our)24 b(experiments)f(using)h(the)h(Open)f(OODB)i(consisted)e
+(of)g(opti-)-112 4648 y(mizing)j(8)g(dif)o(ferent)f(queries)h(using)h
+(the)f(two)h(query)f(optimizers)-113 4748 y(generated,)19
+b(respectively)-5 b(,)18 b(using)i(Prairie)g(and)f(using)h(V)-11
+b(olcano)19 b(di-)-116 4847 y(rectly)e(\(in)g(the)g(remainder)f(of)h
+(this)h(section,)f(we)h(will)g(use)g(\252Prairie\272)-116
+4947 y(and)f(\252V)-11 b(olcano\272)17 b(to)g(denote)g(these)g(two)h
+(approaches\).)24 b(There)16 b(were)p -112 5028 788 4
+v -28 5081 a Fr(5)7 5105 y Fz(The)e(original)i(V)-9 b(olcano)17
+b(speci\256cation)g(had)e Fc(13)p Fb(;)d Fc(400)i Fz(lines,)i(the)f
+(Prairie)h(speci-)-112 5184 y(\256cation)d(had)g Fc(12)p
+Fb(;)f Fc(100)h Fz(lines,)g(and)g(the)g(P2V)-6 b(-generated)15
+b(V)-9 b(olcano)14 b(speci\256cation)h(had)-112 5263
+y Fc(15)p Fb(;)c Fc(800)18 b Fz(lines.)2042 21 y FG(4)h(distinct)g
+(expressions)e(that)i(were)g(used)f(to)h(generate)f(the)g(queries)2044
+120 y(used)i(in)h(the)g(experiments;)f(these)h(are)g(shown)f(in)h
+(Figure)f(6.)30 b(Each)2044 220 y(expression)19 b(represents)g(an)h
+Fv(N)9 b FG(-way)20 b(join)f(query)g(for)h(varying)e
+Fv(N)9 b FG(.)2127 329 y(The)26 b(\256rst)h(expression)f(E1)g(is)i(a)f
+(simple)f(retrieval)g(and)g(join)g(of)2044 429 y(base)21
+b(classes.)32 b(The)21 b(second,)f(E2,)h(is)i(also)e(a)h(join)f(of)g
+(base)h(classes;)2039 528 y(however)m(,)16 b(after)g(each)g(class)i
+(retrieval,)e(an)h(attribute)f(has)g(to)h(be)g(ma-)2043
+628 y(terialized)h(\(i.e.,)h(brought)e(into)i(view\))g(before)f(the)i
+(join.)26 b(The)19 b(third)2044 727 y(and)g(fourth)f(expressions)h
+(\(E3)h(and)f(E4\))h(are)g(the)g(same)g(as)h(the)f(\256rst)2044
+827 y(and)j(second)g(\(E1)g(and)g(E2\))g(respectively)-5
+b(,)22 b(except)h(that)h(there)f(is)i(a)2044 927 y(selection)e(of)g
+(attributes)g(\(the)g(select)h(operator)e(is)i(the)f(root)g(of)g(the)
+2044 1026 y(expressions\).)2482 996 y Ft(6)2127 1135
+y FG(The)e(algebra)f(that)h(was)h(used)f(in)g(the)h(Prairie)f(and)f(V)
+-11 b(olcano)21 b(op-)2044 1235 y(timizers)h(for)f(our)h(experiments)e
+(consisted)i(of)g(5)g(relational)f(oper)n(-)2044 1335
+y(ators)27 b(SELECT)-6 b(,)27 b(PROJECT)-6 b(,)28 b(JOIN,)f(RET)g(and)g
+(UNNEST)g(\(for)2042 1434 y(set-valued)18 b(attributes\))h(and)f(an)h
+(object-oriented)d(operator)i(called)2038 1534 y(MA)-9
+b(T)15 b(\(for)f(MA)-9 b(T)j(erialize;)16 b(it)g(is)g(fundamentally)c
+(a)k(pointer)n(-chasing)2044 1633 y(operator)i(for)i(attributes)f(of)h
+(a)h(class\).)27 b(There)20 b(were)g(8)g(algorithms.)2119
+1743 y(There)12 b(are)i(many)e(parameters)h(that)g(can)h(be)f(varied)g
+(when)g(bench-)2044 1842 y(marking)19 b(a)j(query)e(optimizer)-5
+b(.)30 b(Since)21 b(our)g(objective)f(was)i(to)f(ver)n(-)2043
+1942 y(ify)f(that)g(the)g(Prairie)g(approach)e(did)i(not)f(sacri\256ce)
+h(ef)o(\256ciency)-5 b(,)18 b(our)2044 2041 y(criteria)26
+b(for)f(the)i(queries)e(was)i(that)f(they)g(test)h(a)g(majority)e(of)h
+(the)2036 2141 y(rules,)14 b(with)g(varying)d(properties)i(of)g(the)g
+(base)h(classes.)25 b(T)-6 b(o)14 b(this)g(end,)2044
+2241 y(we)21 b(tested)h(our)e(optimizer)g(\(and)g(the)h(V)-11
+b(olcano)20 b(optimizer\))g(with)h(8)2044 2340 y(dif)o(ferent)g
+(queries)h(\(shown)g(in)i(T)-6 b(able)23 b(3\).)35 b(The)23
+b(eight)g(queries)f(Q1)2044 2440 y(through)d(Q8)j(are)g(derived)e(from)
+h(the)h(4)g(expressions)e(in)i(Figure)f(6.)2039 2540
+y(Each)16 b(expression)f(E1)i(through)d(E4)i(is)h(used)g(to)f(obtain)g
+(two)g(queries)2044 2639 y(for)k(a)h(\256xed)f(number)f
+Fv(N)29 b FG(of)21 b(JOINs)g(in)g(the)f(expression.)27
+b(The)20 b(only)2039 2739 y(dif)o(ference)13 b(between)i(the)h(two)g
+(queries)f(obtained)g(from)g(an)g(expres-)2043 2838 y(sion)k(is)i(that)
+e(the)h(\256rst)g(one)f(does)g(not)h(contain)e(any)h(indices)g(on)g
+(any)2044 2938 y(classes,)25 b(whereas)d(the)h(second)g(one)f(contains)
+h(a)g(single)g(index)f(on)2044 3038 y(each)f(base)i(class)g(occurring)c
+(in)j(the)g(expression.)31 b(In)22 b(expressions)2041
+3137 y(where)17 b(a)h(SELECT)g(is)g(present)f(\(E3)h(and)f(E4\),)g(the)
+h(selection)f(pred-)2044 3237 y(icate)k(is)g(a)g(conjunction)d(of)i
+(equality)g(predicates)f FF(bc)3584 3249 y Fu(i)3636
+3237 y Fh(==)k FF(const)3964 3249 y Fu(i)3992 3237 y
+FG(,)2042 3337 y(where)17 b FF(bc)2342 3349 y Fu(i)2388
+3337 y FG(is)j(an)e(attribute)g(of)g(class)h FF(C)3179
+3349 y Fu(i)3207 3337 y FG(,)g(and)f FF(const)3561 3349
+y Fu(i)3608 3337 y FG(is)h(a)g(constant)2044 3436 y(\(we)k(arbitrarily)
+e(set)j(this)f(to)g Fv(i)p FG(,)g(because)g(its)g(value)g(doesn')o(t)e
+(af)o(fect)2035 3536 y(the)14 b(correctness)e(or)h(performance)e(of)i
+(the)g(optimizer\).)23 b(In)13 b(addition,)2041 3635
+y(for)18 b(queries)g(with)g(a)h(SELECT)f(and)g(whose)g(base)g(classes)i
+(have)e(in-)2040 3735 y(dices)f(\(Q6)f(and)h(Q8)f(in)h(T)-6
+b(able)17 b(3\),)g(the)g(\(single\))f(index)g(of)g(each)h(base)2044
+3835 y(class)22 b(was)g(chosen)e(to)h(be)g(the)g(attribute)g
+(referenced)e(in)i(the)g(selec-)2044 3934 y(tion)27 b(predicate.)46
+b(For)27 b(example,)h(class)g FF(C)3293 3946 y Fu(i)3348
+3934 y FG(was)g(chosen)e(to)i(have)2042 4034 y(an)18
+b(index)g(on)g(attribute)g FF(bc)2819 4046 y Fu(i)2847
+4034 y FG(.)27 b(The)18 b(join)h(predicates)e(for)h(each)h(JOIN)2037
+4134 y(were)14 b(chosen)f(at)i(random,)f(and)f(were)h(always)h
+(equality)e(predicates.)2039 4233 y(The)j(choice)f(of)h(JOIN)h
+(predicates)e(was)i(such)f(that)g(the)h(queries)e(cor)n(-)2044
+4333 y(responded)j(to)j(linear)g(query)e(graphs.)27 b(In)21
+b(the)f(future,)g(we)h(will)g(ex-)2044 4432 y(periment)e(with)h
+(non-linear)e(\(e.g.,)h(star\))h(query)f(graphs.)2127
+4542 y(T)-6 b(able)52 b(3)g(also)h(shows)f(the)h(number)d(of)i(trans)p
+3654 4542 25 4 v 29 w(rules)h(and)p 2044 4633 788 4 v
+2129 4687 a Fr(6)2163 4710 y Fz(The)17 b(most)g(complex)i(expression)g
+(E4)e(consists)h(of)f(all)h(operators)h(in)f(the)g(alge-)2044
+4789 y(bra,)24 b(except)h(PROJECT)d(and)h(UNNEST)-5 b(.)21
+b(PROJECT)h(was)g(not)i(considered)h(be-)2044 4868 y(cause)16
+b(it)g(appeared)i(in)d(only)h(one)g(impl)p 2948 4868
+20 4 v 25 w(rule)g(and)g(no)f(trans)p 3411 4868 V 25
+w(rules,)h(and)g(thus,)f(would)2044 4947 y(not)22 b(af)o(fect)h(the)f
+(size)g(of)f(the)i(search)f(space)h(of)e(abstract)j(expressions.)37
+b(UNNEST)2044 5026 y(was)20 b(not)h(considered)h(because)g(it)f
+(appeared)i(in)d(exactly)j(one)e(trans)p 3657 5026 V
+25 w(rule)g(and)g(one)2044 5105 y(impl)p 2169 5105 V
+24 w(rule;)g(including)g(it)e(in)g(our)f(queries)i(would)g(have)f
+(increased)i(the)e(number)g(of)2044 5184 y(parameters)f(that)g(could)f
+(af)o(fect)h(our)f(run-times.)23 b(W)-5 b(e)16 b(preferred)i(to)f
+(concentrate)j(on)2044 5263 y(simple)d(JOIN)g(expressions.)p
+eop
+%%Page: 8 8
+8 7 bop -112 24 2130 4 v -112 1001 4 978 v -37 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+
+-37 707 a Fa(C)-10 719 y Fn(1)-47 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ -47 618 a Fm(RET)-7
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 152 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 152 707 a Fa(C)179 719 y Fn(2)142
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 142 618 a Fm(RET)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 42 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 3.39499 0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 42
+524 a Fm(JOIN)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 182
+415 a
+ tx@Dict begin 45. Rot end
+ 182 415 a 143 418 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 143 418 a Fl(:)10 b(:)g(:)182
+415 y
+ tx@Dict begin 45. neg Rot end
+ 182 415 a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ -7 699 a 331 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 331 429 a
+Fm(RET)336 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.32748 0.99998
+false .5 8.23895 InitRnode } NewNode end end
+ 336 520 a Fa(C)364 528 y Fl(n)-7 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 231 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.39499
+0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 231 335 a Fm(JOIN)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ -7 699
+a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 100 881 a Fz(\(a\))17 b(E1)p 447
+976 4 928 v 476 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 476 707 a Fa(C)504 719 y Fn(1)467
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 467 618 a Fm(RET)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 665 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+
+665 707 a Fa(C)693 719 y Fn(2)656 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 656 618 a Fm(RET)506
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 463 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 463 524 a Fm(MA)-5 b(T)506
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 652 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 652 524 a Fm(MA)g(T)506 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 556 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 3.39499 0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 556 429 a Fm(JOIN)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506
+699 a 506 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 695 321 a
+ tx@Dict begin 45. Rot end
+ 695 321 a 656 324
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 656 324 a Fl(:)11 b(:)f(:)695 321 y
+ tx@Dict begin 45. neg Rot end
+ 695 321 a 506 699
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 506 699 a 845 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 845 429 a Fm(RET)850 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.32748 0.99998
+false .5 8.23895 InitRnode } NewNode end end
+ 850
+520 a Fa(C)878 528 y Fl(n)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 841 335
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 841 335 a Fm(MA)-5 b(T)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 745 240
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.39499
+0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 745 240 a Fm(JOIN)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 506 699 a 506 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506
+699 a 611 881 a Fz(\(b\))17 b(E2)p 961 976 4 928 v 990
+707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 990 707 a Fa(C)1018 719 y Fn(1)981 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 981 618
+a Fm(RET)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1179 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 1179 707 a
+Fa(C)1207 719 y Fn(2)1170 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 1170 618 a Fm(RET)1020
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1070 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 3.39499 0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 1070 524 a Fm(JOIN)1020 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1209 415 a
+ tx@Dict begin 45. Rot end
+ 1209 415
+a 1170 418 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 1170 418 a Fl(:)11 b(:)f(:)1209 415 y
+ tx@Dict begin 45. neg Rot end
+ 1209
+415 a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699 a 1359 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 1359 429 a Fm(RET)1364
+520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.32748 0.99998
+false .5 8.23895 InitRnode } NewNode end end
+ 1364 520 a Fa(C)1392 528 y Fl(n)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020
+699 a 1259 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.39499
+0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 1259 335 a Fm(JOIN)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699
+a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1227 240 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 3.39499
+0.05246 false .5 18.3349 InitRnode } NewNode end end
+ 1227 240 a Fm(SELECT)1020
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699 a 1127 881 a Fz(\(c\))17 b(E3)p 1474 976
+4 928 v 1504 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 1504 707 a Fa(C)1531 719 y Fn(1)1495
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 1495 618 a Fm(RET)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1693 707
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.32748 1.5
+false .5 7.2378 InitRnode } NewNode end end
+ 1693 707 a Fa(C)1720 719 y Fn(2)1684 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 1684 618
+a Fm(RET)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1490 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 1490 524 a
+Fm(MA)-5 b(T)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1679 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 1679 524
+a Fm(MA)g(T)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1583 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 3.39499 0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 1583 429
+a Fm(JOIN)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a
+1723 321 a
+ tx@Dict begin 45. Rot end
+ 1723 321 a 1684 324 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 1684 324 a Fl(:)10 b(:)h(:)1723
+321 y
+ tx@Dict begin 45. neg Rot end
+ 1723 321 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1873 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.34 0.0
+false .5 9.44495 InitRnode } NewNode end end
+ 1873
+429 a Fm(RET)1878 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.32748 0.99998
+false .5 8.23895 InitRnode } NewNode end end
+ 1878 520 a Fa(C)1905 528 y Fl(n)1534
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1868 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 3.39499
+0.0 false .5 10.55492 InitRnode } NewNode end end
+ 1868 335 a Fm(MA)-5 b(T)1534
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1772 240 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.39499
+0.05246 false .5 10.8299 InitRnode } NewNode end end
+ 1772 240 a Fm(JOIN)1534 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1741 146 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 3.39499
+0.05246 false .5 18.3349 InitRnode } NewNode end end
+ 1741 146
+a Fm(SELECT)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1639 881 a Fz(\(d\))17
+b(E4)p 2014 1001 4 978 v -112 1004 2130 4 v 2015 1021
+19 984 v -96 1021 2130 19 v -112 1204 a FG(Figure)g(6:)26
+b(Expressions)17 b(used)h(in)g(generating)e(queries)i(for)f
+(experiments)p 2359 357 1644 13 v 2359 423 4 67 v 2412
+437 a Fp(Query)p 2620 423 V 2673 443 a(Indices?)p 2930
+423 V 2983 437 a(Expr)o(ession)p 3306 423 V 3471 403
+a(Rules)e(matched)p 3999 423 V 3309 427 694 4 v 2359
+490 4 67 v 2620 490 V 2930 490 V 3306 490 V 3359 470
+a Fo(trans)p 3475 470 18 4 v 21 w(rules)p 3656 490 4
+67 v 103 w(impl)p 3818 470 18 4 v 22 w(rules)p 3999 490
+4 67 v 2359 502 1644 13 v 2359 569 4 67 v 2456 549 a(Q1)p
+2620 569 V 214 w(No)p 2930 569 V 3087 588 a(E1)p 3306
+569 V 316 w(3)p 3656 569 V 318 w(3)p 3999 569 V 2359
+572 575 4 v 2359 635 4 67 v 2456 615 a(Q2)p 2620 635
+V 207 w(Y)-6 b(es)p 2930 635 V 3306 635 V 3656 635 V
+3999 635 V 2359 638 1644 4 v 2359 705 4 67 v 2456 685
+a(Q3)p 2620 705 V 214 w(No)p 2930 705 V 3087 725 a(E2)p
+3306 705 V 3468 724 a(8)p 3656 705 V 3815 725 a(4)p 3999
+705 V 2359 708 575 4 v 2359 771 4 67 v 2456 751 a(Q4)p
+2620 771 V 207 w(Y)g(es)p 2930 771 V 3306 771 V 3656
+771 V 3999 771 V 2359 775 1644 4 v 2359 841 4 67 v 2456
+821 a(Q5)p 2620 841 V 214 w(No)p 2930 841 V 3087 860
+a(E3)p 3306 841 V 316 w(9)p 3656 841 V 3815 861 a(5)p
+3999 841 V 2359 844 575 4 v 2359 907 4 67 v 2456 887
+a(Q6)p 2620 907 V 207 w(Y)g(es)p 2930 907 V 3306 907
+V 3656 907 V 3999 907 V 2359 911 1644 4 v 2359 977 4
+67 v 2456 957 a(Q7)p 2620 977 V 214 w(No)p 2930 977 V
+3087 997 a(E4)p 3306 977 V 302 w(16)p 3656 977 V 3815
+996 a(7)p 3999 977 V 2359 980 575 4 v 2359 1044 4 67
+v 2456 1024 a(Q8)p 2620 1044 V 207 w(Y)g(es)p 2930 1044
+V 3306 1044 V 3656 1044 V 3999 1044 V 2359 1056 1644
+13 v 2566 1204 a FG(T)g(able)20 b(3:)27 b(Queries)20
+b(used)g(in)h(experiments)-112 1554 y(impl)p 46 1554
+25 4 v 29 w(rules)37 b(that)h(are)f(matched)g(by)g(each)g(expression.)
+78 b(These)-112 1653 y(are)21 b(the)g(rules)g(whose)g(left)g(hand)f
+(sides)i(match)f(a)g(sub-expression.)-112 1753 y(However)m(,)f(not)h
+(all)h(the)g(rules)f(were)h(necessarily)f(applicable.)30
+b(For)-112 1853 y(instance,)25 b(an)g(impl)p 469 1853
+V 29 w(rule)f(with)i(an)e(index)g(scan)h(would)f(not)h(apply)-112
+1952 y(to)20 b(Q3,)g(although)e(it)j(might)f(apply)f(to)h(Q4.)-29
+2054 y(Queries)32 b(Q1)h(through)e(Q8)i(were)g(optimized)f(for)g
+(increasing)-119 2153 y(number)12 b Fv(N)24 b FG(of)15
+b(JOINs.)25 b(For)15 b(a)g(\256xed)f(number)e(of)j(JOINs)g(in)g(a)g
+(query)-5 b(,)-112 2253 y(we)21 b(varied)f(the)g(cardinalities)h(of)f
+(the)h(base)g(classes)h(5)f(times,)g(each)-112 2353 y(time)g
+(generating)f(a)i(query)f(with)h(dif)o(ferent)d(class)k(properties,)d
+(and)-112 2452 y(averaged)e(the)j(run-times)e(over)h(the)h(5)f(query)g
+(instances)g(to)h(gener)n(-)-114 2552 y(ate)d(the)h(per)n(-query)d
+(optimization)h(time.)27 b(Thus,)18 b(each)g(point)g(in)h(our)-112
+2652 y(graphs)25 b(represents)g(the)h(average)f(of)h(5)g(queries.)44
+b(The)26 b(run-times)-112 2751 y(were)f(measured)395
+2721 y Ft(7)457 2751 y FG(using)h(the)g(GNU)g Fd(time)g
+FG(command.)43 b(All)26 b(ex-)-112 2851 y(periments)f(were)h(performed)
+e(on)i(a)h(lightly)f(loaded)f(DECstation)-112 2950 y(5000/200)17
+b(running)h(Ultrix)i(4.2.)-37 3052 y(The)14 b(optimization)e(times)i
+(for)g(each)f(query)g(for)g(both)g(approaches)-120 3152
+y(\(Prairie)h(and)g(V)-11 b(olcano\))13 b(are)h(shown)g(in)g(Figures)g
+(7\(a\))f(through)f(7\(h\).)-112 3251 y(The)25 b(number)f(of)i(joins)g
+(in)g(each)g(set)g(of)g(graphs)f(was)h(varied)f(to)h(a)-112
+3351 y(maximum)18 b(of)i(8,)g(or)g(until)g(virtual)f(memory)g(was)i
+(exhausted.)-29 3452 y(The)i(\256rst)h(set)g(of)f(graphs)f(\(Figures)h
+(7\(a\))g(and)f(7\(b\)\))g(shows)i(the)-112 3552 y(performance)j(of)k
+(a)g(simple)g(relational-type)d(query)-5 b(.)57 b(The)30
+b(opti-)-117 3652 y(mization)16 b(times)h(are)g(almost)g(identical)f
+(between)g(Prairie)h(and)f(V)-11 b(ol-)-112 3751 y(cano,)21
+b(and)h(the)g(notable)f(point)h(is)h(that)f(the)h(presence)e(of)h(an)g
+(index)-120 3851 y(does)14 b(not)g(change)f(the)h(optimizer)s(')-5
+b(s)13 b(behavior)m(,)g(i.e.,)i(the)f(two)g(graphs)-112
+3951 y(are)20 b(identical.)28 b(This)21 b(arises)g(because)f(the)g
+(optimizer)g(algebra)f(had)-118 4050 y(only)d(two)g(join)g(algorithms)e
+(\(pointer)h(join)g(and)h(hash)g(join\),)g(neither)-112
+4150 y(of)j(which)h(makes)g(use)g(of)g(any)g(indices.)-29
+4251 y(The)25 b(second)g(set)i(of)f(graphs)f(\(Figures)g(7\(c\))h(and)f
+(7\(d\)\))g(shows)-118 4351 y(the)16 b(results)g(of)f(optimizing)g(Q3)g
+(and)h(Q4.)25 b(Here,)16 b(as)h(in)f(Figures)f(7\(a\))-114
+4451 y(and)j(7\(b\),)g(the)h(presence)f(\(or)g(absence\))g(of)g
+(indices)h(makes)g(no)f(dif-)-118 4550 y(ference.)24
+b(Both)16 b(the)f(Prairie)h(and)f(V)-11 b(olcano)15 b(approaches)e
+(have)i(com-)-117 4650 y(parable)g(run-times.)24 b(The)16
+b(sharp)f(jump)g(in)i(the)f(graphs)f(from)g(7-way)-115
+4750 y(to)j(8-way)f(joins)h(is)h(due)e(to)h(the)g(fact)g(that)g(since)g
+(all)g(optimization)f(is)-113 4849 y(done)i(in)h(main)f(memory)-5
+b(,)17 b(dynamic)i(memory)f(allocation)g(\(caused)-112
+4949 y(by)j Fd(malloc)h FG(calls\))h(results)f(in)h(a)g(lot)f(of)g
+(thrashing)f(at)i(this)g(point.)p -112 5028 788 4 v -28
+5081 a Fr(7)7 5105 y Fz(Since)j(the)g(run-times)h(were)f(too)f(small)h
+(to)g(be)f(measured)h(accurately)j(with)-112 5184 y Fy(time)p
+Fz(,)19 b(each)i(query)g(instance)h(was)e(optimized)i(3000)f(times)f
+(\(in)h(a)f(loop\))h(and)f(the)-112 5263 y(total)e(time)g(was)f
+(divided)i(by)e(3000)g(to)g(get)h(the)g(per)o(-query)g(optimization)j
+(time.)2042 1554 y FG(W)-7 b(e)20 b(speculate)e(that)h(in)g(systems)g
+(with)g(more)f(virtual)g(memory)-5 b(,)17 b(the)2044
+1653 y(graphs)i(will)i(be)f(smoother)-5 b(.)2122 1758
+y(The)16 b(third)f(and)h(fourth)e(sets)j(of)f(graphs)f(in)h(Figures)g
+(7\(e\))f(through)2043 1857 y(7\(h\))k(are)h(optimizations)f(of)g
+(queries)h(with)g(a)g(selection)g(predicate.)2039 1957
+y(In)c(these)g(cases,)h(the)g(presence)e(of)g(an)i(index)e(makes)g(a)i
+(dif)o(ference)d(if)2044 2057 y(the)20 b(index)g(is)i(referenced)c(in)j
+(the)g(selection)f(predicate)f(\(as)i(we)g(de-)2042 2156
+y(signed\).)26 b(Also,)19 b(in)g(these)h(two)f(\256gures,)f(the)h
+(performance)e(of)h(both)2040 2256 y(Prairie)g(and)e(V)-11
+b(olcano)17 b(was)h(almost)f(identical,)g(except)g(that)h(Prairie)2044
+2356 y(does)29 b(slightly)g(worse)g(due)g(to)h(the)f(lar)o(ger)f
+(number)g(of)h Fd(malloc)2044 2455 y FG(calls)23 b(that)g(the)f(P2V)h
+(translator)f(introduces.)32 b(Also,)24 b(note)e(that)h(we)2043
+2555 y(could)c(only)g(go)g(up)h(to)g(3-way)f(joins)g(before)g(virtual)g
+(memory)f(was)2044 2654 y(exhausted.)31 b(As)23 b(the)f(available)g
+(memory)e(decreases,)i(there)g(is)h(in-)2039 2754 y(creased)16
+b(thrashing)f(\(as)i(shown)f(by)g(the)g(sharp)g(changes)g(in)g(slope)g
+(in)2044 2854 y(the)k(plots\))g(resulting)f(in)i(a)f(much)f(slower)h
+(optimization)f(process.)2127 2958 y(In)j(all)h(four)f(sets)i(of)e
+(plots,)h(we)g(can)f(see)i(that)e(Prairie)h(performs)2044
+3058 y(with)f(almost)g(\(less)h(than)f Fh(5\045)g FG(variation\))e(the)
+j(same)f(ef)o(\256ciency)e(as)2044 3158 y(V)-11 b(olcano.)29
+b(In)21 b(extreme)f(cases,)i(when)e(memory)g(is)i(scarce,)f(Prairie)
+2040 3257 y(runs)c(more)g(slowly)h(\(about)e Fh(15\045)p
+FG(\))h(\(e.g.,)g(Figure)f(7\(f\)\),)h(but)g(we)h(be-)2044
+3357 y(lieve)25 b(that)g(this)h(situation)f(already)f(represents)h(a)h
+(serious)f(bottle-)2044 3456 y(neck)19 b(for)h(both)f(V)-11
+b(olcano)19 b(and)h(Prairie.)2120 3561 y(The)14 b(results)i(presented)d
+(in)i(this)g(section)f(show)h(that)g(Prairie)f(opti-)2039
+3661 y(mizers)i(need)f(not)h(sacri\256ce)g(ef)o(\256ciency)e(for)i
+(clarity)-5 b(,)15 b(even)h(for)f(lar)o(ge)2038 3760
+y(rule)h(sets.)26 b(More)15 b(research)g(and)g(validation)f(is)j
+(necessary)e(to)h(verify)2044 3860 y(that)k(Prairie)g(is)h(an)f(ef)o
+(\256cient)g(tool)g(for)f(optimizer)g(speci\256cation.)2044
+4166 y FB(5)119 b(Related)31 b(r)n(esear)n(ch)2041 4361
+y FG(The)18 b(System)g(R)i(optimizer)d([1)m(1])g(was)h(the)h(most)f
+(important)e(devel-)2044 4461 y(opment)j(in)j(query)d(optimization)h
+(research.)28 b(It)22 b(was)g(a)f(cost-based)2044 4560
+y(centralized)h(relational)g(query)g(optimizer)g(and)g(introduced)f(a)i
+(va-)2044 4660 y(riety)i(of)h(key)f(concepts)g(like)h
+(\252interesting\272)f(expressions,)h(cardi-)2043 4759
+y(nality)20 b(estimation)f(using)h(selectivity)f(factors)h(and)f
+(dynamic)g(pro-)2044 4859 y(gramming)28 b(with)j(pruning)e(of)h(search)
+g(space.)59 b(These)30 b(concepts)2044 4959 y(continue)18
+b(to)j(be)f(important)f(in)h(query)f(optimizer)g(research.)2127
+5063 y(The)29 b(query)g(optimizer)g(in)h(R)3005 5033
+y Ff(\003)3074 5063 y FG([3])f(works)h(in)g(essentially)g(the)2039
+5163 y(same)17 b(way)f(as)h(that)g(of)f(System)g(R,)h(except)f(that)g
+(R)3480 5133 y Ff(\003)3536 5163 y FG(is)h(a)g(distributed)2044
+5263 y(database)32 b(system)g(which)g(introduces)f(some)h(subtle)g
+(complica-)p eop
+%%Page: 9 9
+9 8 bop -104 24 1935 4 v -104 3720 4 3696 v 66 714 a
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q1.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 611 m
+430 611 l
+420 846 m
+430 846 l
+420 1081 m
+430 1081 l
+420 1315 m
+430 1315 l
+420 1550 m
+430 1550 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 611 m
+2020 611 l
+2030 846 m
+2020 846 l
+2030 1081 m
+2020 1081 l
+2030 1315 m
+2020 1315 l
+2030 1550 m
+2020 1550 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 846 m
+440 846 l
+420 1315 m
+440 1315 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 846 m
+2010 846 l
+2030 1315 m
+2010 1315 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 846 m
+gsave
+348 846 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 1315 m
+gsave
+348 1315 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 418 m
+621 537 l
+822 661 l
+1023 789 l
+1225 909 l
+1426 1046 l
+1627 1183 l
+1828 1320 l
+2030 1449 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 537 30 0 360 arc
+gsave fill grestore
+stroke
+822 661 30 0 360 arc
+gsave fill grestore
+stroke
+1023 789 30 0 360 arc
+gsave fill grestore
+stroke
+1225 909 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1046 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1183 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1320 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1449 30 0 360 arc
+gsave fill grestore
+stroke
+420 421 m
+621 541 l
+822 670 l
+1023 801 l
+1225 935 l
+1426 1066 l
+1627 1229 l
+1828 1355 l
+2030 1504 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 451 m
+390 421 l
+420 391 l
+450 421 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 451 m
+390 421 l
+420 391 l
+450 421 l
+420 451 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 571 m
+591 541 l
+621 511 l
+651 541 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 571 m
+591 541 l
+621 511 l
+651 541 l
+621 571 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 700 m
+792 670 l
+822 640 l
+852 670 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 700 m
+792 670 l
+822 640 l
+852 670 l
+822 700 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 831 m
+993 801 l
+1023 771 l
+1053 801 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 831 m
+993 801 l
+1023 771 l
+1053 801 l
+1023 831 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 965 m
+1195 935 l
+1225 905 l
+1255 935 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 965 m
+1195 935 l
+1225 905 l
+1255 935 l
+1225 965 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 1096 m
+1396 1066 l
+1426 1036 l
+1456 1066 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 1096 m
+1396 1066 l
+1426 1036 l
+1456 1066 l
+1426 1096 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 1259 m
+1597 1229 l
+1627 1199 l
+1657 1229 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 1259 m
+1597 1229 l
+1627 1199 l
+1657 1229 l
+1627 1259 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+1828 1385 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+2030 1534 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 843 a Fz(\(a\))17 b(Query)h(1)974 714
+y @beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q2.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 611 m
+430 611 l
+420 846 m
+430 846 l
+420 1081 m
+430 1081 l
+420 1315 m
+430 1315 l
+420 1550 m
+430 1550 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 611 m
+2020 611 l
+2030 846 m
+2020 846 l
+2030 1081 m
+2020 1081 l
+2030 1315 m
+2020 1315 l
+2030 1550 m
+2020 1550 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 846 m
+440 846 l
+420 1315 m
+440 1315 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 846 m
+2010 846 l
+2030 1315 m
+2010 1315 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 846 m
+gsave
+348 846 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 1315 m
+gsave
+348 1315 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+420 418 m
+621 539 l
+822 664 l
+1023 783 l
+1225 906 l
+1426 1037 l
+1627 1176 l
+1828 1304 l
+2030 1451 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 539 30 0 360 arc
+gsave fill grestore
+stroke
+822 664 30 0 360 arc
+gsave fill grestore
+stroke
+1023 783 30 0 360 arc
+gsave fill grestore
+stroke
+1225 906 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1037 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1176 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1304 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1451 30 0 360 arc
+gsave fill grestore
+stroke
+420 412 m
+621 533 l
+822 661 l
+1023 796 l
+1225 926 l
+1426 1063 l
+1627 1212 l
+1828 1355 l
+2030 1504 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 442 m
+390 412 l
+420 382 l
+450 412 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 442 m
+390 412 l
+420 382 l
+450 412 l
+420 442 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 563 m
+591 533 l
+621 503 l
+651 533 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 563 m
+591 533 l
+621 503 l
+651 533 l
+621 563 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 691 m
+792 661 l
+822 631 l
+852 661 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 691 m
+792 661 l
+822 631 l
+852 661 l
+822 691 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 826 m
+993 796 l
+1023 766 l
+1053 796 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 826 m
+993 796 l
+1023 766 l
+1053 796 l
+1023 826 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 956 m
+1195 926 l
+1225 896 l
+1255 926 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 956 m
+1195 926 l
+1225 896 l
+1255 926 l
+1225 956 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 1093 m
+1396 1063 l
+1426 1033 l
+1456 1063 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 1093 m
+1396 1063 l
+1426 1033 l
+1456 1063 l
+1426 1093 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 1242 m
+1597 1212 l
+1627 1182 l
+1657 1212 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 1242 m
+1597 1212 l
+1627 1182 l
+1657 1212 l
+1627 1242 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+1828 1385 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+2030 1534 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 843 a(\(b\))f(Query)h(2)p -34 943 1816
+4 v 66 1633 a @beginspecial 50.187500 @llx 50.187500
+@lly 501.875000 @urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q3.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 401 m
+621 489 l
+822 578 l
+1023 672 l
+1225 762 l
+1426 865 l
+1627 969 l
+1828 1076 l
+2030 1574 l
+stroke
+420 401 30 0 360 arc
+gsave fill grestore
+stroke
+621 489 30 0 360 arc
+gsave fill grestore
+stroke
+822 578 30 0 360 arc
+gsave fill grestore
+stroke
+1023 672 30 0 360 arc
+gsave fill grestore
+stroke
+1225 762 30 0 360 arc
+gsave fill grestore
+stroke
+1426 865 30 0 360 arc
+gsave fill grestore
+stroke
+1627 969 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1076 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1574 30 0 360 arc
+gsave fill grestore
+stroke
+420 402 m
+621 485 l
+822 568 l
+1023 644 l
+1225 736 l
+1426 821 l
+1627 918 l
+1828 1019 l
+2030 1511 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 432 m
+390 402 l
+420 372 l
+450 402 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 432 m
+390 402 l
+420 372 l
+450 402 l
+420 432 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 515 m
+591 485 l
+621 455 l
+651 485 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 515 m
+591 485 l
+621 455 l
+651 485 l
+621 515 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 598 m
+792 568 l
+822 538 l
+852 568 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 598 m
+792 568 l
+822 538 l
+852 568 l
+822 598 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 674 m
+993 644 l
+1023 614 l
+1053 644 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 674 m
+993 644 l
+1023 614 l
+1053 644 l
+1023 674 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 766 m
+1195 736 l
+1225 706 l
+1255 736 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 766 m
+1195 736 l
+1225 706 l
+1255 736 l
+1225 766 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 851 m
+1396 821 l
+1426 791 l
+1456 821 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 851 m
+1396 821 l
+1426 791 l
+1456 821 l
+1426 851 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 948 m
+1597 918 l
+1627 888 l
+1657 918 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 948 m
+1597 918 l
+1627 888 l
+1657 918 l
+1627 948 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1049 m
+1798 1019 l
+1828 989 l
+1858 1019 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1049 m
+1798 1019 l
+1828 989 l
+1858 1019 l
+1828 1049 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1541 m
+2000 1511 l
+2030 1481 l
+2060 1511 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1541 m
+2000 1511 l
+2030 1481 l
+2060 1511 l
+2030 1541 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 1761 a(\(c\))f(Query)h(3)974 1633 y
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q4.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+420 400 m
+621 492 l
+822 575 l
+1023 669 l
+1225 759 l
+1426 866 l
+1627 962 l
+1828 1069 l
+2030 1578 l
+stroke
+420 400 30 0 360 arc
+gsave fill grestore
+stroke
+621 492 30 0 360 arc
+gsave fill grestore
+stroke
+822 575 30 0 360 arc
+gsave fill grestore
+stroke
+1023 669 30 0 360 arc
+gsave fill grestore
+stroke
+1225 759 30 0 360 arc
+gsave fill grestore
+stroke
+1426 866 30 0 360 arc
+gsave fill grestore
+stroke
+1627 962 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1069 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1578 30 0 360 arc
+gsave fill grestore
+stroke
+420 400 m
+621 484 l
+822 567 l
+1023 645 l
+1225 735 l
+1426 823 l
+1627 915 l
+1828 1024 l
+2030 1517 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+420 430 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 514 m
+591 484 l
+621 454 l
+651 484 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 514 m
+591 484 l
+621 454 l
+651 484 l
+621 514 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 597 m
+792 567 l
+822 537 l
+852 567 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 597 m
+792 567 l
+822 537 l
+852 567 l
+822 597 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 675 m
+993 645 l
+1023 615 l
+1053 645 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 675 m
+993 645 l
+1023 615 l
+1053 645 l
+1023 675 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 765 m
+1195 735 l
+1225 705 l
+1255 735 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 765 m
+1195 735 l
+1225 705 l
+1255 735 l
+1225 765 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 853 m
+1396 823 l
+1426 793 l
+1456 823 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 853 m
+1396 823 l
+1426 793 l
+1456 823 l
+1426 853 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 945 m
+1597 915 l
+1627 885 l
+1657 915 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 945 m
+1597 915 l
+1627 885 l
+1657 915 l
+1627 945 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1054 m
+1798 1024 l
+1828 994 l
+1858 1024 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1054 m
+1798 1024 l
+1828 994 l
+1858 1024 l
+1828 1054 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1547 m
+2000 1517 l
+2030 1487 l
+2060 1517 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1547 m
+2000 1517 l
+2030 1487 l
+2060 1517 l
+2030 1547 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 1761 a(\(d\))f(Query)h(4)p -34 1861
+V 66 2551 a @beginspecial 50.187500 @llx 50.187500 @lly
+501.875000 @urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q5.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 552 m
+430 552 l
+420 728 m
+430 728 l
+420 904 m
+430 904 l
+420 1081 m
+430 1081 l
+420 1257 m
+430 1257 l
+420 1433 m
+430 1433 l
+420 1609 m
+430 1609 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 552 m
+2020 552 l
+2030 728 m
+2020 728 l
+2030 904 m
+2020 904 l
+2030 1081 m
+2020 1081 l
+2030 1257 m
+2020 1257 l
+2030 1433 m
+2020 1433 l
+2030 1609 m
+2020 1609 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 728 m
+440 728 l
+420 1081 m
+440 1081 l
+420 1433 m
+440 1433 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 728 m
+2010 728 l
+2030 1081 m
+2010 1081 l
+2030 1433 m
+2010 1433 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 728 m
+gsave
+348 728 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1081 m
+gsave
+348 1081 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1433 m
+gsave
+348 1433 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 424 m
+956 511 l
+1493 671 l
+2030 1778 l
+stroke
+420 424 30 0 360 arc
+gsave fill grestore
+stroke
+956 511 30 0 360 arc
+gsave fill grestore
+stroke
+1493 671 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1778 30 0 360 arc
+gsave fill grestore
+stroke
+420 426 m
+956 522 l
+1493 688 l
+2030 1737 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 456 m
+390 426 l
+420 396 l
+450 426 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 456 m
+390 426 l
+420 396 l
+450 426 l
+420 456 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 552 m
+926 522 l
+956 492 l
+986 522 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 552 m
+926 522 l
+956 492 l
+986 522 l
+956 552 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 718 m
+1463 688 l
+1493 658 l
+1523 688 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 718 m
+1463 688 l
+1493 658 l
+1523 688 l
+1493 718 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1767 m
+2000 1737 l
+2030 1707 l
+2060 1737 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1767 m
+2000 1737 l
+2030 1707 l
+2060 1737 l
+2030 1767 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 2679 a(\(e\))f(Query)h(5)974 2551 y
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q6.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 386 l
+956 376 m
+956 386 l
+1493 376 m
+1493 386 l
+2030 376 m
+2030 386 l
+420 1785 m
+420 1775 l
+956 1785 m
+956 1775 l
+1493 1785 m
+1493 1775 l
+2030 1785 m
+2030 1775 l
+stroke
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+420 415 m
+956 490 l
+1493 633 l
+2030 1651 l
+stroke
+420 415 30 0 360 arc
+gsave fill grestore
+stroke
+956 490 30 0 360 arc
+gsave fill grestore
+stroke
+1493 633 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1651 30 0 360 arc
+gsave fill grestore
+stroke
+420 416 m
+956 493 l
+1493 631 l
+2030 1462 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 446 m
+390 416 l
+420 386 l
+450 416 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 446 m
+390 416 l
+420 386 l
+450 416 l
+420 446 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 523 m
+926 493 l
+956 463 l
+986 493 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 523 m
+926 493 l
+956 463 l
+986 493 l
+956 523 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 661 m
+1463 631 l
+1493 601 l
+1523 631 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 661 m
+1463 631 l
+1493 601 l
+1523 631 l
+1493 661 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1492 m
+2000 1462 l
+2030 1432 l
+2060 1462 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1492 m
+2000 1462 l
+2030 1432 l
+2060 1462 l
+2030 1492 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1178 2679 a(\(f\))f(Query)h(6)p -34 2780
+V 66 3469 a @beginspecial 50.187500 @llx 50.187500 @lly
+501.875000 @urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q7.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-83 1080 m
+gsave
+-83 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 425 m
+956 510 l
+1493 670 l
+2030 1637 l
+stroke
+420 425 30 0 360 arc
+gsave fill grestore
+stroke
+956 510 30 0 360 arc
+gsave fill grestore
+stroke
+1493 670 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1637 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 501 l
+1493 648 l
+2030 1470 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+420 450 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+956 531 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 678 m
+1463 648 l
+1493 618 l
+1523 648 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 678 m
+1463 648 l
+1493 618 l
+1523 648 l
+1493 678 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1500 m
+2000 1470 l
+2030 1440 l
+2060 1470 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1500 m
+2000 1470 l
+2030 1440 l
+2060 1470 l
+2030 1500 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 265 3597 a(\(g\))f(Query)h(7)974 3469 y
+@beginspecial 50.187500 @llx 50.187500 @lly 501.875000
+@urx 376.406250 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime_Q8.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+420 421 m
+956 504 l
+1493 650 l
+2030 1549 l
+stroke
+420 421 30 0 360 arc
+gsave fill grestore
+stroke
+956 504 30 0 360 arc
+gsave fill grestore
+stroke
+1493 650 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1549 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 502 l
+1493 647 l
+2030 1475 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+420 450 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 532 m
+926 502 l
+956 472 l
+986 502 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 532 m
+926 502 l
+956 472 l
+986 502 l
+956 532 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 677 m
+1463 647 l
+1493 617 l
+1523 647 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 677 m
+1463 647 l
+1493 617 l
+1523 647 l
+1493 677 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1505 m
+2000 1475 l
+2030 1445 l
+2060 1475 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1505 m
+2000 1475 l
+2030 1445 l
+2060 1475 l
+2030 1505 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 3597 a(\(h\))f(Query)h(8)p 1827 3720
+4 3696 v -104 3723 1935 4 v 1829 3740 19 3703 v -87 3740
+1935 19 v -38 3922 a FG(Figure)i(7:)27 b(Query)19 b(optimization)g
+(times)h(for)g(Q1)g(through)e(Q8)-112 4158 y(tions)i(in)g(its)h(query)e
+(optimizer)-5 b(.)-29 4266 y(The)23 b(Starburst)h(query)e(optimizer)h
+([10])g(uses)h(rules)g(for)g(all)g(de-)-112 4366 y(cisions)j(that)g
+(need)f(to)i(be)f(taken)f(by)h(the)g(query)e(optimizer)-5
+b(.)47 b(The)-116 4466 y(rules)18 b(are)f(functional)f(in)i(nature)e
+(and)h(transform)f(a)i(given)f(operator)-112 4565 y(tree)j(into)g
+(another)-5 b(.)26 b(The)20 b(rules)h(are)f(commonly)e(those)i(that)h
+(re\257ect)-112 4665 y(relational)26 b(calculus)i(facts.)49
+b(In)27 b(Starburst,)i(the)f(query)e(rewriting)-112 4764
+y(phase)21 b(is)i(dif)o(ferent)d(from)i(the)g(optimization)e(phase.)33
+b(The)21 b(rewrit-)-119 4864 y(ing)15 b(phase)f(transforms)f(the)i
+(query)f(itself)h(into)g(equivalent)e(operator)-112 4964
+y(trees)21 b(based)g(on)f(relational)g(calculus)h(rules.)30
+b(The)20 b(plan)h(optimiza-)-114 5063 y(tion)d(phase)h(selects)g
+(algorithms)f(for)g(each)g(operator)f(in)i(the)g(opera-)-114
+5163 y(tor)f(tree)h(that)g(is)g(obtained)e(after)i(rewriting.)25
+b(The)18 b(disadvantage)f(of)-112 5263 y(separating)k(the)h(query)f
+(rewrite)h(and)g(the)h(optimization)e(phases)h(is)2041
+21 y(that)c(pruning)e(of)h(the)h(search)g(space)g(is)h(not)e(possible)h
+(during)e(query)2044 120 y(rewrite,)j(since)i(the)f(rewrite)g(phase)g
+(is)h(non-cost-based.)2127 228 y(Freytag)h([6])h(describes)f(a)i
+(rule-based)d(query)h(optimizer)g(simi-)2044 328 y(lar)f(to)g
+(Starburst.)28 b(The)20 b(rules)h(are)g(based)f(on)g(LISP-like)h
+(represen-)2040 427 y(tations)c(of)f(access)i(plans.)25
+b(The)17 b(rules)f(themselves)h(are)g(recursively)2044
+527 y(de\256ned)26 b(on)g(smaller)i(expressions)e(\(operator)e
+(trees\).)48 b(Although)2044 627 y(several)22 b(expressions)g(can)h
+(contain)e(a)j(common)d(sub-expression,)2044 726 y(Freytag)e(doesn')o
+(t)f(consider)h(the)h(possibility)g(of)g(sharing.)25
+b(Expres-)2044 826 y(sions)c(are)g(evaluated)f(each)h(time)h(they)e
+(are)i(encountered.)27 b(This)21 b(is)2040 926 y(obviously)16
+b(inef)o(\256cient.)25 b(In)17 b(addition,)f(as)j(in)e(Starburst,)g(he)
+h(doesn')o(t)2044 1025 y(consider)i(the)h(cost)h(transformations)d
+(inherent)h(in)h(any)g(query)f(op-)2044 1125 y(timizer;)g(rules)g(are)g
+(syntactic)g(transformation)e(rules.)2127 1233 y(EXODUS)j([9])g
+(provides)e(an)i(optimizer)f(generator)g(which)g(ac-)2044
+1332 y(cepts)k(a)g(rule-based)e(speci\256cation)h(of)g(the)h(data)g
+(model)f(as)h(input.)2042 1432 y(The)19 b(optimizer)f(generator)f
+(compiles)i(these)g(rules,)g(together)f(with)2042 1532
+y(pre-de\256ned)e(rules,)j(to)f(generate)g(an)g(optimizer)g(for)g(the)g
+(particular)2044 1631 y(data)25 b(model)g(and)g(set)h(of)f(operators.)
+41 b(Unlike)25 b(Freytag,)h(the)g(opti-)2043 1731 y(mizer)18
+b(generator)f(for)i(EXODUS)g(allows)h(for)e(C)i(code)f(along)f(with)
+2037 1831 y(de\256nitions)13 b(of)i(new)f(rules.)25 b(This)15
+b(allows)f(the)h(database)f(implemen-)2039 1930 y(tor)i(the)g(freedom)f
+(to)h(associate)h(any)f(action)f(with)i(a)f(particular)f(rule.)2041
+2030 y(Operator)i(trees)h(in)g(EXODUS)g(are)g(constructed)e(bottom-up)g
+(from)2044 2129 y(previously)i(constructed)h(trees.)2121
+2237 y(The)d(V)-11 b(olcano)14 b(optimizer)h(generator)f(project)g([7])
+h(evolved)g(from)2044 2337 y(the)22 b(EXODUS)g(project.)31
+b(It)22 b(is)g(dif)o(ferent)e(from)h(all)h(the)g(above)f(op-)2044
+2437 y(timizers)j(in)h(one)e(signi\256cant)h(way:)35
+b(it)25 b(is)h(a)e(top-down)e(optimizer)2042 2536 y(compared)17
+b(with)i(the)f(bottom-up)f(strategy)h(of)g(the)h(others.)26
+b(Opera-)2041 2636 y(tor)17 b(trees)h(are)f(optimized)f(starting)i
+(from)e(the)i(root)e(while)i(sub-trees)2041 2735 y(are)h(not)e(yet)i
+(optimized.)25 b(This)18 b(leads)g(to)h(a)f(constraint-driven)d(gen-)
+2044 2835 y(eration)23 b(of)h(the)g(search)f(space.)38
+b(While)25 b(this)f(method)f(results)h(in)h(a)2040 2935
+y(tight)17 b(control)e(of)i(the)g(search)g(space,)g(it)h(is)f
+(unconventional)d(and)i(re-)2044 3034 y(quires)24 b(careful)f
+(attention)h(on)g(the)h(part)f(of)g(the)g(optimizer)g(imple-)2043
+3134 y(mentor)19 b(to)h(ensure)g(that)g(legal)g(operator)e(trees)i(are)
+g(not)g(accidently)2044 3234 y(left)25 b(out)f(of)h(the)g(search)f
+(space.)41 b(W)-7 b(e)26 b(have)f(used)f(V)-11 b(olcano)24
+b(as)i(our)2044 3333 y(back-end)18 b(search)i(engine.)2044
+3658 y FB(6)119 b(Conclusion)31 b(and)g(futur)n(e)f(work)2044
+3859 y FG(Current)24 b(rule-based)f(query)g(optimizers)h(do)g(not)h
+(provide)e(a)i(very)2044 3959 y(intuitive)20 b(and)g(conceptually)f
+(streamlined)h(framework)f(to)i(de\256ne)2044 4059 y(rules)26
+b(and)g(actions.)45 b(Our)26 b(experiences)e(with)j(the)f(V)-11
+b(olcano)26 b(opti-)2044 4158 y(mizer)e(generator)e(suggest)i(that)g
+(its)i(model)d(of)h(rules)g(and)g(the)g(ex-)2044 4258
+y(pression)i(of)h(these)g(rules)g(is)h(much)e(more)g(complicated)g(and)
+g(too)2042 4358 y(low-level)19 b(than)f(it)i(needs)f(to)g(be.)26
+b(As)20 b(a)g(consequence,)c(rule)j(sets)h(in)2043 4457
+y(V)-11 b(olcano)19 b(are)g(fragile,)g(hard)g(to)h(write,)f(and)h
+(debug.)25 b(Similar)19 b(prob-)2044 4557 y(lems)i(may)f(exist)h(in)g
+(other)f(contemporary)d(rule-based)i(query)h(op-)2044
+4656 y(timizers.)2126 4764 y(W)-7 b(e)21 b(believe)d(that)i(rule-based)
+e(query)g(optimizers)g(will)j(be)e(stan-)2044 4864 y(dard)i(tools)i(of)
+f(future)g(database)g(systems.)34 b(The)23 b(pragmatic)e(dif)o(\256-)
+2044 4964 y(culties)g(of)h(using)f(existing)f(rule-based)g(optimizers)h
+(led)g(us)h(to)f(de-)2044 5063 y(velop)f(Prairie,)g(an)h(extensible)f
+(and)g(structured)g(algebraic)f(frame-)2044 5163 y(work)j(for)h
+(specifying)f(rules.)36 b(Prairie)23 b(is)h(similar)g(to)f(existing)g
+(op-)2044 5263 y(timizers)33 b(in)g(that)f(it)i(supports)e(both)g
+(transformation)e(rules)j(and)p eop
+%%Page: 10 10
+10 9 bop -112 21 a FG(implementation)21 b(rules.)37 b(However)m(,)23
+b(Prairie)g(makes)h(several)f(im-)-112 120 y(provements:)-50
+291 y(1.)41 b(it)14 b(of)o(fers)e(a)i(conceptually)d(more)h
+(streamlined)h(model)f(for)h(rule)54 390 y(speci\256cation;)-50
+562 y(2.)41 b(rules)18 b(are)g(encapsulated,)e(there)i(are)g(no)g
+(\252hidden\272)e(operators)54 662 y(or)j(\252hidden\272)g(algorithms;)
+-50 834 y(3.)41 b(implementation)19 b(hints)i(\(e.g.,)f(enforcers\))g
+(are)h(deduced)e(au-)54 933 y(tomatically;)-50 1105 y(4.)41
+b(and)19 b(it)i(has)g(ef)o(\256cient)e(implementations.)-29
+1276 y(W)-7 b(e)26 b(have)e(explained)f(how)i(the)f(\256rst)i(three)f
+(points)f(are)h(impor)n(-)-113 1376 y(tant)20 b(for)f(simplifying)f
+(rule)h(speci\256cations)g(and)h(making)e(rule)h(sets)-112
+1475 y(less)27 b(brittle)g(for)f(extensibility)-5 b(.)45
+b(A)27 b(consequence)e(is)i(that)g(Prairie)-112 1575
+y(rules)20 b(are)h(simpler)f(and)g(more)g(robust)f(than)i(rules)f(of)g
+(existing)h(op-)-112 1674 y(timizers)j(\(e.g.,)h(V)-11
+b(olcano\).)40 b(W)-7 b(e)25 b(addressed)f(the)h(fourth)e(point)h(by)
+-112 1774 y(building)g(a)j(P2V)g(pre-processor)c(which)j(uses)h
+(sophisticated)f(al-)-112 1874 y(gorithms)e(to)j(compose)e(and)g
+(compact)g(a)i(Prairie)f(rule)g(set)h(into)e(a)-112 1973
+y(V)-11 b(olcano)23 b(rule)g(set.)39 b(T)-6 b(o)24 b(demonstrate)f(the)
+h(scalability)f(of)h(our)f(ap-)-113 2073 y(proach,)c(we)h(rewrote)g
+(the)g(TI)g(Open)g(OODB)h(rule)e(set)i(as)g(a)g(Prairie)-113
+2173 y(rule)e(set,)h(generated)d(its)k(V)-11 b(olcano)18
+b(counterpart,)f(and)i(showed)g(that)-113 2272 y(the)h(performance)d
+(of)j(the)f(synthesized)g(V)-11 b(olcano)19 b(rule)h(set)g(closely)-112
+2372 y(matches)f(the)i(hand-crafted)c(V)-11 b(olcano)19
+b(rule)h(set.)-29 2473 y(Our)25 b(future)g(work)g(will)i(concentrate)d
+(on)i(developing)d(higher)n(-)-120 2573 y(level)15 b(abstractions)e
+(using)h(Prairie,)h(including)d(automatically)h(gen-)-116
+2672 y(erating)k(Prairie)h(rule)f(sets,)i(and)e(combining)f(multiple)h
+(Prairie)g(rule)-112 2772 y(sets)k(to)f(automatically)f(generate)g(ef)o
+(\256cient)g(optimizers.)-112 3059 y FB(Acknowledgments)-112
+3247 y FG(W)-7 b(e)30 b(wish)g(to)g(thank)f(T)-6 b(exas)30
+b(Instruments,)g(Inc.)f(for)g(making)g(the)-119 3347
+y(Open)14 b(OODB)i(source)e(code)g(available)g(to)h(us.)25
+b(Comments)14 b(by)h(Jos)5 b(\302)-33 b(e)-112 3447 y(Blakeley)-5
+b(,)23 b(Anne)h(Ngu,)g(V)-5 b(ivek)23 b(Singhal,)h(Thomas)f(W)-7
+b(oo)24 b(and)g(the)-113 3546 y(anonymous)18 b(referees)h(greatly)h
+(improved)e(the)i(quality)f(of)h(the)g(pa-)-112 3646
+y(per)-5 b(.)-112 3934 y FB(Refer)n(ences)-71 4122 y
+FG([1])40 b(D.)16 b(S.)f(Batory)-5 b(.)19 b(Building)14
+b(blocks)g(of)h(database)f(management)67 4221 y(systems.)26
+b(T)-6 b(echnical)18 b(Report)g(TR\26187\26123,)e(The)i(University)67
+4321 y(of)i(T)-6 b(exas)20 b(at)h(Austin,)f(February)f(1988.)-71
+4493 y([2])40 b(Jos)5 b(\302)-33 b(e)37 b(A.)g(Blakeley)-5
+b(,)39 b(W)m(illiam)e(J.)g(McKenna,)i(and)d(Goetz)67
+4592 y(Graefe.)j(Experiences)21 b(building)f(the)j(Open)e(OODB)i(query)
+67 4692 y(optimizer)-5 b(.)27 b(In)19 b FF(Pr)m(oceedings)e(1993)h(ACM)
+i(SIGMOD)f(Inter)n(-)67 4792 y(national)27 b(Confer)m(ence)h(on)g
+(Management)e(of)i(Data)p FG(,)i(pages)67 4891 y(287\261296,)17
+b(W)-7 b(ashington,)20 b(May)f(1993.)-71 5063 y([3])40
+b(Dean)33 b(Daniels,)k(Patricia)c(Selinger)m(,)j(Laura)c(Haas,)37
+b(Bruce)67 5163 y(Lindsay)-5 b(,)25 b(C.)g(Mohan,)g(Adrian)f(W)-7
+b(alker)m(,)26 b(and)e(Paul)h(W)m(ilms.)67 5263 y(An)14
+b(introduction)c(to)k(distributed)e(query)g(compilation)f(in)j(R)1797
+5232 y Ff(\003)1835 5263 y FG(.)2224 21 y(In)22 b FF(Pr)m(oceedings)f
+(2nd)h(International)e(Confer)m(ence)i(on)h(Dis-)2224
+120 y(tributed)k(Databases)p FG(,)i(pages)f(291\261309,)f(Berlin,)j
+(Septem-)2224 220 y(ber)19 b(1982.)2085 386 y([4])41
+b(Dinesh)29 b(Das)h(and)e(Don)h(Batory)-5 b(.)74 b(Prairie:)45
+b(An)29 b(algebraic)2224 486 y(framework)37 b(for)j(rule)g
+(speci\256cation)f(in)h(query)f(optimiz-)2224 585 y(ers.)92
+b(In)33 b FF(Pr)m(oceedings)e(of)i(the)g(W)-8 b(orkshop)33
+b(on)f(Database)2224 685 y(Query)14 b(Optimizer)g(Generators)g(and)g
+(Rule-Based)e(Optimiz-)2224 784 y(ers)p FG(,)21 b(pages)e(139\261154,)e
+(Dallas,)k(September)e(1993.)2085 950 y([5])41 b(Dinesh)28
+b(Das)h(and)f(Don)g(Batory)-5 b(.)69 b(Prairie:)43 b(A)29
+b(rule)f(speci-)2224 1050 y(\256cation)h(framework)e(for)i(query)f
+(optimizers.)75 b(T)-6 b(echnical)2224 1150 y(Report)22
+b(TR)h(94\26116,)e(The)h(University)g(of)g(T)-6 b(exas)22
+b(at)h(Austin,)2224 1249 y(May)d(1994.)2085 1415 y([6])41
+b(Johann)15 b(Christoph)h(Freytag.)21 b(A)d(rule-based)d(view)h(of)g
+(query)2224 1515 y(optimization.)80 b(In)30 b FF(Pr)m(oceedings)f(1987)
+h(ACM)h(SIGMOD)2224 1615 y(International)37 b(Confer)m(ence)j(on)f
+(Management)f(of)j(Data)p FG(,)2224 1714 y(pages)19 b(173\261180,)e
+(San)k(Francisco,)e(May)h(1987.)2085 1880 y([7])41 b(Goetz)33
+b(Graefe.)94 b(V)-11 b(olcano,)36 b(an)d(extensible)g(and)g(parallel)
+2224 1980 y(query)23 b(evaluation)g(system.)53 b(T)-6
+b(echnical)24 b(Report)h(CU\261CS\261)2224 2080 y(481\26190,)14
+b(University)i(of)g(Colorado)f(at)i(Boulder)m(,)e(July)i(1990.)2085
+2246 y([8])41 b(Goetz)24 b(Graefe.)48 b(Query)24 b(evaluation)e
+(techniques)h(for)h(lar)o(ge)2224 2345 y(databases.)66
+b FF(ACM)28 b(Computing)f(Surveys)p FG(,)i(25\(2\):73\261170,)2224
+2445 y(June)20 b(1993.)2085 2611 y([9])41 b(Goetz)29
+b(Graefe)h(and)f(David)g(J.)i(DeW)m(itt.)78 b(The)30
+b(EXODUS)2224 2710 y(optimizer)21 b(generator)-5 b(.)42
+b(In)23 b FF(Pr)m(oceedings)e(1987)h(ACM)i(SIG-)2224
+2810 y(MOD)40 b(International)d(Confer)m(ence)i(on)g(Management)f(of)
+2224 2910 y(Data)p FG(,)19 b(pages)h(387\261394,)d(San)j(Francisco,)g
+(May)g(1987.)2044 3076 y([10])40 b(L.)23 b(M.)g(Haas,)h(J.)g(C.)g
+(Freytag,)e(G.)i(M.)f(Lohman,)f(and)g(H.)i(Pi-)2224 3175
+y(rahesh.)31 b(Extensible)20 b(query)f(processing)h(in)h(Starburst.)32
+b(Re-)2224 3275 y(search)20 b(Report)g(RJ)i(6610,)e(IBM)h(Almaden)e
+(Research)i(Cen-)2224 3375 y(ter)m(,)e(December)g(1988.)2047
+3541 y([1)m(1])40 b(P)-9 b(.)33 b(G.)g(Selinger)m(,)h(M.)f(M.)g
+(Astrahan,)i(D.)e(D.)g(Chamberlin,)2224 3640 y(R.)28
+b(A.)h(Lorie,)g(and)f(T)-6 b(.)28 b(G.)g(Price.)69 b(Access)29
+b(path)e(selection)2224 3740 y(in)d(a)g(relational)f(database)g
+(management)f(system.)47 b(In)23 b FF(Pr)m(o-)2224 3840
+y(ceedings)k(1979)g(ACM)i(SIGMOD)f(International)e(Confer)n(-)2224
+3939 y(ence)g(on)h(Management)e(of)i(Data)p FG(,)h(pages)e(23\26134,)g
+(Boston,)2224 4039 y(May)20 b(1979.)2044 4205 y([12])40
+b(Michael)30 b(Stonebraker)f(and)i(Lawrence)f(A.)i(Rowe.)84
+b(The)2224 4305 y(design)25 b(of)h(Postgres.)60 b(In)26
+b FF(Pr)m(oceedings)f(1986)g(ACM)i(SIG-)2224 4404 y(MOD)40
+b(International)d(Confer)m(ence)i(on)g(Management)f(of)2224
+4504 y(Data)p FG(,)19 b(pages)h(340\261355,)d(W)-7 b(ashington,)19
+b(May)h(1986.)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/macros/latex/contrib/utthesis/ICDE-11/results.tex b/macros/latex/contrib/utthesis/ICDE-11/results.tex
new file mode 100644
index 0000000000..d9ae183329
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/results.tex
@@ -0,0 +1,473 @@
+\section{Experimental results}
+\label{sec:results}
+
+This section presents experimental results which demonstrate the value
+of Prairie in specifying rule sets of rule-based optimizers. Our
+experiments consist of specifying rule-based optimizers using Prairie
+and generating optimizers using the P2V pre-processor and the
+optimizer-generator paradigm of Figure~\ref{fig:ptovmodel}.
+
+In \cite{Das93}, we presented an implementation of a centralized
+relational query optimizer using Prairie. Using the P2V translator, we
+translated this to Volcano format and optimized several queries using
+the resultant optimizer. For comparison, we hand-coded the same
+optimizer directly in Volcano. The results presented there showed
+that, using Prairie (compared to directly using Volcano) resulted in
+approximately 50\% savings in lines of code with negligible (less than
+5\%) increase in query optimization time. However, the optimizer was
+quite small in terms of the number of operators, algorithms and rules.
+
+For a more realistic evaluation of Prairie, we needed answers to
+the following questions:
+\begin{enumerate}
+\item Is Prairie adequate for large-scale rule sets?
+\item How is programmer productivity enhanced by the high-level
+ abstractions of Prairie?
+\item Can Prairie rule sets be translated automatically into
+ efficient implementations?
+\end{enumerate}
+
+We addressed the first question by using the Texas Instruments Open
+OODB query optimizer rule set, which has the largest publicly
+available rule set. We describe this optimizer in the next section,
+and then give our assessments to the last two questions in subsequent
+sections.
+
+\subsection{The Texas Instruments Open OODB query optimizer}
+\label{sec:oodb}
+
+The Texas Instruments Open Object-Oriented Database Management System
+is an open, extensible, object-oriented database system which provides
+users an architectural framework that is configurable in an incremental
+manner. The query optimizer in the Open OODB \cite{Blak93} is
+generated using Volcano. It is written as a set of trans\_rules and
+impl\_rules that define the algebra of an object-oriented database
+system. Currently, there are 17 transformation rules and 9
+implementation rules together with about $13,000$ lines of code for
+support functions; this, of course, can be changed by an Open OODB user
+for specific needs.
+
+\subsection{Programmer productivity}
+\label{sec:productivity}
+
+Programmer productivity can be measured in different ways. An
+admittedly simplistic metric is the number of lines of code that must
+be written. But there are also less tangible measures, such as the
+amount of conceptual effort needed to understand a particular
+programming task. Our experience with the Open OODB query optimizer
+suggests that Prairie excels on the latter, while offering modest
+reductions in the volume of code that needs to be written.
+
+We converted by hand the Open OODB query optimizer's Volcano
+specifications to Prairie. This was a non-trivial task because of the
+relatively large size of the rule set and the complexity of the support
+functions. This was where we found Prairie helped in conceptually
+simplifying the rules and actions. We then used our P2V pre-processor
+to reconstitute these Prairie specifications as Volcano
+specifications. As described in Section~\ref{sec:ptov}, this process
+involved a considerable level of complexity, partly because the Prairie
+specification had 22 T-rules and 11 I-rules compared to 17 trans\_rules
+and 9 impl\_rules in the Volcano specification; the reconstituted
+Volcano specification had the same number of trans\_rules and
+impl\_rules as the original hand-coded specification.
+
+Converting the Open OODB optimizer rule set into Prairie format
+actually simplified its specification as the complexities of the
+Volcano model were removed. The reduction in lines of code was modest
+--- there was about a 10\% savings.\footnote{The original Volcano
+specification had $13,400$ lines, the Prairie specification had
+$12,100$ lines, and the P2V-generated Volcano specification had
+$15,800$ lines.} However, as mentioned above, savings in lines of code
+do not adequately reflect increases in programmer productivity. We
+found the encapsulated specifications of Prairie --- namely, the use of
+a single descriptor and fewer explicit support functions --- made rule
+programming \emph{much} easier.
+
+\subsection{Performance results using the Open OODB optimizer}
+\label{sec:oodbexp}
+
+\newsavebox{\Eone}
+\newsavebox{\Etwo}
+\newsavebox{\Ethree}
+\newsavebox{\Efour}
+
+\begin{lrbox}{\Eone}
+\begin{minipage}[b]{1.9cm}
+\psset{unit=4mm}
+\psset{nodesep=1pt}
+\tiny
+\begin{center}
+\begin{pspicture}(0,0)(4,4)
+\rput(0,0){\rnode{cl1}{$\textit{C}_1$}}
+\rput(0,1){\rnode{getcl1}{RET}}
+\ncline{-}{cl1}{getcl1}
+\rput(2,0){\rnode{cl2}{$\textit{C}_2$}}
+\rput(2,1){\rnode{getcl2}{RET}}
+\ncline{-}{cl2}{getcl2}
+\rput(1,2){\rnode{joingetcl1getcl2}{JOIN}}
+\ncline{-}{joingetcl1getcl2}{getcl1}
+\ncline{-}{joingetcl1getcl2}{getcl2}
+\rput{45}(2,3){\rnode{dots}{$\ldots$}}
+\ncline{-}{joingetcl1getcl2}{dots}
+\rput(4,3){\rnode{getcln}{RET}}
+\rput(4,2){\rnode{cln}{$\textit{C}_n$}}
+\ncline{-}{cln}{getcln}
+\rput(3,4){\rnode{root}{JOIN}}
+\ncline{-}{root}{dots}
+\ncline{-}{root}{getcln}
+\end{pspicture}
+\end{center}
+\end{minipage}
+\end{lrbox}
+
+\begin{lrbox}{\Etwo}
+\begin{minipage}[b]{1.9cm}
+\psset{unit=4mm}
+\psset{nodesep=1pt}
+\tiny
+\begin{center}
+\begin{pspicture}(0,0)(4,5)
+\rput(0,0){\rnode{cl1}{$\textit{C}_1$}}
+\rput(0,1){\rnode{getcl1}{RET}}
+\ncline{-}{cl1}{getcl1}
+\rput(2,0){\rnode{cl2}{$\textit{C}_2$}}
+\rput(2,1){\rnode{getcl2}{RET}}
+\ncline{-}{cl2}{getcl2}
+\rput(0,2){\rnode{matgetcl1}{MAT}}
+\ncline{-}{getcl1}{matgetcl1}
+\rput(2,2){\rnode{matgetcl2}{MAT}}
+\ncline{-}{getcl2}{matgetcl2}
+\rput(1,3){\rnode{joinmatgetcl1matgetcl2}{JOIN}}
+\ncline{-}{joinmatgetcl1matgetcl2}{matgetcl1}
+\ncline{-}{joinmatgetcl1matgetcl2}{matgetcl2}
+\rput{45}(2,4){\rnode{dots}{$\ldots$}}
+\ncline{-}{joinmatgetcl1matgetcl2}{dots}
+\rput(4,3){\rnode{getcln}{RET}}
+\rput(4,2){\rnode{cln}{$\textit{C}_n$}}
+\ncline{-}{cln}{getcln}
+\rput(4,4){\rnode{matgetcln}{MAT}}
+\ncline{-}{matgetcln}{getcln}
+\rput(3,5){\rnode{root}{JOIN}}
+\ncline{-}{root}{dots}
+\ncline{-}{root}{matgetcln}
+\end{pspicture}
+\end{center}
+\end{minipage}
+\end{lrbox}
+
+\begin{lrbox}{\Ethree}
+\begin{minipage}[b]{1.9cm}
+\psset{unit=4mm}
+\psset{nodesep=1pt}
+\tiny
+\begin{center}
+\begin{pspicture}(0,0)(4,5)
+\rput(0,0){\rnode{cl1}{$\textit{C}_1$}}
+\rput(0,1){\rnode{getcl1}{RET}}
+\ncline{-}{cl1}{getcl1}
+\rput(2,0){\rnode{cl2}{$\textit{C}_2$}}
+\rput(2,1){\rnode{getcl2}{RET}}
+\ncline{-}{cl2}{getcl2}
+\rput(1,2){\rnode{joingetcl1getcl2}{JOIN}}
+\ncline{-}{joingetcl1getcl2}{getcl1}
+\ncline{-}{joingetcl1getcl2}{getcl2}
+\rput{45}(2,3){\rnode{dots}{$\ldots$}}
+\ncline{-}{joingetcl1getcl2}{dots}
+\rput(4,3){\rnode{getcln}{RET}}
+\rput(4,2){\rnode{cln}{$\textit{C}_n$}}
+\ncline{-}{cln}{getcln}
+\rput(3,4){\rnode{root}{JOIN}}
+\ncline{-}{root}{dots}
+\ncline{-}{root}{getcln}
+\rput(3,5){\rnode{select}{SELECT}}
+\ncline{-}{select}{root}
+\end{pspicture}
+\end{center}
+\end{minipage}
+\end{lrbox}
+
+\begin{lrbox}{\Efour}
+\begin{minipage}[b]{1.9cm}
+\psset{unit=4mm}
+\psset{nodesep=1pt}
+\tiny
+\begin{center}
+\begin{pspicture}(0,0)(4,6)
+\rput(0,0){\rnode{cl1}{$\textit{C}_1$}}
+\rput(0,1){\rnode{getcl1}{RET}}
+\ncline{-}{cl1}{getcl1}
+\rput(2,0){\rnode{cl2}{$\textit{C}_2$}}
+\rput(2,1){\rnode{getcl2}{RET}}
+\ncline{-}{cl2}{getcl2}
+\rput(0,2){\rnode{matgetcl1}{MAT}}
+\ncline{-}{getcl1}{matgetcl1}
+\rput(2,2){\rnode{matgetcl2}{MAT}}
+\ncline{-}{getcl2}{matgetcl2}
+\rput(1,3){\rnode{joinmatgetcl1matgetcl2}{JOIN}}
+\ncline{-}{joinmatgetcl1matgetcl2}{matgetcl1}
+\ncline{-}{joinmatgetcl1matgetcl2}{matgetcl2}
+\rput{45}(2,4){\rnode{dots}{$\ldots$}}
+\ncline{-}{joinmatgetcl1matgetcl2}{dots}
+\rput(4,3){\rnode{getcln}{RET}}
+\rput(4,2){\rnode{cln}{$\textit{C}_n$}}
+\ncline{-}{cln}{getcln}
+\rput(4,4){\rnode{matgetcln}{MAT}}
+\ncline{-}{matgetcln}{getcln}
+\rput(3,5){\rnode{root}{JOIN}}
+\ncline{-}{root}{dots}
+\ncline{-}{root}{matgetcln}
+\rput(3,6){\rnode{select}{SELECT}}
+\ncline{-}{select}{root}
+\end{pspicture}
+\end{center}
+\end{minipage}
+\end{lrbox}
+
+\begin{centeredfigure*}
+\begin{minipage}[b]{9.1cm}
+\myshadowbox{
+\begin{minipage}[b]{8.6cm}
+\subfigure[E1] { \usebox{\Eone} \label{fig:Eone} }
+\vrule
+\subfigure[E2] { \usebox{\Etwo} \label{fig:Etwo} }
+\vrule
+\subfigure[E3] { \usebox{\Ethree} \label{fig:Ethree} }
+\vrule
+\subfigure[E4] { \usebox{\Efour} \label{fig:Efour} }
+\normalsize
+\end{minipage}
+}
+\caption{Expressions used in generating queries for experiments}
+\label{fig:exps}
+\end{minipage}
+\hfill
+\begin{minipage}[b]{7.0cm}
+% Save current figure counter
+\newcounter{savectr}
+\setcounter{savectr}{\value{figure}}
+% Temporarily change the figure to a table.
+\renewcommand{\figurename}{\tablename}
+\setcounter{figure}{\value{table}}
+\scriptsize
+\renewcommand{\multirowsetup}{\centering}
+\newlength{\Lone}
+\settowidth{\Lone}{E4}
+\newlength{\Ltwo}
+\settowidth{\Ltwo}{\textbf{Query}}
+\newlength{\Lthree}
+\settowidth{\Lthree}{\textbf{Indices?}}
+\newlength{\Lfour}
+\settowidth{\Lfour}{\textbf{Expression}}
+\newlength{\Lnum}
+\settowidth{\Lnum}{99}
+\begin{tabular}{|c|c|c|c|c|} \thickhline
+\multirow{2}{\Ltwo}{\textbf{Query}}
+ & \multirow{2}{\Lthree}{\textbf{Indices?}}
+ & \multirow{2}{\Lfour}{\textbf{Expression}}
+ & \multicolumn{2}{c|}{\textbf{Rules matched}} \\ \cline{4-5}
+& & & trans\_rules & impl\_rules \\ \thickhline
+Q1 & No & \multirow{2}{\Lone}{E1} & \multirow{2}{\Lnum}{3}
+ & \multirow{2}{\Lnum}{3} \\ \cline{1-2}
+Q2 & Yes & & & \\ \hline
+Q3 & No & \multirow{2}{\Lone}{E2} & \multirow{2}{\Lnum}{8}
+ & \multirow{2}{\Lnum}{4} \\ \cline{1-2}
+Q4 & Yes & & & \\ \hline
+Q5 & No & \multirow{2}{\Lone}{E3} & \multirow{2}{\Lnum}{9}
+ & \multirow{2}{\Lnum}{5} \\ \cline{1-2}
+Q6 & Yes & & & \\ \hline
+Q7 & No & \multirow{2}{\Lone}{E4} & \multirow{2}{\Lnum}{16}
+ & \multirow{2}{\Lnum}{7} \\ \cline{1-2}
+Q8 & Yes & & & \\ \thickhline
+\end{tabular}
+\caption{Queries used in experiments}
+\label{tab:queries}
+% Change figure back as usual.
+\renewcommand{\figurename}{Figure}
+\setcounter{figure}{\value{savectr}}
+\end{minipage}
+\end{centeredfigure*}
+
+The acid test of Prairie was whether Prairie specifications could be
+translated into efficient optimizer implementations. Our experiments
+using the Open OODB consisted of optimizing 8 different queries using
+the two query optimizers generated, respectively, using Prairie and
+using Volcano directly (in the remainder of this section, we will use
+``Prairie'' and ``Volcano'' to denote these two approaches). There
+were 4 distinct expressions that were used to generate the queries used
+in the experiments; these are shown in Figure~\ref{fig:exps}. Each
+expression represents an $N$-way join query for varying $N$.
+
+The first expression E1 is a simple retrieval and join of base
+classes. The second, E2, is also a join of base classes; however,
+after each class retrieval, an attribute has to be materialized (\ie
+brought into view) before the join. The third and fourth expressions
+(E3 and E4) are the same as the first and second (E1 and E2)
+respectively, except that there is a selection of attributes (the
+select operator is the root of the expressions).\footnote{ The most
+complex expression E4 consists of all operators in the algebra, except
+PROJECT and UNNEST. PROJECT was not considered because it appeared in
+only one impl\_rule and no trans\_rules, and thus, would not affect the
+size of the search space of abstract expressions. UNNEST was not
+considered because it appeared in exactly one trans\_rule and one
+impl\_rule; including it in our queries would have increased the number
+of parameters that could affect our run-times. We preferred to
+concentrate on simple JOIN expressions.}
+
+The algebra that was used in the Prairie and Volcano optimizers for our
+experiments consisted of 5 relational operators SELECT, PROJECT, JOIN,
+RET and UNNEST (for set-valued attributes) and an object-oriented
+operator called MAT (for MATerialize; it is fundamentally a
+pointer-chasing operator for attributes of a class). There were 8
+algorithms.
+
+There are many parameters that can be varied when benchmarking a query
+optimizer. Since our objective was to verify that the Prairie approach
+did not sacrifice efficiency, our criteria for the queries was that
+they test a majority of the rules, with varying properties of the base
+classes. To this end, we tested our optimizer (and the Volcano
+optimizer) with 8 different queries (shown in Table~\ref{tab:queries}).
+The eight queries Q1 through Q8 are derived from the 4 expressions in
+Figure~\ref{fig:exps}. Each expression E1 through E4 is used to obtain
+two queries for a fixed number $N$ of JOINs in the expression. The
+only difference between the two queries obtained from an expression is
+that the first one does not contain any indices on any classes, whereas
+the second one contains a single index on each base class occurring in
+the expression. In expressions where a SELECT is present (E3 and E4),
+the selection predicate is a conjunction of equality predicates
+$\textit{bc}_i == \textit{const}_i$, where $\textit{bc}_i$ is an
+attribute of class $\textit{C}_i$, and $\textit{const}_i$ is a constant
+(we arbitrarily set this to $i$, because its value doesn't affect the
+correctness or performance of the optimizer). In addition, for queries
+with a SELECT and whose base classes have indices (Q6 and Q8 in
+Table~\ref{tab:queries}), the (single) index of each base class was
+chosen to be the attribute referenced in the selection predicate. For
+example, class $\textit{C}_i$ was chosen to have an index on attribute
+$\textit{bc}_i$. The join predicates for each JOIN were chosen at
+random, and were always equality predicates. The choice of JOIN
+predicates was such that the queries corresponded to linear query
+graphs. In the future, we will experiment with non-linear (\eg star)
+query graphs.
+
+Table~\ref{tab:queries} also shows the number of trans\_rules and
+impl\_rules that are matched by each expression. These are the rules
+whose left hand sides match a sub-expression. However, not all the
+rules were necessarily applicable. For instance, an impl\_rule with an
+index scan would not apply to Q3, although it might apply to Q4.
+
+Queries Q1 through Q8 were optimized for increasing number $N$ of
+JOINs. For a fixed number of JOINs in a query, we varied the
+cardinalities of the base classes 5 times, each time generating a query
+with different class properties, and averaged the run-times over the 5
+query instances to generate the per-query optimization time. Thus,
+each point in our graphs represents the average of 5 queries. The
+run-times were measured\footnote{Since the run-times were too small to
+be measured accurately with \texttt{time}, each query instance was
+optimized 3000 times (in a loop) and the total time was divided by 3000
+to get the per-query optimization time.} using the GNU \texttt{time}
+command. All experiments were performed on a lightly loaded DECstation
+5000/200 running Ultrix 4.2.
+
+The optimization times for each query for both approaches (Prairie and
+Volcano) are shown in Figures~\ref{fig:q1} through \ref{fig:q8}. The
+number of joins in each set of graphs was varied to a maximum of 8, or
+until virtual memory was exhausted.
+
+The first set of graphs (Figures~\ref{fig:q1} and \ref{fig:q2})
+shows the performance of a simple relational-type query. The
+optimization times are almost identical between Prairie and Volcano,
+and the notable point is that the presence of an index does not change
+the optimizer's behavior, \ie the two graphs are identical. This
+arises because the optimizer algebra had only two join algorithms
+(pointer join and hash join), neither of which makes use of any
+indices.
+
+The second set of graphs (Figures~\ref{fig:q3} and \ref{fig:q4}) shows
+the results of optimizing Q3 and Q4. Here, as in Figures~\ref{fig:q1}
+and \ref{fig:q2}, the presence (or absence) of indices makes no
+difference. Both the Prairie and Volcano approaches have comparable
+run-times. The sharp jump in the graphs from 7-way to 8-way joins is
+due to the fact that since all optimization is done in main memory,
+dynamic memory allocation (caused by \texttt{malloc} calls) results in
+a lot of thrashing at this point. We speculate that in systems with
+more virtual memory, the graphs will be smoother.
+
+The third and fourth sets of graphs in Figures~\ref{fig:q5} through
+\ref{fig:q8} are optimizations of queries with a selection predicate.
+In these cases, the presence of an index makes a difference if the
+index is referenced in the selection predicate (as we designed). Also,
+in these two figures, the performance of both Prairie and Volcano was
+almost identical, except that Prairie does slightly worse due to the
+larger number of \texttt{malloc} calls that the P2V translator
+introduces. Also, note that we could only go up to 3-way joins before
+virtual memory was exhausted. As the available memory decreases, there
+is increased thrashing (as shown by the sharp changes in slope in the
+plots) resulting in a much slower optimization process.
+
+\begin{centeredfigure}
+\myshadowbox
+{
+\setlength{\tabcolsep}{0pt}
+\begin{tabular}{ll}
+\subfigure[Query 1] { \begin{centeredinhalfminipage}
+ \vspace{3mm}
+ \epsfig{file=runtime_Q1.ps,width=3.0cm}
+ \end{centeredinhalfminipage}
+ \label{fig:q1} }
+&
+\subfigure[Query 2] { \begin{centeredinhalfminipage}
+ \vspace{3mm}
+ \epsfig{file=runtime_Q2.ps,width=3.0cm}
+ \end{centeredinhalfminipage}
+ \label{fig:q2} }
+\\ \hline
+\subfigure[Query 3] { \begin{centeredinhalfminipage}
+ \vspace{4mm}
+ \epsfig{file=runtime_Q3.ps,width=3.0cm}
+ \end{centeredinhalfminipage}
+ \label{fig:q3} }
+&
+\subfigure[Query 4] { \begin{centeredinhalfminipage}
+ \vspace{4mm}
+ \epsfig{file=runtime_Q4.ps,width=3.0cm}
+ \end{centeredinhalfminipage}
+ \label{fig:q4} }
+\\ \hline
+\subfigure[Query 5] { \begin{centeredinhalfminipage}
+ \vspace{4mm}
+ \epsfig{file=runtime_Q5.ps,width=3.0cm}
+ \end{centeredinhalfminipage}
+ \label{fig:q5} }
+&
+\subfigure[Query 6] { \begin{centeredinhalfminipage}
+ \vspace{4mm}
+ \epsfig{file=runtime_Q6.ps,width=3.0cm}
+ \end{centeredinhalfminipage}
+ \label{fig:q6} }
+\\ \hline
+\subfigure[Query 7] { \begin{centeredinhalfminipage}
+ \vspace{4mm}
+ \epsfig{file=runtime_Q7.ps,width=3.0cm}
+ \end{centeredinhalfminipage}
+ \label{fig:q7} }
+&
+\subfigure[Query 8] { \begin{centeredinhalfminipage}
+ \vspace{4mm}
+ \epsfig{file=runtime_Q8.ps,width=3.0cm}
+ \end{centeredinhalfminipage}
+ \label{fig:q8} }
+\end{tabular}
+}
+\caption{Query optimization times for Q1 through Q8}
+\label{fig:e4}
+\end{centeredfigure}
+
+In all four sets of plots, we can see that Prairie performs with almost
+(less than $5\%$ variation) the same efficiency as Volcano. In extreme
+cases, when memory is scarce, Prairie runs more slowly (about $15\%$)
+(\eg Figure~\ref{fig:q6}), but we believe that this situation already
+represents a serious bottleneck for both Volcano and Prairie.
+
+The results presented in this section show that Prairie optimizers
+need not sacrifice efficiency for clarity, even for large rule sets.
+More research and validation is necessary to verify that Prairie is
+an efficient tool for optimizer specification.
diff --git a/macros/latex/contrib/utthesis/ICDE-11/runtime_Q1.ps b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q1.ps
new file mode 100644
index 0000000000..3d1d8e2ff0
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q1.ps
@@ -0,0 +1,519 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%BoundingBox: 50 50 500 375
+%%Creator: ACE/gr (xmgr) v2.10
+%%Title: runtime.Q1.ps
+%%EndComments
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 611 m
+430 611 l
+420 846 m
+430 846 l
+420 1081 m
+430 1081 l
+420 1315 m
+430 1315 l
+420 1550 m
+430 1550 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 611 m
+2020 611 l
+2030 846 m
+2020 846 l
+2030 1081 m
+2020 1081 l
+2030 1315 m
+2020 1315 l
+2030 1550 m
+2020 1550 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 846 m
+440 846 l
+420 1315 m
+440 1315 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 846 m
+2010 846 l
+2030 1315 m
+2010 1315 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 846 m
+gsave
+348 846 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 1315 m
+gsave
+348 1315 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 418 m
+621 537 l
+822 661 l
+1023 789 l
+1225 909 l
+1426 1046 l
+1627 1183 l
+1828 1320 l
+2030 1449 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 537 30 0 360 arc
+gsave fill grestore
+stroke
+822 661 30 0 360 arc
+gsave fill grestore
+stroke
+1023 789 30 0 360 arc
+gsave fill grestore
+stroke
+1225 909 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1046 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1183 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1320 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1449 30 0 360 arc
+gsave fill grestore
+stroke
+420 421 m
+621 541 l
+822 670 l
+1023 801 l
+1225 935 l
+1426 1066 l
+1627 1229 l
+1828 1355 l
+2030 1504 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 451 m
+390 421 l
+420 391 l
+450 421 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 451 m
+390 421 l
+420 391 l
+450 421 l
+420 451 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 571 m
+591 541 l
+621 511 l
+651 541 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 571 m
+591 541 l
+621 511 l
+651 541 l
+621 571 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 700 m
+792 670 l
+822 640 l
+852 670 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 700 m
+792 670 l
+822 640 l
+852 670 l
+822 700 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 831 m
+993 801 l
+1023 771 l
+1053 801 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 831 m
+993 801 l
+1023 771 l
+1053 801 l
+1023 831 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 965 m
+1195 935 l
+1225 905 l
+1255 935 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 965 m
+1195 935 l
+1225 905 l
+1255 935 l
+1225 965 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 1096 m
+1396 1066 l
+1426 1036 l
+1456 1066 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 1096 m
+1396 1066 l
+1426 1036 l
+1456 1066 l
+1426 1096 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 1259 m
+1597 1229 l
+1627 1199 l
+1657 1229 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 1259 m
+1597 1229 l
+1627 1199 l
+1657 1229 l
+1627 1259 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+1828 1385 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+2030 1534 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%Trailer
diff --git a/macros/latex/contrib/utthesis/ICDE-11/runtime_Q2.ps b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q2.ps
new file mode 100644
index 0000000000..2ae8c69fd1
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q2.ps
@@ -0,0 +1,507 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%BoundingBox: 50 50 500 375
+%%Creator: ACE/gr (xmgr) v2.10
+%%Title: runtime.Q2.ps
+%%EndComments
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 611 m
+430 611 l
+420 846 m
+430 846 l
+420 1081 m
+430 1081 l
+420 1315 m
+430 1315 l
+420 1550 m
+430 1550 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 611 m
+2020 611 l
+2030 846 m
+2020 846 l
+2030 1081 m
+2020 1081 l
+2030 1315 m
+2020 1315 l
+2030 1550 m
+2020 1550 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 846 m
+440 846 l
+420 1315 m
+440 1315 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 846 m
+2010 846 l
+2030 1315 m
+2010 1315 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 846 m
+gsave
+348 846 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 1315 m
+gsave
+348 1315 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+420 418 m
+621 539 l
+822 664 l
+1023 783 l
+1225 906 l
+1426 1037 l
+1627 1176 l
+1828 1304 l
+2030 1451 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 539 30 0 360 arc
+gsave fill grestore
+stroke
+822 664 30 0 360 arc
+gsave fill grestore
+stroke
+1023 783 30 0 360 arc
+gsave fill grestore
+stroke
+1225 906 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1037 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1176 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1304 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1451 30 0 360 arc
+gsave fill grestore
+stroke
+420 412 m
+621 533 l
+822 661 l
+1023 796 l
+1225 926 l
+1426 1063 l
+1627 1212 l
+1828 1355 l
+2030 1504 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 442 m
+390 412 l
+420 382 l
+450 412 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 442 m
+390 412 l
+420 382 l
+450 412 l
+420 442 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 563 m
+591 533 l
+621 503 l
+651 533 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 563 m
+591 533 l
+621 503 l
+651 533 l
+621 563 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 691 m
+792 661 l
+822 631 l
+852 661 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 691 m
+792 661 l
+822 631 l
+852 661 l
+822 691 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 826 m
+993 796 l
+1023 766 l
+1053 796 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 826 m
+993 796 l
+1023 766 l
+1053 796 l
+1023 826 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 956 m
+1195 926 l
+1225 896 l
+1255 926 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 956 m
+1195 926 l
+1225 896 l
+1255 926 l
+1225 956 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 1093 m
+1396 1063 l
+1426 1033 l
+1456 1063 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 1093 m
+1396 1063 l
+1426 1033 l
+1456 1063 l
+1426 1093 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 1242 m
+1597 1212 l
+1627 1182 l
+1657 1212 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 1242 m
+1597 1212 l
+1627 1182 l
+1657 1212 l
+1627 1242 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+1828 1385 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+2030 1534 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%Trailer
diff --git a/macros/latex/contrib/utthesis/ICDE-11/runtime_Q3.ps b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q3.ps
new file mode 100644
index 0000000000..8ad7f6b23a
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q3.ps
@@ -0,0 +1,561 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%BoundingBox: 50 50 500 375
+%%Creator: ACE/gr (xmgr) v2.10
+%%Title: runtime.Q3.ps
+%%EndComments
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 401 m
+621 489 l
+822 578 l
+1023 672 l
+1225 762 l
+1426 865 l
+1627 969 l
+1828 1076 l
+2030 1574 l
+stroke
+420 401 30 0 360 arc
+gsave fill grestore
+stroke
+621 489 30 0 360 arc
+gsave fill grestore
+stroke
+822 578 30 0 360 arc
+gsave fill grestore
+stroke
+1023 672 30 0 360 arc
+gsave fill grestore
+stroke
+1225 762 30 0 360 arc
+gsave fill grestore
+stroke
+1426 865 30 0 360 arc
+gsave fill grestore
+stroke
+1627 969 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1076 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1574 30 0 360 arc
+gsave fill grestore
+stroke
+420 402 m
+621 485 l
+822 568 l
+1023 644 l
+1225 736 l
+1426 821 l
+1627 918 l
+1828 1019 l
+2030 1511 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 432 m
+390 402 l
+420 372 l
+450 402 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 432 m
+390 402 l
+420 372 l
+450 402 l
+420 432 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 515 m
+591 485 l
+621 455 l
+651 485 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 515 m
+591 485 l
+621 455 l
+651 485 l
+621 515 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 598 m
+792 568 l
+822 538 l
+852 568 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 598 m
+792 568 l
+822 538 l
+852 568 l
+822 598 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 674 m
+993 644 l
+1023 614 l
+1053 644 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 674 m
+993 644 l
+1023 614 l
+1053 644 l
+1023 674 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 766 m
+1195 736 l
+1225 706 l
+1255 736 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 766 m
+1195 736 l
+1225 706 l
+1255 736 l
+1225 766 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 851 m
+1396 821 l
+1426 791 l
+1456 821 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 851 m
+1396 821 l
+1426 791 l
+1456 821 l
+1426 851 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 948 m
+1597 918 l
+1627 888 l
+1657 918 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 948 m
+1597 918 l
+1627 888 l
+1657 918 l
+1627 948 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1049 m
+1798 1019 l
+1828 989 l
+1858 1019 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1049 m
+1798 1019 l
+1828 989 l
+1858 1019 l
+1828 1049 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1541 m
+2000 1511 l
+2030 1481 l
+2060 1511 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1541 m
+2000 1511 l
+2030 1481 l
+2060 1511 l
+2030 1541 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%Trailer
diff --git a/macros/latex/contrib/utthesis/ICDE-11/runtime_Q4.ps b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q4.ps
new file mode 100644
index 0000000000..cab28dc420
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q4.ps
@@ -0,0 +1,549 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%BoundingBox: 50 50 500 375
+%%Creator: ACE/gr (xmgr) v2.10
+%%Title: runtime.Q4.ps
+%%EndComments
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+420 400 m
+621 492 l
+822 575 l
+1023 669 l
+1225 759 l
+1426 866 l
+1627 962 l
+1828 1069 l
+2030 1578 l
+stroke
+420 400 30 0 360 arc
+gsave fill grestore
+stroke
+621 492 30 0 360 arc
+gsave fill grestore
+stroke
+822 575 30 0 360 arc
+gsave fill grestore
+stroke
+1023 669 30 0 360 arc
+gsave fill grestore
+stroke
+1225 759 30 0 360 arc
+gsave fill grestore
+stroke
+1426 866 30 0 360 arc
+gsave fill grestore
+stroke
+1627 962 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1069 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1578 30 0 360 arc
+gsave fill grestore
+stroke
+420 400 m
+621 484 l
+822 567 l
+1023 645 l
+1225 735 l
+1426 823 l
+1627 915 l
+1828 1024 l
+2030 1517 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+420 430 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 514 m
+591 484 l
+621 454 l
+651 484 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 514 m
+591 484 l
+621 454 l
+651 484 l
+621 514 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 597 m
+792 567 l
+822 537 l
+852 567 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 597 m
+792 567 l
+822 537 l
+852 567 l
+822 597 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 675 m
+993 645 l
+1023 615 l
+1053 645 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 675 m
+993 645 l
+1023 615 l
+1053 645 l
+1023 675 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 765 m
+1195 735 l
+1225 705 l
+1255 735 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 765 m
+1195 735 l
+1225 705 l
+1255 735 l
+1225 765 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 853 m
+1396 823 l
+1426 793 l
+1456 823 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 853 m
+1396 823 l
+1426 793 l
+1456 823 l
+1426 853 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 945 m
+1597 915 l
+1627 885 l
+1657 915 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 945 m
+1597 915 l
+1627 885 l
+1657 915 l
+1627 945 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1054 m
+1798 1024 l
+1828 994 l
+1858 1024 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1054 m
+1798 1024 l
+1828 994 l
+1858 1024 l
+1828 1054 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1547 m
+2000 1517 l
+2030 1487 l
+2060 1517 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1547 m
+2000 1517 l
+2030 1487 l
+2060 1517 l
+2030 1547 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%Trailer
diff --git a/macros/latex/contrib/utthesis/ICDE-11/runtime_Q5.ps b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q5.ps
new file mode 100644
index 0000000000..93af8edb1f
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q5.ps
@@ -0,0 +1,375 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%BoundingBox: 50 50 500 375
+%%Creator: ACE/gr (xmgr) v2.10
+%%Title: runtime.Q5.ps
+%%EndComments
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 552 m
+430 552 l
+420 728 m
+430 728 l
+420 904 m
+430 904 l
+420 1081 m
+430 1081 l
+420 1257 m
+430 1257 l
+420 1433 m
+430 1433 l
+420 1609 m
+430 1609 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 552 m
+2020 552 l
+2030 728 m
+2020 728 l
+2030 904 m
+2020 904 l
+2030 1081 m
+2020 1081 l
+2030 1257 m
+2020 1257 l
+2030 1433 m
+2020 1433 l
+2030 1609 m
+2020 1609 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 728 m
+440 728 l
+420 1081 m
+440 1081 l
+420 1433 m
+440 1433 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 728 m
+2010 728 l
+2030 1081 m
+2010 1081 l
+2030 1433 m
+2010 1433 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 728 m
+gsave
+348 728 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1081 m
+gsave
+348 1081 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1433 m
+gsave
+348 1433 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 424 m
+956 511 l
+1493 671 l
+2030 1778 l
+stroke
+420 424 30 0 360 arc
+gsave fill grestore
+stroke
+956 511 30 0 360 arc
+gsave fill grestore
+stroke
+1493 671 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1778 30 0 360 arc
+gsave fill grestore
+stroke
+420 426 m
+956 522 l
+1493 688 l
+2030 1737 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 456 m
+390 426 l
+420 396 l
+450 426 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 456 m
+390 426 l
+420 396 l
+450 426 l
+420 456 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 552 m
+926 522 l
+956 492 l
+986 522 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 552 m
+926 522 l
+956 492 l
+986 522 l
+956 552 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 718 m
+1463 688 l
+1493 658 l
+1523 688 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 718 m
+1463 688 l
+1493 658 l
+1523 688 l
+1493 718 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1767 m
+2000 1737 l
+2030 1707 l
+2060 1737 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1767 m
+2000 1737 l
+2030 1707 l
+2060 1737 l
+2030 1767 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%Trailer
diff --git a/macros/latex/contrib/utthesis/ICDE-11/runtime_Q6.ps b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q6.ps
new file mode 100644
index 0000000000..b504816dfd
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q6.ps
@@ -0,0 +1,401 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%BoundingBox: 50 50 500 375
+%%Creator: ACE/gr (xmgr) v2.10
+%%Title: runtime.Q6.ps
+%%EndComments
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 386 l
+956 376 m
+956 386 l
+1493 376 m
+1493 386 l
+2030 376 m
+2030 386 l
+420 1785 m
+420 1775 l
+956 1785 m
+956 1775 l
+1493 1785 m
+1493 1775 l
+2030 1785 m
+2030 1775 l
+stroke
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+420 415 m
+956 490 l
+1493 633 l
+2030 1651 l
+stroke
+420 415 30 0 360 arc
+gsave fill grestore
+stroke
+956 490 30 0 360 arc
+gsave fill grestore
+stroke
+1493 633 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1651 30 0 360 arc
+gsave fill grestore
+stroke
+420 416 m
+956 493 l
+1493 631 l
+2030 1462 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 446 m
+390 416 l
+420 386 l
+450 416 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 446 m
+390 416 l
+420 386 l
+450 416 l
+420 446 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 523 m
+926 493 l
+956 463 l
+986 493 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 523 m
+926 493 l
+956 463 l
+986 493 l
+956 523 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 661 m
+1463 631 l
+1493 601 l
+1523 631 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 661 m
+1463 631 l
+1493 601 l
+1523 631 l
+1493 661 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1492 m
+2000 1462 l
+2030 1432 l
+2060 1462 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1492 m
+2000 1462 l
+2030 1432 l
+2060 1462 l
+2030 1492 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%Trailer
diff --git a/macros/latex/contrib/utthesis/ICDE-11/runtime_Q7.ps b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q7.ps
new file mode 100644
index 0000000000..a5cda8ee82
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q7.ps
@@ -0,0 +1,396 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%BoundingBox: 50 50 500 375
+%%Creator: ACE/gr (xmgr) v2.10
+%%Title: runtime.Q7.ps
+%%EndComments
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-83 1080 m
+gsave
+-83 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 425 m
+956 510 l
+1493 670 l
+2030 1637 l
+stroke
+420 425 30 0 360 arc
+gsave fill grestore
+stroke
+956 510 30 0 360 arc
+gsave fill grestore
+stroke
+1493 670 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1637 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 501 l
+1493 648 l
+2030 1470 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+420 450 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+956 531 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 678 m
+1463 648 l
+1493 618 l
+1523 648 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 678 m
+1463 648 l
+1493 618 l
+1523 648 l
+1493 678 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1500 m
+2000 1470 l
+2030 1440 l
+2060 1470 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1500 m
+2000 1470 l
+2030 1440 l
+2060 1470 l
+2030 1500 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%Trailer
diff --git a/macros/latex/contrib/utthesis/ICDE-11/runtime_Q8.ps b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q8.ps
new file mode 100644
index 0000000000..f3054db88b
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/runtime_Q8.ps
@@ -0,0 +1,384 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%BoundingBox: 50 50 500 375
+%%Creator: ACE/gr (xmgr) v2.10
+%%Title: runtime.Q8.ps
+%%EndComments
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+420 421 m
+956 504 l
+1493 650 l
+2030 1549 l
+stroke
+420 421 30 0 360 arc
+gsave fill grestore
+stroke
+956 504 30 0 360 arc
+gsave fill grestore
+stroke
+1493 650 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1549 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 502 l
+1493 647 l
+2030 1475 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+420 450 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 532 m
+926 502 l
+956 472 l
+986 502 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 532 m
+926 502 l
+956 472 l
+986 502 l
+956 532 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 677 m
+1463 647 l
+1493 617 l
+1523 647 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 677 m
+1463 647 l
+1493 617 l
+1523 647 l
+1493 677 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1505 m
+2000 1475 l
+2030 1445 l
+2060 1475 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1505 m
+2000 1475 l
+2030 1445 l
+2060 1475 l
+2030 1505 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%Trailer
diff --git a/macros/latex/contrib/utthesis/ICDE-11/stretch.sty b/macros/latex/contrib/utthesis/ICDE-11/stretch.sty
new file mode 100644
index 0000000000..202eec903d
--- /dev/null
+++ b/macros/latex/contrib/utthesis/ICDE-11/stretch.sty
@@ -0,0 +1,10 @@
+% Package to implement looser stretch and shrink between words;
+% the new PostScript metrics in PSNFSS implements very tight
+% setting, resulting in a lot of hyphenation and overfull boxes.
+
+\tolerance800
+\emergencystretch2em
+\doublehyphendemerits5000
+\hfuzz0pt
+\leftskip0pt minus 1pt
+\rightskip0pt minus 1pt
diff --git a/macros/latex/contrib/utthesis/dissertation/diss.ps b/macros/latex/contrib/utthesis/dissertation/diss.ps
new file mode 100644
index 0000000000..e037f128f5
--- /dev/null
+++ b/macros/latex/contrib/utthesis/dissertation/diss.ps
@@ -0,0 +1,20653 @@
+%!PS-Adobe-2.0
+%%Creator: dvips 5.55 Copyright 1986, 1994 Radical Eye Software
+%%Title: diss.dvi
+%%CreationDate: Fri Apr 21 20:10:46 1995
+%%Pages: 131
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: Times-Roman Times-Bold Times-Italic Courier
+%%EndComments
+%DVIPSCommandLine: dvips -D 600 diss -o
+%DVIPSParameters: dpi=600, comments removed
+%DVIPSSource: TeX output 1995.04.21:2008
+%%BeginProcSet: tex.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]}
+if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage
+userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
+B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
+4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
+p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pstricks.pro
+% PostScript prologue for pstricks.tex.
+% Created 1993/3/12. Source file was pstricks.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@Dict 200 dict def tx@Dict begin
+/ADict 25 dict def
+/CM { matrix currentmatrix } bind def
+/SLW /setlinewidth load def
+/CLW /currentlinewidth load def
+/CP /currentpoint load def
+/ED { exch def } bind def
+/L /lineto load def
+/T /translate load def
+/Atan { /atan load stopped { pop pop 0 } if } def
+/Div { dup 0 eq { pop } { div } ifelse } def
+/NET { neg exch neg exch T } def
+/Pyth { dup mul exch dup mul add sqrt } def
+/PtoC { 2 copy cos mul 3 1 roll sin mul } def
+/PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def }
+def
+/PathLength { flattenpath /z 0 def { /y1 ED /x1 ED /y2 y1 def /x2 x1 def
+} { /y ED /x ED PathLength@ } {} { /y y2 def /x x2 def PathLength@ }
+pathforall z } def
+/STP { .996264 dup scale } def
+/STV { SDict begin normalscale end STP } def
+/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def
+PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y
+mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul
+/y ED x mul /x ED x 0 eq y 0 eq and { /x 1 def /y 1 def } if [ y x ] 1 a
+sub y mul setdash stroke } def
+/DotLine { /b PathLength def /a ED /z ED /y CLW def /z y z add def a 0 gt
+{ /b b a div def } { a 0 eq { /b b y sub def } { a -3 eq { /b b y add
+def } if } ifelse } ifelse [ 0 b b z Div round Div dup 0 le { pop 1 } if
+] a 0 gt { 0 } { y 2 div a -2 gt { neg } if } ifelse setdash 1
+setlinecap stroke } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap n { currentstrokeadjust == x1 y1 moveto x2 y1 L
+stroke /y1 y1 a add def } repeat grestore } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap systemdict /currentstrokeadjust known {
+currentstrokeadjust } { false } ifelse { /t { } def } { /t { transform
+0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }
+bind def } ifelse n { x1 y1 t moveto x2 y1 t L stroke /y1 y1 a add def }
+repeat grestore } def
+/BeginArrow { ADict begin /@mtrx CM def gsave 2 copy T 2 index sub neg
+exch 3 index sub exch Atan rotate newpath } def
+/EndArrow { @mtrx setmatrix CP grestore end } def
+/Arrow { CLW mul add dup 2 div /w ED mul dup /h ED mul /a ED { 0 h T 1 -1
+scale } if w neg h moveto 0 0 L w h L w neg a neg rlineto gsave fill
+grestore } def
+/Tbar { CLW mul add /z ED z -2 div CLW 2 div moveto z 0 rlineto stroke 0
+CLW moveto } def
+/Bracket { CLW mul add dup CLW sub 2 div /x ED mul CLW add /y ED /z CLW 2
+div def x neg y moveto x neg CLW 2 div L x CLW 2 div L x y L stroke 0
+CLW moveto } def
+/RoundBracket { CLW mul add dup 2 div /x ED mul /y ED /mtrx CM def 0 CLW
+2 div T x y mul 0 ne { x y scale } if 1 1 moveto .85 .5 .35 0 0 0
+curveto -.35 0 -.85 .5 -1 1 curveto mtrx setmatrix stroke 0 CLW moveto }
+def
+/Shadow { [ { /moveto load } { /lineto load } { /curveto load } {
+/closepath load } pathforall ] cvx newpath 3 1 roll T exec } def
+/SD { 0 360 arc fill } def
+/SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def
+/ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def
+/SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore }
+def
+/NArray { aload length 2 div dup dup cvi eq not { exch pop } if /n exch
+cvi def } def
+/NArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop } if
+f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def
+/Line { NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub
+def n { Lineto } repeat CP 4 2 roll ArrowB L pop pop } if } def
+/Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 }
+ifelse { pop } repeat a } def
+/CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq
+and { pop pop /n n 1 sub def } if } def
+/Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop }
+repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1
+ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1
+moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto
+Lineto pop pop closepath } ifelse } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1
+def CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp
+mul dy1 l0 c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos
+abs b exp a mul dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def
+/y2 y l0 dy mul m mul sub def /dx l1 dx mul m mul neg def /dy l1 dy mul
+m mul neg def } def
+/IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if }
+ifelse /a a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def }
+def
+/BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def
+/NC { CC x1 y1 x2 y2 x y curveto } def
+/EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def
+/BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def
+/NAC { x2 y2 x y curveto CC x1 y1 } def
+/EAC { x2 y2 x y ArrowB curveto pop pop } def
+/OpenCurve { NArray n 3 lt { n { pop pop } repeat } { BOC /n n 3 sub def
+n { NC } repeat EOC } ifelse } def
+/AltCurve { { false NArray n 2 mul 2 roll [ n 2 mul 3 sub 1 roll ] aload
+/Points ED n 2 mul -2 roll } { false NArray } ifelse n 4 lt { n { pop
+pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse } def
+/ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt {
+CheckClosed } if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC }
+repeat closepath pop pop } ifelse } def
+/EndDot { { /z DS def } { /z 0 def } ifelse /b ED 0 z DS SD b { 0 z DS
+CLW sub SD } if 0 DS z add CLW 4 div sub moveto } def
+/Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto
+x1 y1 lineto closepath } def
+/OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1
+y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div
+exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse
+/b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto
+x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath }
+ifelse } def
+/Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add
+/y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq {
+pop pop Rect } { OvalFrame } ifelse } def
+/Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1
+sub 3 div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA
+x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0
+y0 x0 2 mul x1 sub y1 ] def } def
+/Grid { /a 4 string def /b ED /d ED /n ED cvi dup 1 lt { pop 1 } if /c ED
+c div dup 0 eq { pop 1 } if /cy ED c div dup 0 eq { pop 1 } if /cx ED cy
+div cvi /y ED cx div cvi /x ED cy div cvi /y2 ED cx div cvi /x2 ED cy
+div cvi /y1 ED cx div cvi /x1 ED /h y2 y1 sub 0 gt { 1 } { -1 } ifelse
+def /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def b 0 gt { /z1 b 4 div CLW 2
+div add def /Helvetica findfont b scalefont setfont /b b .95 mul CLW 2
+div add def } if gsave n 0 gt { 1 setlinecap [ 0 cy n div ] 0 setdash }
+{ 2 setlinecap } ifelse /c x1 def /i 500 w mul x1 add def /e y cy mul
+def /f y1 cy mul def /g y2 cy mul def x1 cx mul 0 T { newpath 0 e moveto
+b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1} {z1 z2
+add neg} ifelse h 0 gt {b neg} {z1} ifelse rmoveto show grestore } if 0
+f moveto 0 g L stroke cx w mul 0 T c x2 eq c i eq or {exit} if /c c w
+add def } loop grestore gsave n 0 gt { 1 setlinecap [ 0 cx n div ] 0
+setdash } { 2 setlinecap } ifelse /c y1 def /i 500 h mul y1 add def /e x
+cx mul def /f x1 cx mul def /g x2 cx mul def 0 y1 cy mul T { newpath e 0
+moveto b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1 z2
+add neg} {z1} ifelse h 0 gt {z1} {b neg} ifelse rmoveto show grestore }
+if f 0 moveto g 0 L stroke 0 cy h mul T c y2 eq c i eq or {exit} if /c c
+h add def } loop grestore } def
+/ArcArrow { /d ED /b ED /a ED gsave newpath 0 -1000 moveto clip newpath 0
+1 0 0 b grestore c mul /e ED pop pop pop r a e d PtoC y add exch x add
+exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c
+mul neg d } def
+/Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def
+/Rot { CP CP translate 3 -1 roll neg rotate NET } def
+/PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def
+/PutBegin { /lmtrx [ tx@Dict /lmtrx known { lmtrx aload pop } if CM ] def
+CP 4 2 roll T moveto } def
+/PutEnd { CP /lmtrx [ lmtrx aload pop setmatrix ] def moveto } def
+/Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s
+abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b
+div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } {
+h1 abs h sub dup s mul abs } ifelse } def
+/UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s
+mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q
+{ x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add
+exch } def
+/BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { CP OLUnit T
+moveto /IfVisible true def } if } { IfVisible { CP OLUnit NET moveto
+/IfVisible false def } if } ifelse } def
+/InitOL { /OLUnit [ gsave CM STV 2890.79999 dup moveto setmatrix CP
+grestore ] cvx def /BOL { BeginOL } def /IfVisible true def } def
+end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pst-coil.pro
+% PostScript prologue for pst-coil.tex.
+% Created 1993/3/12. Source file was pst-coil.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@CoilDict 40 dict def tx@CoilDict begin
+/CoilLoop { /t ED t sin AspectSin mul t 180 div AspectCos mul add t cos
+lineto } def
+/Coil { /Inc ED dup sin /AspectSin ED cos /AspectCos ED /ArmB ED /ArmA ED
+/h ED /w ED /y1 ED /x1 ED /y0 ED /x0 ED x0 y0 translate y1 y0 sub x1 x0
+sub 2 copy Pyth /TotalLength ED Atan rotate /BeginAngle ArmA AspectCos
+Div w h mul Div 360 mul def /EndAngle TotalLength ArmB sub AspectCos Div
+w h mul Div 360 mul def 1 0 0 0 ArrowA ArmA 0 lineto /mtrx CM def w h
+mul 2 Div w 2 Div scale BeginAngle Inc EndAngle { CoilLoop } for
+EndAngle CoilLoop mtrx setmatrix TotalLength ArmB sub 0 lineto CP
+TotalLength 0 ArrowB lineto } def
+/AltCoil { /Inc ED dup sin /AspectSin ED cos /AspectCos ED /h ED /w ED
+/EndAngle ED /BeginAngle ED /mtrx CM def w h mul 2 Div w 2 Div scale
+BeginAngle sin AspectSin mul BeginAngle 180 div AspectCos mul add
+BeginAngle cos /lineto load stopped { moveto } if BeginAngle Inc
+EndAngle { CoilLoop } for EndAngle CoilLoop mtrx setmatrix } def
+/ZigZag { /ArmB ED /ArmA ED 2 div /w ED w mul /h ED /y1 ED /x1 ED /y0 ED
+/x0 ED x1 y1 translate y0 y1 sub x0 x1 sub 2 copy Pyth /TotalLength ED
+Atan rotate TotalLength ArmA sub ArmB sub dup h div cvi /n ED n h mul
+sub 2 div dup ArmA add /ArmA ED ArmB add /ArmB ED /x ArmB h 2 div add
+def mark 0 0 ArmB 0 n { x w /w w neg def /x x h add def } repeat
+TotalLength ArmA sub 0 TotalLength 0 } def
+end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pst-node.pro
+% PostScript prologue for pst-node.tex.
+% Created 1993/3/12. Source file was pst-node.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@NodeDict 200 dict def tx@NodeDict begin
+/NewNode { gsave /next ED dict dup 3 -1 roll ED begin tx@Dict begin STV
+CP T exec end /NodeMtrx CM def next end grestore } def
+/InitPnode { /Y ED /X ED /NodePos { Nodesep Cos mul Nodesep Sin mul } def
+} def
+/InitCnode { /r ED /Y ED /X ED /NodePos { Nodesep r add dup Cos mul exch
+Sin mul } def } def
+/GetRnodePos { Cos 0 gt { /dx r Nodesep add def } { /dx l Nodesep sub def
+} ifelse Sin 0 gt { /dy u Nodesep add def } { /dy d Nodesep sub def }
+ifelse dx Sin mul abs dy Cos mul abs gt { dy Cos mul Sin div dy } { dx
+dup Sin mul Cos Div } ifelse } def
+/InitRnode { /r ED r mul neg /l ED /r r l add def /X l neg def { neg /d
+ED /u ED /Y 0 def } { neg /Y ED Y sub /u ED u mul neg /d ED /u u d add
+def /Y Y d sub def } ifelse /NodePos { GetRnodePos } def } def
+/InitRNode { /Y ED /X ED /r ED /X r 2 div X add def /r r X sub def /l X
+neg def Y add neg /d ED Y sub /u ED /NodePos { GetRnodePos } def } def
+/GetOnodePos { /ww w Nodesep add def /hh h Nodesep add def Sin ww mul Cos
+hh mul Atan dup cos ww mul exch sin hh mul } def
+/GetCenter { begin X Y NodeMtrx transform CM itransform end } def
+/GetAngle { nodeA GetCenter nodeB GetCenter 3 -1 roll sub 3 1 roll sub
+neg Atan } def
+/GetEdge { begin /Nodesep ED dup 1 0 NodeMtrx dtransform CM idtransform
+exch atan sub dup sin /Sin ED cos /Cos ED NodePos Y add exch X add exch
+NodeMtrx transform CM itransform end 4 2 roll 1 index 0 eq { pop pop } {
+2 copy 5 2 roll cos mul add 4 1 roll sin mul sub exch } ifelse } def
+/GetPos { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED OffsetB
+AngleB NodesepB nodeB GetEdge /y2 ED /x2 ED } def
+/InitNC { /nodeB ED /nodeA ED /NodesepB ED /NodesepA ED /OffsetB ED
+/OffsetA ED tx@NodeDict nodeA known tx@NodeDict nodeB known and dup {
+/nodeA nodeA load def /nodeB nodeB load def } if } def
+/LineMP { 4 copy 1 t sub mul exch t mul add 3 1 roll 1 t sub mul exch t
+mul add exch 6 2 roll sub 3 1 roll sub Atan } def
+/NCCoor { GetAngle /AngleA ED /AngleB AngleA 180 add def GetPos /LPutVar
+[ x2 x1 y2 y1 ] cvx def /LPutPos { LPutVar LineMP } def x1 y1 x2 y2 }
+def
+/NCLine { NCCoor tx@Dict begin ArrowB 4 2 roll ArrowA lineto end } def
+/BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED
+/t ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3
+mul cx sub def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx
+sub def /ay y3 y0 sub cy sub by sub def ax t 3 exp mul bx t t mul mul
+add cx t mul add x0 add ay t 3 exp mul by t t mul mul add cy t mul add
+y0 add 3 ay t t mul mul mul 2 by t mul mul add cy add 3 ax t t mul mul
+mul 2 bx t mul mul add cx add atan } def
+/GetArms { /x1a armA AngleA cos mul x1 add def /y1a armA AngleA sin mul
+y1 add def /x2a armB AngleB cos mul x2 add def /y2a armB AngleB sin mul
+y2 add def } def
+/NCCurve { GetPos x1 x2 sub y1 y2 sub Pyth 2 div dup 3 -1 roll mul /armA
+ED mul /armB ED GetArms x1a y1a x1 y1 tx@Dict begin ArrowA end x2a y2a
+x2 y2 tx@Dict begin ArrowB end curveto /LPutVar [ x1 y1 x1a y1a x2a y2a
+x2 y2 ] cvx def /LPutPos { t LPutVar BezierMidpoint } def } def
+/AnglesMP { LPutVar t 3 gt { /t t 3 sub def } { t 2 gt { /t t 2 sub def
+10 -2 roll } { t 1 gt { /t t 1 sub def 10 -4 roll } { 10 4 roll } ifelse
+} ifelse } ifelse 6 { pop } repeat 3 -1 roll exch LineMP } def
+/NCAngles { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform exch pop mtrx itransform /y0 ED /x0
+ED mark armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1a y1a armA 0 ne { x1 y1 }
+if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a y2a x0 y0 x1a y1a
+x1 y1 ] cvx def /LPutPos { AnglesMP } def } def
+/NCAngle { GetPos /x2a armB AngleB cos mul x2 add def /y2a armB AngleB
+sin mul y2 add def /mtrx AngleA matrix rotate def x2a y2a mtrx transform
+pop x1 y1 mtrx transform exch pop mtrx itransform /y0 ED /x0 ED mark
+armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1 y1 tx@Dict begin false Line end
+/LPutVar [ x2 y2 x2 y2 x2a y2a x0 y0 x1 y1 ] cvx def /LPutPos { AnglesMP
+} def } def
+/NCBar { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform pop sub dup 0 mtrx itransform 3 -1
+roll 0 gt { /y2a exch y2a add def /x2a exch x2a add def } { /y1a exch
+neg y1a add def /x2a exch neg x2a add def } ifelse mark x2 y2 x2a y2a
+x1a y1a x1 y1 tx@Dict begin false Line end /LPutVar [ x2 y2 x2 y2 x2a
+y2a x1a y1a x1 y1 ] cvx def /LPutPos { LPutVar AnglesMP } def } def
+/NCDiag { GetPos GetArms mark x2 y2 x2a y2a x1a y1a x1 y1 tx@Dict begin
+false Line end /LPutVar [ x2 y2 x2 y2 x2a y2a x1a y1a x1 y1 ] cvx def
+/LPutPos { AnglesMP } def } def
+/NCDiagg { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED /x1a armA
+AngleA cos mul x1 add def /y1a armA AngleA sin mul y1 add def nodeB
+GetCenter y1a sub exch x1a sub Atan 180 add /AngleB ED OffsetB AngleB
+NodesepB nodeB GetEdge /y2 ED /x2 ED mark x2 y2 x1a y1a x1 y1 tx@Dict
+begin false Line end /LPutVar [ x2 y2 x2 y2 x2 y2 x1a y1a x1 y1] cvx def
+/LPutPos { AnglesMP } def } def
+/LoopMP { /t t abs def [ LPutVar ] length 2 div 1 sub dup t lt { /t ED }
+{ pop } ifelse mark LPutVar t cvi { /t t 1 sub def pop pop } repeat
+counttomark 1 add 4 roll cleartomark 3 -1 roll exch LineMP } def
+/NCLoop { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform loopsize add /y1b ED /x1b ED /x2b x2a y2a mtrx transform pop
+def x2b y1b mtrx itransform /y2b ED /x2b ED x1b y1b mtrx itransform /y1b
+ED /x1b ED mark armB 0 ne { x2 y2 } if x2a y2a x2b y2b x1b y1b x1a y1a
+armA 0 ne { x1 y1 } if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a
+y2a x2b y2b x1b y1b x1a y1a x1 y1 ] cvx def /LPutPos { LoopMP } def }
+def
+/NCCircle { nodeA GetCenter 0 0 NodesepA nodeA GetEdge pop 3 1 roll /Y ED
+/X ED X sub 2 div dup 2 exp r r mul sub abs sqrt atan 2 mul /a ED r
+AngleA 90 add PtoC Y add exch X add exch 2 copy /LPutVar [ 4 2 roll r a
+] def /LPutPos { LPutVar aload pop t 360 mul add dup 5 1 roll 90 sub
+PtoC 3 -1 roll add 3 1 roll add exch 3 -1 roll } def r AngleA 90 sub a
+add AngleA 270 add a sub tx@Dict begin /angleB ED /angleA ED /r ED /c
+57.2957 r Div def /y ED /x ED } def
+/LPutCoor { tx@NodeDict /LPutPos known { gsave LPutPos tx@Dict begin
+/langle ED CM 3 1 roll STV CP 3 -1 roll sub neg 3 1 roll sub exch moveto
+setmatrix CP end grestore } { 0 0 tx@Dict /langle 0 def end } ifelse }
+def
+end
+%%EndProcSet
+%%BeginProcSet: texps.pro
+TeXDict begin /rf{findfont dup length 1 add dict begin{1 index /FID ne 2
+index /UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics
+exch def dict begin Encoding{exch dup type /integertype ne{pop pop 1 sub
+dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}
+ifelse}forall Metrics /Metrics currentdict end def[2 index currentdict
+end definefont 3 -1 roll makefont /setfont load]cvx def}def
+/ObliqueSlant{dup sin S cos div neg}B /SlantFont{4 index mul add}def
+/ExtendFont{3 -1 roll mul exch}def /ReEncodeFont{/Encoding exch def}def
+end
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale false def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+%%EndProcSet
+TeXDict begin @defspecial
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+@fedspecial end TeXDict begin
+40258431 52099146 1000 600 600
+(/v/ahhnold/v3/ddas/research/dissertation/diss.dvi) @start
+/Fa 6 56 df<03FE000FFFC03FFFF07E07F8F803FCFC01FCFC00FEFC00FEFC007E7800FE
+0000FE0000FE0001FC0001F80003F00007E0000F80003E00007C0000F00E01E00E07801C
+0FFFFC1FFFFC7FFFFCFFFFFCFFFFF8FFFFF8171C7C9B1F>50 D<00FF800003FFE0000FFF
+F8001F01FC003E00FE003F007E003F007E003F007E003F00FE000C00FC000001FC000003
+F00000FFC00000FFF0000001FC000000FE0000007F0000003F8000003F8030003F80FC00
+3F80FC003F80FC003F80FC007F00F800FF007E01FE003FFFF8000FFFF00001FF8000191D
+7D9B1F>I<0003F0000003F0000007F000000FF000001DF0000039F0000039F0000071F0
+0000E1F00001C1F0000381F0000701F0000701F0000E01F0001C01F0003801F0007001F0
+00F001F000FFFFFF80FFFFFF80FFFFFF800003F0000003F0000003F0000003F00000FFFF
+8000FFFF8000FFFF80191C7D9B1F>I<3800783FFFF83FFFF03FFFE03FFF803FFE003FF0
+003C00003C00003C00003CFF003FFFC03F03F03E01F83C00FC38007C00007E00007E0000
+7E78007EFC007EFC007EFC00FCF800FC7801F87E03F03FFFE00FFF8003FE00171D7C9B1F
+>I<001FE00000FFF80003FFFC0007F03E000FC07E001F807E003F007E003E007E007E00
+3C007E000000FC3F8000FCFFF000FDC0FC00FF807E00FF003F00FE001F00FE001F80FC00
+1F80FC001F80FC001F807C001F807E001F807E001F803E003F003F003F001F80FE000FFF
+F80003FFF000007F8000191D7D9B1F>I<380000003FFFFF803FFFFF807FFFFF807FFFFF
+007FFFFE007FFFFC007000F800E001F000E003E0000007C000000F8000001F0000001F00
+00003E0000007E0000007C0000007C000000FC000000FC000000F8000001F8000001F800
+0001F8000001F8000001F8000001F8000001F8000000F00000191D7C9B1F>I
+E /Fb 5 89 df<0000300000700000E00001C00003C0000780000F00000F00001E00003C
+00003C0000780000F80000F00001F00001E00003E00003E00007C00007C00007C0000F80
+000F80000F80001F80001F00001F00003F00003F00003F00003E00003E00007E00007E00
+007E00007E00007E00007E00007C0000FC0000FC0000FC0000FC0000FC0000FC0000FC00
+00FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00
+00FC00007C00007E00007E00007E00007E00007E00007E00003E00003E00003F00003F00
+003F00001F00001F00001F80000F80000F80000F800007C00007C00007C00003E00003E0
+0001E00001F00000F00000F800007800003C00003C00001E00000F00000F000007800003
+C00001C00000E00000700000301462738226>0 D<C00000E000007000003800003C0000
+1E00000F00000F000007800003C00003C00001E00001F00000F00000F800007800007C00
+007C00003E00003E00003E00001F00001F00001F00001F80000F80000F80000FC0000FC0
+000FC00007C00007C00007E00007E00007E00007E00007E00007E00003E00003F00003F0
+0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0
+0003F00003F00003F00003F00003F00003F00003E00007E00007E00007E00007E00007E0
+0007E00007C00007C0000FC0000FC0000FC0000F80000F80001F80001F00001F00001F00
+003E00003E00003E00007C00007C0000780000F80000F00001F00001E00003C00003C000
+0780000F00000F00001E00003C0000380000700000E00000C0000014627C8226>I<0000
+000001E00000000003E00000000007C0000000000F80000000001F80000000001F000000
+00003E00000000007C0000000000F80000000001F80000000001F00000000003E0000000
+0007E0000000000FC0000000000F80000000001F80000000003F00000000003E00000000
+007E0000000000FC0000000000FC0000000001F80000000003F80000000003F000000000
+07F00000000007E0000000000FE0000000000FC0000000001FC0000000001F8000000000
+3F80000000003F00000000007F00000000007E0000000000FE0000000000FC0000000001
+FC0000000001FC0000000001F80000000003F80000000003F00000000007F00000000007
+F00000000007E0000000000FE0000000000FE0000000001FC0000000001FC0000000001F
+C0000000003F80000000003F80000000003F80000000007F80000000007F00000000007F
+0000000000FF0000000000FE0000000000FE0000000000FE0000000001FE0000000001FC
+0000000001FC0000000001FC0000000003FC0000000003FC0000000003F80000000003F8
+0000000007F80000000007F80000000007F80000000007F00000000007F0000000000FF0
+000000000FF0000000000FF0000000000FE0000000000FE0000000000FE0000000001FE0
+000000001FE0000000001FE0000000001FE0000000001FC0000000001FC0000000003FC0
+000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0
+000000003F80000000007F80000000007F80000000007F80000000007F80000000007F80
+000000007F80000000007F80000000007F80000000007F80000000007F80000000007F80
+000000007F80000000007F0000000000FF0000000000FF0000000000FF0000000000FF00
+00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00
+00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00
+00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00
+00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00
+00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00
+00000000FF0000000000FF0000000000FF0000000000FF00000000007F00000000007F80
+000000007F80000000007F80000000007F80000000007F80000000007F80000000007F80
+000000007F80000000007F80000000007F80000000007F80000000007F80000000003F80
+000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0
+000000003FC0000000001FC0000000001FC0000000001FE0000000001FE0000000001FE0
+000000001FE0000000000FE0000000000FE0000000000FE0000000000FF0000000000FF0
+000000000FF00000000007F00000000007F00000000007F80000000007F80000000007F8
+0000000003F80000000003F80000000003FC0000000003FC0000000001FC0000000001FC
+0000000001FC0000000001FE0000000000FE0000000000FE0000000000FE0000000000FF
+00000000007F00000000007F00000000007F80000000003F80000000003F80000000003F
+80000000001FC0000000001FC0000000001FC0000000000FE0000000000FE00000000007
+E00000000007F00000000007F00000000003F00000000003F80000000001F80000000001
+FC0000000001FC0000000000FC0000000000FE00000000007E00000000007F0000000000
+3F00000000003F80000000001F80000000001FC0000000000FC0000000000FE000000000
+07E00000000007F00000000003F00000000003F80000000001F80000000000FC00000000
+00FC00000000007E00000000003E00000000003F00000000001F80000000000F80000000
+000FC00000000007E00000000003E00000000001F00000000001F80000000000F8000000
+00007C00000000003E00000000001F00000000001F80000000000F800000000007C00000
+000003E00000000001E02BF86C8242>32 D<F00000000000F800000000007C0000000000
+3E00000000003F00000000001F00000000000F800000000007C00000000003E000000000
+03F00000000001F00000000000F80000000000FC00000000007E00000000003E00000000
+003F00000000001F80000000000F80000000000FC00000000007E00000000007E0000000
+0003F00000000003F80000000001F80000000001FC0000000000FC0000000000FE000000
+00007E00000000007F00000000003F00000000003F80000000001F80000000001FC00000
+00000FC0000000000FE00000000007E00000000007F00000000007F00000000003F00000
+000003F80000000001F80000000001FC0000000001FC0000000000FC0000000000FE0000
+000000FE00000000007F00000000007F00000000007F00000000003F80000000003F8000
+0000003F80000000003FC0000000001FC0000000001FC0000000001FE0000000000FE000
+0000000FE0000000000FE0000000000FF00000000007F00000000007F00000000007F000
+00000007F80000000007F80000000003F80000000003F80000000003FC0000000003FC00
+00000003FC0000000001FC0000000001FC0000000001FE0000000001FE0000000001FE00
+00000000FE0000000000FE0000000000FE0000000000FF0000000000FF0000000000FF00
+00000000FF00000000007F00000000007F00000000007F80000000007F80000000007F80
+000000007F80000000007F80000000007F80000000007F80000000003F80000000003FC0
+000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0
+000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000001FC0
+000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0
+000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0
+000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0
+000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0
+000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0
+000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE0
+000000001FE0000000001FE0000000001FC0000000003FC0000000003FC0000000003FC0
+000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0
+000000003FC0000000003FC0000000003FC0000000003F80000000007F80000000007F80
+000000007F80000000007F80000000007F80000000007F80000000007F80000000007F00
+000000007F0000000000FF0000000000FF0000000000FF0000000000FF0000000000FE00
+00000000FE0000000000FE0000000001FE0000000001FE0000000001FE0000000001FC00
+00000001FC0000000003FC0000000003FC0000000003FC0000000003F80000000003F800
+00000007F80000000007F80000000007F00000000007F00000000007F0000000000FF000
+0000000FE0000000000FE0000000000FE0000000001FE0000000001FC0000000001FC000
+0000003FC0000000003F80000000003F80000000003F80000000007F00000000007F0000
+0000007F0000000000FE0000000000FE0000000000FC0000000001FC0000000001FC0000
+000001F80000000003F80000000003F00000000007F00000000007F00000000007E00000
+00000FE0000000000FC0000000001FC0000000001F80000000003F80000000003F000000
+00007F00000000007E0000000000FE0000000000FC0000000001FC0000000001F8000000
+0003F80000000003F00000000007E00000000007E0000000000FC0000000000F80000000
+001F80000000003F00000000003E00000000007E0000000000FC0000000000F800000000
+01F00000000003F00000000003E00000000007C0000000000F80000000001F0000000000
+3F00000000003E00000000007C0000000000F80000000000F000000000002BF87E8242>
+I<FFFFFFFFFFFFFFFFFFFFFFFFE000FFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFF
+FFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFF8007F
+FE00000000000000FFFFFFF8007FFF0000000000000000FFFFFC003FFF80000000000000
+0007FFFC001FFFC00000000000000000FFFE000FFFC000000000000000001FFE000FFFE0
+000000000000000007FE0007FFF0000000000000000001FF0003FFF80000000000000000
+007F0001FFF80000000000000000003F8001FFFC0000000000000000000F8000FFFE0000
+000000000000000780007FFE00000000000000000003C0003FFF00000000000000000001
+C0003FFF80000000000000000000E0001FFFC0000000000000000000E0000FFFC0000000
+000000000000700007FFE0000000000000000000300007FFF00000000000000000003000
+03FFF8000000000000000000180001FFF8000000000000000000000000FFFC0000000000
+00000000000000FFFE0000000000000000000000007FFF0000000000000000000000003F
+FF0000000000000000000000003FFF8000000000000000000000001FFFC0000000000000
+00000000000FFFE0000000000000000000000007FFE0000000000000000000000007FFF0
+000000000000000000000003FFF8000000000000000000000001FFFC0000000000000000
+00000000FFFC000000000000000000000000FFFE0000000000000000000000007FFF0000
+000000000000000000003FFF0000000000000000000000001FFF80000000000000000000
+00001FFFC000000000000000000000000FFFE0000000000000000000000007FFE0000000
+000000000000000003FFF0000000000000000000000003FFF80000000000000000000000
+01FFFC000000000000000000000000FFFC0000000000000000000000007FFE0000000000
+000000000000007FFF0000000000000000000000003FFF8000000000000000000000001F
+FF8000000000000000000000000FFFC000000000000000000000000FFFE0000000000000
+000000000007FFF0000000000000000000000003FFF0000000000000000000000003FFF8
+000000000000000000000001FFFC000000000000000000000000FFFC0000000000000000
+000000007FF80000000000000000000000007FF00000000000000000000000003FE00000
+000000000000000000001FC00000000000000000000000001FC000000000000000000000
+00003F800000000000000000000000007F00000000000000000000000000FE0000000000
+0000000000000001FC00000000000000000000000003F800000000000000000000000003
+F800000000000000000000000007F00000000000000000000000000FE000000000000000
+00000000001FC00000000000000000000000003F800000000000000000000000007F0000
+00000000000000000000007F00000000000000000000000000FE00000000000000000000
+000001FC00000000000000000000000003F800000000000000000000000007F000000000
+00000000000000000FE00000000000000000000000000FE0000000000000000000000000
+1FC00000000000000000000000003F800000000000000000000000007F00000000000000
+000000000000FE00000000000000000000000001FC00000000000000000000000001FC00
+000000000000000000000003F800000000000000000000000007F0000000000000000000
+1800000FE00000000000000000003000001FC00000000000000000003000003F80000000
+0000000000007000003F800000000000000000006000007F00000000000000000000E000
+00FE00000000000000000001E00001FC00000000000000000003C00003F8000000000000
+00000007C00007F00000000000000000000F800007E00000000000000000001F80000FE0
+0000000000000000007F80001FC0000000000000000000FF00003F800000000000000000
+03FF00007F0000000000000000000FFF0000FE0000000000000000007FFE0000FC000000
+000000000003FFFE0001FC00000000000000007FFFFE0003F8000000000000007FFFFFFC
+0007FFFFFFFFFFFFFFFFFFFFFFFC000FFFFFFFFFFFFFFFFFFFFFFFF8001FFFFFFFFFFFFF
+FFFFFFFFFFF8001FFFFFFFFFFFFFFFFFFFFFFFF8003FFFFFFFFFFFFFFFFFFFFFFFF0007F
+FFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFF
+FFFFFFE0006D747B7F78>88 D E /Fc 133[22 25 3[28 17 1[22
+1[28 25 1[41 14 2[14 3[22 3[25 59[50 37[{}13 50.000000
+/Times-Bold rf /Fd 171[51 46 55 2[60 60 3[32 28 3[51
+69[{}8 83.333336 /Times-Roman rf /Fe 166[60 3[60 55 46
+60 65 51 65 60 78 55 2[32 65 65 1[55 60 60 55 60 65[{}19
+83.333336 /Times-Bold rf /Ff 139[45 6[45 3[45 3[45 101[{}4
+75.000000 /Courier rf /Fg 3 52 df<00600001E0000FE000FFE000F1E00001E00001
+E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001
+E00001E00001E00001E00001E00001E00001E00001E0007FFF807FFF80111C7B9B1C>49
+D<03FC000FFF801C0FC03003E06001F0E000F0E000F8F00078F000786000780000F80000
+F00001F00001E00003C0000700000E00001C0000300000E0000180180300180600180800
+383FFFF07FFFF0FFFFF0FFFFF0151C7D9B1C>I<03FC000FFF001C07C03001E07001F078
+01F07800F03001F00001F00001E00003C0000780001E0003FC000007800003C00001E000
+00F00000F80000F86000F8F000F8F000F8E000F06001F07003E03C07C00FFF0003FC0015
+1D7D9B1C>I E /Fh 81[28 52[25 25 2[25 14 19 17 1[25 25
+25 39 14 1[14 14 25 25 17 22 25 22 25 22 3[17 1[17 1[36
+36 2[36 30 28 33 36 28 36 36 44 30 1[19 17 36 36 28 30
+36 33 33 36 1[22 10[25 25 25 25 49[{}51 50.000000 /Times-Roman
+rf /Fi 135[55 3[55 55 3[55 55 55 55 2[55 2[55 55 1[55
+55 55 97[{}13 91.249977 /Courier rf /Fj 1 42 df<0000000000F0000000000000
+0000F00000000000000000F800000000000000007C00000000000000003C000000000000
+00003E00000000000000001F00000000000000001F00000000000000000F800000000000
+000007C00000000000000003E000007FFFFFFFFFFFF00000FFFFFFFFFFFFF80000FFFFFF
+FFFFFFFC00007FFFFFFFFFFFFF00000000000000001F80000000000000000FE000000000
+00000003F00000000000000001FE00000000000000007F80000000000000001FF0000000
+000000001FF0000000000000007F8000000000000001FE0000000000000003F000000000
+0000000FE0000000000000001F80007FFFFFFFFFFFFF0000FFFFFFFFFFFFFC0000FFFFFF
+FFFFFFF800007FFFFFFFFFFFF00000000000000003E00000000000000007C00000000000
+00000F80000000000000001F00000000000000001F00000000000000003E000000000000
+00003C00000000000000007C0000000000000000F80000000000000000F0000000000000
+0000F0000000442A7CA74D>41 D E /Fk 1 69 df<FFFFFFFFFC000000FFFFFFFFFFC000
+00FFFFFFFFFFF80000FFFFFFFFFFFE000000FFE0003FFF000000FFE00003FFC00000FFE0
+0000FFE00000FFE000007FF00000FFE000001FF80000FFE000000FFC0000FFE000000FFE
+0000FFE0000007FE0000FFE0000007FF0000FFE0000003FF0000FFE0000003FF8000FFE0
+000001FF8000FFE0000001FFC000FFE0000001FFC000FFE0000001FFC000FFE0000001FF
+C000FFE0000001FFE000FFE0000001FFE000FFE0000001FFE000FFE0000001FFE000FFE0
+000001FFE000FFE0000001FFE000FFE0000001FFE000FFE0000001FFE000FFE0000001FF
+E000FFE0000001FFE000FFE0000001FFE000FFE0000001FFC000FFE0000001FFC000FFE0
+000001FFC000FFE0000001FFC000FFE0000001FF8000FFE0000003FF8000FFE0000003FF
+8000FFE0000003FF0000FFE0000007FE0000FFE000000FFE0000FFE000000FFC0000FFE0
+00001FF80000FFE000003FF00000FFE00000FFE00000FFE00003FFC00000FFE0001FFF80
+00FFFFFFFFFFFE0000FFFFFFFFFFF80000FFFFFFFFFFC00000FFFFFFFFFC0000003B337D
+B244>68 D E /Fl 12 64 df<0000C00001C0000380000F00000E00001C00003C000078
+0000F00000F00001E00003C00003C00007C0000780000F80000F00001F00001F00001E00
+003E00003E00003E00003C00007C00007C00007C00007C00007C0000F80000F80000F800
+00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F800
+00F800007C00007C00007C00007C00007C00003C00003E00003E00003E00001E00001F00
+001F00000F00000F800007800007C00003C00003C00001E00000F00000F000007800003C
+00001C00000E00000F000003800001C00000C0124A79B71E>40 D<C00000E00000700000
+3C00001C00000E00000F000007800003C00003C00001E00000F00000F00000F800007800
+007C00003C00003E00003E00001E00001F00001F00001F00000F00000F80000F80000F80
+000F80000F800007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0
+0007C00007C00007C00007C00007C00007C0000F80000F80000F80000F80000F80000F00
+001F00001F00001F00001E00003E00003E00003C00007C0000780000F80000F00000F000
+01E00003C00003C0000780000F00000E00001C00003C0000700000E00000C00000124A7C
+B71E>I<000FE000007FFC0000F83E0003E00F8007C007C0078003C00F0001E01F0001F0
+1E0000F03E0000F83E0000F83E0000F87E0000FC7C00007C7C00007C7C00007C7C00007C
+FC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007E
+FC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007E
+7C00007C7C00007C7C00007C7C00007C7E0000FC3E0000F83E0000F83E0000F81E0000F0
+1F0001F00F0001E0078003C007C007C003E00F8000F83E00007FFC00000FE0001F347DB1
+26>48 D<00070000000F0000001F0000007F000007FF0000FFBF0000F83F0000003F0000
+003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000
+003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000
+003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000
+003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000
+003F0000003F0000003F000000FFC0007FFFFF807FFFFF8019327AB126>I<003FC00000
+FFF00003C07C000F003F001C001F8018000FC038000FE0700007E0600007F0600007F0FC
+0003F0FE0003F8FF0003F8FF0003F8FF0003F8FF0003F87E0003F83C0003F8000003F800
+0007F0000007F0000007F000000FE000000FE000001FC000001F8000003F0000003F0000
+007E000000FC000001F8000001F0000003C00000078000000F0000001E0000003C000000
+7800180070001800E0001801C0003003800030070000300E0000701FFFFFF01FFFFFF03F
+FFFFF07FFFFFE0FFFFFFE0FFFFFFE01D327CB126>I<001FE00000FFFC0001E03F000780
+1FC00E000FE01C0007F0180007F03F0003F83F8003F83F8003F83FC003F83F8003F83F80
+03F81F0003F8000003F0000007F0000007F0000007E000000FC000001F8000001F000000
+3E000001F800007FE000007FFC0000003F0000001F8000000FE0000007F0000007F00000
+03F8000003FC000003FC000001FC000001FE000001FE7E0001FEFF0001FEFF0001FEFF00
+01FEFF0001FEFF0001FCFE0003FC780003FC700003F8300007F0380007F01C000FE00F00
+1F8003E03F0000FFFC00001FE0001F347DB126>I<000001C000000001C000000003C000
+000007C000000007C00000000FC00000001FC00000001FC00000003FC00000007FC00000
+006FC0000000CFC0000001CFC00000018FC00000030FC00000070FC00000060FC000000E
+0FC000001C0FC00000180FC00000380FC00000300FC00000600FC00000E00FC00000C00F
+C00001800FC00003800FC00003000FC00006000FC0000E000FC0000C000FC00018000FC0
+0038000FC00030000FC00060000FC000E0000FC000FFFFFFFF80FFFFFFFF8000000FC000
+00000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000
+000FC00000000FC00000001FE0000007FFFF800007FFFF8021337EB226>I<0C0000C00F
+C00FC00FFFFF800FFFFF000FFFFE000FFFFC000FFFF0000FFFC0000C1800000C0000000C
+0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0FC0000C
+7FF8000CF07C000FC03F000F001F800F000F800E000FC00C0007E00C0007E0000007F000
+0003F0000003F0000003F8000003F8000003F8000003F8180003F87E0003F8FE0003F8FE
+0003F8FE0003F8FE0003F8FE0003F0F80007F0600007E0600007E070000FC030000FC038
+001F801C003F000E007E0007C0F80001FFE000003F80001D347CB126>I<000FE000007F
+FC0000F01F0003C00780078003C00F0001E00E0001F01E0000F01C0000F83C0000783C00
+00783C0000783E0000783E0000783F0000F83F8000F03FC001F01FF001E01FF803C00FFE
+078007FF0F0003FFFE0001FFF80000FFF800003FFE00003FFF0000F7FFC003E3FFE00780
+FFF00F007FF81E001FF83E0007FC3C0003FC780001FC780000FEF800007EF000003EF000
+003EF000001EF000001EF000001EF000001EF800001C7800003C7C0000383C0000781E00
+00F00F0001E007C003C003F01F0000FFFC00001FE0001F347DB126>56
+D<3C7EFFFFFFFF7E3C000000000000000000000000000000003C7EFFFFFFFF7E3C08207A
+9F15>58 D<7FFFFFFFFFFFC0FFFFFFFFFFFFE0FFFFFFFFFFFFE07FFFFFFFFFFFC0000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000007FFFFFFFFFFFC0FFFFFFFFFFFFE0FFFFFFFFFFFFE07FFFFFFFFFFF
+C033147C9C3C>61 D<00FFC00003FFF8000F00FE001C003F0038001F8070000FC0700007
+C0FC0007E0FE0007E0FE0007E0FE0007E0FE0007E07C0007E000000FC000000FC000001F
+8000003F0000007E000000F8000001F0000001E0000003C0000007800000078000000700
+00000E0000000E0000000C0000001C0000001C0000001800000018000000180000001800
+000018000000180000001800000018000000000000000000000000000000000000000000
+000000000000000000003C0000007E000000FF000000FF000000FF000000FF0000007E00
+00003C00001B357CB424>63 D E /Fm 8 69 df<000E00003E0001FE00FFFE00FFFE00FE
+FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000
+FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000
+FE007FFFFE7FFFFE7FFFFE17217BA023>49 D<00FF800007FFF0001FFFFC007F01FF007C
+00FF80FF003FC0FF003FC0FF001FE0FF001FE0FF001FE07E000FE018001FE000001FE000
+001FE000003FC000003F8000007F000000FE000001FC000003F0000007E000001F800000
+3F01E0007C01E000F803E003E003C007FFFFC00FFFFFC01FFFFFC07FFFFFC0FFFFFF80FF
+FFFF80FFFFFF801B217DA023>I<007FC00001FFF80007C0FE000F007F001E007F803F80
+3F803FC03F803FC03F803FC07F803FC07F801F807F000F00FF000001FE000003FC0000FF
+F00000FFC00000FFF8000000FE0000007F8000003FC000003FC03E001FE07F001FE0FF80
+1FE0FF801FE0FF801FE0FF801FE0FF803FC07F003FC07E007F803F80FF000FFFFE0007FF
+F80000FFC0001B227DA023>I<00007E000000FE000001FE000001FE000003FE000007FE
+00000F7E00001F7E00003E7E00003C7E0000787E0000F07E0001E07E0003E07E0007C07E
+0007807E000F007E001E007E003C007E007C007E00F8007E00FFFFFFF8FFFFFFF8FFFFFF
+F80000FE000000FE000000FE000000FE000000FE000000FE00003FFFF8003FFFF8003FFF
+F81D217EA023>I<180003001F003F001FFFFF001FFFFE001FFFFC001FFFF8001FFFE000
+1FFF80001EF800001E0000001E0000001E0000001E3FC0001EFFF8001FFFFE001FC0FF00
+1F003F801E003FC01C001FC000001FE000001FE000001FE07C001FE0FE001FE0FF001FE0
+FF001FE0FF001FC0FE003FC07C003F807C007F803F01FF001FFFFC0007FFF00000FF8000
+1B227DA023>I<0007F800003FFE0000FC0F0003F0078007C00FC00FC01FC01F801FC03F
+001FC03F001FC07F000F807E0000007E000000FE1FF000FE7FFC00FEFFFF00FFC03F80FF
+801F80FF801FC0FF000FC0FF000FE0FE000FE0FE000FE0FE000FE07E000FE07E000FE07E
+000FE07F000FE03F001FC01F801FC01F803F800FE07F0007FFFE0001FFF800003FC0001B
+227DA023>I<3C0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFF
+FF0078003E00F8007C00F000F800F001F0000003E0000007C0000007C000000F8000001F
+0000001F0000003F0000007E0000007E0000007E000000FE000000FC000000FC000001FC
+000001FC000001FC000001FC000001FC000001FC000001FC000001FC0000007000001C22
+7CA023>I<FFFFFFF80000FFFFFFFF0000FFFFFFFFC00007F8003FF00007F80007F80007
+F80001FC0007F80000FE0007F800007F0007F800003F8007F800003F8007F800001FC007
+F800001FC007F800001FC007F800001FE007F800001FE007F800001FE007F800001FE007
+F800001FE007F800001FE007F800001FE007F800001FE007F800001FC007F800001FC007
+F800001FC007F800003F8007F800003F8007F800007F0007F80000FF0007F80001FE0007
+F80007FC0007F8001FF000FFFFFFFFE000FFFFFFFF0000FFFFFFF800002B227DA134>68
+D E /Fn 5 111 df<78FCFCFEFE7E0606060C0C1C1830604007107A8513>59
+D<00FFFFFFFC00FFFFFFFC0007C000FC0007C0003C000F80001C000F80001C000F80000C
+000F80000C001F00000C001F00000C001F00300C001F00300C003E006000003E00600000
+3E00E000003E01E000007FFFC000007FFFC000007C03C000007C01C00000F801800000F8
+01800000F801800000F801800001F000000001F000000001F000000001F000000003E000
+000003E000000003E000000007E0000000FFFF800000FFFF80000026227CA127>70
+D<0000FE030007FFC6000F01EE003C007E0070003E00E0001C00C0001C01C0001C01C000
+1C03C0001803C0001803C0000003E0000003F0000001FE000000FFE000007FFE00003FFF
+00000FFF800000FFC000000FE0000003E0000001E0000000F0000000F0300000E0300000
+E0300000E0300001C0700001C078000380780007007E000E00E7807C00C3FFF000807F80
+0020247CA226>83 D<0038007C007C00780070000000000000000000000000000007801F
+C038E030E060F0C1E0C1E0C1E003C003C003C0078007800F000F040F061E0C1E0C1E181C
+181E700FE007800F237DA116>105 D<0F00FC001FC3FF0031C7078061EC038061F803C0
+C1F003C0C1F003C0C1E003C003C0078003C0078003C0078003C00F0007800F0007800F00
+07801E0407801E060F001E0C0F003C0C0F003C180F003C381E001C701E001FE00C000780
+1F177D9526>110 D E /Fo 10 108 df<0001E0000003E000001FE00000FFE000FFFFE0
+00FFFFE000FF3FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE0
+00003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE0
+00003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE0
+00003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE0
+007FFFFFF07FFFFFF07FFFFFF01C2C7AAB29>49 D<003FF00001FFFE0007FFFF801FC07F
+E03F003FF07C001FF87F000FFCFF8007FEFFC007FEFFC003FFFFC003FFFFC003FFFFC003
+FF7F8003FF3F0003FF000003FF000003FF000007FE000007FE00000FFC00000FF800001F
+F000001FE000003FC000007F800000FE000001FC000003F8000007E000000FC00F001F80
+0F003E000F007C001F00F8001E01F0001E03FFFFFE07FFFFFE0FFFFFFE1FFFFFFE3FFFFF
+FE7FFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC202C7CAB29>I<000FFC0000007FFF800001F8
+1FE00003E00FF80007C00FFC000F8007FC000FE007FE001FF007FE001FF807FE001FF807
+FE001FF807FE001FF807FE001FF807FC000FF00FFC0007E00FF80000001FF80000001FF0
+0000003FE0000000FF8000003FFE0000003FFC0000003FFF800000001FF00000000FF800
+000007FE00000003FF00000003FF00000001FF80000001FF801F0001FFC07FC001FFC0FF
+E001FFC0FFE001FFC0FFE001FFC0FFE001FFC0FFE001FFC0FFE001FF807FC003FF807F80
+03FF003E0007FE001F000FFC000FF01FF80007FFFFE00000FFFF8000001FFC0000222D7D
+AB29>I<000000F800000001F800000001F800000003F800000007F80000000FF8000000
+1FF80000003FF80000003FF80000007FF8000000F7F8000001F7F8000003E7F8000003C7
+F800000787F800000F07F800001E07F800003E07F800007C07F800007807F80000F007F8
+0001E007F80003E007F80007C007F800078007F8000F0007F8001E0007F8003C0007F800
+7C0007F800F80007F800FFFFFFFFF0FFFFFFFFF0FFFFFFFFF000000FF80000000FF80000
+000FF80000000FF80000000FF80000000FF80000000FF80000000FF800000FFFFFF0000F
+FFFFF0000FFFFFF0242C7EAB29>I<1C0000381FC003F81FFFFFF81FFFFFF01FFFFFE01F
+FFFFC01FFFFF801FFFFF001FFFFC001FFFF0001FFF00001E0000001E0000001E0000001E
+0000001E0000001E1FF8001E7FFF001FFFFFC01FF01FE01FC00FF01F0007F81E0007FC0C
+0007FC000003FE000003FE000003FF000003FF0C0003FF3F0003FF7F8003FFFF8003FFFF
+C003FFFFC003FFFFC003FFFF8003FEFF8007FE7E0007FC7C0007FC3E000FF81F001FF00F
+C07FC007FFFF8001FFFC00003FE000202D7CAB29>I<0000FF80000007FFF000001FC0F8
+00007F003C0000FE001E0003FC007E0007F800FF0007F001FF000FF001FF001FE001FF00
+1FE001FF003FE000FE003FE0007C007FC00000007FC00000007FC0000000FFC3FF8000FF
+C7FFE000FFCFBFF000FFDC03FC00FFF803FE00FFF001FF00FFF000FF00FFE000FF80FFE0
+00FF80FFE000FFC0FFC000FFC0FFC000FFC0FFC000FFC0FFC000FFC07FC000FFC07FC000
+FFC07FC000FFC07FC000FFC03FC000FFC03FC000FF803FE000FF801FE000FF000FE001FF
+000FF001FE0007F803FC0003FC0FF80000FFFFE000003FFF80000007FC0000222D7DAB29
+>I<3C000000003F000000003FFFFFFFE03FFFFFFFE03FFFFFFFE03FFFFFFFC07FFFFFFF
+807FFFFFFF007FFFFFFE007FFFFFFC007FFFFFF8007C0001F000780001E000F80003E000
+F00007C000F0000F8000F0001F000000003E000000007C000000007C00000000F8000000
+01F800000001F000000003F000000007F000000007E00000000FE00000000FE00000000F
+E00000001FE00000001FC00000003FC00000003FC00000003FC00000003FC00000007FC0
+0000007FC00000007FC00000007FC00000007FC00000007FC00000007FC00000007FC000
+00007FC00000003F800000001F000000232E7CAC29>I<FFFFFFFFE00000FFFFFFFFFE00
+00FFFFFFFFFF800001FF8001FFE00001FF80001FF80001FF800007FC0001FF800003FE00
+01FF800001FF0001FF800000FF8001FF8000007FC001FF8000007FE001FF8000003FE001
+FF8000003FF001FF8000003FF001FF8000001FF001FF8000001FF801FF8000001FF801FF
+8000001FF801FF8000001FFC01FF8000001FFC01FF8000001FFC01FF8000001FFC01FF80
+00001FFC01FF8000001FFC01FF8000001FFC01FF8000001FFC01FF8000001FFC01FF8000
+001FFC01FF8000001FF801FF8000001FF801FF8000001FF801FF8000001FF801FF800000
+1FF001FF8000003FF001FF8000003FE001FF8000007FE001FF8000007FC001FF800000FF
+8001FF800001FF8001FF800003FF0001FF800007FC0001FF80001FF80001FF8001FFF000
+FFFFFFFFFFC000FFFFFFFFFE0000FFFFFFFFE00000362E7DAD3E>68
+D<07C00FE01FF03FF83FF83FF83FF83FF81FF00FE007C000000000000000000000000003
+F0FFF0FFF0FFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00F
+F00FF00FF00FF00FF00FF00FF00FF00FF0FFFFFFFFFFFF102F7CAE17>105
+D<03F0000000FFF0000000FFF0000000FFF00000000FF00000000FF00000000FF0000000
+0FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000F
+F00000000FF00000000FF003FFF00FF003FFF00FF003FFF00FF000FF000FF000FC000FF0
+03F8000FF007F0000FF00FC0000FF03F80000FF07F00000FF0FC00000FF1F800000FF7FC
+00000FFFFE00000FFFFF00000FFFFF00000FFEFF80000FF87FC0000FF03FE0000FE01FF0
+000FE00FF8000FE00FF8000FE007FC000FE003FE000FE001FF000FE000FF800FE000FFC0
+FFFE03FFFCFFFE03FFFCFFFE03FFFC262E7DAD2B>107 D E /Fp
+3 80 df<FFFFFFFFFFF8000000FFFFFFFFFFFF800000FFFFFFFFFFFFF00000FFFFFFFFFF
+FFFC0000003FFC00007FFF0000003FFC00000FFFC000003FFC000003FFE000003FFC0000
+00FFF000003FFC0000003FF800003FFC0000001FFC00003FFC0000000FFE00003FFC0000
+000FFF00003FFC00000007FF80003FFC00000003FF80003FFC00000003FFC0003FFC0000
+0001FFC0003FFC00000001FFE0003FFC00000001FFE0003FFC00000001FFF0003FFC0000
+0000FFF0003FFC00000000FFF0003FFC00000000FFF8003FFC00000000FFF8003FFC0000
+0000FFF8003FFC00000000FFF8003FFC00000000FFFC003FFC00000000FFFC003FFC0000
+0000FFFC003FFC00000000FFFC003FFC000000007FFC003FFC000000007FFC003FFC0000
+00007FFC003FFC000000007FFC003FFC00000000FFFC003FFC00000000FFFC003FFC0000
+0000FFFC003FFC00000000FFFC003FFC00000000FFFC003FFC00000000FFF8003FFC0000
+0000FFF8003FFC00000000FFF8003FFC00000000FFF8003FFC00000000FFF0003FFC0000
+0000FFF0003FFC00000001FFF0003FFC00000001FFE0003FFC00000001FFE0003FFC0000
+0003FFC0003FFC00000003FFC0003FFC00000007FF80003FFC00000007FF00003FFC0000
+000FFF00003FFC0000001FFE00003FFC0000003FFC00003FFC000000FFF800003FFC0000
+01FFE000003FFC00000FFFC000003FFC00007FFF8000FFFFFFFFFFFFFE0000FFFFFFFFFF
+FFF80000FFFFFFFFFFFFC00000FFFFFFFFFFF8000000463E7DBD50>68
+D<FFFFFFFF80FFFFFFFF80FFFFFFFF80FFFFFFFF80003FFE0000003FFE0000003FFE0000
+003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE000000
+3FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003F
+FE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE
+0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE00
+00003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000
+003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE000000
+3FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003FFE0000003F
+FE0000FFFFFFFF80FFFFFFFF80FFFFFFFF80FFFFFFFF80213E7DBD28>73
+D<0000003FFF00000000000003FFFFF000000000001FFFFFFE00000000007FF807FF8000
+000001FFC000FFE000000007FF00003FF80000000FFC00000FFC0000003FF8000007FF00
+00007FF0000003FF800000FFE0000001FFC00001FFE0000001FFE00001FFC0000000FFE0
+0003FF800000007FF00007FF800000007FF80007FF000000003FF8000FFF000000003FFC
+001FFF000000003FFE001FFE000000001FFE001FFE000000001FFE003FFE000000001FFF
+003FFE000000001FFF003FFE000000001FFF007FFC000000000FFF807FFC000000000FFF
+807FFC000000000FFF807FFC000000000FFF80FFFC000000000FFFC0FFFC000000000FFF
+C0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFF
+C0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFF
+C0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFFC07FFC000000000FFF
+807FFE000000001FFF807FFE000000001FFF807FFE000000001FFF803FFE000000001FFF
+003FFE000000001FFF003FFF000000003FFF001FFF000000003FFE001FFF000000003FFE
+000FFF800000007FFC000FFF800000007FFC0007FFC0000000FFF80003FFC0000000FFF0
+0003FFE0000001FFF00001FFE0000001FFE00000FFF0000003FFC000007FF8000007FF80
+00003FFE00001FFF0000001FFF00003FFE00000007FFC000FFF800000001FFF807FFE000
+000000FFFFFFFFC0000000001FFFFFFE000000000003FFFFF00000000000003FFF000000
+0042407ABE4F>79 D E /Fq 12 121 df<0000FF000007FFE0003FFFF8007E00FC01F000
+3C03C0000C07000000060000000E0000000C0000000C0000000C0000000E000000060000
+00079FF00001FFFC0001FFF800079FF0000E0000001C0000003800000070000000600000
+0060000000E0000000C0000000C0000000C0000040E00000C0E00001C070000380380007
+803F003E000FFFFC0003FFF00000FF80001E247EA124>34 D<3C7EFFFFFFFF7E3C08087A
+8715>58 D<3C007E00FF00FF00FF80FF807F803D80018001800180018003800300030007
+0006000E000C001C0038007000600009177A8715>I<0000000003000000000000070000
+000000000F0000000000000F0000000000001F8000000000001F8000000000003F800000
+0000007F8000000000007F800000000000DF800000000000DF8000000000019F80000000
+00031F8000000000031FC000000000061FC000000000060FC0000000000C0FC000000000
+180FC000000000180FC000000000300FC000000000700FC000000000600FC000000000C0
+0FC000000000C00FE0000000018007E0000000038007E0000000030007E0000000060007
+E0000000060007E00000000C0007E00000001C0007E0000000180007E0000000300007F0
+000000300003F00000007FFFFFF0000000FFFFFFF0000000C00003F0000001800003F000
+0001800003F0000003000003F0000006000003F0000006000003F800000C000003F80000
+0C000001F8000018000001F8000030000001F8000070000001F8000060000001F80000E0
+000001F80001E0000001F80003E0000001FC000FF0000003FC00FFFE0000FFFFF0FFFE00
+00FFFFF034367DB53A>65 D<000FFFFFFFFFF8000FFFFFFFFFF800003FC0000FF000001F
+800001F000003F800000F000003F800000F000003F0000007000003F0000007000007F00
+00007000007F0000007000007E0000006000007E000000600000FE000000600000FE0000
+00600000FC000000600000FC000C00600001FC001C00600001FC001800000001F8001800
+000001F8001800000003F8003800000003F8003000000003F0007000000003F001F00000
+0007FFFFF000000007FFFFF000000007E001E000000007E000E00000000FE000E0000000
+0FE000C00000000FC000C00000000FC000C00000001FC001C00000001FC001800000001F
+8001800000001F8000000000003F8000000000003F8000000000003F0000000000003F00
+00000000007F0000000000007F0000000000007E0000000000007E000000000000FE0000
+00000000FE000000000000FC000000000000FC000000000001FE0000000000FFFFFE0000
+0000FFFFFE0000000035337CB231>70 D<000FFF800007FFFC000FFFC00007FFFC00001F
+C000003F8000001FE000001E0000003FE000001C0000003FF000001C00000033F0000018
+00000033F000001800000073F800003800000071F800003000000061FC00003000000060
+FC000030000000E0FE000070000000E07E000060000000C07E000060000000C07F000060
+000001C03F0000E0000001C03F8000C0000001801F8000C0000001801FC000C000000380
+0FC001C0000003800FC00180000003000FE001800000030007E001800000070007F00380
+0000070003F003000000060003F003000000060001F8030000000E0001F8070000000E00
+01FC060000000C0000FC060000000C0000FE060000001C00007E0E0000001C00007E0C00
+00001800007F0C0000001800003F0C0000003800003F9C0000003800001F980000003000
+001FD80000003000000FD80000007000000FF80000007000000FF000000060000007F000
+000060000007F0000000E0000003F0000000E0000003E0000001E0000001E0000003E000
+0001E0000007F0000001E00000FFFF800000C00000FFFF800000C000003E337CB23D>78
+D<000000FF0018000007FFE03800001F00F87800007C001C780000F0000EF00001E00007
+F00003C00003F00007800003F0000F000003E0000E000001E0001E000001E0003E000001
+E0003C000001C0003C000001C0003C000001C0007C000001C0007C00000180007E000001
+80007E00000000007F00000000003F80000000003FC0000000003FF8000000001FFF8000
+00001FFFF80000000FFFFF00000003FFFFC0000001FFFFE00000003FFFF000000003FFF0
+000000003FF80000000007F80000000003F80000000001FC0000000000FC0000000000FC
+00000000007C000C0000007C000C0000007C001C00000078001800000078001800000078
+0018000000F80038000000F00038000000F0003C000001E0003C000003C0007C000003C0
+007E00000780007F00000F00007B80003C0000F1E000780000E07C03E00000E01FFF8000
+00C003FE0000002D377CB42F>83 D<07FFFFFFFFFFE00FFFFFFFFFFFE00FE000FE001FC0
+0F8000FC0007C01E0001FC0003C01C0001FC0001C01C0001F80001C0380001F800018038
+0003F8000180300003F8000180700003F0000180600003F0000380600007F0000300E000
+07F0000300C00007E0000300C00007E0000300C0000FE000030000000FE000000000000F
+C000000000000FC000000000001FC000000000001FC000000000001F8000000000001F80
+00000000003F8000000000003F8000000000003F0000000000003F0000000000007F0000
+000000007F0000000000007E0000000000007E000000000000FE000000000000FE000000
+000000FC000000000000FC000000000001FC000000000001FC000000000001F800000000
+0001F8000000000003F8000000000003F8000000000003F0000000000003F00000000000
+07F0000000000007F0000000000007E000000000000FE000000000001FF0000000003FFF
+FFF80000003FFFFFF800000033337EB22D>I<0003FFFF8007FFFC0003FFFF8007FFFC00
+001FF80000FFC000000FF000007E00000007E000007C00000007F000007000000007F000
+00E000000003F80001C000000003F800038000000001FC00070000000001FC000E000000
+0000FC001C0000000000FE001800000000007E003000000000007F006000000000003F00
+C000000000003F818000000000003F830000000000001FC60000000000001FCC00000000
+00000FF80000000000000FF000000000000007E000000000000007F000000000000003F0
+00000000000003F800000000000007F80000000000000FFC0000000000001DFC00000000
+000038FE00000000000070FE000000000000E07E000000000001C07F000000000003803F
+000000000007003F80000000000E001F80000000000C001FC00000000018001FC0000000
+0030000FE00000000060000FE000000000C00007F000000001800007F000000003000003
+F000000006000003F80000000E000001F80000003C000001FC00000078000001FC000001
+FC000001FE000007FC000003FF0000FFFF80003FFFF800FFFF80003FFFF8003E337EB23F
+>88 D<FFFFE00001FFFCFFFFE00001FFFC07FC0000003FC003F80000001F0003F8000000
+1E0001FC0000003C0001FC000000700000FE000000700000FE000000C00000FE00000180
+00007F0000038000007F0000070000003F80000E0000003F80000C0000001F8000180000
+001FC000300000001FC000600000000FE000C00000000FE001C000000007E00380000000
+07F0070000000007F0060000000003F80C0000000003F8180000000001FC300000000001
+FC600000000001FCC00000000000FFC00000000000FF8000000000007F0000000000007E
+0000000000007E0000000000007C000000000000FC000000000000FC000000000000FC00
+0000000000F8000000000001F8000000000001F8000000000001F8000000000001F00000
+00000003F0000000000003F0000000000003F0000000000003E0000000000007E0000000
+000007E0000000000007E000000000000FE00000000007FFFFC000000007FFFFC0000000
+36337DB22D>I<0001C00007E00007F0000FF0000FE00007E00003800000000000000000
+0000000000000000000000000000000000000000000000F00003FC00071E000E1F001C1F
+00381F00301F00301F00703F00603F00603E00E07E00407C00007C0000FC0000F80001F8
+0001F80001F00003F00003E00003E02007E07007C0600FC0600FC0E00F80C00F80C00F81
+C00F83800F8700078E0003FC0000F00014337EB11A>105 D<000F801F80007FE03FE000
+F0F0F07001C079C0F803803D83F807003F83F80E003F03F80C003F03F01C003E03F01800
+3E01C018007E000038007C000010007C000000007C00000000FC00000000F800000000F8
+00000000F800000001F800000001F800000001F000000001F000400003F000E00003F000
+C01C03E000C07E03E001C07E07E00180FE07E00380FE0FE00700FE0DE00E00F81CF01C00
+70787878003FE03FF0000FC00F800025227EA02C>120 D E /Fr
+138[37 21 29 29 1[37 1[37 54 3[21 1[37 21 33 3[37 97[{}12
+75.000000 /Times-Italic rf /Fs 21 121 df<38FEFEFEFEFE3807077A8614>58
+D<38FEFEFFFFFF3B0303030706060E0C1C3830706008147A8614>I<0000000000800000
+000003C0000000000FC0000000003F8000000000FE0000000003F8000000000FE0000000
+003F8000000000FE0000000003F8000000000FE0000000003F8000000000FE0000000003
+F8000000000FE0000000003F8000000000FE0000000003F8000000000FE0000000003F80
+00000000FE0000000000F80000000000FE00000000003F80000000000FE00000000003F8
+0000000000FE00000000003F80000000000FE00000000003F80000000000FE0000000000
+3F80000000000FE00000000003F80000000000FE00000000003F80000000000FE0000000
+0003F80000000000FE00000000003F80000000000FC00000000003C00000000000802A2B
+7AA537>I<000000C0000001C0000003C000000380000003800000078000000700000007
+0000000F0000000E0000000E0000001E0000001C0000001C0000003C0000003800000078
+0000007000000070000000F0000000E0000000E0000001E0000001C0000001C0000003C0
+0000038000000780000007000000070000000F0000000E0000000E0000001E0000001C00
+00001C0000003C00000038000000380000007800000070000000F0000000E0000000E000
+0001E0000001C0000001C0000003C00000038000000380000007800000070000000F0000
+000E0000000E0000001E0000001C0000001C0000003C0000003800000038000000780000
+007000000070000000F0000000E0000000E00000001A437CB123>I<0000000070000000
+0000700000000000F00000000001F00000000001F00000000003F80000000003F8000000
+0007F8000000000DF8000000000DF80000000019F80000000039F80000000031F8000000
+0061FC0000000060FC00000000C0FC0000000180FC0000000180FC0000000300FC000000
+0700FC0000000600FC0000000C00FE0000000C007E00000018007E00000030007E000000
+30007E00000060007E000000E0007E000000C0007E00000180007F000001FFFFFF000003
+FFFFFF00000600003F00000600003F00000C00003F00001C00003F00001800003F000030
+00003F80003000001F80006000001F8000C000001F8001C000001F8003C000001F8007C0
+00001F800FC000003FC0FFF80007FFFEFFF80007FFFE2F2F7DAE35>65
+D<0000007FC003000003FFF80700001FC03E0F00007E00071F0001F80003BF0003F00001
+FE000FC00000FE001F8000007E003F0000007E007E0000007C00FC0000003C01F8000000
+3C03F80000003C07F0000000380FE0000000380FE0000000381FC0000000381FC0000000
+303F80000000003F80000000007F80000000007F00000000007F00000000007F00000000
+00FF0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE00000000
+00FE0000000180FE0000000380FE0000000300FE00000003007E00000007007E00000006
+007E0000000E003F0000001C003F00000038001F80000070000F800000E00007C00001C0
+0003E00007800001F8001E0000007E00F80000001FFFE000000003FF000000302F7CAD32
+>67 D<003FFFFFFFFF80003FFFFFFFFF800000FE00007F800000FE00000F800000FC0000
+07800000FC000007800001FC000003800001FC000003000001F8000003000001F8000003
+000003F8000003000003F8000003000003F0000003000003F0003003000007F000700300
+0007F0007000000007E0006000000007E000E00000000FE000E00000000FE001E0000000
+0FC007C00000000FFFFFC00000001FFFFFC00000001FC007C00000001F8003800000001F
+8003800000003F8003800000003F8003800000003F0003000C00003F0003000C00007F00
+03001C00007F0000001800007E0000003800007E000000300000FE000000700000FE0000
+00E00000FC000000E00000FC000001C00001FC000003C00001FC000007800001F800000F
+800001F800001F800003F80001FF0000FFFFFFFFFF0000FFFFFFFFFE0000312D7DAC34>
+69 D<0000007FC000000007FFF80000001F807E0000007C001F800001F0000FC00007E0
+0003E0000F800003F0001F000001F0003E000000F8007C000000FC00F8000000FC01F800
+0000FC03F00000007E07E00000007E07E00000007E0FC00000007E1FC00000007E1FC000
+00007E3F800000007E3F80000000FE3F00000000FE7F00000000FE7F00000000FE7F0000
+0000FEFE00000001FCFE00000001FCFE00000001FCFE00000003F8FE00000003F8FE0000
+0003F0FE00000007F0FE00000007E0FE0000000FE0FE0000001FC0FE0000001F807E0000
+003F007E0000007F003F0000007E003F000000FC001F800001F8001F800003E0000FC000
+0FC00007E0001F000003F8007E000000FE03F80000003FFFC000000007FE0000002F2F7C
+AD36>79 D<003FFFFFF80000003FFFFFFF00000000FE001FC0000000FE0007E0000000FC
+0003F0000000FC0001F8000001FC0000FC000001FC0000FC000001F80000FE000001F800
+00FE000003F80000FE000003F80001FC000003F00001FC000003F00001FC000007F00003
+F8000007F00003F0000007E00007E0000007E0000FC000000FE0001F8000000FE0007E00
+00000FC003F80000000FFFFFE00000001FFFFF000000001FC007C00000001F8003E00000
+001F8001F00000003F8001F80000003F8000F80000003F0000FC0000003F0000FC000000
+7F0001FC0000007F0001FC0000007E0001F80000007E0001F8000000FE0003F8000000FE
+0003F8000000FC0003F8000000FC0003F8000001FC0003F8038001FC0003F8030001F800
+03F8030001F80003F8070003F80001FC0E00FFFFE000FC3C00FFFFE0007FF00000000000
+0FC000312E7CAC35>82 D<000007F00600003FFE0E0000F80F9E0003E001FE00078000FE
+000F00007C001E00007C003C00003C003C00003C00780000380078000038007800003800
+F800003800F800003000F800003000FC00000000FC00000000FE000000007F800000007F
+F80000003FFF8000003FFFF000001FFFFC000007FFFE000000FFFF0000001FFF00000001
+FF800000003F800000001F800000000F800000000F800000000780180000078018000007
+8018000007801800000F803800000F003800000F003800001E003800001E007C00003C00
+7E000078007F0000F0007B8003E000F1F00F8000E07FFE0000C00FF00000272F7CAD2B>
+I<0FFFFFFFFFFF0FFFFFFFFFFF1FC003F8003F1F0003F8001F1C0003F0000E3C0003F000
+0E380007F00006300007F00006700007E0000E700007E0000E60000FE0000CE0000FE000
+0CC0000FC0000CC0000FC0000CC0001FC0000C00001FC0000000001F80000000001F8000
+0000003F80000000003F80000000003F00000000003F00000000007F00000000007F0000
+0000007E00000000007E0000000000FE0000000000FE0000000000FC0000000000FC0000
+000001FC0000000001FC0000000001F80000000001F80000000003F80000000003F80000
+000003F00000000003F00000000007F00000000007F00000000007E0000000000FE00000
+00001FE00000001FFFFFF000001FFFFFF00000302D7FAC29>I<000FFFFC007FFF000FFF
+FC007FFF00007FC0000FF000003F80000F8000003F80000F0000001FC0001E0000001FC0
+00180000000FC000300000000FE0006000000007E000C000000007F0018000000003F003
+0000000003F8060000000003F80C0000000001FC180000000001FC300000000000FE6000
+00000000FEC000000000007F8000000000007F0000000000003F8000000000003F800000
+0000001FC000000000003FC000000000006FC00000000000CFE0000000000187E0000000
+000307F0000000000703F0000000000E03F8000000001C03F8000000003801FC00000000
+7001FC00000000E000FE00000001C000FE0000000380007F0000000700007F0000000E00
+003F8000001C00003F8000003800001FC000007000001FC00001F000001FE00007F80000
+3FE000FFFE0003FFFF00FFFE0003FFFF00382D7EAC3A>88 D<FFFFC0000FFFC0FFFFC000
+0FFFC007F8000001FC0003F8000001F00003F8000001E00001FC000003800001FC000003
+000001FC000006000000FE00000C000000FE0000180000007F0000300000007F00007000
+00003F0000E00000003F8001C00000003F8003800000001FC007000000001FC006000000
+000FE00C000000000FE018000000000FE0300000000007F0600000000007F0C000000000
+03F9800000000003FB000000000003FF000000000001FE000000000001FC000000000001
+F8000000000001F8000000000001F8000000000001F0000000000003F0000000000003F0
+000000000003F0000000000003E0000000000007E0000000000007E0000000000007E000
+0000000007C000000000000FC000000000000FC000000000000FC000000000001FC00000
+000007FFFF0000000007FFFF00000000322D7DAC29>I<0007E000001FF800007C1CE000
+F80DE001F00FE003E007E007C007E00FC007E01F8007C01F8007C03F0007C03F000FC07F
+000F807E000F807E000F807E001F80FE001F00FC001F00FC001F00FC003F02FC003E06FC
+003E06F8003E06F8007E0E7C00FE0C7C00FC0C7C01FC1C3E07BE181F0E1E380FFC0FF003
+F003C01F1F7D9D25>97 D<00F800001FF800001FF8000001F8000001F8000001F0000001
+F0000003F0000003F0000003E0000003E0000007E0000007E0000007C0000007C000000F
+C000000FC7E0000F9FF8000FB83C001FF01E001FE01F001FC01F001F800F803F000F803F
+000F803E000F803E000F807E001F807E001F807C001F807C001F807C003F80FC003F00F8
+003F00F8003F00F8007E00F8007E00F8007C00F800FC00F800F8007801F0007803F00078
+07E0003C0F80001E1F00000FFC000003F00000192F7DAD1E>I<0001F800000FFE00003E
+0780007C018001F801C003F007C007E00FC00FC00FC00F800F801F800F803F0000003F00
+00007F0000007E0000007E0000007E000000FE000000FC000000FC000000FC000000FC00
+0000FC000000FC0000607C0000E07C0001C07C0003803E000F001E001C000F81F80007FF
+E00000FE00001B1F7D9D1F>I<000700000F80001FC0001FC0000F800007000000000000
+0000000000000000000000000000000000000000000001E00007F8000E3C001C3E00383E
+00303E00703E00607E00E07C00C07C00C0FC0080F80000F80001F80001F00003F00003E0
+0003E00007E00007C04007C0C00FC0C00F80C00F81C01F01801F03801F07000F06000F1E
+0007F80001F000122E7EAC18>105 D<000000E0000001F0000003F0000003F0000003F0
+000001C00000000000000000000000000000000000000000000000000000000000000000
+0000000000007C000003FE0000078F80000E0780001C0780003807C0003007C000700FC0
+00600F8000E00F8000C00F8000801F8000001F8000001F0000001F0000003F0000003F00
+00003E0000003E0000007E0000007E0000007C0000007C000000FC000000FC000000F800
+0000F8000001F8000001F8000001F0000001F0000003F0000003F0000003E0000003E000
+0007E0003807C000FC0FC000FC0F8000FC1F0000F83E0000F0F800007FF000001F800000
+1C3B81AC1D>I<078007F0007E00001FE01FFC03FF800018F0781F0783E0003878E00F1E
+01E0003079C00FB801F000707F800FB001F000607F000FF001F00060FE000FE001F000E0
+FE000FC001F000C0FC000FC001F000C0F8000F8001F00081F8001F8003F00001F8001F80
+03E00001F0001F0003E00001F0001F0003E00003F0003F0007E00003F0003F0007C00003
+E0003E0007C00003E0003E000FC00007E0007E000F808007E0007E000F818007C0007C00
+1F818007C0007C001F01800FC000FC003F03800FC000FC003E03000F8000F8003E07000F
+8000F8003E0E001F8001F8001E0C001F8001F8001E3C001F0001F0000FF0000E0000E000
+03E000391F7E9D3E>109 D<07C007E0001FE03FF80018F8783E003879E01E00307B801F
+00707F001F00607F001F0060FE001F00E0FC001F00C0FC001F00C0F8001F0081F8003F00
+01F8003E0001F0003E0001F0003E0003F0007E0003F0007C0003E0007C0003E000FC0007
+E000F80807E000F81807C001F81807C001F0180FC001F0380FC003E0300F8003E0700F80
+03E0E01F8001E0C01F8001E3C01F0000FF000E00003E00251F7E9D2B>I<003F007C0000
+FFC1FF0001C1E383800380F703C00700F60FC00E00FE0FC01C00FC0FC01800FC0FC03800
+FC07003000F800003000F800002001F800000001F000000001F000000001F000000003F0
+00000003E000000003E000000003E000000007E001000007E003000007C003003807C007
+007C0FC00600FC0FC00E00FC1FC00C00FC1BC01C00F03BE038007071E0F0003FE0FFC000
+0F803F0000221F7E9D28>120 D E /Ft 5 49 df<FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0
+22037A8D30>0 D<006000007000006000006000406020E06070F861F07C63E00F6F0003
+FC0000600003FC000F6F007C63E0F861F0E0607040602000600000600000700000600014
+157B9620>3 D<00000000060000000000000E0000000000000700000000000007000000
+000000078000000000000380000000000003C0000000000001C0000000000000E0000000
+00000070000000000000780000000000001E007FFFFFFFFFFF80FFFFFFFFFFFFE07FFFFF
+FFFFFF8000000000001E0000000000007800000000000070000000000000E00000000000
+01C0000000000003C0000000000003800000000000078000000000000700000000000007
+0000000000000E000000000000060000331B7C993D>33 D<0000000380000000000001C0
+000000000001C0000000000000E000000000000070000000000000780000000000003800
+00FFFFFFFFFC0000FFFFFFFFFF0000FFFFFFFFFF80000000000003C0000000000000F000
+00000000007C0000000000001F80000000000007E000000000001F8000000000007C0000
+00000000F0000000000003C000FFFFFFFFFF8000FFFFFFFFFF0000FFFFFFFFFC00000000
+0000380000000000007800000000000070000000000000E0000000000001C00000000000
+01C0000000000003800000331D7C9A3D>41 D<01E003F003F003F003F007E007E007C00F
+C00FC00F800F801F001F001E001E003E003C003C007800780078007000F000E00060000C
+1A7E9B12>48 D E /Fu 14 64 df<78FCFCFCFCFCFCFCFC787878787878787878787830
+30303030300000000030FCFCFCFC3006247AA312>33 D<000C0038007000E001C0038003
+0007000E000E001C001C003800380038007800700070007000F000F000F000F000F000F0
+00F000F000F000F000F00070007000700078003800380038001C001C000E000E00070003
+00038001C000E000700038000C0E317AA418>40 D<C000700038001C000E000700030003
+8001C001C000E000E00070007000700078003800380038003C003C003C003C003C003C00
+3C003C003C003C003C003800380038007800700070007000E000E001C001C00380030007
+000E001C0038007000C0000E317CA418>I<00E00001E00007E000FFE000F9E00001E000
+01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000
+01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000
+03F000FFFFC0FFFFC012217AA01E>49 D<01FC0007FF801C0FC03003E06001F06000F8F8
+00F8FC00FCFC00FCFC007C78007C3000FC0000FC0000F80000F80001F00003E00003C000
+0780000F00001E0000380000700000E00001C00C03800C0600180C00181800183FFFF87F
+FFF8FFFFF0FFFFF016217CA01E>I<00FF0003FFC00F03E01C00F01C00F83E00FC3E007C
+3E007C1E00FC0C00FC0000F80000F80001F00003E0000FC001FF0001FF000003E00000F0
+00007800007C00003E00003F30003F78003FFC003FFC003FFC003EF8007E60007C3800F8
+1E03F00FFFC001FF0018227DA01E>I<0000E00001E00001E00003E00007E00007E0000D
+E0001DE00039E00031E00061E000E1E000C1E00181E00381E00701E00601E00C01E01C01
+E01801E03001E07001E0E001E0FFFFFFFFFFFF0001E00001E00001E00001E00001E00001
+E00003F0003FFF003FFF18227DA11E>I<1000301E01F01FFFE01FFFC01FFF801FFE001B
+F00018000018000018000018000018000018FE001BFF801F03C01C01E01800F01800F800
+007800007800007C00007C30007C78007CF8007CF8007CF80078F000F86000F07001E038
+01E01E078007FF0001F80016227CA01E>I<000FC0007FF001F03803C01807803C0F007C
+1E007C1C00383C00003C00007C0000780000787FC0F8FFE0F980F0FA0038FE003CFC001E
+FC001EF8001FF8001FF8001FF8001F78001F78001F78001F3C001E3C001E1C003C1E0038
+0F00700781E001FFC0007F0018227DA01E>I<3000003C00003FFFFF3FFFFF7FFFFE7FFF
+FC60001C600038600070C000E0C000C00001C0000380000700000600000E00001C00001C
+0000380000380000780000780000780000F00000F00000F00000F00001F00001F00001F0
+0001F00001F00001F00001F00000E00018237CA11E>I<007F0003FFC00781E00E00701C
+003818001C38001C38001C38001C3C001C3F00381FC0781FE0F00FF9E007FF8001FF8001
+FFC007FFF00F0FF81C03FC3801FE70007E70001FE0000FE00007E00007E00007E0000670
+000E78000C3C00381F00F007FFC000FF0018227DA01E>I<78FCFCFCFC78000000000000
+00000078FCFCFCFC7806157A9412>58 D<FFFFFFFFFEFFFFFFFFFEFFFFFFFFFE00000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000FFFFFFFFFEFFFFFFFFFEFFFFFFFFFE270F7C932F>61
+D<03FE000FFF803C03E07001F06000F0F000F8F800F8F800F87000F82001F00001F00003
+E00007C0000F00001E00001C000038000030000030000070000060000060000060000060
+0000600000600000000000000000000000000000600001F80001F80001F80001F8000060
+0015247CA31D>63 D E /Fv 21 112 df<38FEFEFEFEFEFEFEFEFE7C7C7C7C7C7C7C7C7C
+7C7C3838383838383838383838380000000000000038FEFEFEFEFE38072F7AAE14>33
+D<0001F00000000007FC000000001F0C000000003E0E000000003C060000000078070000
+0000780300000000F80300000000F80300000000F80300000000F80300000000F8070000
+0000F80600000000F80E00000000F81C00000000F838000000007C30000000007C700000
+00007CE0003FFF007FC0003FFF007F80000FF8003F000007E0003F00000380001F000003
+80003F80000700007F8000060000EFC0000E0001CFC0001C000387E00018000707F00038
+000F03F00070001E01F80060003E01FC00E0007C00FE01C0007C007E018000FC003F0380
+00FC003F870000FC001FCE0000FC000FDC0000FC0007F80006FE0003F000067E0001F800
+067E0001FC000C3F0007FE001C1F800E1F80380FC07C07E0F003FFF001FFE0007F80007F
+8030307DAE37>38 D<00030007000E001C0038007000F001E001C003C0078007800F000F
+001E001E001E003C003C003C003C0078007800780078007800F800F800F000F000F000F0
+00F000F000F000F000F000F000F000F800F800780078007800780078003C003C003C003C
+001E001E001E000F000F000780078003C001C001E000F000700038001C000E0007000310
+437AB11B>40 D<C000E000700038001C000E000F000780038003C001E001E000F000F000
+7800780078003C003C003C003C001E001E001E001E001E001F001F000F000F000F000F00
+0F000F000F000F000F000F000F001F001F001E001E001E001E001E003C003C003C003C00
+780078007800F000F001E001E003C0038007800F000E001C0038007000E000C00010437C
+B11B>I<0000038000000000038000000000038000000000038000000000038000000000
+038000000000038000000000038000000000038000000000038000000000038000000000
+038000000000038000000000038000000000038000000000038000000000038000000000
+03800000000003800000000003800000000003800000000003800000FFFFFFFFFFFCFFFF
+FFFFFFFCFFFFFFFFFFFC0000038000000000038000000000038000000000038000000000
+038000000000038000000000038000000000038000000000038000000000038000000000
+038000000000038000000000038000000000038000000000038000000000038000000000
+038000000000038000000000038000000000038000000000038000000000038000002E2F
+7CA737>43 D<003FC00000FFF00003E07C0007C03E000F801F000F000F001E0007801E00
+07803E0007C03E0007C07C0003E07C0003E07C0003E07C0003E07C0003E0FC0003F0FC00
+03F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC00
+03F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F07C0003E07C0003E07C0003E07E00
+07E03E0007C03E0007C03E0007C01F000F800F000F000F801F0007C03E0003F0FC0000FF
+F000003FC0001C2D7DAB23>48 D<000C00003C00007C0003FC00FFFC00FC7C00007C0000
+7C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000
+7C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000
+7C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000FE007FFFFE7F
+FFFE172C7AAB23>I<007F800001FFF0000780FC000E003F001C001F8038000FC070000F
+C0600007E0F00007E0FC0007F0FE0007F0FE0003F0FE0003F0FE0003F07C0007F0000007
+F0000007F0000007E000000FE000000FC000001FC000001F8000003F0000007E0000007C
+000000F8000001F0000003E0000007C000000F8000001E0000003C00000078000000F000
+3000E0003001C0003003800060070000600E0000E01FFFFFE03FFFFFE07FFFFFC0FFFFFF
+C0FFFFFFC01C2C7DAB23>I<003FC00001FFF00007C0FC000E007E001C003F001C001F80
+3F001FC03F001FC03F800FC03F000FC03F000FC00C001FC000001FC000001F8000001F80
+00003F0000003E0000007C000000F8000003F00000FFC00000FFF0000000FC0000003F00
+00001F8000001FC000000FC000000FE000000FE0000007F0000007F0380007F07C0007F0
+FE0007F0FE0007F0FE0007F0FE000FE0F8000FE060000FC070001FC038001F801E003F00
+0780FC0001FFF000007FC0001C2D7DAB23>I<00000E0000000E0000001E0000003E0000
+003E0000007E000000FE000000FE000001BE000003BE0000033E0000063E00000E3E0000
+0C3E0000183E0000383E0000303E0000603E0000E03E0000C03E0001803E0003803E0003
+003E0006003E000E003E000C003E0018003E0038003E0030003E0060003E00E0003E00FF
+FFFFFCFFFFFFFC00003E0000003E0000003E0000003E0000003E0000003E0000003E0000
+003E0000003E0000007F00001FFFFC001FFFFC1E2D7EAC23>I<0C0001800FC01F800FFF
+FF000FFFFE000FFFFC000FFFF0000FFFC0000C7E00000C0000000C0000000C0000000C00
+00000C0000000C0000000C0000000C0000000C1FC0000C7FF8000DE07C000F801F000F00
+1F800E000F800C0007C0000007E0000007E0000003E0000003F0000003F0000003F00000
+03F0780003F0FC0003F0FC0003F0FC0003F0FC0003F0F80007E0E00007E0600007C07000
+0FC038000F801C001F000E003E000780F80001FFE000007F80001C2D7DAB23>I<0003F8
+00000FFE00003E078000F8018001F007C003E00FC007C00FC00F800FC00F800FC01F0007
+801F0000003E0000003E0000007E0000007E0000007C0000007C0FC000FC3FF000FCF07C
+00FDC01E00FF800F00FF000F80FF0007C0FE0007E0FE0007E0FE0003E0FC0003F0FC0003
+F0FC0003F0FC0003F07C0003F07C0003F07C0003F07E0003F07E0003F03E0003E03E0007
+E01E0007E01F0007C00F000F8007801F0003C03E0001E07C00007FF000001FC0001C2D7D
+AB23>I<300000003C0000003FFFFFF83FFFFFF83FFFFFF07FFFFFF07FFFFFE0700001C0
+6000018060000380C0000700C0000E00C0000C0000001C00000038000000300000007000
+0000E0000001C0000001C00000038000000380000007000000070000000F0000000E0000
+001E0000001E0000003E0000003E0000003E0000003C0000007C0000007C0000007C0000
+007C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0000
+00FC0000007800001D2E7CAC23>I<001FC00000FFF00003E07C0007801E000F000F001E
+0007801E0007803C0003C03C0003C03C0003C03C0003C03E0003C03E0007C03F0007801F
+C00F801FE00F001FF81E000FFC3C0007FFF80003FFE00000FFE000003FF80000FFFC0003
+C7FF000783FF801F00FFC01E003FC03C001FE07C0007E0780003F0F80003F0F00001F0F0
+0000F0F00000F0F00000F0F00000F0F80000E0780001E07C0001C03C0003C01E0007800F
+800F0007E03C0001FFF000003FC0001C2D7DAB23>I<38FEFEFEFEFE3800000000000000
+000000000000000038FEFEFEFEFE38071D7A9C14>58 D<38FEFEFEFEFE38000000000000
+00000000000000000038FCFEFEFEFE3E060606060E0C0C1C1838706060072A7A9C14>I<
+7FFFFFFFFFF8FFFFFFFFFFFCFFFFFFFFFFFC000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000FFFFFFFFFFFCFFFFFFFFFFFC
+7FFFFFFFFFF82E137C9937>61 D<00FF0007FFE01F01F83800FC70007E60003EF8003FFC
+003FFC003FFC003FFC003F30003F00007E00007E0000FC0001F80003E00003C000078000
+0F00000F00000E00001C00001C0000180000180000180000180000180000180000180000
+180000180000000000000000000000000000000000000000000000380000FE0000FE0000
+FE0000FE0000FE00003800182F7CAE21>63 D<003F00F800FFC3FE03E1FF1E07807C1E0F
+807C0C1F003E001F003E003E001F003E001F003E001F003E001F003E001F003E001F003E
+001F001F003E001F003E000F807C00078078000FE1F0000CFFC0001C3F00001C0000001C
+0000001C0000001E0000001F0000000FFFF8000FFFFF0007FFFFC00FFFFFF01E0007F83C
+0000F87800007CF800007CF000003CF000003CF000003CF000003CF800007C7C0000F83E
+0001F01F0003E007E01F8001FFFE00003FF0001F2D7E9D23>103
+D<07C0FFC0FFC00FC007C007C007C007C007C007C007C007C007C007C007C007C007C007
+C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007
+C007C007C007C007C007C007C007C00FE0FFFEFFFE0F2E7EAD14>108
+D<001FE000007FF80001F03E0003C00F00078007800F0003C01F0003E03E0001F03E0001
+F07C0000F87C0000F87C0000F8FC0000FCFC0000FCFC0000FCFC0000FCFC0000FCFC0000
+FCFC0000FCFC0000FCFC0000FC7C0000F87C0000F83E0001F03E0001F01F0003E01F0003
+E00F8007C007C00F8001F03E00007FF800001FE0001E207E9E23>111
+D E /Fw 1 4 df<7FFFFFFFFFFFFFE0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF0FFFFFFFF
+FFFFFFF0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0
+F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000
+000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0
+F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000
+000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0
+F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000
+000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0
+F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000
+000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0
+F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000
+000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0
+F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000
+000000F0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE0
+3C3E7BBD47>3 D E /Fx 167[53 7[40 2[65 44 6[44 3[53 65[{}6
+72.999954 /Times-Roman rf /Fy 69[33 10[42 42 3[33 47[33
+37 37 54 37 37 21 29 25 37 37 37 37 58 21 37 21 21 37
+37 25 33 37 33 37 33 3[25 1[25 1[54 54 71 54 54 46 42
+50 54 42 54 54 66 46 1[29 25 54 54 42 46 54 50 50 54
+5[21 1[37 37 37 37 37 37 37 37 37 37 1[19 25 19 42 1[25
+25 25 39[{}74 75.000000 /Times-Roman rf /Fz 134[37 37
+2[42 25 29 33 42 42 37 42 62 21 2[21 42 37 25 33 42 33
+1[37 12[50 1[54 58 46 58 5[29 2[46 50 54 2[54 1[37 15[21
+47[{}32 75.000000 /Times-Bold rf /FA 14 64 df<1E007F80FFC0FFC0FFC0FFC0FF
+C0FFC0FFC0FFC0FFC07F807F807F807F807F807F807F807F807F807F803F003F003F003F
+003F003F003F003F003F003F001E001E001E001E001E001E001E001E001E001E000C000C
+000C000C000C000000000000000000000000000000000000001E007F807F80FFC0FFC0FF
+C0FFC07F807F801E000A4179C019>33 D<0000300000700000E00001C000038000070000
+0F00001E00003C00003C0000780000F00000F00001E00001E00003C00003C00007C00007
+80000F80000F80000F00001F00001F00001E00003E00003E00003E00003C00007C00007C
+00007C00007C00007C00007C0000780000F80000F80000F80000F80000F80000F80000F8
+0000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F8000078
+00007C00007C00007C00007C00007C00007C00003C00003E00003E00003E00001E00001F
+00001F00000F00000F80000F800007800007C00003C00003C00001E00001E00000F00000
+F000007800003C00003C00001E00000F000007000003800001C00000E000007000003014
+5A77C323>40 D<C00000E000007000003800001C00000E00000F000007800003C00003C0
+0001E00000F00000F000007800007800003C00003C00003E00001E00001F00001F00000F
+00000F80000F800007800007C00007C00007C00003C00003E00003E00003E00003E00003
+E00003E00001E00001F00001F00001F00001F00001F00001F00001F00001F00001F00001
+F00001F00001F00001F00001F00001F00001F00001F00001F00001E00003E00003E00003
+E00003E00003E00003E00003C00007C00007C00007C0000780000F80000F80000F00001F
+00001F00001E00003E00003C00003C0000780000780000F00000F00001E00003C00003C0
+000780000F00000E00001C0000380000700000E00000C00000145A7BC323>I<00000006
+000000000000000F000000000000000F000000000000000F000000000000000F00000000
+0000000F000000000000000F000000000000000F000000000000000F000000000000000F
+000000000000000F000000000000000F000000000000000F000000000000000F00000000
+0000000F000000000000000F000000000000000F000000000000000F000000000000000F
+000000000000000F000000000000000F000000000000000F000000000000000F00000000
+0000000F000000000000000F000000000000000F000000000000000F000000000000000F
+000000007FFFFFFFFFFFFFE0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE0
+0000000F000000000000000F000000000000000F000000000000000F000000000000000F
+000000000000000F000000000000000F000000000000000F000000000000000F00000000
+0000000F000000000000000F000000000000000F000000000000000F000000000000000F
+000000000000000F000000000000000F000000000000000F000000000000000F00000000
+0000000F000000000000000F000000000000000F000000000000000F000000000000000F
+000000000000000F000000000000000F000000000000000F000000000000000F00000000
+00000006000000003C3C7BB447>43 D<0001FE0000000FFFC000003F03F000007C00F800
+00F8007C0001F0003E0003E0001F0007C0000F8007C0000F800FC0000FC01F800007E01F
+800007E01F800007E03F800007F03F800007F03F000003F07F000003F87F000003F87F00
+0003F87F000003F87F000003F87F000003F8FF000003FCFF000003FCFF000003FCFF0000
+03FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003
+FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FC
+FF000003FCFF000003FC7F000003F87F000003F87F000003F87F000003F87F000003F83F
+800007F03F800007F03F800007F01F800007E01F800007E01F800007E00FC0000FC00FC0
+000FC007E0001F8003E0001F0001F0003E0000F8007C00007C00F800003F03F000000FFF
+C0000001FE0000263F7DBC2D>48 D<0000C0000003C0000007C000001FC000007FC00007
+FFC000FFFFC000FF9FC000F81FC000001FC000001FC000001FC000001FC000001FC00000
+1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000
+1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000
+1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000
+1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000
+1FC000001FC000001FC000001FC000001FC000001FC000001FC000007FF000FFFFFFF8FF
+FFFFF8FFFFFFF81D3D78BC2D>I<0007FC0000003FFF800000FFFFE00001F01FF8000780
+03FC000F0001FE000E0000FF001C00007F803800007FC03000003FC07000003FE0600000
+1FE06000001FE0FE00001FF0FF00001FF0FF80001FF0FF80000FF0FF80000FF0FF80000F
+F0FF80001FF07F00001FF01C00001FF00000001FE00000001FE00000003FE00000003FC0
+0000003FC00000007F800000007F80000000FF00000000FE00000001FC00000003F80000
+0003F000000007E00000000FC00000001F800000003F000000003E000000007C00000000
+F800000001F000000003E000000007C00000000F800000001F000030001E000030003C00
+0030007800003000F000006001E0000060038000006007000000600E000000E00FFFFFFF
+E01FFFFFFFE03FFFFFFFE07FFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0243D7CBC2D
+>I<0007FC0000003FFF800000F80FE00001C003F800078001FC000E0000FE000C0000FF
+001C00007F801F80007F803FC0007FC03FE0003FC03FE0003FC03FE0003FC03FE0003FC0
+3FE0003FC01FC0007FC00700007FC00000007F800000007F800000007F00000000FF0000
+0000FE00000001FE00000001FC00000003F800000007E00000000FC00000003F0000001F
+FC0000001FFF800000000FE000000003F800000001FC00000000FE000000007F00000000
+7F800000003FC00000003FC00000003FE00000003FE00000001FE00000001FF00000001F
+F00C00001FF03F00001FF07F80001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0001FF0
+FFC0003FE0FF80003FE07F00003FC07000003FC07000007F803800007F801C0000FF000F
+0001FE0007C003FC0003F80FF00000FFFFE000003FFF80000007FC0000243F7CBC2D>I<
+0000000E000000000E000000001E000000003E000000003E000000007E00000000FE0000
+0000FE00000001FE00000003FE000000037E000000067E0000000E7E0000000C7E000000
+187E000000387E000000307E000000607E000000E07E000000C07E000001807E00000380
+7E000003007E000006007E00000E007E00000C007E000018007E000038007E000030007E
+000060007E0000E0007E0000C0007E000180007E000380007E000300007E000600007E00
+0E00007E000C00007E001800007E003800007E003000007E006000007E00E000007E00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FE00000000FE00000000FE00000000FE000000
+00FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000
+FE00000001FF000001FFFFFF0001FFFFFF0001FFFFFF283E7EBD2D>I<00001FE0000000
+FFF8000003F01E00000FC00700001F000380003E000180007C000FC000F8001FC001F800
+3FC003F0003FC003F0003FC007E0003FC00FE0001F800FC0000F001FC00000001FC00000
+001F800000003F800000003F800000003F800000007F800000007F000000007F01FE0000
+7F07FF8000FF0E03E000FF1C01F000FF3800FC00FF70007E00FF60003E00FFE0003F00FF
+C0001F80FFC0001FC0FF80001FC0FF80001FE0FF80000FE0FF80000FE0FF00000FF0FF00
+000FF0FF00000FF0FF00000FF0FF00000FF07F00000FF07F00000FF07F00000FF07F0000
+0FF07F00000FF07F80000FF03F80000FF03F80000FE03F80000FE01F80000FE01F80001F
+C01FC0001FC00FC0001F800FC0003F8007E0003F0003F0007E0001F800FC0000FC01F800
+007E07F000003FFFE000000FFF80000003FC0000243F7CBC2D>54
+D<1E007F807F80FFC0FFC0FFC0FFC07F807F801E00000000000000000000000000000000
+00000000000000000000000000000000000000000000001E007F807F80FFC0FFC0FFC0FF
+C07F807F801E000A2779A619>58 D<1E007F807F80FFC0FFC0FFC0FFC07F807F801E0000
+000000000000000000000000000000000000000000000000000000000000000000000000
+001E007F00FF80FF80FFC0FFC0FFC0FFC07FC01EC000C000C000C000C001C00180018001
+8003800300070006000E000C001C003800300030000A3979A619>I<7FFFFFFFFFFFFFE0
+FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE0000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000007FFFFFFFFFFFFFE0
+FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE03C167BA147>61
+D<001FF80000FFFF0003E01FC00F0007F01C0003F8380001FC700001FE600000FEFC0000
+FFFE0000FFFF0000FFFF0000FFFF0000FFFF0000FF7E0000FF3C0000FF000001FE000001
+FE000003FC000007F8000007F000000FC000001F8000003F0000003E0000007C00000078
+000000F8000000F0000000E0000001E0000001C0000001C0000001800000038000000380
+000003000000030000000300000003000000030000000300000003000000030000000300
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000078000001FE000001FE000003FF000003FF000003FF000003FF000001FE000001FE0
+000007800020407BBF2B>63 D E /FB 8 104 df<FFFFFFFFFFC0FFFFFFFFFFC0FFFFFF
+FFFFC02A037A9137>0 D<38FEFEFEFEFE3807077A9314>I<000C0000001E0000001E0000
+001E0000001E0000001E0000601E0180781E0780FC0C0FC07F0C3F803F8C7F0007CCF800
+01FFE000007F8000001E0000007F800001FFE00007CCF8003F8C7F007F0C3F80FC0C0FC0
+781E0780601E0180001E0000001E0000001E0000001E0000001E0000000C00001A1D7C9E
+23>3 D<00000000000E000000000000000E000000000000000E000000000000000F0000
+000000000007000000000000000780000000000000038000000000000003C00000000000
+0001C000000000000001E000000000000000F00000000000000078000000000000007C00
+0000000000003E000000000000000F0000000000000007C0FFFFFFFFFFFFFFF8FFFFFFFF
+FFFFFFFCFFFFFFFFFFFFFFF800000000000007C00000000000000F000000000000003E00
+0000000000007C000000000000007800000000000000F000000000000001E00000000000
+0001C000000000000003C000000000000003800000000000000780000000000000070000
+00000000000F000000000000000E000000000000000E000000000000000E00003E237CA1
+47>33 D<000000000E000000000000000F00000000000000070000000000000007800000
+00000000038000000000000003C000000000000001E000000000000000F0000000000000
+0078000000000000003C00007FFFFFFFFFFE0000FFFFFFFFFFFF0000FFFFFFFFFFFF8000
+000000000003C000000000000001F0000000000000007C000000000000003F0000000000
+00000FE000000000000003FC00000000000001FC00000000000007E00000000000001F80
+0000000000007C00000000000000F800000000000001E000000000000007C000FFFFFFFF
+FFFF8000FFFFFFFFFFFE00007FFFFFFFFFFC000000000000007800000000000000700000
+0000000000F000000000000001E000000000000003C00000000000000380000000000000
+078000000000000007000000000000000F000000000000000E0000003E277CA347>41
+D<003800FE00FE00FE00FE01FE01FC01FC03F803F803F803F007F007F007E007E00FC00F
+C00FC01F801F801F801F003F003E003E003E007C007C007C007800F800F800F0000F227E
+A413>48 D<00001F0000FF0003F0000FC0001F80001F00003F00003E00003E00003E0000
+3E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0000
+3E00003E00003E00003E00003E00007E00007C0000FC0001F80003F0007FC000FF00007F
+C00003F00001F80000FC00007C00007E00003E00003E00003E00003E00003E00003E0000
+3E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0000
+3E00003E00003F00001F00001F80000FC00003F00000FF00001F18437BB123>102
+D<FC0000FF80000FE00001F00000FC00007C00007E00003E00003E00003E00003E00003E
+00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E
+00003E00003E00003E00003E00001F00001F80000F800007E00001FE00007F0001FE0007
+E0000F80001F80001F00003E00003E00003E00003E00003E00003E00003E00003E00003E
+00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E
+00007E00007C0000FC0001F0000FE000FF8000FC000018437BB123>I
+E /FC 7 106 df<7FFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFE
+3804799847>0 D<000FFC0000003FFF000000FFFFC00003FFFFF00007FFFFF8000FFFFF
+FC001FFFFFFE003FFFFFFF003FFFFFFF007FFFFFFF807FFFFFFF807FFFFFFF80FFFFFFFF
+C0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0
+FFFFFFFFC0FFFFFFFFC07FFFFFFF807FFFFFFF807FFFFFFF803FFFFFFF003FFFFFFF001F
+FFFFFE000FFFFFFC0007FFFFF80003FFFFF00000FFFFC000003FFF0000000FFC00002222
+7BA72D>15 D<000000000001E0000000000000000001F0000000000000000000F0000000
+000000000000F8000000000000000000780000000000000000007C000000000000000000
+3E0000000000000000003E0000000000000000001F0000000000000000000F8000000000
+0000000007C0000000000000000007E0000000000000000003E0000000000000000001F0
+00007FFFFFFFFFFFFFFC0000FFFFFFFFFFFFFFFE0000FFFFFFFFFFFFFFFF00007FFFFFFF
+FFFFFFFF80000000000000000007E0000000000000000003F0000000000000000001FC00
+00000000000000007F0000000000000000001FC000000000000000000FF8000000000000
+000003FF000000000000000003FF00000000000000000FF800000000000000001FC00000
+0000000000007F000000000000000001FC000000000000000003F0000000000000000007
+E0007FFFFFFFFFFFFFFF8000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFE00007FFFFFFF
+FFFFFFFC000000000000000001F0000000000000000003E0000000000000000007E00000
+00000000000007C000000000000000000F8000000000000000001F000000000000000000
+3E0000000000000000003E0000000000000000007C000000000000000000780000000000
+00000000F8000000000000000000F0000000000000000001F0000000000000000001E000
+000050327BAF5B>41 D<0000003F000003FF00000FE000003F8000007E000001FC000001
+F8000003F0000003F0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E000000FE000000FC000001FC000003F8000003F000000FE
+000003F800007FE00000FF0000007FE0000003F8000000FE0000003F0000003F8000001F
+C000000FC000000FE0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E0000003F0000003F0000001F8000001FC0000007E000000
+3F8000000FE0000003FF0000003F205B7AC32D>102 D<FC000000FFC0000007F0000001
+FC0000007E0000003F8000001F8000000FC000000FC0000007E0000007E0000007E00000
+07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000
+07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000
+07E0000007E0000007E0000007E0000007E0000007E0000007E0000007F0000003F00000
+03F8000001FC000000FC0000007F0000001FC0000007FE000000FF000007FE00001FC000
+007F000000FC000001FC000003F8000003F0000007F0000007E0000007E0000007E00000
+07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000
+07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000
+07E0000007E0000007E0000007E0000007E0000007E0000007E000000FC000000FC00000
+1F8000003F8000007E000001FC000007F00000FFC00000FC000000205B7AC32D>I<0000
+600000F00001F00001F00001E00003E00003E00003C00007C00007C0000F80000F80000F
+00001F00001F00001E00003E00003E00007C00007C0000780000F80000F80000F00001F0
+0001F00001E00003E00003E00007C00007C0000780000F80000F80000F00001F00001F00
+003E00003E00003C00007C00007C0000780000F80000F80000F80000F800007800007C00
+007C00003C00003E00003E00001F00001F00000F00000F80000F800007800007C00007C0
+0003E00003E00001E00001F00001F00000F00000F80000F800007800007C00007C00003E
+00003E00001E00001F00001F00000F00000F80000F800007C00007C00003C00003E00003
+E00001E00001F00001F00000F0000060145A77C323>I<600000F00000F80000F8000078
+00007C00007C00003C00003E00003E00001F00001F00000F00000F80000F800007800007
+C00007C00003E00003E00001E00001F00001F00000F00000F80000F800007800007C0000
+7C00003E00003E00001E00001F00001F00000F00000F80000F800007C00007C00003C000
+03E00003E00001E00001F00001F00001F00001F00001E00003E00003E00003C00007C000
+07C0000F80000F80000F00001F00001F00001E00003E00003E00007C00007C0000780000
+F80000F80000F00001F00001F00001E00003E00003E00007C00007C0000780000F80000F
+80000F00001F00001F00003E00003E00003C00007C00007C0000780000F80000F80000F0
+0000600000145A7BC323>I E /FD 81[45 51[35 40 40 61 40
+45 25 35 35 45 45 45 45 66 25 40 25 25 45 45 25 40 45
+40 45 45 9[76 56 1[51 45 56 66 56 66 1[76 51 61 40 30
+66 66 56 56 66 61 56 56 6[30 45 45 45 45 1[45 45 45 45
+45 2[30 23 44[{}60 91.249977 /Times-Italic rf /FE 134[33
+1[48 1[37 22 26 29 1[37 33 37 55 18 2[18 37 1[22 29 37
+29 37 14[37 83[{}19 66.666664 /Times-Bold rf /FF 134[33
+33 48 33 33 18 26 22 33 33 33 33 52 18 33 18 18 33 33
+22 29 33 29 33 29 3[22 1[22 5[48 41 37 44 1[37 48 48
+59 41 1[26 22 2[37 41 48 44 44 48 1[29 1[37 1[18 1[33
+33 33 33 33 33 33 33 33 33 1[17 22 17 2[22 22 2[55 3[22
+33[{}64 66.666664 /Times-Roman rf /FG 135[86 3[57 1[76
+1[96 1[96 4[48 96 2[76 96 2[86 29[124 115 124 9[86 86
+86 86 86 86 86 49[{}20 172.833374 /Times-Bold rf /FH
+31 121 df<00001FF0000001FFFC000007FFFF00001FFFFFC0007F801FE000FC0007E001
+E00001E003C00000000700000000070000000006000000000E000000000C000000000C00
+0000000E0000000006000000000700000000038FFF000001FFFF800001FF1F0000039FFE
+00000700E000000E000000001C00000000380000000070000000006000000000E0000000
+00C000000000C000000000C000000000C000000000C000000000C000000600E000000E00
+F000001C0078000038007C0000F0003F8007E0001FFFFFC00007FFFF000001FFFC000000
+7FE00000232B7DA82A>34 D<1E007F807F80FFC0FFC0FFC0FFC07F807F801E000A0A7989
+19>58 D<1E007F80FF80FFC0FFC0FFE0FFE0FFE07FE01E60006000600060006000E000C0
+00C000C001C001800380030007000E001C001800380030000B1C798919>I<0000000000
+00060000000000001F0000000000007F000000000001FF000000000007FC00000000001F
+F000000000007FC00000000001FF000000000007FC00000000003FF00000000000FFC000
+00000003FF00000000000FFC00000000003FE00000000000FF800000000003FE00000000
+000FF800000000007FE00000000001FF800000000007FE00000000001FF800000000007F
+C00000000001FF000000000007FC00000000001FF000000000007FC00000000000FF0000
+00000000FF0000000000007FC000000000001FF0000000000007FC000000000001FF0000
+000000007FC000000000001FF8000000000007FE000000000001FF8000000000007FE000
+000000000FF8000000000003FE000000000000FF8000000000003FE000000000000FFC00
+0000000003FF000000000000FFC000000000003FF0000000000007FC000000000001FF00
+00000000007FC000000000001FF0000000000007FC000000000001FF0000000000007F00
+00000000001F00000000000006383679B147>I<000000018000000003C000000007C000
+000007C000000007800000000F800000000F800000000F000000001F000000001F000000
+001E000000003E000000003E000000003C000000007C000000007C000000007800000000
+F800000000F800000000F000000001F000000001F000000001E000000003E000000003E0
+00000003C000000007C000000007C000000007800000000F800000000F800000001F0000
+00001F000000001E000000003E000000003E000000003C000000007C000000007C000000
+007800000000F800000000F800000000F000000001F000000001F000000001E000000003
+E000000003E000000003C000000007C000000007C000000007800000000F800000000F80
+0000000F000000001F000000001F000000001E000000003E000000003E000000007C0000
+00007C000000007800000000F800000000F800000000F000000001F000000001F0000000
+01E000000003E000000003E000000003C000000007C000000007C000000007800000000F
+800000000F800000000F000000001F000000001F000000001E000000003E000000003E00
+0000003C000000007C000000007C000000007800000000F800000000F800000000F00000
+00006000000000225B7BC32D>I<60000000000000F8000000000000FE000000000000FF
+8000000000003FE000000000000FF8000000000003FE000000000000FF8000000000003F
+E000000000000FFC000000000003FF000000000000FFC000000000003FF0000000000007
+FC000000000001FF0000000000007FC000000000001FF0000000000007FE000000000001
+FF8000000000007FE000000000001FF8000000000003FE000000000000FF800000000000
+3FE000000000000FF8000000000003FE000000000000FF000000000000FF000000000003
+FE00000000000FF800000000003FE00000000000FF800000000003FE00000000001FF800
+000000007FE00000000001FF800000000007FE00000000001FF000000000007FC0000000
+0001FF000000000007FC00000000003FF00000000000FFC00000000003FF00000000000F
+FC00000000003FE00000000000FF800000000003FE00000000000FF800000000003FE000
+00000000FF800000000000FE000000000000F800000000000060000000000000383679B1
+47>I<0000000000030000000000000007000000000000000F000000000000000F000000
+000000001F000000000000003F000000000000003F000000000000007F80000000000000
+7F80000000000000FF80000000000001FF80000000000001FF800000000000037F800000
+000000037F800000000000067F8000000000000E7F8000000000000C7F80000000000018
+7FC00000000000187FC00000000000307FC00000000000703FC00000000000603FC00000
+000000C03FC00000000000C03FC00000000001803FC00000000003803FC0000000000300
+3FC00000000006003FC00000000006003FE0000000000C003FE0000000001C001FE00000
+000018001FE00000000030001FE00000000030001FE00000000060001FE0000000006000
+1FE000000000C0001FE00000000180001FE00000000180001FF00000000300001FF00000
+000300000FF000000007FFFFFFF00000000FFFFFFFF00000000FFFFFFFF0000000180000
+0FF00000001800000FF00000003000000FF00000006000000FF00000006000000FF80000
+00C000000FF8000000C000000FF800000180000007F800000300000007F8000003000000
+07F800000600000007F800000600000007F800000C00000007F800001C00000007F80000
+3800000007F800007800000007FC0000FC00000007FC0007FE0000001FFE00FFFFE00007
+FFFFFCFFFFE00007FFFFFCFFFFE00007FFFFF83E417DC044>65 D<000000001FF8000300
+000001FFFF00070000000FFFFFC00E0000003FF007E01E000000FF8000F03E000003FC00
+00387E00000FF000001CFC00001FE000000FFC00007F8000000FFC0000FF00000007FC00
+01FE00000003F80003FC00000003F8000FF800000001F8001FF000000001F8001FE00000
+0001F0003FC000000000F0007F8000000000F000FF8000000000F001FF0000000000E001
+FE0000000000E003FE0000000000E007FC0000000000E007FC0000000000C00FF8000000
+0000C00FF80000000000C01FF00000000000C01FF00000000000003FF00000000000003F
+E00000000000003FE00000000000007FE00000000000007FC00000000000007FC0000000
+0000007FC0000000000000FFC0000000000000FF80000000000000FF80000000000000FF
+80000000000000FF80000000000000FF80000000000000FF00000000000000FF00000000
+001C00FF00000000001C00FF00000000001800FF00000000001800FF00000000003800FF
+00000000003000FF000000000070007F800000000060007F8000000000E0007F80000000
+01C0003F800000000180003FC00000000380003FC00000000700001FE00000000E00000F
+E00000001C00000FF000000038000007F800000070000003FC000001E0000001FE000003
+C0000000FF00000F800000003FC0003E000000001FF803F80000000007FFFFE000000000
+00FFFF8000000000001FF80000000040427BBF41>67 D<0001FFFFFFFFF800000001FFFF
+FFFFFF00000001FFFFFFFFFFC000000001FF00003FF000000001FF00000FF800000001FE
+000003FC00000001FE000000FE00000001FE0000007F00000003FE0000003F80000003FC
+0000003F80000003FC0000001FC0000003FC0000001FC0000007FC0000000FE0000007F8
+0000000FE0000007F80000000FF0000007F80000000FF000000FF800000007F000000FF0
+00000007F000000FF000000007F000000FF000000007F800001FF000000007F800001FE0
+00000007F800001FE000000007F800001FE00000000FF800003FE00000000FF800003FC0
+0000000FF800003FC00000000FF800003FC00000000FF000007FC00000000FF000007F80
+0000001FF000007F800000001FF000007F800000001FF00000FF800000001FE00000FF00
+0000003FE00000FF000000003FE00000FF000000003FC00001FF000000007FC00001FE00
+0000007FC00001FE000000007F800001FE00000000FF800003FE00000000FF000003FC00
+000000FF000003FC00000001FE000003FC00000001FC000007FC00000003FC000007F800
+000003F8000007F800000007F0000007F80000000FF000000FF80000001FE000000FF000
+00001FC000000FF00000003F8000000FF00000007F0000001FF0000000FE0000001FE000
+0001FC0000001FE0000007F80000003FE000000FE00000003FE000003FC00000003FC000
+01FF000000007FC0000FFC000000FFFFFFFFFFF0000000FFFFFFFFFFC0000000FFFFFFFF
+FC00000000453E7DBD4B>I<0001FFFFFFFFFFFFC00001FFFFFFFFFFFFC00001FFFFFFFF
+FFFFC0000001FF000001FFC0000001FF0000001FC0000001FE0000000FC0000001FE0000
+0007C0000001FE0000000780000003FE0000000380000003FC0000000380000003FC0000
+000380000003FC0000000380000007FC0000000380000007F80000000380000007F80000
+000300000007F8000000030000000FF8000000030000000FF0000300030000000FF00003
+00030000000FF0000700070000001FF0000600060000001FE0000600000000001FE0000E
+00000000001FE0000E00000000003FE0001C00000000003FC0001C00000000003FC0003C
+00000000003FC001FC00000000007FFFFFF800000000007FFFFFF800000000007FFFFFF8
+00000000007F8001F80000000000FF8000F00000000000FF0000700000000000FF000070
+0000000000FF0000700000000001FF0000600000000001FE0000600000000001FE000060
+000C000001FE0000E0001C000003FE0000C00018000003FC0000C00038000003FC000000
+0030000003FC0000000030000007FC0000000070000007F80000000060000007F8000000
+00E0000007F800000000C000000FF800000001C000000FF0000000038000000FF0000000
+038000000FF0000000078000001FF00000000F0000001FE00000001F0000001FE0000000
+3E0000003FE00000007E0000003FE0000000FC0000003FC0000007FC0000007FC000007F
+FC0000FFFFFFFFFFFFF80000FFFFFFFFFFFFF80000FFFFFFFFFFFFF00000423E7DBD43>
+I<0001FFFFFFFFFFFF0001FFFFFFFFFFFF0001FFFFFFFFFFFF000001FF000003FF000001
+FF0000007F000001FE0000003F000001FE0000001F000001FE0000001E000003FE000000
+0E000003FC0000000E000003FC0000000E000003FC0000000E000007FC0000000E000007
+F80000000E000007F80000000C000007F80000000C00000FF80000000C00000FF0000000
+0C00000FF00006000C00000FF0000E001C00001FF0000C001800001FE0000C000000001F
+E0000C000000001FE0001C000000003FE00018000000003FC00038000000003FC0007800
+0000003FC000F8000000007FC003F0000000007FFFFFF0000000007FFFFFF0000000007F
+FFFFF000000000FF8003E000000000FF0001E000000000FF0000E000000000FF0000E000
+000001FF0000C000000001FE0000C000000001FE0000C000000001FE0001C000000003FE
+00018000000003FC00018000000003FC00018000000003FC00000000000007FC00000000
+000007F800000000000007F800000000000007F80000000000000FF80000000000000FF0
+0000000000000FF00000000000000FF00000000000001FF00000000000001FE000000000
+00001FE00000000000003FE00000000000003FE00000000000003FC00000000000007FE0
+0000000000FFFFFFF800000000FFFFFFF800000000FFFFFFF800000000403E7DBD3A>I<
+0001FFFFFFC00003FFFFFFC00003FFFFFFC0000001FF8000000001FF0000000001FE0000
+000001FE0000000001FE0000000003FE0000000003FC0000000003FC0000000003FC0000
+000007FC0000000007F80000000007F80000000007F8000000000FF8000000000FF00000
+00000FF0000000000FF0000000001FF0000000001FE0000000001FE0000000001FE00000
+00003FE0000000003FC0000000003FC0000000003FC0000000007FC0000000007F800000
+00007F80000000007F8000000000FF8000000000FF0000000000FF0000000000FF000000
+0001FF0000000001FE0000000001FE0000000001FE0000000003FE0000000003FC000000
+0003FC0000000003FC0000000007FC0000000007F80000000007F80000000007F8000000
+000FF8000000000FF0000000000FF0000000000FF0000000001FF0000000001FE0000000
+001FE0000000003FE0000000003FE0000000003FC000000000FFE0000000FFFFFFE00000
+FFFFFFE00000FFFFFFE000002A3E7DBD28>73 D<0001FFFF00000000003FFFF00001FFFF
+80000000003FFFE00001FFFF80000000007FFFE0000001FF8000000000FFE000000001FF
+8000000000FFC000000001BF8000000001BF8000000001BF80000000033F80000000019F
+C0000000037F80000000039FC0000000067F80000000031FC00000000C7F00000000031F
+C00000000C7F00000000031FC000000018FF00000000071FC000000030FF00000000061F
+C000000030FE00000000060FE000000060FE00000000060FE0000000C1FE000000000E0F
+E0000000C1FE000000000C0FE000000181FC000000000C0FE000000181FC000000000C0F
+E000000303FC000000001C0FE000000603FC000000001807F000000603F8000000001807
+F000000C03F8000000001807F000001807F8000000003807F000001807F8000000003007
+F000003007F0000000003007F000006007F0000000003007F00000600FF0000000007003
+F80000C00FF0000000006003F80001800FE0000000006003F80001800FE0000000006003
+F80003001FE000000000E003F80003001FE000000000C003F80006001FC000000000C001
+FC000C001FC000000000C001FC000C003FC000000001C001FC0018003FC0000000018001
+FC0030003F80000000018001FC0030003F80000000018001FC0060007F80000000038001
+FC00C0007F80000000030000FE00C0007F00000000030000FE0180007F00000000030000
+FE030000FF00000000070000FE030000FF00000000060000FE060000FE00000000060000
+FE0C0000FE00000000060000FE0C0001FE000000000E00007F180001FE000000000C0000
+7F180001FC000000000C00007F300001FC000000000C00007F600003FC000000001C0000
+7F600003FC000000001800007FC00003F8000000001800007F800003F800000000380000
+3F800007F8000000007800003F000007F800000000FC00003E000007F000000003FE0000
+3E00000FF8000000FFFFF8003C001FFFFFF80000FFFFF80038001FFFFFF80000FFFFF800
+18001FFFFFF000005C3E7DBD58>77 D<0001FFFF800000FFFFF80001FFFF800000FFFFF0
+0001FFFF800000FFFFF0000000FFC0000007FE00000001FFC0000001F000000001BFE000
+0001E000000001BFE0000000C0000000019FF0000001C0000000039FF0000001C0000000
+030FF800000180000000030FF8000001800000000307F8000003800000000707FC000003
+800000000607FC000003000000000603FE000003000000000603FE000007000000000E01
+FF000007000000000C01FF000006000000000C00FF000006000000000C00FF80000E0000
+00001C00FF80000E0000000018007FC0000C0000000018007FC0000C0000000018003FE0
+001C0000000038003FE0001C0000000030001FE000180000000030001FF0001800000000
+30000FF000380000000070000FF800380000000060000FF8003000000000600007FC0030
+00000000600007FC007000000000E00003FC007000000000C00003FE006000000000C000
+01FE006000000000C00001FF00E000000001C00001FF00E000000001800000FF80C00000
+0001800000FF80C0000000018000007F81C0000000038000007FC1C0000000030000003F
+C180000000030000003FE180000000030000003FE380000000070000001FF38000000006
+0000001FF300000000060000000FFB00000000060000000FFF000000000E00000007FF00
+0000000C00000007FE000000000C00000007FE000000000C00000003FE000000001C0000
+0003FE000000001800000001FC000000001800000001FC000000003800000000FC000000
+007800000000FC00000000FC000000007800000003FE0000000078000000FFFFF8000000
+78000000FFFFF800000038000000FFFFF8000000300000004D3E7DBD49>I<000000003F
+F0000000000003FFFF00000000001FC03FC0000000007E0007E000000001F80001F80000
+0007E00000FC0000000FC000007E0000003F0000003F0000007E0000001F800000FC0000
+001FC00003F80000000FC00007F00000000FE0000FE00000000FE0001FC000000007F000
+1FC000000007F0003F8000000007F8007F0000000007F800FF0000000007F801FE000000
+0003F801FE0000000003F803FC0000000003FC03FC0000000003FC07F80000000003FC0F
+F80000000007FC0FF00000000007FC1FF00000000007FC1FF00000000007FC1FE0000000
+0007FC3FE00000000007FC3FE00000000007F87FC0000000000FF87FC0000000000FF87F
+C0000000000FF87FC0000000000FF8FF80000000001FF0FF80000000001FF0FF80000000
+001FF0FF80000000003FE0FF80000000003FE0FF80000000003FE0FF00000000007FC0FF
+00000000007FC0FF0000000000FF80FF0000000000FF80FF0000000000FF00FF00000000
+01FE00FF0000000003FE00FF0000000003FC00FF0000000007F8007F8000000007F8007F
+800000000FF0007F800000001FE0003F800000001FC0003F800000003F80001FC0000000
+7F00001FC0000000FE00000FE0000001FC00000FE0000003F8000007F0000007E0000003
+F800001FC0000001FC00003F80000000FE0000FE000000003F8003F8000000000FE01FE0
+0000000003FFFF0000000000007FF0000000003E427BBF45>I<0001FFFFFFFFF0000000
+01FFFFFFFFFF00000001FFFFFFFFFFC000000001FF00007FE000000001FF00000FF80000
+0001FE000003FC00000001FE000001FC00000003FE000001FE00000003FE000000FF0000
+0003FC000000FF00000003FC000000FF00000007FC000000FF00000007FC000000FF8000
+0007F8000000FF80000007F8000000FF8000000FF8000000FF8000000FF8000001FF0000
+000FF0000001FF0000000FF0000001FF0000001FF0000001FE0000001FF0000003FE0000
+001FE0000003FC0000001FE0000007FC0000003FE0000007F80000003FE000000FF00000
+003FC000001FE00000003FC000003FC00000007FC000007F800000007FC00000FE000000
+007F800003FC000000007F80003FF000000000FFFFFFFFC000000000FFFFFFFC00000000
+00FF0000000000000000FF0000000000000001FF0000000000000001FF00000000000000
+01FE0000000000000001FE0000000000000003FE0000000000000003FE00000000000000
+03FC0000000000000003FC0000000000000007FC0000000000000007FC00000000000000
+07F80000000000000007F8000000000000000FF8000000000000000FF800000000000000
+0FF0000000000000000FF0000000000000001FF0000000000000001FF000000000000000
+1FE0000000000000001FE0000000000000003FE0000000000000003FE000000000000000
+3FC0000000000000007FE0000000000000FFFFFFE00000000000FFFFFFE00000000000FF
+FFFFE00000000000413E7DBD3A>I<0001FFFFFFFF8000000001FFFFFFFFF800000001FF
+FFFFFFFF0000000001FF0001FF8000000001FF00003FE000000001FE00000FF000000001
+FE000007F800000001FE000003FC00000003FE000003FC00000003FC000001FE00000003
+FC000001FE00000003FC000001FE00000007FC000001FF00000007F8000001FF00000007
+F8000001FF00000007F8000001FF0000000FF8000003FE0000000FF0000003FE0000000F
+F0000003FE0000000FF0000007FC0000001FF0000007FC0000001FE000000FF80000001F
+E000000FF00000001FE000001FE00000003FE000003FC00000003FC000007F800000003F
+C00000FE000000003FC00003FC000000007FC0000FF0000000007F8000FF80000000007F
+FFFFFC00000000007FFFFFF80000000000FF8001FE0000000000FF00007F8000000000FF
+00001FC000000000FF00001FE000000001FF00000FF000000001FE000007F000000001FE
+000007F000000001FE000007F800000003FE000007F800000003FC000007F800000003FC
+000007F800000003FC00000FF800000007FC00000FF800000007F800000FF800000007F8
+00000FF000000007F800001FF00000000FF800001FF00000000FF000001FF00000000FF0
+00001FF00000000FF000001FF00000001FF000003FF00000001FE000003FF00180001FE0
+00003FE00180003FE000003FE00380003FE000003FE00300003FC000001FE00700007FE0
+00001FE00600FFFFFFE0000FF00E00FFFFFFE00007F01C00FFFFFFE00003F87800000000
+000000FFE0000000000000003F800041407DBD45>82 D<00000007FC000C0000003FFF80
+1C000000FFFFE038000003F803F07800000FE00078F800001F80003DF800003F00001FF0
+00007E00000FF00000FC000007F00001F8000007F00001F0000003E00003F0000003E000
+07E0000001E00007E0000001E0000FE0000001C0000FC0000001C0000FC0000001C0000F
+C0000001C0001FC000000180001FC000000180001FC000000180001FE000000180001FE0
+00000000001FF000000000001FF800000000001FFE00000000000FFFC0000000000FFFFC
+0000000007FFFFC000000007FFFFF800000003FFFFFE00000001FFFFFF00000000FFFFFF
+800000003FFFFFC000000007FFFFE000000000FFFFE0000000000FFFF00000000000FFF0
+00000000003FF000000000001FF800000000000FF8000000000007F8000000000007F800
+0000000003F8000600000003F8000E00000003F8000E00000003F0000C00000003F0000C
+00000003F0001C00000007F0001C00000007E0001C00000007E0001C0000000FC0003C00
+00000FC0003E0000001F80003E0000001F80003F0000003F00007F0000007E00007F8000
+00FC00007FC00001F800007DE00003F00000F8F8000FE00000F03F803F800000E01FFFFE
+000000E007FFF8000000C0007FC000000036427BBF38>I<01FFFFFFFFFFFFFC01FFFFFF
+FFFFFFFC03FFFFFFFFFFFFFC03FE0003FE0007FC03F00003FC0000FC07C00003FC000078
+07800007FC00007807000007FC0000380F000007F80000380E000007F80000381C00000F
+F80000381C00000FF80000381800000FF00000303800000FF00000303000001FF0000030
+3000001FF00000307000001FE00000306000001FE00000306000003FE0000070E000003F
+E0000060C000003FC00000600000003FC00000000000007FC00000000000007FC0000000
+0000007F800000000000007F80000000000000FF80000000000000FF80000000000000FF
+00000000000000FF00000000000001FF00000000000001FF00000000000001FE00000000
+000001FE00000000000003FE00000000000003FE00000000000003FC00000000000003FC
+00000000000007FC00000000000007FC00000000000007F800000000000007F800000000
+00000FF80000000000000FF80000000000000FF00000000000000FF00000000000001FF0
+0000000000001FF00000000000001FE00000000000001FE00000000000003FE000000000
+00003FE00000000000003FC00000000000003FC00000000000007FC00000000000007FC0
+000000000000FFC0000000000001FFE0000000001FFFFFFFFC0000001FFFFFFFFC000000
+1FFFFFFFF80000003E3D7FBC35>I<00007FFFFF8007FFFFC00000FFFFFF8007FFFFC000
+00FFFFFF8007FFFFC0000001FFF800007FF0000000007FE000003F80000000007FC00000
+3E00000000003FC000003C00000000003FE000003800000000003FE00000700000000000
+1FF00000C000000000001FF000018000000000000FF800038000000000000FF800070000
+000000000FF8000E00000000000007FC001C00000000000007FC003800000000000003FE
+003000000000000003FE006000000000000003FE00C000000000000001FF018000000000
+000001FF030000000000000000FF860000000000000000FF8C0000000000000000FF9C00
+000000000000007FF800000000000000007FF000000000000000003FE000000000000000
+003FE000000000000000003FE000000000000000001FF000000000000000001FF0000000
+00000000000FF800000000000000001FF800000000000000003FF8000000000000000067
+FC0000000000000000C7FC0000000000000001C3FE000000000000000383FE0000000000
+00000703FE000000000000000E01FF000000000000001C01FF000000000000003800FF80
+0000000000003000FF800000000000006000FF80000000000000C0007FC0000000000001
+80007FC000000000000300003FE000000000000600003FE000000000000C00003FE00000
+0000001C00001FF000000000003800001FF000000000007000000FF80000000000E00000
+0FF80000000001C000000FF8000000000380000007FC000000000780000007FC00000000
+1F80000003FE000000003F80000007FE00000003FFC000001FFF0000007FFFFC0001FFFF
+FE0000FFFFFC0003FFFFFE0000FFFFF80003FFFFFE00004A3E7EBD4B>88
+D<FFFFFF800001FFFF80FFFFFF800001FFFF80FFFFFF800001FFFF8001FFE00000003FF0
+0000FFC00000001F8000007FC00000001F0000007FC00000001C0000007FC00000003800
+00003FE0000000300000003FE0000000600000001FF0000000C00000001FF0000001C000
+00001FF0000003800000000FF8000003000000000FF8000006000000000FF800000C0000
+000007FC0000180000000007FC0000380000000007FC0000700000000003FE0000600000
+000003FE0000C00000000003FF0001800000000001FF0003000000000001FF0006000000
+000000FF800E000000000000FF801C000000000000FF80180000000000007FC030000000
+0000007FC0600000000000007FC0C00000000000003FE1C00000000000003FE380000000
+0000003FF3000000000000001FF6000000000000001FFC000000000000000FF800000000
+0000000FF8000000000000000FF0000000000000000FF0000000000000000FE000000000
+0000001FE0000000000000001FE0000000000000001FE0000000000000001FC000000000
+0000003FC0000000000000003FC0000000000000003FC0000000000000003F8000000000
+0000007F80000000000000007F80000000000000007F80000000000000007F0000000000
+000000FF0000000000000000FF0000000000000000FF0000000000000001FE0000000000
+000001FE0000000000000001FE0000000000000003FF00000000000007FFFFFE00000000
+0007FFFFFE000000000007FFFFFE0000000000413E7DBD35>I<00003F00000001FFC000
+0003E0E0E0000F8073F0001F003BF0007E001FF000FC001FE001F8000FE001F8000FE003
+F0000FE007F0000FC00FE0000FC00FE0000FC01FC0001FC01FC0001F803F80001F803F80
+001F803F80003F807F80003F007F00003F007F00003F007F00007F00FF00007E00FE0000
+7E00FE00007E00FE0000FE00FE0000FC03FE0000FC03FC0000FC03FC0001FC07FC0001F8
+067C0001F8067C0003F8067E0007F80E3E000FF80C3E001DF81C1F0038F8180F0070F838
+07C1E07C7003FF803FE0007E000F8028297CA730>97 D<001FC000000FFFC000000FFF80
+00000FFF800000003F800000003F800000003F000000003F000000007F000000007F0000
+00007E000000007E00000000FE00000000FE00000000FC00000000FC00000001FC000000
+01FC00000001F800000001F800000003F800000003F800000003F000000003F03F000007
+F0FFC00007F3C1F00007E700F80007EE007C000FFC007E000FF8003E000FF0003F000FE0
+003F001FC0003F001FC0003F001F80003F801F80003F803F80003F803F80003F803F0000
+3F803F00003F807F00007F807F00007F007E00007F007E00007F007E0000FF00FE0000FE
+00FC0000FE00FC0000FE00FC0001FC00FC0001FC00FC0001F800FC0003F800F80003F000
+F80007F000FC0007E0007C000FC0007C001F80007C001F00003E003E00001E007C00001F
+00F800000F83E0000003FF80000000FE00000021407CBE27>I<00000FE00000007FFC00
+0001F81E000007C00700001F800380003F0001C0007E000FC000FC003FC001F8003FC003
+F0003FC007F0003F8007E0003F800FE0003F001FC00000001FC00000003FC00000003F80
+0000003F800000007F800000007F000000007F000000007F00000000FF00000000FE0000
+0000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000C07E000000
+C07E000001C07E000003803E000007003F00000E001F00003C000F8000700007C003E000
+03E01F800000FFFC0000003FE0000022297CA727>I<00003FC0000001FFF0000007E03C
+00001F801E00003F000E0000FC000F0001F800070003F800070007F00007000FE0000F00
+0FC0000E001FC0000E001F80001E003F80003C003F800078007F0003F0007F003FC000FF
+FFFE0000FFFFE00000FE00000000FE00000000FE00000000FE00000000FC00000000FC00
+000000FC00000000FC00000000FC00000000FC00000000FC00000180FC000001807C0000
+03807C000007007E00000E003E00001C003F000078001F0000E0000F8007C00007C03F00
+0001FFF80000007FC0000021297BA72A>101 D<00003C0000FE0000FE0001FE0001FE00
+01FE0001FC00007000000000000000000000000000000000000000000000000000000000
+0000000000000000000000007E0001FF800387C00703C00E03E00C03E01C03E01807E038
+07E03007E0700FE0600FC0600FC0E01FC0E01F80001F80003F80003F00007F00007E0000
+7E0000FE0000FC0000FC0001FC0001F80003F80603F00603F00607F00E07E00C07E00C07
+E01C07C01807C03807C07007C06007C0E003E3C001FF00007C00173E7EBC1F>105
+D<00000001C000000007F000000007F00000000FF00000000FF00000000FF00000000FE0
+000000038000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+03E00000000FF80000003C3E000000701E000000E01F000001C01F000003801F80000700
+1F800006001F80000E003F80000C003F00001C003F000018003F000038007F000038007F
+000000007E000000007E00000000FE00000000FE00000000FC00000000FC00000001FC00
+000001FC00000001F800000001F800000003F800000003F800000003F000000003F00000
+0007F000000007F000000007E000000007E00000000FE00000000FE00000000FC0000000
+0FC00000001FC00000001FC00000001F800000001F800000003F800000003F800000003F
+000000003F000000007F000000007E000000007E00001C00FE00007F00FC0000FF01FC00
+00FF01F80000FF03F00000FF07E00000FE0FC00000F81F800000703E0000003FF8000000
+0FE0000000245081BC25>I<0001FC00000000FFFC00000000FFF800000000FFF8000000
+0003F80000000003F80000000003F00000000003F00000000007F00000000007F0000000
+0007E00000000007E0000000000FE0000000000FE0000000000FC0000000000FC0000000
+001FC0000000001FC0000000001F80000000001F80000000003F80000000003F80000000
+003F00000000003F0000FC00007F0003FE00007F000F0780007E003C0F80007E00703F80
+00FE00E03F8000FE01C07F8000FC03807F8000FC07007F8001FC0E007F0001FC1C001C00
+01F83800000001F87000000003F8E000000003F9C000000003F38000000003FF00000000
+07FF0000000007FFF000000007E3FE00000007E07F8000000FE01FC000000FE00FE00000
+0FC007E000000FC007F000001FC003F000001FC003F006001F8003F006001F8003F00600
+3F8003F00E003F8007F00C003F0007E00C003F0007E01C007F0007E018007F0007E01800
+7E0003E038007E0003E07000FE0001E06000FE0001F1E000FC00007F80003800003E0000
+29407CBE2F>I<01F0000FF0000007FC003FFE0000061F00F01F00000E1F03C00F80001C
+0F87000FC000180F8E0007C000380FDC0007E000300FF80007E000300FF00007E000701F
+E00007E000601FE00007E000601FC00007E000601FC00007E000E01F80000FE000E03F80
+000FC000003F00000FC000003F00000FC000003F00001FC000007F00001F8000007E0000
+1F8000007E00003F8000007E00003F000000FE00003F000000FC00007F000000FC00007E
+000000FC00007E000001FC0000FE018001F80000FC018001F80000FC018001F80001FC03
+8003F80001F8030003F00001F8030003F00001F8070003F00001F0060007F00001F00E00
+07E00001F01C0007E00001F0180007E00001F038000FE00000F8F0000FC000007FC00003
+8000001F000031297EA737>110 D<0007C000FC00000FF003FF00001C7C0F07C000383C
+1C03E000703E3801F000603E7001F800E03FE000F800C03FC000FC00C03F8000FC00C07F
+0000FC01C07E0000FC01807E0000FE01807E0000FE0380FE0000FE0380FE0000FE0000FC
+0000FE0000FC0000FE0001FC0001FE0001FC0001FC0001F80001FC0001F80001FC0003F8
+0003FC0003F80003F80003F00003F80003F00003F80007F00007F00007F00007F00007E0
+0007E00007E0000FE0000FE0000FC0000FE0001FC0000FC0001F80000FE0003F00001FE0
+007E00001FE0007C00001FF000F800001FB001F000003FB803E000003F9E0F8000003F07
+FE0000003F01F80000007F00000000007F00000000007E00000000007E0000000000FE00
+00000000FE0000000000FC0000000000FC0000000001FC0000000001FC0000000001F800
+00000001F80000000003F80000000003F800000000FFFFE0000000FFFFE0000000FFFFE0
+0000002F3A84A72E>112 D<0001F8003F00000FFE00FFE0001E0F81C0F0007807C380F8
+00E003C703F800C003EE03F801C003EC07F8038003FC07F8070003F807F8060003F807F0
+060003F801C00E0003F000000C0003F000001C0007F000001C0007F00000000007E00000
+000007E0000000000FE0000000000FC0000000000FC0000000000FC0000000001FC00000
+00001F80000000001F80000000001F80000000003F80000000003F0000C000003F0000C0
+00003F0000C000007F0001C01E007F0001803F007E0003807F80FE0003007F80FE000700
+FF81FE000E00FF019F001C00FE039F0038007C070F807000381E07C1E0001FF801FF8000
+07E0007E00002D297EA734>120 D E /FI 81[51 51[40 45 45
+66 45 51 30 35 40 1[51 45 51 76 25 51 1[25 51 45 30 40
+51 40 51 45 10[66 1[61 51 66 1[56 71 2[61 2[35 1[71 56
+61 66 66 61 66 6[30 45 45 45 45 45 45 45 45 45 45 1[23
+30 45[{}53 91.249977 /Times-Bold rf /FJ 134[45 45 1[45
+45 25 35 30 2[45 45 4[25 45 1[30 40 3[40 11[66 56 6[81
+11[66 7[45 3[45 3[45 49[{.167 SlantFont}21 91.249977
+/Times-Roman rf /FK 187[72 68[{}1 100.000000 /Times-Roman
+rf /FL 172[44 4[58 4[27 58 2[49 3[58 65[{}6 79.999924
+/Times-Roman rf /FM 81[115 51[92 103 103 149 1[115 69
+80 92 1[115 103 115 172 57 115 1[57 115 103 69 92 115
+92 115 103 10[149 1[138 115 149 1[126 161 2[138 2[80
+1[161 126 1[149 149 138 149 6[69 12[69 45[{}40 207.333359
+/Times-Bold rf /FN 47[100 85[44 50 50 1[50 55 33 39 44
+1[55 50 55 83 28 55 1[28 55 50 33 44 55 44 55 50 11[72
+66 55 72 78 61 78 72 94 66 2[39 1[78 1[66 72 72 66 72
+6[33 1[50 1[50 50 50 50 50 50 2[25 33 25 44[{}52 100.000000
+/Times-Bold rf /FO 81[66 51[53 60 60 86 60 66 40 47 53
+1[66 60 66 100 33 66 1[33 66 60 40 53 66 53 66 60 9[120
+86 86 80 66 86 93 73 93 86 113 80 2[47 2[73 80 86 86
+80 86 7[60 60 60 60 60 60 60 60 60 2[30 40 45[{}55 119.999947
+/Times-Bold rf /FP 47[91 7[30 5[30 7[40 8[45 1[51 51
+3[40 47[40 45 45 66 45 45 25 35 30 45 45 45 45 71 25
+45 25 25 45 45 30 40 45 40 45 40 3[30 1[30 56 66 66 86
+66 66 56 51 61 66 51 66 66 81 56 66 35 30 66 66 51 56
+66 61 61 66 1[40 1[51 1[25 25 45 45 45 45 45 45 45 45
+45 45 25 23 30 23 51 1[30 30 30 1[76 37[{}85 91.249977
+/Times-Roman rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 1766 2310 a FP(Copyright)1905 2536 y(by)1739
+2762 y(Dinesh)24 b(Das)1859 2988 y(1995)p eop
+%%Page: 2 2
+2 1 bop 766 391 a FO(Making)30 b(Database)f(Optimizers)h(Mor)n(e)g
+(Extensible)1905 806 y FP(by)1314 1126 y FN(Dinesh)25
+b(Das,)g(B.T)-9 b(ech.,)26 b(M.S.C.S.)1693 1966 y(Dissertation)1031
+2192 y FP(Presented)f(to)f(the)f(Faculty)i(of)e(the)h(Graduate)h
+(School)f(of)1333 2418 y(The)f(University)j(of)d(T)-6
+b(exas)24 b(at)f(Austin)1571 2644 y(in)h(Partial)g(Ful\256llment)1581
+2870 y(of)g(the)g(Requirements)1638 3096 y(for)g(the)g(Degree)g(of)1502
+3416 y FN(Doctor)h(of)g(Philosophy)1097 4256 y FO(The)30
+b(University)g(of)g(T)-11 b(exas)29 b(at)g(Austin)1764
+4576 y FP(May)24 b(1995)p eop
+%%Page: 3 3
+3 2 bop 766 1041 a FO(Making)30 b(Database)f(Optimizers)h(Mor)n(e)g
+(Extensible)2017 2423 y FN(Appr)n(oved)d(by)2017 2536
+y(Dissertation)e(Committee:)p 2017 2900 1583 4 v 2017
+3136 V 2017 3372 V 2017 3609 V 2017 3845 V eop
+%%Page: 4 4
+4 3 bop 1982 1180 a FM(Acknowledgments)299 1681 y FP(I)23
+b(am)f(deeply)i(indebted)i(to)c(my)h(advisor)l(,)i(Don)d(Batory)-6
+b(,)24 b(for)f(many)g(years)h(of)f(encouragement)j(and)e(ad-)300
+1851 y(vice,)29 b(for)f(providing)i(constant)g(direction)g(and)e(focus)
+h(to)f(my)f(research,)j(and)e(for)g(reading)i(countless)300
+2020 y(drafts)25 b(of)e(my)g(dissertation.)34 b(I)23
+b(am)g(a)g(much)h(better)h(researcher)h(because)f(of)f(his)g(excellent)
+h(guidance.)576 2190 y(I)16 b(am)f(also)i(thankful)i(to)d(my)g
+(committee)h(members,)i(Professors)f(Don)e(Fussell,)i(Dan)e(Miranker)l
+(,)300 2359 y(and)27 b(A)-7 b(vi)27 b(Silberschatz,)j(and,)d
+(especially)-6 b(,)30 b(to)d(Dr)-5 b(.)40 b(Jos)2065
+2358 y(\302)2060 2359 y(e)27 b(Blakeley)h(for)f(their)h(meticulous)h
+(reading)f(of)300 2528 y(my)23 b(dissertation)k(and)d(probing)h
+(questions.)583 2698 y(T)-6 b(o)25 b(my)g(friends)j(Eleonora)f(Drakou,)
+g(G.)d(Neelakantan)k(Kartha,)f(Sharad)f(Mehrotra,)i(Rajeev)299
+2867 y(Rastogi,)23 b(Probal)g(Shome,)f(Nandit)h(Soparkar)l(,)h(Thomas)f
+(W)-7 b(oo,)22 b(and)h(Y)-9 b(ogesh)23 b(W)-7 b(agle,)23
+b(I)f(owe)g(a)g(special)295 3036 y(round)f(of)e(thanks)i(for)f(the)f
+(many)h(hours)g(of)f(late-night)j(philosophizing,)j(pleasant)c
+(conservations,)j(and)297 3206 y(perspective)f(on)e(life.)30
+b(V)-5 b(ivek)21 b(Singhal,)g(Jef)n(f)h(Thomas,)f(and)g(Millie)g(V)-5
+b(illareal)21 b(provided)i(a)d(very)h(enjoy-)300 3375
+y(able)28 b(working)g(environment.)44 b(Finally)-6 b(,)29
+b(my)d(parents)j(were)e(a)g(constant)i(source)f(of)f(support)i(and)f
+(en-)300 3545 y(couragement.)580 3714 y(This)20 b(research)i(was)e
+(supported)j(in)d(part)h(by)f(grants)i(from)e(The)g(University)i(of)f
+(T)-6 b(exas)20 b(Applied)300 3883 y(Research)25 b(Laboratories,)h
+(Schlumber)n(ger)l(,)g(and)e(Digital)g(Equipment)h(Corporation.)3052
+4525 y FK(D)t FL(I)t(N)t(E)t(S)t(H)33 b FK(D)t FL(A)t(S)350
+4889 y FJ(The)23 b(University)i(of)f(T)-6 b(exas)23 b(at)h(Austin)350
+5058 y(May)f(1995)1915 5349 y FP(iv)p eop
+%%Page: 5 5
+5 4 bop 766 571 a FO(Making)30 b(Database)f(Optimizers)h(Mor)n(e)g
+(Extensible)1181 1033 y FP(Publication)c(No.)p 1774 1035
+945 4 v 1613 1439 a(Dinesh)e(Das,)f(Ph.D.)1220 1608 y(The)g(University)
+i(of)f(T)-6 b(exas)23 b(at)h(Austin,)f(1995)1512 2014
+y(Supervisor:)33 b(Don)24 b(Batory)312 2390 y(Query)19
+b(optimizers)i(are)e(fundamental)i(components)g(of)d(database)j
+(management)g(systems)e(\(DBMSs\).)299 2560 y(An)k(optimizer)h
+(consists)h(of)e(three)h(features:)33 b(a)23 b(search)h(space,)g(a)f
+(cost)g(model,)h(and)f(a)g(search)h(strategy)-6 b(.)299
+2729 y(The)23 b(experience)j(of)c(many)h(researchers)j(has)e(shown)f
+(that)h(hard-wiring)h(these)f(features)h(results)f(in)f(an)300
+2898 y(optimizer)i(that)f(is)g(very)g(in\257exible)h(and)f(dif)n
+(\256cult)h(to)f(modify)-6 b(.)583 3068 y(Rule-based)34
+b(optimizers)f(have)f(been)g(developed)j(to)c(alleviate)i(some)f(of)f
+(the)g(problems)i(of)300 3237 y(monolithic)c(optimizers.)42
+b(Unfortunately)-6 b(,)30 b(contemporary)g(rule-based)f(optimizers)g
+(do)d(not)h(provide)297 3406 y(enough)c(support)g(to)d(enable)j
+(database)g(implementors)g(\(DBI\))d(to)h(fully)h(realize)g(the)f
+(potential)i(of)e(open)300 3576 y(systems.)31 b(W)-7
+b(e)23 b(have)h(identi\256ed)g(four)g(requirements)i(that)e(a)e
+(rule-based)k(optimizer)f(should)g(satisfy)g(to)296 3745
+y(address)c(these)g(needs.)31 b(First,)20 b(rules)h(should)g(be)f
+(speci\256ed)h(using)g(high-level)i(abstractions,)h(insulating)296
+3914 y(the)d(DBI)d(from)j(underlying)i(implementation)g(details.)31
+b(Second,)21 b(rule)g(sets)g(should)g(be)g(easily)g(extensi-)298
+4084 y(ble,)g(with)h(a)f(minimum)g(of)g(reprogramming)j(required.)32
+b(Third,)22 b(rule)g(sets)g(should)h(be)f(easily)g(recon\256g-)297
+4253 y(urable,)g(that)g(is,)e(changeable)k(to)d(meet)g(a)f(variety)i
+(of)f(user)g(needs,)i(interfaces,)g(database)g(schemas,)f(etc.)300
+4423 y(Fourth,)28 b(rule-based)i(optimizers)f(should)g(be)e(fast,)h
+(that)g(is,)g(performance)h(should)g(not)f(be)f(sacri\256ced)300
+4592 y(for)d(the)g(sake)g(of)f(high-level)k(speci\256cations.)578
+4761 y(In)19 b(this)h(dissertation,)j(we)18 b(describe)j(Prairie,)f(an)
+f(environment)j(for)d(specifying)i(rules)f(for)f(rule-)300
+4931 y(based)26 b(optimizers)h(that)e(satis\256es)h(all)f(four)g(of)g
+(the)g(above)h(requirements.)38 b(The)24 b(Prairie)h(speci\256cation)
+294 5100 y(language)20 b(is)d(presented)k(and)d(we)f(show)h(how)f(it)h
+(allows)g(a)f(DBI)g(to)g(design)j(an)d(easily)i(extensible)i(rule)d
+(set)1927 5349 y(v)p eop
+%%Page: 6 6
+6 5 bop 300 391 a FP(for)25 b(a)f(rule-based)k(optimizer)-5
+b(.)36 b(Experimental)27 b(results)g(are)e(presented)i(using)f(the)f(T)
+-6 b(exas)25 b(Instruments)298 561 y(Open)d(OODB)d(optimizer)24
+b(rule)e(set)g(to)g(validate)h(the)f(claim)g(of)g(good)h(performance)h
+(using)f(Prairie.)31 b(Fi-)299 730 y(nally)-6 b(,)23
+b(a)f(building)i(blocks)g(approach)h(of)d(constructing)k(rule)d(sets)g
+(is)f(presented;)j(this)e(results)h(in)e(easily)300 899
+y(recon\256gurable)28 b(rule)e(sets)f(whose)h(features)h(are)e
+(changeable)j(simply)e(by)f(assembling)i(the)f(blocks)g(in)300
+1069 y(various)f(ways.)1915 5349 y(vi)p eop
+%%Page: 7 7
+7 6 bop 2808 1056 a FM(Contents)300 1591 y FI(Acknowledgments)2517
+b(iv)300 1795 y(Abstract)2918 b(v)300 1999 y(List)23
+b(of)h(T)-8 b(ables)2733 b(x)300 2203 y(List)23 b(of)h(Figur)n(es)2666
+b(xi)300 2407 y(Chapter)23 b(1)91 b(Intr)n(oduction)2281
+b(1)436 2520 y FP(1.1)96 b(Overview)28 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)
+g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)167 b FP(1)436
+2633 y(1.2)96 b(Related)25 b(W)-7 b(ork)26 b FH(:)46
+b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g
+(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)167
+b FP(5)645 2745 y(1.2.1)110 b(T)m(raditional)26 b(Query)e(Optimizers)78
+b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g
+(:)f(:)h(:)167 b FP(5)645 2858 y(1.2.2)110 b(Rule-Based)25
+b(Optimizers)g(\320)e(The)g(Next)g(Generation)39 b FH(:)45
+b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)167 b FP(6)436 2971
+y(1.3)96 b(Outline)25 b(of)e(Dissertation)50 b FH(:)45
+b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f
+(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)167 b FP(9)300 3175
+y FI(Chapter)23 b(2)91 b(The)23 b(V)-8 b(olcano)23 b(Optimizer)h
+(Generator)1396 b(10)436 3288 y FP(2.1)96 b(Overview)28
+b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)
+121 b FP(10)436 3401 y(2.2)96 b(De\256nitions)53 b FH(:)46
+b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)124
+b FP(1)m(1)436 3514 y(2.3)96 b(V)-12 b(olcano)25 b(Optimization)h
+(Paradigm)64 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)
+f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(16)436 3627
+y(2.4)96 b(Rules)24 b(in)g(V)-12 b(olcano)50 b FH(:)45
+b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
+(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b
+FP(17)436 3740 y(2.5)96 b(T)m(ransformation)27 b(Rules)88
+b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(18)436
+3853 y(2.6)96 b(Implementation)27 b(Rules)75 b FH(:)45
+b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f
+(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(19)436 3965
+y(2.7)96 b(Support)25 b(Functions)71 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)
+f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
+(:)h(:)g(:)f(:)h(:)121 b FP(21)436 4078 y(2.8)96 b(Drawbacks)25
+b(of)f(V)-12 b(olcano)55 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)
+g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(21)645 4191 y(2.8.1)110 b(Explicit)25 b(vs.)31 b(Implicit)24
+b(Rules)52 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(22)645 4304 y(2.8.2)110
+b(Property)25 b(Representation)i(and)d(T)m(ransformation)32
+b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(23)436 4417 y(2.9)96 b(Summary)32 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)
+g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(25)300
+4621 y FI(Chapter)23 b(3)91 b(Prairie:)32 b(A)23 b(Language)g(for)h
+(Rule)f(Speci\256cation)1061 b(26)436 4734 y FP(3.1)96
+b(Overview)28 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
+(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)
+h(:)g(:)f(:)h(:)121 b FP(26)436 4847 y(3.2)96 b(Notation)25
+b(and)f(Assumptions)54 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(27)436 4960 y(3.3)96 b(Prairie)25 b(Optimization)g(Paradigm)48
+b FH(:)d(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)
+g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(31)436 5073 y(3.4)96
+b(Rules)24 b(in)g(Prairie)32 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)
+f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
+(:)h(:)g(:)f(:)h(:)121 b FP(32)1902 5349 y(vii)p eop
+%%Page: 8 8
+8 7 bop 436 391 a FP(3.5)96 b(T)m(ransformation)27 b(Rules)88
+b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(33)436
+504 y(3.6)96 b(Implementation)27 b(Rules)75 b FH(:)45
+b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f
+(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(35)645 617
+y(3.6.1)110 b(The)23 b(Null)h(Algorithm)75 b FH(:)46
+b(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)121 b FP(38)436 730 y(3.7)96 b(Advantages)26
+b(of)e(Prairie)88 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f
+(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(39)436 843 y(3.8)96 b(Summary)32 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)
+g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(40)300
+1047 y FI(Chapter)23 b(4)91 b(The)23 b(Prairie-to-V)-8
+b(olcano)26 b(Pr)n(epr)n(ocessor)1308 b(41)436 1160 y
+FP(4.1)96 b(Overview)28 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g
+(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)
+g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(41)436 1273 y(4.2)96
+b(Correspondence)28 b(of)23 b(Elements)h(in)g(Prairie)g(and)g(V)-12
+b(olcano)60 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(42)645 1386 y(4.2.1)110 b(Operators,)25 b(Algorithms,)g(and)f
+(Enforcers)68 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g
+(:)f(:)h(:)121 b FP(42)645 1498 y(4.2.2)110 b(Operator)25
+b(T)m(rees)f(and)g(Access)g(Plans)j FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(44)645
+1611 y(4.2.3)110 b(Descriptors)26 b(and)e(Properties)51
+b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
+(:)h(:)g(:)f(:)h(:)121 b FP(45)436 1724 y(4.3)96 b(T)m(ranslating)26
+b(T)-8 b(-rules)51 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)
+121 b FP(48)436 1837 y(4.4)96 b(T)m(ranslating)26 b(I-rules)69
+b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(51)645 1950 y(4.4.1)110 b(T)m(ranslating)26 b(Enforcers)87
+b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g
+(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(54)436 2063 y(4.5)96
+b(Rule)24 b(Compaction)31 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)
+g(:)f(:)h(:)121 b FP(56)436 2176 y(4.6)96 b(Summary)32
+b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)
+121 b FP(60)300 2380 y FI(Chapter)23 b(5)91 b(Performance)25
+b(Results)1917 b(61)436 2493 y FP(5.1)96 b(Overview)28
+b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)
+121 b FP(61)436 2606 y(5.2)96 b(A)23 b(Centralized)j(Relational)f
+(Query)f(Optimizer)43 b FH(:)i(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)121 b FP(62)645 2718 y(5.2.1)110
+b(Programmer)25 b(Productivity)89 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g
+(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(63)645 2831 y(5.2.2)110 b(Generating)26 b(Benchmark)f(Queries)75
+b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f
+(:)h(:)121 b FP(63)645 2944 y(5.2.3)110 b(Performance)26
+b(Results)e(Using)g(the)g(Centralized)i(Optimizer)42
+b FH(:)k(:)f(:)h(:)g(:)f(:)h(:)121 b FP(65)436 3057 y(5.3)96
+b(The)24 b(T)-6 b(exas)23 b(Instruments)j(Open)e(OODB)d(Query)j
+(Optimizer)44 b FH(:)i(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(66)645 3170 y(5.3.1)110 b(Programmer)25 b(Productivity)89
+b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
+(:)h(:)g(:)f(:)h(:)121 b FP(66)645 3283 y(5.3.2)110 b(Generating)26
+b(Benchmark)f(Queries)75 b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)
+h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(67)645 3396
+y(5.3.3)110 b(Performance)26 b(Results)e(Using)g(the)g(Open)f(OODB)f
+(Optimizer)55 b FH(:)45 b(:)h(:)g(:)f(:)h(:)121 b FP(70)436
+3509 y(5.4)96 b(Summary)32 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)
+g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(75)300 3713 y FI(Chapter)23
+b(6)91 b(Recon\256gurable)24 b(Optimizers)1680 b(76)436
+3826 y FP(6.1)96 b(Overview)28 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f
+(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)
+h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(76)436 3938
+y(6.2)96 b(Layered)25 b(Rule-Based)g(Optimizers)63 b
+FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)121 b FP(78)645 4051 y(6.2.1)110
+b(Layers)60 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)
+121 b FP(78)645 4164 y(6.2.2)110 b(Composing)25 b(Layers)42
+b FH(:)k(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)
+h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(80)436 4277
+y(6.3)96 b(Examples)25 b(of)e(Layered)i(Optimizers)30
+b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)121 b FP(82)645 4390 y(6.3.1)110
+b(Example)24 b(Layers)67 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)
+f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(82)645 4503 y(6.3.2)110 b(An)23 b(Optimizer)i(for)e(a)g
+(Centralized)j(Database)89 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)121 b FP(84)645 4616 y(6.3.3)110 b(Another)25
+b(Optimizer)f(for)g(a)f(Centralized)j(Database)43 b FH(:)j(:)f(:)h(:)g
+(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(86)645 4729 y(6.3.4)110
+b(An)23 b(Optimizer)i(for)e(a)g(Distributed)j(Database)i
+FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(87)645 4842 y(6.3.5)110 b(An)23 b(Optimizer)i(for)e(a)g
+(Replicated)j(Database)48 b FH(:)e(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)121 b FP(87)436 4955 y(6.4)96 b(Compacting)26
+b(Layered)e(Optimizers)43 b FH(:)j(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
+(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b
+FP(90)436 5068 y(6.5)96 b(Benchmarking)26 b(Layered)f(Optimizers)94
+b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)121 b FP(93)1889 5349 y(viii)p eop
+%%Page: 9 9
+9 8 bop 436 391 a FP(6.6)96 b(Related)25 b(W)-7 b(ork)26
+b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f
+(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(96)436 504 y(6.7)96 b(Summary)32 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)
+g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(98)300
+708 y FI(Chapter)23 b(7)91 b(Conclusion)2293 b(99)436
+821 y FP(7.1)96 b(Contributions)27 b(of)d(Dissertation)34
+b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(99)436 934 y(7.2)96
+b(Future)25 b(W)-7 b(ork)66 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)
+f(:)h(:)g(:)f(:)h(:)76 b FP(101)436 1047 y(7.3)96 b(Retrospective)30
+b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f
+(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)76
+b FP(104)300 1251 y FI(Appendix)22 b(A)70 b(Complexity)24
+b(of)g(the)f(System)g(R)f(Optimizer)1125 b(106)300 1454
+y(Appendix)22 b(B)75 b(Bene\256ts)23 b(of)g(Rule)g(Compaction)1518
+b(108)300 1658 y(Appendix)22 b(C)70 b(The)22 b(Open)g(OODB)g(Rule)g
+(Set)1601 b(109)300 1862 y(Bibliography)2660 b(1)-5 b(13)300
+2066 y(V)m(ita)3006 b(1)-5 b(19)1915 5349 y FP(ix)p eop
+%%Page: 10 10
+10 9 bop 2414 1056 a FM(List)52 b(of)g(T)-19 b(ables)436
+1584 y FP(2.1)96 b(Operators)26 b(and)e(algorithms)h(in)f(a)f
+(centralized)j(V)-12 b(olcano)25 b(query)g(optimizer)86
+b FH(:)46 b(:)f(:)h(:)121 b FP(13)436 1696 y(2.2)96 b(Properties)26
+b(of)d(nodes)i(in)f(an)f(operator)j(tree)e(in)f(V)-12
+b(olcano)71 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)
+121 b FP(15)436 1809 y(2.3)96 b(Support)25 b(functions)h(in)e(a)f(V)-12
+b(olcano)25 b(optimizer)93 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(22)436 2005 y(3.1)96
+b(Operators)26 b(and)e(algorithms)h(in)f(a)f(centralized)j(Prairie)e
+(query)h(optimizer)69 b FH(:)46 b(:)g(:)f(:)h(:)121 b
+FP(29)436 2118 y(3.2)96 b(Properties)26 b(of)d(nodes)i(in)f(an)f
+(operator)j(tree)e(in)f(Prairie)53 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g
+(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(31)436 2314 y(5.1)96
+b(Queries)25 b(used)f(in)g(benchmarking)j(the)c(Open)h(OODB)d
+(optimizer)41 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(68)1927 5349 y(x)p eop
+%%Page: 11 11
+11 10 bop 2319 1056 a FM(List)51 b(of)h(Figur)l(es)436
+1584 y FP(1.1)96 b(Query)24 b(processing)j(in)c(a)g(database)j(system)
+40 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h
+(:)g(:)f(:)h(:)167 b FP(2)436 1779 y(2.1)96 b(Schematic)25
+b(representation)j(of)23 b(the)h(V)-12 b(olcano)25 b(optimizer)g
+(generator)92 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)121 b
+FP(10)436 1892 y(2.2)96 b(General)25 b(form)e(of)h(a)f(V)-12
+b(olcano)25 b(rule)32 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(17)436 2005 y(2.3)96 b(General)25 b(form)e(of)h(a)f
+(transformation)k(rule)d(in)f(V)-12 b(olcano)89 b FH(:)45
+b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b
+FP(18)436 2118 y(2.4)96 b(Join)25 b(associativity)i(transformation)g
+(rule)e FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)121 b FP(19)436 2231 y(2.5)96
+b(General)25 b(form)e(of)h(an)f(implementation)k(rule)d(in)f(V)-12
+b(olcano)78 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(20)436 2344 y(2.6)96 b(Nested)25 b(loops)f(implementation)j(rule)
+75 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)121 b FP(21)436 2457 y(2.7)96
+b(An)23 b(implicit)i(rule)f(in)f(V)-12 b(olcano)30 b
+FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f
+(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(22)436 2570
+y(2.8)96 b(General)25 b(form)e(of)h(V)-12 b(olcano)25
+b(transformation)i(and)d(implementation)i(rules)h FH(:)46
+b(:)g(:)f(:)h(:)121 b FP(24)436 2766 y(3.1)96 b(Schematic)25
+b(representation)j(of)23 b(the)h(Prairie)g(optimizer)h(paradigm)74
+b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(27)436
+2879 y(3.2)96 b(Example)24 b(of)g(an)f(operator)j(tree)e(and)g(access)h
+(plan)55 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)
+f(:)h(:)121 b FP(30)436 2992 y(3.3)96 b(General)25 b(form)e(of)h(a)f
+(Prairie)h(rule)86 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
+(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b
+FP(32)436 3104 y(3.4)96 b(General)25 b(form)e(of)h(a)f(Prairie)h(T)-8
+b(-rule)78 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f
+(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(33)436 3217
+y(3.5)96 b(Join)25 b(associativity)i(T)-8 b(-rule)80
+b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g
+(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(35)436
+3330 y(3.6)96 b(General)25 b(form)e(of)h(a)f(Prairie)h(I-rule)i
+FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g
+(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(36)436 3443 y(3.7)96
+b(Nested)25 b(loops)f(I-rule)43 b FH(:)j(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)
+g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g
+(:)f(:)h(:)121 b FP(37)436 3556 y(3.8)96 b(Mer)n(ge)25
+b(sort)f(I-rule)50 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f
+(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)
+h(:)121 b FP(37)436 3669 y(3.9)96 b(The)24 b(\252Null\272)g(algorithm)h
+(concept)77 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g
+(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(38)436
+3865 y(4.1)96 b(Identifying)27 b(implicit)e(operators,)h(algorithms,)f
+(and)f(rules)60 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)
+121 b FP(43)436 3978 y(4.2)96 b(General)25 b(expressions)i(in)c(V)-12
+b(olcano,)25 b(Prairie,)f(and)g(P2V)-8 b(-generated)25
+b(speci\256cations)33 b FH(:)121 b FP(45)436 4091 y(4.3)96
+b(Identifying)27 b(operator)f(ar)n(guments)36 b FH(:)45
+b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
+(:)h(:)g(:)f(:)h(:)121 b FP(47)436 4204 y(4.4)96 b(Identifying)27
+b(physical)f(properties)50 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g
+(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(48)436 4317 y(4.5)96 b(T)m(ranslating)26 b(T)-8
+b(-rules)51 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f
+(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(49)436 4430 y(4.6)96 b(T)m(ranslating)26 b(the)e(join)g
+(associativity)j(T)-8 b(-rule)89 b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:)
+g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(50)436
+4542 y(4.7)96 b(T)m(ranslating)26 b(T)-8 b(-rules)24
+b(with)f(enforcer)n(-operator)q(s)98 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)
+f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(51)436 4655
+y(4.8)96 b(T)m(ranslating)26 b(I-rules)69 b FH(:)46 b(:)g(:)f(:)h(:)g
+(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)
+g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(52)436 4768 y(4.9)96
+b(T)m(ranslating)26 b(the)e(nested)h(loops)g(I-rule)61
+b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
+(:)h(:)g(:)f(:)h(:)121 b FP(53)436 4881 y(4.10)51 b(T)m(ranslating)26
+b(I-rules)f(with)e(enforcer)n(-algorith)q(ms)64 b FH(:)46
+b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(55)436 4994 y(4.1)m(1)54 b(Rule)24 b(compaction)52
+b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g
+(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(56)1915 5349 y(xi)p eop
+%%Page: 12 12
+12 11 bop 436 391 a FP(4.12)51 b(Examples)25 b(of)e(rule)h(compaction)j
+FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(58)436 587 y(5.1)96
+b(Benchmarking)26 b(a)e(simple)g(centralized)i(optimizer)74
+b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(64)436 700 y(5.2)96 b(Expressions)27 b(used)d(in)f(generating)k
+(benchmark)e(queries)h(for)d(Open)h(OODB)35 b FH(:)46
+b(:)f(:)h(:)121 b FP(68)436 813 y(5.3)96 b(Benchmarking)26
+b(the)e(Open)g(OODB)d(optimizer)k(\320)e(queries)i(E1)m(1)e(and)h(E12)
+78 b FH(:)46 b(:)f(:)h(:)121 b FP(70)436 926 y(5.4)96
+b(Benchmarking)26 b(the)e(Open)g(OODB)d(optimizer)k(\320)e(queries)i
+(E21)e(and)h(E22)75 b FH(:)46 b(:)f(:)h(:)121 b FP(71)436
+1039 y(5.5)96 b(Benchmarking)26 b(the)e(Open)g(OODB)d(optimizer)k(\320)
+e(queries)i(E31)e(and)h(E32)75 b FH(:)46 b(:)f(:)h(:)121
+b FP(72)436 1152 y(5.6)96 b(Benchmarking)26 b(the)e(Open)g(OODB)d
+(optimizer)k(\320)e(queries)i(E41)e(and)h(E42)75 b FH(:)46
+b(:)f(:)h(:)121 b FP(73)436 1265 y(5.7)96 b(Equivalent)26
+b(expressions)h(in)c(the)h(Open)g(OODB)d(optimizer)74
+b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(74)436 1461 y(6.1)96 b(General)25 b(form)e(of)h(a)f(Prairie)h
+(layer)g(and)g(an)g(example)89 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)121 b FP(79)436 1574 y(6.2)96
+b(The)24 b(Prairie)g(layered)h(optimizer)g(paradigm)84
+b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f
+(:)h(:)121 b FP(81)436 1686 y(6.3)96 b(Example)24 b(layers)36
+b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h
+(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(83)436 1799 y(6.4)96 b(An)23 b(optimizer)i(for)f(a)f(centralized)k
+(database)87 b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)
+f(:)h(:)g(:)f(:)h(:)121 b FP(85)436 1912 y(6.5)96 b(An)23
+b(alternative)k(optimizer)e(for)f(a)f(centralized)j(database)35
+b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(86)436 2025 y(6.6)96 b(An)23 b(optimizer)i(for)f(a)f(distributed)k
+(database)f FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)121 b FP(88)436 2138 y(6.7)96
+b(An)23 b(optimizer)i(for)f(a)f(replicated)j(database)57
+b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g
+(:)f(:)h(:)121 b FP(89)436 2251 y(6.8)96 b(Compacting)26
+b(the)d(layered)j(centralized)g(Prairie)e(rule)g(set)k
+FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121
+b FP(91)436 2364 y(6.9)96 b(T)m(ranslating)26 b(the)e(join)g
+(associativity)j(T)-8 b(-rule)24 b(in)f(the)h(SEQUENTIAL)19
+b(layer)60 b FH(:)46 b(:)f(:)h(:)121 b FP(92)436 2477
+y(6.10)51 b(Benchmarking)26 b(layered)g(optimizers)74
+b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
+(:)h(:)g(:)f(:)h(:)121 b FP(95)436 2673 y(C.1)80 b(V)-12
+b(olcano)25 b(rules)g(for)f(the)f(Open)h(OODB)d(optimizer)30
+b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)
+79 b FP(1)m(10)436 2786 y(C.2)h(Prairie)25 b(rules)f(for)g(the)g(Open)f
+(OODB)e(optimizer)84 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)
+f(:)h(:)g(:)f(:)h(:)82 b FP(1)m(1)m(1)436 2899 y(C.3)e(Comparison)26
+b(of)d(an)h(Open)f(OODB)f(rule)60 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g
+(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)79
+b FP(1)m(12)1902 5349 y(xii)p eop
+%%Page: 1 13
+1 12 bop 2859 1118 a FG(Chapter)44 b(1)2479 1657 y FM(Intr)l(oduction)
+300 2214 y FO(1.1)119 b(Overview)300 2477 y FP(Database)35
+b(management)f(systems)h(\(DBMSs\))d(are)h(basic)h(tools)g(for)g
+(information)i(storage)e(and)g(re-)300 2646 y(trieval.)e(A)23
+b(well-designed)k(and)d(implemented)h(DBMS)d(can)i(not)g(only)g(act)g
+(as)f(a)g(data)i(repository)-6 b(,)26 b(but)300 2815
+y(also)k(facilitate)h(ef)n(\256cient)f(querying)h(and)f(gathering)h
+(information)g(about)g(the)e(stored)h(data.)47 b(A)28
+b(good)300 2985 y(user)c(interface)i(is)d(critical)i(for)f(this)g
+(purpose.)577 3154 y(Query)18 b(processing)i(is)d(a)h(fundamental)i
+(part)e(of)f(DBMSs.)27 b(It)17 b(is)h(the)f(process)j(of)d(retrieving)j
+(data)298 3324 y(that)i(match)f(user)n(-speci\256ed)k(requirements.)33
+b(Figure)22 b(1.1)f(shows)h(the)g(three)g(basic)h(steps)f(in)g
+(evaluating)300 3493 y(a)k(query)-6 b(.)39 b(A)25 b(compiler)i(parses)g
+(and)g(translates)h(a)e(query)h(\(expressed)i(in)d(a)f(high-level)k
+(language)g(like)293 3662 y(SQL\))16 b(into)i(a)f(representation)22
+b(known)c(as)g(an)f(operator)j(tree.)29 b(A)17 b(query)h(optimizer)h
+(then)g(transforms)g(this)300 3832 y(operator)26 b(tree)e(into)g(an)g
+(access)h(plan.)31 b(Finally)-6 b(,)25 b(the)f(execution)i(module)e
+(executes)i(the)e(access)h(plan)f(to)300 4001 y(return)h(the)f(results)
+h(of)e(the)h(SQL)d(query)-6 b(.)583 4170 y(As)26 b(shown)i(in)e(Figure)
+i(1.1,)f(query)h(optimization)h([29,)16 b(34,)g(35,)g(51])27
+b(is)g(an)f(important)j(step)e(in)295 4340 y(query)20
+b(processing.)32 b(It)18 b(is)h(the)g(process)h(of)f(generating)i(an)e
+(ef)n(\256cient)h(access)g(plan)g(for)e(a)h(database)i(query)-6
+b(.)295 4509 y(Informally)g(,)21 b(an)e(access)h(plan)g(is)e(an)h
+(execution)i(strategy)g(for)e(a)f(query;)k(it)d(is)f(the)h(sequence)i
+(of)e(low-level)300 4678 y(database)25 b(retrieval)g(operations)h
+(that,)e(when)f(executed,)i(produce)h(the)d(database)i(records)g(that)f
+(satisfy)300 4848 y(the)k(query)-6 b(.)47 b(There)28
+b(are)g(three)h(basic)h(aspects)f(that)g(de\256ne)g(and)f(in\257uence)i
+(query)f(optimization:)44 b(the)300 5017 y(search)25
+b(space,)f(the)g(cost)g(model,)g(and)g(the)g(search)h(strategy)-6
+b(.)1927 5349 y(1)p eop
+%%Page: 2 14
+2 13 bop 323 403 3237 4 v 323 2862 4 2460 v 1199 631
+a FP(SQL)22 b(Query)737 2766 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 81.09029 239.00296 81.09029 256.0746
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 204.85968 0.0
+239.00296 162.18057 239.00296 162.18057 204.85968 0.0 204.85968 /Lineto
+/lineto load def false Polygon gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 1238
+945 a(Compiler)737 2766 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 81.09029 187.78804 81.09029 204.85968 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+@endspecial
+1156 1299 a(Operator)i(T)m(ree)737 2766 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 81.09029 155.35202 81.09029 170.7164
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 0.0 119.50148 0.0
+153.64476 162.18057 153.64476 162.18057 119.50148 0.0 119.50148 /Lineto
+/lineto load def false Polygon gsave 0.5 setgray fill grestore gsave
+2.6 SLW 0. setgray 0 setlinecap stroke grestore gsave 1.0 SLW 1. setgray
+stroke grestore end
+
+@endspecial
+1101 1654 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651
+neg 77.5029 10.43501 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(Query)g(Optimizer)
+737 2766 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 81.09029 102.42984 81.09029 119.50148 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+@endspecial 1189
+2017 a(Access)g(Plan)737 2766 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 81.09029 68.28656 81.09029 85.3582
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 34.14328 0.0 68.28656
+162.18057 68.28656 162.18057 34.14328 0.0 34.14328 /Lineto /lineto
+load def false Polygon gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore end
+
+@endspecial 1073
+2372 a(Execution)h(Module)737 2766 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 81.09029 17.07164 81.09029 34.14328
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+
+@endspecial 1150 2676 a(Output)g(T)m(uples)2228 498
+y FF(Find)17 b(salaries)h(of)e(all)i(dept)f(chairmen.)2228
+652 y FE(select)109 b FF(chairman,)19 b(salary)2228 731
+y FE(fr)o(om)124 b FF(dept,)18 b(emp)2228 810 y FE(wher)o(e)91
+b FF(dept.chairman)20 b(=)d(emp.name)2228 888 y FE(order)i(by)d
+FF(salary)2603 1088 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2603 1088 a FF(SOR)l(T)2614 1230
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2614 1230 a FF(JOIN)2544 1491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2544 1491 a 2481 1371
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2481 1371 a FF(RET)2765 1371 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2765 1371 a FF(RET)2544
+1491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2544 1491 a 2544 1491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2544 1491 a 2487 1506
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2487 1506 a FF(dept)2770 1499 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2770 1499 a FF(emp)2544
+1491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2544 1491 a 2544 1491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2544 1491 a 2538 1789
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792
+false .5 35.61568 InitRnode } NewNode end end
+ 2538 1789 a FF(Mer)o(ge)p 2713 1789 20 4 v 25 w(sort)2536
+1931 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2536 1931 a FF(Mer)o(ge)p 2711 1931 20 4 v 25
+w(join)2544 2200 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2544 2200 a 2421 2080 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2421 2080
+a FF(File)p 2527 2080 20 4 v 26 w(scan)2705 2080 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2705
+2080 a FF(File)p 2811 2080 20 4 v 25 w(scan)2544 2200
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2544 2200 a 2544 2200 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2544 2200 a 2487 2215 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2487
+2215 a FF(dept)2770 2208 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2770 2208 a FF(emp)2544 2200
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2544 2200 a 2544 2200 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2544 2200 a 2436 2538 a FF(Thompson)149
+b(40)2436 2617 y(Smith)275 b(45)2436 2696 y(Brown)253
+b(52)737 2766 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 295.33942 221.93132 179.25221 221.93132 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 295.33942 136.57312 179.25221 136.57312 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 295.33942 51.21492 179.25221 51.21492 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial 3557 2862 4 2460 v 323 2865
+3237 4 v 3558 2882 19 2466 v 340 2882 3237 19 v 736 3078
+a FP(Figure)24 b(1.1:)31 b(Query)24 b(processing)i(in)e(a)f(database)j
+(system)e(and)g(an)f(example)583 3455 y(The)28 b FD(sear)m(ch)g(space)h
+FP(is)e(the)h(set)g(of)f(access)i(plans)g(that)f(can)g(evaluate)i(a)d
+(query)-6 b(.)44 b(All)27 b(plans)h(of)300 3624 y(a)d(query')-5
+b(s)28 b(search)f(space)f(return)h(the)f(same)g(result;)i(however)l(,)f
+(some)f(plans)h(are)f(more)f(ef)n(\256cient)i(than)300
+3793 y(others.)43 b(The)27 b FD(cost)g(model)h FP(assigns)h(a)d(cost)i
+(to)f(each)h(plan)g(in)f(the)g(search)i(space.)42 b(The)27
+b(cost)h(of)f(a)f(plan)299 3963 y(is)c(an)g(estimate)i(of)e(the)h
+(resources)h(used)f(when)g(the)g(plan)g(is)f(executed;)j(the)e(lower)f
+(the)h(cost,)g(the)f(better)300 4132 y(the)i(plan.)33
+b(The)24 b FD(sear)m(ch)h(strategy)h FP(is)e(a)f(speci\256cation)k(of)d
+(which)g(plans)h(in)f(the)h(search)g(space)g(are)f(to)g(be)295
+4302 y(examined.)31 b(If)19 b(the)g(search)i(space)f(is)f(small,)h(a)e
+(typical)j(search)f(strategy)i(is)c(to)h(enumerate)i(and)f(compare)300
+4471 y(the)30 b(costs)h(of)e(all)h(plans)h(against)h(one)e(another)-5
+b(.)51 b(However)l(,)32 b(most)d(search)j(spaces,)g(even)f(for)f
+(simple)295 4640 y(queries,)21 b(are)e(enormous,)i(and)e(thus)h(query)g
+(optimizers)h(often)e(need)h(heuristics)h(to)e(control)h(the)g(number)
+300 4810 y(of)j(plans)i(to)f(be)f(examined.)579 4979
+y(Query)d(optimizers)h(have)f(traditionally)j(been)d(built)g(as)g
+(monolithic)h(subsystems)h(of)d(DBMSs.)1927 5349 y(2)p
+eop
+%%Page: 3 15
+3 14 bop 296 391 a FP(This)19 b(simply)h(re\257ects)g(the)g(fact)g
+(that)g(traditional)i(database)g(systems)f(are)e(themselves)j
+(monolithic:)31 b(the)300 561 y(algorithms)c(that)f(are)g(used)g(to)f
+(store)i(and)e(retrieve)j(data)e(are)f(hard-wired)j(and)d(are)h(rather)
+g(dif)n(\256cult)h(to)294 730 y(change.)k(The)18 b(need)h(to)f(have)h
+(extensible)i(database)f(systems,)g(and)f(in)f(turn)h(extensible)i
+(optimizers,)g(has)300 899 y(long)j(been)g(recognized)j(in)c(systems)h
+(like)g(EXODUS)c([17],)k(Starburst)h([43],)f(Genesis)g([4],)f(and)h
+(Post-)298 1069 y(gres)e([49].)30 b(Rule-based)24 b(query)e(optimizers)
+i([25,)16 b(28,)g(30,)f(31,)h(33,)g(36])22 b(are)f(among)h(the)g(major)
+g(concep-)297 1238 y(tual)f(advances)i(that)e(have)g(been)g(proposed)i
+(to)d(deal)i(with)e(query)i(optimizer)g(extensibility)-6
+b(.)33 b(A)20 b(primary)295 1408 y(advantage)i(of)d(rule-based)j
+(optimizers)g(over)e(traditional)i(ones)e(is)f(the)g(ability)i(to)e
+(introduce)j(new)d(func-)300 1577 y(tionality)30 b(in)f(a)e(query)j
+(algebra)g(without)f(changing)i(the)d(optimization)j(algorithm.)47
+b(W)-7 b(e)27 b(will)h(review)300 1746 y(some)c(well-known)h(query)f
+(optimizers,)i(both)e(traditional)i(and)e(rule-based,)j(later)d(in)f
+(this)h(chapter)-5 b(.)583 1916 y(DBMSs)28 b(are)i(increasingly)k
+(being)c(used)h(to)f(store)g(and)g(retrieve)i(not)e(only)h(lar)n(ger)g
+(amounts)300 2085 y(of)23 b(information,)i(but)f(more)f(novel)i(types)f
+(of)f(data)h(as)f(well)g(\(object-oriented,)28 b(multimedia,)d(etc.\).)
+31 b(T)-6 b(o)300 2254 y(ensure)32 b(that)f(a)f(DBMS)e(scales)k(well)e
+(to)g(these)i(emer)n(ging)g(needs,)h(it)d(is)h(important)h(to)e(better)
+i(design)298 2424 y(and)23 b(implement)g(\252open\272)h(DBMSs)c(which)j
+(have)g(well-designed)i(components)f(with)e(clearly)i(de\256ned)300
+2593 y(interfaces)i(that)f(are)f(easily)h(adaptable.)35
+b(Since)24 b(optimizers)i(are)e(critical)h(components)i(of)d(DBMSs,)d
+(it)300 2762 y(is)i(necessary)j(to)e(ensure)h(that)f(they)g(meet)g
+(four)g(speci\256c)g(goals:)436 2997 y FC(\017)46 b FI(Abstractions.)53
+b FP(Optimizers)31 b(should)h(be)e(constructed)k(using)e(clearly)g
+(de\256ned)f(abstractions)527 3166 y(that)23 b(encapsulate)i
+(fundamental)f(concepts)h(of)c(optimizers.)33 b(That)21
+b(is,)h(the)g(abstractions)k(should)527 3336 y(represent)h(the)d
+(distinct)j(steps)e(inherent)h(in)e(an)h(optimization.)35
+b(Moreover)l(,)26 b(these)g(abstractions)527 3505 y(should)20
+b(be)e(suf)n(\256ciently)j(high-level)f(that)f(a)e(change)j(in)e(their)
+h(implementation)i(does)d(not)h(funda-)527 3674 y(mentally)k(change)f
+(the)g(design)g(of)f(the)h(optimizer)-5 b(.)31 b(This)21
+b(has)h(the)f(advantage)j(that)e(any)f(changes)527 3844
+y(to)27 b(an)h(optimizer)h(consists)g(of)e(changing)j(the)d
+FD(implementation)j FP(of)d(abstractions,)32 b(not)27
+b(the)h(ab-)527 4013 y(stractions)e(themselves.)436 4253
+y FC(\017)46 b FI(Extensibility)-5 b(.)47 b FP(As)28
+b(mentioned)j(earlier)l(,)g(optimizers)f(in)f(next-generation)k(DBMSs)
+27 b(will)h(in-)527 4423 y(creasingly)f(be)d(required)j(to)d(deal)h
+(with)f(a)f(wider)i(range)g(of)f(data)h(operators)h(and)f(data)g
+(types.)33 b(It)527 4592 y(is)20 b(imperative,)i(therefore,)h(that)d
+(optimizers)i(should)g(be)d(designed)k(and)d(constructed)j(in)d(a)f
+(man-)527 4761 y(ner)28 b(that)h(is)e(amenable)j(to)d(easy)i(and)f
+(quick)h(changes.)46 b(This)27 b(property)j(is)e(known)h(as)e
+FD(extensi-)527 4931 y(bility)p FP(.)42 b(Abstractions)30
+b(mentioned)e(above)h(help)e(in)g(the)g FD(conceptual)j
+FP(design)e(of)f(an)g(optimizer)-5 b(.)527 5100 y(The)19
+b FD(framework)i FP(used)f(to)f(build)h(\(i.e.,)f(specify\))i
+(optimizers)f(should)h(also)f(ensure)g(that)f(the)g(con-)1927
+5349 y(3)p eop
+%%Page: 4 16
+4 15 bop 527 391 a FP(structs)25 b(used)g(de\256ne)f(interfaces)i
+(which)e(closely)h(represent)h(the)e(abstractions)j(de\256ned)d(above.)
+436 635 y FC(\017)46 b FI(Performance.)30 b FP(Optimizers)19
+b(generate)h(a)d(\252good\272)j(access)f(plan)f(for)g(a)g(user)g(query)
+-6 b(.)30 b(This)18 b(metric)527 805 y(is)27 b(de\256ned)h(by)f(the)h
+(cost)f(model)h(of)f(the)g(optimizer)l(,)j(and)d(measures)i(the)e
+(estimated)i(resources)527 974 y(used)d(by)e(the)h(execution)i(module)e
+(\(see)g(Figure)g(1.1\))g(to)f(process)i(the)f(query)-6
+b(.)35 b(It)24 b(is)g(also)h(impor)n(-)527 1144 y(tant)30
+b(that)f(an)g(optimal)h(access)g(plan)g(be)f(found)h(ef)n(\256ciently)
+-6 b(,)33 b(i.e.,)c(that)g(the)g(optimizer)i(be)e(fast.)527
+1313 y(This,)j(in)e(turn,)i(requires)g(that)f(the)f(abstractions)j
+(embodied)f(in)e(the)h(optimizer)g(speci\256cation)527
+1482 y(have)25 b(ef)n(\256cient)g(implementations.)436
+1726 y FC(\017)46 b FI(Recon\256gurability)-5 b(.)30
+b FP(T)-6 b(o)15 b(be)i(able)g(to)g(optimize)h(a)e(wider)h(and)g(more)g
+(diverse)i(set)e(of)f(queries,)k(and)527 1896 y(to)i(facilitate)i(easy)
+e(and)g FD(seamless)i FP(changes)f(to)f(an)g(existing)h(optimizer)l(,)h
+(optimizers)g(should)f(be)527 2065 y(speci\256ed)28 b(using)f
+FD(building-blocks)k FP(that)c(can)g(be)f(arranged)j(in)d(various)i
+(ways)e(to)g(construct)j(an)527 2234 y(optimizer)-5 b(.)31
+b(These)18 b(building-blocks)23 b(can)18 b(be)g(used)h(to)f
+(encapsulate)j(abstractions.)33 b(This)18 b(means)527
+2404 y(that)24 b(an)f(optimizer)i(can)e(be)h(changed)h(quickly)g
+(simply)f(by)f(changing)j(the)d(arrangement)j(of)d(the)527
+2573 y(building-blocks,)i(or)19 b(by)h(changing)i(the)d(abstractions)k
+(encapsulated)g(in)d(an)f(existing)j(building-)527 2743
+y(block.)583 2987 y(In)g(this)i(dissertation,)i(we)c(propose)j(a)d
+(well-de\256ned,)j(algebraic)g(framework,)f(called)g(Prairie,)300
+3156 y(for)j(specifying)i(rules)e(in)g(a)f(query)i(optimizer)g(that)f
+(meets)g(all)f(of)h(the)f(four)h(goals)h(listed)g(above.)41
+b(The)300 3325 y(algebra)28 b(that)f(we)f(propose)j(is)d(similar)i(to)e
+(the)h(rule)g(speci\256cation)j(languages)f(in)d(Starburst)i([36])g
+(and)299 3495 y(V)-12 b(olcano)23 b([31],)g(but)g(provides)i(a)d
+(cleaner)i(abstraction)h(of)d(the)h(actions)h(of)e(an)h(optimizer;)h
+(as)e(such,)i(it)e(is)300 3664 y(much)k(easier)h(to)f(write)g(and)g
+(read)h(rules)g(in)f(our)g(proposed)i(model.)39 b(The)25
+b(algebra)j(allows)f(a)e(database)300 3833 y(implementor)g(\(DBI\))e
+(to)h(specify)h(transformations)i(of)d(a)f(query)i(using)f(rewrite)h
+(rules)f(that)g(may)f(have)300 4003 y(conditions.)46
+b(The)27 b(rules)h(determine)h(the)f(search)h(space)f(and)g(cost)g
+(model)g(of)g(the)f(optimizer)-5 b(.)45 b(W)-7 b(e)26
+b(do)296 4172 y(not)21 b(propose)h(a)e(search)h(strategy;)j(we)19
+b(intend)j(to)e(implement)i(a)d(preprocessor)24 b(that)d(can)g
+(translate)h(rules)297 4342 y(in)f(our)h(model)f(to)g(those)h(in)f(V)
+-12 b(olcano,)23 b(since)f(V)-12 b(olcano)22 b(has)g(an)f(ef)n
+(\256cient)h(search)g(strategy)h(and)f(is)f(freely)300
+4511 y(available.)583 4680 y(Below)-6 b(,)23 b(we)g(brie\257y)h(review)
+g(some)g(related)h(work)f(on)f(optimizers.)1927 5349
+y(4)p eop
+%%Page: 5 17
+5 16 bop 300 391 a FO(1.2)119 b(Related)31 b(W)-7 b(ork)300
+659 y FN(1.2.1)99 b(T)-7 b(raditional)25 b(Query)g(Optimizers)300
+890 y FP(The)e(System)g(R)f(optimizer)j([46])f(was)f(one)h(of)f(the)h
+(earliest)h(query)g(optimizers)g(proposed)h(and)e(imple-)300
+1059 y(mented.)33 b(It)24 b(was)f(built)i(for)g(the)f(System)g(R)f
+(database)j(system)f([1].)32 b(System)24 b(R)f(is)h(a)g(centralized,)i
+(rela-)294 1229 y(tional)19 b(DBMS)c(where)j(users)h(specify)g(their)g
+(queries)g(in)f(SQL.)d(The)i(System)h(R)e(optimizer)k(is)d(still)i
+FD(the)f(de)299 1398 y(facto)25 b FP(industry)g(standard;)g(it)e(was)g
+(the)g(\256rst)g(to)g(show)g(the)g(practical)i(viability)h(of)d(query)h
+(optimization)300 1567 y(in)f(a)h(commercial)g(setting.)581
+1737 y(The)d(basic)h(philosophy)i(of)d(the)h(System)f(R)f(optimizer)j
+(was)d(a)h(bottom-up)i(exhaustive)h(search)300 1906 y(strategy)33
+b(with)e(dynamic)h(programming.)55 b(Some)30 b(of)h(the)g(salient)i
+(features)g(it)d(embodied)j(are)e(listed)300 2075 y(below:)436
+2319 y FC(\017)46 b FP(It)28 b(employed)h(a)e(bottom-up)j(strategy)-6
+b(.)45 b(That)28 b(is,)g(children)h(of)f(nodes)h(in)f(an)f(operator)j
+(tree)e(are)527 2489 y(optimized)e(before)f(the)e(node)i(itself)f(is)g
+(optimized.)436 2733 y FC(\017)46 b FP(It)20 b(used)g(two)g(join)g
+(algorithms,)i(nested)g(loops)e(and)h(mer)n(ge)f(join)h(\(\256rst)e
+(introduced)k(in)d([16]\),)h(and)527 2902 y(two)i(relation)j(retrieval)
+f(algorithms,)h(segment)f(scan)f(and)g(variations)i(of)e(index)g(scan.)
+436 3146 y FC(\017)46 b FP(The)17 b(concept)i(of)e(\252interesting\272)
+k(orders)d(was)f(introduced)j(to)d(generate)i(only)f(those)g(access)g
+(plans)527 3316 y(in)k(the)f(search)i(space)f(that)g(were)g(likely)g
+(to)g(be)f(part)h(of)f(other)i(access)f(plans.)32 b(It)21
+b(also)h(limited)g(the)527 3485 y(search)j(space)f(by)f(considering)j
+(only)e(left-deep)h(operator)g(trees)f(\(in)f(which)g(the)g(inner)h
+(relation)527 3654 y(was)f(always)i(a)e(stored)i(\256le\),)d(and)i(by)g
+(delaying)i(cross-products)i(as)23 b(far)h(as)f(possible.)436
+3899 y FC(\017)46 b FP(It)28 b(introduced)j(a)d(fairly)h(elaborate)i
+(scheme)e(using)g(\252selectivity)j(factors\272)e(to)e(estimate)h
+(cardi-)527 4068 y(nalities)d(of)d(streams)i(generated)h(by)d
+(computations)k(on)d(other)g(streams.)436 4312 y FC(\017)46
+b FP(Dynamic)25 b(programming)i(was)d(used)h(to)f(control)j(the)d
+(expansion)k(of)c(the)h(search)g(space.)35 b(Basi-)527
+4481 y(cally)-6 b(,)23 b(the)e(optimizer)i(maintained)g(an)f
+(equivalence)i(class)e(of)g(access)g(plans,)h(and)e(as)g(each)h(plan)
+527 4651 y(was)27 b(generated,)j(its)d(cost)g(was)f(computed,)k(and)d
+(if)f(its)h(cost)h(was)e(greater)j(than)e(the)g(minimum)527
+4820 y(cost)c(of)g(any)g(plan)g(in)f(its)h(equivalence)j(class,)d(it)f
+(was)g(discarded)j(since)f(it)e(would)h(not)g(be)f(a)g(sub-)527
+4989 y(plan)j(of)g(another)h(optimal)f(access)h(plan.)35
+b(This)24 b(process)i(ensured)g(that)f(the)g(optimization)i(time)1927
+5349 y(5)p eop
+%%Page: 6 18
+6 17 bop 527 391 a FP(was)30 b(exponential)k(\(in)d(the)g(number)g(of)g
+(joining)h(relations\))h(as)e(opposed)h(to)f(a)f(factorial)i(time)527
+561 y(complexity)26 b(\(see)e(Appendix)h(A)e(for)h(a)f(proof)h(of)g
+(the)g(algorithm)h(complexity\).)436 805 y FC(\017)46
+b FP(The)25 b(System)f(R)g(optimizer)i(also)f(had)g(a)g(fairly)h
+(elaborate)h(cost)e(model)g(involving)i(a)e(weighted)527
+974 y(sum)f(of)f(CPU)f(and)i(I/O)e(costs.)577 1218 y(R)638
+1185 y FB(\003)694 1218 y FP(is)17 b(a)g(distributed)k(relative)f(of)d
+(System)h(R.)e(The)h(stored)i(relations)h(are)e(located)h(at)f
+(distributed)299 1388 y(sites.)31 b(R)574 1355 y FB(\003)613
+1388 y FP(')-5 b(s)22 b(query)i(processor)h([20,)16 b(37,)g(45])23
+b(works)g(in)f(essentially)j(the)e(same)g(way)f(as)g(that)h(of)f
+(System)300 1557 y(R,)j(except)i(for)f(some)h(subtle)g(complications)i
+(introduced)g(by)d(the)h(distribution)i(of)d(relations.)41
+b(These)295 1726 y(complications)22 b(arise)e(mostly)g(in)f
+(authentication)24 b(and)19 b(catalog)i(sharing)g(between)f(remote)g
+(sites.)30 b(Con-)300 1896 y(ceptually)-6 b(,)26 b(however)l(,)f(the)e
+(R)1222 1863 y FB(\003)1284 1896 y FP(optimizer)i(builds)g(upon)g(the)f
+(System)f(R)g(optimizer)-5 b(.)583 2065 y(Like)31 b(System)g(R,)e(the)i
+(search)h(strategy)h(in)d(R)2073 2032 y FB(\003)2112
+2065 y FP(')-5 b(s)31 b(optimizer)h(also)g(employs)f(an)g(exhaustive)
+294 2234 y(examination)21 b(of)d(its)g(search)h(space)g(to)f(\256nd)g
+(an)g(optimal)h(plan.)30 b(Heuristics)20 b(are)e(used)h(to)f(limit)g
+(the)g(space.)295 2404 y(The)g(retrieval)i(methods)g(available)h(are)e
+(segment)h(scan)f(and)g(index)h(scan.)30 b(Single)19
+b(site)g(joins)h(\(i.e.,)f(joins)292 2573 y(in)d(which)h(both)h
+(streams)f(are)f(located)j(at)d(the)h(same)f(site\))h(are)g(optimized)h
+(in)e(the)h(same)f(way)g(as)h(in)f(System)300 2743 y(R)22
+b(using)j(nested)g(loops)g(or)e(mer)n(ge)i(join.)580
+2912 y(The)c(case)g(of)f(joins)i(in)f(which)g(the)g(two)f(input)i
+(streams)f(are)g(located)i(at)d(dif)n(ferent)j(sites)f(is)e(what)298
+3081 y(distinguishes)26 b(R)855 3048 y FB(\003)915 3081
+y FP(from)21 b(System)h(R.)e(R)1566 3048 y FB(\003)1626
+3081 y FP(handles)k(this)e(case)h(by)e(transfering)k(both)e(streams)f
+(to)g(a)f(com-)300 3251 y(mon)i(site)h(before)h(joining.)33
+b(T)-6 b(wo)22 b(transfer)j(strategies)h(are)e(considered,)i
+(tuple-at-a-time)h(and)d(whole.)583 3420 y(The)e(cost)i(model)f(used)h
+(by)f(R)1527 3387 y FB(\003)1566 3420 y FP(')-5 b(s)23
+b(optimizer)h(is)f(similar)h(to)e(System)h(R,)f(except)i(for)f
+(multi-site)300 3589 y(joins)i(in)e(which)h(case)g(the)g(cost)g(of)g
+(transfering)i(relations)g(is)d(also)h(added.)300 3896
+y FN(1.2.2)99 b(Rule-Based)26 b(Optimizers)f(\320)f(The)i(Next)f
+(Generation)297 4126 y FP(Both)c(System)g(R)f(and)i(R)1076
+4094 y FB(\003)1135 4126 y FP(have)g(existed)h(for)e(a)g(long)h(time.)
+29 b(Lately)-6 b(,)22 b(however)l(,)h(researchers)h(have)e(been)295
+4296 y(looking)e(at)f(extensible)i(query)f(optimizers.)31
+b(This)19 b(is)f(in)h(keeping)i(with)d(the)h(trend)h(toward)f
+(constructing)293 4465 y(extensible)h(DBMSs.)27 b(Extensibility)-6
+b(,)21 b(in)c(short,)j(is)d(the)g(process)i(of)e(augmenting)j(or)d
+(removing)i(features)299 4635 y(easily)k(from)f(a)g(system)h(in)g
+(order)g(to)f(customize)i(it)e(for)h(an)f(application.)34
+b(Extensibility)25 b(of)d(query)i(opti-)300 4804 y(mizers)h(refers)g
+(to)f(the)g(ease)h(of)f(constructing)j(optimizers)f(for)e(extensible)j
+(DBMSs.)k(It)23 b(also)i(refers)g(to)300 4973 y(the)f(easy)g
+(customizability)j(of)d(an)f(existing)j(query)f(optimizer)g(to)e(a)h
+(new)f(application.)1927 5349 y(6)p eop
+%%Page: 7 19
+7 18 bop 583 391 a FP(Rule-based)25 b(query)e(optimizers)i(have)f(been)
+f(proposed)j(as)c(a)g(means)i(of)e(constructing)27 b(exten-)298
+561 y(sible)22 b(optimizers.)32 b(The)21 b(primary)i(advantage)h(of)d
+(rule-based)k(query)d(optimizers)i(is)d(the)h(ability)h(to)e(add)300
+730 y(new)28 b(operators)j(and)e(algorithms)h(without)g(a)e(costly)h
+(rewrite)g(of)g(the)f(entire)i(optimizer)-5 b(.)47 b(Below)-6
+b(,)29 b(we)300 899 y(review)24 b(a)f(few)g(of)h(the)f(more)h
+(well-known)h(rule-based)h(optimizers.)580 1069 y(The)20
+b(Starburst)i(query)g(optimizer)g([33,)16 b(36,)g(43])21
+b(uses)g(rules)g(for)g(all)g(decisions)i(that)e(need)g(to)g(be)300
+1238 y(taken)27 b(by)e(the)h(query)h(optimizer)-5 b(.)39
+b(The)25 b(rules)i(are)e(functional)k(in)c(nature)i(and)g(transform)g
+(a)e(given)i(op-)300 1408 y(erator)d(tree)g(into)g(another)-5
+b(.)32 b(The)23 b(rules)h(are)f(commonly)i(those)f(that)g(re\257ect)f
+(relational)j(calculus)f(trans-)297 1577 y(formations.)33
+b(In)21 b(Starburst,)i(the)e(query)h(rewriting)h(phase)f(is)f(dif)n
+(ferent)j(from)d(the)h(optimization)i(phase.)300 1746
+y(The)i(rewriting)i(phase)g(transforms)h(the)e(query)h(itself)f(into)h
+(equivalent)h(operator)g(trees)e(based)h(on)f(re-)300
+1916 y(lational)f(calculus)g(rules.)34 b(The)23 b(plan)i(optimization)i
+(phase)e(selects)h(algorithms)g(for)e(each)h(operator)h(in)298
+2085 y(the)c(operator)i(tree)e(that)h(is)f(obtained)i(after)e
+(rewriting.)32 b(As)21 b(the)h(designers)i(of)e(Starburst)i(point)e
+(out,)h(the)300 2254 y(disadvantage)28 b(of)c(separating)i(the)f(query)
+g(rewrite)f(and)h(the)f(optimization)j(phases)e(is)f(that)g(pruning)i
+(of)300 2424 y(the)j(search)h(space)f(is)g(not)g(possible)h(during)g
+(query)g(rewrite,)g(since)g(the)e(rewrite)i(phase)f(is)g(non-cost-)297
+2593 y(based.)i(Also,)21 b(the)f(rewrite)i(phase)g(uses)f(heuristics)i
+(to)e(prune)g(the)g(search)h(space)g(before)g(the)f(optimiza-)300
+2762 y(tion)j(phase;)h(this)f(can)g(lead)g(to)g(a)f(sub-optimal)j
+(plan.)583 2932 y(Lohman)31 b(describes)h(rules)f(for)g(the)f
+(optimization)j(phase)e(of)f(Starburst)i([36].)51 b(These)30
+b(rules)300 3101 y(represent)c(alternative)g(access)f(paths,)g(join)f
+(algorithms,)h(and)f(site)g(choices)h(in)f(a)f(distributed)k(DBMS.)300
+3271 y(However)l(,)k(even)e(though)i(these)f(rules)g(transform)g(an)f
+(operator)i(tree)e(into)h(a)e(valid)i(access)g(plan,)h(the)300
+3440 y(cost)f(computation)j(is)d(not)g(done)h(until)f(all)g(rules)h
+(are)f(applied.)52 b(In)29 b(other)i(words,)h(the)e(rewrite)g(rules)300
+3609 y(of)e(Starburst)h(are)f(purely)i(syntactic)g(transformations)i
+(of)c(one)g(query)h(representation)j(into)d(another)-5
+b(.)300 3779 y(Thus,)26 b(all)g(operator)i(trees)e(are)g(subjected)i
+(to)e(all)g(applicable)i(rules)f(before)g(costs)f(are)g(computed)i(and)
+300 3948 y(the)c(search)h(space)f(can)g(be)g(pruned.)583
+4117 y(Freytag)j([25])f(describes)i(a)d(rule-based)j(query)f(optimizer)
+g(similar)f(to)f(Starburst.)38 b(The)25 b(rules)296 4287
+y(are)20 b(based)g(on)g(LISP-like)g(representations)k(of)19
+b(access)i(plans.)31 b(The)19 b(rules)i(themselves)h(are)d(recursively)
+298 4456 y(de\256ned)j(on)g(smaller)g(expressions)j(\(operator)f
+(trees\).)31 b(Although)23 b(several)h(expressions)h(can)c(contain)j(a)
+292 4625 y(common)17 b(sub-expression,)22 b(Freytag)c(doesn')n(t)h
+(consider)f(the)f(possibility)j(of)c(sharing.)31 b(Expressions)19
+b(are)300 4795 y(evaluated)27 b(each)f(time)e(they)h(are)g
+(encountered.)38 b(In)24 b(addition,)j(as)e(in)f(the)h(rewrite)h(phase)
+f(of)g(Starburst,)299 4964 y(he)d(doesn')n(t)j(consider)f(the)f(cost)g
+(transformations)j(inherent)f(in)d(any)h(query)g(transformation;)k
+(rules)c(are)1927 5349 y(7)p eop
+%%Page: 8 20
+8 19 bop 300 391 a FP(syntactic)26 b(transformation)h(rules.)576
+561 y(The)17 b(EXODUS)c(project)19 b([17])e(has)h(similar)f(goals)h(as)
+f(those)h(of)f(Starburst,)i(to)e(provide)i(a)d(frame-)300
+730 y(work)25 b(in)g(which)h(DBMSs)e(can)h(be)h(easily)g(implemented)h
+(as)f(extensions)i(of)d(existing)i(DBMSs,)d(or)h(to)300
+899 y(design)30 b(completely)g(new)e(DBMSs.)43 b(The)28
+b(query)i(optimizer)f(in)g(EXODUS)c([28,)16 b(30])28
+b(is,)h(in)g(fact,)g(an)297 1069 y FD(optimizer)23 b(generator)g
+FP(which)f(accepts)g(the)f(speci\256cation)j(of)d(the)g(data)h(model)f
+(and)g(operators)j(in)c(a)h(de-)297 1238 y(scription)i(\256le.)29
+b(The)20 b(optimizer)j(generator)g(compiles)f(these)g(rules,)g
+(together)g(with)f(pre-de\256ned)i(rules,)300 1408 y(to)g(generate)j
+(an)e(optimizer)h(for)f(the)f(particular)k(data)d(model)g(and)g(set)g
+(of)f(operators.)33 b(Unlike)25 b(Freytag,)297 1577 y(the)c(optimizer)h
+(generator)h(for)e(EXODUS)d(allows)j(for)g(C)f(code)h(along)h(with)f
+(de\256nitions)i(of)d(new)h(rules.)300 1746 y(This)i(allows)h(the)g
+(DBI)f(the)g(freedom)i(to)e(associate)j(any)e(action)h(with)f(a)f
+(particular)j(rule.)582 1916 y(Operator)e(trees)g(in)e(EXODUS)e(are)i
+(constructed)k(bottom-up)f(from)d(previously)k(constructed)300
+2085 y(sub-trees.)41 b(Common)26 b(sub-expressions)31
+b(are)c(shared)g(as)g(far)f(as)g(possible.)41 b(Each)26
+b(access)i(plan)f(in)f(the)298 2254 y(search)d(space)f(has)g(a)f(cost)h
+(factor)h(associated)h(with)d(it;)h(plans)h(are)e(examined)j(based)e
+(on)g(their)g(cost)g(fac-)300 2424 y(tors.)33 b(It)24
+b(is)f(not)i(clear)g(if)e(these)i(cost)g(factors)h(have)f(any)f
+(relation)i(to)e(the)g(actual)i(costs)f(of)f(the)g(plans)h(\(as)300
+2593 y(estimated)h(by)f(the)g(cost)g(model\),)h(and)f(if)f(so,)h(what)g
+(the)g(relation)h(is.)34 b(The)25 b(EXODUS)c(optimizer)26
+b(uses)300 2762 y(the)e(cost)g(factor)h(with)e(an)h(exhaustive)i
+(search)f(strategy)h(to)d(guide)i(the)f(exploration)i(of)e(access)h
+(plans.)579 2932 y(The)19 b(V)-12 b(olcano)21 b(optimizer)h(generator)g
+(project)f([31])f(evolved)i(from)d(the)h(EXODUS)d(project.)31
+b(It)300 3101 y(is)23 b(dif)n(ferent)i(from)e(all)h(the)f(above)i
+(optimizers)g(in)e(one)h(signi\256cant)h(way:)30 b(it)23
+b(is)g(a)g(top-down)i(optimizer)300 3271 y(compared)k(with)d(the)i
+(bottom-up)h(strategy)g(of)e(the)g(others.)42 b(Operator)29
+b(trees)e(are)g(optimized)i(starting)300 3440 y(from)d(the)h(root)g
+(while)f(sub-trees)j(are)d(not)h(yet)f(optimized.)41
+b(This)26 b(leads)h(to)f(a)g(constraint-driven)31 b(gen-)299
+3609 y(eration)25 b(of)e(the)g(search)h(space.)32 b(While)24
+b(this)f(method)h(results)g(in)f(a)g(tight)h(control)g(of)f(the)h
+(search)g(space,)300 3779 y(it)i(is)h(unconventional)k(and)c(requires)h
+(careful)h(attention)f(on)f(the)g(part)g(of)f(the)h(DBI)f(to)g(ensure)i
+(that)f(no)300 3948 y(valid)d(operator)i(trees)e(are)g(accidently)i
+(left)e(out)g(of)f(the)h(search)h(space.)32 b(W)-7 b(e)23
+b(will)g(discuss)i(the)f(V)-12 b(olcano)300 4117 y(optimizer)25
+b(generator)h(in)e(greater)h(detail)f(in)g(Chapter)g(2.)583
+4287 y(Fegaras,)29 b(Maier)l(,)f(and)g(Sheard)f([24])h(describe)h(a)e
+(declarative)j(optimizer)e(generator)i(frame-)300 4456
+y(work)24 b(for)g(specifying)k(query)d(optimizers.)34
+b(The)24 b(premise)h(in)f(their)h(work)f(is)g(that)h(much)f(of)g(the)h
+(speci-)298 4625 y(\256cation)d(in)g(current)h(optimizers)h(consists)f
+(of)f(procedurally)j(de\256ned)d(actions;)j(making)d(these)h(actions)
+296 4795 y(declarative)g(results)f(in)e(a)g(cleaner)h(speci\256cation)i
+(language.)32 b(T)-6 b(o)19 b(this)i(end,)g(Fegaras)g(et)f(al)g(use)g
+(a)g(re\257ec-)295 4964 y(tive)g(functional)h(programming)h(language,)g
+(called)e(CRML,)c(as)j(the)h(basis)g(for)f(their)h(speci\256cation)i
+(lan-)1927 5349 y(8)p eop
+%%Page: 9 21
+9 20 bop 298 391 a FP(guage.)31 b(The)21 b(term)h(re\257ective)h
+(describes)h(an)d(environment)k(that)d(not)g(only)g(can)g(specify)h(an)
+f(optimizer)l(,)300 561 y(but)i(also)g(enables)h(a)e(DBI)f(to)h(embed)h
+(metadata)h(\(or)f(parameters\))h(to)f(guide)g(the)g(optimizer)h
+(generator)300 730 y(in)h(generating)j(an)e(optimizer)h(for)e(a)g
+(speci\256c)h(tar)n(get.)41 b(An)26 b(optimizer)i(is)e(speci\256ed)i
+(by)e(using)i(rewrite)300 899 y(rules)e(that)g(are)g(based)g(on)g
+(pattern)h(matching.)38 b(In)25 b(addition)i(to)f(this)g(syntactic)h
+(transformation,)i(rules)300 1069 y(also)c(consist)h(of)e(semantic)h
+(context-dependent)30 b(conditions.)35 b(However)l(,)25
+b(the)g(framework)g(described)300 1238 y(by)i(Fegaras)h(et)f(al)f
+(still)i(contains)h(some)e(implementation-level)32 b(details)c(at)f
+(the)g(speci\256cation)j(level.)298 1408 y(These)21 b(drawbacks)j
+(parallel)f(those)g(in)e(V)-12 b(olcano)23 b(\(which)f(is)f(described)j
+(in)e(more)f(detail)i(in)e(Chapter)i(2\),)295 1577 y(and)c(mainly)g
+(concern)i(the)d(representation)23 b(and)c(transformation,)k(using)d
+(rewrite)f(rules,)h(of)f(the)g(various)300 1746 y(expressions)27
+b(and)d(their)g(abstractions.)300 2113 y FO(1.3)119 b(Outline)31
+b(of)f(Dissertation)297 2376 y FP(All)20 b(of)g(the)h(rule-based)j
+(query)d(optimizers)i(discussed)g(in)e(Section)g(1.2.2)g(take)g(an)g
+FD(ad)f(hoc)i FP(approach)g(to)298 2545 y(the)h(speci\256cation)h(of)e
+(rules.)31 b(W)-7 b(e)22 b(introduce)i(a)e FD(well-de\256ned)k
+FP(and)d FD(structur)m(ed)j(algebra)e FP(called)f(Prairie)300
+2715 y(to)j(specify)i(rules)f(for)f(a)g(rule-based)i(optimizer)-5
+b(.)40 b(Because)28 b(of)e(a)f(rigorous)j(algebra,)h(it)c(is)h(easier)h
+(for)g(a)300 2884 y(DBI)c(to)h(write)g(rules,)h(as)f(well)g(as)g(for)g
+(readers)i(to)e(read)h(and)g(understand)i(the)d(semantics)i(of)e(the)h
+(rules.)295 3053 y(However)l(,)c(rules)f(by)f(themselves)i(do)e(not)h
+(constitute)i(an)d(optimizer;)j(we)d(need)g(a)g(search)i(strategy)g
+(also.)300 3223 y(Since)26 b(search)h(strategies)h(are)d
+(well-understood,)30 b(we)25 b(do)g(not)h(propose)i(to)d(study)i(them.)
+37 b(Instead,)27 b(we)298 3392 y(will)21 b(use)h(the)g(V)-12
+b(olcano)23 b(search)g(engine)g(to)e(drive)i(our)f(optimizer)l(,)h
+(since)g(V)-12 b(olcano)23 b(has)f(a)f(very)h(ef)n(\256cient)300
+3562 y(search)j(strategy)-6 b(.)33 b(However)l(,)24 b(this)g(requires)h
+(that)g(we)d(translate)k(Prairie)e(rules)h(into)f(V)-12
+b(olcano)25 b(rules.)583 3731 y(The)h(V)-12 b(olcano)28
+b(optimizer)g(generator)g(is)e(described)j(in)d(Chapter)h(2.)38
+b(W)-7 b(e)25 b(describe)k(Prairie)d(in)300 3900 y(Chapter)f(3)e(and)h
+(show)f(how)h(it)f(can)h(be)f(used)i(to)e(specify)i(optimizers)h(using)
+f(high-level)h(abstractions.)300 4070 y(Chapter)31 b(4)e(describes)j
+(the)e(process)i(of)d(translating)k(Prairie)d(rules)h(into)f(V)-12
+b(olcano)32 b(rules.)50 b(Chapter)31 b(5)296 4239 y(presents)21
+b(some)f(experimental)j(results)e(validating)h(the)e(ef)n(\256ciency)i
+(of)d(Prairie)i(optimizers.)31 b(Chapter)21 b(6)300 4408
+y(describes)33 b(how)e(layered)i(optimizers)g(can)e(be)g(built)h(using)
+g(Prairie,)h(and)f(how)f(this)g(leads)h(to)f(easier)300
+4578 y(recon\256gurability)-6 b(.)35 b(Finally)-6 b(,)24
+b(we)f(end)h(with)f(some)h(conclusions)j(and)d(future)h(work)e(in)h
+(Chapter)g(7.)1927 5349 y(9)p eop
+%%Page: 10 22
+10 21 bop 2859 1118 a FG(Chapter)44 b(2)573 1657 y FM(The)51
+b(V)-19 b(olcano)52 b(Optimizer)f(Generator)296 2159
+y FP(This)19 b(chapter)i(describes)h(the)e(V)-12 b(olcano)21
+b(optimizer)g(generator)-5 b(.)32 b(The)19 b(features)i(that)f(are)g
+(relevant)i(to)d(this)300 2328 y(dissertation)27 b(are)d(presented,)h
+(but)f(more)g(details)h(can)f(be)f(found)i(in)f([31,)16
+b(38].)300 2695 y FO(2.1)119 b(Overview)581 2958 y FP(V)-12
+b(olcano)23 b(is)e(a)g(rule-based)j(query)e(optimizer)h(generator)h
+(that)e(is)f(designed)j(to)d(be)g(\257exible)h(and)299
+3127 y(extensible)k(to)c(speci\256c)i(database)h(architectures.)34
+b(\(Henceforth,)25 b(when)e(we)f(talk)h(of)g(V)-12 b(olcano,)24
+b(we)e(are)299 3297 y(referring)k(to)d(the)g(\252V)-12
+b(olcano)25 b(optimizer)f(generator)s(\272.\))34 b(It)23
+b(implements)i(a)d(top-down)j(query)f(optimizer)300 3466
+y(in)g(the)h(sense)h(that)f(parents)h(of)e(nodes)i(in)e(an)h(operator)h
+(tree)f(are)g(optimized)h(before)g(the)f(node)g(itself)g(is)p
+323 3655 3237 4 v 323 4697 4 1042 v 1475 3772 a(Operator)f(T)m(ree)1375
+4814 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ -17.07164 110.96565
+153.64476 110.96565 153.64476 42.6791 -17.07164 42.6791 /Lineto /lineto
+load def false Polygon gsave 0.5 setgray fill grestore gsave 2.6
+SLW 0. setgray 0 setlinecap stroke grestore gsave 1.0 SLW 1. setgray
+stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 42.6791 67.43292 42.6791 122.91574 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 42.6791 67.43292 42.6791 122.91574
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial
+1877 4065 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.11488
+neg 66.36697 10.43501 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(V)-12
+b(olcano)25 b(Rules)1375 4814 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 92.18674 67.43292 92.18674 87.06546 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { /ArrowAc [
+6 2 roll ] cvx def ArrowAc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow
+ moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow
+false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 92.18674 67.43292 92.18674
+87.06546 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW
+add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore gsave ArrowAc ArrowA pop pop ArrowBc ArrowB pop pop
+pop pop grestore end
+
+@endspecial 1556
+4339 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651
+neg 95.86615 10.43501 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(V)-12 b(olcano)25
+b(Rule)f(Engine)1375 4814 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 68.28656 33.28964 68.28656 52.06854 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 33.28964 68.28656 52.06854
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial 1721
+4600 a(Access)g(Plan)p 3557 4697 V 323 4700 3237 4 v
+3558 4717 19 1049 v 340 4717 3237 19 v 633 4913 a(Figure)g(2.1:)31
+b(Schematic)25 b(representation)i(of)d(the)g(V)-12 b(olcano)25
+b(optimizer)g(generator)1905 5349 y(10)p eop
+%%Page: 11 23
+11 22 bop 300 391 a FP(optimized.)36 b(Roughly)26 b(speaking,)h(V)-12
+b(olcano)26 b(provides)h(two)e(major)g(components)i(of)e(an)f
+(optimizer:)36 b(a)300 561 y(search)28 b(engine)h(and)e(a)g(rule)h
+(speci\256cation)h(language.)44 b(The)27 b(schematic)h(design)h(of)e
+(the)g(V)-12 b(olcano)29 b(op-)300 730 y(timizer)g(generator)i(is)e
+(depicted)h(in)f(Figure)g(2.1.)45 b(A)28 b(DBI)f(writes)i(rules)g(in)g
+(V)-12 b(olcano')-5 b(s)30 b(speci\256cation)300 899
+y(language,)c(which)e(are)f(then)i(compiled)g(with)e(the)h(rule)g
+(engine)h(to)e(generate)j(an)e(optimizer)-5 b(.)580 1069
+y(The)21 b(search)h(engine)g(is)f(hard-coded)i(and)f(is)e(not)h
+(changeable)j(by)d(the)g(DBI.)e(The)h(search)i(strat-)300
+1238 y(egy)j(is)g(exhaustive,)i(meaning)f(that)f(all)g(operator)i
+(trees)e(that)g(are)g(generated)i(by)e(application)j(of)c(rules)300
+1408 y(are)k(evaluated)j(before)e(an)f(optimal)h(plan)f(is)g(returned.)
+46 b(Dynamic)29 b(programming)h(is)d(used)i(to)f(prune)300
+1577 y(the)d(search)h(space)g(as)f(much)g(as)g(possible.)37
+b(Since)25 b(this)g(process)i(of)e(pruning)i(is)d(similar)i(to)f(the)g
+(one)g(in)300 1746 y(System)e(R)g([46],)h(we)e(will)i(not)g(describe)h
+(it)e(further)-5 b(.)583 1916 y(The)31 b(rule)h(speci\256cation)i
+(language)g(is)d(the)h(part)g(of)f(V)-12 b(olcano)33
+b(that)f(allows)g(a)f(DBI)f(to)h(spec-)300 2085 y(ify)h(how)f(operator)
+j(trees)e(are)g(transformed)i(to)e(generate)i(access)f(plans.)56
+b(The)31 b(optimizer)i(is)f(speci-)300 2254 y(\256ed)25
+b(as)h(a)f(set)h(of)f(operators,)j(algorithms,)g(and)e(rules)h(with)e
+(associated)k(actions.)38 b(V)-5 b(iewed)25 b(as)h(a)f(state-)298
+2424 y(transformation)f(operation,)h(the)c(optimizer)i(transforms)h(an)
+d(initial)i(state)f(\(operator)i(tree\))e(into)g(a)f(\256nal)297
+2593 y(one)h(\(access)h(plan\))f(while)f(also)h(translating)i
+(associated)g(state)e(information)h(in)e(the)h(process.)32
+b(The)20 b(fol-)300 2762 y(lowing)k(sections)i(describe)g(the)d(V)-12
+b(olcano)25 b(rule)f(speci\256cation)j(language)f(in)d(greater)i
+(detail.)300 3129 y FO(2.2)119 b(De\256nitions)300 3392
+y FP(Before)24 b(we)f(describe)i(the)f(V)-12 b(olcano)25
+b(rule)f(speci\256cation)j(language,)e(we)e(need)h(a)f(few)g
+(de\256nitions.)296 3694 y FI(Stor)n(ed)e(Files)f(and)f(Str)n(eams.)92
+b FP(A)19 b(relation)j(or)e(\256le)g(is)g FD(stor)m(ed)j
+FP(if)d(its)h(tuples)g(reside)h(on)e(disk.)30 b(A)20
+b FD(str)m(eam)300 3863 y FP(is)25 b(a)g(sequence)i(of)e(tuples)h(and)g
+(is)f(the)g(result)i(of)e(a)f(computation)k(on)d(one)h(or)f(more)g
+(streams)h(or)f(stored)300 4033 y(\256les;)i(tuples)g(of)e(streams)i
+(are)f(returned)i(one)e(at)f(a)h(time,)f(typically)j(on)e(demand.)38
+b(Streams)26 b(are)g(either)297 4202 y(named,)c(denoted)h(by)e
+FA(?)p FH(n)p FP(,)f(where)i FH(n)d FP(is)i(an)g(integer)l(,)j(or)d
+(unnamed)h(operator)h(trees)f(\(de\256ned)g(below\).)31
+b(In)300 4371 y(V)-12 b(olcano,)26 b(all)e(operations)k(accept)d(zero)h
+(or)e(more)g(streams)i(as)e(input,)h(or)g(one)g(or)f(more)g(stored)i
+(\256les)e(as)300 4541 y(input.)300 4842 y FI(Database)k(Operations.)92
+b FP(An)26 b FD(operation)j FP(is)e(a)g(computation)i(on)e(one)h(or)e
+(more)h(streams)h(or)f(stored)299 5012 y(\256les.)k(There)23
+b(are)g(three)h(types)g(of)f(database)i(operations)g(in)e(V)-12
+b(olcano:)33 b(abstract)25 b(\(or)e(implementation-)1906
+5349 y(1)m(1)p eop
+%%Page: 12 24
+12 23 bop 300 391 a FP(unspeci\256ed\))26 b(operators,)g(concrete)f
+(algorithms,)h(and)e(enforcers.)33 b(Each)23 b(is)h(detailed)h(below)-6
+b(.)527 660 y FI(Operators.)47 b FP(Abstract)24 b FD(operators)g
+FP(specify)g(computations)h(on)e(streams)f(or)g(stored)i(\256les;)e
+(they)727 830 y(are)d(denoted)h(in)e(this)h(dissertation)j(by)d(all)f
+(capital)i(letters)g(\(e.g.,)e(JOIN\).)g(Associated)i(with)727
+999 y(every)28 b(operator)g(is)e(an)g FD(operator)j(ar)m(gument)f
+FP(which)f(speci\256es)h(additional)h(information)727
+1168 y(needed)18 b(to)e(execute)i(the)e(operator)-5 b(.)31
+b(The)15 b(type)i(of)f(an)g(operator)i(ar)n(gument)g(can)f(be)f
+(virtually)727 1338 y(anything;)26 b(V)-12 b(olcano)24
+b(allows)g(it)e(to)h(be)g(de\256ned)g(as)g(an)g(arbitrary)i(C)c
+(struct.)32 b(As)22 b(examples,)727 1507 y(some)f(operators)j(are)d
+(described)i(below;)f(for)f(each,)h(we)e(describe)j(what)e(the)g
+(operator)i(ar)n(-)727 1677 y(gument)i(might)f(be.)806
+1879 y FC(\017)46 b FP(RET)22 b(retrieves)k(tuples)g(of)d(a)h(stored)h
+(\256le.)32 b(The)23 b(operator)j(ar)n(gument)g(might)e(specify)897
+2048 y(the)g(name)g(of)f(the)h(stored)h(\256le)e(to)g(be)h(retrieved.)
+806 2234 y FC(\017)46 b FP(JOIN)23 b(joins)i(two)e(streams.)31
+b(The)24 b(operator)h(ar)n(gument)h(of)d(JOIN)g(could)i(specify)g(the)
+897 2404 y(join)d(predicate.)33 b(In)21 b(our)h(examples,)h(we)d(will)h
+(assume)h(that)g(the)g(operator)h(ar)n(gument)897 2573
+y(for)28 b(JOIN)f(speci\256es)j(an)d(equijoin)k(predicate)f(of)e(the)g
+(form)g FH(a)39 b FA(=)h FH(b)27 b FP(where)h FH(a)f
+FP(is)h(an)897 2743 y(attribute)e(of)d(the)h(outer)h(stream)f(and)g
+FH(b)f FP(is)g(an)h(attribute)h(of)f(the)g(inner)g(stream.)527
+2945 y FI(Algorithms.)47 b FD(Algorithms)20 b FP(are)f(concrete)i
+(implementations)h(of)d(abstract)i(operators;)i(they)d(are)727
+3114 y(represented)25 b(in)d(lower)g(case)g(with)g(the)g(\256rst)f
+(letter)i(capitalized)i(\(e.g.,)d(Nested)p 3226 3114
+28 4 v 34 w(loops\).)31 b(A)727 3284 y(single)h(operator)h(can)e(be)g
+(implemented)h(by)f(several)h(algorithms,)j(and)c(a)f(single)i(algo-)
+727 3453 y(rithm)22 b(can)g(implement)h(many)e(operators.)33
+b(Corresponding)25 b(to)c(the)h(operator)i(ar)n(guments)727
+3623 y(of)29 b(operators,)i(algorithms)g(have)e FD(algorithm)h(ar)m
+(guments)p FP(.)47 b(In)29 b(many)f(cases,)i(algorithm)727
+3792 y(ar)n(guments)25 b(are)d(the)g(same)g(as)g(the)g(operator)i(ar)n
+(guments)h(of)d(the)g(operators)i(that)f(they)g(im-)727
+3961 y(plement;)28 b(however)l(,)e(sometimes)h(algorithms)g(don')n(t)f
+(implement)h(any)e(particular)j(oper)n(-)727 4131 y(ator)21
+b(\(see)f(below\),)h(so,)g(in)f(general,)i(algorithm)f(ar)n(guments)i
+(are)d(dif)n(ferent)i(from)e(operator)727 4300 y(ar)n(guments.)527
+4503 y FI(Enfor)n(cers.)48 b FD(Enfor)m(cers)21 b FP(are)f(special)i
+(algorithms)h(that)d(are)h(not)f(implementations)k(of)c(any)g(par)n(-)
+727 4672 y(ticular)g(operator;)i(rather)l(,)f(they)e(are)g(algorithms)h
+(that)f(can)g(accept)g(their)h(input)f(from)f(other)727
+4841 y(algorithms)24 b(and)e(return)h(an)e(output)i(that)g(can)f(be)f
+(fed)h(to)f(other)i(algorithms)h(or)d(enforcers.)1905
+5349 y(12)p eop
+%%Page: 13 25
+13 24 bop 785 412 2331 13 v 785 503 4 92 v 838 521 a
+Fz(Operator)p 1187 503 V 104 w(Description)p 1858 503
+V 1911 476 a(Operator/Algorithm)p 2613 503 V 2666 521
+a(Algorithm)p 3112 503 V 785 595 V 1187 595 V 1858 595
+V 1911 567 a(Argument)p 2613 595 V 3112 595 V 785 607
+2331 13 v 785 699 4 92 v 838 723 a Fy(JOIN)p 1187 699
+V 240 w(Join)19 b(two)g(streams)p 1858 699 V 1911 716
+a(join)p 2031 716 23 4 v 27 w(predicate)p 2613 699 4
+92 v 2666 671 a(Nested)p 2877 671 23 4 v 27 w(loops)p
+3112 699 4 92 v 2616 702 500 4 v 785 790 4 92 v 1187
+790 V 1858 790 V 2613 790 V 2666 762 a(Mer)o(ge)p 2863
+762 23 4 v 27 w(join)p 3112 790 4 92 v 785 793 2331 4
+v 785 884 4 92 v 838 909 a(RET)p 1187 884 V 260 w(Retrieve)f(stored)i
+(\256le)p 1858 884 V 102 w(relation)f(name)p 2613 884
+V 2666 857 a(File)p 2787 857 23 4 v 26 w(scan)p 3112
+884 4 92 v 2616 888 500 4 v 785 976 4 92 v 1187 976 V
+1858 976 V 2613 976 V 2666 948 a(Index)p 2839 948 23
+4 v 28 w(scan)p 3112 976 4 92 v 785 979 2331 4 v 785
+1070 4 92 v 1187 1070 V 1240 1043 a(Sort)f(stream)p 1858
+1070 V 329 w(tuple)h(order)p 2613 1070 V 430 w(Mer)o(ge)p
+2863 1043 23 4 v 27 w(sort)p 3112 1070 4 92 v 785 1083
+2331 13 v 300 1236 a FP(T)-6 b(able)23 b(2.1:)31 b(Operators)25
+b(and)f(algorithms)i(in)d(a)g(centralized)j(V)-12 b(olcano)25
+b(query)g(optimizer)g(and)f(their)g(op-)300 1349 y(erator/algorithm)30
+b(ar)n(guments.)42 b(Note)26 b(that)h(Mer)n(ge)p 1958
+1349 28 4 v 34 w(sort)g(does)g(not)g(implement)g(any)g(operator)i(and)d
+(is)300 1462 y(an)e(enforcer)-5 b(.)727 1820 y(T)f(able)22
+b(2.1)h(lists)g(some)f(operators)j(and)e(algorithms)h(implementing)h
+(them)d(together)i(with)727 1989 y(their)29 b(operator/algorithm)k(ar)n
+(guments.)47 b(Note)28 b(that)h(Mer)n(ge)p 2681 1989
+V 34 w(sort)g(does)g(not)f(implement)727 2158 y(any)22
+b(particular)h(operator)g(because)g(it)e(is)g(actually)i(an)e(enforcer)
+-5 b(.)32 b(These)21 b(operators,)j(algo-)727 2328 y(rithms,)g(and)g
+(enforcers)i(will)d(be)h(used)g(in)g(subsequent)i(examples)f(in)f(this)
+g(chapter)-5 b(.)300 2729 y FI(Operator)29 b(T)-7 b(r)n(ee.)92
+b FP(An)27 b FD(operator)j(tr)m(ee)e FP(is)g(a)g(rooted)h(tree)g(whose)
+f(non-leaf,)j(or)d FD(interior)p FP(,)j(nodes)e(are)300
+2899 y(database)i(operations)i(\(operators,)g(algorithms,)f(or)e
+(enforcers\))i(and)d(whose)h(leaf)g(nodes)g(are)g(stored)300
+3068 y(\256les.)45 b(Operator)30 b(trees)f(\(also)h(called)g
+FD(expr)m(essions)p FP(\))h(are)e(represented)j(in)c(LISP-like)g
+(pre\256x)h(notation)300 3237 y(form.)302 3506 y(E)t
+Fx(X)t(A)t(M)t(P)t(L)t(E)h FP(1)t(.)162 b(The)23 b(expression,)948
+3750 y(\(JOIN)g(?op)p 1333 3750 V 34 w(ar)n(g1)h(\(\(RET)e(?op)p
+1934 3750 V 34 w(ar)n(g2)j(\(\)\))f(\(RET)d(?op)p 2619
+3750 V 34 w(ar)n(g3)k(\(\)\)\))300 3994 y(denotes)i(a)e(stream)h(that)g
+(\256rst)f(RET)m(rieves)g(two)g(stored)i(relations,)h(and)d(then)h
+(JOINs)f(them.)37 b FA(?)p FP(op)p 3412 3994 V 33 w(ar)n(g)r
+FA(2)300 4164 y FP(and)21 b FA(?)p FP(op)p 589 4164 V
+34 w(ar)n(g)q FA(3)g FP(are)f(the)h(operator)i(ar)n(guments)g(of)e(the)
+g(two)f(RET)-6 b(s)19 b(respectively)-6 b(,)24 b(and)d(are)g(the)g
+(names)g(of)300 4333 y(the)j(stored)h(\256les)f(to)f(be)h(retrieved.)34
+b FA(?)p FP(op)p 1571 4333 V 33 w(ar)n(g)r FA(1)23 b
+FP(is)h(the)g(operator)i(ar)n(gument)f(of)f(the)g(JOIN)f(operator)j
+(and)300 4503 y(denotes)f(the)f(join)g(predicate.)2278
+b Fw(\003)298 4804 y FI(Access)23 b(Plan.)90 b FP(An)22
+b FD(access)h(plan)g FP(is)f(an)g(operator)i(tree)e(in)g(which)g(all)h
+(interior)g(nodes)h(are)e(algorithms)300 4974 y(or)h(enforcers.)1905
+5349 y(13)p eop
+%%Page: 14 26
+14 25 bop 294 391 a FI(Pr)n(operties.)93 b FD(Pr)m(operties)19
+b FP(are)f(information)i(associated)h(with)c(each)i(node)f(in)g(an)g
+(operator)h(tree.)30 b(Each)296 561 y(node)21 b(has)f(a)f(speci\256c)i
+(value)g(for)f(every)h(property)h(associated)h(with)c(it,)h(and)h(the)f
+(complete)h(property)h(set)300 730 y(speci\256es)k(a)e(node)h(uniquely)
+-6 b(.)37 b(In)24 b(V)-12 b(olcano,)26 b(in)e(addition)j(to)e(the)f
+(operator/algorithm)30 b(ar)n(guments)d(that)300 899
+y(we)c(have)h(seen)g(above,)h(there)f(are)g(four)g(sets)g(of)g
+(properties:)436 1144 y FC(\017)46 b FI(Logical)34 b(Pr)n(operties.)59
+b FD(Logical)33 b(pr)m(operties)i FP(are)d(those)i(properties)h(of)d(a)
+g(node)i(that)e(can)h(be)527 1313 y(uniquely)24 b(determined)g
+FD(prior)f FP(to)f(optimization.)33 b(Logical)22 b(properties)i(of)e
+(an)g(abstract)h(operator)527 1482 y(are)f(computed)h(bottom-up,)g
+(i.e.,)e(from)g(the)g(leaves)i(of)e(an)g(operator)i(tree.)31
+b(The)20 b(logical)j(proper)n(-)527 1652 y(ties)g(of)e(an)h(algorithm)i
+(are)e(the)g(same)g(as)g(the)g(logical)h(properties)i(of)d(the)g
+(abstract)i(operator)g(that)527 1821 y(it)d(implements,)h(and)f(the)g
+(logical)h(properties)i(of)c(an)h(enforcer)i(are)e(the)g(same)f(as)h
+(those)h(of)e(its)h(in-)527 1990 y(put.)30 b(For)19 b(instance,)k(the)d
+(list)g(of)g(attributes)i(of)e(a)f(stored)i(\256le)e(or)h(a)f(stream)i
+(\(without)g(projections\))527 2160 y(can)j(be)g(determined)h(from)f
+(database)i(catalogs)f(before)g(optimization.)436 2404
+y FC(\017)46 b FI(System)27 b(Pr)n(operties.)41 b FD(System)27
+b(pr)m(operties)i FP(are)d(a)g(special)i(class)f(of)g(logical)h
+(properties,)h(con-)527 2573 y(sisting)f(of)e(the)h(two)f(properties)j
+(\252cardinality\272)g(and)e(\252record)p 2505 2573 28
+4 v 35 w(width\272.)40 b(For)26 b(all)g(practical)i(pur)n(-)527
+2743 y(poses,)23 b(these)g(two)e(properties)k(are)d(exactly)h(like)g
+(logical)g(properties.)33 b(The)21 b(rationale)j(for)e(treat-)527
+2912 y(ing)i(them)g(dif)n(ferently)j(is)c(not)h(clearly)h(de\256ned)f
+(in)g(the)g(V)-12 b(olcano)25 b(literature.)436 3156
+y FC(\017)46 b FI(Physical)22 b(Pr)n(operties.)32 b FD(Physical)23
+b(pr)m(operties)h FP(are)e(properties)i(associated)h(with)c(the)h(data)
+h(pro-)527 3325 y(duced)d(by)f(an)f(algorithm)j(or)d(enforcer)-5
+b(.)31 b(Physical)20 b(properties)h(are)e(propagated)j(bottom-up,)f
+(i.e.,)527 3495 y(physical)e(properties)h(of)d(a)g(node)g(are)h
+(computed)g(as)f(a)g(function)i(of)e(the)g(properties)j(\(logical,)g
+(sys-)527 3664 y(tem,)j(and)h(physical\))i(of)e(its)f(inputs.)436
+3908 y FC(\017)46 b FI(Cost.)34 b FP(This)25 b(property)i(represents)g
+(the)e(cost)h(of)e(a)g(node;)j(it)d(has)h(a)g(meaningful)i(value)e
+(only)h(for)527 4078 y(algorithm)f(and)e(enforcer)h(nodes.)32
+b(Cost)22 b(is)h(not)g(a)f(logical)i(or)f(system)g(property)i(since)e
+(its)g(value)527 4247 y(cannot)i(be)f(determined)i(solely)f(from)e
+(abstract)i(operators.)2435 4214 y Fv(1)297 4491 y FP(The)20
+b(DBI)f(has)i(to)f(specify)i(the)f(list)g(of)f(properties,)k(and)d(the)
+g(type)g(\(logical,)i(system,)e(physical,)i(or)e(cost\))300
+4660 y(of)27 b(each.)40 b(Generally)29 b(speaking,)g(if)d(the)h
+(property)i(value)f(of)e FD(each)i FP(node)f(in)g(an)f(operator)j(tree)
+e(can)g(be)p 300 4741 1320 4 v 400 4795 a Fu(1)434 4827
+y Fy(In)15 b(many)g(real-world)f(query)h(optimizers)f(\(e.g.,)h(System)
+f(R)f([46])i(and)g(R)2304 4795 y Ft(\003)2354 4827 y
+Fy([45]\),)f(the)h(cost)f(of)g(a)g(node)i(is)d(a)i(function)f(of)h(the)
+300 4918 y(costs)i(of)f(its)g(inputs.)24 b(Thus,)17 b(in)f(V)-10
+b(olcano')l(s)17 b(terminology)-5 b(,)18 b(cost)f(should)g(really)f(be)
+h(a)f(physical)h(property)-5 b(.)25 b(However)m(,)17
+b(V)-10 b(olcano)300 5010 y(treats)19 b(cost)g(as)f(a)h(fourth)h
+(category)g(of)e(property)-5 b(.)1905 5349 y FP(14)p
+eop
+%%Page: 15 27
+15 26 bop 671 412 2558 13 v 671 503 4 92 v 724 476 a
+Fz(Pr)o(operty)p 1162 503 V 206 w(T)-6 b(ype)p 1518 503
+V 200 w(Description)p 3225 503 V 671 516 2558 13 v 671
+607 4 92 v 724 580 a Fy(tuple)p 877 580 23 4 v 28 w(order)p
+1162 607 4 92 v 157 w(Physical)p 1518 607 V 103 w(tuple)20
+b(order)f(of)g(resulting)g(stream,)g(DONT)p 2726 580
+23 4 v 26 w(CARE)f(if)g(none)p 3225 607 4 92 v 671 611
+2558 4 v 671 702 4 92 v 724 674 a(cardinality)p 1162
+702 V 172 w(System)p 1518 702 V 136 w(number)i(of)f(tuples)h(of)e
+(resulting)i(stream)p 3225 702 V 671 705 2558 4 v 671
+796 4 92 v 724 769 a(record)p 918 769 23 4 v 28 w(width)p
+1162 796 4 92 v 103 w(System)p 1518 796 V 136 w(size)f(of)g(individual)
+h(tuple)f(in)g(stream)p 3225 796 V 671 800 2558 4 v 671
+891 4 92 v 724 864 a(attributes)p 1162 891 V 213 w(Logical)p
+1518 891 V 128 w(list)g(of)f(attributes)p 3225 891 V
+671 894 2558 4 v 671 986 4 92 v 724 958 a(cost)p 1162
+986 V 371 w(Cost)p 1518 986 V 219 w(estimated)i(cost)f(of)g(algorithm)p
+3225 986 V 671 998 2558 13 v 853 1151 a FP(T)-6 b(able)24
+b(2.2:)31 b(Properties)25 b(of)f(nodes)g(in)g(an)f(operator)j(tree)e
+(in)f(V)-12 b(olcano)300 1528 y(determined)28 b(before)f(any)f(rules)h
+(are)f(applied)h(to)f(it,)g(it)f(is)h(a)f(logical)i(property)h(\(or)e
+(system)h(property)g(if)298 1697 y(it)22 b(is)f(one)i(of)e(two)h
+(special)h(properties\),)i(and)d(if)g(a)f(property)j(value)f(can)f(be)g
+(determined)i(only)f(when)f(the)300 1867 y(node)27 b(is)f(an)h
+(algorithm)h(or)e(an)g(enforcer)l(,)j(it)d(is)g(a)g(physical)j
+(property)-6 b(.)41 b(If)26 b(the)h(property)h(computes)g(the)300
+2036 y(relative)d(merit)e(of)h(an)f(access)i(plan,)f(then)g(the)g
+(property)h(is)e(the)h(cost.)31 b(Furthermore,)25 b(logical,)g(system,)
+300 2205 y(and)j(physical)i(properties)g(are)e(computed)h(bottom-up;)j
+(the)27 b(dif)n(ference)k(is)c(that)h(logical)h(and)f(system)298
+2375 y(properties)c(are)e(determined)h(prior)g(to)e(optimization,)j
+(whereas)f(physical)g(properties)i(are)c(determined)300
+2544 y(after)j(a)f(tree)h(\(or)g(subtree\))i(has)e(been)g(optimized.)
+583 2713 y(It)g(is)g(worth)g(noting)h(that)g(some)f(properties)i
+(\(such)f(as)f(attributes)i(of)e(a)f(stream\))i(can)f(be)g(either)292
+2883 y(physical)19 b(or)d(logical)i(depending)h(on)e(the)g(semantics)h
+(of)e(the)h(operators)i(in)d(the)g(database)j(schema.)29
+b(Thus,)299 3052 y(altering)c(the)f(semantics)h(of)e(an)g(optimizer)h
+(requires)i(the)d(DBI)f(to)h(re-examine)i(the)e(partition)j(of)d(prop-)
+300 3222 y(erties.)32 b(This,)23 b(as)g(it)h(turns)g(out,)g(is)f
+(problematic)j(for)e(V)-12 b(olcano)25 b(optimizer)g(designers.)576
+3391 y(T)-6 b(able)16 b(2.2)g(lists)h(the)g(dif)n(ferent)h(properties)h
+(and)e(their)g(types)h(that)f(we)e(will)h(use)h(in)f(our)h(examples.)
+292 3560 y(The)f(only)h(logical)h(property)g(is)e(the)h(list)g(of)f
+(\252attributes\272,)21 b(and)16 b(the)h(system)g(properties)i(are)d
+(\252cardinality\272)300 3730 y(and)24 b(\252record)p
+729 3730 28 4 v 35 w(width\272.)31 b(The)23 b(single)i(physical)g
+(property)h(is)d(the)g(\252tuple)p 2560 3730 V 35 w(order)s(\272)i(of)f
+(the)f(output)i(stream.)300 3899 y(The)e(cost)h(property)i(will)d(be)h
+(called)h(\252cost\272.)292 4201 y FI(Constraints.)92
+b FD(Constraints)19 b FP(are)e(requirements)i(on)e(physical)i(property)
+f(values)g(that)f(are)g(imposed)h(on)295 4370 y(an)h(operator)h(tree.)
+30 b(An)18 b(access)i(plan)g(for)f(an)g(operator)h(tree)g(is)e
+(acceptable)k(if)c(and)i(only)f(if)g(it)f(satis\256es)i(the)296
+4539 y(constraints)j(that)e(are)g(imposed)g(upon)g(it.)30
+b(There)20 b(are)g(two)g(types)h(of)f(constraints)j(in)d(V)-12
+b(olcano.)32 b(The)19 b(\256rst)300 4709 y(type)25 b(is)e(represented)k
+(by)e(a)e FD(needed)j(pr)m(operty)f(vector)p FP(.)34
+b(This)23 b(speci\256es)j(the)e(list)g(of)g(physical)i(property)292
+4878 y(values)18 b(that)f(an)f(access)i(plan)f FD(must)h
+FP(have)f(to)f(be)h(an)f(acceptable)j(plan.)30 b(The)15
+b(second)k(type)e(of)f(constraint)j(is)297 5048 y(represented)25
+b(by)c(an)g FD(excluded)i(pr)m(operty)g(vector)g FP(and)f(it)e
+(speci\256es)j(a)d(list)i(of)f(physical)i(property)g(values)1905
+5349 y(15)p eop
+%%Page: 16 28
+16 27 bop 297 391 a FP(that)22 b(a)f(plan)h FD(must)f(not)h
+FP(have)g(to)f(be)g(acceptable.)33 b(Each)21 b(node)h(in)f(an)h
+(operator)h(tree)e(may)g(have)h(dif)n(ferent)300 561
+y(constraints)30 b(on)d(it;)h(however)l(,)h(it)d(is)h(the)g
+(constraints)j(on)c(the)h(root)h(of)e(an)h(operator)i(tree)e(that)g
+(must)g(be)300 730 y(satis\256ed)e(for)e(an)h(access)h(plan)f(to)g(be)f
+(acceptable.)302 999 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30
+b FP(2)t(.)162 b(Consider)25 b(the)f(expression,)948
+1243 y(\(JOIN)f(?op)p 1333 1243 28 4 v 34 w(ar)n(g1)h(\(\(RET)e(?op)p
+1934 1243 V 34 w(ar)n(g2)j(\(\)\))f(\(RET)d(?op)p 2619
+1243 V 34 w(ar)n(g3)k(\(\)\)\))300 1487 y(to)19 b(be)f(optimized.)31
+b(If)19 b(\252need)p 1201 1487 V 34 w(pv\272)h(denotes)g(the)f(needed)h
+(property)h(vector)l(,)g(and)f(\252excl)p 3015 1487 V
+34 w(pv\272)f(denotes)i(the)300 1657 y(excluded)27 b(property)f(vector)
+l(,)g(then)f(we)e(can)i(specify)h(the)f(constraints)i(by)d(setting)i
+(appropriate)i(values)300 1826 y(for)c(the)g(physical)h(properties)i
+(in)c(need)p 1543 1826 V 34 w(pv)h(and)g(excl)p 1995
+1826 V 34 w(pv)-6 b(.)31 b(Thus,)23 b(setting)300 2070
+y(need)p 475 2070 V 34 w(pv)-6 b(.tuple)p 796 2070 V
+36 w(order)24 b(=)f(DONT)p 1374 2070 V 31 w(CARE)300
+2239 y(excl)p 455 2239 V 34 w(pv)-6 b(.tuple)p 776 2239
+V 35 w(order)25 b(=)e FH(b)300 2483 y FP(speci\256es)18
+b(that)g(any)f(access)h(plan)g(that)f(implements)h(the)g(JOIN)e
+(expression)j(above)g(can)e(return)h(tuples)g(in)300
+2653 y(any)f(order)h(\(DONT)p 944 2653 V 32 w(CARE\),)d(as)h(long)i(as)
+f(they)h(are)f(not)h(in)e FH(b)h FP(order)h(\()p FH(b)e
+FP(has)i(to)e(be)h(an)g(attribute)j(of)d(at)f(least)300
+2822 y(one)25 b(of)g(the)g(two)g(relations)i(RET)m(rieved\).)35
+b(An)24 b(access)i(plan)g(that)f(does)h(not)f(satisfy)h(these)g
+(constraints)300 2992 y(would)e(not)g(be)f(a)h(valid)g(implementation)j
+(of)c(the)h(operator)h(tree.)1155 b Fw(\003)583 3227
+y FP(V)-12 b(olcano)27 b(uses)f(both)g(needed)g(property)h(vectors)g
+(and)f(excluded)h(property)g(vectors)g(to)e(select)300
+3397 y(a)i(plan.)42 b(In)27 b(the)g(above)i(example,)g(suppose)g(there)
+f(exists)g(an)f(access)i(plan)e(of)h(the)f(given)h(tree)g(with)f(a)300
+3566 y(tuple)p 485 3566 V 35 w(order)f(of)g FH(b)p FP(.)36
+b(If)25 b(we)g(only)i(looked)g(at)e(the)h(needed)i(property)f(vector)l
+(,)h(we)d(would)h(be)g(inclined)h(to)300 3735 y(accept)g(this)g(plan,)g
+(since)g(the)f(needed)i(property)g(vector)g(speci\256es)f(that)g(the)f
+(plan)h(return)g(a)f(stream)g(in)300 3905 y(DONT)p 559
+3905 V 31 w(CARE)c(order)j(\(i.e.,)e(any)i(order\).)33
+b(However)l(,)25 b(the)f(excluded)j(property)f(vector)f(speci\256es)h
+(that)300 4074 y(this)e(plan)g(is)g(not)g(acceptable.)300
+4441 y FO(2.3)119 b(V)-11 b(olcano)30 b(Optimization)h(Paradigm)296
+4704 y FP(V)-12 b(olcano)22 b(employs)g(a)d(top-down)j(query)g
+(optimization)h(paradigm)e(that)g(rewrites)g(operator)i(trees)e(start-)
+300 4873 y(ing)26 b(from)f(the)g(root.)36 b(Parents)26
+b(are)g(considered)i(before)e(children)i(for)d(optimization.)39
+b(Informally)-6 b(,)27 b(ab-)300 5043 y(stract)g(operators)h(are)e
+(transformed)i(into)e(algorithms)i(top-down)f(until)g(an)e(access)i
+(plan)g(is)e(obtained.)1905 5349 y(16)p eop
+%%Page: 17 29
+17 28 bop 371 403 3142 4 v 371 1620 4 1218 v 425 691
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.3 true 3.8 neg 6.71495
+neg 89.15826 32.61813 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial -169 x FH(E)5
+b(;)15 b(E)609 489 y FB(0)634 522 y FP(:)30 b(Expression)425
+691 y FH(P)483 705 y Fs(i)512 691 y FH(;)15 b(P)623 658
+y FB(0)610 715 y Fs(i)646 691 y FP(:)31 b(Property)1517
+853 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [
+105.8441 -22.19318 17.07164 -22.19318 /Lineto /lineto load def false
+Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [
+105.8441 -37.55754 17.07164 -37.55754 /Lineto /lineto load def false
+Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [
+105.8441 -52.92218 17.07164 -52.92218 /Lineto /lineto load def false
+Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [
+105.8441 -68.28656 17.07164 -68.28656 /Lineto /lineto load def false
+Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -68.28656 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -52.92218 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -37.55754 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -22.19318 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 0.0 0.0 Ellipse closepath
+gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 1381 884 a FH(E)1609
+877 y(P)1667 891 y Fv(1)1609 1062 y FH(P)1667 1076 y
+Fv(2)1609 1189 y FH(P)1667 1203 y Fv(3)1609 1317 y FH(P)1667
+1331 y Fv(4)1609 1444 y FH(P)1667 1458 y Fv(5)1885 866
+y(=)-12 b FB(\))1517 853 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -68.28656 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -52.92218 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -37.55754 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -22.19318 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 102.42984 0.0 Ellipse
+closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 0.0 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 2220 888 a FH(E)2292 855 y FB(0)2460
+876 y FH(P)2531 843 y FB(0)2518 900 y Fv(1)2721 874 y
+FP(Operator)25 b(Ar)n(gument)2460 1061 y FH(P)2531 1028
+y FB(0)2518 1084 y Fv(2)2721 1058 y FP(Logical)g(Property)2460
+1188 y FH(P)2531 1155 y FB(0)2518 1211 y Fv(3)2721 1186
+y FP(System)f(Property)2460 1316 y FH(P)2531 1283 y FB(0)2518
+1339 y Fv(4)2721 1313 y FP(Physical)h(Property)2460 1443
+y FH(P)2531 1410 y FB(0)2518 1466 y Fv(5)2721 1450 y
+FP(Cost)p 3509 1620 V 371 1623 3142 4 v 3511 1640 19
+1225 v 388 1640 3142 19 v 300 1836 a(Figure)d(2.2:)31
+b(General)23 b(form)f(of)f(a)h(V)-12 b(olcano)23 b(rule.)31
+b(Single)22 b(arrows)h(denote)g(one)g(or)f(more)g(DBI-de\256ned)300
+1949 y(support)k(functions.)33 b(The)24 b(properties)i(that)e(are)g
+(translated)j(by)c(the)h(rule)h(or)e(by)h(support)i(functions)g(are)300
+2062 y(listed)f(on)e(the)h(right.)292 2438 y(The)16 b(search)i(engine)g
+(provided)g(by)f(V)-12 b(olcano)18 b(uses)f(dynamic)g(programming)i(to)
+d(prune)i(the)e(search)i(space)300 2607 y(by)24 b(discarding)i
+(operator)g(trees)e(that)g(are)g(determined)i(to)d(lead)h(to)g(a)f
+(sub-optimal)j(access)f(plan.)583 2777 y(Before)j(the)f(start)g(of)g
+(optimization,)j(certain)f(properties)g(of)e(the)g(original)i(operator)
+g(tree)e(are)294 2946 y(initialized.)k(As)17 b(described)k(in)c
+(Section)i(2.2,)g(logical)g(and)f(system)h(properties)h(of)e(nodes)h
+(of)f(an)f(operator)300 3116 y(tree)25 b(can)f(be)h(determined)h(prior)
+f(to)f(optimization.)36 b(The)24 b(initialization)k(of)c(these)h
+(properties)i(for)d(each)300 3285 y(subtree)h(is)f(done)g(by)g
+(DBI-de\256ned)g(functions;)i(these)f(are)f(de\256ned)g(in)f(Section)i
+(2.7.)300 3651 y FO(2.4)119 b(Rules)30 b(in)h(V)-11 b(olcano)578
+3914 y FP(Rules)20 b(in)e(V)-12 b(olcano)21 b(correspond)h(to)d
+(rewrites)h(between)g(pairs)g(of)e(expressions,)23 b(or)c(between)h(an)
+299 4084 y(expression)26 b(and)d(an)g(access)i(plan.)31
+b(Figure)23 b(2.2)g(shows)g(the)g(general)i(format)e(of)g(a)g(V)-12
+b(olcano)24 b(rule.)31 b(This)293 4253 y(general)20 b(rule)e(results)h
+(in)e(two)g(types)i(of)e(transformations)22 b(\(or)17
+b FD(r)m(ewrite)h(rules)p FP(\))h(in)f(V)-12 b(olcano:)30
+b(transforma-)299 4423 y(tion)24 b(rules)g(and)f(implementation)j
+(rules.)32 b(Each)23 b(rule)g(transforms)i(an)e(expression)j(into)e
+(another)h(based)300 4592 y(on)31 b(additional)i(conditions;)k(the)31
+b(transformation)j(also)d(triggers)h(execution)i(of)c(other)i
+(DBI-de\256ned)297 4761 y(functions)23 b(that)f(results)g(in)f(a)f
+(mapping)i(of)f(properties)i(between)f(expressions.)33
+b(This)21 b(is)f(shown)i(clearly)296 4931 y(in)f(Figure)f(2.2,)h(where)
+f(the)h(single)g(arrows)g(represent)i(functions)g(executed)f(as)e(a)g
+(result)h(of)g(application)300 5100 y(of)28 b(a)g(V)-12
+b(olcano)29 b(rule.)45 b(T)m(ransformation)31 b(and)d(implementation)j
+(rules)e(are)f(de\256ned)h(precisely)h(in)e(Sec-)1905
+5349 y(17)p eop
+%%Page: 18 30
+18 29 bop 312 303 3260 4 v 312 1056 4 753 v 386 383 a
+Fv(\()p Fs(E)23 b FF(?op)p 587 383 20 4 v 25 w(ar)o(g1)d
+Fv(\(?1)13 b Fs(:)e(:)h(:)o Fv(?)p Fs(n)p Fv(\)\))21
+b FB(!)e Fv(\()p Fs(E)1258 356 y Ft(0)1300 383 y FF(?op)p
+1399 383 V 25 w(ar)o(g2)h Fv(\(?1)13 b Fs(:)f(:)f(:)p
+Fv(?)p Fs(n)p Fv(\)\))1516 b FF(\(2.1\))386 462 y(\045cond)p
+573 462 V 25 w(code)386 541 y FB(ff)601 620 y FF(test)386
+699 y FB(gg)386 778 y FF(\045appl)p 558 778 V 25 w(code)386
+857 y FB(ff)601 936 y FF(post-test)19 b(statements)386
+1014 y FB(gg)p 3568 1056 4 753 v 312 1059 3260 4 v 3570
+1076 19 760 v 328 1076 3260 19 v 844 1272 a FP(Figure)24
+b(2.3:)31 b(General)24 b(form)g(of)f(a)g(transformation)k(rule)e(in)e
+(V)-12 b(olcano)296 1648 y(tions)22 b(2.5)e(and)g(2.6)g(and)h(are)f
+(illustrated)j(with)d(examples.)31 b(The)20 b(examples)i(are)e(chosen)i
+(from)e(rules)h(that)297 1818 y(would)g(be)g(used)h(in)e(a)g
+(centralized)k(relational)g(query)d(optimizer;)j(the)d(operators,)j
+(algorithms,)f(and)e(en-)297 1987 y(forcers)i(are)e(subsets)i(of)e
+(those)h(in)f(T)-6 b(able)21 b(2.1.)30 b(DBI-de\256ned)21
+b(functions)j(are)d(described)j(in)d(more)g(detail)300
+2157 y(in)i(Section)i(2.7.)300 2523 y FO(2.5)119 b(T)-9
+b(ransformation)29 b(Rules)582 2786 y FD(T)-5 b(ransformation)25
+b(rules)p FP(,)e(or)e(trans)p 1671 2786 28 4 v 35 w(rules,)i(in)e(V)-12
+b(olcano)24 b(de\256ne)e(mappings)i(from)e(one)g(operator)300
+2956 y(tree)h(to)h(another)-5 b(.)32 b(Let)23 b FH(E)28
+b FP(and)23 b FH(E)1336 2923 y FB(0)1383 2956 y FP(be)g(expressions)j
+(that)e(involve)i(only)e(abstract)h(operators.)33 b(Equation)293
+3125 y(\(2.1\))17 b(\(shown)g(in)g(Figure)g(2.3\))g(shows)g(the)h
+(general)g(form)f(of)f(a)h(trans)p 2441 3125 V 34 w(rule)h(in)e(V)-12
+b(olcano.)30 b(The)17 b(expression)300 3294 y FH(E)30
+b FP(on)c(the)h(left)f(side)g(is)g(transformed)i(into)f(the)f
+(expression)j FH(E)2306 3261 y FB(0)2355 3294 y FP(on)c(the)i(right)f
+(side.)39 b(The)25 b(actions)j(of)e(a)300 3464 y(trans)p
+480 3464 V 34 w(rule)32 b(de\256ne)f(equivalences)j(between)e(the)f
+(operator)i(ar)n(guments)g(of)d(the)h(input)h(expression)i
+FH(E)296 3633 y FP(with)20 b(the)g(operator)j(ar)n(guments)f(of)e(the)g
+(output)i(expression)h FH(E)2283 3600 y FB(0)2306 3633
+y FP(.)29 b(A)19 b(test)i(is)f(needed)h(to)f(determine)i(if)e(the)300
+3802 y(transformation)27 b(is)c(indeed)i(applicable.)583
+3972 y(The)g(\256rst)g(part)g(of)g(the)h(actions)h(associated)h(with)c
+(a)h(trans)p 2426 3972 V 35 w(rule)g(is)g(the)h(test,)f(called)i
+FD(condition)292 4141 y(code)17 b FP(in)g(V)-12 b(olcano.)29
+b(This)17 b(is)f(any)h(arbitrary)h(section)g(of)f(C)e(code)2252
+4108 y Fv(2)2308 4141 y FP(that)i(tests)h(whether)f(the)g
+(transformation)293 4311 y(rule)h(can)g(indeed)h(be)f(applied)h(to)e
+(the)h(expression)i FH(E)5 b FP(.)29 b(The)17 b(test)h(can)g(reference)
+h(the)f(operator)i(ar)n(guments)298 4480 y(of)i(the)g(expressions)k(on)
+c(the)g(left)g(side)h(and/or)g(the)g(logical)g(or)f(system)h
+(properties)h(of)e(any)h(of)f(the)g(input)300 4649 y(streams.)32
+b(If)23 b(the)h(rule)g(does)g(not)g(apply)-6 b(,)25 b(then)f(the)g
+(expression)i FH(E)i FP(is)c(left)g(unchanged.)583 4819
+y(If)j(the)g(trans)p 987 4819 V 35 w(rule)g(does)h(apply)g(to)f
+FH(E)5 b FP(,)27 b(then)h(post-test)h(actions,)g(called)f
+FD(application)j(code)c FP(in)p 300 4900 1320 4 v 400
+4954 a Fu(2)434 4985 y Fy(The)16 b(condition)h(code)f(doesn')o(t)g
+(return)g(a)f(boolean)i(value.)25 b(It)15 b(succeeds)h(if)f(a)h(REJECT)
+e(statement)i(is)f(not)h(processed,)h(and)300 5077 y(fails)h
+(otherwise.)1905 5349 y FP(18)p eop
+%%Page: 19 31
+19 30 bop 312 403 3260 4 v 312 1229 4 827 v 386 478 a
+Fv(\()p FF(JOIN)19 b(?op)p 675 478 20 4 v 25 w(ar)o(g5)i
+Fv(\(\()p FF(JOIN)f(?op)p 1150 478 V 25 w(ar)o(g4)g Fv(\(?1)h(?2\)\))g
+(?3\)\))g FB(!)e Fv(\()p FF(JOIN)h(?op)p 2089 478 V 25
+w(ar)o(g7)g Fv(\(?1)h(\()p FF(JOIN)f(?op)p 2652 478 V
+25 w(ar)o(g6)g Fv(\(?2)h(?3\)\)\)\))292 b FF(\(2.2\))386
+557 y(\045cond)p 573 557 V 25 w(code)386 635 y FB(ff)601
+714 y FF(?op)p 700 714 V 25 w(ar)o(g6)21 b Fv(=)e FF(predicate)p
+1176 714 V 27 w(intersect)h Fv(\(?2)p Fs(;)13 b FF(?op)p
+1668 714 V 24 w(ar)o(g5)q Fv(\))k(;)601 793 y FF(if)h
+Fv(\()p FF(empty)g Fv(\()p FF(?op)p 995 793 V 25 w(ar)o(g6)q
+Fv(\)\))f FF(REJECT)f Fv(;)386 872 y FB(gg)386 951 y
+FF(\045appl)p 558 951 V 25 w(code)386 1030 y FB(ff)601
+1109 y FF(?op)p 700 1109 V 25 w(ar)o(g7)21 b Fv(=)e FF(?op)p
+1031 1109 V 25 w(ar)o(g4)e Fv(;)386 1188 y FB(gg)p 3568
+1229 4 827 v 312 1232 3260 4 v 3570 1249 19 833 v 328
+1249 3260 19 v 1060 1445 a FP(Figure)24 b(2.4:)31 b(Join)24
+b(associativity)k(transformation)f(rule)300 1822 y(V)-12
+b(olcano,)27 b(are)e(executed.)38 b(This)24 b(is)h(an)g(arbitrary)j
+(piece)e(of)f(C)f(code)i(that)f(sets)h(the)f(operator)i(ar)n(gument)300
+1991 y(of)d(the)h(expression)j FH(E)1019 1958 y FB(0)1066
+1991 y FP(on)c(the)h(right)g(side.)35 b(The)24 b(application)j(code)f
+(is)e(executed)j(immediately)f(if)e(the)300 2160 y(condition)i(code)f
+(is)e(satis\256ed.)580 2330 y(As)d(mentioned)j(in)e(Section)g(2.3,)g(a)
+f(trans)p 1885 2330 28 4 v 35 w(rule)h(in)g(V)-12 b(olcano)22
+b(triggers)h(two)d(DBI-de\256ned)h(func-)299 2499 y(tions)j(for)f
+(determining)j(the)d(logical)h(and)g(system)f(properties)j(of)d(any)g
+(new)f(expressions)27 b(obtained)e(by)294 2668 y(application)c(of)d
+(the)h(rule.)29 b(Since)18 b(a)g(trans)p 1586 2668 V
+34 w(rule)h(only)g(transforms)h(logical)g(expressions,)i(physical)e
+(prop-)300 2838 y(erties)25 b(and)f(cost)g(\(as)g(shown)g(in)f(Figure)h
+(2.2\))g(are)g(not)f(transformed)j(in)e(a)f(trans)p 2823
+2838 V 34 w(rule.)302 3107 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30
+b FP(3)t(.)164 b(The)25 b(associativity)k(of)c(JOINs)g(is)g(expressed)j
+(by)d(trans)p 2712 3107 V 35 w(rule)h(\(2.2\))f(in)h(Figure)g(2.4.)300
+3276 y(The)c(condition)j(code)e(of)f(trans)p 1298 3276
+V 35 w(rule)g(\(2.2\))h(determines)i(the)d(operator)j(ar)n(gument)f
+(\(i.e.,)e(the)g(join)h(pred-)300 3445 y(icate\))29 b(of)f(the)h(inner)
+g(join)g(on)f(the)h(right)g(side.)46 b(If)28 b(it)g(is)g(empty)-6
+b(,)29 b(implying)h(a)e(cross-product,)33 b(the)c(rule)300
+3615 y(is)e(rejected,)i(and)f(the)f(expression)j(on)d(the)h(left)f
+(side)h(remains)g(unchanged.)44 b(If,)27 b(however)l(,)j(the)d(test)g
+(is)300 3784 y(successful,)h(the)d(application)j(code)e(assigns)h(the)e
+(operator)i(ar)n(gument)g(\(join)f(predicate\))h(of)e(the)g(outer)300
+3954 y(join)e(on)f(the)g(right)h(side.)31 b(Logical)23
+b(and)g(system)g(properties)i(of)d(the)g(new)g(subexpressions)27
+b(on)22 b(the)g(right)300 4123 y(side)i(of)g(Equation)h(2.2)e(are)h
+(computed)h(by)f(DBI-de\256ned)g(functions,)i(externally)g(to)d(the)h
+(rule.)208 b Fw(\003)300 4490 y FO(2.6)119 b(Implementation)30
+b(Rules)580 4753 y FD(Implementation)24 b(rules)p FP(,)e(or)e(impl)p
+1662 4753 V 33 w(rules,)i(in)f(V)-12 b(olcano)22 b(specify)g
+(implementations)i(of)d(abstract)300 4922 y(operators.)38
+b(Let)25 b FH(O)i FP(be)f(an)f(operator)i(and)f FH(A)f
+FP(be)g(an)g(algorithm)i(that)f(implements)h FH(O)s FP(.)35
+b(Equation)27 b(\(2.3\))300 5091 y(\(shown)f(in)f(Figure)g(2.5\))g
+(shows)g(the)h(general)g(form)f(of)g(an)g(impl)p 2376
+5091 V 33 w(rule)h(in)e(V)-12 b(olcano.)37 b(A)23 b(test)j(is)f(needed)
+1905 5349 y(19)p eop
+%%Page: 20 32
+20 31 bop 312 303 3260 4 v 312 1051 4 748 v 386 378 a
+Fv(\()p Fs(E)23 b FF(?op)p 587 378 20 4 v 25 w(ar)o(g1)d
+Fv(\(?1)13 b Fs(:)e(:)h(:)o Fv(?)p Fs(n)p Fv(\)\))21
+b FB(!)e Fv(\()p Fs(A)h FF(?al)p 1355 378 V 26 w(ar)o(g1)g
+Fv(\(?1)13 b Fs(:)e(:)g(:)p Fv(?)p Fs(n)p Fv(\)\))1560
+b FF(\(2.3\))386 457 y(\045cond)p 573 457 V 25 w(code)386
+536 y FB(ff)601 615 y FF(test)386 694 y FB(gg)386 772
+y FF(\045appl)p 558 772 V 25 w(code)386 851 y FB(ff)601
+930 y FF(post-test)19 b(statements)386 1009 y FB(gg)p
+3568 1051 4 748 v 312 1054 3260 4 v 3570 1070 19 754
+v 328 1070 3260 19 v 803 1266 a FP(Figure)24 b(2.5:)32
+b(General)24 b(form)f(of)h(an)f(implementation)k(rule)d(in)f(V)-12
+b(olcano)300 1643 y(to)23 b(determine)j(if)d(the)h(implementation)i
+(rule)e(is)g(indeed)h(applicable.)579 1812 y(The)19 b(actions)j
+(associated)g(with)d(an)h(impl)p 1864 1812 28 4 v 33
+w(rule)g(are)g(speci\256ed)h(in)f(two)f(parts,)i(as)e(in)h(a)f(trans)p
+3411 1812 V 34 w(rule.)293 1982 y(The)d(\256rst)g(part,)j(the)e(test,)h
+(called)h FD(condition)g(code)p FP(,)g(is)d(used)i(to)f(test)g(if)g
+(the)g(rule)g(applies)i(to)d(the)i(expression)292 2151
+y(on)e(the)h(left)g(side.)29 b(It)16 b(is)g(an)g(arbitrary)j(piece)e
+(of)f(C)f(code)i(that)g(references)i(the)e(operator)h(ar)n(guments)h
+(and/or)300 2320 y(any)30 b(logical)h(or)e(system)h(properties)i(of)d
+(subexpressions)34 b(on)29 b(the)h(left)g(side.)48 b(As)29
+b(in)g(trans)p 3230 2320 V 35 w(rules,)i(the)298 2490
+y(REJECT)19 b(keyword)k(is)f(used)g(to)g(reject)g(the)g(rule.)31
+b(However)l(,)23 b(unlike)g(trans)p 2692 2490 V 34 w(rules,)g(impl)p
+3113 2490 V 33 w(rules)g(have)f(to)297 2659 y(satisfy)g(another)g(test)
+f FD(in)f(addition)j FP(to)d(the)h(one)g(in)f(the)h(cond)p
+2178 2659 V 34 w(code)g(section;)j(this)d(extra)g(test)g(is)f
+(speci\256ed)300 2829 y(by)k(a)f(DBI-written)h(support)h(function)h
+(\(called)f(do)p 1930 2829 V 34 w(any)p 2094 2829 V 34
+w(good\))g(described)h(in)d(Section)i(2.7.)583 2998 y(The)h(second)h
+(part)g(of)f(the)g(actions,)i(the)e(post-test)i(statements,)g(called)f
+FD(application)i(code)p FP(,)e(is)300 3167 y(executed)f(immediately)g
+(if)d(the)i(condition)h(code)f(is)e(satis\256ed.)33 b(The)24
+b(application)j(code)e(sets)f(the)g(algo-)300 3337 y(rithm)g(ar)n
+(gument)h(of)f(the)f(algorithm)j(on)d(the)h(right)h(side.)583
+3506 y(The)30 b(cost)g(of)f(using)i(algorithm)g FH(A)e
+FP(for)h(the)g(operator)i FH(O)f FP(in)f(\(2.3\))g(is)f(computed)i(by)f
+(a)f(DBI-)300 3675 y(de\256ned)d(function)g(for)f(algorithm)i
+FH(A)d FP(\(this)h(function)i(is)e(described)i(in)e(Section)g(2.7\).)35
+b(The)24 b(cost)i(of)e(an)299 3845 y(algorithm)h(node)e(in)g(V)-12
+b(olcano)24 b(is)f(implicitly)i(assumed)f(to)e(be)h(the)g(sum)g(of)g
+(costs)g(of)g(all)g(its)g(inputs)h(plus)300 4014 y(an)j(additional)j
+(term)c(that)i(is)f(a)f(function)j FD(only)f FP(of)f(the)g(logical)i
+(and)e(system)h(properties)i(of)c FH(A)h FP(and)g(its)300
+4183 y(inputs.)302 4452 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)j
+FP(4)t(.)172 b(Impl)p 1131 4452 V 34 w(rule)34 b(\(2.4\))g(in)g(Figure)
+g(2.6)g(shows)g(an)g(implementation)i(rule.)62 b(It)34
+b(selects)300 4622 y(Nested)p 556 4622 V 34 w(loops)28
+b(as)e(an)h(implementation)i(for)d(the)h(JOIN)f(operator)-5
+b(.)41 b(The)26 b(condition)j(code)e(of)g(this)g(rule)300
+4791 y(is)i(empty)-6 b(,)31 b(implying)g(that)f(the)f(rule)h(is)f
+(applied)i(immediately)-6 b(.)50 b(The)28 b(application)33
+b(code)d(sets)g(the)f(al-)300 4961 y(gorithm)g(ar)n(gument)g(\(i.e.,)f
+(the)g(join)g(predicate\))j(of)c(the)h(Nested)p 2368
+4961 V 34 w(loops)h(node)g(to)e(be)h(the)g(same)f(as)h(the)1905
+5349 y(20)p eop
+%%Page: 21 33
+21 32 bop 312 403 3260 4 v 312 1150 4 748 v 386 478 a
+Fv(\()p FF(JOIN)19 b(?op)p 675 478 20 4 v 25 w(ar)o(g1)i
+Fv(\(?1)f(?2\)\))h FB(!)f Fv(\()p FF(Nested)p 1396 478
+V 25 w(loops)h(?al)p 1661 478 V 25 w(ar)o(g1)g Fv(\(?1)f(?2\)\))1337
+b FF(\(2.4\))386 557 y(\045cond)p 573 557 V 25 w(code)386
+635 y FB(ff)386 793 y(gg)386 872 y FF(\045appl)p 558
+872 V 25 w(code)386 951 y FB(ff)601 1030 y FF(?al)p 681
+1030 V 26 w(ar)o(g1)20 b Fv(=)g FF(?op)p 1013 1030 V
+25 w(ar)o(g1)d Fv(;)386 1109 y FB(gg)p 3568 1150 4 748
+v 312 1153 3260 4 v 3570 1170 19 754 v 328 1170 3260
+19 v 1121 1366 a FP(Figure)24 b(2.6:)31 b(Nested)24 b(loops)h
+(implementation)h(rule)300 1743 y(operator)g(ar)n(gument)f(\(join)g
+(predicate\))h(of)d(the)h(JOIN)f(node.)1308 b Fw(\003)300
+2109 y FO(2.7)119 b(Support)31 b(Functions)300 2372 y
+FP(As)f(mentioned)j(earlier)l(,)h(and)d(as)g(can)g(be)g(seen)g(from)g
+(Figure)g(2.2,)i(most)d(of)h(the)g(actions)i(and)e(prop-)296
+2542 y(erty)21 b(computations)i(in)d(V)-12 b(olcano)22
+b(rules)f(are)f(done)h(by)g FD(support)i FP(functions)f(de\256ned)f(by)
+g(the)f(DBI.)f(These)298 2711 y(functions)24 b(are)e(de\256ned)h(for)f
+(each)g(operator)l(,)j(algorithm,)e(or)f(enforcer)i(and)e(are)g
+(triggered)i(upon)f(appli-)296 2880 y(cation)e(of)f(rules.)30
+b(Some)20 b(are)g(executed)i(only)f(when)e(trans)p 2135
+2880 28 4 v 35 w(rules)i(are)f(applied,)i(some)e(when)g(impl)p
+3399 2880 V 33 w(rules)300 3050 y(are)k(applied,)h(and)f(others)h(when)
+e(neither)j(is)d(applied)i(\(i.e.,)e(enforcers\).)583
+3219 y(The)i(required)j(support)f(functions)i(that)d(appear)g(in)g(a)f
+(V)-12 b(olcano)27 b(optimizer)g(are)f(summarized)300
+3389 y(in)d(T)-6 b(able)24 b(2.3.)300 3755 y FO(2.8)119
+b(Drawbacks)31 b(of)e(V)-11 b(olcano)294 4018 y FP(In)18
+b(the)h(previous)i(sections,)g(we)c(have)i(seen)g(how)g(V)-12
+b(olcano)19 b(uses)g(abstractions)j(to)c(allow)h(a)f(DBI)f(to)h(spec-)
+298 4188 y(ify)j(a)g(rule-based)j(query)f(optimizer)-5
+b(.)31 b(However)l(,)23 b(these)f(abstractions)j(are)c(not)h(suf)n
+(\256ciently)i(high-level)299 4357 y(to)f(insulate)h(the)f(DBI)f(from)g
+(implementation-level)28 b(details.)k(Moreover)l(,)24
+b(some)f(of)g(the)g(constructs)i(in)298 4526 y(the)d(rule)h
+(speci\256cation)i(language)f(are)e(motivated)i(not)e(by)g
+FD(conceptual)j FP(details)f(of)d(the)i(optimizer)l(,)h(but)300
+4696 y(by)i FD(implementation)i FP(details)f(with)f(an)f(eye)h(toward)h
+(constructing)i(ef)n(\256cient)e(optimizers.)39 b(The)25
+b(result)300 4865 y(is)k(often)h(an)f(optimizer)i(that)f(is)f(fast,)h
+(but)g(often)g(quite)g(brittle)h(and)e(in\257exible.)49
+b(In)29 b(this)h(section,)i(we)300 5034 y(describe)26
+b(some)d(of)h(the)g(concepts)h(in)f(V)-12 b(olcano)25
+b(that)f(are)g(bottlenecks)i(to)e(a)f(clean)i(speci\256cation.)1905
+5349 y(21)p eop
+%%Page: 22 34
+22 33 bop 312 412 3277 13 v 312 503 4 92 v 365 476 a
+Fz(Function)p 904 503 V 305 w(Fr)o(equency)p 1346 503
+V 101 w(Description)p 3585 503 V 312 516 3277 13 v 312
+607 4 92 v 365 580 a Fy(derive)p 555 580 23 4 v 28 w(log)p
+678 580 V 27 w(prop)p 904 607 4 92 v 121 w(Operator)p
+1346 607 V 176 w(Compute)20 b(logical)f(properties)h(of)f(node)h(given)
+f(logical)g(properties)h(of)f(children)p 3585 607 V 312
+611 3277 4 v 312 702 4 92 v 365 674 a(derive)p 555 674
+23 4 v 28 w(sys)p 678 674 V 27 w(prop)p 904 702 4 92
+v 121 w(Operator)p 1346 702 V 176 w(Compute)h(system)f(properties)h(of)
+f(node)h(given)f(system)h(properties)f(of)g(children)p
+3585 702 V 312 705 3277 4 v 312 796 4 92 v 365 814 a(derive)p
+555 814 23 4 v 28 w(phy)p 694 814 V 28 w(prop)p 904 796
+4 92 v 958 769 a(Algorithm)p 1346 796 V 1399 776 a(Compute)h(physical)g
+(properties)f(of)g(node)h(given)g(physical)g(properties)f(of)1399
+867 y(children)p 3585 796 V 312 888 V 904 888 V 958 860
+a(Enforcer)p 1346 888 V 3585 888 V 312 891 3277 4 v 312
+982 4 92 v 365 1000 a(get)p 460 1000 23 4 v 27 w(input)p
+640 1000 V 28 w(pv)p 904 982 4 92 v 958 955 a(Algorithm)p
+1346 982 V 1399 954 a(Compute)h(needed)g(physical)g(properties)g(of)f
+(node)h(given)f(needed)h(physical)1399 1045 y(properties)g(of)f(parent)
+p 3585 982 V 312 1074 V 904 1074 V 958 1046 a(Enforcer)p
+1346 1074 V 3585 1074 V 312 1077 3277 4 v 312 1168 4
+92 v 365 1186 a(do)p 443 1186 23 4 v 28 w(any)p 578 1186
+V 27 w(good)p 904 1168 4 92 v 958 1141 a(Algorithm)p
+1346 1168 V 1399 1140 a(T)-5 b(est)19 b(whether)g(algorithm)g(or)g
+(enforcer)h(applies)f(given)h(needed)g(physical)1399
+1231 y(properties)p 3585 1168 V 312 1260 V 904 1260 V
+958 1232 a(Enforcer)p 1346 1260 V 3585 1260 V 312 1263
+3277 4 v 312 1354 4 92 v 365 1376 a(cost)p 904 1354 V
+958 1327 a(Algorithm)p 1346 1354 V 1399 1372 a(Compute)g(cost)f(of)g
+(algorithm)g(or)g(enforcer)p 3585 1354 V 312 1446 V 904
+1446 V 958 1418 a(Enforcer)p 1346 1446 V 3585 1446 V
+312 1458 3277 13 v 300 1611 a FP(T)-6 b(able)16 b(2.3:)28
+b(Support)18 b(functions)h(in)d(a)h(V)-12 b(olcano)18
+b(optimizer)-5 b(.)30 b(The)16 b(frequency)j(column)f(denotes)g
+(whether)300 1724 y(a)23 b(function)j(is)d(de\256ned)i(for)e(each)i
+(operator)l(,)g(algorithm,)g(or)f(enforcer)-5 b(.)p 323
+1946 3237 4 v 323 2563 4 617 v 1525 2206 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderet 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 1525 2206
+a FF(RET)1543 2344 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1543 2344 a Fs(R)1596 2353 y Fu(1)1375
+2467 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderet
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1375 2467 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.7
+0.6 2.0 2.5 Arrow EndArrow } def 42.6791 25.60745 75.1151 25.60745
+1. 8.53581 6.82854 6.82854 tx@CoilDict begin ZigZag end /r 0.85362
+def /Lineto { Arcto } def false Line gsave 2.6 SLW 0. setgray 0 setlinecap
+stroke grestore gsave 1.0 SLW 1. setgray stroke grestore gsave ArrowBc
+ArrowB pop pop pop pop grestore end
+
+@endspecial
+2077 2100 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodems 16 { .5 5.344 1.72792
+false .5 35.61568 InitRnode } NewNode end end
+ 2077 2100 a FF(Mer)o(ge)p 2252 2100 20 4
+v 25 w(sort)2103 2277 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodefs 16 { .5 5.43198 0.08394
+false .5 29.5436 InitRnode } NewNode end end
+ 2103 2277 a FF(File)p 2209 2277
+20 4 v 25 w(scan)2181 2443 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 2181 2443 a Fs(R)2234 2452
+y Fu(1)1375 2467 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodems
+/TheNodefs InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1375 2467 a 1375 2467 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodefs
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1375 2467
+a 3557 2563 4 617 v 323 2566 3237 4 v 3558 2583 19 624
+v 340 2583 3237 19 v 742 2779 a FP(Figure)24 b(2.7:)32
+b(An)22 b(implicit)j(rule)f(in)g(V)-12 b(olcano.)32 b(Mer)n(ge)p
+2457 2779 28 4 v 34 w(sort)24 b(is)g(an)f(enforcer)-5
+b(.)300 3156 y FN(2.8.1)99 b(Explicit)25 b(vs.)33 b(Implicit)24
+b(Rules)583 3386 y FP(The)i(general)j(form)d(of)g(a)g(V)-12
+b(olcano)28 b(rule)f(is)f(shown)h(in)g(Figure)g(2.2.)39
+b(This)26 b(\256gure)h(shows)g(that)298 3555 y(V)-12
+b(olcano)22 b(rules)h(transform)g(an)e(abstract)i(expression)i(into)d
+(either)g(an)f(abstract)j(expression)g(or)d(an)h(algo-)295
+3725 y(rithm.)29 b(Such)19 b(rules)h(are)f(called)h FD(explicit)h
+(rules)p FP(.)30 b(An)19 b(example)h(of)e(an)h(explicit)i(rule)f(is)e
+(the)i(impl)p 3304 3725 V 33 w(rule)f(2.4)294 3894 y(in)f(Figure)g
+(2.6.)29 b(An)17 b(explicit)j(rule)e(involves)i(abstract)g(operators,)h
+(and)d(sometimes,)i(algorithms.)31 b(How-)296 4063 y(ever)l(,)21
+b(there)g(is)e(another)i(class)g(of)f(transformations,)k
+FD(implicit)c(rules)p FP(,)i(that)e(don')n(t)h(have)f(the)g(form)g
+(shown)300 4233 y(in)25 b(Figure)g(2.2.)34 b(Such)24
+b(transformations)29 b(typically)e(involve)f(enforcers)h(since)f
+(enforcers)h(are)e(not)g(im-)300 4402 y(plementations)i(of)c(any)h
+(speci\256c)h(operators)h(\(e.g.,)d(Mer)n(ge)p 2193 4402
+V 34 w(sort)h(in)g(T)-6 b(able)23 b(2.1\).)583 4572 y(Consider)j(the)f
+(transformation)i(in)e(Figure)f(2.7.)33 b(File)p 2298
+4572 V 33 w(scan)25 b(is)f(an)h(implementation)i(for)d(RET)300
+4741 y(and)j(assume)g(there)g(is)g(an)f(impl)p 1326 4741
+V 33 w(rule)h(for)g(this)g(transformation.)43 b(However)l(,)27
+b(since)h(Mer)n(ge)p 3237 4741 V 34 w(sort)f(is)f(an)299
+4910 y(enforcer)l(,)e(there)f(is)f(no)g(rule)h(involving)i(it.)30
+b(Nevertheless,)25 b(the)e(transformation)i(shown)e(in)f(Figure)h(2.7)
+300 5080 y(is)g(a)g(valid)i(rewrite)f(in)g(V)-12 b(olcano.)32
+b(This)23 b(is)h(an)f(example)i(of)e(an)h(implicit)h(rule.)1905
+5349 y(22)p eop
+%%Page: 23 35
+23 34 bop 583 391 a FP(Implicit)25 b(rules)g(are)f(present)i(in)e(V)-12
+b(olcano)25 b(for)f(ef)n(\256ciency)i(and)f(to)e(aid)i(in)f(generating)
+i(an)e(opti-)293 561 y(mizer)-5 b(.)29 b(However)l(,)19
+b(since)f(enforcers)h(\(i.e.,)f(algorithms)h(in)e(implicit)h(rules\))h
+(behave)f(like)g(algorithms)h(for)295 730 y(all)g(practical)j
+(purposes,)g(their)e(separate)h(classi\256cation)h(introduces)g(an)d
+(additional)j(detail)e(that)g(creates)300 899 y(an)26
+b(asymmetric)h(framework)f(of)g(rewrite)g(rules.)38 b(In)26
+b(other)h(words,)f(transformations)j(\(both)e(between)298
+1069 y(operator)c(trees)g(and)f(their)g(associated)i(property)g(sets\))
+e(are)g(dif)n(ferent)i(for)e(explicit)h(and)f(implicit)h(rules.)300
+1238 y(This,)g(in)h(turn,)f(leads)i(to)e(two)h(other)g(problems:)436
+1482 y FC(\017)46 b FP(Are)20 b(new)g(operators,)k(algorithms,)f(or)d
+(rules)i(explicit)g(or)e(implicit?)32 b(That)20 b(is,)h(when)g(an)f
+(existing)527 1652 y(V)-12 b(olcano)25 b(optimizer)g(is)e(modi\256ed)h
+(by)f(adding)i(operators,)g(algorithms,)g(or)e(rules,)h(the)g(DBI)e
+(has)527 1821 y(to)17 b(re-examine)i(the)e FD(entir)m(e)h
+FP(new)e(schema)i(\(i.e.,)f(operators,)k(algorithms,)e(enforcers,)i
+(properties,)527 1990 y(rules\))k(to)e(determine)j(which)e(rules)g(are)
+g(explicit)h(and)f(which)g(are)g(implicit.)436 2234 y
+FC(\017)46 b FP(Since)21 b(implicit)h(rules)f(do)g(not)g(have)h(the)f
+(same)f(form)h(as)f(explicit)j(rules)f(\(i.e.,)e(the)h(one)g(shown)g
+(in)527 2404 y(Figure)i(2.2\),)e(property)j(transformations)i(in)c
+(implicit)g(rules)h(are)f(also)g(dif)n(ferent)j(from)c(those)i(in)527
+2573 y(explicit)e(rules.)30 b(As)18 b(before,)i(this)f(means)g(that)g
+(extensibility)k(of)18 b(an)h(optimizer)h(is)e(accomplished)527
+2743 y(dif)n(ferently)27 b(when)d(explicit)h(rules)g(are)e(added)i
+(than)f(when)g(implicit)h(rules)f(are)g(introduced.)577
+2987 y(The)18 b(solutions)i(to)e(these)g(problems)i(is)d(obvious:)31
+b(treat)19 b(all)e(operators)k(and)d(algorithms)i(as)e(\256rst-)293
+3156 y(class)g(objects.)30 b(This)17 b(implies)h(that)f(enforcers)j
+(are)d(treated)i(just)e(like)h(regular)g(algorithms,)j(with)16
+b(explicit)300 3325 y(rules)24 b(implementing)i(them,)e(and)g(with)f
+(similar)h(property)i(transformation)h(mechanisms.)300
+3632 y FN(2.8.2)99 b(Pr)n(operty)26 b(Repr)n(esentation)g(and)g(T)-7
+b(ransformation)583 3862 y FP(Properties)30 b(are)e(crucial)h(for)f
+(storing)i(state)e(\(operator)i(tree\))f(information,)i(and)d(for)g
+(guiding)300 4032 y(the)d(search.)34 b(When)25 b(an)g(operator)h(tree)f
+(is)f(transformed)j(into)e(another)l(,)i(so)d(are)h(the)f(properties)k
+(associ-)300 4201 y(ated)f(with)g(the)g(operator)i(tree.)41
+b(The)26 b(more)h(separate)h(property)h(structures,)h(the)d(greater)h
+(the)f(number)300 4371 y(of)e(property)j(transformations.)39
+b(As)25 b(can)g(be)h(seen)g(from)f(Figure)h(2.2,)f(most)g(of)g(the)h
+(property)h(transla-)300 4540 y(tions)g(in)f(V)-12 b(olcano)28
+b(rules)f(are)f(done)h(by)g(DBI-de\256ned)g(functions)h(\(as)f
+(described)h(in)e(Section)h(2.7\).)39 b(In)300 4709 y(fact,)27
+b(this)f(general)i(form)e(of)g(a)f(rule)i(results)g(in)f(two)g
+(distinctly)i(dif)n(ferent)h(forms)d(for)g(trans)p 3237
+4709 28 4 v 35 w(rules)h(and)300 4879 y(impl)p 471 4879
+V 33 w(rules)g(in)f(V)-12 b(olcano)27 b(as)f(shown)g(in)g(Figure)g
+(2.8.)38 b(This)25 b(results)j(in)d(a)h(somewhat)g(lar)n(ge)i(number)e
+(of)300 5048 y(support)k(functions)g(which)f(often)g(carry)g(a)e
+(greater)j(burden)f(of)f(property)i(transformations)i(than)d(the)1905
+5349 y(23)p eop
+%%Page: 24 36
+24 35 bop 348 403 3187 4 v 348 2573 4 2171 v 425 859
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.3 true 3.8 neg 6.71495
+neg 89.15826 53.01814 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial -339 x FH(E)5
+b(;)15 b(E)609 487 y FB(0)634 520 y FP(:)30 b(Expression)425
+690 y FH(A)p FP(:)h(Algorithm)425 859 y FH(P)483 873
+y Fs(i)512 859 y FH(;)15 b(P)623 826 y FB(0)610 883 y
+Fs(i)646 859 y FP(:)31 b(Property)1517 936 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [
+105.8441 -22.19318 17.07164 -22.19318 /Lineto /lineto load def false
+Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [
+105.8441 -37.55754 17.07164 -37.55754 /Lineto /lineto load def false
+Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -37.55754 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -22.19318 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 0.0 0.0 Ellipse closepath
+gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 1381 967 a FH(E)1609
+960 y(P)1667 974 y Fv(1)1609 1145 y FH(P)1667 1159 y
+Fv(2)1609 1272 y FH(P)1667 1286 y Fv(3)1885 949 y(=)-12
+b FB(\))1517 936 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -37.55754 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -22.19318 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 102.42984 0.0 Ellipse
+closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 0.0 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+2220 971 a FH(E)2292 938 y FB(0)2460 959 y FH(P)2531
+926 y FB(0)2518 983 y Fv(1)2721 957 y FP(Operator)25
+b(Ar)n(gument)2460 1144 y FH(P)2531 1111 y FB(0)2518
+1167 y Fv(2)2721 1141 y FP(Logical)g(Property)2460 1271
+y FH(P)2531 1238 y FB(0)2518 1294 y Fv(3)2721 1269 y
+FP(System)f(Property)1340 1495 y Fy(\(a\))18 b(General)h(form)g(of)g(a)
+g(V)-10 b(olcano)20 b(trans)p 2404 1495 23 4 v 28 w(rule)p
+399 1595 3086 4 v 1517 1890 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [
+105.8441 -22.19318 17.07164 -22.19318 /Lineto /lineto load def false
+Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [
+105.8441 -37.55754 17.07164 -22.19318 /Lineto /lineto load def false
+Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -22.19318 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 0.0 0.0 Ellipse closepath
+gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 1381 1921 a FH(E)1609
+1914 y(P)1667 1928 y Fv(1)1609 2099 y FH(P)1667 2113
+y Fv(2)1885 1903 y(=)-12 b FB(\))1517 1890 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -37.55754 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -22.19318 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 102.42984 0.0 Ellipse
+closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 0.0 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 2234 1921 a FH(A)2460 1914 y(P)2531
+1881 y FB(0)2518 1937 y Fv(1)2721 1911 y FP(Algorithm)25
+b(Ar)n(gument)2460 2098 y FH(P)2531 2065 y FB(0)2518
+2121 y Fv(2)2721 2096 y FP(Physical)g(Property)2460 2225
+y FH(P)2531 2192 y FB(0)2518 2249 y Fv(3)2721 2232 y
+FP(Cost)1342 2449 y Fy(\(b\))19 b(General)g(form)g(of)g(a)f(V)-10
+b(olcano)21 b(impl)p 2403 2449 23 4 v 27 w(rule)p 3532
+2573 4 2171 v 348 2576 3187 4 v 3534 2593 19 2177 v 365
+2593 3187 19 v 300 2789 a FP(Figure)k(2.8:)33 b(General)25
+b(form)g(of)f(V)-12 b(olcano)26 b(trans)p 1843 2789 28
+4 v 34 w(rules)g(and)f(impl)p 2399 2789 V 33 w(rules)h(\(cf.)33
+b(Figure)25 b(2.2\).)34 b(Single)25 b(ar)n(-)300 2902
+y(rows)f(denote)i(one)f(or)g(more)f(DBI-de\256ned)h(support)i
+(functions.)36 b(The)24 b(properties)j(that)e(are)g(translated)300
+3015 y(by)f(the)f(rule)i(or)e(by)h(support)h(functions)h(are)e(listed)h
+(on)e(the)h(right.)300 3379 y(rules)h(themselves.)33
+b(This)24 b(decidedly)i(asymmetric)g(manner)e(of)g(treating)h(trans)p
+2840 3379 V 35 w(rules)g(and)f(impl)p 3395 3379 V 33
+w(rules)300 3549 y(and)g(the)g(lar)n(ge)h(number)f(of)g(property)h
+(structures)h(leads)f(to)e(a)h(few)f(problems:)436 3777
+y FC(\017)46 b FP(Deciding)25 b(which)f(set)g(a)f(particular)j
+(property)g(belongs)f(to)f(is)f(implementation-depend)q(en)q(t.)436
+4015 y FC(\017)46 b FP(Modifying)31 b(any)e(existing)i(operator)l(,)h
+(algorithm,)f(enforcer)l(,)h(rule,)e(or)e(property)j(might)e(entail)527
+4185 y(a)c(repartitioning)k(of)c(the)h(property)h(sets.)36
+b(This)25 b(can)h(lead)f(to)g(a)g(cascading)j(ef)n(fect)e(of)f(having)i
+(to)527 4354 y(modify)22 b(the)f(lar)n(ge)h(number)g(of)f(support)i
+(functions)g(\320)e(hardly)h(conducive)i(to)d(easy)g(extensibil-)527
+4523 y(ity)-6 b(.)436 4761 y FC(\017)46 b FP(Extensibility)29
+b(in)d(V)-12 b(olcano)27 b(is)f(complicated)j(by)d(its)g(extensive)i
+(use)f(of)f(support)h(functions)i(for)527 4931 y(transformations)i(of)c
+(its)g(multiple)h(property)i(sets.)41 b(For)27 b(example,)i(from)e
+(Figure)g(2.3,)h(we)e(can)527 5100 y(see)k(that)h(addition)h(of)d(a)h
+(single)h(algorithm)h(requires)f(the)g(DBI)d(to)i(de\256ne)g
+FD(four)h FP(new)e(support)1905 5349 y(24)p eop
+%%Page: 25 37
+25 36 bop 527 391 a FP(functions)21 b(for)e(property)h
+(transformations.)33 b(Even)19 b(addition)h(of)f(an)f(operator)j
+(requires)f(de\256ning)527 561 y(two)j(new)h(support)h(functions.)583
+805 y(Property)j(partitions)g(are)f(geared)g(toward)g(generating)i(ef)n
+(\256cient)e(optimizers.)40 b(However)l(,)27 b(as)298
+974 y(we)21 b(have)h(seen,)g(they)h(result)f(in)g(poor)g(extensibility)
+-6 b(.)34 b(The)21 b(solution)j(to)e(this)g(problem)g(is)g(also)g
+(obvious:)300 1144 y(treat)i(all)f(properties)k(as)c(equivalent,)j
+(with)d(property)j(transformations)h(being)d(done)h(at)e(the)h(rule)f
+(level)300 1313 y(\(rather)31 b(than)e(a)g(plethora)i(of)e(support)i
+(functions\).)51 b(However)l(,)31 b(noting)f(that)g(property)h
+(partitions)h FD(do)300 1482 y FP(result)d(in)e(fast)i(optimizers,)h(a)
+d(preprocessor)k(should)f(be)d(able)i(to)e(automatically)k(partition)f
+(property)300 1652 y(sets)24 b(based)h(on)e(need.)300
+2018 y FO(2.9)119 b(Summary)300 2281 y FP(In)26 b(this)g(chapter)l(,)i
+(we)d(have)i(seen)g(the)f(rule)g(speci\256cation)j(framework)e(for)f(V)
+-12 b(olcano.)39 b(V)-12 b(olcano)27 b(is)f(the)293 2451
+y(only)19 b(public-domain)i(rule-based)f(query)f(optimizer)-5
+b(.)31 b(\(T)-6 b(o)16 b(our)i(knowledge,)j(there)d(are)g(two)f(other)i
+(rule-)298 2620 y(based)24 b(optimizers,)g(the)e(EXODUS)d(optimizer)24
+b(generator)g(which)e(is)g(an)g(earlier)i(version)g(of)e(V)-12
+b(olcano,)300 2789 y(and)24 b(the)g(Starburst)h(rule-based)h(optimizer)
+-5 b(.)33 b(The)23 b(Starburst)i(optimizer)g(is)e(not)h(publicly)i
+(available.\))583 2959 y(V)-12 b(olcano)30 b(provides)h(an)d(ef)n
+(\256cient)h(search)h(strategy)g(for)f(optimizing)h(queries.)46
+b(However)l(,)30 b(as)300 3128 y(we)24 b(have)i(seen)f(it)g(also)g
+(presents)i(the)e(DBI)f(with)g(an)h(in\257exible)i(and)e
+(hard-to-extend)k(framework)d(for)300 3298 y(specifying)g(optimizer)f
+(rules)f(and)g(actions.)33 b(This)23 b(results)i(in)e(optimizers)i
+(which)f(consist)h(of)f(a)e(mix)h(of)295 3467 y(high-level)e
+(abstractions)h(\(operators,)g(algorithms,)g(rules\))e(together)g(with)
+f(implementation-level)k(de-)298 3636 y(tails)f(\(enforcers,)i
+(property)g(partitions,)g(support)f(functions)h(for)e(property)h
+(transformations,)i(implicit)300 3806 y(rules\).)54 b(Extensibility)33
+b(in)e(such)g(an)g(environment)j(is)c(dif)n(\256cult)i(to)f
+(accomplish.)55 b(The)30 b(next)h(chapter)300 3975 y(describes)25
+b(Prairie,)f(our)f(solution)j(to)d(the)g(problem)i(of)e(providing)j(a)c
+(rule)i(speci\256cation)i(environment)294 4144 y(consisting)20
+b(of)e(high-level)j(abstractions,)h(yet)c(which)g(can)g(also)h(be)f
+(used)g(to)g(generate)i(a)d(fast)i(optimizer)-5 b(.)1905
+5349 y(25)p eop
+%%Page: 26 38
+26 37 bop 2859 1118 a FG(Chapter)44 b(3)990 1657 y FM(Prairie:)69
+b(A)52 b(Language)f(for)h(Rule)2475 2031 y(Speci\256cation)300
+2532 y FP(Prairie)28 b(is)f(an)g(algebraic)i(framework)g(and)e
+(language)j(for)d(specifying)j(rewrite)e(rules)g(for)f(rule-based)300
+2702 y(query)32 b(optimizers.)55 b(W)-7 b(e)30 b(present)j(the)e
+(framework)h(and)f(language)j(in)d(this)g(chapter)-5
+b(.)55 b(W)-7 b(e)30 b(begin)i(by)297 2871 y(introducing)24
+b(basic)d(concepts)i(and)e(notation)i(and)e(then)g(present)i(a)d(means)
+h(by)f(which)h(the)g(mappings)i(of)300 3041 y(search)h(spaces)h(and)e
+(cost)h(models)g(are)f(expressed)j(as)d(rewrite)h(rules.)31
+b(Thus,)23 b(the)g(goal)h(of)f(this)h(chapter)300 3210
+y(is)f(to)h(lay)g(a)f(foundation)j(for)e(reasoning)i(about)f(query)g
+(optimizers)g(algebraically)-6 b(.)300 3577 y FO(3.1)119
+b(Overview)576 3840 y FP(In)17 b(the)g(previous)i(chapter)l(,)h(we)15
+b(described)20 b(V)-12 b(olcano')-5 b(s)19 b(rule)e(speci\256cation)i
+(language)g(and)f(listed)297 4009 y(some)j(of)f(its)h(shortcomings.)33
+b(In)20 b(particular)l(,)k(V)-12 b(olcano)22 b(does)g(not)f(provide)h
+(suf)n(\256ciently)i(high-level)f(ab-)299 4178 y(stractions)h(that)f
+(would)g(insulate)h(a)e(DBI)f(from)h(low-level)i(details)f(and)g
+(provide)h(a)e(comfortable)j(envi-)300 4348 y(ronment)j(for)e
+(extensibility)-6 b(.)44 b(T)-6 b(o)25 b(remedy)j(this,)f(we)f(propose)
+j(a)d(rule)h(speci\256cation)i(language)g(called)297
+4517 y(Prairie)22 b([21\26123].)32 b(The)21 b(Prairie)h(optimizer)g
+(paradigm)h(is)e(depicted)j(schematically)g(in)d(Figure)h(3.1.)30
+b(As)294 4686 y(we)17 b(will)g(see)h(in)g(this)h(chapter)l(,)h(rules)f
+(in)f(Prairie)g(are)g(speci\256ed)i(at)d(a)h(conceptual)j(rather)e
+(than)f(implemen-)295 4856 y(tation)j(level.)30 b(This)20
+b(high-level)i(speci\256cation)g(is)d(translated)j(to)d(generate)j(a)d
+(V)-12 b(olcano)21 b(speci\256cation)h(by)300 5025 y(a)k(Prairie-to-V)
+-12 b(olcano)31 b(\(or)c(P2V\))e(preprocessor)30 b(\(as)d(shown)g(in)g
+(Figure)g(3.1\).)40 b(The)26 b(P2V)f(preproces-)1905
+5349 y(26)p eop
+%%Page: 27 39
+27 38 bop 323 303 3237 4 v 323 1912 4 1609 v 1475 420
+a FP(Operator)24 b(T)m(ree)1375 2029 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ -17.07164 179.25221
+153.64476 179.25221 153.64476 42.6791 -17.07164 42.6791 /Lineto /lineto
+load def false Polygon gsave 0.5 setgray fill grestore gsave 2.6
+SLW 0. setgray 0 setlinecap stroke grestore gsave 1.0 SLW 1. setgray
+stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 42.6791 67.43292 42.6791 191.2023 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 42.6791 67.43292 42.6791 191.2023
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial 1904 713 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.11488
+neg 59.87334 10.43501 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(Prairie)g(Rules)1375 2029 y
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 92.18674 135.71948 92.18674 155.35202 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 92.18674 135.71948 92.18674 155.35202
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial 1813 987 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651
+neg 81.76248 10.43501 .5 Frame gsave 1. setgray fill grestore end
+
+
+@endspecial(P2V)f(Preprocessor)1375 2029 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 92.18674 100.72256 92.18674 120.0136 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 92.18674 100.72256 92.18674 120.0136
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial
+1877 1280 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.11488
+neg 66.36697 10.43501 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(V)-12
+b(olcano)25 b(Rules)1375 2029 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 92.18674 67.43292 92.18674 87.06546 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { /ArrowAc [
+6 2 roll ] cvx def ArrowAc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow
+ moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow
+false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 92.18674 67.43292 92.18674
+87.06546 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW
+add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore gsave ArrowAc ArrowA pop pop ArrowBc ArrowB pop pop
+pop pop grestore end
+
+@endspecial 1556
+1554 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651
+neg 95.86615 10.43501 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(V)-12 b(olcano)25
+b(Rule)f(Engine)1375 2029 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 68.28656 33.28964 68.28656 52.06854 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 33.28964 68.28656 52.06854
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial 1721
+1815 a(Access)g(Plan)p 3557 1912 V 323 1915 3237 4 v
+3558 1932 19 1616 v 340 1932 3237 19 v 660 2128 a(Figure)g(3.1:)31
+b(Schematic)25 b(representation)i(of)d(the)g(Prairie)g(optimizer)h
+(paradigm)300 2505 y(sor)g(is)g(described)j(in)c(greater)j(detail)f(in)
+f(Chapter)h(4.)35 b(This)25 b(chapter)h(describes)i(the)d(rule)g
+(speci\256cation)300 2674 y(language)h(of)d(Prairie.)300
+3041 y FO(3.2)119 b(Notation)30 b(and)g(Assumptions)299
+3304 y FP(This)23 b(section)i(lists)e(the)h(terminology)h(used)f(in)f
+(Prairie.)31 b(Some)22 b(of)h(the)g(concepts)i(are)e(similar)h(to)f
+(those)300 3473 y(used)h(in)g(V)-12 b(olcano)25 b(\(see)f(Section)g
+(2.2\).)31 b(However)l(,)24 b(there)h(are)e(some)h(semantic)h(dif)n
+(ferences.)300 3775 y FI(Stor)n(ed)i(Files)g(and)e(Str)n(eams.)92
+b FP(A)26 b(\256le)g(is)h FD(stor)m(ed)j FP(if)c(its)h(tuples)i(reside)
+f(on)f(disk.)41 b(In)27 b(the)g(case)g(of)g(re-)300 3944
+y(lational)e(databases,)g(stored)g(\256les)e(are)g(sometimes)i(called)f
+FD(base)g(r)m(elations)p FP(;)i(we)c(will)h(denote)i(them)e(by)300
+4114 y FH(R)i FP(or)g FH(R)563 4128 y Fs(i)591 4114 y
+FP(.)35 b(In)25 b(object-oriented)30 b(schemas,)c(stored)g(\256les)f
+(are)h FD(classes)p FP(;)i(we)c(will)h(denote)h(them)f(by)h
+FH(C)k FP(or)300 4283 y FH(C)365 4297 y Fs(i)393 4283
+y FP(.)h(Henceforth,)26 b(whenever)g(we)d(refer)i(to)f(a)f(stored)i
+(\256le,)f(we)f(mean)h(a)f(relation)j(or)e(a)g(class;)h(when)f(the)300
+4452 y(distinction)j(is)d(unimportant,)i(we)d(will)h(use)g
+FH(F)36 b FP(or)24 b FH(F)1970 4466 y Fs(i)1998 4452
+y FP(.)32 b(A)22 b FD(str)m(eam)i FP(is)g(a)g(sequence)i(of)e(tuples)h
+(and)f(is)g(the)296 4622 y(result)e(of)e(a)g(computation)j(on)d(one)h
+(or)f(more)h(streams)g(or)f(stored)i(\256les;)f(tuples)h(of)e(streams)h
+(are)g(returned)300 4791 y(one)j(at)f(a)g(time,)h(typically)h(on)f
+(demand.)32 b(Streams)24 b(can)f(be)h FD(named)p FP(,)g(denoted)h(by)f
+FH(S)2949 4805 y Fs(i)2977 4791 y FP(,)e(or)i FD(unnamed)p
+FP(.)1905 5349 y(27)p eop
+%%Page: 28 40
+28 39 bop 300 391 a FI(Database)28 b(Operations.)92 b
+FP(An)26 b FD(operation)j FP(is)e(a)g(computation)i(on)e(one)h(or)e
+(more)h(streams)h(or)f(stored)300 561 y(\256les.)49 b(There)30
+b(are)f(two)h(types)g(of)g(database)i(operations)g(in)e(Prairie:)44
+b(abstract)31 b(\(or)f(implementation-)300 730 y(unspeci\256ed\))c
+(operators)g(and)e(concrete)i(algorithms.)33 b(Each)23
+b(is)g(detailed)j(below)-6 b(.)527 999 y FI(Operators.)47
+b FP(Abstract)30 b(\(or)e(conceptual\))j FD(operators)g
+FP(specify)e(computations)i(on)d(streams)h(or)727 1168
+y(stored)f(\256les;)g(they)f(are)f(denoted)i(by)f(all)f(capital)i
+(letters)g(\(e.g.,)e(JOIN\).)f(Operators)j(have)727 1338
+y(two)c(types)g(of)g(parameters:)34 b(essential)26 b(and)e(additional.)
+34 b FD(Essential)25 b(parameters)h FP(are)e(the)727
+1507 y(stream)h(or)f(\256le)g(inputs)i(to)e(an)h(operator;)i(these)e
+(are)g(the)f(primary)i(inputs)g(of)e(an)g(operator)-5
+b(.)727 1677 y FD(Additional)29 b(parameters)g FP(are)e
+(\252\256ne-grain\272)i(quali\256cations)g(of)e(an)f(operator;)31
+b(their)c(pur)n(-)727 1846 y(pose)e(is)g(to)f(describe)i(an)f(operator)
+h(in)e(more)h(detail)g(than)g(essential)i(parameters.)35
+b(As)24 b(ex-)727 2015 y(amples,)30 b(some)e(operators)i(are)e(given)h
+(below;)i(for)d(each,)i(we)d(explicitly)j(indicate)g(their)727
+2185 y(essential)c(parameters)g(and)e(parenthetically)k(note)c(their)g
+(additional)j(parameters.)806 2387 y FC(\017)46 b FP(SOR)-5
+b(T\()p FH(S)1212 2401 y Fv(1)1250 2387 y FP(\))21 b(sorts)h(stream)h
+FH(S)1813 2401 y Fv(1)1852 2387 y FP(.)29 b(The)21 b(sorting)j
+(attribute)g(is)d(an)h(additional)j(parameter)897 2557
+y(of)f(SOR)-5 b(T)e(.)806 2743 y FC(\017)46 b FP(RET\()p
+FH(F)13 b FP(\))20 b(retrieves)j(tuples)f(of)f(stored)h(\256le)e
+FH(F)13 b FP(.)30 b(Additional)23 b(parameters)f(to)f(RET)e(in-)897
+2912 y(clude)j(the)f(selection)i(predicate,)g(the)e(projected)i
+(attributes)g(list,)e(and)g(the)g(output)h(tu-)897 3081
+y(ple)i(order)-5 b(.)806 3267 y FC(\017)46 b FP(JOIN\()p
+FH(S)1180 3281 y Fv(1)1220 3267 y FP(,)19 b FH(S)1318
+3281 y Fv(2)1357 3267 y FP(\))g(joins)i(streams)g FH(S)1955
+3281 y Fv(1)2013 3267 y FP(and)f FH(S)2219 3281 y Fv(2)2258
+3267 y FP(.)29 b(\()p FH(S)2396 3281 y Fv(1)2454 3267
+y FP(denotes)22 b(the)e FD(outer)h(str)m(eam)f FP(and)g
+FH(S)3561 3281 y Fv(2)897 3437 y FP(denotes)27 b(the)e
+FD(inner)h(str)m(eam)p FP(.\))35 b(Additional)27 b(parameters)f(to)f
+(JOIN)f(include)j(the)e(join)897 3606 y(predicate)h(and)e(output)h
+(stream)f(tuple)h(order)-5 b(.)727 3809 y(Other)24 b(operators)i(are)e
+(de\256ned)g(as)g(they)g(are)g(needed.)527 4011 y FI(Algorithms.)47
+b FD(Algorithms)23 b FP(are)f(concrete)h(implementations)i(of)d
+(conceptual)i(operators;)h(they)727 4180 y(are)19 b(represented)i(in)e
+(lower)f(case)h(with)g(the)f(\256rst)g(letter)i(capitalized)h(\(e.g.,)e
+(Nested)p 3321 4180 28 4 v 34 w(loops\).)727 4350 y(Algorithms)g(have)g
+(at)e(least)i(the)e(same)h(essential)i(and)e(additional)i(parameters)g
+(as)e(the)f(con-)727 4519 y(ceptual)26 b(operators)g(that)f(they)g
+(implement.)2124 4486 y Fv(1)2196 4519 y FP(Furthermore,)h(there)f(can)
+f(be,)g(and)g(usually)727 4689 y(are,)f(several)h(algorithms)h(for)d(a)
+g(particular)j(operator)-5 b(.)33 b(For)22 b(example,)i(File)p
+3130 4689 V 33 w(scan)f(and)g(In-)727 4858 y(dex)p 862
+4858 V 34 w(scan)e(are)g(valid)g(algorithms)h(that)f(implement)g(the)f
+(RET)f(operator)l(,)k(and)d(Mer)n(ge)p 3429 4858 V 35
+w(join)p 300 4939 1320 4 v 400 4993 a Fu(1)434 5024 y
+Fy(Algorithms)g(may)f(have)h Fr(tuning)f(parameters)h
+Fy(which)g(are)f(not)g(parameters)g(in)g(the)g(operators)h(they)f
+(implement.)1905 5349 y FP(28)p eop
+%%Page: 29 41
+29 40 bop 554 412 2793 13 v 554 503 4 92 v 607 476 a
+Fz(Operator)p 1069 503 V 217 w(Description)p 1762 503
+V 323 w(Additional)17 b(Parameters)p 2594 503 V 105 w(Algorithm)p
+3343 503 V 554 516 2793 13 v 554 607 4 92 v 607 626 a
+Fy(JOIN\()p Fq(S)841 634 y Fu(1)875 626 y Fy(,)h Fq(S)959
+634 y Fu(2)994 626 y Fy(\))p 1069 607 V 1122 627 a(Join)h(streams)g
+Fq(S)1559 635 y Fu(1)1593 627 y Fy(,)g Fq(S)1678 635
+y Fu(2)p 1762 607 V 1815 580 a Fy(tuple)p 1968 580 23
+4 v 28 w(order)p 2594 607 4 92 v 498 w(Nested)p 2858
+580 23 4 v 27 w(loops\()p Fq(S)3114 588 y Fu(1)3149 580
+y Fy(,)g Fq(S)3234 588 y Fu(2)3268 580 y Fy(\))p 3343
+607 4 92 v 2597 611 750 4 v 554 699 4 92 v 1069 699 V
+1762 699 V 1815 671 a(join)p 1935 671 23 4 v 27 w(predicate)p
+2594 699 4 92 v 416 w(Mer)o(ge)p 2844 671 23 4 v 27 w(join\()p
+Fq(S)3055 679 y Fu(1)3090 671 y Fy(,)f Fq(S)3174 679
+y Fu(2)3209 671 y Fy(\))p 3343 699 4 92 v 554 702 2793
+4 v 554 806 4 105 v 607 865 a(RET\()p Fq(F)11 b Fy(\))p
+1069 806 V 1122 871 a(Retrieve)19 b(\256le)f Fq(F)p 1762
+806 V 1815 773 a Fy(tuple)p 1968 773 23 4 v 28 w(order)p
+2594 806 4 105 v 2647 793 a(File)p 2768 793 23 4 v 26
+w(scan\()p Fq(F)11 b Fy(\))p 3343 806 4 105 v 554 898
+4 92 v 1069 898 V 1762 898 V 1815 870 a(selection)p 2084
+870 23 4 v 28 w(predicate)p 2594 898 4 92 v 2597 870
+747 4 v 3343 898 4 92 v 554 989 V 1069 989 V 1762 989
+V 1815 962 a(projected)p 2096 962 23 4 v 28 w(attributes)p
+2594 989 4 92 v 2647 949 a(Index)p 2820 949 23 4 v 28
+w(scan\()p Fq(F)g Fy(\))p 3343 989 4 92 v 554 993 2793
+4 v 554 1084 4 92 v 607 1103 a(SOR)l(T\()p Fq(S)867 1111
+y Fu(1)900 1103 y Fy(\))p 1069 1084 V 1122 1105 a(Sort)18
+b(stream)h Fq(S)1530 1113 y Fu(1)p 1762 1084 V 1815 1101
+a Fy(tuple)p 1968 1101 23 4 v 28 w(order)p 2594 1084
+4 92 v 2647 1057 a(Mer)o(ge)p 2844 1057 23 4 v 27 w(sort\()p
+Fq(S)3051 1065 y Fu(1)3086 1057 y Fy(\))p 3343 1084 4
+92 v 2597 1087 750 4 v 554 1175 4 92 v 1069 1175 V 1762
+1175 V 2594 1175 V 2647 1148 a(Null\()p Fq(S)2852 1156
+y Fu(1)2886 1148 y Fy(\))p 3343 1175 V 554 1188 2793
+13 v 300 1341 a FP(T)-6 b(able)22 b(3.1:)31 b(Operators)24
+b(and)f(algorithms)h(in)f(a)f(centralized)j(Prairie)e(query)h
+(optimizer)g(and)f(their)g(addi-)300 1454 y(tional)i(parameters)727
+1813 y(and)30 b(Nested)p 1143 1813 28 4 v 34 w(loops)g(are)g
+(algorithms)h(that)f(implement)g(the)f(JOIN)g(operator)-5
+b(.)49 b(Dif)n(ferent)727 1983 y(algorithms)26 b(of)n(fer)f(dif)n
+(ferent)h(execution)g(ef)n(\256ciencies.)300 2239 y(T)-6
+b(able)25 b(3.1)f(lists)i(some)f(operators)i(and)f(algorithms)h
+(implementing)g(them)e(together)i(with)d(their)i(addi-)300
+2408 y(tional)f(parameters.)300 2706 y FI(Operator)30
+b(T)-7 b(r)n(ee.)92 b FP(An)30 b FD(operator)i(tr)m(ee)e
+FP(is)f(a)g(rooted)j(tree)e(whose)g(non-leaf,)j(or)d
+FD(interior)i FP(nodes)f(are)300 2875 y(database)i(operations)h
+(\(operators)g(or)d(algorithms\))i(and)e(whose)h(leaf)f(nodes)h(are)g
+(stored)g(\256les.)53 b(The)300 3045 y(children)26 b(of)e(an)g
+(interior)i(node)f(in)f(an)g(operator)i(tree)f(are)f(the)g(essential)j
+(parameters)f(\(i.e.,)d(the)i(stream)300 3214 y(or)i(\256le)g
+(parameters\))j(of)d(the)g(operation.)45 b(Additional)30
+b(parameters)f(are)f(implicitly)h(attached)g(to)e(each)300
+3383 y(node.)42 b(Algebraically)-6 b(,)30 b(operator)f(trees)f(are)f
+(compositions)j(of)d(database)i(operations;)i(thus,)e(we)d(will)300
+3553 y(also)e(call)g(operator)i(trees)e FD(expr)m(essions)p
+FP(;)j(both)d(terms)g(will)f(be)h(used)g(interchangeably)-6
+b(.)302 3809 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(5)t(.)159
+b(A)20 b(simple)h(expression)j(and)d(its)g(operator)i(tree)e
+(representation)k(are)c(shown)g(in)f(Fig-)300 3978 y(ure)25
+b(3.2\(a\).)37 b(Relations)26 b FH(R)1149 3992 y Fv(1)1213
+3978 y FP(and)g FH(R)1438 3992 y Fv(2)1501 3978 y FP(are)g(\256rst)e
+(RET)m(rieved,)h(then)h(JOINed,)f(and)h(\256nally)f(SOR)-5
+b(T)f(ed)23 b(re-)300 4148 y(sulting)g(in)e(a)g(stream)h(sorted)h(on)f
+(a)f(speci\256c)h(attribute.)32 b(The)21 b(\256gure)h(shows)g(only)g
+(the)g(essential)i(param-)300 4317 y(eters)g(of)g(the)g(various)h
+(operators,)h(not)e(the)f(additional)k(parameters.)1050
+b Fw(\003)297 4674 y FI(Access)21 b(Plan.)90 b FP(An)20
+b FD(access)i(plan)g FP(is)e(an)h(operator)h(tree)f(in)g(which)g(all)g
+(interior)h(nodes)g(are)f(algorithms.)302 4931 y(E)t
+Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(6)t(.)174 b(An)34 b(access)i(plan)g
+(for)f(the)g(operator)i(tree)f(in)f(Figure)g(3.2\(a\))h(is)f(shown)h
+(in)e(Fig-)300 5100 y(ure)c(3.2\(b\).)51 b(Relations)32
+b FH(R)1179 5114 y Fv(1)1248 5100 y FP(and)e FH(R)1477
+5114 y Fv(2)1546 5100 y FP(are)g(each)h(retrieved)h(using)f(the)g(File)
+p 2747 5100 V 33 w(scan)g(algorithm,)i(joined)1905 5349
+y(29)p eop
+%%Page: 30 42
+30 41 bop 347 403 3189 4 v 347 1486 4 1084 v 657 528
+a FF(SOR)l(T)17 b(\(JOIN)f(\(RET)g(\()p Fs(R)1261 537
+y Fu(1)1296 528 y FF(\),)g(RET)h(\()p Fs(R)1569 537 y
+Fu(2)1603 528 y FF(\)\)\))1081 675 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 1081 675 a FF(SOR)l(T)1092
+817 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 1092 817 a FF(JOIN)1022 1078 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1022 1078 a 959
+958 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 959 958 a FF(RET)1242 958 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 1242 958 a FF(RET)1022
+1078 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1022 1078 a 1022 1078 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1022 1078 a 978 1096 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+
+978 1096 a Fs(R)1031 1105 y Fu(1)1261 1096 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1261 1096
+a Fs(R)1314 1105 y Fu(2)1022 1078 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1022 1078 a 1022
+1078 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1022 1078 a 481 1274 a Fy(\(a\))h(An)h(expression)g(and)g(its)f
+(corresponding)i(oper)o(-)481 1365 y(ator)f(tree)p 1951
+1461 4 1034 v 2572 668 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodemergesort 16 { .5 5.344
+1.72792 false .5 35.61568 InitRnode } NewNode end end
+ 2572 668 a FF(Mer)o(ge)p 2747
+668 20 4 v 25 w(sort)2544 810 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodenestedloops 16 { .5 5.43198
+1.72792 false .5 42.43158 InitRnode } NewNode end end
+ 2544 810 a FF(Nested)p
+2731 810 20 4 v 25 w(loops)2578 1078 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodemergesort
+/TheNodenestedloops InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2578 1078 a 2456
+958 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr1 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2456 958 a FF(File)p 2562 958 20 4 v 25 w(scan)2739
+958 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr2 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2739 958 a FF(File)p 2845 958 20 4 v 25 w(scan)2578
+1078 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodenestedloops
+/TheNodefilescanr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2578 1078 a 2578 1078 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodenestedloops
+/TheNodefilescanr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2578 1078 a 2534 1096
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 2534 1096 a Fs(R)2587 1105 y Fu(1)2818 1096 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 2818
+1096 a Fs(R)2871 1105 y Fu(2)2578 1078 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodefilescanr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2578 1078 a
+2578 1078 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodefilescanr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2578 1078 a 2038 1274 a Fy(\(b\))g(A)g(possible)h(access)g
+(plan)g(for)f(operator)h(tree)f(in)2038 1365 y(\(a\))p
+3533 1486 4 1084 v 347 1489 3189 4 v 3534 1506 19 1090
+v 364 1506 3189 19 v 934 1702 a FP(Figure)24 b(3.2:)31
+b(Example)24 b(of)g(an)f(operator)j(tree)e(and)g(access)h(plan)300
+2079 y(using)g(Nested)p 776 2079 28 4 v 34 w(loops,)f(and)g(\256nally)g
+(sorted)h(using)g(Mer)n(ge)p 2160 2079 V 34 w(sort.)1182
+b Fw(\003)300 2380 y FI(Descriptors.)93 b FP(A)27 b FD(pr)m(operty)j
+FP(of)d(a)h(node)h(is)f(a)f(\(user)n(-de\256ned\))k(variable)f(that)f
+(contains)h(information)297 2550 y(used)22 b(by)g(an)f(optimizer)-5
+b(.)32 b(An)20 b FD(annotation)k FP(is)d(a)g FC(h)p FD(pr)m(operty)-5
+b(,)26 b(value)r FC(i)20 b FP(pair)i(that)g(is)f(assigned)i(to)e(a)g
+(node.)31 b(A)296 2719 y FD(descriptor)23 b FP(is)c(a)h(list)g(of)g
+(annotations)j(that)d(describes)i(a)e(node)g(of)g(an)g(operator)i
+(tree;)f(every)g(node)g(has)f(its)297 2889 y(own)h(descriptor)-5
+b(.)33 b(As)20 b(an)h(example,)i(T)-6 b(able)21 b(3.2)g(lists)h(some)f
+(typical)i(properties)h(that)d(might)h(be)f(used)h(in)298
+3058 y(a)f(descriptor)-5 b(.)32 b(In)22 b(general,)h(descriptors)h(for)
+e(streams)g(may)f(be)h(dif)n(ferent)i(from)d(descriptors)k(for)c
+(stored)300 3227 y(\256les.)474 3194 y Fv(2)576 3397
+y FP(The)16 b(following)i(notations)i(will)c(be)h(useful)h(in)e(our)h
+(subsequent)j(discussions.)32 b(If)16 b FH(X)3208 3411
+y Fs(i)3253 3397 y FP(is)g(a)g(stored)294 3566 y(\256le)h(or)h(stream,)
+h(then)f Fp(D)1056 3581 y Fo(i)1100 3566 y FP(is)g(its)g(descriptor)-5
+b(.)31 b(Annotations)21 b(of)c FH(S)2300 3580 y Fs(i)2345
+3566 y FP(are)h(accessed)i(by)e(a)f(structure)j(member)300
+3735 y(relationship,)31 b(e.g.,)26 b Fp(D)1039 3750 y
+Fo(i)1066 3735 y FH(:)p FP(cardinality)t(.)39 b(Also,)27
+b(let)g FH(E)k FP(be)c(an)f(expression)k(and)d(let)g
+Fp(D)e FP(be)i(its)g(descriptor)-5 b(.)300 3905 y(This)23
+b(is)h(written)g(as)f FH(E)31 b FA(:)26 b Fp(D)p FP(.)302
+4174 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)k FP(7)t(.)162 b(The)23
+b(expression,)895 4418 y(SOR)-5 b(T)n FA(\()p FP(JOIN)p
+FA(\()p FP(RET)o FA(\()p FH(R)1665 4432 y Fv(1)1705 4418
+y FA(\))25 b(:)h Fp(D)1896 4432 y Fo(3)1941 4418 y FH(;)15
+b FP(RET)o FA(\()p FH(R)2257 4432 y Fv(2)2297 4418 y
+FA(\))25 b(:)h Fp(D)2488 4432 y Fo(4)2533 4418 y FA(\))g(:)f
+Fp(D)2724 4432 y Fo(5)2769 4418 y FA(\))h(:)f Fp(D)2960
+4432 y Fo(6)300 4662 y FP(corresponds)34 b(to)c(the)h(operator)i(tree)e
+(in)f(Figure)h(3.2\(a\),)i(and)d(represents)k(the)c(join)i(of)e(two)g
+(relations)300 4831 y FH(R)369 4845 y Fv(1)435 4831 y
+FP(and)f FH(R)663 4845 y Fv(2)702 4831 y FP(.)43 b(The)27
+b(two)g(relations)j(are)e(\256rst)g(RET)m(rieved,)g(then)h(JOINed)e
+(and)i(\256nally)f(SOR)-5 b(T)f(ed.)41 b Fp(D)3555 4845
+y Fo(1)p 300 4912 1320 4 v 400 4966 a Fu(2)434 4998 y
+Fy(As)19 b(an)g(example,)h(a)f(stream)g(may)g(have)h(a)f(property)g
+(join)p 1936 4998 23 4 v 28 w(predicate)g(which)g(is)g(absent)h(in)e(a)
+h(stored)g(\256le')l(s)f(descriptor)l(.)1905 5349 y FP(30)p
+eop
+%%Page: 31 43
+31 42 bop 835 412 2231 13 v 835 503 4 92 v 888 476 a
+Fz(Pr)o(operty)p 1355 503 V 235 w(Description)p 3062
+503 V 835 516 2231 13 v 835 607 4 92 v 888 580 a Fy(join)p
+1008 580 23 4 v 27 w(predicate)p 1355 607 4 92 v 104
+w(join)19 b(predicate)g(for)g(JOIN)g(operator)p 3062
+607 V 835 611 2231 4 v 835 702 4 92 v 888 674 a(tuple)p
+1041 674 23 4 v 27 w(order)p 1355 702 4 92 v 187 w(tuple)g(order)g(of)g
+(resulting)h(stream,)e(DONT)p 2562 674 23 4 v 26 w(CARE)g(if)h(none)p
+3062 702 4 92 v 835 705 2231 4 v 835 796 4 92 v 888 769
+a(cardinality)p 1355 796 V 201 w(number)h(of)f(tuples)g(of)g(resulting)
+g(stream)p 3062 796 V 835 800 2231 4 v 835 891 4 92 v
+888 864 a(record)p 1082 864 23 4 v 28 w(width)p 1355
+891 4 92 v 132 w(size)g(of)g(individual)g(tuple)h(in)e(stream)p
+3062 891 V 835 894 2231 4 v 835 986 4 92 v 888 958 a(attributes)p
+1355 986 V 242 w(list)g(of)h(attributes)p 3062 986 V
+835 989 2231 4 v 835 1080 4 92 v 888 1053 a(cost)p 1355
+1080 V 400 w(estimated)g(cost)g(of)g(algorithm)p 3062
+1080 V 835 1093 2231 13 v 880 1246 a FP(T)-6 b(able)24
+b(3.2:)31 b(Properties)25 b(of)f(nodes)g(in)g(an)f(operator)j(tree)e
+(in)f(Prairie)300 1623 y(and)k Fp(D)537 1637 y Fo(2)607
+1623 y FP(are)f(the)h(descriptors)i(of)d(the)g(stored)i(\256les)e
+FH(R)2035 1637 y Fv(1)2100 1623 y FP(and)g FH(R)2325
+1637 y Fv(2)2365 1623 y FP(,)f(respectively)-6 b(,)30
+b Fp(D)2975 1637 y Fo(3)3046 1623 y FP(and)c Fp(D)3282
+1637 y Fo(4)3353 1623 y FP(are)g(the)300 1792 y(stream)34
+b(descriptors)i(of)e(the)f(two)g(RET)-6 b(s)31 b(respectively)-6
+b(,)39 b(and)34 b Fp(D)2395 1806 y Fo(5)2473 1792 y FP(is)f(the)h
+(stream)g(descriptor)i(of)d(the)300 1961 y(JOIN,)e(and)i
+Fp(D)794 1975 y Fo(6)870 1961 y FP(is)f(the)h(stream)g(descriptor)i(of)
+d(the)g(SOR)-5 b(T)e(.)30 b(Assuming)j(that)g(the)f(descriptor)j
+(\256elds)300 2131 y(for)d(this)g(expression)i(are)e(those)h(given)g
+(in)e(T)-6 b(able)32 b(3.2,)h(the)f(selection)h(predicate)h(for)e(the)g
+(\256rst)f(RET)300 2300 y(is)24 b Fp(D)464 2314 y Fo(3)509
+2300 y FH(:)p FP(selection)p 859 2300 28 4 v 36 w(predicate)s(,)f(and)h
+(that)g(for)g(the)g(second)i(RET)21 b(is)j(given)h(by)f
+Fp(D)2818 2314 y Fo(4)2863 2300 y FH(:)p FP(selection)p
+3213 2300 V 36 w(predicate)s(.)300 2469 y(The)j(join)h(predicate)i(of)d
+(the)h(JOIN)e(node)i(is)f(given)i(by)e Fp(D)2175 2483
+y Fo(5)2220 2469 y FH(:)p FP(join)p 2390 2469 V 35 w(predicate)s(,)g
+(and)h(the)g(attributes)i(that)300 2639 y(are)24 b(output)h(are)f
+(given)g(by)g Fp(D)1241 2653 y Fo(5)1286 2639 y FH(:)p
+FP(attributes)t(.)30 b(And)23 b(so)g(on.)1431 b Fw(\003)583
+2875 y FP(Currently)-6 b(,)26 b(descriptor)i(properties)f(are)d
+(de\256ned)h(entirely)h(by)f(the)g(DBI;)e(however)l(,)j(we)d(envi-)300
+3044 y(sion)h(providing)j(a)c(hierarchy)j(of)d(pre-de\256ned)j
+(descriptor)g(types)f(to)e(aid)h(this)g(process.)300
+3411 y FO(3.3)119 b(Prairie)30 b(Optimization)h(Paradigm)300
+3674 y FP(As)24 b(shown)h(in)f(Figure)h(3.1,)g(an)f(optimizer)i(is)f
+(generated)i(from)d(a)g(Prairie)h(rule)h(speci\256cation)h(by)d(con-)
+300 3843 y(verting)g(them)f(to)h(a)e(V)-12 b(olcano)25
+b(speci\256cation)h(and)d(then)h(compiling)h(it)e(with)g(the)g(V)-12
+b(olcano)25 b(rule)e(engine.)300 4012 y(Since)30 b(the)h(V)-12
+b(olcano)31 b(rule)g(engine)h(implements)f(a)f(top-down)i(optimization)
+h(search)e(strategy)h(\(Sec-)300 4182 y(tion)c(2.1\),)g(this)g(means)g
+(that,)h(currently)-6 b(,)30 b(Prairie)e(speci\256cations)i(can)e(only)
+g(generate)i(top-down)f(op-)300 4351 y(timizers.)52 b(Given)31
+b(an)f(appropriate)k(search)e(engine,)h(Prairie)e(can)g(potentially)i
+(also)e(be)f(used)h(with)g(a)296 4520 y(bottom-up)22
+b(optimization)h(strategy;)g(however)l(,)f(we)d(will)h(not)g(explore)i
+(this)e(topic)h(in)f(this)g(dissertation.)583 4690 y(In)k(query)h
+(optimization,)h(there)e(are)g(certain)h(annotations)i(\(such)d(as)g
+(additional)i(parameters\))298 4859 y(that)c(are)f(known)h(before)h
+(any)f(optimization)i(is)e(begun.)31 b(These)22 b(annotations)j(can)c
+(be)h(computed)h(at)e(the)300 5029 y(time)26 b(that)g(the)h(operator)h
+(tree)e(is)g(initialized,)j(and)e(will)f(not)g(change)i(with)d
+(application)30 b(of)c(rules.)39 b(For)1905 5349 y(31)p
+eop
+%%Page: 32 44
+32 43 bop 371 403 3142 4 v 371 1124 4 722 v 425 694 a
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.3 true 3.8 neg 6.1651
+neg 89.15826 32.61813 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial -170 x FH(E)5
+b(;)15 b(E)609 491 y FB(0)634 524 y FP(:)30 b(Expression)425
+694 y FH(D)s(;)15 b(D)621 661 y FB(0)644 694 y FP(:)31
+b(Descriptor)1517 853 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 0.0 0.0 Ellipse closepath
+gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 1381 884 a FH(E)171
+b(D)1885 866 y Fv(=)-12 b FB(\))1517 853 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 102.42984 0.0 Ellipse
+closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 0.0 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+2220 888 a FH(E)2292 855 y FB(0)2458 888 y FH(D)2536
+855 y FB(0)p 3509 1124 V 371 1127 3142 4 v 3511 1144
+19 729 v 388 1144 3142 19 v 1196 1340 a FP(Figure)25
+b(3.3:)31 b(General)24 b(form)g(of)f(a)g(Prairie)h(rule)293
+1717 y(this)18 b(purpose,)i(the)e(DBI)e(must)h(de\256ne)g(support)j
+(functions)f(\(called)g(init)p 2534 1717 28 4 v 34 w(descriptor\))h
+(for)e(each)g(operator;)300 1886 y(these)30 b(functions)i(compute)f
+(the)e(descriptor)j(properties)g(for)d(an)h(operator)h(given)f(the)g
+(descriptors)i(of)297 2056 y(its)22 b(input.)31 b(For)20
+b(instance,)k(init)p 1256 2056 V 34 w(descriptor)p 1650
+2056 V 36 w(JOIN)d(computes)h(the)g(descriptor)i(properties)g
+(\(cardinality)-6 b(,)300 2225 y(record)p 535 2225 V
+35 w(width,)27 b(attributes\))j(from)c(the)h(descriptors)j(of)c(its)h
+(two)f(inputs.)41 b(Our)27 b(following)h(discussions)300
+2394 y(assume)c(operator)i(trees)e(are)g(initialized.)300
+2761 y FO(3.4)119 b(Rules)30 b(in)h(Prairie)583 3024
+y FP(Rules)23 b(in)f(Prairie)i(correspond)i(to)c(rewrites)i(between)g
+(pairs)g(of)e(expressions,)k(or)d(between)h(an)300 3193
+y(expression)29 b(and)d(an)g(access)h(plan.)38 b(Figure)27
+b(3.3)e(shows)i(the)f(general)h(format)g(of)e(a)h(Prairie)g(rule.)38
+b(This)300 3363 y(general)30 b(rule)f(results)h(in)f(two)f(types)h(of)g
+(algebraic)h(transformations)j(\(or)28 b FD(r)m(ewrite)h(rules)p
+FP(\))h(in)e(Prairie:)299 3532 y(T)-8 b(-rules)23 b
+(\(\252transformation)j(rules\272\))e(and)f(I-rules)h
+(\(\252implementation)i(rules\272\).)32 b(Each)22 b(rule)h(transforms)
+298 3702 y(an)e(expression)k(into)d(another)h(based)g(on)f(additional)i
+(conditions;)h(the)d(transformation)j(also)d(results)h(in)300
+3871 y(a)j(mapping)i(of)e(descriptors)j(between)f(expressions,)i(as)c
+(Figure)h(3.3)f(shows.)39 b(Thus,)27 b(rules)g(in)g(Prairie)300
+4040 y(represent)f(units)e(of)g FD(encapsulation)k FP(for)23
+b(operator)j(tree)e(and)g(descriptor)i(transformations.)583
+4210 y(T)-8 b(-rules)28 b(and)g(I-rules)h(are)e(de\256ned)h(precisely)i
+(in)d(Sections)h(3.5)f(and)h(3.6)f(and)h(are)f(illustrated)300
+4379 y(with)k(examples.)54 b(The)31 b(examples)i(are)e(chosen)h(from)f
+(rules)h(that)g(would)f(be)g(used)h(in)f(a)f(centralized)300
+4548 y(relational)d(query)f(optimizer;)h(the)d(operators,)j
+(algorithms,)g(and)e(properties)i(are)e(subsets)h(of)f(those)g(in)300
+4718 y(T)-6 b(ables)24 b(3.1)f(and)h(3.2.)1905 5349 y(32)p
+eop
+%%Page: 33 45
+33 44 bop 312 303 3260 4 v 312 977 4 674 v 386 383 a
+Fs(E)t Fv(\()p Fs(x)509 392 y Fu(1)543 383 y Fs(;)11
+b(:)g(:)h(:)23 b(;)11 b(x)751 391 y Fn(n)794 383 y Fv(\))20
+b(:)f Fo(D)942 392 y Fm(1)1000 383 y Fv(=)-12 b FB(\))20
+b Fs(E)1190 356 y Ft(0)1211 383 y Fv(\()p Fs(x)1278 392
+y Fu(1)1313 383 y Fs(;)12 b(:)f(:)g(:)23 b(;)12 b(x)1522
+391 y Fn(n)1564 383 y Fv(\))20 b(:)f Fo(D)1712 392 y
+Fm(2)3393 383 y FF(\(3.1\))386 462 y FB(ff)601 541 y
+FF(pre-test)g(statements)386 620 y FB(gg)386 699 y FF(test)386
+778 y FB(ff)601 857 y FF(post-test)g(statements)386 936
+y FB(gg)p 3568 977 V 312 980 3260 4 v 3570 997 19 681
+v 328 997 3260 19 v 1158 1193 a FP(Figure)24 b(3.4:)31
+b(General)24 b(form)g(of)f(a)g(Prairie)h(T)-8 b(-rule)300
+1570 y FO(3.5)119 b(T)-9 b(ransformation)29 b(Rules)583
+1833 y FP(T)m(ransformation)i(rules,)g(or)d(T)-8 b(-rules)29
+b(for)g(short,)h(de\256ne)f(equivalences)j(among)d(pairs)h(of)e(ex-)298
+2002 y(pressions;)d(they)e(de\256ne)f(mappings)i(from)e(one)g(operator)
+i(tree)f(to)e(another)-5 b(.)33 b(Let)21 b FH(E)26 b
+FP(and)d FH(E)3183 1969 y FB(0)3227 2002 y FP(be)f(expres-)300
+2171 y(sions)27 b(that)f(involve)i(only)f(abstract)h(operators.)40
+b(Equation)27 b(\(3.1\))g(\(shown)f(in)g(Figure)h(3.4\))f(shows)g(the)
+300 2341 y(general)k(form)e(of)h(a)f(T)-8 b(-rule.)45
+b(The)28 b(actions)i(of)f(a)f(T)-8 b(-rule)28 b(de\256ne)h(the)g
+(equivalences)j(between)d(the)g(de-)299 2510 y(scriptors)c(of)e(nodes)h
+(of)e(the)h(original)i(operator)f(tree)g FH(E)j FP(with)22
+b(the)h(nodes)h(of)f(the)g(output)h(tree)f FH(E)3343
+2477 y FB(0)3367 2510 y FP(;)f(these)300 2679 y(actions)j(consist)h(of)
+d(a)g(series)i(of)e(\(C)g(or)g(C++\))h(assignment)2180
+2646 y Fv(3)2245 2679 y FP(statements.)583 2849 y(The)32
+b(left-hand)j(sides)e(of)f(these)h(statements)h(refer)f(to)f
+(descriptors)j(of)d(expressions)k(on)c(the)300 3018 y(right-hand)j
+(side)d(of)f(the)h(T)-8 b(-rule)32 b(\(i.e.,)h(the)f(descriptors)j
+(whose)d(values)h(are)f(to)f(be)h(computed\);)38 b(the)298
+3188 y(right-hand)25 b(sides)e(of)f(the)g(statements)i(can)e(refer)h
+(to)f(any)g(descriptor)j(in)d(the)g(T)-8 b(-rule.)30
+b(As)21 b(in)h(procedural)300 3357 y(languages)27 b(\(like)f(C\),)e
+(function)i(calls)g(can)f(also)g(appear)i(on)d(the)h(right)h(side)f(of)
+g(the)g(assignment)i(state-)300 3526 y(ments.)32 b(These)24
+b(functions)i(are)e(called)h FD(helper)g FP(functions.)34
+b(Unlike)24 b(support)i(functions)g(that)e(are)g(man-)300
+3696 y(dated)31 b(by)e(the)h(language)i(\(e.g.,)f(init)p
+1482 3696 28 4 v 34 w(descriptor\),)j(helper)d(functions)h(exist)e
+(solely)h(to)f(simplify)h(rule)300 3865 y(actions.)42
+b(Thus,)28 b(descriptors)i(on)c(the)i FD(left-hand)h(side)e
+FP(of)g(a)f(T)-8 b(-rule)27 b(are)g FD(never)h FP(changed)h(in)e(the)g
+(rule')-5 b(s)300 4034 y(actions.)38 b(A)24 b FD(test)i
+FP(is)f(needed)i(to)e(determine)i(if)e(the)h(transformations)j(of)c
+(the)g(T)-8 b(-rule)26 b(are)f(in)g(fact)h(appli-)300
+4204 y(cable.)583 4373 y(Purely)h(as)f(an)f(optimization,)k(it)d(is)g
+(usually)h(the)f(case)h(that)f(not)h(all)f(statements)h(in)f(a)g(T)-8
+b(-rule')j(s)296 4542 y(actions)21 b(need)g(to)e(be)h(executed)i(prior)
+f(to)e(a)h(T)-8 b(-rule')j(s)20 b(test.)30 b(For)19 b(this)h(reason,)i
+(the)e(actions)i(of)d(a)g(T)-8 b(-rule)20 b(are)p 300
+4624 1320 4 v 400 4677 a Fu(3)434 4709 y Fy(The)k(actions)f(can)h(be)f
+(non-assignment)i(statements)f(\(like)e(helper)i(function)g(calls\),)f
+(but)h(in)f(this)g(case,)h(the)f(P2V)g(pre-)300 4800
+y(processor)f(\(described)g(in)f(Chapter)g(4\))g(needs)h(some)g(hints)f
+(about)h(the)f(properties)g(that)g(are)g(changed)i(by)f(the)f
+(statement)g(in)300 4892 y(order)e(to)f(correctly)h(categorize)g(each)g
+(property)-5 b(.)26 b(For)18 b(simplicity)-5 b(,)18 b(in)h(this)f
+(dissertation,)g(we)h(assume)g(all)f(actions)h(consist)g(of)300
+4983 y(assignment)h(statements.)1905 5349 y FP(33)p eop
+%%Page: 34 46
+34 45 bop 299 391 a FP(split)23 b(into)g(two)f(groups;)j(those)f(that)f
+(need)g(to)f(be)h(executed)i(prior)e(to)f(the)h(T)-8
+b(-rule')j(s)23 b(test,)g(and)g(those)h(that)300 561
+y(can)h(be)g(executed)i(after)f(a)e(successful)k(test.)35
+b(These)25 b(groups)i(of)e(statements)i(comprise,)f(respectively)-6
+b(,)298 730 y(the)22 b FD(pr)m(e-test)i FP(and)e FD(post-test)j
+FP(statements)f(of)e(the)g(T)-8 b(-rule.)2083 697 y Fv(4)2153
+730 y FP(It)21 b(is)h(important)h(to)f(remember)g(that)h(the)f(pre-)300
+899 y(test)k(actions)i(are)e(carried)h(out)f(prior)h(to)e(the)h(test;)i
+(the)e(post-test)i(actions)g(are)e(performed)h(only)g(if)e(a)h(T)-8
+b(-)300 1069 y(rule')j(s)25 b(test)g(evaluates)h(to)e(TRUE,)d(and)k
+(all)f(post-test)i(actions)g(are)e(performed)i(immediately)-6
+b(,)25 b(with)f(no)300 1238 y(intermediate)i(optimization)h(of)c(any)h
+(descendant)j(nodes)d(of)g(the)g(root)g(of)f FH(E)5 b
+FP(.)580 1408 y(W)-7 b(e)20 b(now)g(de\256ne)h(the)g(actions)h(and)f
+(tests)g(of)f(a)g(T)-8 b(-rule)21 b(more)f(precisely)-6
+b(.)33 b(Let)19 b FH(O)3061 1422 y Fs(i)3110 1408 y FP(be)h(an)h
+(abstract)300 1577 y(operator)31 b(of)e FH(E)807 1544
+y FB(0)831 1577 y FP(,)g(and)h(let)f Fp(O)1241 1592 y
+Fo(i)1296 1577 y FP(be)g(its)g(descriptor)-5 b(.)50 b(Similarly)-6
+b(,)31 b(let)f FH(I)2497 1591 y Fs(i)2553 1577 y FP(be)f(an)g(abstract)
+i(operator)h(of)d FH(E)300 1746 y FP(and)e(let)f Fp(I)613
+1761 y Fo(i)665 1746 y FP(be)h(its)f(descriptor)-5 b(.)43
+b(\()p FH(I)1379 1760 y Fs(i)1433 1746 y FP(is)26 b(an)g(operator)j
+(that)e(is)f(input)h(to)g(the)f(rule)h(and)g FH(O)3045
+1760 y Fs(i)3099 1746 y FP(is)g(an)f(operator)300 1916
+y(that)h(is)g(output)h(by)f(the)g(rule.\))41 b(Let)26
+b FH(M)1530 1930 y Fs(j)1592 1916 y FP(denote)i(the)f
+FH(j)5 b FP(th)27 b(descriptor)j(property)-6 b(.)42 b(Thus,)27
+b Fp(O)3200 1931 y Fo(i)3227 1916 y FH(:M)3340 1930 y
+Fs(j)3402 1916 y FP(is)g(the)300 2085 y(value)e(of)f(the)g
+FH(j)5 b FP(th)24 b(property)i(of)e(descriptor)j Fp(O)1785
+2100 y Fo(i)1811 2085 y FP(.)k(The)24 b(left-hand)i(side)f(of)e(an)h
+(assignment)i(refers)f(to)f(an)300 2254 y(output)29 b(descriptor)h(\()p
+Fp(O)1058 2269 y Fo(i)1085 2254 y FP(\))d(or)g(a)g(member)h(of)f(an)g
+(output)i(descriptor)i(\()p Fp(O)2609 2269 y Fo(i)2635
+2254 y FH(:M)2748 2268 y Fs(j)2785 2254 y FP(\).)42 b(The)27
+b(right-hand)k(side)300 2424 y(is)24 b(an)h(expression)i(or)e(a)f
+(helper)h(function)i(call)e(that)g(only)g(references)i(input)f
+(descriptors)h(and/or)f(their)300 2593 y(members.)31
+b(Here)24 b(are)f(a)g(few)g(examples:)512 2814 y Fp(O)591
+2829 y Fo(i)701 2814 y FA(=)83 b Fp(I)895 2829 y Fo(k)964
+2814 y FA(;)726 b FH(==)24 b FP(copy)g(descriptor)j Fp(I)2455
+2829 y Fo(k)2524 2814 y FP(to)d Fp(O)2697 2829 y Fo(i)363
+2984 y Fp(O)442 2999 y Fo(i)468 2984 y FH(:M)581 2998
+y Fs(j)701 2984 y FA(=)83 b Fp(I)895 2999 y Fo(k)941
+2984 y FH(:M)1054 2998 y Fs(j)1111 2984 y FA(+)20 b(4)k(;)419
+b FH(==)24 b FP(expression)i(de\256ning)f Fp(O)2640 2999
+y Fo(i)2666 2984 y FH(:M)2779 2998 y Fs(j)342 3153 y
+Fp(O)421 3167 y Fo(3)465 3153 y FH(:M)578 3167 y Fv(5)701
+3153 y FA(=)83 b FP(foo)23 b FA(\()p Fp(I)1073 3167 y
+Fo(1)1118 3153 y FH(:M)1231 3167 y Fv(5)1271 3153 y FH(;)15
+b Fp(I)1351 3167 y Fo(2)1396 3153 y FH(:M)1509 3167 y
+Fv(5)1549 3153 y FA(\))23 b(;)83 b FH(==)24 b FP(helper)h(function)h
+(foo)d(that)i(computes)g Fp(O)3158 3167 y Fo(3)3202 3153
+y FH(:M)3315 3167 y Fv(5)1715 3322 y FH(==)f FP(from)f(inputs)i
+Fp(I)2313 3336 y Fo(1)2358 3322 y FH(:M)2471 3336 y Fv(5)2533
+3322 y FP(and)f Fp(I)2727 3336 y Fo(2)2772 3322 y FH(:M)2885
+3336 y Fv(5)2925 3322 y FP(.)583 3518 y(The)k(test)g(for)g(a)f(T)-8
+b(-rule')j(s)29 b(applicability)i(is)d(a)f(boolean)j(expression)g(and)f
+(normally)g(involves)295 3687 y(checks)20 b(on)f(the)g(values)i(of)e
+(output)h(descriptors)i(\(e.g.,)d Fp(O)2092 3701 y Fo(3)2137
+3687 y FH(:M)2250 3701 y Fv(5)2315 3687 y FH(>)25 b FA(6)p
+FP(\);)20 b(occasionally)-6 b(,)24 b(helper)c(functions)300
+3857 y(may)j(be)h(needed.)302 4126 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30
+b FP(8)t(.)166 b(The)28 b(associativity)k(of)27 b(JOINs)h(is)g
+(expressed)i(by)e(T)-8 b(-rule)28 b(\(3.2\))g(in)g(Figure)h(3.5\(a\).)
+300 4295 y(It)d(rewrites)h(a)f(two-way)h(join)f(into)h(an)g(equivalent)
+i(operator)f(tree.)40 b(The)25 b(\(single\))j(pre-test)h(statement)300
+4464 y(computes)i(the)e(list)h(of)f(attributes)i(of)e(the)h(new)f(JOIN)
+f(node)i(on)f(the)h(right)g(side.)48 b(The)28 b(test)i(of)f(the)h(T)-8
+b(-)300 4634 y(rule)20 b(consists)h(of)e(a)f(call)i(to)f(the)g(helper)i
+(function)g(\252is)p 1958 4634 28 4 v 34 w(associative\272,)i(which)d
+(returns)g(TRUE)d(or)i(F)-7 b(ALSE)300 4803 y(depending)33
+b(on)e(whether)h(the)e(T)-8 b(-rule)31 b(is)f(applicable.)55
+b(If)30 b(it)g(is)h(not,)h(then)f(the)g(rule)g(is)f(rejected)j(\(e.g.,)
+p 300 4884 1320 4 v 400 4938 a Fu(4)434 4970 y Fy(It)23
+b(may)g(be)g(possible)g(to)g(use)g(data-\257ow)f(analysis)h(to)g
+(partition)g(the)f(assignment)i(statements)f(automatically)-5
+b(,)24 b(but)f(for)300 5061 y(now)-5 b(,)19 b(we)g(let)f(the)h(DBI)g
+(do)g(the)g(partitioning.)1905 5349 y FP(34)p eop
+%%Page: 35 47
+35 46 bop 300 403 3287 4 v 300 2581 4 2178 v 387 478
+a FF(JOIN)p Fv(\()p FF(JOIN)p Fv(\()p Fs(S)772 487 y
+Fu(1)807 478 y Fs(;)12 b(S)882 487 y Fu(2)916 478 y Fv(\))20
+b(:)g Fo(D)1065 487 y Fm(4)1103 478 y Fs(;)12 b(S)1178
+487 y Fu(3)1212 478 y Fv(\))20 b(:)g Fo(D)1361 487 y
+Fm(5)1419 478 y Fv(=)-12 b FB(\))19 b FF(JOIN)p Fv(\()p
+Fs(S)1766 487 y Fu(1)1801 478 y Fs(;)12 b FF(JOIN)p Fv(\()p
+Fs(S)2047 487 y Fu(2)2081 478 y Fs(;)g(S)2156 487 y Fu(3)2190
+478 y Fv(\))20 b(:)g Fo(D)2339 487 y Fm(6)2378 478 y
+Fv(\))g(:)f Fo(D)2526 487 y Fm(7)3395 478 y FF(\(3.2\))387
+557 y FB(ff)603 635 y Fo(D)665 644 y Fm(6)704 635 y Fs(:)p
+FF(attributes)k Fv(=)c FF(union)f Fv(\()p Fo(D)1322 644
+y Fm(2)1361 635 y Fs(:)p FF(attributes)s Fs(;)11 b Fo(D)1721
+644 y Fm(3)1760 635 y Fs(:)p FF(attributes)s Fv(\))17
+b(;)387 714 y FB(gg)387 793 y FF(is)p 435 793 20 4 v
+24 w(associative)k Fv(\()p Fo(D)853 802 y Fm(5)892 793
+y Fs(:)p FF(join)p 1018 793 V 25 w(predicate)s Fs(;)12
+b Fo(D)1376 802 y Fm(2)1415 793 y Fs(:)p FF(attributes)r
+Fv(\))387 872 y FB(ff)603 951 y Fo(D)665 960 y Fm(7)724
+951 y Fv(=)19 b Fo(D)860 960 y Fm(5)916 951 y Fv(;)603
+1030 y Fo(D)665 1039 y Fm(7)704 1030 y Fs(:)p FF(join)p
+830 1030 V 25 w(predicate)k Fv(=)c Fo(D)1250 1039 y Fm(4)1289
+1030 y Fs(:)p FF(join)p 1415 1030 V 25 w(predicate)h
+Fv(;)603 1109 y Fo(D)665 1118 y Fm(6)704 1109 y Fs(:)p
+FF(join)p 830 1109 V 25 w(predicate)j Fv(=)c Fo(D)1250
+1118 y Fm(5)1289 1109 y Fs(:)p FF(join)p 1415 1109 V
+25 w(predicate)h Fv(;)603 1188 y Fo(D)665 1197 y Fm(6)704
+1188 y Fs(:)p FF(record)p 896 1188 V 25 w(width)h Fv(=)f
+Fo(D)1225 1197 y Fm(2)1264 1188 y Fs(:)p FF(record)p
+1456 1188 V 25 w(width)d Fv(+)e Fo(D)1776 1197 y Fm(3)1815
+1188 y Fs(:)p FF(record)p 2007 1188 V 25 w(width)j Fv(;)603
+1266 y Fo(D)665 1275 y Fm(6)704 1266 y Fs(:)p FF(cardinality)23
+b Fv(=)d FF(compute)p 1333 1266 V 26 w(cardinality)g
+Fv(\()p Fo(D)1744 1275 y Fm(2)1784 1266 y Fs(;)11 b Fo(D)1877
+1275 y Fm(3)1916 1266 y Fv(\))17 b(;)387 1345 y FB(gg)1535
+1496 y Fy(\(a\))i(Join)g(associativity)g(T)-7 b(-rule)p
+351 1598 3185 4 v 791 1703 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 791 1703 a FF(JOIN)538 1700
+y Fs(b)568 1709 y Fu(2)623 1700 y Fv(=)19 b Fs(c)728
+1709 y Fu(1)649 1845 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 649 1845 a FF(JOIN)393 1841 y
+Fs(a)430 1850 y Fu(1)485 1841 y Fv(=)g Fs(b)589 1850
+y Fu(1)517 1987 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 517 1987 a FF(RET)800 1987 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 800 1987
+a FF(RET)942 1845 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 942 1845 a FF(RET)536 2124 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 536
+2124 a Fs(R)589 2133 y Fu(1)819 2124 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 819 2124 a Fs(R)872
+2133 y Fu(2)961 1983 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 961 1983 a Fs(R)1014 1992 y Fu(3)580
+2106 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 580 2106 a 580 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 580 2106 a 580 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNodejoinr1r2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 580
+2106 a 580 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 580 2106 a 580 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 580 2106 a 580
+2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 580 2106 a 580 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3
+/TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 580 2106 a 1071 1907 a Fv(=)-12
+b FB(\))1322 1703 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 1322 1703 a FF(JOIN)1491 1700 y Fs(a)1528
+1709 y Fu(1)1582 1700 y Fv(=)20 b Fs(b)1687 1709 y Fu(1)1463
+1845 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr2r3 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 1463 1845 a FF(JOIN)1636 1841 y Fs(b)1666 1850
+y Fu(2)1720 1841 y Fv(=)g Fs(c)1826 1850 y Fu(1)1189
+1845 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 1189 1845 a FF(RET)1331 1987 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 1331 1987 a FF(RET)1614
+1987 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 1614 1987 a FF(RET)1208 1983 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1208 1983 a Fs(R)1261
+1992 y Fu(1)1350 2124 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1350 2124 a Fs(R)1403 2133 y
+Fu(2)1633 2124 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1633 2124 a Fs(R)1686 2133 y Fu(3)1252
+2106 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1252 2106 a 1252 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNodejoinr2r3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1252 2106 a 1252 2106
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1252 2106 a 1252 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3
+/TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1252 2106 a 1252 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1252
+2106 a 1252 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1252 2106 a 1252 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3
+/TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1252 2106
+a 425 2274 a Fy(\(b\))13 b(Example)g(of)g(the)h(associativity)f(rule)g
+(applied)h(to)425 2365 y(an)19 b(operator)h(tree)p 1863
+2556 4 958 v 2364 1703 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2364 1703 a FF(JOIN)2108 1691
+y Fs(a)2145 1700 y Fu(2)2199 1691 y Fv(=)g Fs(c)2305
+1700 y Fu(1)2222 1845 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2222 1845 a FF(JOIN)1966 1841
+y Fs(a)2003 1850 y Fu(1)2058 1841 y Fv(=)f Fs(b)2162
+1850 y Fu(1)2090 1987 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2090 1987 a FF(RET)2373 1987
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2373 1987 a FF(RET)2515 1845 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2515 1845 a FF(RET)2109
+2124 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 2109 2124 a Fs(R)2162 2133 y Fu(1)2392 2124 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+
+2392 2124 a Fs(R)2445 2133 y Fu(2)2534 1983 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 2534 1983
+a Fs(R)2587 1992 y Fu(3)2152 2106 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2152 2106 a 2152
+2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2152 2106 a 2152 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNodejoinr1r2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2152 2106 a 2152 2106
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2152 2106 a 2152 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2152 2106 a 2152 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2152
+2106 a 2152 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3
+/TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2152 2106 a 2644 1907 a Fv(=)-12 b
+FB(\))2684 1910 y Fs(=)2894 1703 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2894 1703 a FF(JOIN)3036
+1845 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr2r3 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 3036 1845 a FF(JOIN)2762 1845 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2762 1845 a FF(RET)2904
+1987 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2904 1987 a FF(RET)3187 1987 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 3187 1987 a FF(RET)2781
+1983 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 2781 1983 a Fs(R)2834 1992 y Fu(1)2922 2124 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+
+2922 2124 a Fs(R)2975 2133 y Fu(2)3206 2124 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 3206 2124
+a Fs(R)3259 2133 y Fu(3)2825 2106 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2825 2106 a 2825
+2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNodejoinr2r3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2825 2106 a 2825 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2825 2106 a 2825 2106
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3
+/TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2825 2106 a 2825 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2825 2106 a 2825 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2825
+2106 a 2825 2106 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3
+/TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2825 2106 a 2019 2274 a Fy(\(c\))20
+b(Example)h(of)f(an)h(operator)g(tree)f(where)h(the)f(as-)2019
+2365 y(sociativity)13 b(rule)g(does)h(not)g(apply)f(because)i(a)e
+(cross-)2019 2457 y(product)20 b(would)f(result)p 3583
+2581 4 2178 v 300 2584 3287 4 v 3585 2601 19 2185 v 317
+2601 3287 19 v 1300 2797 a FP(Figure)24 b(3.5:)31 b(Join)25
+b(associativity)i(T)-8 b(-rule)300 3173 y(because)27
+b(it)d(generates)k(a)c(cross-product\),)30 b(otherwise)c(the)f
+(post-test)i(statements)g(are)e(executed.)38 b(The)300
+3343 y(post-test)26 b(statements)f(compute)g(various)g(other)f
+(annotations)j(of)c(the)h(new)f(nodes)h(that)g(are)g(generated)300
+3512 y(by)d(applying)j(the)d(T)-8 b(-rule.)30 b(Note)21
+b(the)h(use)f(of)h(helper)g(functions)i(\252compute)p
+2681 3512 28 4 v 35 w(cardinality\272)h(and)c(\252union\272)300
+3681 y(to)i(compute)i(descriptor)i(properties.)583 3851
+y(Consider)d(three)g(relations)g FH(R)1540 3865 y Fv(1)1580
+3851 y FP(,)e FH(R)1694 3865 y Fv(2)1755 3851 y FP(and)h
+FH(R)1977 3865 y Fv(3)2016 3851 y FP(,)f(and)g(let)h
+FH(a)2374 3865 y Fs(i)2402 3851 y FP(,)f FH(b)2486 3865
+y Fs(i)2536 3851 y FP(and)h FH(c)2728 3865 y Fs(i)2778
+3851 y FP(be)f(their)h(respective)j(sets)300 4020 y(of)20
+b(attributes.)32 b(Figures)22 b(3.5\(b\))f(and)f(3.5\(c\))h(show)-6
+b(,)21 b(respectively)-6 b(,)24 b(examples)e(of)e(the)h(applicability)j
+(and)300 4189 y(non-applicability)29 b(of)23 b(the)h(join)g
+(associativity)k(T)-8 b(-rule.)1470 b Fw(\003)300 4622
+y FO(3.6)119 b(Implementation)30 b(Rules)294 4885 y FP(Implementation)
+22 b(rules,)e(or)e(I-rules)i(for)f(short,)h(de\256ne)f(equivalences)j
+(between)d(expressions)j(and)d(their)300 5055 y(implementing)29
+b(algorithms.)41 b(Let)25 b FH(E)31 b FP(be)26 b(an)h(expression)i(and)
+e FH(A)e FP(be)i(an)f(algorithm)i(that)f(implements)1905
+5349 y(35)p eop
+%%Page: 36 48
+36 47 bop 312 403 3260 4 v 312 1071 4 669 v 386 478 a
+Fs(E)t Fv(\()p Fs(x)509 487 y Fu(1)543 478 y Fs(;)11
+b(:)g(:)h(:)23 b(;)11 b(x)751 486 y Fn(n)794 478 y Fv(\))20
+b(:)f Fo(D)942 487 y Fm(1)1000 478 y Fv(=)-12 b FB(\))20
+b Fs(A)p Fv(\()p Fs(x)1254 487 y Fu(1)1288 478 y Fs(;)12
+b(:)f(:)g(:)24 b(;)11 b(x)1497 486 y Fn(n)1539 478 y
+Fv(\))20 b(:)f Fo(D)1687 487 y Fm(2)3393 478 y FF(\(3.3\))386
+557 y(test)386 635 y FB(ff)601 714 y FF(pre-opt)g(statements)386
+793 y FB(gg)386 872 y(ff)601 951 y FF(post-opt)g(statements)386
+1030 y FB(gg)p 3568 1071 V 312 1074 3260 4 v 3570 1091
+19 675 v 328 1091 3260 19 v 1166 1287 a FP(Figure)24
+b(3.6:)31 b(General)25 b(form)e(of)h(a)f(Prairie)h(I-rule)300
+1664 y FH(E)5 b FP(.)30 b(The)23 b(general)j(form)d(of)h(an)f(I-rule)i
+(is)e(given)i(by)f(Equation)h(\(3.3\))e(\(shown)i(in)e(Figure)h(3.6\).)
+580 1833 y(The)19 b(actions)j(associated)h(with)d(an)g(I-rule)h(are)g
+(de\256ned)g(in)f(three)h(parts.)30 b(The)20 b(\256rst)g(part,)h(or)f
+FD(test)p FP(,)300 2002 y(is)j(a)g(boolean)j(expression)h(whose)d
+(value)g(determines)i(whether)e(or)g(not)g(the)g(rule)g(can)g(be)f
+(applied.)583 2172 y(The)h(second)i(part,)e(or)g FD(pr)m(e-opt)h
+(statements)p FP(,)h(is)e(a)f(set)h(of)g(descriptor)j(assignment)f
+(statements)300 2341 y(that)g(are)f(executed)j(only)e(if)f(the)g(test)h
+(is)f(true)h(and)f FD(befor)m(e)i FP(any)e(descendant)k(of)c(the)g
+(root)h(of)f FH(E)30 b FP(is)25 b(opti-)300 2511 y(mized.)37
+b(Additional)28 b(parameters)g(of)d(nodes)i(are)f(usually)h(assigned)h
+(in)e(the)g(pre-opt)h(section.)39 b(This)25 b(is)300
+2680 y(necessary)h(before)f(any)f(of)f(the)h(nodes)h(on)f(the)g(right)g
+(side)g(can)g(be)g(optimized.)583 2849 y(The)k(third)g(part,)h(or)f
+FD(post-opt)i(statements)p FP(,)g(is)e(a)f(set)h(of)g(descriptor)i
+(assignment)g(statements)300 3019 y(that)h(are)g(evaluated)i
+FD(after)e FP(all)g(descendants)i FH(x)1827 3033 y Fs(i)1885
+3019 y FP(of)e(the)f(root)h(of)g FH(E)k FP(are)30 b(optimized.)53
+b(Normally)-6 b(,)33 b(the)300 3188 y(post-opt)c(statements)f(compute)g
+(properties)i(that)d(can)g(only)g(be)g(determined)i(once)e(the)g
+(inputs)h(to)f(the)300 3357 y(algorithm)e(are)f(completely)i(optimized)
+f(and)f(their)g(properties)j(known.)302 3626 y(E)t Fx(X)t(A)t(M)t(P)t
+(L)t(E)j FP(9)t(.)169 b(I-rule)31 b(\(3.4\))f(\(shown)h(in)f(Figure)h
+(3.7\))f(selects)i(the)e(Nested)p 2891 3626 28 4 v 34
+w(loops)h(algorithm)h(to)300 3796 y(implement)24 b(the)f(JOIN)g
+(operator)-5 b(.)32 b(The)23 b(test)g(for)h(this)f(rule)h(is)f(TRUE)d
+(since)k(Nested)p 2979 3796 V 34 w(loops)g(can)g(be)f(ap-)300
+3965 y(plied)31 b(regardless)h(of)d(any)h(property)i(values.)50
+b(The)29 b(pre-opt)i(section)g(consists)h(of)d(three)i(assignment)300
+4134 y(statements.)k(The)24 b(\256rst)g(statement)i(sets)f(the)f
+(descriptor)k(of)c(Nested)p 2478 4134 V 34 w(loops)i(to)e(that)h(of)f
+(the)g(JOIN.)g(The)300 4304 y(next)h(two)f(statements)j(express)f(the)f
+(fact)g(that)g(the)g(tuple)g(order)h(of)e(Nested)p 2710
+4304 V 34 w(loops)i(is)e(the)h(same)g(as)f(the)300 4473
+y(tuple)e(order)f(of)g(its)g(left)g(\(outer\))h(input;)h(all)e(other)g
+(properties)j(remain)d(the)g(same.)30 b(The)20 b(third)i(statement)300
+4643 y(in)e(the)g(pre-opt)i(section)g(ensures)g(that)f(this)f
+(requirement)j(is)d(met)g(by)g(setting)i(the)e(tuple)p
+3059 4643 V 34 w(order)i(of)e FH(S)3451 4657 y Fv(1)3509
+4643 y FP(on)300 4812 y(the)f(right)h(side.)787 4779
+y Fv(5)857 4812 y FP(The)e(fourth)j(statement)g(computes)f(the)g(cost)g
+(of)f(using)h(the)f(Nested)p 2979 4812 V 34 w(loops)i(algorithm.)p
+300 4893 1320 4 v 400 4947 a Fu(5)434 4979 y Fy(Actually)-5
+b(,)18 b(it)e(is)h(not)g(enough)i(to)e(simply)h(set)f(the)g(desired)g
+(tuple)h(order)f(of)g Fq(S)2400 4987 y Fu(1)2435 4979
+y Fy(;)g(it)g(is)f(also)i(necessary)g(to)f(ensure)h(that)f
+Fr(after)300 5070 y Fy(optimization,)23 b Fq(S)766 5078
+y Fu(1)823 5070 y Fy(does)g(indeed)g(have)g(the)f(required)h(property)
+-5 b(.)35 b(One)23 b(way)f(to)g(satisfy)g(this)g(is)g(to)g(insert)g(a)g
+(SOR)l(T)f(node)i(in)1905 5349 y FP(36)p eop
+%%Page: 37 49
+37 48 bop 312 403 3260 4 v 312 1308 4 905 v 386 478 a
+FF(JOIN)o Fv(\()p Fs(S)599 487 y Fu(1)634 478 y Fs(;)12
+b(S)709 487 y Fu(2)743 478 y Fv(\))20 b(:)g Fo(D)892
+487 y Fm(3)950 478 y Fv(=)-12 b FB(\))19 b FF(Nested)p
+1270 478 20 4 v 26 w(loops)q Fv(\()p Fs(S)1506 487 y
+Fu(1)1560 478 y Fv(:)g Fo(D)1661 487 y Fm(4)1700 478
+y Fs(;)12 b(S)1775 487 y Fu(2)1809 478 y Fv(\))20 b(:)g
+Fo(D)1958 487 y Fm(5)3393 478 y FF(\(3.4\))386 557 y(TRUE)386
+635 y FB(ff)601 714 y Fo(D)663 723 y Fm(5)722 714 y Fv(=)f
+Fo(D)858 723 y Fm(3)914 714 y Fv(;)601 793 y Fo(D)663
+802 y Fm(4)722 793 y Fv(=)g Fo(D)858 802 y Fm(1)914 793
+y Fv(;)601 872 y Fo(D)663 881 y Fm(4)702 872 y Fs(:)p
+FF(tuple)p 857 872 V 26 w(order)h Fv(=)g Fo(D)1175 881
+y Fm(3)1214 872 y Fs(:)p FF(tuple)p 1369 872 V 25 w(order)e
+Fv(;)601 951 y Fo(D)663 960 y Fm(5)702 951 y Fs(:)p FF(cost)j
+Fv(=)e Fo(D)985 960 y Fm(4)1024 951 y Fs(:)p FF(cardinality)g
+FB(\003)d Fo(D)1456 960 y Fm(2)1495 951 y Fs(:)p FF(cardinality)21
+b Fv(;)386 1030 y FB(gg)386 1109 y(ff)601 1188 y Fo(D)663
+1197 y Fm(5)702 1188 y Fs(:)p FF(tuple)p 857 1188 V 26
+w(order)f Fv(=)g Fo(D)1175 1197 y Fm(4)1214 1188 y Fs(:)p
+FF(tuple)p 1369 1188 V 25 w(order)e Fv(;)386 1266 y FB(gg)p
+3568 1308 4 905 v 312 1311 3260 4 v 3570 1328 19 912
+v 328 1328 3260 19 v 1387 1524 a FP(Figure)24 b(3.7:)31
+b(Nested)24 b(loops)h(I-rule)p 312 1844 3260 4 v 312
+2592 4 748 v 386 1919 a FF(SOR)l(T)o Fv(\()p Fs(S)621
+1928 y Fu(1)656 1919 y Fv(\))20 b(:)g Fo(D)805 1928 y
+Fm(2)863 1919 y Fv(=)-12 b FB(\))19 b FF(Mer)o(ge)p 1171
+1919 20 4 v 25 w(sort)q Fv(\()p Fs(S)1362 1928 y Fu(1)1397
+1919 y Fv(\))h(:)f Fo(D)1545 1928 y Fm(3)3393 1919 y
+FF(\(3.5\))386 1998 y Fv(\()p Fo(D)475 2007 y Fm(2)514
+1998 y Fs(:)p FF(tuple)p 669 1998 V 25 w(order)f Fv(!)8
+b(=)19 b FF(DONT)p 1138 1998 V 23 w(CARE)p Fv(\))386
+2077 y FB(ff)601 2156 y Fo(D)663 2165 y Fm(3)722 2156
+y Fv(=)g Fo(D)858 2165 y Fm(2)914 2156 y Fv(;)601 2235
+y Fo(D)663 2244 y Fm(3)702 2235 y Fs(:)p FF(cost)i Fv(=)e
+Fo(D)985 2244 y Fm(3)1024 2235 y Fs(:)p FF(cardinality)g
+FB(\003)d Fv(log)r(\()p Fo(D)1575 2244 y Fm(3)1614 2235
+y Fs(:)p FF(cardinality)t Fv(\))h(;)386 2313 y FB(gg)386
+2392 y(ff)386 2550 y(gg)p 3568 2592 4 748 v 312 2595
+3260 4 v 3570 2611 19 754 v 328 2611 3260 19 v 1426 2807
+a FP(Figure)24 b(3.8:)31 b(Mer)n(ge)24 b(sort)g(I-rule)583
+3182 y(The)19 b(post-opt)i(section)g(is)e(executed)j(after)d
+FH(S)1996 3196 y Fv(1)2054 3182 y FP(and)h FH(S)2260
+3196 y Fv(2)2317 3182 y FP(are)f(optimized;)k(it)c(consists)i(of)e(a)g
+(single)300 3351 y(statement)g(that)e(assigns)i(the)e(tuple)p
+1408 3351 28 4 v 35 w(order)h(of)f(the)g(Nested)p 2121
+3351 V 34 w(loops)h(node.)30 b(The)16 b(Nested)p 3004
+3351 V 34 w(loops)i(algorithm)300 3520 y(returns)25 b(its)f(stream)g
+(in)f(the)h(same)g(order)g(as)g(its)f(left)h(input.)1370
+b Fw(\003)302 3853 y FP(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30
+b FP(1)t(0)t(.)171 b(Figure)32 b(3.8)f(shows)h(the)g(I-rule)h(that)f
+(implements)h(the)f(SOR)-5 b(T)28 b(operator)34 b(using)300
+4022 y(Mer)n(ge)p 539 4022 V 34 w(sort.)60 b(I-rule)34
+b(\(3.5\))f(rewrites)h(a)f(stream)g(such)h(that)f(it)g(is)g(sorted)h
+(using)g(the)f(Mer)n(ge)p 3306 4022 V 35 w(sort)g(al-)300
+4192 y(gorithm.)49 b(The)29 b(test)g(for)h(this)g(I-rule)g(is)f(that)h
+(the)f(tuple)h(order)h(of)e(the)g(sorted)i(stream)f(must)f(not)g(be)h
+(a)p 300 4271 1320 4 v 300 4357 a Fy(front)20 b(of)g
+Fq(S)594 4365 y Fu(1)649 4357 y Fy(that)g(can)g(meet)g(the)h
+(sortedness)g(requirement)g(of)f Fq(S)2022 4365 y Fu(1)2056
+4357 y Fy(.)28 b(Thus,)21 b(in)f(this)g(case,)g(we)g(would)h(need)g(a)f
+(T)-7 b(-rule)20 b(\(which)300 4448 y(introduces)g(a)f(new)g(operator)h
+(JOPR\),)300 4611 y(JOIN)p Fl(\()p Fq(S)539 4619 y Fu(1)573
+4611 y Fq(;)13 b(S)654 4619 y Fu(2)689 4611 y Fl(\))21
+b(:)h Fk(D)851 4619 y Fm(3)910 4611 y Fl(=)-13 b Fj(\))22
+b Fy(JOPR)o Fl(\()p Fy(SOR)l(T)n Fl(\()p Fq(S)1523 4619
+y Fu(1)1558 4611 y Fl(\))f(:)h Fk(D)1720 4619 y Fm(4)1758
+4611 y Fq(;)13 b Fy(SOR)l(T)o Fl(\()p Fq(S)2056 4619
+y Fu(2)2090 4611 y Fl(\))21 b(:)h Fk(D)2252 4619 y Fm(5)2290
+4611 y Fl(\))f(:)h Fk(D)2452 4619 y Fm(6)2491 4611 y
+Fq(;)300 4774 y Fy(and)e(an)f(I-rule,)300 4937 y(JOPR)o
+Fl(\()p Fq(S)551 4945 y Fu(1)586 4937 y Fq(;)13 b(S)667
+4945 y Fu(2)701 4937 y Fl(\))22 b(:)f Fk(D)863 4945 y
+Fm(3)923 4937 y Fl(=)-13 b Fj(\))21 b Fy(Nested)p 1279
+4937 23 4 v 27 w(loops)q Fl(\()p Fq(S)1541 4945 y Fu(1)1597
+4937 y Fl(:)h Fk(D)1708 4945 y Fm(4)1746 4937 y Fq(;)13
+b(S)1827 4945 y Fu(2)1862 4937 y Fl(\))21 b(:)h Fk(D)2024
+4945 y Fm(5)2062 4937 y Fq(:)300 5100 y Fy(In)d(our)g(discussions,)h
+(this)f(additional)g(level)g(of)g(detail)g(will)f(be)h(ignored)h(for)f
+(the)g(sake)g(of)g(simplicity)-5 b(.)1905 5349 y FP(37)p
+eop
+%%Page: 38 50
+38 49 bop 313 303 3258 4 v 313 1446 4 1144 v 432 403
+a Fs(O)r Fv(\()p Fs(S)558 412 y Fu(1)593 403 y Fv(\))20
+b(:)f Fo(D)741 412 y Fm(2)800 403 y Fv(=)-12 b FB(\))19
+b FF(Null)q Fv(\()p Fs(S)1121 412 y Fu(1)1176 403 y Fv(:)g
+Fo(D)1277 412 y Fm(3)1316 403 y Fv(\))h(:)f Fo(D)1464
+412 y Fm(4)1790 403 y FF(\(3.6\))432 482 y(TRUE)432 561
+y FB(ff)648 640 y Fo(D)710 649 y Fm(4)769 640 y Fv(=)g
+Fo(D)905 649 y Fm(2)961 640 y Fv(;)648 718 y Fo(D)710
+727 y Fm(3)769 718 y Fv(=)g Fo(D)905 727 y Fm(1)961 718
+y Fv(;)648 797 y Fo(D)710 806 y Fm(3)749 797 y Fs(:)p
+FF(property)i Fv(=)f Fo(D)1150 806 y Fm(2)1189 797 y
+Fs(:)p FF(property)e Fv(;)432 876 y FB(gg)432 955 y(ff)648
+1034 y Fo(D)710 1043 y Fm(4)749 1034 y Fs(:)p FF(cost)i
+Fv(=)g Fo(D)1032 1043 y Fm(3)1071 1034 y Fs(:)p FF(cost)d
+Fv(;)432 1113 y FB(gg)645 1325 y Fy(\(a\))h(General)i(form)f(of)f(a)h
+(\252Null\272)g(I-rule)p 1963 1422 4 1094 v 2012 378
+a FF(SOR)l(T)o Fv(\()p Fs(S)2247 387 y Fu(1)2282 378
+y Fv(\))h(:)g Fo(D)2431 387 y Fm(2)2489 378 y Fv(=)-12
+b FB(\))19 b FF(Null)q Fv(\()p Fs(S)2810 387 y Fu(1)2865
+378 y Fv(:)g Fo(D)2966 387 y Fm(3)3005 378 y Fv(\))h(:)f
+Fo(D)3153 387 y Fm(4)3369 378 y FF(\(3.7\))2012 482 y(TRUE)2012
+561 y FB(ff)2227 640 y Fo(D)2289 649 y Fm(4)2348 640
+y Fv(=)g Fo(D)2484 649 y Fm(2)2540 640 y Fv(;)2227 718
+y Fo(D)2289 727 y Fm(3)2348 718 y Fv(=)g Fo(D)2484 727
+y Fm(1)2540 718 y Fv(;)2227 797 y Fo(D)2289 806 y Fm(3)2328
+797 y Fs(:)p FF(tuple)p 2483 797 20 4 v 26 w(order)h
+Fv(=)g Fo(D)2801 806 y Fm(2)2840 797 y Fs(:)p FF(tuple)p
+2995 797 V 25 w(order)e Fv(;)2012 876 y FB(gg)2012 955
+y(ff)2227 1034 y Fo(D)2289 1043 y Fm(4)2328 1034 y Fs(:)p
+FF(cost)j Fv(=)e Fo(D)2611 1043 y Fm(3)2650 1034 y Fs(:)p
+FF(cost)e Fv(;)2012 1113 y FB(gg)2466 1325 y Fy(\(b\))h(Null)h(sort)g
+(I-rule)p 3567 1446 4 1144 v 313 1449 3258 4 v 3569 1466
+19 1150 v 330 1466 3258 19 v 1191 1662 a FP(Figure)24
+b(3.9:)32 b(The)23 b(\252Null\272)h(algorithm)h(concept)300
+2039 y(DONT)p 559 2039 28 4 v 31 w(CARE)h(order)-5 b(.)47
+b(The)29 b(pre-opt)h(section)g(consists)h(of)d(two)h(statements.)47
+b(The)29 b(\256rst)f(copies)i(the)300 2208 y(descriptor)23
+b(from)d(the)h(left)g(side)g(to)f(the)h(expression)i(on)d(the)h(right,)
+h(and)e(the)h(second)h(computes)g(the)f(cost)300 2378
+y(of)i(using)i(Mer)n(ge)p 857 2378 V 35 w(sort.)31 b(The)23
+b(post-opt)j(section)f(is)e(empty)-6 b(.)1362 b Fw(\003)300
+2684 y FN(3.6.1)99 b(The)26 b(Null)e(Algorithm)579 2915
+y FP(Recall)d(that,)f(in)g(Section)h(1,)f(we)f(mentioned)j(that)e
+(Prairie)g(allows)h(users)g(to)e(treat)i(all)f(operators)295
+3084 y(and)f(algorithms)i(as)e(\256rst-class)h(objects,)i(i.e.,)c(all)h
+(operators)j(and)d(algorithms)i(are)e(explicit,)j(in)c(contrast)299
+3254 y(to)k(enforcers)i(in)e(V)-12 b(olcano)24 b(or)e(glue)h(in)f
+(Starburst.)32 b(This)22 b(requires)i(that)f(Prairie)g(provide)h(a)d
+(mechanism)300 3423 y(where)k(users)h(can)f(also)g(\252delete\272)i
+(one)e(or)f(more)h(of)g(the)g(explicit)h(operators)h(from)e
+(expressions.)37 b(This)300 3592 y(is)29 b(done)h(by)f(having)i(a)d
+(special)j(class)f(of)f(I-rules)h(that)g(have)g(the)f(form)g(given)h
+(by)f(Equation)i(\(3.6\))e(in)300 3762 y(Figure)24 b(3.9\(a\).)31
+b(The)23 b(left)h(side)g(of)f(the)h(rule)g(is)f(a)g(single)h(abstract)i
+(operator)f FH(O)g FP(with)f(one)f(stream)h(input)300
+3931 y FH(S)356 3945 y Fv(1)395 3931 y FP(.)36 b(The)25
+b(right)h(side)g(of)g(the)f(rule)h(is)g(an)f(algorithm)i(called)g
+(\252Null\272)f(with)f(the)h(same)f(stream)h(input)h(but)299
+4100 y(with)22 b(a)f(dif)n(ferent)k(descriptor)-5 b(.)33
+b(As)22 b(the)g(name)h(suggests,)h(the)f(Null)f(algorithm)i(is)e
+(supposed)i(to)f(pass)g(its)295 4270 y(input)c(unchanged)j(to)d
+(algorithms)h(above)g(it)f(in)f(an)h(operator)i(tree.)29
+b(This)19 b(is)f(accomplished)k(in)d(the)f(I-rule)300
+4439 y(as)23 b(follows.)581 4609 y(The)e(test)h(for)f(this)h(I-rule)h
+(is)e(TRUE,)e(i.e.,)i(any)h(node)g(in)f(an)h(operator)h(tree)f(with)f
+FH(O)j FP(as)d(its)g(oper)n(-)298 4778 y(ator)h(can)f(be)h(implemented)
+h(by)f(the)f(Null)g(algorithm.)32 b(The)21 b(actions)i(associated)i
+(with)c(this)h(rule)g(have)g(a)298 4947 y(speci\256c)i(pattern.)32
+b(The)21 b(pre-opt)j(section)g(consists)g(of)e(three)i(statements.)32
+b(The)22 b(\256rst)f(statement)j(copies)1905 5349 y(38)p
+eop
+%%Page: 39 51
+39 50 bop 300 391 a FP(the)29 b(descriptor)j(of)c(the)h(operator)i
+FH(O)g FP(to)e(the)g(algorithm)i(Null.)46 b(The)29 b(second)h
+(statement)g(sets)g(the)f(de-)299 561 y(scriptor)c(of)e(the)g(stream)g
+FH(S)1150 575 y Fv(1)1211 561 y FP(on)g(the)g(right)h(side)f(to)g(the)g
+(descriptor)i(of)e(the)g(stream)g FH(S)2981 575 y Fv(1)3043
+561 y FP(on)f(the)i(left)f(side.)300 730 y(Why)k(is)h(it)f(necessary)j
+(to)e(do)f(this?)45 b(The)27 b(key)h(lies)g(in)f(the)h(third)h
+(statement.)44 b(This)28 b(statement)h(copies)297 899
+y(the)22 b(property)h(\252property\272)h(of)d(the)h(operator)h
+FH(O)g FP(node)f(on)f(the)h(left)f(side)h(to)f(the)g(\252property\272)j
+(of)d(the)h(input)299 1069 y(stream)h FH(S)619 1083 y
+Fv(1)680 1069 y FP(on)f(the)h(right)h(side.)31 b(Since)23
+b(left-hand)h(side)g(descriptors)h(cannot)f(be)f(changed)h(in)f(an)f
+(I-rule,)300 1238 y(a)h(new)g(descriptor)k Fp(D)1004
+1252 y Fo(3)1071 1238 y FP(is)d(necessary)i(for)d FH(S)1715
+1252 y Fv(1)1777 1238 y FP(to)h(convey)h(the)f(property)i(propagation)h
+(information.)583 1408 y(The)d(post-opt)i(section)f(in)f(the)f(I-rule)i
+(has)f(only)h(a)e(cost-assignment)28 b(statement;)d(this)f(simply)300
+1577 y(sets)g(the)g(cost)g(of)g(the)g(Null)f(node)i(to)f(the)f(cost)i
+(of)e(its)h(optimized)i(input)e(stream.)32 b(The)23 b(Null)h
+(algorithm,)300 1746 y(therefore,)i(serves)e(to)g(ef)n(fectively)j
+(transform)e(a)e(single)i(operator)h(to)d(a)g(no-op.)302
+2015 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(1)q(1)t(.)159
+b(Equation)22 b(\(3.7\))f(\(in)f(Figure)h(3.9\(b\)\))g(shows)g(the)f
+(I-rule)i(that)e(rewrites)i(the)e(SOR)-5 b(T)300 2185
+y(operator)20 b(to)f(use)f(a)g(Null)g(algorithm.)31 b(The)18
+b(third)h(pre-opt)h(statement)g(sets)f(the)g(tuple)g(order)h(of)e
+FH(S)3324 2199 y Fv(1)3380 2185 y FP(on)h(the)300 2354
+y(right)26 b(side)f(to)g(be)g(the)g(tuple)h(order)g(of)f(the)g(SOR)-5
+b(T)22 b(node,)k(thus)g(ensuring)h(that)e(when)g FH(S)3088
+2368 y Fv(1)3152 2354 y FP(is)f(optimized)300 2523 y(on)g(the)f(right)i
+(side,)f(it)f(will)g(have)i(the)e(same)h(tuple)h(order)f(as)g(the)f
+(SOR)-5 b(T)21 b(node.)721 b Fw(\003)300 2890 y FO(3.7)119
+b(Advantages)30 b(of)f(Prairie)299 3153 y FP(In)23 b(the)h(previous)h
+(chapter)l(,)g(we)d(described)k(V)-12 b(olcano')-5 b(s)25
+b(rule)f(speci\256cation)i(language)f(and)e(some)h(of)f(its)300
+3322 y(problems.)32 b(Prairie)24 b(addresses)j(these)d(problems:)436
+3567 y FC(\017)46 b FP(Prairie)19 b(does)f(not)h(contain)g(any)g
+(implicit)g(operators,)i(algorithms,)g(or)d(rules)g(\(as)h(in)e(V)-12
+b(olcano;)22 b(see)527 3736 y(Section)g(2.8.1\).)30 b(This)20
+b(implies)h(that)g(extending)i(a)d(Prairie)h(speci\256cation)i(is)d
+(simple,)h(and)g(prop-)527 3905 y(erty)j(transformations)j(are)c(also)h
+(simpli\256ed)f(since)i(an)e(abstraction)j(\(e.g.,)c(algorithm\))j
+(directly)527 4075 y(corresponds)j(to)d(a)f(concept,)i(instead)g(of)e
+(an)h(implementation-level)k(detail)d(\(e.g.,)e(enforcer)i(in)527
+4244 y(V)-12 b(olcano\).)436 4488 y FC(\017)46 b FP(Since)21
+b(properties)j(are)d(represented)j(using)f(single)f(descriptors,)i(it)d
+(is)g(trivial)h(to)f(add)g(new)g(prop-)527 4657 y(erties,)k(or)e
+(change)i(existing)h(ones.)436 4902 y FC(\017)46 b FP(Property)20
+b(transformations)i(are)c(vastly)i(simpli\256ed,)g(since,)g(instead)g
+(of)e(a)g(multitude)i(of)e(support)527 5071 y(functions)26
+b(\(as)d(required)i(by)f(V)-12 b(olcano,)24 b(T)-6 b(able)23
+b(2.3\),)g(property)i(transformations)i(in)c(Prairie)h(are)1905
+5349 y(39)p eop
+%%Page: 40 52
+40 51 bop 527 391 a FP(accomplished)29 b(on)e(a)e(per)n(-rule)j(basis.)
+40 b(This)25 b(is)h(seen)h(clearly)h(from)e(the)g(forms)g(of)g(the)g
+(general)527 561 y(rules)21 b(for)f(V)-12 b(olcano)22
+b(\(Figure)f(2.8\))f(and)g(Prairie)h(\(Figure)f(3.3\).)30
+b(The)20 b(only)h(support)g(function)i(that)527 730 y(Prairie)c
+(requires)h(is)e(init)p 1300 730 28 4 v 34 w(descriptor)j(for)d(each)h
+(operator)-5 b(.)31 b(Adding)19 b(algorithms)h(in)e(Prairie)h(don')n(t)
+527 899 y(require)25 b(the)f(DBI)f(to)g(de\256ne)h(additional)i
+(support)g(functions)g(as)d(in)h(V)-12 b(olcano.)300
+1266 y FO(3.8)119 b(Summary)300 1529 y FP(In)29 b(this)g(chapter)l(,)j
+(we)d(presented)i(the)e(rule)h(speci\256cation)h(language)h(of)d
+(Prairie.)47 b(Prairie)30 b(strives)g(for)300 1699 y(high-level)k
+(abstractions)g(that)d(insulate)i(a)e(DBI)e(from)i
+(implementation-level)36 b(details)c(of)f(the)g(opti-)300
+1868 y(mizer)-5 b(.)54 b(\(Not)31 b(all)g(details)i(of)e(the)g
+(underlying)j(implementation)g(can)e(be)f(hidden)h(from)f(a)g(DBI.)f
+(For)300 2037 y(example,)g(the)e(top-down)i(strategy)g(is)e(evident)i
+(in)e(the)g(general)i(form)e(of)g(a)f(Prairie)i(I-rule)g(\(see)f(Fig-)
+300 2207 y(ure)e(3.6\).)39 b(However)l(,)27 b(other)g(details)h(such)f
+(as)f(enforcers)j(are)d(hidden.\))40 b(The)26 b(resulting)i
+(environment)300 2376 y(is)23 b(streamlined,)j(robust,)f(and)f(easily)h
+(extensible)h(\(as)e(described)i(in)d(Section)i(3.7\).)581
+2545 y(High-level)e(abstractions)i(like)d(those)g(that)g(Prairie)g
+(provides)i(can)d(lead)h(to)g(inef)n(\256cient)h(imple-)298
+2715 y(mentations)g(of)f(optimizers)h(if)e(one)h(is)g(not)f(careful)j
+(in)d(compiling)i(Prairie)f(rules.)31 b(In)22 b(the)f(next)i(chapter)l
+(,)296 2884 y(we)d(describe)i(the)f(P2V)e(preprocessor)24
+b(that)c(automatically)k(generates)e(a)e(V)-12 b(olcano)22
+b(speci\256cation)h(from)300 3053 y(a)29 b(Prairie)g(speci\256cation.)
+50 b(In)29 b(this)h(way)-6 b(,)30 b(the)f(advantages)j(of)d(Prairie)h
+(are)f(preserved)j(while)d(making)300 3223 y(use)d(of)f(V)-12
+b(olcano')-5 b(s)28 b(ability)f(to)e(generate)j(ef)n(\256cient)f
+(optimizers.)38 b(Since)26 b(Prairie)g(provides)h(only)g(a)e(rule)300
+3392 y(speci\256cation)h(environment,)g(this)e(also)g(means)g(that)g
+(we)f(can)h(utilize)h(V)-12 b(olcano')-5 b(s)25 b(rule)f(engine)h(for)f
+(the)300 3562 y(search)h(strategy)g(of)f(a)f(Prairie)h(optimizer)-5
+b(.)1905 5349 y(40)p eop
+%%Page: 41 53
+41 52 bop 2859 1118 a FG(Chapter)44 b(4)368 1657 y FM(The)51
+b(Prairie-to-V)-19 b(olcano)53 b(Pr)l(epr)l(ocessor)300
+2159 y FP(In)23 b(the)h(previous)h(chapter)l(,)g(we)e(described)j(the)d
+(rule)h(speci\256cation)i(language)g(of)d(Prairie)h(and)g(showed)300
+2328 y(how)h(it)h(overcame)h(some)e(of)h(V)-12 b(olcano')-5
+b(s)27 b(drawbacks)h(concerning)h(high-level)f(abstractions)h(and)d
+(ex-)298 2498 y(tensibility)-6 b(.)33 b(W)-7 b(e)20 b(also)i(mentioned)
+i(that)e(a)f(Prairie)h(speci\256cation)i(could)f(be)e(translated)j
+(into)e(a)f(V)-12 b(olcano)294 2667 y(speci\256cation)22
+b(to)c(make)h(use)g(of)f(V)-12 b(olcano')-5 b(s)21 b(advantages,)h(and)
+d(to)g(make)f(it)h(compatible)h(with)f(V)-12 b(olcano')-5
+b(s)293 2836 y(rule)18 b(engine.)30 b(This)17 b(chapter)i(describes)h
+(the)e(Prairie-to-V)-12 b(olcano)21 b(\(or)c(P2V\))g(preprocessor)k
+(that)c(accom-)300 3006 y(plishes)25 b(this)f(translation.)300
+3372 y FO(4.1)119 b(Overview)300 3635 y FP(There)24 b(are)f(four)i
+(main)e(responsibilities)28 b(of)c(the)g(P2V)e(preprocessor:)436
+3880 y FC(\017)46 b FP(Establishing)34 b(the)d(correspondence)36
+b(between)31 b(the)h(various)g(concepts)h(of)e(Prairie)h(to)e(similar)
+527 4049 y(ones)h(in)g(V)-12 b(olcano.)53 b(Speci\256cally)-6
+b(,)33 b(this)e(means)g(that)g(the)f(P2V)g(preprocessor)k(must)c
+(translate)527 4218 y(stored)c(\256les,)e(streams,)h(operators,)h
+(algorithms,)g(operator)h(trees,)e(access)g(plans,)h(and)e(descrip-)527
+4388 y(tors)g(into)h(V)-12 b(olcano)25 b(format.)436
+4632 y FC(\017)46 b FP(T)m(ranslating)32 b(T)-8 b(-rules)29
+b(into)h(V)-12 b(olcano)31 b(transformation)i(rules.)49
+b(This)29 b(includes)j(translating)g(the)527 4801 y(actions)26
+b(\(tests)f(and)g(property)i(transformations\).)36 b(Note)24
+b(that)h(because)h(descriptors)i(are)c(trans-)527 4970
+y(lated)17 b(into)g(corresponding)j(V)-12 b(olcano)18
+b(structures,)h(Prairie)e(rule)g(actions)g(that)g(reference)h(descrip-)
+1905 5349 y(41)p eop
+%%Page: 42 54
+42 53 bop 527 391 a FP(tor)25 b(properties)i(must)e(also)g(be)f
+(translated)j(into)e(V)-12 b(olcano)26 b(rule)f(actions)h(that)f
+(reference)i(the)e(ap-)527 561 y(propriate)h(V)-12 b(olcano)25
+b(structures.)436 805 y FC(\017)46 b FP(T)m(ranslating)26
+b(I-rules)f(into)f(V)-12 b(olcano)25 b(implementation)h(rules.)32
+b(As)23 b(above,)h(this)g(includes)i(trans-)527 974 y(lating)e(an)e
+(I-rule')-5 b(s)23 b(actions)h(into)f(V)-12 b(olcano)23
+b(format.)31 b(As)21 b(we)g(will)h(see)g(in)g(this)h(chapter)l(,)h
+(translat-)527 1144 y(ing)j(an)f(I-rule')-5 b(s)29 b(actions)f(is)e
+(complicated)j(by)d(the)h(fact)g(that)g(V)-12 b(olcano)28
+b(accomplishes)h(most)d(of)527 1313 y(its)e(implementation)i(rule)e
+(actions)i(via)e(DBI-de\256ned)g(support)h(functions.)436
+1557 y FC(\017)46 b FP(Generating)28 b(a)d(compact)i(V)-12
+b(olcano)27 b(rule)f(set)g(from)g(a)f(Prairie)h(speci\256cation.)40
+b(This)26 b(means)g(that)527 1726 y(the)g(P2V)f(preprocessor)k
+(attempts)e(to)e(remove)i(unused)g(rules,)g(and)f(to)f(consolidate)k
+(rules)e(that)527 1896 y(generate)g(a)e(transitive)i(closure)f(of)f
+(operator)i(tree)e(transformations.)39 b(This)25 b(step)g(is)g(not)g
+(neces-)527 2065 y(sary)k(for)g(the)f(correct)i(generation)h(of)d(V)-12
+b(olcano)30 b(speci\256cations;)k(it)28 b(is,)h(however)l(,)i(a)d
+(means)g(of)527 2234 y(generating)f(smaller)d(rule)g(sets,)g(and)g
+(consequently)-6 b(,)27 b(faster)e(optimizers.)583 2478
+y(The)g(following)h(sections)g(describe)h(each)e(of)g(these)g(steps)h
+(in)e(greater)i(detail.)35 b(The)24 b(P2V)g(pre-)300
+2648 y(processor)k(is)e(about)h(6000)g(lines)g(of)f Fi(flex)d
+FP(and)k Fi(bison)c FP(code,)k(and)f(took)h(about)g(3)f(man-months)h
+(to)300 2817 y(implement.)300 3184 y FO(4.2)119 b(Corr)n(espondence)31
+b(of)f(Elements)f(in)i(Prairie)f(and)h(V)-11 b(olcano)300
+3452 y FN(4.2.1)99 b(Operators,)25 b(Algorithms,)f(and)i(Enfor)n(cers)
+297 3682 y FP(Operators)c(and)f(algorithms)i(in)d(Prairie)i(correspond)
+h(directly)g(to)e(operators)i(and)e(algorithms,)i(respec-)300
+3852 y(tively)-6 b(,)28 b(in)f(V)-12 b(olcano.)41 b(That)27
+b(is,)f(an)h(operator)i(in)d(Prairie)h(represents)i(the)e(same)g
+(operator)i(in)d(V)-12 b(olcano.)300 4021 y(Similarly)27
+b(for)g(algorithms.)43 b(The)26 b(dif)n(\256culty)j(arises)e(when)g
+(some)g(algorithms)i(in)d(Prairie)i(are)f(identi-)296
+4191 y(\256ed)19 b(by)g(the)h(P2V)e(preprocessor)23 b(as)d(implicit)g
+(\(as)g(de\256ned)g(in)g(Section)g(2.8.1\).)30 b(These)19
+b(algorithms)j(then)300 4360 y(correspond)27 b(to)c(enforcers)j(in)d(V)
+-12 b(olcano.)33 b(This)23 b(process)i(is)f(described)i(in)d(greater)i
+(detail)g(below)-6 b(.)583 4529 y(In)25 b(Chapter)h(2,)e(we)g
+(mentioned)i(that)g(enforcers)h(in)d(V)-12 b(olcano)26
+b(are)f(really)h(algorithms,)h(except)294 4699 y(that)19
+b(they)g(do)f(not)h(implement)g(any)g(particular)h(operator)-5
+b(.)31 b(This)18 b(means)h(that)g(enforcers)h(can)f(be)f(inserted)300
+4868 y(anywhere)25 b(in)f(an)f(expression,)j(depending)h(on)c(needed)j
+(physical)f(properties.)579 5037 y(Now)19 b(consider)i(operators)h(in)e
+(Prairie.)30 b(Some)19 b(operators)j(have)e(the)g(\252Null\272)g
+(algorithm)i(as)d(one)1905 5349 y(42)p eop
+%%Page: 43 55
+43 54 bop 323 403 3237 4 v 323 972 4 569 v 374 532 a
+Fs(O)r Fv(\()p Fs(S)500 541 y Fu(1)535 532 y Fv(\))20
+b(:)f Fo(D)683 541 y Fm(2)805 532 y Fv(=)-12 b FB(\))83
+b Fs(A)1055 541 y Fu(1)1089 532 y Fv(\()p Fs(S)1159 541
+y Fu(1)1194 532 y Fv(\))20 b(:)f Fo(D)1342 541 y Fm(3)821
+635 y FB(\001)11 b(\001)g(\001)374 739 y Fs(O)r Fv(\()p
+Fs(S)500 748 y Fu(1)535 739 y Fv(\))20 b(:)f Fo(D)683
+748 y Fm(2)805 739 y Fv(=)-12 b FB(\))83 b Fs(A)1055
+747 y Fn(n)1097 739 y Fv(\()p Fs(S)1167 748 y Fu(1)1202
+739 y Fv(\))20 b(:)f Fo(D)1350 748 y Fm(3)374 843 y Fs(O)r
+Fv(\()p Fs(S)500 852 y Fu(1)535 843 y Fv(\))h(:)f Fo(D)683
+852 y Fm(2)805 843 y Fv(=)-12 b FB(\))83 b FF(Null)q
+Fv(\()p Fs(S)1190 852 y Fu(1)1244 843 y Fv(:)19 b Fo(D)1345
+852 y Fm(3)1384 843 y Fv(\))h(:)g Fo(D)1533 852 y Fm(4)p
+3557 972 V 323 975 3237 4 v 3558 992 19 576 v 340 992
+3237 19 v 795 1188 a FP(Figure)k(4.1:)31 b(Identifying)c(implicit)d
+(operators,)i(algorithms,)f(and)f(rules)294 1564 y(of)19
+b(their)g(implementations)j(\(see)d(Section)g(3.6.1\).)29
+b(Whenever)20 b(Null)f(is)f(used)h(as)g(an)f(implementation,)k(it)293
+1734 y(has)c(the)g(same)f(ef)n(fect)i(as)f(if)f(the)h(algorithm)h(were)
+e(not)h(present)h(in)f(the)g(operator)h(tree)f(at)f(all.)29
+b(On)17 b(the)h(other)299 1903 y(hand,)23 b(when)g(a)f(non-Null)h
+(algorithm)i(is)d(used)h(as)f(an)h(implementation,)i(an)d
+(\252actual\272)j(algorithm)f(is)e(in-)297 2072 y(troduced)h(in)e(the)g
+(operator)h(tree.)31 b(Also,)21 b(whenever)h(a)e(Null)h(algorithm)h(is)
+f(used)h(in)e(Prairie,)i(it)e(serves)i(to)297 2242 y(push)f(its)g
+(needed)h(properties)h(down)e(to)f(its)h(inputs.)31 b(In)21
+b(other)g(words,)g(it)g(tries)g(to)f FD(enfor)m(ce)i
+FP(certain)g(prop-)298 2411 y(erties)h(on)f(its)g(inputs.)32
+b(Thus,)21 b(Null)h(algorithms)i(in)e(Prairie)g(are)g(indications)j(of)
+d(enforcers)i(in)e(V)-12 b(olcano.)299 2580 y(Stated)22
+b(dif)n(ferently)-6 b(,)26 b(a)c(choice)i(of)e(the)h(Null)f(algorithm)i
+(in)e(Prairie)h(implies)g(that)g(no)g(enforcer)h(is)e(intro-)298
+2750 y(duced)g(\(in)g(an)g(operator)h(tree\))f(in)g(V)-12
+b(olcano,)23 b(whereas)f(a)f(choice)i(of)e(a)g(non-Null)i(algorithm)h
+(introduces)300 2919 y(an)g(enforcer)-5 b(.)583 3088
+y(More)27 b(formally)-6 b(,)28 b(consider)g(the)f(sequence)h(of)e
+(Prairie)h(I-rules)h(shown)f(in)f(Figure)h(4.1.)38 b(Each)300
+3258 y(I-rule)c(speci\256es)g(an)e(implementation)k(of)d(the)g
+(abstract)h(operator)h FH(O)s FP(,)f(in)e(terms)h(of)g(algorithms)h
+FH(A)3560 3272 y Fv(1)300 3427 y FP(through)26 b FH(A)674
+3441 y Fs(n)721 3427 y FP(,)d(and)i(the)f(Null)g(algorithm.)35
+b(The)23 b(Null)h(algorithm)i(acts)f(as)f(a)g(conduit)i(to)e(push)h
+(all)f(prop-)298 3597 y(erties)e(of)f(the)h(operator)h
+FH(O)g FP(down)f(to)f(its)g(input)i FH(S)1842 3611 y
+Fv(1)1881 3597 y FP(.)29 b(The)21 b(P2V)f(preprocessor)25
+b(marks)d(operator)h FH(O)g FP(as)f(an)299 3766 y(implicit)h(operator)l
+(,)i(algorithms)f FH(A)1425 3780 y Fv(1)1486 3766 y FP(through)g
+FH(A)1858 3780 y Fs(n)1927 3766 y FP(as)e(implicit)i(algorithms,)g(and)
+f(all)f(the)g(rules)i(in)e(Fig-)297 3935 y(ure)f(4.1)f(as)g(implicit)i
+(rules.)31 b(For)20 b(brevity)-6 b(,)22 b(in)f(this)g(chapter)l(,)i(we)
+d(will)g(call)h(the)g(operator)h FH(O)h FP(in)d(Prairie)h(an)297
+4105 y FD(enfor)m(cer)n(-operator)p FP(,)26 b(and)21
+b(algorithms)i FH(A)1619 4119 y Fv(1)1678 4105 y FP(through)g
+FH(A)2049 4119 y Fs(n)2096 4105 y FP(,)d FD(enfor)m(cer)n(-algorithms)p
+FP(.)35 b(Enforcer)n(-operators)300 4274 y(are)23 b(discarded)j(when)d
+(translating)k(to)c(V)-12 b(olcano,)24 b(enforcer)n(-algorithms)29
+b(in)23 b(Prairie)h(correspond)i(to)d(en-)300 4443 y(forcers)31
+b(in)f(V)-12 b(olcano,)32 b(and)e(all)g(implicit)h(rules)g(are)f
+(discarded)i(when)e(translating)i(to)e(V)-12 b(olcano.)51
+b(\(W)-7 b(e)300 4613 y(will)23 b(discuss)i(later)f(how)f(to)h
+(translate)h(the)f(actions)h(associated)h(with)d(implicit)i(I-rules.\))
+32 b(The)23 b(Null)g(al-)299 4782 y(gorithm)g(does)g(not)f(appear)i(in)
+e(a)g(V)-12 b(olcano)23 b(speci\256cation)i(at)d(all.)31
+b(Expressions)25 b(in)d(Prairie)g(which)h(con-)300 4951
+y(tain)j(enforcer)n(-operators)32 b(must)25 b(be)h(modi\256ed)g(so)g
+(that)g(they)g(are)g(legal)h(expressions)i(in)d(V)-12
+b(olcano;)28 b(we)1905 5349 y(43)p eop
+%%Page: 44 56
+44 55 bop 300 391 a FP(will)23 b(show)h(how)f(this)h(is)g(done)g(later)
+-5 b(.)302 637 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(1)t(2)t(.)158
+b(Consider)20 b(I-rules)g(3.5)e(and)h(3.7)g(from)f(Figures)h(3.8)g(and)
+g(3.9\(b\))g(\(repeated)i(below)-6 b(,)300 807 y(without)25
+b(the)e(associated)k(tests)d(or)g(actions\):)300 1013
+y(SOR)-5 b(T)n FA(\()p FH(S)618 1027 y Fv(1)657 1013
+y FA(\))26 b(:)g Fp(D)849 1027 y Fo(2)977 1013 y FA(=)-15
+b FC(\))82 b FP(Mer)n(ge)p 1445 1013 28 4 v 34 w(sort)r
+FA(\()p FH(S)1702 1027 y Fv(1)1741 1013 y FA(\))26 b(:)f
+Fp(D)1932 1027 y Fo(3)300 1207 y FP(SOR)-5 b(T)n FA(\()p
+FH(S)618 1221 y Fv(1)657 1207 y FA(\))26 b(:)g Fp(D)849
+1221 y Fo(2)977 1207 y FA(=)-15 b FC(\))82 b FP(Null)q
+FA(\()p FH(S)1459 1221 y Fv(1)1523 1207 y FA(:)26 b Fp(D)1654
+1221 y Fo(3)1699 1207 y FA(\))g(:)f Fp(D)1890 1221 y
+Fo(4)300 1413 y FP(These)30 b(two)f(I-rules)j(together)f(describe)h
+(Mer)n(ge)p 1875 1413 V 35 w(sort)e(to)g(be)f(an)h(enforcer)n
+(-algorithm)35 b(in)30 b(Prairie)g(\(an)300 1582 y(enforcer)c(in)d(V)
+-12 b(olcano\),)25 b(and)f(SOR)-5 b(T)21 b(as)i(an)h(enforcer)n
+(-operator)-5 b(.)1181 b Fw(\003)300 1882 y FN(4.2.2)99
+b(Operator)25 b(T)-7 b(r)n(ees)26 b(and)f(Access)g(Plans)300
+2112 y FP(Operator)32 b(trees)g(in)e(Prairie)i(are)f(expressed)i(in)e
+(a)f(functional)k(notation,)g(and)d(those)h(in)f(V)-12
+b(olcano)32 b(are)298 2281 y(expressed)24 b(in)e(a)f(LISP)f(pre\256x)i
+(notation.)33 b(Apart)21 b(from)h(this)g(syntactic)j(dif)n(ference,)f
+(operator)g(trees)f(and)300 2451 y(access)i(plans)g(in)e(the)h(two)f
+(speci\256cations)k(bear)d(a)f(one-to-one)j(correspondence.)302
+2697 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)k FP(1)t(3)t(.)163
+b(The)23 b(expression,)1144 2903 y(JOIN)p FA(\()p FP(RET)o
+FA(\()p FH(R)1652 2917 y Fv(1)1692 2903 y FA(\))i(:)h
+Fp(D)1883 2917 y Fo(3)1928 2903 y FH(;)15 b FP(RET)o
+FA(\()p FH(R)2244 2917 y Fv(2)2284 2903 y FA(\))25 b(:)h
+Fp(D)2475 2917 y Fo(4)2520 2903 y FA(\))g(:)f Fp(D)2711
+2917 y Fo(5)300 3109 y FP(in)d(Prairie,)g(which)h(denotes)h(the)e(RET)m
+(rieval)f(of)h(relations)i FH(R)2249 3123 y Fv(1)2310
+3109 y FP(and)e FH(R)2531 3123 y Fv(2)2571 3109 y FP(,)f(and)h(their)h
+(subsequent)i(JOIN,)300 3278 y(is)e(represented)k(in)d(V)-12
+b(olcano)25 b(as)948 3484 y(\(JOIN)e(?op)p 1333 3484
+V 34 w(ar)n(g5)h(\(\(RET)e(?op)p 1934 3484 V 34 w(ar)n(g3)j(\(\)\))f
+(\(RET)d(?op)p 2619 3484 V 34 w(ar)n(g4)k(\(\)\)\))300
+3690 y(The)j(descriptors)k Fp(D)976 3704 y Fo(3)1021
+3690 y FP(,)c Fp(D)1152 3704 y Fo(4)1197 3690 y FP(,)h(and)g
+Fp(D)1488 3704 y Fo(5)1561 3690 y FP(map)f(to)g(the)h(operator)i(ar)n
+(guments)g(?op)p 2853 3690 V 34 w(ar)n(g3,)f(?op)p 3228
+3690 V 34 w(ar)n(g4,)h(and)300 3859 y(?op)p 435 3859
+V 34 w(ar)n(g5,)24 b(respectively)-6 b(.)35 b(In)23 b(addition,)i
+(since)g(V)-12 b(olcano)25 b(expressions)i(represent)e(only)g(stream)f
+(inputs)300 4029 y(explicitly)-6 b(,)35 b(the)c(relation)i(names)e
+FH(R)1472 4043 y Fv(1)1542 4029 y FP(and)g FH(R)1772
+4043 y Fv(2)1841 4029 y FP(are)g(also)h(incorporated)i(in)d(the)g
+(operator)i(ar)n(guments)300 4198 y(?op)p 435 4198 V
+34 w(ar)n(g3)d(and)f(?op)p 946 4198 V 34 w(ar)n(g4,)i(respectively)-6
+b(.)51 b(A)28 b(more)g(precise)j(correspondence)i(between)d(Prairie)g
+(de-)300 4368 y(scriptors)c(and)e(V)-12 b(olcano)25 b(properties)h(is)d
+(described)k(in)c(the)h(next)g(section.)895 b Fw(\003)579
+4592 y FP(Access)21 b(plans)g(in)e(Prairie)i(correspond)i(to)c
+(physical)j(expressions)h(in)d(V)-12 b(olcano;)23 b(they)d(have)h(the)
+294 4761 y(same)d(correspondence)23 b(as)18 b(do)h(operator)h(trees)f
+(in)f(Prairie)h(and)g(V)-12 b(olcano;)22 b(plans)d(are)f(transformed)j
+(from)300 4931 y(a)k(functional)i(notation)h(to)c(a)h(LISP)e(pre\256x)i
+(notation)i(with)e(descriptors)j(transformed)g(into)d(algorithm)300
+5100 y(ar)n(guments.)1905 5349 y(44)p eop
+%%Page: 45 57
+45 56 bop 357 403 3171 4 v 357 3042 4 2640 v 405 1539
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.2 true 3.8 neg 5.44249
+neg 109.0751 133.68254 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial -1016 x FH(E)5
+b FP(:)31 b(Expression)405 692 y FH(D)s FP(:)g(Descriptor)405
+862 y FH(P)463 876 y Fv(1)503 862 y FP(:)g(Operator)24
+b(Ar)n(gument)405 1031 y FH(P)463 1045 y Fv(2)503 1031
+y FP(:)31 b(Logical)24 b(Property)405 1201 y FH(P)463
+1215 y Fv(3)503 1201 y FP(:)31 b(System)23 b(Property)405
+1370 y FH(P)463 1384 y Fv(4)503 1370 y FP(:)31 b(Physical)24
+b(Property)405 1539 y FH(P)463 1553 y Fv(5)503 1539 y
+FP(:)31 b(Cost)1859 794 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -68.28656 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -52.92218 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -37.55754 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -22.19318 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 0.0 0.0 Ellipse closepath
+gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 1724 825 a FH(E)1952 819 y(P)2010
+833 y Fv(1)1952 1003 y FH(P)2010 1017 y Fv(2)1952 1130
+y FH(P)2010 1144 y Fv(3)1952 1258 y FH(P)2010 1272 y
+Fv(4)1952 1386 y FH(P)2010 1400 y Fv(5)1424 1637 y Fy(\(a\))13
+b(General)h(form)g(of)g(a)g(V)-10 b(olcano)1424 1728
+y(expression)2885 794 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 8.53581 -25.60745 Ellipse
+closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 25.60745 -25.60745 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 2820 1038 a FH(E)172
+b(D)2461 1637 y Fy(\(b\))17 b(General)h(form)f(of)g(a)g(Prairie)2461
+1728 y(expression)p 430 1831 3046 4 v 1811 2126 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 38.41118 34.14328
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 4.2679 -18.7789 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch -8.53581 -9.38945 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch -8.53581 -28.16809 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -18.7789 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -37.55754 Ellipse
+closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 1904 2150 a FH(P)1962
+2164 y Fv(2)1904 2306 y FH(P)1962 2320 y Fv(4)1904 2462
+y FH(P)1962 2476 y Fv(5)1692 2228 y FH(P)1750 2242 y
+Fv(1)1692 2384 y FH(P)1750 2398 y Fv(3)1811 2126 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ -1.70726 -64.87228 -1.70726 -28.16809 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 6.82854 -64.87228 -10.24309 -64.87228 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 3.41426 -66.57928 -6.82854 -66.57928 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 0.0 -68.28656 -3.41426 -68.28656 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [
+68.28656 -37.55754 23.90018 -37.55754 /Lineto /lineto load def false
+Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [
+68.28656 -18.7789 23.90018 -18.7789 /Lineto /lineto load def false
+Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [
+68.28656 0.0 23.90018 0.0 /Lineto /lineto load def false Line gsave
+0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 59.75073 42.6791
+.5 CLW mul dup 3 1 roll sub 3 1 roll sub exch -11.95009 -18.7789 Ellipse
+closepath gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+1378 2313 a FH(E)513 2827 y Fy(\(c\))f(General)f(form)h(of)g(a)f(P2V)-7
+b(-generated)17 b(expression.)25 b(Single)15 b(arrows)h(represent)g
+(pointers)g(to)f(shared)i(struc-)513 2918 y(tures.)25
+b(Note)19 b(that)g(the)g(system)g(property)h(is)e(\252grounded\272)k
+(\(unused\).)p 3523 3042 4 2640 v 357 3045 3171 4 v 3525
+3062 19 2646 v 373 3062 3171 19 v 391 3258 a FP(Figure)i(4.2:)31
+b(General)25 b(expressions)i(in)c(V)-12 b(olcano,)25
+b(Prairie,)f(and)g(P2V)-8 b(-generated)25 b(speci\256cations)300
+3635 y FN(4.2.3)99 b(Descriptors)25 b(and)h(Pr)n(operties)582
+3865 y FP(In)d(Prairie,)f(there)i(is)e(one)h(structure)h(that)f
+(represents)j(all)c(the)h(properties)i(of)d(a)g(node)h(in)g(an)f(op-)
+300 4035 y(erator)k(tree,)f(the)g(descriptor)-5 b(.)37
+b(V)-12 b(olcano,)26 b(on)f(the)g(other)h(hand,)f(represents)j
+(properties)f(of)e(expressions)300 4204 y(in)g(\256ve)f(dif)n(ferent)j
+(structures.)37 b(Figures)25 b(4.2\(a\))h(and)f(4.2\(b\))h(show)e(the)h
+(general)i(form)d(of)h(expressions)300 4373 y(in)e(V)-12
+b(olcano)25 b(and)f(Prairie)h(\(i.e.,)d(the)i(forms)g(visible)h(to)f
+(the)f(DBI\).)583 4543 y(The)i(advantage)i(of)e(having)h(separate)h
+(property)g(structures)g(in)e(V)-12 b(olcano)26 b(is)e(that)i(they)f
+(corre-)300 4712 y(spond)j(to)f(the)g(way)g(the)g(properties)i(are)e
+(used)h(and)f(stored)i(internally)g(by)e(the)g(V)-12
+b(olcano)29 b(rule)e(engine.)299 4881 y(In)22 b(other)h(words,)g(the)g
+(partition)h(of)f(properties)i(has)e FD(semantic)g FP(meaning)h(for)f
+(the)f(internal)i(representa-)300 5051 y(tion.)36 b(For)25
+b(example,)i(logical)f(properties)i(in)d(V)-12 b(olcano)27
+b(are)e(computed)i(before)g(optimization)h(begins.)1905
+5349 y(45)p eop
+%%Page: 46 58
+46 57 bop 300 391 a FP(Furthermore,)27 b(the)f(logical)h(properties)h
+(of)e(operator)h(trees)g(in)e(the)h(same)f(equivalence)k(class)d
+(\(that)h(is,)298 561 y(logically)e(equivalent)f(expressions\))i(are)c
+(the)g(same;)h(thus,)g(it)e(makes)i(sense)g(to)f(share)h(a)e(common)h
+(log-)300 730 y(ical)27 b(property)i(structure)h(between)e(all)f(such)g
+(equivalent)j(operator)f(trees,)g(and)e(indeed,)i(this)f(is)e(what)299
+899 y(the)c(V)-12 b(olcano)24 b(rule)f(engine)h(does.)31
+b(This)22 b(is)g(easily)i(done)f(if)f(logical)i(properties)h(are)d
+(de\256ned)h(as)f(a)g(set)h(of)300 1069 y(properties)j(distinct)g(from)
+d(all)h(other)g(properties.)581 1238 y(On)d(the)h(other)h(hand,)f
+(partition)i(of)e(properties)i(has)e(its)g(drawbacks)h(in)f(the)g(area)
+g(of)f(high-level)300 1408 y(abstractions.)41 b(As)25
+b(listed)h(in)g(Section)h(2.8.2,)e(these)i(drawbacks)h(complicate)f
+(the)f(task)h(of)e(specifying)300 1577 y(an)i(optimizer)h(by)e(forcing)
+j(the)e(DBI)e(to)h(think)i(of)f(low-level)h(\(or)e(internal\))j
+(details)f(of)f(property)i(rep-)300 1746 y(resentation.)37
+b(Also,)24 b(as)g(mentioned)j(earlier)l(,)f(these)g(property)g
+(partitions)h(can)e(be)g(brittle,)h(and)f(change)300
+1916 y(when)g(operators,)i(algorithms,)h(or)c(properties)k(are)d
+(changed.)37 b(As)24 b(mentioned)j(in)e(Chapter)h(3,)f(Prairie)300
+2085 y(overcomes)h(these)e(drawbacks)i(by)d(representing)k(properties)g
+(in)c(a)g(single)i(structure,)h(a)d(descriptor)-5 b(.)583
+2254 y(What)26 b(is)g(needed,)i(then,)e(is)g(a)f(translation)k(from)d
+(the)g(high-level)i(abstraction)h(of)d(Prairie)g(de-)294
+2424 y(scriptors)21 b(to)d(the)g(lower)n(-level)j(representation)h(of)c
+(V)-12 b(olcano')-5 b(s)21 b(property)f(structures,)i(where)c(the)h
+(advan-)298 2593 y(tage)k(of)e(property)k(sharing)e(is)f(preserved.)33
+b(The)21 b(P2V)g(preprocessor)k(accomplishes)g(this)e(by)f(retaining)
+300 2762 y(a)j(single)i(property)h(structure)g(with)d(every)i
+(expression,)h(but)e(partitioning)j(the)d(descriptor)i
+FD(internally)298 2932 y FP(into)22 b(separate)i(structures)g(that)e
+(correspond)j(to)c(V)-12 b(olcano')-5 b(s)24 b(property)g(structures.)
+33 b(This)21 b(is)h(shown)g(pic-)299 3101 y(torially)i(in)e(Figure)h
+(4.2\(c\).)31 b(Note)22 b(how)g(logical)i(and)f(physical)i(properties)g
+(are)d(translated)j(to)d(pointers)300 3271 y(to)j(property)j
+(structures;)h(this)d(allows)g(sharing)h(between)f(expressions)j(by)c
+(setting)i(pointers)h(to)d(com-)294 3440 y(mon)17 b(structures.)32
+b(The)17 b(cost)h(property)i(structure)g(is)e(not)g(shared,)i(but)e(it)
+f(is)h(converted)i(to)e(a)f(pointer)j(since)295 3609
+y(it)f(makes)h(sense)g(only)g(for)g(an)f(algorithm)i(\(and)f(thus)g
+(can)f(be)g(set)h(to)f(null)h(for)f(an)g(operator\).)32
+b(Also,)20 b(as)f(we)297 3779 y(mentioned)j(in)f(Section)g(2.2,)g(the)f
+(system)i(property)g(set)f(behaves)i(identically)g(to)d(the)h(logical)h
+(property)300 3948 y(set,)h(so)h(the)g(P2V)e(preprocessor)27
+b(\252grounds\272)g(the)d(system)g(property)i(set)d(\(and)i(doesn')n(t)
+g(use)f(it\).)578 4117 y(The)18 b(problem)i(now)e(is)h(deciding)i(what)
+d(property)j(set)e(\(operator)i(ar)n(gument,)g(logical)g(property)-6
+b(,)300 4287 y(cost,)28 b(or)f(physical)i(property\))h(each)d(property)
+i(in)e(a)g(descriptor)j(belongs)f(to.)41 b(This)26 b(is)h(determined)i
+(as)300 4456 y(follows.)577 4625 y(Initially)-6 b(,)22
+b(all)c(properties)j(in)d(a)f(descriptor)k(are)d(logical)i(properties,)
+i(by)c(default.)30 b(Consider)20 b(a)e(T)-8 b(-)296 4795
+y(rule)21 b(that)f(rewrites)i(an)e(expression)j FH(E)h
+FP(to)c FH(E)1691 4762 y FB(0)1715 4795 y FP(.)29 b(If)20
+b(property)i FH(P)32 b FP(of)20 b(the)h(root)f(of)g FH(E)2822
+4762 y FB(0)2865 4795 y FP(is)g(changed)3245 4762 y Fv(1)3307
+4795 y FP(in)g(either)p 300 4876 1320 4 v 400 4930 a
+Fu(1)434 4961 y Fy(The)14 b(problem)h(of)f(detecting)g(whether)h(a)e
+(property)i(is)f(changed)h(is)f(a)g(dif)o(\256cult)e(one)j(since)f
+(properties)h(can)f(be)g(changed)i(via)300 5053 y(assignment)k
+(statements,)f(helper)h(function)g(calls,)f(etc.)g(in)g(C.)f(T)-5
+b(o)19 b(avoid)h(implementing)g(a)f(full-blown)h(C)f(\(or)g(C++\))g
+(parser)m(,)1905 5349 y FP(46)p eop
+%%Page: 47 59
+47 58 bop 312 403 3260 4 v 312 1449 4 1046 v 386 478
+a FF(JOIN)o Fv(\()p FF(JOIN)q Fv(\()p Fs(S)771 487 y
+Fu(1)806 478 y Fs(;)11 b(S)880 487 y Fu(2)915 478 y Fv(\))20
+b(:)f Fo(D)1063 487 y Fm(4)1102 478 y Fs(;)11 b(S)1176
+487 y Fu(3)1211 478 y Fv(\))20 b(:)f Fo(D)1359 487 y
+Fm(5)1417 478 y Fv(=)-12 b FB(\))20 b FF(JOIN)p Fv(\()p
+Fs(S)1765 487 y Fu(1)1800 478 y Fs(;)11 b FF(JOIN)p Fv(\()p
+Fs(S)2045 487 y Fu(2)2080 478 y Fs(;)g(S)2154 487 y Fu(3)2189
+478 y Fv(\))20 b(:)f Fo(D)2337 487 y Fm(6)2376 478 y
+Fv(\))h(:)f Fo(D)2524 487 y Fm(7)3393 478 y FF(\(4.1\))386
+557 y FB(ff)601 635 y Fo(D)663 644 y Fm(6)702 635 y Fs(:)p
+FF(attributes)k Fv(=)c FF(union)f Fv(\()p Fo(D)1320 644
+y Fm(2)1360 635 y Fs(:)p FF(attributes)r Fs(;)12 b Fo(D)1720
+644 y Fm(3)1759 635 y Fs(:)p FF(attributes)s Fv(\))17
+b(;)386 714 y FB(gg)386 793 y FF(is)p 434 793 20 4 v
+24 w(associative)j Fv(\()p Fo(D)851 802 y Fm(5)890 793
+y Fs(:)p FF(join)p 1016 793 V 25 w(predicate)s Fs(;)12
+b Fo(D)1374 802 y Fm(2)1413 793 y Fs(:)p FF(attributes)s
+Fv(\))386 872 y FB(ff)601 951 y Fo(D)663 960 y Fm(7)722
+951 y Fv(=)19 b Fo(D)858 960 y Fm(5)914 951 y Fv(;)633
+1052 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.52792
+neg 137.83421 9.2889 .5 Frame gsave 3.0 -45 PtoC Shadow 0.5 setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fo(D)695
+1061 y Fm(7)734 1052 y Fs(:)p FF(join)p 860 1052 V 25
+w(predicate)k Fv(=)c Fo(D)1280 1061 y Fm(4)1319 1052
+y Fs(:)p FF(join)p 1445 1052 V 25 w(predicate)h Fv(;)601
+1170 y Fo(D)663 1179 y Fm(6)702 1170 y Fs(:)p FF(join)p
+828 1170 V 25 w(predicate)j Fv(=)d Fo(D)1249 1179 y Fm(5)1288
+1170 y Fs(:)p FF(join)p 1414 1170 V 25 w(predicate)g
+Fv(;)601 1249 y Fo(D)663 1258 y Fm(6)702 1249 y Fs(:)p
+FF(record)p 894 1249 V 26 w(width)g Fv(=)g Fo(D)1223
+1258 y Fm(2)1262 1249 y Fs(:)p FF(record)p 1454 1249
+V 25 w(width)d Fv(+)f Fo(D)1775 1258 y Fm(3)1814 1249
+y Fs(:)p FF(record)p 2006 1249 V 25 w(width)i Fv(;)601
+1328 y Fo(D)663 1337 y Fm(6)702 1328 y Fs(:)p FF(cardinality)24
+b Fv(=)19 b FF(compute)p 1331 1328 V 26 w(cardinality)h
+Fv(\()p Fo(D)1742 1337 y Fm(2)1782 1328 y Fs(;)11 b Fo(D)1875
+1337 y Fm(3)1914 1328 y Fv(\))17 b(;)386 1407 y FB(gg)p
+3568 1449 4 1046 v 312 1452 3260 4 v 3570 1468 19 1053
+v 328 1468 3260 19 v 1171 1664 a FP(Figure)24 b(4.3:)31
+b(Identifying)c(operator)e(ar)n(guments)300 2041 y(the)f(pre-test)i(or)
+f(post-test)h(sections)g(of)e(the)h(T)-8 b(-rule,)24
+b(then)h FH(P)36 b FP(is)24 b(identi\256ed)i(as)e(an)g(operator)j(ar)n
+(gument.)294 2210 y(The)18 b(reason)i(is)e(that)h(T)-8
+b(-rules)18 b(only)h(access)h(operator)g(ar)n(guments)h(or)d(logical)i
+(properties,)i(and,)d(since)h(the)298 2380 y(logical)j(properties)h(of)
+d FH(E)1118 2347 y FB(0)1162 2380 y FP(are)h(the)g(same)f(as)g(those)i
+(of)e FH(E)26 b FP(\(and)c(thus)g(cannot)h(be)f(changed)h(in)f(a)f(T)-8
+b(-rule\),)300 2549 y FH(P)36 b FP(must)23 b(be)h(an)f(operator)j(ar)n
+(gument.)583 2718 y(T)-6 b(o)25 b(illustrate)k(this,)e(consider)h(the)e
+(join)h(associativity)j(T)-8 b(-rule)26 b(from)g(Chapter)h(3,)f
+(repeated)i(in)299 2888 y(Figure)23 b(4.3.)30 b(Note)23
+b(the)f(boxed)i(statement:)33 b(it)22 b(changes)j(the)d(join)h
+(predicate)i(of)e Fp(D)2918 2902 y Fo(7)2963 2888 y FP(,)e(the)i
+(descriptor)i(of)300 3057 y(the)f(root)g(JOIN)f(on)g(the)h(right)h
+(side)f(of)f(the)h(T)-8 b(-rule.)31 b(Thus,)23 b(join)h(predicate)i(is)
+e(an)f(operator)j(ar)n(gument.)583 3227 y(Cost)h(properties)i(are)e
+(easy)g(to)f(detect:)39 b(like)27 b(V)-12 b(olcano,)28
+b(Prairie)f(requires)i(a)d(cost)h(property)h(to)296 3396
+y(have)20 b(the)g(type)g(COST)-7 b(.)17 b(Thus,)j(all)g(properties)i
+(in)e(the)g(descriptor)i(with)d(the)h(type)g(COST)e(are)h(cost)h(prop-)
+300 3565 y(erties)25 b(\(although,)h(typically)-6 b(,)25
+b(there)g(is)e(only)h(one)g(cost)h(property\).)578 3735
+y(Physical)20 b(properties)i(are)c(also)i(easy)f(to)g(identify)-6
+b(.)31 b(The)18 b(P2V)g(preprocessor)k(looks)e(at)f(all)f(\252Null)295
+3904 y(I-rules\272)j(\(i.e.,)e(I-rules)h(where)g(Null)e(implements)j
+(an)e(operator\).)31 b(If)19 b(any)g(property)j(of)c(the)i(input)g
+(stream)300 4073 y(of)25 b(the)h(Null)f(algorithm)j(is)d(changed)i(in)f
+(the)f(pre-opt)j(section)f(of)e(the)h(I-rule,)h(then)f(that)g(property)
+h(is)f(a)297 4243 y(physical)e(property)-6 b(.)32 b(The)21
+b(rationale)j(for)d(this)h(is)f(simple:)31 b(properties)24
+b(that)e(are)f(copied)i(from)e(an)g(opera-)300 4412 y(tor)j(to)f(its)h
+(input)g(must)g(be)f(\252needed\272)j(properties)g(\(in)e(V)-12
+b(olcano')-5 b(s)25 b(terminology\),)i(and)c(thus,)h(are)g(phys-)300
+4581 y(ical)31 b(properties.)53 b(As)29 b(an)h(example,)j(consider)f
+(the)f(Null)f(sort)g(I-rule)i(from)e(Chapter)h(3,)g(repeated)h(in)p
+300 4663 1320 4 v 300 4748 a Fy(P2V)18 b(imposes)g(a)h(requirement)f
+(on)h(Prairie)e(rules)h(that)g(all)g(changes)h(to)f(descriptor)h
+(properties)f(be)h(identi\256ed)f(by)h(an)f(annota-)300
+4839 y(tion)g(to)h(the)f(statement.)25 b(Assignments)19
+b(to)f(descriptor)h(properties)g(are)g(accomplished)h(by)f(a)f
+(function)h(called)g(dcopy)-5 b(.)26 b(Thus,)300 4931
+y(the)19 b(boxed)h(statement)f(in)g(Figure)g(4.3)g(is)f(actually)i
+(written)e(as)h(dcopy)q Fl(\()p Fk(D)2234 4939 y Fm(7)2273
+4931 y Fq(:)p Fy(join)p 2414 4931 23 4 v 27 w(predicate)q
+Fq(;)13 b Fk(D)2813 4939 y Fm(4)2852 4931 y Fq(:)p Fy(join)p
+2993 4931 V 27 w(predicate)q Fl(\))p Fy(.)24 b(It)19
+b(is)f(im-)300 5022 y(portant)h(to)g(note)h(that)e(this)h(requirement)h
+(does)f(not)g(sacri\256ce)g(the)g(full)g(power)g(of)g(C.)1905
+5349 y FP(47)p eop
+%%Page: 48 60
+48 59 bop 312 403 3260 4 v 312 1285 4 883 v 386 478 a
+FF(SOR)l(T)o Fv(\()p Fs(S)621 487 y Fu(1)656 478 y Fv(\))20
+b(:)g Fo(D)805 487 y Fm(2)863 478 y Fv(=)-12 b FB(\))19
+b FF(Null)r Fv(\()p Fs(S)1185 487 y Fu(1)1239 478 y Fv(:)g
+Fo(D)1340 487 y Fm(3)1379 478 y Fv(\))h(:)f Fo(D)1527
+487 y Fm(4)3393 478 y FF(\(4.2\))386 557 y(TRUE)386 635
+y FB(ff)601 714 y Fo(D)663 723 y Fm(4)722 714 y Fv(=)g
+Fo(D)858 723 y Fm(2)914 714 y Fv(;)601 793 y Fo(D)663
+802 y Fm(3)722 793 y Fv(=)g Fo(D)858 802 y Fm(1)914 793
+y Fv(;)633 894 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.52792
+neg 120.05864 9.2889 .5 Frame gsave 3.0 -45 PtoC Shadow 0.5 setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fo(D)695 903 y Fm(3)734 894 y Fs(:)p FF(tuple)p 889 894
+20 4 v 25 w(order)i Fv(=)f Fo(D)1207 903 y Fm(2)1245
+894 y Fs(:)p FF(tuple)p 1400 894 V 26 w(order)e Fv(;)386
+1007 y FB(gg)386 1086 y(ff)601 1165 y Fo(D)663 1174 y
+Fm(4)702 1165 y Fs(:)p FF(cost)j Fv(=)e Fo(D)985 1174
+y Fm(3)1024 1165 y Fs(:)p FF(cost)e Fv(;)386 1244 y FB(gg)p
+3568 1285 4 883 v 312 1288 3260 4 v 3570 1305 19 890
+v 328 1305 3260 19 v 1177 1501 a FP(Figure)24 b(4.4:)32
+b(Identifying)26 b(physical)g(properties)300 1878 y(Figure)f(4.4.)34
+b(The)25 b(boxed)h(statement)g(changes)h(the)e(tuple)p
+2152 1878 28 4 v 34 w(order)h(property)h(of)d FH(S)2884
+1892 y Fv(1)2923 1878 y FP(,)g(the)h(input)h(of)f(Null.)300
+2047 y(Thus,)e(the)h(preprocessor)j(marks)d(tuple)p 1578
+2047 V 35 w(order)g(as)g(a)f(physical)j(property)-6 b(.)300
+2414 y FO(4.3)119 b(T)-9 b(ranslating)30 b(T)-11 b(-rules)300
+2677 y FP(A)23 b(T)-8 b(-rule)25 b(in)g(Prairie)g(corresponds)j(to)d(a)
+f(transformation)k(rule)d(in)g(V)-12 b(olcano.)35 b(The)24
+b(translation)k(from)d(a)299 2846 y(T)-8 b(-rule)24 b(to)f(a)f
+(transformation)27 b(rule)c(is)g(straightforward.)34
+b(Figure)24 b(4.5)f(shows)g(the)h(correspondence)j(be-)295
+3016 y(tween)20 b(a)f(Prairie)h(T)-8 b(-rule)19 b(and)h(a)f(V)-12
+b(olcano)21 b(trans)p 1792 3016 V 34 w(rule.)30 b(Consider)21
+b(the)e(general)j(form)d(of)g(a)g(Prairie)h(T)-8 b(-rule)294
+3185 y(shown)18 b(in)g(Figure)g(4.5\(a\).)30 b FH(X)24
+b FP(and)19 b FH(Y)37 b FP(are)18 b(sets)g(of)g(C)e(\(or)j(C++\))e
+(statements,)k(perhaps)e(computing)h(prop-)300 3354 y(erties)25
+b(of)e(the)h(various)h(expressions)i(in)d(the)f(rule.)32
+b FH(T)j FP(is)24 b(a)f(boolean)i(expression,)h(possibly)g(containing)
+300 3524 y(property)g(references.)36 b(A)23 b(V)-12 b(olcano)26
+b(transformation)h(rule)e(is)f(derived)i(from)e(this)h(T)-8
+b(-rule)24 b(as)g(shown)h(in)300 3693 y(Figure)g(4.5\(b\).)34
+b FH(X)918 3660 y FB(0)942 3693 y FP(,)23 b FH(Y)1061
+3660 y FB(0)1108 3693 y FP(and)i FH(T)1329 3660 y FB(0)1375
+3693 y FP(are)g(derived)h(from)e FH(X)7 b FP(,)24 b FH(Y)c
+FP(,)j(and)i FH(T)13 b FP(,)23 b(respectively)-6 b(,)28
+b(by)c(appropriately)300 3863 y(translating)33 b(the)e(property)h
+(references)h(in)d(each.)51 b(This)30 b(is)g(necessary)-6
+b(,)34 b(since,)f(as)d(described)i(in)e(Sec-)300 4032
+y(tion)d(4.2.3,)h(a)e(Prairie)i(descriptor)h(is)e(transformed)i(into)f
+(a)e(structure)j(containing)h(multiple)e(property)300
+4201 y(sets.)j(This)24 b(is)f(best)h(illustrated)j(with)c(an)h
+(example.)583 4371 y(Consider)j(the)f(join)g(associativity)j(T)-8
+b(-rule)25 b(from)g(Chapter)i(3,)e(shown)h(in)f(Figure)h(4.6\(a\).)37
+b(The)300 4540 y(V)-12 b(olcano)27 b(transformation)i(rule)d(generated)
+i(by)e(the)g(P2V)e(preprocessor)29 b(is)d(shown)g(in)g(Figure)g
+(4.6\(b\).)300 4709 y(The)34 b(statements)i(are)f(numbered,)j(and)d
+(correspond)i(to)d(the)h(same)f(numbered)i(statements)g(in)e(Fig-)299
+4879 y(ure)22 b(4.6\(a\).)31 b(As)22 b(shown)h(in)f(Figure)h(4.2,)f
+(operator)i(ar)n(guments)h(are)d(a)g(separate)i(structure)h(in)d(the)g
+(trans-)294 5048 y(lated)d(descriptor)-5 b(.)32 b(Hence)18
+b(the)g(reference)j(\(in)d(statement)i(4)d(in)h(the)h(application)i
+(code)e(of)f(the)g(trans)p 3405 5048 V 34 w(rule\))1905
+5349 y(48)p eop
+%%Page: 49 61
+49 60 bop 318 403 3247 4 v 318 2450 4 2047 v 386 483
+a Fs(E)t Fv(\()p Fs(x)509 492 y Fu(1)543 483 y Fs(;)11
+b(:)g(:)h(:)23 b(;)11 b(x)751 491 y Fn(n)794 483 y Fv(\))20
+b(:)f Fo(D)942 492 y Fm(1)1000 483 y Fv(=)-12 b FB(\))20
+b Fs(E)1190 456 y Ft(0)1211 483 y Fv(\()p Fs(x)1278 492
+y Fu(1)1313 483 y Fs(;)12 b(:)f(:)g(:)23 b(;)12 b(x)1522
+491 y Fn(n)1564 483 y Fv(\))20 b(:)f Fo(D)1712 492 y
+Fm(2)3393 483 y FF(\(4.3\))386 562 y FB(ff)601 641 y
+Fs(X)386 720 y FB(gg)386 799 y Fs(T)386 877 y FB(ff)601
+956 y Fs(Y)386 1035 y FB(gg)1564 1186 y Fy(\(a\))g(General)g(Prairie)f
+(T)-7 b(-rule)p 369 1285 3146 4 v 386 1340 a Fv(\()p
+Fs(E)23 b FF(?op)p 587 1340 20 4 v 25 w(ar)o(g1)d Fv(\(?1)13
+b Fs(:)e(:)h(:)o Fv(?)p Fs(n)p Fv(\)\))21 b FB(!)e Fv(\()p
+Fs(E)1258 1313 y Ft(0)1300 1340 y FF(?op)p 1399 1340
+V 25 w(ar)o(g2)h Fv(\(?1)13 b Fs(:)f(:)f(:)p Fv(?)p Fs(n)p
+Fv(\)\))1516 b FF(\(4.4\))386 1444 y(\045cond)p 573 1444
+V 25 w(code)386 1523 y FB(ff)601 1602 y Fs(X)664 1578
+y Ft(0)601 1681 y FF(if)18 b(\(!\()p Fs(T)776 1657 y
+Ft(0)798 1681 y FF(\)\))f(REJECT)l(;)386 1760 y FB(gg)386
+1839 y FF(\045appl)p 558 1839 V 25 w(code)386 1917 y
+FB(ff)601 1996 y Fs(Y)658 1973 y Ft(0)386 2075 y FB(gg)423
+2234 y Fy(\(b\))24 b(V)-10 b(olcano)25 b(trans)p 950
+2234 23 4 v 28 w(rule)e(corresponding)k(to)d(the)g(T)-7
+b(-rule)23 b(in)h(\(a\).)40 b Fl(?)p Fq(i)25 b Fy(corresponds)g(to)f
+Fq(x)2786 2242 y Fn(i)2812 2234 y Fy(,)h(and)g Fq(X)3057
+2202 y Ft(0)3079 2234 y Fy(,)g Fq(T)3179 2202 y Ft(0)3201
+2234 y Fy(,)g(and)f Fq(Y)3438 2202 y Ft(0)423 2326 y
+Fy(correspond)d(to)e Fq(X)6 b Fy(,)18 b Fq(T)11 b Fy(,)18
+b(and)i Fq(Y)c Fy(,)j(respectively)-5 b(,)19 b(with)g(property)h
+(references)f(suitably)g(modi\256ed.)p 3562 2450 4 2047
+v 318 2453 3247 4 v 3564 2470 19 2054 v 335 2470 3247
+19 v 1391 2665 a FP(Figure)25 b(4.5:)31 b(T)m(ranslating)25
+b(T)-8 b(-rules)300 3042 y(to)29 b(op)p 494 3042 28 4
+v 34 w(ar)n(g)g(as)g(a)g(C)f(struct.)48 b(On)28 b(the)i(other)g(hand,)h
+(since)f(logical)h(properties)g(are)f(pointers)h(to)e(shared)300
+3211 y(structures,)d(the)e(reference)i(in)d(statement)i(2)e(to)h(log)p
+1940 3211 V 34 w(prop)g(is)f(as)h(a)f(pointer)-5 b(.)583
+3381 y(There)31 b(are)f(two)f(interesting)k(points)f(to)e(note)g(in)g
+(this)h(translation.)53 b(Note)30 b(that)g(a)g(single)h(de-)297
+3550 y(scriptor)23 b(copy)f(\()p Fp(D)902 3564 y Fo(7)972
+3550 y FA(=)j Fp(D)1148 3564 y Fo(5)1193 3550 y FP(\))20
+b(statement)j(in)e(Figure)g(4.6\(a\))h(results)g(in)f(two)f(assignment)
+j(statements)g(in)297 3720 y(Figure)f(4.6\(b\),)g(one)g(for)f(copying)i
+(the)f(operator)h(ar)n(gument)g(\(join)f(predicate\),)i(and)d(another)i
+(for)f(copy-)300 3889 y(ing)27 b(a)g FD(pointer)i FP(to)d(a)h(shared)h
+(logical)h(property)g(structure.)43 b(Since)27 b(physical)i(properties)
+g(and)f(cost)f(are)300 4058 y(not)d(relevant)h(in)f(a)f(T)-8
+b(-rule,)23 b(they)i(are)e(not)h(copied.)1890 4025 y
+Fv(2)576 4228 y FP(Second,)18 b(note)g(that)f(statements)h(1,)g(6,)f
+(and)g(7)g(in)f(Figure)h(4.6\(a\),)i(which)e(compute)g(logical)i(prop-)
+294 4397 y(erties)f(of)g Fp(D)680 4411 y Fo(6)725 4397
+y FP(,)g(are)g(reduced)h(to)f(NO)p 1423 4397 V 32 w(OP)e(statements.)
+1987 4364 y Fv(3)2057 4397 y FP(Again,)j(this)g(is)e(because)j(logical)
+f(properties)h(are)292 4566 y(computed)f(before)e(optimization)j
+(begins)e(\(by)f(DBI-de\256ned)g(support)h(functions,)j(init)p
+3042 4566 V 34 w(descriptor\),)f(so,)300 4736 y(these)25
+b(statements)g(are)f(redundant.)p 300 4798 1320 4 v 400
+4852 a Fu(2)434 4884 y Fy(They)c(are,)e(however)m(,)i(initialized)e(by)
+i(DBI-de\256ned)f(init)p 1934 4884 23 4 v 27 w(descriptor)g(functions.)
+400 4943 y Fu(3)434 4975 y Fy(The)g(P2V)g(preprocessor)h
+(macro-de\256nes)g(NO)p 1675 4975 V 27 w(OP)e(as)h(an)g(empty)h
+(statement.)1905 5349 y FP(49)p eop
+%%Page: 50 62
+50 61 bop 318 403 3247 4 v 318 3219 4 2816 v 386 478
+a FF(JOIN)o Fv(\()p FF(JOIN)q Fv(\()p Fs(S)771 487 y
+Fu(1)806 478 y Fs(;)11 b(S)880 487 y Fu(2)915 478 y Fv(\))20
+b(:)f Fo(D)1063 487 y Fm(4)1102 478 y Fs(;)11 b(S)1176
+487 y Fu(3)1211 478 y Fv(\))20 b(:)f Fo(D)1359 487 y
+Fm(5)1417 478 y Fv(=)-12 b FB(\))20 b FF(JOIN)p Fv(\()p
+Fs(S)1765 487 y Fu(1)1800 478 y Fs(;)11 b FF(JOIN)p Fv(\()p
+Fs(S)2045 487 y Fu(2)2080 478 y Fs(;)g(S)2154 487 y Fu(3)2189
+478 y Fv(\))20 b(:)f Fo(D)2337 487 y Fm(6)2376 478 y
+Fv(\))h(:)f Fo(D)2524 487 y Fm(7)3393 478 y FF(\(4.5\))386
+557 y FB(ff)601 635 y FF(1.)j Fo(D)735 644 y Fm(6)774
+635 y Fs(:)p FF(attributes)h Fv(=)c FF(union)f Fv(\()p
+Fo(D)1392 644 y Fm(2)1432 635 y Fs(:)p FF(attributes)r
+Fs(;)12 b Fo(D)1792 644 y Fm(3)1831 635 y Fs(:)p FF(attributes)r
+Fv(\))18 b(;)386 714 y FB(gg)386 793 y FF(2.)j(is)p 505
+793 20 4 v 25 w(associative)f Fv(\()p Fo(D)923 802 y
+Fm(5)962 793 y Fs(:)p FF(join)p 1088 793 V 25 w(predicate)s
+Fs(;)12 b Fo(D)1446 802 y Fm(2)1485 793 y Fs(:)p FF(attributes)s
+Fv(\))386 872 y FB(ff)601 951 y FF(3.)22 b Fo(D)735 960
+y Fm(7)794 951 y Fv(=)d Fo(D)930 960 y Fm(5)986 951 y
+Fv(;)601 1030 y FF(4.)j Fo(D)735 1039 y Fm(7)774 1030
+y Fs(:)p FF(join)p 900 1030 V 25 w(predicate)h Fv(=)d
+Fo(D)1321 1039 y Fm(4)1360 1030 y Fs(:)p FF(join)p 1486
+1030 V 25 w(predicate)g Fv(;)601 1109 y FF(5.)i Fo(D)735
+1118 y Fm(6)774 1109 y Fs(:)p FF(join)p 900 1109 V 25
+w(predicate)h Fv(=)d Fo(D)1321 1118 y Fm(5)1360 1109
+y Fs(:)p FF(join)p 1486 1109 V 25 w(predicate)g Fv(;)601
+1188 y FF(6.)i Fo(D)735 1197 y Fm(6)774 1188 y Fs(:)p
+FF(record)p 966 1188 V 25 w(width)f Fv(=)f Fo(D)1295
+1197 y Fm(2)1334 1188 y Fs(:)p FF(record)p 1526 1188
+V 25 w(width)d Fv(+)f Fo(D)1847 1197 y Fm(3)1885 1188
+y Fs(:)p FF(record)p 2077 1188 V 26 w(width)i Fv(;)601
+1266 y FF(7.)k Fo(D)735 1275 y Fm(6)774 1266 y Fs(:)p
+FF(cardinality)i Fv(=)19 b FF(compute)p 1403 1266 V 26
+w(cardinality)h Fv(\()p Fo(D)1814 1275 y Fm(2)1854 1266
+y Fs(;)11 b Fo(D)1947 1275 y Fm(3)1986 1266 y Fv(\))17
+b(;)386 1345 y FB(gg)1533 1496 y Fy(\(a\))i(Join)g(associativity)g(T)-7
+b(-rule)p 369 1598 3146 4 v 386 1648 a Fv(\()p FF(JOIN)19
+b(?op)p 675 1648 20 4 v 25 w(ar)o(g5)i Fv(\(\()p FF(JOIN)f(?op)p
+1150 1648 V 25 w(ar)o(g4)g Fv(\(?1)h(?2\)\))g(?3\)\))g
+FB(!)e Fv(\()p FF(JOIN)h(?op)p 2089 1648 V 25 w(ar)o(g7)g
+Fv(\(?1)h(\()p FF(JOIN)f(?op)p 2652 1648 V 25 w(ar)o(g6)g
+Fv(\(?2)h(?3\)\)\)\))292 b FF(\(4.6\))386 1752 y(\045cond)p
+573 1752 V 25 w(code)386 1831 y FB(ff)601 1909 y FF(1.)22
+b(NO)p 773 1909 V 24 w(OP)17 b(;)601 1988 y(2.)22 b(if)c
+Fv(\(!\()p FF(is)p 853 1988 V 24 w(associative)i Fv(\()p
+FF(?op)p 1307 1988 V 26 w(ar)o(g5)g FB(!)f FF(op)p 1625
+1988 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1855 1988 V 25
+w(predicate)s Fs(;)12 b Fv(?2)20 b FB(!)f FF(expr)q Fs(:)p
+FF(ar)o(gument)q Fs(:)p FF(log)p 2824 1988 V 25 w(prop)h
+FB(!)f FF(attributes)t Fv(\)\)\))736 2067 y FF(REJECT)d
+Fv(;)386 2146 y FB(gg)386 2225 y FF(\045appl)p 558 2225
+V 25 w(code)386 2304 y FB(ff)601 2383 y FF(3.)22 b(?op)p
+772 2383 V 25 w(ar)o(g7)f FB(!)e FF(op)p 1090 2383 V
+24 w(ar)o(g)q Fs(:)p FF(join)p 1320 2383 V 25 w(predicate)k
+Fv(=)c FF(?op)p 1777 2383 V 25 w(ar)o(g5)h FB(!)g FF(op)p
+2095 2383 V 24 w(ar)o(g)p Fs(:)p FF(join)p 2324 2383
+V 25 w(predicate)g Fv(;)601 2462 y FF(3.)i(?op)p 772
+2462 V 25 w(ar)o(g7)f FB(!)e FF(log)p 1108 2462 V 25
+w(prop)h Fv(=)f FF(?op)p 1443 2462 V 25 w(ar)o(g5)i FB(!)e
+FF(log)p 1779 2462 V 25 w(prop)e Fv(;)601 2540 y FF(4.)22
+b(?op)p 772 2540 V 25 w(ar)o(g7)f FB(!)e FF(op)p 1090
+2540 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1320 2540 V 25
+w(predicate)k Fv(=)c FF(?op)p 1777 2540 V 25 w(ar)o(g4)h
+FB(!)g FF(op)p 2095 2540 V 24 w(ar)o(g)p Fs(:)p FF(join)p
+2324 2540 V 25 w(predicate)g Fv(;)601 2619 y FF(5.)i(?op)p
+772 2619 V 25 w(ar)o(g6)f FB(!)e FF(op)p 1090 2619 V
+24 w(ar)o(g)q Fs(:)p FF(join)p 1320 2619 V 25 w(predicate)k
+Fv(=)c FF(?op)p 1777 2619 V 25 w(ar)o(g5)h FB(!)g FF(op)p
+2095 2619 V 24 w(ar)o(g)p Fs(:)p FF(join)p 2324 2619
+V 25 w(predicate)g Fv(;)601 2698 y FF(6.)i(NO)p 773 2698
+V 24 w(OP)17 b(;)601 2777 y(7.)22 b(NO)p 773 2777 V 24
+w(OP)17 b(;)386 2856 y FB(gg)423 3006 y Fy(\(b\))j(P2V)-7
+b(-generated)21 b(trans)p 1140 3006 23 4 v 27 w(rule)f(corresponding)j
+(to)d(the)g(T)-7 b(-rule)19 b(in)h(\(a\).)28 b(Statement)20
+b(numbers)h(correspond)h(to)e(the)423 3098 y(same)f(numbered)i
+(statements)e(in)g(\(a\).)p 3562 3219 4 2816 v 318 3222
+3247 4 v 3564 3239 19 2823 v 335 3239 3247 19 v 1022
+3435 a FP(Figure)24 b(4.6:)31 b(T)m(ranslating)25 b(the)f(join)g
+(associativity)k(T)-8 b(-rule)580 3811 y(A)19 b(\256nal)h(issue)h(in)f
+(translating)j(T)-8 b(-rules)20 b(is)g(that)h(of)f(enforcer)n
+(-operators.)35 b(Recall)21 b(that)g(enforcer)n(-)295
+3981 y(operators)g(are)e(discarded)i(by)d(the)h(preprocessor)k(when)18
+b(translating)k(Prairie)d(rules)h(into)f(V)-12 b(olcano.)31
+b(This)300 4150 y(means)f(that)g(if)f(an)g(expression)k(in)c(a)g(T)-8
+b(-rule)29 b(contains)j(an)d(enforcer)n(-operator)m(,)36
+b(the)29 b(P2V)f(preproces-)297 4319 y(sor)22 b(deletes)g(the)g
+(enforcer)n(-operator)k(when)21 b(translating)j(the)d(expression)j(to)d
+(V)-12 b(olcano.)32 b(What)21 b(happens)300 4489 y(to)31
+b(the)h(T)-8 b(-rule')j(s)31 b(actions)i(when)f(a)f(statement)h
+(references)i(the)e(descriptor)i(of)d(the)g(\(now-discarded\))299
+4658 y(enforcer)n(-operator?)37 b(The)22 b(answer)h(becomes)h(obvious)h
+(when)e(we)f(consider)j(that)e(enforcer)n(-operators)300
+4827 y(have)35 b(the)g(same)f(logical)i(properties)i(and)c(operator)j
+(ar)n(guments)g(as)d(their)h(input.)65 b(Thus,)37 b(when)d(an)300
+4997 y(enforcer)n(-operator)e(like)c(SOR)-5 b(T)m FA(\()p
+FH(S)1440 5011 y Fv(1)1480 4997 y FA(\))37 b(:)f Fp(D)1693
+5011 y Fo(2)1764 4997 y FP(is)27 b(deleted,)i(references)g(to)e
+(properties)j(of)c Fp(D)3230 5011 y Fo(2)3301 4997 y
+FP(are)h(con-)1905 5349 y(50)p eop
+%%Page: 51 63
+51 62 bop 318 403 3247 4 v 318 2588 4 2185 v 386 478
+a FF(JOIN)o Fv(\()p Fs(S)599 487 y Fu(1)634 478 y Fs(;)12
+b(S)709 487 y Fu(2)743 478 y Fv(\))20 b(:)g Fo(D)892
+487 y Fm(3)950 478 y Fv(=)-12 b FB(\))19 b FF(JOPR)p
+Fv(\()p FF(SOR)l(T)q Fv(\()p Fs(S)1502 487 y Fu(1)1537
+478 y Fv(\))h(:)f Fo(D)1685 487 y Fm(4)1724 478 y Fs(;)11
+b FF(SOR)l(T)p Fv(\()p Fs(S)1991 487 y Fu(2)2026 478
+y Fv(\))20 b(:)f Fo(D)2174 487 y Fm(5)2213 478 y Fv(\))h(:)f
+Fo(D)2361 487 y Fm(6)3393 478 y FF(\(4.7\))386 557 y
+FB(ff)601 635 y FF(1.)j Fo(D)735 644 y Fm(4)794 635 y
+Fv(=)d Fo(D)930 644 y Fm(1)986 635 y Fv(;)601 714 y FF(2.)j
+Fo(D)735 723 y Fm(5)794 714 y Fv(=)d Fo(D)930 723 y Fm(2)986
+714 y Fv(;)386 793 y FB(gg)386 872 y FF(3.)i Fv(\()p
+Fo(D)546 881 y Fm(4)586 872 y Fs(:)p FF(cardinality)i
+Fs(<)d Fv(10000\))386 951 y FB(ff)601 1030 y(\001)12
+b(\001)f(\001)386 1109 y(gg)1353 1259 y Fy(\(a\))18 b(T)-7
+b(-rule)19 b(with)f(enforcer)o(-operator)i(SOR)l(T)p
+369 1361 3146 4 v 386 1411 a Fv(\()p FF(JOIN)f(?op)p
+675 1411 20 4 v 25 w(ar)o(g3)i Fv(\(?1)f(?2\)\))h FB(!)f
+Fv(\()p FF(JOPR)g(?op)p 1483 1411 V 25 w(ar)o(g6)g Fv(\(?1)h(?2\)\))
+1515 b FF(\(4.8\))386 1515 y(\045cond)p 573 1515 V 25
+w(code)386 1594 y FB(ff)601 1673 y FF(1.)22 b(NO)p 773
+1673 V 24 w(OP)17 b(;)601 1752 y(2.)22 b(NO)p 773 1752
+V 24 w(OP)17 b(;)601 1831 y(3.)22 b(if)c Fv(\(!\(\(?1)j
+FB(!)e FF(expr)q Fs(:)p FF(ar)o(gument)q Fs(:)p FF(log)p
+1506 1831 V 25 w(prop)h FB(!)f FF(cardinality)24 b Fs(<)19
+b Fv(10000\)\)\))k FF(REJECT)15 b Fv(;)386 1909 y FB(gg)386
+1988 y FF(\045appl)p 558 1988 V 25 w(code)386 2067 y
+FB(ff)601 2146 y(\001)d(\001)f(\001)386 2225 y(gg)423
+2375 y Fy(\(b\))20 b(P2V)-7 b(-generated)21 b(trans)p
+1140 2375 23 4 v 27 w(rule)f(corresponding)j(to)d(the)g(T)-7
+b(-rule)19 b(in)h(\(a\).)28 b(Statement)20 b(numbers)h(correspond)h(to)
+e(the)423 2467 y(same)f(numbered)i(statements)e(in)g(\(a\).)p
+3562 2588 4 2185 v 318 2591 3247 4 v 3564 2608 19 2192
+v 335 2608 3247 19 v 953 2804 a FP(Figure)24 b(4.7:)31
+b(T)m(ranslating)26 b(T)-8 b(-rules)24 b(with)f(enforcer)n(-operators)
+300 3180 y(verted)j(to)e(references)j(to)d(properties)j(of)d
+Fp(D)1702 3194 y Fo(1)1770 3180 y FP(\(the)h(descriptor)i(of)d
+FH(S)2477 3194 y Fv(1)2516 3180 y FP(\).)33 b(This)24
+b(is)g(shown)g(in)h(Figure)f(4.7)300 3350 y(where)g(the)g(reference)j
+(to)c(the)i(cardinality)h(of)e(a)g(SOR)-5 b(T)21 b(\(in)j(the)g(test)g
+(of)g(the)g(T)-8 b(-rule\))25 b(is)e(translated)k(to)d(a)300
+3519 y(reference)i(to)d(the)h(cardinality)j(of)c(the)h(input)h(of)e
+(the)h(SOR)-5 b(T)20 b(in)k(the)g(V)-12 b(olcano)25 b(trans)p
+2950 3519 28 4 v 34 w(rule.)300 3886 y FO(4.4)119 b(T)-9
+b(ranslating)30 b(I-rules)297 4149 y FP(I-rules)22 b(in)f(Prairie)h
+(correspond)i(to)d(V)-12 b(olcano')-5 b(s)23 b(implementation)g(rules.)
+31 b(However)l(,)22 b(the)f(translation)j(of)298 4318
+y(I-rules)f(is)f(more)f(complicated)j(than)f(the)f(translation)i(of)e
+(T)-8 b(-rules.)30 b(This)22 b(is)f(primarily)j(because)f(the)f(ac-)300
+4487 y(tions)i(associated)i(with)e(a)f(Prairie)g(I-rule)i(are)e(all)h
+(expressed)i(concomitantly)h(\(pre-opt)e(and)f(post-opt\))292
+4657 y(with)17 b(the)g(rule.)29 b(In)17 b(V)-12 b(olcano,)19
+b(on)e(the)g(other)g(hand,)i(there)f(are)f FD(four)g
+FP(distinct)i(support)f(functions)i(\(as)d(listed)299
+4826 y(in)22 b(T)-6 b(able)22 b(2.3\))h(that)g(are)f(responsible)k(for)
+c(most)h(of)f(the)h(property)h(transformations)j(associated)e(with)d(a)
+300 4996 y(implementation)28 b(rule.)37 b(This)25 b(means)h(that)f
+(when)h(translating)i(a)d(Prairie)h(I-rule)g(to)f(V)-12
+b(olcano')-5 b(s)28 b(imple-)1905 5349 y(51)p eop
+%%Page: 52 64
+52 63 bop 318 403 3247 4 v 318 3265 4 2862 v 386 478
+a Fs(E)t Fv(\()p Fs(x)509 487 y Fu(1)543 478 y Fs(;)11
+b(:)g(:)h(:)23 b(;)11 b(x)751 486 y Fn(n)794 478 y Fv(\))20
+b(:)f Fo(D)942 487 y Fm(1)1000 478 y Fv(=)-12 b FB(\))20
+b Fs(A)p Fv(\()p Fs(x)1254 487 y Fu(1)1288 478 y Fs(;)12
+b(:)f(:)g(:)24 b(;)11 b(x)1497 486 y Fn(n)1539 478 y
+Fv(\))20 b(:)f Fo(D)1687 487 y Fm(2)3393 478 y FF(\(4.9\))386
+557 y Fs(T)386 635 y FB(ff)601 714 y Fs(X)386 793 y FB(gg)386
+872 y(ff)601 951 y Fs(Y)386 1030 y FB(gg)1571 1180 y
+Fy(\(a\))g(General)g(Prairie)f(I-rule)p 369 1280 3146
+4 v 386 1330 a Fv(\()p Fs(E)23 b FF(?op)p 587 1330 20
+4 v 25 w(ar)o(g1)d Fv(\(?1)13 b Fs(:)e(:)h(:)o Fv(?)p
+Fs(n)p Fv(\)\))21 b FB(!)e Fv(\()p Fs(A)h FF(?al)p 1355
+1330 V 26 w(ar)o(g2)g Fv(\(?1)13 b Fs(:)e(:)g(:)p Fv(?)p
+Fs(n)p Fv(\)\))1527 b FF(\(4.10\))386 1433 y(\045cond)p
+573 1433 V 25 w(code)386 1512 y FB(ff)601 1591 y FF(if)18
+b(\(!\()p Fs(T)776 1568 y Ft(0)798 1591 y FF(\)\))f(REJECT)l(;)386
+1670 y FB(gg)386 1749 y FF(\045appl)p 558 1749 V 25 w(code)386
+1828 y FB(ff)601 1907 y Fs(==)h FF(book-keeping)h(statements)386
+1985 y FB(gg)386 2064 y FE(Support)e(function)g FF(do)p
+957 2064 V 25 w(any)p 1077 2064 V 25 w(good)p 1234 2064
+V 24 w Fs(A)386 2143 y FB(f)601 2222 y Fs(X)664 2199
+y Ft(0)386 2301 y FB(g)386 2380 y FE(Support)g(function)g
+FF(derive)p 1055 2380 V 26 w Fs(A)p 1134 2380 V 24 w
+FF(phy)p 1257 2380 V 25 w(prop)386 2459 y FB(f)601 2537
+y Fs(Y)658 2514 y Ft(0)386 2616 y FB(g)423 2775 y Fy(\(b\))h(V)-10
+b(olcano)19 b(impl)p 930 2775 23 4 v 27 w(rule)f(corresponding)j(to)d
+(the)g(I-rule)f(in)h(\(a\).)25 b Fl(?)p Fq(i)18 b Fy(corresponds)i(to)e
+Fq(x)2683 2783 y Fn(i)2709 2775 y Fy(,)f(and)i Fq(X)2940
+2744 y Ft(0)2963 2775 y Fy(,)e Fq(T)3055 2744 y Ft(0)3077
+2775 y Fy(,)h(and)h Fq(Y)3301 2744 y Ft(0)3341 2775 y
+Fy(cor)o(-)423 2867 y(respond)e(to)e Fq(X)6 b Fy(,)15
+b Fq(T)c Fy(,)k(and)h Fq(Y)g Fy(,)g(respectively)-5 b(,)16
+b(with)f(property)h(references)g(suitably)f(modi\256ed.)24
+b(Note)15 b(that)g(the)g(general)423 2958 y(I-rule)h(is)g(translated)h
+(to)f(an)h(implementation)h(rule)e(and)h(two)f(support)i(functions)f
+(corresponding)i(to)d(the)h(algorithm)423 3049 y Fq(A)p
+Fy(.)32 b(The)21 b(remaining)h(support)g(functions)g(\(get)p
+1657 3049 V 28 w(input)p 1838 3049 V 27 w(pv)g(and)g(cost\))f(are)h
+(\252grounded\272)h(\(i.e.,)e(contain)h(only)g(book-)423
+3141 y(keeping)e(statements\).)p 3562 3265 4 2862 v 318
+3268 3247 4 v 3564 3285 19 2869 v 335 3285 3247 19 v
+1400 3481 a FP(Figure)k(4.8:)31 b(T)m(ranslating)26 b(I-rules)300
+3857 y(mentation)i(rule,)f(the)f(actions)i(of)e(the)g(I-rule)h(have)g
+(to)f(be)g(partitioned)j(into)e(the)f(appropriate)j(support)300
+4027 y(functions.)k(How)23 b(this)h(is)f(accomplished)k(is)c(the)h
+(most)g(challenging)j(problem.)583 4196 y(Broadly)32
+b(speaking,)i(the)d(P2V)e(preprocessor)35 b(partitions)e(the)e(actions)
+h(of)e(an)h(I-rule)g(as)g(fol-)300 4365 y(lows.)36 b(The)25
+b(test)h(of)g(an)f(I-rule)h(is)g(translated)i(to)d(the)h(condition)i
+(code)e(of)f(a)g(V)-12 b(olcano)27 b(implementation)300
+4535 y(rule.)39 b(The)26 b(pre-opt)i(section)g(of)e(an)h(I-rule)g(is)f
+(transformed)j(into)e(the)f(do)p 2629 4535 28 4 v 34
+w(any)p 2793 4535 V 34 w(good)h(function)h(for)f(the)295
+4704 y(appropriate)c(algorithm,)e(and)f(the)g(post-opt)h(section)g(is)e
+(translated)j(to)d(the)h(derive)p 2895 4704 V 35 w(phy)p
+3065 4704 V 34 w(prop)g(function.)300 4873 y(The)j(two)g(other)i
+(support)g(functions,)h(get)p 1627 4873 V 34 w(input)p
+1846 4873 V 34 w(pv)e(and)g(cost,)g(are)g(translated)i(to)d(dummy)h
+(functions.)298 5043 y(That)e(is,)g(the)h(statements)h(in)e(these)h
+(two)f(functions)i(are)f(meant)f(for)g(book-keeping)27
+b(purposes,)d(and)f(are)1905 5349 y(52)p eop
+%%Page: 53 65
+53 64 bop 310 403 3264 4 v 310 3774 4 3371 v 386 478
+a FF(JOIN)o Fv(\()p Fs(S)599 487 y Fu(1)634 478 y Fs(;)12
+b(S)709 487 y Fu(2)743 478 y Fv(\))20 b(:)g Fo(D)892
+487 y Fm(3)950 478 y Fv(=)-12 b FB(\))19 b FF(Nested)p
+1270 478 20 4 v 26 w(loops)q Fv(\()p Fs(S)1506 487 y
+Fu(1)1560 478 y Fv(:)g Fo(D)1661 487 y Fm(4)1700 478
+y Fs(;)12 b(S)1775 487 y Fu(2)1809 478 y Fv(\))20 b(:)g
+Fo(D)1958 487 y Fm(5)3363 478 y FF(\(4.1)n(1\))386 557
+y(1.)h(TRUE)386 635 y FB(ff)601 714 y FF(2.)h Fo(D)735
+723 y Fm(5)794 714 y Fv(=)d Fo(D)930 723 y Fm(3)986 714
+y Fv(;)601 793 y FF(3.)j Fo(D)735 802 y Fm(4)794 793
+y Fv(=)d Fo(D)930 802 y Fm(1)986 793 y Fv(;)601 872 y
+FF(4.)j Fo(D)735 881 y Fm(4)774 872 y Fs(:)p FF(tuple)p
+929 872 V 26 w(order)e Fv(=)g Fo(D)1247 881 y Fm(3)1286
+872 y Fs(:)p FF(tuple)p 1441 872 V 25 w(order)e Fv(;)601
+951 y FF(5.)k Fo(D)735 960 y Fm(5)774 951 y Fs(:)p FF(cost)f
+Fv(=)e Fo(D)1057 960 y Fm(4)1096 951 y Fs(:)p FF(cardinality)g
+FB(\003)d Fo(D)1528 960 y Fm(2)1567 951 y Fs(:)p FF(cardinality)21
+b Fv(;)386 1030 y FB(gg)386 1109 y(ff)601 1188 y FF(6.)h
+Fo(D)735 1197 y Fm(5)774 1188 y Fs(:)p FF(tuple)p 929
+1188 V 26 w(order)e Fv(=)g Fo(D)1247 1197 y Fm(4)1286
+1188 y Fs(:)p FF(tuple)p 1441 1188 V 25 w(order)e Fv(;)386
+1266 y FB(gg)1605 1417 y Fy(\(a\))g(Nested)h(loops)h(I-rule)p
+361 1519 3162 4 v 377 1569 a Fv(\()p FF(JOIN)g(?op)p
+667 1569 20 4 v 25 w(ar)o(g1)g Fv(\(?1)h(?2\)\))g FB(!)e
+Fv(\()p FF(Nested)p 1387 1569 V 26 w(loops)i(?al)p 1653
+1569 V 25 w(ar)o(g2)f Fv(\(?1)h(?2\)\))1304 b FF(\(4.12\))377
+1673 y(\045cond)p 564 1673 V 26 w(code)377 1752 y FB(ff)593
+1831 y FF(1.)22 b(if)17 b Fv(\(!\()p FF(TRUE)p Fv(\)\))h
+FF(REJECT)d Fv(;)377 1909 y FB(gg)377 1988 y FF(\045appl)p
+549 1988 V 26 w(code)377 2067 y FB(ff)593 2146 y Fs(==)i
+FF(book-keeping)j(statements)377 2225 y FB(gg)377 2304
+y FE(Support)d(function)h FF(do)p 949 2304 V 24 w(any)p
+1068 2304 V 25 w(good)p 1225 2304 V 25 w(Nested)p 1433
+2304 V 25 w(loops)377 2383 y FB(f)593 2462 y Fs(==)f
+FF(book-keeping)j(statements)593 2540 y(2.)i(ret)p 738
+2540 V 25 w(value)f FB(!)f FF(algorithm)p 1273 2540 V
+26 w(ar)o(gument)q Fs(:)p FF(log)p 1652 2540 V 25 w(prop)g
+Fv(=)g FF(operator)p 2112 2540 V 26 w(ar)o(gument)h FB(!)e
+FF(log)p 2581 2540 V 25 w(prop)e Fv(;)593 2619 y FF(3.)22
+b(NO)p 765 2619 V 24 w(OP)16 b(;)593 2698 y(4.)22 b(ret)p
+738 2698 V 25 w(value)f FB(!)f FF(algorithm)p 1273 2698
+V 26 w(ar)o(gument)q Fs(:)p FF(al)p 1615 2698 V 25 w(ar)o(g)g
+FB(!)f FF(required[0])k FB(!)c FF(tuple)p 2373 2698 V
+26 w(order)h Fv(=)g FF(needed)p 2819 2698 V 26 w(phy)p
+2944 2698 V 24 w(prop)h FB(!)e FF(tuple)p 3331 2698 V
+26 w(order)e Fv(;)593 2777 y FF(5.)22 b(ret)p 738 2777
+V 25 w(value)f FB(!)f FF(algorithm)p 1273 2777 V 26 w(ar)o(gument)q
+Fs(:)p FF(al)p 1615 2777 V 25 w(ar)o(g)g FB(!)f FF(cost)i
+Fv(=)728 2856 y FF(ret)p 801 2856 V 25 w(value)g FB(!)e
+FF(algorithm)p 1335 2856 V 27 w(ar)o(gument)q Fs(:)p
+FF(al)p 1678 2856 V 25 w(ar)o(g)h FB(!)f FF(desc[0])i
+FB(!)e FF(log)p 2285 2856 V 25 w(prop)h FB(!)g FF(cardinality)743
+2935 y FB(\003)c FF(ret)p 867 2935 V 25 w(value)22 b
+FB(!)d FF(algorithm)p 1402 2935 V 26 w(ar)o(gument)r
+Fs(:)p FF(al)p 1745 2935 V 24 w(ar)o(g)i FB(!)e FF(desc[1])i
+FB(!)e FF(log)p 2352 2935 V 25 w(prop)h FB(!)f FF(cardinality)i
+Fv(;)377 3014 y FB(g)377 3092 y FE(Support)c(function)h
+FF(derive)p 1047 3092 V 26 w(Nested)p 1256 3092 V 25
+w(loops)p 1424 3092 V 25 w(phy)p 1548 3092 V 25 w(prop)377
+3171 y FB(f)593 3250 y Fs(==)f FF(book-keeping)j(statements)593
+3329 y(6.)i(algorithm)p 925 3329 V 26 w(ar)o(gument)f
+FB(!)f FF(phy)p 1410 3329 V 24 w(prop)g FB(!)g FF(tuple)p
+1797 3329 V 25 w(order)h Fv(=)f FF(input)p 2192 3329
+V 25 w(phy)p 2316 3329 V 25 w(prop[0])g FB(!)g FF(tuple)p
+2781 3329 V 25 w(order)e Fv(;)377 3408 y FB(g)415 3558
+y Fy(\(b\))13 b(P2V)-7 b(-generated)14 b(impl)p 1110
+3558 23 4 v 27 w(rule)f(and)g(support)h(functions)g(corresponding)h(to)
+e(the)g(I-rule)g(in)g(\(a\).)23 b(Statement)12 b(numbers)415
+3650 y(correspond)20 b(to)f(the)g(same)g(numbered)i(statements)e(in)g
+(\(a\).)p 3570 3774 4 3371 v 310 3777 3264 4 v 3572 3794
+19 3378 v 326 3794 3264 19 v 1113 3990 a FP(Figure)24
+b(4.9:)32 b(T)m(ranslating)25 b(the)f(nested)h(loops)g(I-rule)300
+4366 y(not)j(taken)g(from)f(the)h(actions)h(of)e(any)h(I-rule.)43
+b(These)27 b(book-keeping)32 b(statements)d(are)e(primarily)i(re-)297
+4536 y(sponsible)23 b(for)e(pointer)i(manipulations)h(and)d(copying)i
+(of)d(shared)j(property)f(structures.)33 b(This)20 b(process)299
+4705 y(is)j(shown)g(in)g(Figure)g(4.8)g(which)g(shows)g(a)f(general)j
+(Prairie)e(I-rule)h(\(Figure)g(4.8\(a\)\))f(and)h(the)f(V)-12
+b(olcano)300 4874 y(implementation)26 b(rule)f(and)f(support)h
+(functions)h(that)e(it)f(is)h(translated)i(to)d(\(Figure)i(4.8\(b\)\).)
+579 5044 y(Most)19 b(of)h(the)f(dif)n(\256culty)j(in)d(an)g(I-rule)i
+(translation)h(involves)g(translating)g(property)g(references)1905
+5349 y(53)p eop
+%%Page: 54 66
+54 65 bop 300 391 a FP(in)27 b(Prairie)g(to)f(those)i(in)f(V)-12
+b(olcano.)41 b(Since)27 b(the)g(property)i(translation)h(process)e
+(involves)h(pointers)g(\(as)298 561 y(shown)23 b(in)e(Figure)i(4.2\),)f
+(the)g(generated)i(code)f(for)f(the)g(V)-12 b(olcano)23
+b(support)h(functions)h(contains)f(a)d(lot)h(of)296 730
+y(pointer)f(manipulation)i(operations.)32 b(It)19 b(is)h(illuminating)i
+(to)e(consider)h(an)f(example)h(that)f(illustrates)i(the)300
+899 y(translation)27 b(process.)583 1069 y(Consider)40
+b(the)f(nested)g(loops)h(I-rule)f(from)f(Chapter)h(3,)i(shown)e(in)f
+(Figure)h(4.9\(a\).)76 b(The)300 1238 y(V)-12 b(olcano)38
+b(implementation)i(rule)d(and)g(support)i(functions)g(\(do)p
+2391 1238 28 4 v 34 w(any)p 2555 1238 V 34 w(good)p 2769
+1238 V 35 w(Nested)p 3055 1238 V 34 w(loops)f(and)f(de-)294
+1408 y(rive)p 439 1408 V 34 w(Nested)p 724 1408 V 35
+w(loops)p 954 1408 V 34 w(phy)p 1123 1408 V 34 w(prop\))20
+b(generated)h(by)d(the)h(P2V)e(preprocessor)22 b(are)d(shown)g(in)f
+(Figure)h(4.9\(b\).)300 1577 y(The)34 b(statements)i(are)f(numbered,)j
+(and)d(correspond)i(to)d(the)h(same)f(numbered)i(statements)g(in)e
+(Fig-)300 1746 y(ure)24 b(4.9\(a\).)583 1916 y(The)35
+b(interesting)j(points)f(to)e(note)h(are)f(the)h(translation)i(of)d
+(the)g(pre-opt)i(and)f(the)f(post-opt)300 2085 y(sections)g(of)e(the)g
+(I-rule.)61 b(As)32 b(shown)h(in)g(Figure)h(4.8,)h(these)f(are)f
+(translated)j(to)d(support)i(functions)300 2254 y(do)p
+395 2254 V 34 w(any)p 559 2254 V 34 w(good)p 773 2254
+V 34 w(Nested)p 1058 2254 V 34 w(loops)g(and)g(derive)p
+1712 2254 V 35 w(Nested)p 1998 2254 V 34 w(loops)p 2227
+2254 V 35 w(phy)p 2397 2254 V 34 w(prop,)i(respectively)-6
+b(.)65 b(Notice)34 b(how)297 2424 y(the)21 b(third)h(statement)h(in)e
+(the)g(I-rule)h(is)f(translated)i(to)e(a)g(NO)p 2176
+2424 V 32 w(OP)e(statement.)32 b(This)20 b(is)h(because)i(the)e(only)
+300 2593 y(properties)26 b(of)e FH(D)860 2607 y Fv(4)922
+2593 y FP(that)h(can)f(be)f(changed)j(in)e(the)g(pre-opt)h(section)g
+(are)f(the)g(physical)i(properties)g(\(this)295 2762
+y(corresponds)c(to)c(V)-12 b(olcano')-5 b(s)21 b(concept)g(of)d
+(\252needed)j(physical)g(properties\272;)j(see)19 b(Section)g(2.2\),)h
+(which)f(is)296 2932 y(accomplished)k(by)d(the)g(fourth)h(statement.)31
+b(The)20 b(physical)i(properties)g(of)e(the)g(inputs)h(of)f(Nested)p
+3378 2932 V 34 w(loops)300 3101 y(are)27 b(represented)j(as)d(pointers)
+i(to)e(physical)i(property)g(structures,)h(as)d(evidenced)i(by)e(the)g
+(translation)300 3271 y(of)c(the)h(fourth)h(statement.)579
+3440 y(In)19 b(general,)j(the)e(translation)j(of)c(I-rule)i(actions)g
+(involves)h(a)d(lot)h(of)f(book-keeping)24 b(statements)300
+3609 y(and,)33 b(as)d(Figure)h(4.9\(b\))h(shows,)g(a)e(lot)h(of)g
+(pointer)h(traversals.)55 b(This)30 b(is)h(necessary)i(because)f(of)f
+(the)300 3779 y(way)26 b(the)g(P2V)f(preprocessor)30
+b(transforms)e(Prairie)f(descriptors)i(into)e(V)-12 b(olcano)28
+b(properties,)h(and)e(also)300 3948 y(because)h(of)f(the)f(rigid)h
+(structure)i(of)d(V)-12 b(olcano)28 b(support)g(functions)h(\(not)e
+(all)g(of)f(them)g(have)i(access)f(to)300 4117 y(all)d(property)h
+(structures)i(because)e(the)f(parameter)h(list)f(of)f(support)j
+(functions)g(is)d(pre-de\256ned\).)300 4424 y FN(4.4.1)99
+b(T)-7 b(ranslating)25 b(Enfor)n(cers)300 4655 y FP(Figure)33
+b(4.1)g(shows)h(how)e(the)i(P2V)d(preprocessor)37 b(identi\256es)d
+(enforcers)i(\(implicit)e(algorithms\))h(in)300 4824
+y(Prairie.)i(As)24 b(described)k(in)e(Section)g(4.2.1,)g(rules)g
+(containing)i(enforcers)g(are)e(discarded)h(by)f(the)g(pre-)300
+4993 y(processor)-5 b(.)33 b(What)24 b(becomes)h(of)e(the)h(actions)h
+(in)f(such)g(rules?)1905 5349 y(54)p eop
+%%Page: 55 67
+55 66 bop 318 403 3247 4 v 318 2796 4 2393 v 386 478
+a FF(SOR)l(T)o Fv(\()p Fs(S)621 487 y Fu(1)656 478 y
+Fv(\))20 b(:)g Fo(D)805 487 y Fm(2)863 478 y Fv(=)-12
+b FB(\))19 b FF(Mer)o(ge)p 1171 478 20 4 v 25 w(sort)q
+Fv(\()p Fs(S)1362 487 y Fu(1)1397 478 y Fv(\))h(:)f Fo(D)1545
+487 y Fm(3)3360 478 y FF(\(4.13\))386 557 y(1.)i Fv(\()p
+Fo(D)546 566 y Fm(2)586 557 y Fs(:)p FF(tuple)p 741 557
+V 25 w(order)d Fv(!)8 b(=)19 b FF(DONT)p 1210 557 V 23
+w(CARE)p Fv(\))386 635 y FB(ff)601 714 y FF(2.)j Fo(D)735
+723 y Fm(3)794 714 y Fv(=)d Fo(D)930 723 y Fm(2)986 714
+y Fv(;)601 793 y FF(3.)j Fo(D)735 802 y Fm(3)774 793
+y Fs(:)p FF(cost)f Fv(=)e Fo(D)1057 802 y Fm(3)1096 793
+y Fs(:)p FF(cardinality)g FB(\003)d Fv(log)q(\()p Fo(D)1646
+802 y Fm(3)1686 793 y Fs(:)p FF(cardinality)t Fv(\))h(;)386
+872 y FB(gg)386 951 y(ff)386 1109 y(gg)1636 1259 y Fy(\(a\))i(Mer)o(ge)
+g(sort)g(I-rule)p 369 1361 3146 4 v 386 1407 a FE(Support)e(function)g
+FF(do)p 957 1407 20 4 v 25 w(any)p 1077 1407 V 25 w(good)p
+1234 1407 V 24 w(Mer)o(ge)p 1429 1407 V 25 w(sort)386
+1486 y FB(f)601 1565 y Fs(==)h FF(book-keeping)h(statements)601
+1644 y(1.)j(if)c Fv(\()p FF(needed)p 948 1644 V 26 w(phy)p
+1073 1644 V 25 w(prop)i FB(!)f FF(tuple)p 1460 1644 V
+26 w(order)f Fv(!)8 b(=)18 b FF(DONT)p 1929 1644 V 24
+w(CARE)p Fv(\))f FB(f)601 1723 y FF(2.)163 b(ret)p 887
+1723 V 25 w(value)21 b FB(!)e FF(algorithm)p 1421 1723
+V 26 w(ar)o(gument)r Fs(:)p FF(log)p 1801 1723 V 24 w(prop)i
+Fv(=)e FF(operator)p 2260 1723 V 27 w(ar)o(gument)i FB(!)e
+FF(log)p 2730 1723 V 25 w(prop)e Fv(;)601 1802 y FF(3.)163
+b(ret)p 887 1802 V 25 w(value)21 b FB(!)e FF(algorithm)p
+1421 1802 V 26 w(ar)o(gument)r Fs(:)p FF(al)p 1764 1802
+V 25 w(ar)o(g)h FB(!)f FF(cost)i Fv(=)854 1881 y FF(ret)p
+927 1881 V 25 w(value)h FB(!)d FF(algorithm)p 1462 1881
+V 26 w(ar)o(gument)r Fs(:)p FF(log)p 1842 1881 V 24 w(prop)h
+FB(!)g FF(cardinality)870 1960 y FB(\003)c Fv(log)q(\()p
+FF(ret)p 1112 1960 V 25 w(value)22 b FB(!)d FF(algorithm)p
+1647 1960 V 26 w(ar)o(gument)r Fs(:)p FF(log)p 2027 1960
+V 24 w(prop)i FB(!)e FF(cardinality)t Fv(\))e(;)601 2038
+y FB(g)386 2117 y(g)386 2196 y FE(Support)g(function)g
+FF(derive)p 1055 2196 V 26 w(Mer)o(ge)p 1252 2196 V 25
+w(sort)p 1376 2196 V 25 w(phy)p 1500 2196 V 25 w(prop)386
+2275 y FB(f)601 2354 y Fs(==)h FF(book-keeping)h(statements)386
+2433 y FB(g)423 2583 y Fy(\(b\))f(P2V)-7 b(-generated)18
+b(support)h(functions)f(corresponding)i(to)e(the)f(I-rule)h(in)f
+(\(a\).)24 b(Statement)18 b(numbers)g(correspond)423
+2674 y(to)h(the)g(same)g(numbered)i(statements)e(in)g(\(a\).)p
+3562 2796 4 2393 v 318 2799 3247 4 v 3564 2816 19 2400
+v 335 2816 3247 19 v 914 3011 a FP(Figure)24 b(4.10:)31
+b(T)m(ranslating)26 b(I-rules)f(with)e(enforcer)n(-algorithms)583
+3388 y(The)j(answer)i(is)e(obvious)i(when)f(one)g(considers)i(that)e
+(implicit)g(rules)h(are)e(basically)j(I-rules.)300 3557
+y(Thus,)e(enforcers)i(have)e(support)h(functions)h(\(just)e(like)g
+(explicit)h(algorithms\).)42 b(This)26 b(means)h(that)g(ac-)298
+3727 y(tions)22 b(of)f(an)h(implicit)g(rule)g(can)g(be)f(translated)j
+(as)d(statements)j(in)d(the)h(appropriate)i(support)f(functions.)298
+3896 y(The)f(general)i(mechanism)f(for)f(translating)j(I-rules)f
+(\(Figure)f(4.8\))f(holds)h(for)g(enforcers)h(with)e(one)g(dif-)296
+4066 y(ference:)31 b(the)20 b(test)h FH(T)32 b FP(of)20
+b(an)f(implicit)j(rule)e(is)g(translated)i(to)e FH(T)2248
+4033 y FB(0)2271 4066 y FP(,)g(and)g(is)g(used)h(as)f(a)f(condition)k
+(to)c(bracket)296 4235 y(the)i(set)g(of)f(actions)i FH(Y)993
+4202 y FB(0)1036 4235 y FP(\(as)e(depicted)j(in)d(Figure)h(4.8\(b\)\))g
+(in)f(the)h(do)p 2421 4235 28 4 v 34 w(any)p 2585 4235
+V 34 w(good)g(support)h(function.)32 b(The)300 4404 y(rest)24
+b(of)f(the)h(translation)j(works)d(exactly)h(as)e(for)h(other)h
+(I-rules.)582 4574 y(Figure)e(4.10)g(illustrates)i(the)e(translation)i
+(of)e(the)f(mer)n(ge)h(sort)g(I-rule)h(into)f(two)f(support)i(func-)300
+4743 y(tions)h(\(and)f(no)f(impl)p 968 4743 V 34 w(rules\).)1905
+5349 y(55)p eop
+%%Page: 56 68
+56 67 bop 323 403 3237 4 v 323 3729 4 3327 v 374 859
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.2 true 3.8 neg 6.1651
+neg 140.3733 52.0825 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial -338 x FH(O)443
+535 y Fv(1)483 521 y FH(;)15 b(O)592 535 y Fv(2)632 521
+y FH(;)g(O)741 535 y Fv(3)781 521 y FP(:)31 b(Operator)374
+690 y FH(X)449 704 y Fv(1)489 690 y FH(;)15 b(X)604 704
+y Fv(2)644 690 y FP(:)27 b(Operator)19 b(or)f(Algorithm)374
+859 y FH(E)441 873 y Fv(1)480 859 y FH(;)d(E)587 873
+y Fv(2)627 859 y FH(;)g(E)734 873 y Fv(3)774 859 y FP(:)31
+b(Expression)1376 1207 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -17.07164 0.0 -17.07164
+17.07164 95.60129 17.07164 95.60129 0.0 -17.07164 0.0 /Lineto /lineto
+load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave
+fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+1280 1159 a FH(O)1349 1173 y Fv(1)1414 1159 y FA(=)-15
+b FC(\))25 b FH(O)1655 1173 y Fv(2)1695 1159 y FA(;)15
+b FH(O)1804 1173 y Fv(2)1869 1159 y FA(=)-15 b FC(\))25
+b FH(X)2116 1173 y Fv(1)2297 1207 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745
+4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373
+0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray
+fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+
+@endspecial -921 w @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 157.05902 0.0 157.05902
+17.07164 215.10277 17.07164 215.10277 0.0 157.05902 0.0 /Lineto /lineto
+load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave
+fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+2723 1161 a FH(O)2792 1175 y Fv(1)2857 1161 y FA(=)-15
+b FC(\))24 b FH(X)3103 1175 y Fv(1)2318 1341 y Fy(\(a\))p
+374 1441 3139 4 v 1376 1722 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -17.07164 -11.95009
+-17.07164 29.02173 95.60129 29.02173 95.60129 -11.95009 -17.07164 -11.95009
+ /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow
+0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave
+fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+
+@endspecial 1294 1674 a FH(O)1363 1688 y Fv(1)1428 1674
+y FA(=)-15 b FC(\))25 b FH(O)1669 1688 y Fv(2)1709 1674
+y FA(;)15 b FH(O)1818 1688 y Fv(2)1915 1637 y
+ tx@Dict begin 30. Rot end
+ 1915 1637
+a FA(=)-15 b FC(\))1915 1637 y
+ tx@Dict begin 30. neg Rot end
+ 1915 1637 a 2027 1576
+a FH(X)2102 1590 y Fv(1)1901 1680 y
+ tx@Dict begin -30. Rot end
+ 1901 1680 a FA(=)g
+FC(\))1901 1680 y
+ tx@Dict begin -30. neg Rot end
+ 1901 1680 a 2027 1761 a FH(X)2102 1775
+y Fv(2)2297 1722 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745
+4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373
+0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray
+fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+-921 w @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 157.05902 -11.95009
+157.05902 29.02173 215.10277 29.02173 215.10277 -11.95009 157.05902
+-11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC
+Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray
+gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 2737 1676
+a FH(O)2806 1690 y Fv(1)2850 1637 y
+ tx@Dict begin 30. Rot end
+ 2850 1637 a FA(=)g
+FC(\))2850 1637 y
+ tx@Dict begin 30. neg Rot end
+ 2850 1637 a 2962 1576 a FH(X)3037 1590
+y Fv(1)2836 1680 y
+ tx@Dict begin -30. Rot end
+ 2836 1680 a FA(=)g FC(\))2836 1680
+y
+ tx@Dict begin -30. neg Rot end
+ 2836 1680 a 2962 1761 a FH(X)3037 1775 y Fv(2)2315
+1955 y Fy(\(b\))p 374 2055 3139 4 v 1376 2336 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -17.07164 -11.95009
+-17.07164 29.02173 95.60129 29.02173 95.60129 -11.95009 -17.07164 -11.95009
+ /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow
+0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave
+fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 1277 2190 a FH(O)1346 2204 y
+Fv(1)1376 2180 y
+ tx@Dict begin -30. Rot end
+ 1376 2180 a FA(=)g FC(\))1376 2180 y
+ tx@Dict begin -30. neg Rot end
+
+1376 2180 a 1277 2375 a FH(O)1346 2389 y Fv(2)1390 2350
+y
+ tx@Dict begin 30. Rot end
+ 1390 2350 a FA(=)g FC(\))1390 2350 y
+ tx@Dict begin 30. neg Rot end
+ 1390 2350 a 1544
+2287 a FH(O)1613 2301 y Fv(3)1652 2287 y FA(;)15 b FH(O)1761
+2301 y Fv(3)1827 2287 y FA(=)-15 b FC(\))24 b FH(X)2073
+2301 y Fv(1)2297 2336 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745
+4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373
+0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray
+fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+-921 w @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 157.05902 -11.95009
+157.05902 29.02173 215.10277 29.02173 215.10277 -11.95009 157.05902
+-11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC
+Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray
+gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 2737 2190
+a FH(O)2806 2204 y Fv(1)2836 2180 y
+ tx@Dict begin -30. Rot end
+ 2836 2180 a FA(=)-15
+b FC(\))2836 2180 y
+ tx@Dict begin -30. neg Rot end
+ 2836 2180 a 2737 2375 a FH(O)2806
+2389 y Fv(2)2850 2350 y
+ tx@Dict begin 30. Rot end
+ 2850 2350 a FA(=)g FC(\))2850
+2350 y
+ tx@Dict begin 30. neg Rot end
+ 2850 2350 a 2991 2290 a FH(X)3066 2304 y Fv(1)2318
+2569 y Fy(\(c\))p 374 2669 3139 4 v 1376 2851 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -17.07164 0.0 -17.07164
+17.07164 95.60129 17.07164 95.60129 0.0 -17.07164 0.0 /Lineto /lineto
+load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave
+fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial 1287 2802 a FH(E)1354 2816 y
+Fv(1)1419 2802 y FA(=)g FC(\))25 b FH(E)1658 2816 y Fv(2)1697
+2802 y FA(;)15 b FH(E)1804 2816 y Fv(3)1869 2802 y FA(=)-15
+b FC(\))25 b FH(X)2116 2816 y Fv(1)1702 2879 y
+ tx@Dict begin -90. Rot end
+ 1702 2879
+a 1797 2950 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745
+4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373
+0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray
+fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+1702 2879 a
+ tx@Dict begin -90. neg Rot end
+ 1702 2879 a 1376 2851 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -17.07164 -75.1151
+-17.07164 -58.04346 95.60129 -58.04346 95.60129 -75.1151 -17.07164
+-75.1151 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC
+Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray
+gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+
+@endspecial 1280 3426 a FH(O)1349 3440 y Fv(1)1414 3426
+y FA(=)-15 b FC(\))25 b FH(O)1655 3440 y Fv(2)1695 3426
+y FA(;)15 b FH(O)1804 3440 y Fv(2)1869 3426 y FA(=)-15
+b FC(\))25 b FH(X)2116 3440 y Fv(1)2297 3475 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745
+4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373
+0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray
+fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial 1376 2851 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 157.05902 -75.1151
+157.05902 -58.04346 215.10277 -58.04346 215.10277 -75.1151 157.05902
+-75.1151 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC
+Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray
+gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+
+@endspecial 2723 3428 a FH(O)2792 3442 y Fv(1)2857 3428
+y FA(=)-15 b FC(\))24 b FH(X)3103 3442 y Fv(1)2315 3608
+y Fy(\(d\))p 3557 3729 4 3327 v 323 3732 3237 4 v 3558
+3749 19 3334 v 340 3749 3237 19 v 1405 3945 a FP(Figure)g(4.1)m(1:)31
+b(Rule)24 b(compaction)300 4322 y FO(4.5)119 b(Rule)31
+b(Compaction)583 4585 y FP(Rule)23 b(compaction)i(is)e(a)f(technique)k
+(by)d(which)g(the)h(P2V)d(preprocessor)27 b(generates)e(a)e(smaller)300
+4754 y(set)31 b(of)f(rules)i(from)e(a)h(typically)i(lar)n(ge)f(rule)f
+(set.)52 b(This)31 b(has)g(a)f(direct)i(bearing)g(on)f(the)g(ef)n
+(\256ciency)h(of)300 4924 y(the)e(generated)i(optimizer)l(,)h(since)d
+(a)g(smaller)g(rule)g(set)g(results)h(in)f(a)f(more)g(ef)n(\256cient)i
+(optimizer)h(\(see)300 5093 y(Appendix)25 b(B)e(for)g(a)g(more)h
+(formal)g(ar)n(gument)i(for)d(rule)h(compaction\).)1905
+5349 y(56)p eop
+%%Page: 57 69
+57 68 bop 582 391 a FP(The)22 b(basic)i(idea)f(in)f(rule)i(compaction)g
+(by)f(the)g(P2V)e(preprocessor)26 b(is)d(that)g(transitive)i(rewrite)
+300 561 y(rules)f(can)g(be)f(replaced)i(with)e(a)g(single)i(rule.)31
+b(In)23 b(other)h(words,)g(if)f(a)g(rule)g(transforms)j(one)d
+(expression)299 730 y(into)g(another)h(which)f(is,)f(in)g(turn,)h
+(transformed)i(into)e(a)f(third)h(expression)j(by)c(a)g(second)i(rule,)
+f(then)g(the)300 899 y(two)g(rules)i(can)f(be)g(replaced)i(with)d(a)g
+(single)j(rule)e(that)g(directly)i(transforms)f(the)f(original)i
+(expression)297 1069 y(into)c(the)g(\256nal)f(one.)30
+b(This)21 b(general)i(principle)h(of)d(rule)h(compaction)h(results)g
+(in)e(four)h(speci\256c)g(cases,)h(as)298 1238 y(shown)g(in)f(Figure)h
+(4.1)m(1.)30 b(The)22 b(compaction)i(algorithm)g(is)e(not)h(as)f
+(simple)g(as)g(it)g(seems)h(at)f(\256rst)g(glance,)300
+1408 y(since)j(rules)f(have)g(actions)i(which)e(have)g(to)f(meet)h
+(certain)h(criteria)g(to)f(be)f(compacted.)583 1577 y(Rule)j
+(compaction)i(works)e(by)f(progressively)30 b(reducing)d(pairs)g(of)e
+(rules)i(to)e(single)i(rules.)37 b(In)300 1746 y(general,)28
+b(the)f(\256rst)e(rule)i(in)f(the)g(pair)h(consists)h(of)e(a)g(T)-8
+b(-rule)26 b(transforming)j(an)d(operator)i(into)f(another)-5
+b(.)300 1916 y(The)26 b(second)h(rule)g(in)f(the)h(pair)f(can)h(either)
+g(be)f(a)g(T)-8 b(-rule)26 b(or)g(an)g(I-rule.)40 b(The)26
+b(actions)h(of)g(a)e(compacted)296 2085 y(rule)20 b(set)g(are)g
+(derived)i(from)d(the)h(actions)i(of)d(the)h(last)h(of)e(the)h
+(sequence)i(of)e(the)g(rules)h(being)g(compacted.)580
+2254 y(Consider)i(Figure)e(4.1)m(1\(b\))h(as)e(an)h(example.)31
+b(The)21 b(Prairie)g(rule)g(set)g(being)h(compacted)h(can)e(be)300
+2424 y(viewed)j(as)g(consisting)i(of)e(two)f(pairs)h(of)g(rules,)396
+2668 y FH(O)465 2682 y Fv(1)530 2668 y FA(=)-15 b FC(\))24
+b FH(O)770 2682 y Fv(2)810 2668 y FA(;)15 b FH(O)919
+2682 y Fv(2)985 2668 y FA(=)-15 b FC(\))24 b FH(X)1231
+2682 y Fv(1)383 2862 y FH(O)452 2876 y Fv(1)517 2862
+y FA(=)-15 b FC(\))25 b FH(O)758 2876 y Fv(2)798 2862
+y FA(;)15 b FH(O)907 2876 y Fv(2)972 2862 y FA(=)-15
+b FC(\))25 b FH(X)1219 2876 y Fv(2)1258 2862 y FH(;)292
+3106 y FP(where)17 b(the)g(second)h(rule)f(in)f(each)h(pair)g(is)f
+(either)i(a)e(T)-8 b(-rule)16 b(or)h(an)f(I-rule)i(\(depending)h(on)e
+(whether)g FH(X)3421 3120 y Fv(1)3477 3106 y FP(and)299
+3276 y FH(X)374 3290 y Fv(2)436 3276 y FP(are)22 b(operators)k(or)c
+(algorithms\).)33 b(It)22 b(is)h(clear)g(from)g(the)g(above)h(that)f
+(each)g(pair)g(of)g(rules)g(represents)300 3445 y(a)28
+b(transitive)i(mapping:)42 b(the)28 b(\256rst,)h(from)f
+FH(O)1720 3459 y Fv(1)1787 3445 y FP(to)g FH(X)1960 3459
+y Fv(1)1999 3445 y FP(,)g(and)h(the)f(second,)j(from)d
+FH(O)2924 3459 y Fv(1)2991 3445 y FP(to)g FH(X)3164 3459
+y Fv(2)3203 3445 y FP(.)44 b(The)27 b(P2V)300 3614 y(preprocessor)l(,)
+36 b(thus,)d(reduces)g(the)e(three)h(Prairie)f(rules)h(shown)f(above,)j
+(to)c(two)h(V)-12 b(olcano)32 b(rules,)h(as)300 3784
+y(Figure)24 b(4.1)m(1\(b\))h(shows.)31 b(Figures)24 b(4.1)m(1\(a\))h
+(and)f(4.1)m(1\(c\))2109 3751 y Fv(4)2172 3784 y FP(depict)h(similar)g
+(compactions.)583 3953 y(An)f(interesting)j(case)d(of)g(rule)g
+(compaction)j(is)c(shown)i(in)f(Figure)g(4.1)m(1\(d\).)33
+b(The)23 b(Prairie)i(rule)298 4122 y(set)e(being)g(compacted)h
+(consists)g(of)e(a)g(T)-8 b(-rule)22 b(transforming)j
+FH(E)2325 4136 y Fv(1)2385 4122 y FP(to)d FH(E)2544 4136
+y Fv(2)2584 4122 y FP(,)f(and)i(another)g(rule)g(that)g(trans-)300
+4292 y(forms)28 b FH(E)606 4306 y Fv(3)672 4292 y FP(to)f
+FH(X)844 4306 y Fv(1)884 4292 y FP(.)42 b(Expressions)30
+b FH(E)1482 4306 y Fv(1)1521 4292 y FP(,)d FH(E)1638
+4306 y Fv(2)1678 4292 y FP(,)g FH(E)1795 4306 y Fv(3)1862
+4292 y FP(may)g(consist)i(of)e(enforcer)n(-operators)q(.)47
+b(Now)-6 b(,)28 b(as)f(de-)300 4461 y(scribed)32 b(in)d(Section)i
+(4.2.1,)g(enforcer)n(-operators)36 b(are)30 b(discarded)i(when)e
+(expressions)j(and)d(rules)h(are)300 4630 y(translated)c(from)e
+(Prairie)h(to)e(V)-12 b(olcano)27 b(by)e(the)g(P2V)e(preprocessor)-5
+b(.)39 b(It)24 b(is,)h(thus,)h(possible,)h(that)e(when)297
+4800 y(enforcer)n(-operators)h(are)21 b(deleted)h(from)f
+FH(E)1663 4814 y Fv(1)1702 4800 y FP(,)g FH(E)1813 4814
+y Fv(2)1852 4800 y FP(,)f(and)h FH(E)2113 4814 y Fv(3)2153
+4800 y FP(,)f(that)h(expression)j FH(E)2828 4814 y Fv(1)2887
+4800 y FP(is)d(transformed)i(to)d(an)p 300 4881 1320
+4 v 400 4935 a Fu(4)434 4966 y Fy(This)14 b(compaction)h(is)e
+(currently)h(not)g(implemented)g(in)g(the)f(P2V)h(preprocessor)h
+(because,)g(in)f(our)g(experience,)h(it)e(usually)300
+5058 y(does)20 b(not)f(occur)l(.)25 b(However)m(,)19
+b(there)g(is)g(no)g(technical)h(dif)o(\256culty)e(in)h(implementing)h
+(it.)1905 5349 y FP(57)p eop
+%%Page: 58 70
+58 69 bop 323 403 3237 4 v 323 3246 4 2843 v 943 624
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -68.28656 -5.12154
+-68.28656 22.19318 78.52965 22.19318 78.52965 -5.12154 -68.28656 -5.12154
+ /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow
+0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave
+fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 414 522 a Fh(LEFT)p
+535 522 15 4 v 19 w(OUTER)p 719 522 V 19 w(JOIN)o Fu(\()p
+Fn(S)904 532 y Fg(1)937 522 y Fn(;)10 b(S)1004 532 y
+Fg(2)1036 522 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p
+Fu(\()p Fn(S)1362 532 y Fg(1)1394 522 y Fn(;)11 b(S)1462
+532 y Fg(2)1494 522 y Fu(\))414 609 y Fh(JOIN)p Fu(\()p
+Fn(S)584 619 y Fg(1)616 609 y Fn(;)f(S)683 619 y Fg(2)715
+609 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Nested)p 1012
+609 V 19 w(loops)p Fu(\()p Fn(S)1198 619 y Fg(1)1230
+609 y Fn(;)10 b(S)1297 619 y Fg(2)1329 609 y Fu(\))1673
+624 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745
+4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373
+0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray
+fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial -730 w @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 131.45157 -5.12154
+131.45157 22.19318 307.28952 22.19318 307.28952 -5.12154 131.45157
+-5.12154 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC
+Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray
+gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 2077 565 a(\()p Fh(LEFT)p 2222
+565 V 19 w(OUTER)p 2406 565 V 19 w(JOIN)17 b Fu(\(?1)h(?2\)\))g
+Ft(!)g Fu(\()p Fh(Nested)p 3017 565 V 18 w(loops)f Fu(\(?1)h(?2\)\))
+1884 772 y Fy(\(a\))p 374 872 3122 4 v 943 1153 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -68.28656 -11.95009
+-68.28656 29.02173 78.52965 29.02173 78.52965 -11.95009 -68.28656 -11.95009
+ /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow
+0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave
+fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 414 1008 a Fh(LEFT)p 535 1008
+15 4 v 19 w(OUTER)p 719 1008 V 19 w(JOIN)o Fu(\()p Fn(S)904
+1018 y Fg(1)937 1008 y Fn(;)10 b(S)1004 1018 y Fg(2)1036
+1008 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p Fu(\()p
+Fn(S)1362 1018 y Fg(1)1394 1008 y Fn(;)11 b(S)1462 1018
+y Fg(2)1494 1008 y Fu(\))414 1095 y Fh(JOIN)p Fu(\()p
+Fn(S)584 1105 y Fg(1)616 1095 y Fn(;)f(S)683 1105 y Fg(2)715
+1095 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Nested)p 1012
+1095 V 19 w(loops)p Fu(\()p Fn(S)1198 1105 y Fg(1)1230
+1095 y Fn(;)10 b(S)1297 1105 y Fg(2)1329 1095 y Fu(\))414
+1182 y Fh(JOIN)p Fu(\()p Fn(S)584 1192 y Fg(1)616 1182
+y Fn(;)g(S)683 1192 y Fg(2)715 1182 y Fu(\))18 b(=)-11
+b Ft(\))17 b Fh(Mer)o(ge)p 1003 1182 V 19 w(join)o Fu(\()p
+Fn(S)1158 1192 y Fg(1)1190 1182 y Fn(;)11 b(S)1258 1192
+y Fg(2)1290 1182 y Fu(\))1673 1153 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745
+4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373
+0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray
+fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+
+@endspecial -730 w @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 131.45157 -11.95009
+131.45157 29.02173 307.28952 29.02173 307.28952 -11.95009 131.45157
+-11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC
+Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray
+gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial
+2077 1051 a(\()p Fh(LEFT)p 2222 1051 V 19 w(OUTER)p 2406
+1051 V 19 w(JOIN)17 b Fu(\(?1)h(?2\)\))g Ft(!)g Fu(\()p
+Fh(Nested)p 3017 1051 V 18 w(loops)f Fu(\(?1)h(?2\)\))2077
+1138 y(\()p Fh(LEFT)p 2222 1138 V 19 w(OUTER)p 2406 1138
+V 19 w(JOIN)f Fu(\(?1)h(?2\)\))g Ft(!)g Fu(\()p Fh(Mer)o(ge)p
+3008 1138 V 18 w(join)f Fu(\(?1)h(?2\)\))1882 1358 y
+Fy(\(b\))p 374 1457 3122 4 v 943 1739 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -68.28656 -11.95009
+-68.28656 29.02173 78.52965 29.02173 78.52965 -11.95009 -68.28656 -11.95009
+ /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow
+0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave
+fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 414 1593 a Fh(LEFT)p 535 1593
+15 4 v 19 w(OUTER)p 719 1593 V 19 w(JOIN)o Fu(\()p Fn(S)904
+1603 y Fg(1)937 1593 y Fn(;)10 b(S)1004 1603 y Fg(2)1036
+1593 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p Fu(\()p
+Fn(S)1362 1603 y Fg(1)1394 1593 y Fn(;)11 b(S)1462 1603
+y Fg(2)1494 1593 y Fu(\))414 1680 y Fh(RIGHT)p 569 1680
+V 18 w(OUTER)p 752 1680 V 19 w(JOIN)p Fu(\()p Fn(S)938
+1690 y Fg(1)970 1680 y Fn(;)f(S)1037 1690 y Fg(2)1069
+1680 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)o Fu(\()p
+Fn(S)1395 1690 y Fg(1)1428 1680 y Fn(;)10 b(S)1495 1690
+y Fg(2)1527 1680 y Fu(\))414 1768 y Fh(JOIN)p Fu(\()p
+Fn(S)584 1778 y Fg(1)616 1768 y Fn(;)g(S)683 1778 y Fg(2)715
+1768 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Nested)p 1012
+1768 V 19 w(loops)p Fu(\()p Fn(S)1198 1778 y Fg(1)1230
+1768 y Fn(;)10 b(S)1297 1778 y Fg(2)1329 1768 y Fu(\))1673
+1739 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745
+4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373
+0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray
+fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial -730 w
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 131.45157 -11.95009
+131.45157 29.02173 307.28952 29.02173 307.28952 -11.95009 131.45157
+-11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC
+Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray
+gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 2077 1637 a(\()p
+Fh(LEFT)p 2222 1637 V 19 w(OUTER)p 2406 1637 V 19 w(JOIN)17
+b Fu(\(?1)h(?2\)\))g Ft(!)g Fu(\()p Fh(Nested)p 3017
+1637 V 18 w(loops)f Fu(\(?1)h(?2\)\))2077 1724 y(\()p
+Fh(RIGHT)p 2256 1724 V 18 w(OUTER)p 2439 1724 V 19 w(JOIN)f
+Fu(\(?1)h(?2\)\))g Ft(!)g Fu(\()p Fh(Nested)p 3050 1724
+V 18 w(loops)g Fu(\(?1)g(?2\)\))1884 1943 y Fy(\(c\))p
+374 2043 3122 4 v 943 2268 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -68.28656 -5.12154
+-68.28656 22.19318 78.52965 22.19318 78.52965 -5.12154 -68.28656 -5.12154
+ /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow
+0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave
+fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+
+@endspecial 414 2166 a Fh(JOIN)p Fu(\()p Fn(S)584 2176
+y Fg(1)616 2166 y Fn(;)10 b(S)683 2176 y Fg(2)715 2166
+y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOPR)q Fu(\()p Fh(SOR)m(T)p
+Fu(\()p Fn(S)1198 2176 y Fg(1)1230 2166 y Fu(\))p Fn(;)11
+b Fh(SOR)m(T)p Fu(\()p Fn(S)1470 2176 y Fg(2)1502 2166
+y Fu(\)\))414 2253 y Fh(JOPR)p Fu(\()p Fn(S)592 2263
+y Fg(1)624 2253 y Fn(;)g(S)692 2263 y Fg(2)724 2253 y
+Fu(\))17 b(=)-11 b Ft(\))18 b Fh(Nested)p 1021 2253 15
+4 v 18 w(loops)p Fu(\()p Fn(S)1206 2263 y Fg(1)1238 2253
+y Fn(;)11 b(S)1306 2263 y Fg(2)1338 2253 y Fu(\))985
+2339 y
+ tx@Dict begin -90. Rot end
+ 985 2339 a 1080 2410 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745
+4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373
+0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray
+fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+
+@endspecial 985 2339 a
+ tx@Dict begin -90. neg Rot end
+ 985 2339 a 943 2268 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -68.28656 -90.47974
+-68.28656 -63.16501 78.52965 -63.16501 78.52965 -90.47974 -68.28656
+-90.47974 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC
+Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray
+gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 414 2874 a Fh(JOIN)p Fu(\()p
+Fn(S)584 2884 y Fg(1)616 2874 y Fn(;)f(S)683 2884 y Fg(2)715
+2874 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOPR)q Fu(\()p
+Fn(S)1050 2884 y Fg(1)1082 2874 y Fn(;)10 b(S)1149 2884
+y Fg(2)1181 2874 y Fu(\))414 2962 y Fh(JOPR)p Fu(\()p
+Fn(S)592 2972 y Fg(1)624 2962 y Fn(;)h(S)692 2972 y Fg(2)724
+2962 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(Nested)p 1021
+2962 15 4 v 18 w(loops)p Fu(\()p Fn(S)1206 2972 y Fg(1)1238
+2962 y Fn(;)11 b(S)1306 2972 y Fg(2)1338 2962 y Fu(\))1673
+2976 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745
+4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373
+0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray
+fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial 943 2268
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 131.45157 -90.47974
+131.45157 -63.16501 307.28952 -63.16501 307.28952 -90.47974 131.45157
+-90.47974 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC
+Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray
+gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 2077 2918 a(\()p
+Fh(JOIN)17 b Fu(\(?1)h(?2\)\))g Ft(!)g Fu(\()p Fh(Nested)p
+2696 2918 V 18 w(loops)g Fu(\(?1)f(?2\)\))1882 3124 y
+Fy(\(d\))p 3557 3246 4 2843 v 323 3249 3237 4 v 3558
+3265 19 2850 v 340 3265 3237 19 v 300 3461 a FP(Figure)j(4.12:)29
+b(Examples)20 b(of)f(rule)h(compaction)i(\(cf.)29 b(Figure)20
+b(4.1)m(1\).)30 b(The)19 b(left)g(sides)h(show)g(Prairie)g(rule)300
+3574 y(sets,)30 b(the)f(right)h(sides)f(are)g(V)-12 b(olcano)30
+b(rule)g(sets.)46 b(For)28 b(clarity)-6 b(,)32 b(descriptors)f(in)e
+(the)g(Prairie)g(rules,)i(and)300 3687 y(operator)26
+b(and)e(algorithm)h(ar)n(guments)h(in)d(the)h(V)-12 b(olcano)25
+b(rules,)f(are)g(omitted,)g(as)g(are)f(all)h(rule)g(actions.)299
+4064 y(operator)g FH(O)692 4078 y Fv(1)732 4064 y FP(,)e(and)h
+(expressions)j FH(E)1443 4078 y Fv(2)1504 4064 y FP(and)d
+FH(E)1724 4078 y Fv(3)1785 4064 y FP(are)g(transformed)h(into)g
+(operator)g FH(O)2935 4078 y Fv(2)2975 4064 y FP(.)30
+b(This)22 b(means)h(that)300 4233 y FH(E)367 4247 y Fv(2)430
+4233 y FP(and)h FH(E)651 4247 y Fv(3)714 4233 y FD(unify)894
+4200 y Fv(5)958 4233 y FP(to)g(the)g(operator)i FH(O)1581
+4247 y Fv(2)1620 4233 y FP(.)31 b(As)24 b(shown)g(in)g(Figure)g(4.1)m
+(1\(d\),)h(this)f(compaction)i(reduces)300 4403 y(to)d(the)h(one)g(in)g
+(Figure)g(4.1)m(1\(a\).)578 4572 y(As)18 b(mentioned)j(earlier)l(,)g
+(there)e(are)g(certain)i(restrictions)g(on)e(the)g(form)g(and)g
+(actions)h(of)f(the)g(\256rst)296 4741 y(T)-8 b(-rule)19
+b(in)h(each)g(pair)g(that)g(is)g(compacted.)31 b(First,)20
+b(the)g(arity)g(\(i.e.,)g(the)g(number)g(of)g(inputs\))h(of)e(the)h
+(opera-)p 300 4822 1320 4 v 400 4876 a Fu(5)434 4908
+y Fy(This)g(process)h(is)f(called)g(uni\256cation)h(because)g(it)f(is)f
+(similar)h(to)g(the)g(technique)h(used)g(in)f(automatic)h(theorem)g
+(proving)300 4999 y(by)e(resolution)h(in)f(\256rst-order)f(logic)h
+(\(see,)g(e.g.,)f([18]\).)1905 5349 y FP(58)p eop
+%%Page: 59 71
+59 70 bop 297 391 a FP(tors)21 b(on)g(each)h(side)f(of)g(the)g(rule)h
+(must)f(be)f(the)i(same.)30 b(Second,)21 b(the)h(test)f(for)g(the)g(T)
+-8 b(-rule)21 b(must)g(be)g(TRUE)298 561 y(\(i.e.,)h(the)g(rule)g(must)
+g(be)g(unconditionally)k(applicable\).)34 b(Third,)22
+b(the)g(actions)h(\(pre-test)h(and)f(post-test\))293
+730 y(in)16 b(the)h(T)-8 b(-rule)17 b(must)g(consist)h(either)g(of)f
+(\(1\))g(descriptor)i(assignment)g(statements)g(that)e(copy)h(the)f
+(descrip-)296 899 y(tors)k(of)f(the)g(corresponding)k(expressions)g(on)
+c(either)h(side)g(of)f(the)g(rule,)h(or)f(\(2\))h(assignment)h
+(statements)300 1069 y(that)j(are)f(translated)j(to)d(NO)p
+1202 1069 28 4 v 32 w(OP)f(by)h(the)h(preprocessor)j(\(an)c(example)i
+(is)e(the)h(statement)h(numbered)g(6)300 1238 y(in)i(Figure)h
+(4.6\(a\)\).)47 b(The)28 b(reason)i(for)e(these)i(restrictions)i(is)c
+(simple.)46 b(Since)29 b(rule)g(compaction)h(gen-)300
+1408 y(erates)e(a)d(smaller)j(rule)e(set)h(in)f(the)h
+FD(most)f(general)i(case)p FP(,)g(it)e(must)g(always)h(be)f(the)h(case)
+g(that)g(applying)299 1577 y(the)c(uncompacted)j(rule)d(set)g(to)g
+FD(any)g FP(expression)j(must)d(have)g(the)g(same)g(ef)n(fect)h(as)f
+(applying)i(the)e(com-)300 1746 y(pacted)h(rule)g(set)f(to)h(the)f
+(same)g(expression)j(\(i.e.,)d(the)g(two)g(rule)h(sets)g(must)f(be)g
+FD(equivalent)q FP(\).)34 b(Since)23 b(the)300 1916 y(P2V)f
+(preprocessor)28 b(does)c(not)g(know)g(the)f(semantics)j(of)d(rule)h
+(actions,)h(it)e(checks)j(for)d(syntactic)j(hints)295
+2085 y(\(a)18 b(TRUE)e(test,)k(descriptor)h(assignment)g(statements,)g
+(NO)p 2176 2085 V 32 w(OP)c(statements\))k(that)e(indicates)i(that)f
+(com-)298 2254 y(paction)k(yields)g(an)e(equivalent)j(rule)e(set.)30
+b(It)22 b(may)g(be)g(possible)j(to)d(incorporate)j(semantic)f
+(knowledge)300 2424 y(of)h(rules)g(in)g(the)g(P2V)f(preprocessor)k(to)d
+(produce)i(even)f(greater)g(rule)f(compaction;)k(however)l(,)d(this)f
+(is)300 2593 y(beyond)g(the)f(scope)h(of)e(this)h(dissertation.)581
+2762 y(Figure)e(4.12)g(shows)f(an)h(example)g(of)g(rule)f(compaction)j
+(corresponding)i(to)21 b(each)h(of)f(the)h(four)300 2932
+y(general)32 b(cases)f(in)e(Figure)i(4.1)m(1.)50 b(Apart)30
+b(from)g(the)g(familiar)h(relational)h(operators)h(and)d(algorithms)300
+3101 y(we)f(have)i(already)g(encountered,)k(Figure)30
+b(4.12)g(introduces)j(some)c(new)h(operators.)52 b(An)29
+b(outer)i(join)297 3271 y([41])22 b(is)f(a)g(generalization)k(of)c(the)
+g(traditional)j(join)e(operator)h(\(or)f(natural)g(join\).)31
+b(It)21 b(produces)j(a)c(stream)300 3440 y(that)33 b(contains)i(tuples)
+f(whose)g(join)f(attributes)j(are)d(unmatched)h(according)i(to)d(the)g
+(join)g(predicate.)300 3609 y(The)g(outer)i(join)g(operation)h(has)e
+(two)g(special)h(cases)g(depending)i(on)d(whether)g(the)h(outer)f(or)g
+(inner)300 3779 y(streams)24 b(contribute)j(unmatched)f(tuples.)32
+b(These)24 b(two)f(operators)j(are)e(called)g(LEFT)p
+3041 3779 V 31 w(OUTER)p 3377 3779 V 31 w(JOIN)298 3948
+y(and)e(RIGHT)p 734 3948 V 32 w(OUTER)p 1071 3948 V 30
+w(JOIN,)f(respectively)-6 b(.)34 b(As)21 b(shown)h(on)g(the)g(left)g
+(side)g(of)g(Figure)g(4.12\(c\),)h(these)300 4117 y(two)k(outer)i(join)
+g(operators)h(can)e(be)g(transformed)i(into)f(the)f(JOIN)f(operator)l
+(,)k(if)c(it)h(is)f(known)i(that)f(no)300 4287 y(unmatched)e(tuples)f
+(result.)579 4456 y(The)19 b(operator)j(JOPR)c(is)i(exactly)h(like)f
+(JOIN,)f(except)i(that)f(it)g(expects)h(its)f(inputs)h(to)f(be)f
+(sorted.)300 4625 y(The)29 b(JOPR)g(operator)i(is)f(needed)i(in)d
+(Prairie)i(in)e(order)i(to)f(introduce)i(the)e(explicit)i(operator)g
+(SOR)-5 b(T)e(.)300 4795 y(However)l(,)33 b(the)e(P2V)e(preprocessor)34
+b(identi\256es)f(SOR)-5 b(T)27 b(as)k(an)f(enforcer)n(-operator)36
+b(\(as)31 b(described)i(in)300 4964 y(Section)24 b(4.2.1\),)g(and)g
+(deletes)h(it,)e(resulting)j(in)e(the)f(rule)h(compaction)i(shown)e(in)
+g(Figure)g(4.12\(d\).)1905 5349 y(59)p eop
+%%Page: 60 72
+60 71 bop 300 391 a FO(4.6)119 b(Summary)300 654 y FP(In)27
+b(this)h(chapter)l(,)i(we)c(described)j(the)f(Prairie-to-V)-12
+b(olcano)31 b(preprocessor)g(that)c(generates)j(a)d(V)-12
+b(olcano)300 824 y(rule)26 b(speci\256cation)i(from)e(a)f(Prairie)h
+(speci\256cation.)39 b(The)26 b(obvious)h(advantage)h(of)e(using)h(the)
+e(prepro-)298 993 y(cessor)f(is)d(that)i(a)e(DBI)g(can)h(specify)i
+(rules)f(in)f(a)f(high-level)k(abstract)f(framework)f(\(Prairie\),)g
+(while)f(the)300 1162 y(preprocessor)28 b(can)d(generate)h(a)e(lower)n
+(-level)j(speci\256cation)g(\(V)-12 b(olcano\))26 b(that)f(takes)g
+(into)g(account)i(im-)300 1332 y(plementation)i(details.)40
+b(This)26 b(generator)n(-based)k(approach)f(means)d(that)h(the)f(DBI)f
+(is)h(insulated)i(from)293 1501 y(the)18 b(actual)h(implementation)h
+(and)e(internal)i(representation)h(of)d(the)f(features)j(of)d(the)h
+(optimizer)-5 b(.)30 b(In)18 b(fact,)300 1671 y(it)24
+b(is)f(possible)k(to)c(imagine)i(a)f(scenario)i(where)e(the)g
+(preprocessor)k(translates)e(a)e(Prairie)g(speci\256cation)300
+1840 y(suitable)30 b(for)e(another)h(\(non-V)-12 b(olcano\))31
+b(rule)e(engine,)h(if)d(it)g(turns)i(out)f(that)g(the)g(V)-12
+b(olcano)29 b(rule)g(engine)300 2009 y(is)23 b(not)h(appropriate)j(for)
+d(the)g(DBI.)e(Another)j(advantage)h(of)e(the)g(P2V)e(preprocessor)l(,)
+28 b(as)23 b(described)j(in)300 2179 y(Section)i(4.5,)f(is)f(that)h(it)
+g(is)f(possible)j(to)e(\252optimize\272)i(the)e(rule)g(set)g(itself,)h
+(i.e.,)e(to)h(add)g(\252intelligence\272)298 2348 y(in)21
+b(the)h(preprocessor)j(to)c(generate)i(small)f(rule)g(sets.)31
+b(This)21 b(approach)j(carries)e(great)h(potential,)h(and,)e(in)300
+2517 y(particular)l(,)30 b(as)c(we)g(will)g(see)g(in)g(Chapter)i(6,)e
+(can)h(be)f(used)i(to)e(generate)i(compact)g(rule)f(sets)g(from)f(the)
+300 2687 y(building-blocks)i(used)d(in)e(recon\256gurable)k
+(optimizers.)583 2856 y(High-level)k(abstractions,)i(like)d(Prairie,)g
+(can)f(result)h(in)e(inef)n(\256cient)j(optimizers)g(unless)f(the)300
+3025 y(P2V)25 b(preprocessor)30 b(translates)f(Prairie)e(rules)g(into)g
+(the)g(appropriate)i(implementation-level)j(details)300
+3195 y(of)d(V)-12 b(olcano.)48 b(In)29 b(this)g(chapter)l(,)j(we)c
+(described)j(the)e(translation)j(process.)49 b(In)28
+b(the)h(next)h(chapter)l(,)i(we)300 3364 y(evaluate)e(the)e(ef)n
+(\256ciency)i(of)e(the)g(resulting)j(V)-12 b(olcano)29
+b(optimizer)h(by)e(optimizing)i(some)e(benchmark)300
+3534 y(queries.)1905 5349 y(60)p eop
+%%Page: 61 73
+61 72 bop 2859 1118 a FG(Chapter)44 b(5)1759 1657 y FM(Performance)50
+b(Results)297 2159 y FP(In)20 b(the)g(last)h(chapter)l(,)i(we)d
+(described)j(the)d(P2V)f(preprocessor)24 b(that)d(translates)i(a)d
+(Prairie)h(rule)g(set)f(speci-)294 2328 y(\256cation)e(into)h(a)e(V)-12
+b(olcano)19 b(speci\256cation.)31 b(One)18 b(important)h(aspect)g(of)f
+(this)g(translation)j(is)c(performance.)295 2498 y(Namely)-6
+b(,)20 b(how)g(does)g(an)f(optimizer)i(generated)h(from)e(a)f(Prairie)g
+(speci\256cation)k(compare)d(with)f(an)h(opti-)294 2667
+y(mizer)e(generated)j(from)d(a)g(hand-written)i(V)-12
+b(olcano)20 b(speci\256cation?)32 b(In)18 b(this)h(chapter)l(,)i(we)c
+(present)j(some)300 2836 y(experimental)26 b(evidence)g(that)e
+(performance)i(is)e(not)g(sacri\256ced)h(by)e(specifying)k(rules)d(in)g
+(Prairie.)300 3203 y FO(5.1)119 b(Overview)300 3466 y
+FP(Performance)31 b(of)e(rule-based)j(optimizers)f(is)e(one)g(of)h(the)
+f(four)h(goals)g(that)g(we)e(identi\256ed)j(in)e(Chap-)300
+3635 y(ter)g(1.)46 b(This)29 b(becomes)h(clear)f(when)g(we)f(consider)j
+(that)e(Prairie')-5 b(s)30 b(programming)h(environment)h(has)294
+3805 y(limited)19 b(impact)f(if)g(it)g(sacri\256ces)h(performance)i(in)
+d(its)g(quest)h(for)f(abstractions)k(and)c(extensibility)-6
+b(.)33 b(Con-)299 3974 y(sequently)-6 b(,)25 b(some)d(evidence)j(is)d
+(required)i(that)f(ef)n(\256cient)h(optimizers)g(can)f(be)f(generated)j
+(from)d(Prairie)300 4144 y(speci\256cations.)583 4313
+y(In)k(this)h(chapter)l(,)h(we)d(present)j(experimental)h(results)e
+(using)h(two)d(dif)n(ferent)k(optimizers)f(that)300 4482
+y(are)j(each)h(speci\256ed)g(using)g(Prairie)g(and)f(V)-12
+b(olcano.)55 b(T)-6 b(o)29 b(avoid)j(claims)g(of)f(\252doctored)i
+(up\272)f(V)-12 b(olcano)300 4652 y(speci\256cations)33
+b(\(to)e(give)g(Prairie)g(an)f(unfair)i(advantage\),)j(we)29
+b(use)i(two)f(V)-12 b(olcano)32 b(rule)f(sets)f(written)300
+4821 y(by)24 b(other)h(researchers)i(as)c(points)j(of)d(comparison.)35
+b(The)23 b(\256rst)g(rule)i(speci\256cation)h(is)e(that)g(of)g(a)g
+(simple)300 4990 y(centralized)31 b(optimizer)e(that)f(contains)i(a)d
+(subset)i(of)e(the)h(relational)i(database)g(operators,)h(and)d(has)g
+(a)1905 5349 y(61)p eop
+%%Page: 62 74
+62 73 bop 297 391 a FP(fairly)23 b(simple)f(cost)f(model.)31
+b(The)21 b(second)i(rule)e(set)h(speci\256es)g(an)g(optimizer)g(for)g
+(a)f(lar)n(ge-scale)j(object-)300 561 y(oriented)32 b(database.)51
+b(Both)29 b(of)h(these)h(rule)f(sets)g(were)f(re-engineered)34
+b(\(i.e.,)c(rewritten\))h(into)g(Prairie)300 730 y(speci\256cations,)e
+(from)d(which)g(V)-12 b(olcano)27 b(speci\256cations)i(were)c(obtained)
+j(by)e(using)h(the)f(P2V)e(prepro-)298 899 y(cessor)f(described)i(in)d
+(the)g(last)g(chapter)-5 b(.)1570 866 y Fv(1)1642 899
+y FP(The)21 b(two)h(optimizers)h(\(P2V)-8 b(-generated)25
+b(and)d(hand-written\))300 1069 y(were)h(then)i(compared)g(for)f(ef)n
+(\256ciency)h(by)f(optimizing)h(a)f(random)g(set)g(of)f(operator)j
+(trees.)581 1238 y(The)20 b(problem)i(of)f(developing)j(a)c(set)h(of)g
+(representative)k(benchmark)e(queries)f(to)f(test)h(a)e(query)296
+1408 y(processing)j(system)e(is)f(a)f(well-researched)24
+b(topic)d([13,)16 b(14,)g(32,)g(42].)30 b(However)l(,)21
+b(standard)h(benchmark)300 1577 y(queries)30 b(were)d(not)h(very)h
+(useful)g(in)f(our)g(case)h(for)f(various)h(reasons.)46
+b(For)27 b(example,)j(the)e(W)l(isconsin)300 1746 y(benchmark)j([13])f
+(consists)h(of)e(no)g(queries)i(with)e(more)g(than)h(3)f(joins;)k
+(moreover)l(,)f(this)e(benchmark)298 1916 y(was)21 b(designed)j(to)d
+(test)h(the)g(performance)i(of)e(query)g(processors)j(on)c(queries)j
+(consisting)g(of)d(the)h(entire)300 2085 y(set)i(of)g(relational)i
+(operators)g(\(select,)f(project,)g(retrieve,)h(join,)e(update,)h
+(insert,)g(delete,)g(aggregation\))300 2254 y(and)30
+b(with)f(a)g(variety)i(of)e(algorithms)i(implementing)h(the)d(various)i
+(operators.)51 b(Since)29 b(we)g(are)g(using)299 2424
+y(pre-written)24 b(V)-12 b(olcano)24 b(rule)f(sets)g(that)f(only)i
+(contain)g(a)d(subset)j(of)e(these)i(operators,)h(we)c(had)i(to)f
+(design)300 2593 y(our)i(own)f(benchmark)j(queries.)582
+2762 y(In)c(the)g(following)i(sections,)g(we)d(describe)j(our)f
+(experiments)h(using)g(the)e(two)g(rule)g(speci\256ca-)300
+2932 y(tions,)i(the)g(generation)j(of)c(random)h(queries,)h(and)f(the)g
+(productivity)j(gains)e(in)f(using)g(Prairie.)300 3299
+y FO(5.2)119 b(A)30 b(Centralized)i(Relational)e(Query)h(Optimizer)300
+3562 y FP(A)23 b(simple)h(centralized)j(relational)g(optimizer)e(is)f
+(bundled)i(\(as)e(an)g(example)h(of)f(a)g(rule)g(speci\256cation\))300
+3731 y(with)g(the)h(V)-12 b(olcano)26 b(optimizer)g(generator;)h(it)e
+(was)f(written)h(by)f(Graefe)h(and)g(his)g(co-workers.)35
+b(It)24 b(con-)294 3900 y(sists)18 b(of)g(2)g(operators)i(\(RET)c(and)i
+(JOIN\),)f(2)h(algorithms)h(\(File)p 2256 3900 28 4 v
+34 w(scan)f(and)h(Mer)n(ge)p 2851 3900 V 34 w(join\),)h(and)e(1)f
+(enforcer)300 4070 y(\(Mer)n(ge)p 569 4070 V 35 w(sort\).)33
+b(The)23 b(semantics)j(of)e(these)h(operators)h(and)f(algorithms)h(are)
+e(as)g(de\256ned)h(in)f(Chapter)h(2.)294 4239 y(There)18
+b(are)f(2)h(transformation)j(rules,)f(and)e(2)f(implementation)k
+(rules.)29 b(All)18 b(support)h(functions)h(\(as)e(listed)300
+4408 y(in)25 b(T)-6 b(able)25 b(2.3\))g(required)i(for)f(the)f
+(operators,)j(algorithms,)f(and)f(enforcers,)h(and)f(data)g(structures)
+i(rep-)298 4578 y(resenting)c(the)e(properties)i(are)e(de\256ned)h(in)e
+(separate)j(\256les)d(\(the)h(host)h(language)h(is)d(C\).)g(The)g
+(entire)i(rule)300 4747 y(speci\256cation)j(package)g(consists)f(of)f
+(approximately)j FA(1)p FH(;)15 b FA(400)25 b FP(lines.)p
+300 4828 1320 4 v 400 4882 a Fu(1)434 4914 y Fy(Because)20
+b(of)e(the)g(way)h(the)f(P2V)g(preprocessor)i(represented)f
+(properties,)g(the)f(P2V)-7 b(-generated)20 b(V)-10 b(olcano)19
+b(speci\256cation)300 5005 y(was)g(quite)g(dif)o(ferent)g(from)g(the)f
+(hand-written)i(V)-10 b(olcano)20 b(speci\256cation.)1905
+5349 y FP(62)p eop
+%%Page: 63 75
+63 74 bop 583 391 a FP(Re-engineering)36 b(the)d(V)-12
+b(olcano)34 b(rule)f(speci\256cation)i(into)e(Prairie)g(involved)h
+(several)g(steps.)300 561 y(First,)25 b(we)g(had)g(to)g(\256x)g(a)g
+(few)f(bugs)i(in)f(the)h(original)h(V)-12 b(olcano)27
+b(rule)e(speci\256cation)j(that)e(precluded)i(the)300
+730 y(optimizer)i(from)f(optimizing)h(certain)h(legal)e(queries)h(and)f
+(that)h(also)f(produced)i(non-optimal)g(plans)297 899
+y(for)20 b(some)h(queries.)32 b(Second,)21 b(we)f(transformed)j(the)e
+(multiple)h(property)g(sets)g(into)f(a)f(single)i(descriptor)300
+1069 y(structure)j(for)e(the)h(Prairie)f(speci\256cation.)34
+b(This,)23 b(in)g(turn,)g(required)j(modifying)f(property)g(references)
+299 1238 y(in)e(rule)h(actions.)32 b(Third,)24 b(actions)g(in)f
+(support)i(functions)h(had)e(to)e(be)i(speci\256ed)g(as)f(rule)h
+(actions)g(\(since)299 1408 y(a)e(Prairie)i(rule)f(contains)i
+FD(all)e FP(its)g(actions\).)32 b(In)23 b(the)g(whole)g(process)h(of)f
+(reconstituting)k(the)c(centralized)300 1577 y(optimizer)32
+b(speci\256cation,)j(the)c(behavior)i(of)e(the)g(optimizer)h(had)f(to)g
+(be)f(kept)i(unchanged)h(\(i.e.,)f(the)297 1746 y(Prairie)22
+b(optimizer)h(had)e(to)g(generate)i(the)e(same)g(optimal)i(access)f
+(plan)g(as)f(the)g(V)-12 b(olcano)22 b(optimizer)l(,)i(for)300
+1916 y(the)g(same)f(operator)j(tree\).)300 2220 y FN(5.2.1)99
+b(Pr)n(ogrammer)25 b(Pr)n(oductivity)292 2450 y FP(Programmer)16
+b(productivity)k(can)c(be)g(measured)i(in)e(dif)n(ferent)i(ways.)29
+b(An)15 b(admittedly)j(simplistic)g(metric)295 2619 y(is)h(the)h
+(number)g(of)g(lines)g(of)f(code)h(that)g(must)f(be)h(written.)30
+b(But)19 b(there)h(are)f(also)h(less)g(tangible)i(measures,)295
+2789 y(such)e(as)e(the)h(amount)h(of)f(conceptual)j(ef)n(fort)e(needed)
+h(to)d(understand)k(a)d(particular)i(programming)g(task.)296
+2958 y(Our)e(experience)k(suggests)f(that)e(Prairie)g(excels)h(on)f
+(the)g(latter)l(,)h(while)f(of)n(fering)i(modest)f(reductions)i(in)300
+3128 y(the)j(volume)g(of)g(code)g(that)h(needs)f(to)g(be)f(written.)38
+b(The)25 b(re-engineered)30 b(Prairie)c(speci\256cation)i(of)e(the)294
+3297 y(simple)19 b(centralized)i(optimizer)f(consisted)g(of)e
+(approximately)k FA(1)p FH(;)15 b FA(000)k FP(lines,)h(a)e(savings)i
+(of)e(about)h(30\045)300 3466 y(over)24 b(the)f(V)-12
+b(olcano)25 b(speci\256cation.)1415 3433 y Fv(2)1488
+3466 y FP(As)d(mentioned)k(above,)e(however)l(,)h(savings)g(in)e(lines)
+h(of)f(code)h(do)296 3636 y(not)c(fully)h(re\257ect)f(increases)i(in)e
+(programmer)h(productivity)-6 b(.)33 b(W)-7 b(e)19 b(found)i(the)f
+(encapsulated)k(speci\256ca-)296 3805 y(tions)d(of)f(Prairie)g(\320)f
+(namely)-6 b(,)21 b(the)f(use)h(of)e(a)h(single)h(descriptor)i(and)d
+(fewer)g(explicit)i(support)g(functions)300 3974 y(\320)h(made)g(rule)h
+(programming)i FD(much)e FP(easier)-5 b(.)300 4278 y
+FN(5.2.2)99 b(Generating)25 b(Benchmark)i(Queries)583
+4509 y FP(Our)e(experiments)j(using)e(the)g(centralized)i(optimizer)e
+(consisted)i(of)d(optimizing)j(randomly)297 4678 y(generated)23
+b(queries)f(using)g(the)e(two)g(optimizers)j(generated,)g(respectively)
+-6 b(,)25 b(using)c(the)g(Prairie)g(and)g(the)298 4848
+y(hand-written)j(V)-12 b(olcano)22 b(speci\256cations.)33
+b(\(In)22 b(the)g(remainder)h(of)e(this)h(chapter)l(,)h(we)e(will)g
+(use)g(\252Prairie\272)p 300 4923 1320 4 v 400 4977 a
+Fu(2)434 5009 y Fy(As)f(reported)h(in)f([21],)h(the)f(savings)h(are)f
+(even)h(greater)g(if)e(the)i(V)-10 b(olcano)21 b(rule)f(engine)h(is)f
+(modi\256ed)h(slightly)f(to)g(remove)300 5100 y(calls)f(to)f(support)i
+(functions)g(that)f(are)g(grounded)i(by)e(the)g(P2V)g(preprocessor)l(.)
+1905 5349 y FP(63)p eop
+%%Page: 64 76
+64 75 bop 306 403 3272 4 v 306 3076 4 2674 v 1626 1096
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1626 1096 a Fs(R)1679 1105 y Fu(1)1607 958 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 1607 958
+a FF(RET)1670 1078 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1670 1078 a 1909 1096 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1909 1096
+a Fs(R)1962 1105 y Fu(2)1890 958 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 1890 958 a FF(RET)1670
+1078 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1670 1078 a 1739 817 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 1739 817 a FF(JOIN)1670
+1078 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1670 1078 a 1670 1078 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1670 1078 a 1953 653 a
+ tx@Dict begin 45. Rot end
+
+1953 653 a 1906 657 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889
+0.0 false .5 11.3335 InitRnode } NewNode end end
+ 1906 657 a Fs(:)11 b(:)h(:)1953
+653 y
+ tx@Dict begin 45. neg Rot end
+ 1953 653 a 1670 1078 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1670 1078 a 2174 675 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 2174
+675 a FF(RET)2189 813 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0
+false .5 11.51984 InitRnode } NewNode end end
+ 2189 813 a Fs(R)2242 821 y Fn(n)1670
+1078 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1670 1078 a 2023 533 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2023 533 a FF(JOIN)1670
+1078 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1670 1078 a 1670 1078 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1670 1078 a 1456 1212
+a Fy(\(a\))18 b Fq(N)8 b Fy(-way)20 b(join)f(benchmark)h(query)p
+379 1314 3148 4 v 427 2730 a @beginspecial 18.067490
+@llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1771
+@rwi @setspecial
+%%BeginDocument: runtime_non_layered_vs_volcano.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+84 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 372 l
+621 362 m
+621 372 l
+822 362 m
+822 372 l
+1023 362 m
+1023 372 l
+1225 362 m
+1225 372 l
+1426 362 m
+1426 372 l
+1627 362 m
+1627 372 l
+1828 362 m
+1828 372 l
+2030 362 m
+2030 372 l
+420 1704 m
+420 1694 l
+621 1704 m
+621 1694 l
+822 1704 m
+822 1694 l
+1023 1704 m
+1023 1694 l
+1225 1704 m
+1225 1694 l
+1426 1704 m
+1426 1694 l
+1627 1704 m
+1627 1694 l
+1828 1704 m
+1828 1694 l
+2030 1704 m
+2030 1694 l
+stroke
+420 362 m
+420 382 l
+621 362 m
+621 382 l
+822 362 m
+822 382 l
+1023 362 m
+1023 382 l
+1225 362 m
+1225 382 l
+1426 362 m
+1426 382 l
+1627 362 m
+1627 382 l
+1828 362 m
+1828 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+621 1704 m
+621 1684 l
+822 1704 m
+822 1684 l
+1023 1704 m
+1023 1684 l
+1225 1704 m
+1225 1684 l
+1426 1704 m
+1426 1684 l
+1627 1704 m
+1627 1684 l
+1828 1704 m
+1828 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 287 m
+gsave
+621 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 287 m
+gsave
+822 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 287 m
+gsave
+1023 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 287 m
+gsave
+1225 287 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 287 m
+gsave
+1426 287 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 287 m
+gsave
+1627 287 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 287 m
+gsave
+1828 287 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 586 m
+430 586 l
+420 809 m
+430 809 l
+420 1033 m
+430 1033 l
+420 1257 m
+430 1257 l
+420 1480 m
+430 1480 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 586 m
+2020 586 l
+2030 809 m
+2020 809 l
+2030 1033 m
+2020 1033 l
+2030 1257 m
+2020 1257 l
+2030 1480 m
+2020 1480 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 809 m
+440 809 l
+420 1257 m
+440 1257 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 809 m
+2010 809 l
+2030 1257 m
+2010 1257 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 809 m
+gsave
+366 809 translate
+0 rotate
+0 -30 m
+(200) RJ
+(200) show
+grestore
+newpath
+366 1257 m
+gsave
+366 1257 translate
+0 rotate
+0 -30 m
+(400) RJ
+(400) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(600) RJ
+(600) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+164 1033 m
+gsave
+164 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time) CS
+(Average CPU Time) show
+grestore
+newpath
+420 374 m
+621 378 l
+822 389 l
+1023 408 l
+1225 442 l
+1426 513 l
+1627 653 l
+1828 918 l
+2030 1500 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 374 30 0 360 arc
+gsave fill grestore
+stroke
+621 378 30 0 360 arc
+gsave fill grestore
+stroke
+822 389 30 0 360 arc
+gsave fill grestore
+stroke
+1023 408 30 0 360 arc
+gsave fill grestore
+stroke
+1225 442 30 0 360 arc
+gsave fill grestore
+stroke
+1426 513 30 0 360 arc
+gsave fill grestore
+stroke
+1627 653 30 0 360 arc
+gsave fill grestore
+stroke
+1828 918 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1500 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 374 m
+621 377 l
+822 387 l
+1023 405 l
+1225 438 l
+1426 505 l
+1627 642 l
+1828 900 l
+2030 1474 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 404 m
+390 374 l
+420 344 l
+450 374 l
+closepath
+gsave eofill grestore
+stroke
+621 407 m
+591 377 l
+621 347 l
+651 377 l
+closepath
+gsave eofill grestore
+stroke
+822 417 m
+792 387 l
+822 357 l
+852 387 l
+closepath
+gsave eofill grestore
+stroke
+1023 435 m
+993 405 l
+1023 375 l
+1053 405 l
+closepath
+gsave eofill grestore
+stroke
+1225 468 m
+1195 438 l
+1225 408 l
+1255 438 l
+closepath
+gsave eofill grestore
+stroke
+1426 535 m
+1396 505 l
+1426 475 l
+1456 505 l
+closepath
+gsave eofill grestore
+stroke
+1627 672 m
+1597 642 l
+1627 612 l
+1657 642 l
+closepath
+gsave eofill grestore
+stroke
+1828 930 m
+1798 900 l
+1828 870 l
+1858 900 l
+closepath
+gsave eofill grestore
+stroke
+2030 1504 m
+2000 1474 l
+2030 1444 l
+2060 1474 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1440 m
+946 1664 l
+1574 1664 l
+1574 1440 l
+946 1440 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1608 m
+1191 1608 l
+stroke
+995 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1608 m
+gsave
+1240 1608 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1496 m
+1191 1496 l
+stroke
+995 1526 m
+965 1496 l
+995 1466 l
+1025 1496 l
+closepath
+gsave eofill grestore
+stroke
+1191 1526 m
+1161 1496 l
+1191 1466 l
+1221 1496 l
+closepath
+gsave eofill grestore
+stroke
+1240 1496 m
+gsave
+1240 1496 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 745 2864 a(\(b\))f(Query)g(optimization)h(time)p
+1951 3051 4 1737 v 2003 2730 a @beginspecial 18.067490
+@llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1771
+@rwi @setspecial
+%%BeginDocument: eqlogexp_non_layered.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 372 l
+621 362 m
+621 372 l
+822 362 m
+822 372 l
+1023 362 m
+1023 372 l
+1225 362 m
+1225 372 l
+1426 362 m
+1426 372 l
+1627 362 m
+1627 372 l
+1828 362 m
+1828 372 l
+2030 362 m
+2030 372 l
+420 1704 m
+420 1694 l
+621 1704 m
+621 1694 l
+822 1704 m
+822 1694 l
+1023 1704 m
+1023 1694 l
+1225 1704 m
+1225 1694 l
+1426 1704 m
+1426 1694 l
+1627 1704 m
+1627 1694 l
+1828 1704 m
+1828 1694 l
+2030 1704 m
+2030 1694 l
+stroke
+420 362 m
+420 382 l
+621 362 m
+621 382 l
+822 362 m
+822 382 l
+1023 362 m
+1023 382 l
+1225 362 m
+1225 382 l
+1426 362 m
+1426 382 l
+1627 362 m
+1627 382 l
+1828 362 m
+1828 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+621 1704 m
+621 1684 l
+822 1704 m
+822 1684 l
+1023 1704 m
+1023 1684 l
+1225 1704 m
+1225 1684 l
+1426 1704 m
+1426 1684 l
+1627 1704 m
+1627 1684 l
+1828 1704 m
+1828 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 287 m
+gsave
+621 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 287 m
+gsave
+822 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 287 m
+gsave
+1023 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 287 m
+gsave
+1225 287 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 287 m
+gsave
+1426 287 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 287 m
+gsave
+1627 287 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 287 m
+gsave
+1828 287 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+440 362 l
+420 698 m
+440 698 l
+420 1033 m
+440 1033 l
+420 1368 m
+440 1368 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 698 m
+2010 698 l
+2030 1033 m
+2010 1033 l
+2030 1368 m
+2010 1368 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(100) RJ
+(10) show
+/Times-Roman findfont
+53 scalefont
+ setfont
+0 53 rmoveto
+(0) show
+/Times-Roman findfont
+90 scalefont
+ setfont
+0 -53 rmoveto
+() show
+grestore
+newpath
+366 698 m
+gsave
+366 698 translate
+0 rotate
+0 -30 m
+(102) RJ
+(10) show
+/Times-Roman findfont
+53 scalefont
+ setfont
+0 53 rmoveto
+(2) show
+/Times-Roman findfont
+90 scalefont
+ setfont
+0 -53 rmoveto
+() show
+grestore
+newpath
+366 1033 m
+gsave
+366 1033 translate
+0 rotate
+0 -30 m
+(104) RJ
+(10) show
+/Times-Roman findfont
+53 scalefont
+ setfont
+0 53 rmoveto
+(4) show
+/Times-Roman findfont
+90 scalefont
+ setfont
+0 -53 rmoveto
+() show
+grestore
+newpath
+366 1368 m
+gsave
+366 1368 translate
+0 rotate
+0 -30 m
+(106) RJ
+(10) show
+/Times-Roman findfont
+53 scalefont
+ setfont
+0 53 rmoveto
+(6) show
+/Times-Roman findfont
+90 scalefont
+ setfont
+0 -53 rmoveto
+() show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(108) RJ
+(10) show
+/Times-Roman findfont
+53 scalefont
+ setfont
+0 53 rmoveto
+(8) show
+/Times-Roman findfont
+90 scalefont
+ setfont
+0 -53 rmoveto
+() show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+188 1033 m
+gsave
+188 1033 translate
+90 rotate
+0 0 m
+(Equivalent expressions) CS
+(Equivalent expressions) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Number of Equivalent Expressions) CS
+(Number of Equivalent Expressions) show
+grestore
+newpath
+420 362 m
+621 413 l
+822 514 l
+1023 635 l
+1225 770 l
+1426 914 l
+1627 994 l
+1828 1234 l
+2030 1399 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 362 30 0 360 arc
+gsave fill grestore
+stroke
+621 413 30 0 360 arc
+gsave fill grestore
+stroke
+822 514 30 0 360 arc
+gsave fill grestore
+stroke
+1023 635 30 0 360 arc
+gsave fill grestore
+stroke
+1225 770 30 0 360 arc
+gsave fill grestore
+stroke
+1426 914 30 0 360 arc
+gsave fill grestore
+stroke
+1627 994 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1234 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1399 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+showpage
+%%EndDocument
+ @endspecial 2058 2864 a(\(c\))13 b(Number)h(of)f(expressions)i
+(equivalent)f(to)f(\(a\))g(\(in)2058 2955 y(either)19
+b(Prairie)f(or)h(V)-10 b(olcano\))p 3574 3076 4 2674
+v 306 3079 3272 4 v 3576 3096 19 2680 v 322 3096 3272
+19 v 907 3292 a FP(Figure)24 b(5.1:)32 b(Benchmarking)26
+b(a)d(simple)h(centralized)i(optimizer)300 3669 y(and)g(\252V)-12
+b(olcano\272)28 b(to)d(denote)i(these)g(two)e(approaches.\))40
+b(The)25 b(queries)i(represented)i(left-deep)e FH(N)10
+b FP(-way)300 3838 y(join)26 b(operator)i(trees,)f(for)e(varying)j
+(values)f(of)e FH(N)10 b FP(,)25 b(as)h(shown)g(in)g(Figure)g
+(5.1\(a\).)38 b(Each)25 b(operator)j(tree)300 4007 y(also)e(required)h
+(its)e(output)i(to)e(be)g(returned)j(sorted,)e(but)g(since)g(V)-12
+b(olcano)27 b(considered)h(SOR)-5 b(T)22 b(to)j(be)g(an)300
+4177 y(implicit)g(operator)l(,)g(it)f(is)f(not)h(shown)g(in)f(Figure)i
+(5.1\(a\).)583 4346 y(Random)j(queries)h(were)e(generated)j(for)d
+(optimization)j(using)f(a)e(uniform)h(random)g(number)300
+4516 y(generator)k(as)e(follows.)51 b(The)29 b(set)h(of)g(stored)h
+(\256les)f(\(relations\))i(was)e(\256xed,)h(as)f(were)f(the)i(number)f
+(of)300 4685 y(attributes)c(in)d(each)h(\256le,)e(their)j
+(cardinalities,)h(and)e(record)h(widths.)31 b(Each)23
+b(query)i(contained)h(all)d(oper)n(-)299 4854 y(ators)g(in)f(the)g(V)
+-12 b(olcano)24 b(speci\256cation.)33 b(The)22 b(queries)i(generated)g
+(varied)g(in)e(the)h(order)g(of)f(the)g(relations)298
+5024 y(in)f(the)g(\(left-deep\))k(operator)e(tree.)30
+b(Each)22 b(join)g(in)f(the)g(tree)h(had)g(an)f(equijoin)j(predicate.)
+32 b(The)21 b(two)g(join)1905 5349 y(64)p eop
+%%Page: 65 77
+65 76 bop 300 391 a FP(attributes)27 b(were)d(chosen,)i(at)e(random,)h
+(from)g(the)f(set)h(of)f(attributes)j(in)d(the)h(outer)g(and)g(inner)h
+(streams,)300 561 y(respectively)-6 b(.)36 b(The)24 b(\(single\))i
+(tuple)f(order)g(for)f(the)g(\(implicit\))i(sort)f(operator)h(at)e(the)
+g(root)h(was)f(chosen)300 730 y(as)f(an)h(attribute)i(of)d(one)h(of)g
+(the)f(relations)j(in)e(the)g(operator)h(tree.)300 1037
+y FN(5.2.3)99 b(Performance)26 b(Results)f(Using)f(the)i(Centralized)g
+(Optimizer)300 1267 y FP(For)i(each)h(value)g FH(N)38
+b FP(of)28 b(the)h(number)g(of)f(joins,)j(we)c(generated)k(10)e
+FD(differ)m(ent)i FP(queries)f(\(as)f(described)300 1437
+y(above\),)e(and)e(submitted)i(it)e(to)g(both)h(the)g(Prairie)f(and)h
+(V)-12 b(olcano)26 b(optimizers)h(for)f(optimization.)38
+b(Both)298 1606 y(optimizers)24 b(produced)g(the)e(same)g(optimal)h
+(plan)g(for)f(each)g(query)-6 b(.)32 b(The)21 b(run)h(times)g(of)g
+(each)g(optimizer)300 1775 y(were)h(measured)845 1742
+y Fv(3)909 1775 y FP(using)h(the)g(GNU)d Fi(time)g FP(command,)j(and)f
+(averaged)j(over)e(the)f(10)h(queries)h(to)e(gen-)297
+1945 y(erate)e(the)g(per)n(-query)j(optimization)f(time.)30
+b(Thus,)21 b(each)g(point)h(in)f(our)g(graphs)h(represents)i(the)c
+(average)299 2114 y(CPU)h(time)h(for)h(optimizing)i(10)d(dif)n(ferent)j
+(queries.)33 b(All)22 b(experiments)j(were)d(performed)j(on)d(a)h
+(lightly)300 2283 y(loaded)i(DECstation)f(5000/200)i(running)g(Ultrix)e
+(4.2.)583 2453 y(The)g(optimization)j(time)c(for)h(both)h(approaches)i
+(\(Prairie)d(and)h(V)-12 b(olcano\))25 b(are)f(shown)h(in)e(Fig-)300
+2622 y(ure)i(5.1\(b\).)36 b(The)24 b(number)i FH(N)34
+b FP(of)25 b(joins)h(was)e(varied)i(from)f(0)g(through)i(8.)34
+b(The)24 b(results,)j(as)e(seen)g(from)300 2792 y(the)k(graph,)i(are)e
+(virtually)i(identical)g(for)d(both)i(Prairie)f(and)g(V)-12
+b(olcano.)48 b(That)29 b(is,)g(there)h(is)e(no)h(loss)g(of)300
+2961 y(performance)d(of)e(the)f(optimizer)j(if)d(it)g(is)g(speci\256ed)
+i(using)g(Prairie)f(instead)h(of)f(V)-12 b(olcano.)580
+3130 y(It)20 b(is)g(interesting)j(to)d(note)h(the)f(number)h(of)g
+(equivalent)i(expressions)g(that)e(are)f(generated)j(from)293
+3300 y(the)18 b(original)h FH(N)10 b FP(-way)17 b(join)h(query)h(in)e
+(Figure)h(5.1\(a\).)30 b(This)17 b(is)g(shown)h(in)f(Figure)h
+(5.1\(c\).)29 b(Both)18 b(optimiz-)298 3469 y(ers)k(\(Prairie)h(and)f
+(V)-12 b(olcano\))24 b(result)f(in)e(the)h(same)g(number)h(of)f
+(equivalent)i(expressions,)i(which)c(grows)297 3638 y(exponentially)j
+(with)c FH(N)10 b FP(,)20 b(the)h(number)h(of)e(joins)i(in)f(the)g
+(query)-6 b(.)31 b(This)21 b(corresponds)j(to)d(the)g(exponential)300
+3808 y(rise)j(in)f(optimization)k(time)c(as)h(seen)g(in)f(Figure)h
+(5.1\(b\).)583 3977 y(From)h(these)h(experiments)i(with)e(the)f(simple)
+h(centralized)j(optimizer)l(,)e(it)f(was)f(evident)i(to)e(us)300
+4146 y(that)f(Prairie)h(of)n(fers)g(a)e(modest)i(reduction)h(in)e(code)
+g(size,)g(better)h(programmability)i(and)d(clarity)-6
+b(,)25 b(with)299 4316 y(no)e(performance)i(degradation.)34
+b(It)22 b(is)h(important)h(to)f(show)-6 b(,)23 b(however)l(,)h(that)f
+(Prairie)g(can)g(also)h(be)e(used)300 4485 y(to)h(specify)j(rule)e
+(sets)g(for)g(lar)n(ge-scale)i(optimizers.)33 b(This)24
+b(is)f(described)j(in)e(the)f(next)i(section.)p 300 4566
+1320 4 v 400 4620 a Fu(3)434 4652 y Fy(T)-5 b(o)21 b(reduce)h
+(measurement)g(errors,)g(the)f Fr(same)g Fy(query)h(was)f(optimized)h
+(10)f(times)g(\(in)g(a)g(loop\))h(and)f(the)g(total)g(time)g(was)300
+4743 y(divided)f(by)f(10)h(to)e(obtain)i(the)f(optimization)g(time)g
+(for)g(any)g(query)-5 b(.)1905 5349 y FP(65)p eop
+%%Page: 66 78
+66 77 bop 300 391 a FO(5.3)119 b(The)30 b(T)-11 b(exas)29
+b(Instruments)g(Open)i(OODB)f(Query)g(Optimizer)292 654
+y FP(The)16 b(T)-6 b(exas)17 b(Instruments)i(Open)e(Object-Oriented)i
+(Database)f(Management)h(System)d([50])h(is)g(an)f(open,)293
+824 y(extensible,)k(object-oriented)i(database)d(system)f(which)f
+(provides)i(users)f(an)f(architectural)j(framework)297
+993 y(that)h(is)f(con\256gurable)j(in)e(an)g(incremental)i(manner)-5
+b(.)30 b(It)20 b(consists)j(of)e(three)g(sets)g(of)g(modules:)31
+b(a)20 b(core)h(set)300 1162 y(providing)28 b(low-level)f(primitives)h
+(for)e(creating)h(new)e(environments,)k(a)c(set)h(of)g(functional)i
+(modules)300 1332 y(that)d(facilitates)j(extensibility)h(using)d
+(functional)h(requirements,)h(and)e(a)e(meta-architecture)29
+b(module)300 1501 y(housing)i(the)e(extensibility)j(concepts)g(of)c
+(Open)h(OODB.)d(Examples)k(of)f(the)g(core)g(set)g(are)g(commu-)300
+1671 y(nication)e(and)e(address)h(space)g(management,)h(while)d
+(examples)j(of)d(functional)k(modules)e(are)f(persis-)299
+1840 y(tence,)f(distribution,)i(and)d(query)h(processing.)33
+b(The)22 b(meta-architecture)27 b(module)d(consists)g(of)f(events,)300
+2009 y(sentries,)i(and)f(policy)h(manager)g(interfaces.)583
+2179 y(The)31 b(query)h(processing)h(module)f(provides)h(users)e(with)g
+(a)f(query)i(language)h(\(OQL[C++]\))300 2348 y(based)d(on)e(SQL)f(and)
+i(C++.)45 b(A)27 b(query)j(expressed)h(in)d(this)h(high-level)j(format)
+d(is)f(parsed)i(and)f(trans-)300 2517 y(formed)h(into)g(an)f(operator)j
+(tree)e(suitable)h(for)f(optimization.)51 b(From)28 b(this)i(operator)h
+(tree,)g(the)f(query)300 2687 y(optimizer)c(generates)g(an)e(optimal)h
+(access)g(plan,)g(which)f(is)g(then)h(transformed)h(into)f(a)f(C++)f
+(program)300 2856 y(ready)i(for)e(execution.)578 3025
+y(The)18 b(query)i(optimizer)g(in)f(Open)f(OODB)f([15])i(is)f
+(generated)j(using)f(V)-12 b(olcano.)31 b(It)18 b(consists)j(of)d(6)297
+3195 y(operators)23 b(\(SELECT)-7 b(,)17 b(PROJECT)-7
+b(,)18 b(JOIN,)h(RET)-7 b(,)19 b(UNNEST)e(\(for)k(set-valued)j
+(attributes\),)f(and)e(MA)-10 b(T)300 3364 y(\(MA)g(T)k(erialize;)24
+b(it)g(is)f(used)h(for)g(representing)j(path)d(expressions)j(in)d(a)f
+(query\)\),)i(8)e(algorithms)j(\(Filter)l(,)300 3534
+y(Project,)e(Hash)p 794 3534 28 4 v 33 w(join,)g(Ptr)p
+1120 3534 V 33 w(hash)p 1318 3534 V 34 w(join,)g(File)p
+1680 3534 V 33 w(scan,)g(Index)p 2125 3534 V 35 w(scan,)f(Unnest,)h
+(and)g(Alg)p 2959 3534 V 33 w(assembly\),)h(and)f(1)299
+3703 y(enforcer)h(\(Enf)p 790 3703 V 33 w(assembly\).)33
+b(Currently)-6 b(,)24 b(the)f(Open)g(OODB)e(rule)i(set)g(consists)i(of)
+e(17)g(transformation)297 3872 y(rules)g(and)e(9)g(implementation)j
+(rules)e(together)i(with)d(about)h FA(13)p FH(;)15 b
+FA(000)23 b FP(lines)f(of)f(code)h(for)g(support)h(func-)300
+4042 y(tions;)i(this,)e(of)h(course,)g(can)g(be)f(changed)j(by)d(an)h
+(Open)f(OODB)f(DBI)g(for)h(speci\256c)i(needs.)32 b(There)23
+b(are)300 4211 y(also)k FD(catalogs)h FP(which)e(contain)i(information)
+h(about)e(base)g(classes)h(that)e(are)g(used)h(by)f(the)h(optimizer)-5
+b(.)300 4380 y(The)23 b(complete)i(rule)f(set)g(for)g(the)f(Open)h
+(OODB)d(optimizer)26 b(is)d(shown)h(in)f(Appendix)j(C.)300
+4687 y FN(5.3.1)99 b(Pr)n(ogrammer)25 b(Pr)n(oductivity)300
+4918 y FP(As)e(in)i(the)f(case)h(of)f(the)h(centralized)i(optimizer)l
+(,)g(we)c(re-engineered)28 b(the)d(Open)f(OODB)e(rule)j(set)g(into)300
+5087 y(Prairie,)k(and)f(then)g(generated)i(a)d(V)-12
+b(olcano)29 b(speci\256cation)i(by)c(using)i(the)f(P2V)e(preprocessor)
+-5 b(.)47 b(Using)1905 5349 y(66)p eop
+%%Page: 67 79
+67 78 bop 300 391 a FP(lines)29 b(of)f(code)g(as)g(a)f(crude)i(metric)g
+(of)f(programmer)h(productivity)-6 b(,)32 b(there)d(was)f(about)h
+(10\045)e(savings)294 561 y(realized)21 b(in)d(Prairie)h(over)g(V)-12
+b(olcano.)1444 528 y Fv(4)1514 561 y FP(However)l(,)20
+b(an)e(even)h(more)g(important)h(increase)g(in)e(programmer)297
+730 y(productivity)24 b(resulted)e(in)f(using)g(the)g(abstractions)j
+(and)d(encapsulations)k(in)20 b(Prairie;)i(it)f(took)g(almost)g(4)295
+899 y(man-months)g(to)f(reconstitute)i(the)e(Prairie)g
+(speci\256cations)i(for)e(the)f(Open)h(OODB)d(optimizer)k(because)300
+1069 y(of)31 b(the)g(widespread)j(use)d(of)g(implementation-level)36
+b(details)c(in)f(the)h(V)-12 b(olcano)32 b(speci\256cation)i(of)d(the)
+300 1238 y(optimizer)l(,)25 b(a)e(speci\256cation)k(that)d(ought)h(to)e
+(be)h(programmed)h(at)e(the)h FD(conceptual)j FP(level.)583
+1408 y(As)h(a)g(sidenote,)k(the)c(Prairie)h(speci\256cation)i(of)e(the)
+g(Open)f(OODB)e(optimizer)k(consisted)h(of)300 1577 y(22)25
+b(T)-8 b(-rules)25 b(and)g(1)m(1)g(I-rules)h(\(the)g(increased)h
+(number)f(of)e(rules)i(is)f(because,)i(as)d(mentioned)j(in)e(Chap-)300
+1746 y(ter)g(3,)g(Prairie)g(does)h(not)g(allow)f(implicit)h(rules\).)37
+b(The)24 b(P2V)-8 b(-generated)27 b(V)-12 b(olcano)27
+b(rule)e(set)h(contained)300 1916 y(17)h(transformation)k(rules)d(and)g
+(9)f(implementation)j(rules,)f(the)e(same)h(as)f(the)g(original)i
+(hand-written)300 2085 y(V)-12 b(olcano)25 b(speci\256cation.)300
+2392 y FN(5.3.2)99 b(Generating)25 b(Benchmark)i(Queries)583
+2622 y FP(Our)22 b(experiments)j(using)g(the)e(Open)g(OODB)d(consisted)
+26 b(of)c(optimizing)j(8)e(dif)n(ferent)i(queries)294
+2792 y(using)19 b(the)f(Prairie)h(and)f(V)-12 b(olcano)20
+b(optimizers.)31 b(There)18 b(were)g(4)f(distinct)j(expressions)h(that)
+e(were)f(used)g(to)295 2961 y(generate)i(the)f(queries)h(used)g(in)e
+(the)h(experiments;)k(these)d(are)e(shown)i(in)e(Figure)h(5.2.)29
+b(Each)19 b(expression)300 3130 y(represents)26 b(an)e
+FH(N)10 b FP(-way)23 b(join)h(query)-6 b(,)25 b(for)f(varying)h(values)
+g(of)f FH(N)10 b FP(.)582 3300 y(The)22 b(\256rst)g(expression,)j(E1,)c
+(is)i(a)e(simple)i(retrieval)i(and)d(join)h(of)f(stored)i(\256les;)f
+(these)g(\256les)f(rep-)299 3469 y(resent)i(base)g(classes.)32
+b(The)23 b(second,)h(E2,)e(is)h(also)g(a)g(join)g(of)g(base)h(classes;)
+h(however)l(,)f(after)f(each)h(class)300 3638 y(retrieval,)i(an)e
+(attribute)i(has)f(to)e(be)h(materialized)j(\(i.e.,)c(brought)j(into)f
+(scope\))h(before)f(the)f(join.)33 b(\(This)300 3808
+y(is)26 b(an)g(abstract)j(representation)h(of)c(path)h(expressions)j
+(in)c(object-oriented)31 b(queries.\))41 b(The)26 b(third)h(and)300
+3977 y(fourth)k(expressions)i(\(E3)c(and)h(E4\))e(are)i(the)g(same)f
+(as)h(the)f(\256rst)h(and)f(second)j(\(E1)c(and)i(E2\),)h(respec-)300
+4146 y(tively)-6 b(,)27 b(except)h(that)e(there)h(is)e(a)h(selection)i
+(of)d(attributes)k(\(the)d(SELECT)c(operator)28 b(is)e(the)g(root)g(of)
+g(the)300 4316 y(expressions\).)773 4283 y Fv(5)p 300
+4397 1320 4 v 400 4451 a Fu(4)434 4482 y Fy(The)f(original)f(V)-10
+b(olcano)26 b(speci\256cation)f(had)g Fl(13)p Fq(;)14
+b Fl(400)25 b Fy(lines,)g(the)g(Prairie)e(speci\256cation)i(had)g
+Fl(12)p Fq(;)14 b Fl(100)25 b Fy(lines,)h(and)f(the)300
+4574 y(P2V)-7 b(-generated)20 b(V)-10 b(olcano)20 b(speci\256cation)g
+(had)f Fl(15)p Fq(;)14 b Fl(800)20 b Fy(lines.)400 4633
+y Fu(5)434 4665 y Fy(The)d(most)f(complex)h(expression,)h(E4,)e
+(consists)h(of)f(all)g(operators)g(in)h(the)f(algebra,)h(except)g
+(PROJECT)d(and)j(UNNEST)-6 b(.)300 4756 y(PROJECT)14
+b(was)h(not)h(considered)h(because)g(it)e(appeared)i(in)f(only)g(one)g
+(implementation)h(rule)e(and)i(no)f(transformation)g(rules,)300
+4848 y(and)23 b(thus,)g(would)g(not)f(af)o(fect)g(the)g(size)h(of)f
+(the)g(search)h(space)g(of)f(abstract)h(expressions.)36
+b(UNNEST)21 b(was)h(not)g(considered)300 4939 y(because)e(it)e
+(appeared)i(in)f(exactly)g(one)g(transformation)h(rule)e(and)i(one)f
+(implementation)g(rule;)g(including)h(it)e(in)g(our)h(queries)300
+5030 y(would)f(have)h(increased)g(the)e(number)i(of)f(parameters)g
+(that)g(could)h(af)o(fect)e(our)h(run)g(times.)24 b(W)-6
+b(e)17 b(preferred)i(to)e(concentrate)i(on)1905 5349
+y FP(67)p eop
+%%Page: 68 80
+68 79 bop 323 403 3237 4 v 323 2641 4 2239 v 814 1238
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111
+false .5 10.22475 InitRnode } NewNode end end
+ 814 1238 a Fs(C)864 1247 y Fu(1)793 1100 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 793 1100
+a FF(RET)856 1220 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856 1220 a 1097 1238 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111
+false .5 10.22475 InitRnode } NewNode end end
+ 1097 1238
+a Fs(C)1147 1247 y Fu(2)1077 1100 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 1077 1100 a FF(RET)856
+1220 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856 1220 a 926 958 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 926 958 a FF(JOIN)856 1220
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856 1220 a 856 1220 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856 1220 a 1139 794 a
+ tx@Dict begin 45. Rot end
+ 1139 794
+a 1092 798 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889
+0.0 false .5 11.3335 InitRnode } NewNode end end
+ 1092 798 a Fs(:)12 b(:)f(:)1139 794 y
+ tx@Dict begin 45. neg Rot end
+ 1139
+794 a 856 1220 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 856 1220 a 1360 817 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 1360 817 a FF(RET)1376
+955 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0
+false .5 11.17616 InitRnode } NewNode end end
+ 1376 955 a Fs(C)1426 963 y Fn(n)856 1220 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856
+1220 a 1209 675 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 1209 675 a FF(JOIN)856 1220 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 856 1220
+a 856 1220 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856 1220 a 1047 1353 a Fy(\(a\))19 b(E1)p
+1905 1450 4 1022 v 2347 1238 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111
+false .5 10.22475 InitRnode } NewNode end end
+ 2347 1238 a Fs(C)2397
+1247 y Fu(1)2327 1100 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 2327 1100 a FF(RET)2390 1220
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2390 1220 a 2631 1238 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111
+false .5 10.22475 InitRnode } NewNode end end
+ 2631 1238 a Fs(C)2681 1247
+y Fu(2)2610 1100 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 2610 1100 a FF(RET)2390 1220 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2390
+1220 a 2320 959 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 5.43198
+0.0 false .5 16.88788 InitRnode } NewNode end end
+ 2320 959 a FF(MA)-7 b(T)2390 1220 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+
+2390 1220 a 2603 959 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 5.43198
+0.0 false .5 16.88788 InitRnode } NewNode end end
+ 2603 959 a FF(MA)g(T)2390 1220
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2390 1220 a 2460 817 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end
+end
+ 2460 817 a FF(JOIN)2390 1220
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2390 1220 a 2390 1220 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2390 1220 a 2673 653 a
+ tx@Dict begin 45. Rot end
+ 2673
+653 a 2626 657 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889
+0.0 false .5 11.3335 InitRnode } NewNode end end
+ 2626 657 a Fs(:)12 b(:)f(:)2673 653
+y
+ tx@Dict begin 45. neg Rot end
+ 2673 653 a 2390 1220 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2390 1220 a 2894 817 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 2894
+817 a FF(RET)2910 955 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0
+false .5 11.17616 InitRnode } NewNode end end
+ 2910 955 a Fs(C)2960 963 y Fn(n)2390
+1220 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2390 1220 a 2887 675 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 5.43198
+0.0 false .5 16.88788 InitRnode } NewNode end end
+ 2887 675 a FF(MA)-7 b(T)2390
+1220 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2390 1220 a 2743 533 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2743 533 a FF(JOIN)2390
+1220 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2390 1220 a 2390 1220 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2390 1220 a 2579 1353
+a Fy(\(b\))19 b(E2)p 374 1453 3065 4 v 814 2404 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111
+false .5 10.22475 InitRnode } NewNode end end
+ 814
+2404 a Fs(C)864 2413 y Fu(1)793 2267 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 793 2267 a FF(RET)856
+2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856 2386 a 1097 2404 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111
+false .5 10.22475 InitRnode } NewNode end end
+ 1097 2404 a Fs(C)1147 2413
+y Fu(2)1077 2267 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 1077 2267 a FF(RET)856 2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856
+2386 a 926 2125 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 926 2125 a FF(JOIN)856 2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856 2386
+a 856 2386 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856 2386 a 1139 1961 a
+ tx@Dict begin 45. Rot end
+ 1139 1961 a 1092
+1965 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889
+0.0 false .5 11.3335 InitRnode } NewNode end end
+ 1092 1965 a Fs(:)12 b(:)f(:)1139 1961 y
+ tx@Dict begin 45. neg Rot end
+ 1139 1961
+a 856 2386 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 856 2386 a 1360 1983 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 1360 1983 a FF(RET)1376
+2121 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0
+false .5 11.17616 InitRnode } NewNode end end
+ 1376 2121 a Fs(C)1426 2129 y Fn(n)856 2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856
+2386 a 1209 1842 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 1209 1842 a FF(JOIN)856 2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 856
+2386 a 856 2386 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 856 2386 a 1159 1700 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 5.43198
+0.08394 false .5 29.33583 InitRnode } NewNode end end
+ 1159 1700 a
+FF(SELECT)856 2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 856 2386 a 1047 2520 a Fy(\(c\))19
+b(E3)p 1905 2616 4 1164 v 2347 2404 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111
+false .5 10.22475 InitRnode } NewNode end end
+ 2347 2404 a Fs(C)2397
+2413 y Fu(1)2327 2267 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 2327 2267 a FF(RET)2390 2386
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2390 2386 a 2631 2404 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111
+false .5 10.22475 InitRnode } NewNode end end
+ 2631 2404 a Fs(C)2681 2413
+y Fu(2)2610 2267 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 2610 2267 a FF(RET)2390 2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2390
+2386 a 2320 2125 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 5.43198
+0.0 false .5 16.88788 InitRnode } NewNode end end
+ 2320 2125 a FF(MA)-7 b(T)2390 2386
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2390 2386 a 2603 2125 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 5.43198
+0.0 false .5 16.88788 InitRnode } NewNode end end
+ 2603 2125 a FF(MA)g(T)2390
+2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2390 2386 a 2460 1983 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end
+end
+ 2460 1983 a FF(JOIN)2390
+2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2390 2386 a 2390 2386 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2390 2386 a 2673 1819
+a
+ tx@Dict begin 45. Rot end
+ 2673 1819 a 2626 1823 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889
+0.0 false .5 11.3335 InitRnode } NewNode end end
+ 2626 1823 a Fs(:)12 b(:)f(:)2673
+1819 y
+ tx@Dict begin 45. neg Rot end
+ 2673 1819 a 2390 2386 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2390 2386 a 2894 1983
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 2894 1983 a FF(RET)2910 2121 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0
+false .5 11.17616 InitRnode } NewNode end end
+ 2910 2121 a Fs(C)2960
+2129 y Fn(n)2390 2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2390 2386 a 2887 1842 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 5.43198
+0.0 false .5 16.88788 InitRnode } NewNode end end
+ 2887
+1842 a FF(MA)-7 b(T)2390 2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2390 2386 a 2743 1700
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2743 1700 a FF(JOIN)2390 2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2390 2386 a 2390 2386
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 2390 2386 a 2693 1558 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 5.43198
+0.08394 false .5 29.33583 InitRnode } NewNode end end
+ 2693 1558 a FF(SELECT)2390
+2386 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2390 2386 a 2579 2520 a Fy(\(d\))19 b(E4)p 3557
+2641 4 2239 v 323 2644 3237 4 v 3558 2661 19 2245 v 340
+2661 3237 19 v 501 2857 a FP(Figure)24 b(5.2:)31 b(Expressions)26
+b(used)f(in)e(generating)j(benchmark)g(queries)f(for)f(Open)g(OODB)p
+610 3188 2680 13 v 610 3279 4 92 v 663 3297 a Fz(Query)p
+917 3279 V 970 3305 a(Indices?)p 1285 3279 V 1338 3297
+a(Expr)o(ession)p 1740 3279 V 2279 3252 a(Rules)18 b(matched)p
+3286 3279 V 1743 3283 1547 4 v 610 3371 4 92 v 917 3371
+V 1285 3371 V 1740 3371 V 1793 3343 a(transformation)h(rules)p
+2505 3371 V 103 w(implementation)f(rules)p 3286 3371
+V 610 3383 2680 13 v 610 3474 4 92 v 706 3447 a Fy(E1)m(1)p
+917 3474 V 234 w(No)p 1285 3474 V 1473 3500 a(E1)p 1740
+3474 V 2105 3499 a(3)p 2505 3474 V 737 w(3)p 3286 3474
+V 610 3478 679 4 v 610 3566 4 92 v 705 3538 a(E12)p 917
+3566 V 223 w(Y)-7 b(es)p 1285 3566 V 1740 3566 V 2505
+3566 V 3286 3566 V 610 3569 2680 4 v 610 3660 4 92 v
+705 3633 a(E21)p 917 3660 V 232 w(No)p 1285 3660 V 1473
+3686 a(E2)p 1740 3660 V 2105 3685 a(8)p 2505 3660 V 2879
+3686 a(4)p 3286 3660 V 610 3664 679 4 v 610 3752 4 92
+v 705 3724 a(E22)p 917 3752 V 223 w(Y)g(es)p 1285 3752
+V 1740 3752 V 2505 3752 V 3286 3752 V 610 3755 2680 4
+v 610 3846 4 92 v 705 3819 a(E31)p 917 3846 V 232 w(No)p
+1285 3846 V 1473 3871 a(E3)p 1740 3846 V 549 w(9)p 2505
+3846 V 2879 3872 a(5)p 3286 3846 V 610 3850 679 4 v 610
+3938 4 92 v 705 3910 a(E32)p 917 3938 V 223 w(Y)g(es)p
+1285 3938 V 1740 3938 V 2505 3938 V 3286 3938 V 610 3941
+2680 4 v 610 4032 4 92 v 705 4005 a(E41)p 917 4032 V
+232 w(No)p 1285 4032 V 1473 4058 a(E4)p 1740 4032 V 2087
+4057 a(16)p 2505 4032 V 718 w(7)p 3286 4032 V 610 4036
+679 4 v 610 4124 4 92 v 705 4096 a(E42)p 917 4124 V 223
+w(Y)g(es)p 1285 4124 V 1740 4124 V 2505 4124 V 3286 4124
+V 610 4136 2680 13 v 697 4290 a FP(T)h(able)23 b(5.1:)32
+b(Queries)24 b(used)g(in)g(benchmarking)j(the)d(Open)f(OODB)e
+(optimizer)577 4667 y(As)16 b(in)i(the)g(case)g(of)f(the)h(centralized)
+i(optimizer)l(,)h(there)d(are)g(many)f(parameters)j(that)e(can)g(be)f
+(var)n(-)297 4836 y(ied)k(when)g(benchmarking)j(a)c(query)i(optimizer)
+-5 b(.)32 b(Since)21 b(our)g(objective)i(was)e(to)f(verify)i(that)g
+(the)f(Prairie)p 300 4917 1320 4 v 300 5022 a Fy(simple)e(join)g
+(expressions.)1905 5349 y FP(68)p eop
+%%Page: 69 81
+69 80 bop 297 391 a FP(approach)23 b(did)e(not)g(sacri\256ce)g(ef)n
+(\256ciency)-6 b(,)23 b(our)e(criteria)h(for)f(the)g(queries)h(was)f
+(that)g(they)g(test)g(a)f(majority)300 561 y(of)27 b(the)g(rules,)i
+(with)e(varying)i(properties)g(of)e(the)h(base)f(classes.)43
+b(T)-6 b(o)26 b(this)i(end,)g(we)e(tested)i(the)g(Prairie)293
+730 y(\(and)18 b(V)-12 b(olcano\))18 b(optimizer)h(with)e(8)f(dif)n
+(ferent)k(queries)f(\(shown)e(in)g(T)-6 b(able)17 b(5.1\).)29
+b(The)16 b(eight)i(queries,)i(E1)m(1)297 899 y(through)j(E42,)e(are)g
+(derived)h(from)f(the)g(4)g(expressions)j(in)d(Figure)g(5.2.)30
+b(Each)21 b(expression,)j(E1)c(through)300 1069 y(E4,)i(is)h(used)i(to)
+e(obtain)i(two)e(queries)i(for)f(a)f(\256xed)g(number)h
+FH(N)33 b FP(of)23 b(joins)i(in)e(the)h(expression.)34
+b(The)22 b(only)298 1238 y(dif)n(ference)i(between)e(the)g(two)f
+(queries)i(obtained)g(from)f(an)f(expression)j(was)d(in)g(the)h
+(properties)i(of)d(the)300 1408 y(base)k(classes:)33
+b(the)24 b(\256rst)g(query)h(did)f(not)g(contain)i(any)e(indices)i(on)e
+(any)g(classes,)i(whereas)e(the)h(second)300 1577 y(one)f(contained)i
+(a)d(single)i(index)g(on)f(each)g(base)g(class)h(occurring)h(in)d(the)h
+(expression.)582 1746 y(In)e(expressions)j(where)d(a)g(SELECT)c(is)k
+(present)i(\(E3)d(and)i(E4\),)e(the)i(selection)h(predicate)g(was)300
+1916 y(a)g(conjunction)k(of)c(equality)j(predicates)g
+FD(bc)1711 1930 y Fs(i)1768 1916 y FA(==)g FD(const)2129
+1930 y Fs(i)2157 1916 y FP(,)d(where)h FD(bc)2536 1930
+y Fs(i)2587 1916 y FP(was)g(an)f(attribute)j(of)d(class)h
+FD(C)3549 1930 y Fs(i)3577 1916 y FP(,)300 2085 y(and)30
+b FD(const)651 2099 y Fs(i)708 2085 y FP(was)f(a)f(constant)k(\(we)c
+(arbitrarily)k(set)d(this)h(to)f FH(i)p FP(,)h(because)h(its)e(value)h
+(doesn')n(t)h(af)n(fect)g(the)300 2254 y(correctness)d(or)c
+(performance)k(of)c(the)h(optimizer\).)36 b(In)25 b(addition,)i(for)d
+(queries)j(with)d(a)h(SELECT)-7 b(,)21 b(and)300 2424
+y(whose)k(base)g(classes)h(have)f(indices)h(\(E32)e(and)h(E42,)f(in)g
+(T)-6 b(able)24 b(5.1\),)h(the)f(\(single\))j(indexed)f(attribute)300
+2593 y(of)g(each)g(base)g(class)h(was)e(chosen)i(to)f(be)g(the)g
+(attribute)h(referenced)i(in)c(the)h(selection)i(predicate.)40
+b(For)300 2762 y(example,)24 b(class)h FD(C)914 2776
+y Fs(i)964 2762 y FP(was)f(chosen)h(to)e(have)i(an)e(index)i(on)e
+(attribute)j FD(bc)2550 2776 y Fs(i)2578 2762 y FP(.)580
+2932 y(The)19 b(join)i(predicates)h(for)f(each)f(JOIN)f(were)h(chosen)i
+(at)e(random,)h(and)f(were)g(always)h(equijoin)300 3101
+y(predicates.)45 b(The)27 b(choice)h(of)f(join)h(predicates)i(was)d
+(such)h(that)g(the)g(queries)h(corresponded)i(to)c(linear)300
+3271 y(query)g(graphs;)h(furthermore,)g(each)e(join)g(predicate)i
+(corresponded)i(to)25 b(an)h(implementation)i(using)f(a)300
+3440 y(one-way)f(pointer)g(between)g(the)e(join)i(attributes)h(of)d
+(the)h(base)g(classes.)36 b(For)24 b(example,)i(if)e
+FH(e)g FP(is)g(an)h(ob-)299 3609 y(ject)e(of)g(the)f(Employee)i(class,)
+f(and)g FH(p)f FP(an)g(object)i(of)f(the)g(Person)g(class,)g(and)g(the)
+g(spouse)h(method)g(\(i.e.,)298 3779 y(attribute\))g(of)d(Employee)i
+(returns)g(an)f(instance)h(of)f(Person,)g(then)g(the)g(join)h
+(predicate)g FH(e:)p FP(spouse)29 b FA(==)24 b FH(p)300
+3948 y FP(was)f(implemented)j(as)d(a)g(pointer)i(from)f(the)g(spouse)h
+(method)f(of)g(Employee)g(to)g(the)f(Person)i(class.)575
+4117 y(T)-6 b(able)17 b(5.1)f(also)g(shows)h(the)g(number)g(of)f(V)-12
+b(olcano)18 b(transformation)h(and)e(implementation)i(rules)300
+4287 y(that)32 b(are)g(matched)h(by)e(each)i(query)-6
+b(.)56 b(These)32 b(are)g(the)g(rules)g(whose)g(left)g(hand)h(sides)f
+(match)g(a)f(sub-)300 4456 y(expression.)55 b(However)l(,)33
+b(not)e(all)g(the)g(rules)g(were)g(necessarily)j(applicable.)55
+b(For)30 b(instance,)k(an)d(im-)300 4625 y(plementation)i(rule)d(with)f
+(an)h(index)h(scan)f(would)g(not)g(apply)h(to)f(E21,)g(although)i(it)d
+(might)h(apply)h(to)300 4795 y(E22.)582 4964 y(Random)23
+b(queries)h(were)f(generated)i(for)d(optimization)j(using)f(a)e(random)
+i(number)f(generator)1905 5349 y(69)p eop
+%%Page: 70 82
+70 81 bop 306 303 3272 4 v 306 2021 4 1718 v 423 1763
+a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007
+@urx 501.875000 @ury 1785 @rwi @setspecial
+%%BeginDocument: runtime_Q1_oodb.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+0.000000 0.000000 0.000000 setrgbcolor
+1 setlinewidth
+/Times-Italic findfont
+60 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 372 l
+621 362 m
+621 372 l
+822 362 m
+822 372 l
+1023 362 m
+1023 372 l
+1225 362 m
+1225 372 l
+1426 362 m
+1426 372 l
+1627 362 m
+1627 372 l
+1828 362 m
+1828 372 l
+2030 362 m
+2030 372 l
+420 1704 m
+420 1694 l
+621 1704 m
+621 1694 l
+822 1704 m
+822 1694 l
+1023 1704 m
+1023 1694 l
+1225 1704 m
+1225 1694 l
+1426 1704 m
+1426 1694 l
+1627 1704 m
+1627 1694 l
+1828 1704 m
+1828 1694 l
+2030 1704 m
+2030 1694 l
+stroke
+420 362 m
+420 382 l
+621 362 m
+621 382 l
+822 362 m
+822 382 l
+1023 362 m
+1023 382 l
+1225 362 m
+1225 382 l
+1426 362 m
+1426 382 l
+1627 362 m
+1627 382 l
+1828 362 m
+1828 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+621 1704 m
+621 1684 l
+822 1704 m
+822 1684 l
+1023 1704 m
+1023 1684 l
+1225 1704 m
+1225 1684 l
+1426 1704 m
+1426 1684 l
+1627 1704 m
+1627 1684 l
+1828 1704 m
+1828 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 287 m
+gsave
+621 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 287 m
+gsave
+822 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 287 m
+gsave
+1023 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 287 m
+gsave
+1225 287 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 287 m
+gsave
+1426 287 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 287 m
+gsave
+1627 287 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 287 m
+gsave
+1828 287 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 586 m
+430 586 l
+420 809 m
+430 809 l
+420 1033 m
+430 1033 l
+420 1257 m
+430 1257 l
+420 1480 m
+430 1480 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 586 m
+2020 586 l
+2030 809 m
+2020 809 l
+2030 1033 m
+2020 1033 l
+2030 1257 m
+2020 1257 l
+2030 1480 m
+2020 1480 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 586 m
+440 586 l
+420 809 m
+440 809 l
+420 1033 m
+440 1033 l
+420 1257 m
+440 1257 l
+420 1480 m
+440 1480 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 586 m
+2010 586 l
+2030 809 m
+2010 809 l
+2030 1033 m
+2010 1033 l
+2030 1257 m
+2010 1257 l
+2030 1480 m
+2010 1480 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0.0) RJ
+(0.0) show
+grestore
+newpath
+366 586 m
+gsave
+366 586 translate
+0 rotate
+0 -30 m
+(0.5) RJ
+(0.5) show
+grestore
+newpath
+366 809 m
+gsave
+366 809 translate
+0 rotate
+0 -30 m
+(1.0) RJ
+(1.0) show
+grestore
+newpath
+366 1033 m
+gsave
+366 1033 translate
+0 rotate
+0 -30 m
+(1.5) RJ
+(1.5) show
+grestore
+newpath
+366 1257 m
+gsave
+366 1257 translate
+0 rotate
+0 -30 m
+(2.0) RJ
+(2.0) show
+grestore
+newpath
+366 1480 m
+gsave
+366 1480 translate
+0 rotate
+0 -30 m
+(2.5) RJ
+(2.5) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(3.0) RJ
+(3.0) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+194 1033 m
+gsave
+194 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query E11) CS
+(Average CPU Time for Query E11) show
+grestore
+newpath
+420 402 m
+621 516 l
+822 633 l
+1023 755 l
+1225 869 l
+1426 1000 l
+1627 1130 l
+1828 1262 l
+2030 1384 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 402 30 0 360 arc
+gsave fill grestore
+stroke
+621 516 30 0 360 arc
+gsave fill grestore
+stroke
+822 633 30 0 360 arc
+gsave fill grestore
+stroke
+1023 755 30 0 360 arc
+gsave fill grestore
+stroke
+1225 869 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1000 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1130 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1262 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1384 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 404 m
+621 519 l
+822 642 l
+1023 767 l
+1225 895 l
+1426 1020 l
+1627 1175 l
+1828 1295 l
+2030 1436 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 434 m
+390 404 l
+420 374 l
+450 404 l
+closepath
+gsave eofill grestore
+stroke
+621 549 m
+591 519 l
+621 489 l
+651 519 l
+closepath
+gsave eofill grestore
+stroke
+822 672 m
+792 642 l
+822 612 l
+852 642 l
+closepath
+gsave eofill grestore
+stroke
+1023 797 m
+993 767 l
+1023 737 l
+1053 767 l
+closepath
+gsave eofill grestore
+stroke
+1225 925 m
+1195 895 l
+1225 865 l
+1255 895 l
+closepath
+gsave eofill grestore
+stroke
+1426 1050 m
+1396 1020 l
+1426 990 l
+1456 1020 l
+closepath
+gsave eofill grestore
+stroke
+1627 1205 m
+1597 1175 l
+1627 1145 l
+1657 1175 l
+closepath
+gsave eofill grestore
+stroke
+1828 1325 m
+1798 1295 l
+1828 1265 l
+1858 1295 l
+closepath
+gsave eofill grestore
+stroke
+2030 1466 m
+2000 1436 l
+2030 1406 l
+2060 1436 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1440 m
+946 1664 l
+1574 1664 l
+1574 1440 l
+946 1440 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1608 m
+1191 1608 l
+stroke
+995 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1608 m
+gsave
+1240 1608 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1496 m
+1191 1496 l
+stroke
+995 1526 m
+965 1496 l
+995 1466 l
+1025 1496 l
+closepath
+gsave eofill grestore
+stroke
+1191 1526 m
+1161 1496 l
+1191 1466 l
+1221 1496 l
+closepath
+gsave eofill grestore
+stroke
+1240 1496 m
+gsave
+1240 1496 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 953 1897 a Fy(\(a\))19 b(Query)g(E1)m(1)p
+1951 1996 4 1668 v 1998 1763 a @beginspecial 18.067490
+@llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1785
+@rwi @setspecial
+%%BeginDocument: runtime_Q2_oodb.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 382 l
+621 362 m
+621 382 l
+822 362 m
+822 382 l
+1023 362 m
+1023 382 l
+1225 362 m
+1225 382 l
+1426 362 m
+1426 382 l
+1627 362 m
+1627 382 l
+1828 362 m
+1828 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+621 1704 m
+621 1684 l
+822 1704 m
+822 1684 l
+1023 1704 m
+1023 1684 l
+1225 1704 m
+1225 1684 l
+1426 1704 m
+1426 1684 l
+1627 1704 m
+1627 1684 l
+1828 1704 m
+1828 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 287 m
+gsave
+621 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 287 m
+gsave
+822 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 287 m
+gsave
+1023 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 287 m
+gsave
+1225 287 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 287 m
+gsave
+1426 287 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 287 m
+gsave
+1627 287 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 287 m
+gsave
+1828 287 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 586 m
+430 586 l
+420 809 m
+430 809 l
+420 1033 m
+430 1033 l
+420 1257 m
+430 1257 l
+420 1480 m
+430 1480 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 586 m
+2020 586 l
+2030 809 m
+2020 809 l
+2030 1033 m
+2020 1033 l
+2030 1257 m
+2020 1257 l
+2030 1480 m
+2020 1480 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 586 m
+440 586 l
+420 809 m
+440 809 l
+420 1033 m
+440 1033 l
+420 1257 m
+440 1257 l
+420 1480 m
+440 1480 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 586 m
+2010 586 l
+2030 809 m
+2010 809 l
+2030 1033 m
+2010 1033 l
+2030 1257 m
+2010 1257 l
+2030 1480 m
+2010 1480 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0.0) RJ
+(0.0) show
+grestore
+newpath
+366 586 m
+gsave
+366 586 translate
+0 rotate
+0 -30 m
+(0.5) RJ
+(0.5) show
+grestore
+newpath
+366 809 m
+gsave
+366 809 translate
+0 rotate
+0 -30 m
+(1.0) RJ
+(1.0) show
+grestore
+newpath
+366 1033 m
+gsave
+366 1033 translate
+0 rotate
+0 -30 m
+(1.5) RJ
+(1.5) show
+grestore
+newpath
+366 1257 m
+gsave
+366 1257 translate
+0 rotate
+0 -30 m
+(2.0) RJ
+(2.0) show
+grestore
+newpath
+366 1480 m
+gsave
+366 1480 translate
+0 rotate
+0 -30 m
+(2.5) RJ
+(2.5) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(3.0) RJ
+(3.0) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+194 1033 m
+gsave
+194 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query E12) CS
+(Average CPU Time for Query E12) show
+grestore
+newpath
+420 401 m
+621 517 l
+822 636 l
+1023 750 l
+1225 867 l
+1426 992 l
+1627 1124 l
+1828 1246 l
+2030 1386 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 401 30 0 360 arc
+gsave fill grestore
+stroke
+621 517 30 0 360 arc
+gsave fill grestore
+stroke
+822 636 30 0 360 arc
+gsave fill grestore
+stroke
+1023 750 30 0 360 arc
+gsave fill grestore
+stroke
+1225 867 30 0 360 arc
+gsave fill grestore
+stroke
+1426 992 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1124 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1246 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1386 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 396 m
+621 511 l
+822 633 l
+1023 762 l
+1225 885 l
+1426 1017 l
+1627 1159 l
+1828 1295 l
+2030 1437 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 426 m
+390 396 l
+420 366 l
+450 396 l
+closepath
+gsave eofill grestore
+stroke
+621 541 m
+591 511 l
+621 481 l
+651 511 l
+closepath
+gsave eofill grestore
+stroke
+822 663 m
+792 633 l
+822 603 l
+852 633 l
+closepath
+gsave eofill grestore
+stroke
+1023 792 m
+993 762 l
+1023 732 l
+1053 762 l
+closepath
+gsave eofill grestore
+stroke
+1225 915 m
+1195 885 l
+1225 855 l
+1255 885 l
+closepath
+gsave eofill grestore
+stroke
+1426 1047 m
+1396 1017 l
+1426 987 l
+1456 1017 l
+closepath
+gsave eofill grestore
+stroke
+1627 1189 m
+1597 1159 l
+1627 1129 l
+1657 1159 l
+closepath
+gsave eofill grestore
+stroke
+1828 1325 m
+1798 1295 l
+1828 1265 l
+1858 1295 l
+closepath
+gsave eofill grestore
+stroke
+2030 1467 m
+2000 1437 l
+2030 1407 l
+2060 1437 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1440 m
+946 1664 l
+1574 1664 l
+1574 1440 l
+946 1440 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1608 m
+1191 1608 l
+stroke
+995 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1608 m
+gsave
+1240 1608 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1496 m
+1191 1496 l
+stroke
+995 1526 m
+965 1496 l
+995 1466 l
+1025 1496 l
+closepath
+gsave eofill grestore
+stroke
+1191 1526 m
+1161 1496 l
+1191 1466 l
+1221 1496 l
+closepath
+gsave eofill grestore
+stroke
+1240 1496 m
+gsave
+1240 1496 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 2525 1897 a(\(b\))g(Query)g(E12)p 3574 2021
+4 1718 v 306 2024 3272 4 v 3576 2041 19 1724 v 322 2041
+3272 19 v 521 2236 a FP(Figure)24 b(5.3:)32 b(Benchmarking)26
+b(the)d(Open)h(OODB)d(optimizer)k(\320)e(queries)i(E1)m(1)e(and)h(E12)
+298 2613 y(as)d(follows.)32 b(The)21 b(set)h(of)f(stored)i(\256les)f
+(\(classes\))h(was)f(\256xed.)30 b(Each)21 b(query)i(contained)h(a)e
+(random)g(order)300 2782 y(of)k(classes)i(in)f(the)g(\(left-deep\))i
+(operator)f(trees.)41 b(For)26 b(each)h(query)-6 b(,)28
+b(the)f(catalog)h(information)h(\(cardi-)300 2952 y(nality)e(of)f
+(classes,)h(record)g(widths,)g(etc.\))f(was)f(varied.)38
+b(The)26 b(join)g(and)g(selection)i(predicates)h(\(where)300
+3121 y(applicable\))e(were)c(generated)j(subject)f(to)f(the)g
+(constraints)i(described)g(above.)300 3428 y FN(5.3.3)99
+b(Performance)26 b(Results)f(Using)f(the)i(Open)f(OODB)g(Optimizer)583
+3658 y FP(Queries)32 b(E1)m(1)e(through)j(E42)d(were)g(optimized)j(for)
+d(increasing)k(number)d FH(N)40 b FP(of)31 b(joins.)53
+b(For)295 3828 y(each)21 b(query)f(and)g(a)f(\256xed)g(value)i(of)e
+FH(N)10 b FP(,)19 b(we)g(varied)h(the)g(cardinalities,)j(record)e
+(widths,)g(etc.)e(of)g(the)h(base)293 3997 y(classes)f(5)d(times,)j
+(each)f(time)f(generating)j(a)c(query)j(with)d(dif)n(ferent)k(class)e
+(properties,)j(and)d(averaged)h(the)295 4166 y(run-times)h(over)g(the)f
+(5)g(query)h(instances)h(to)e(generate)i(the)e(per)n(-query)j
+(optimization)g(time.)29 b(Thus,)20 b(each)295 4336 y(point)h(in)e(our)
+g(graphs)i(represents)h(the)e(average)h(of)e(5)g(queries.)31
+b(The)19 b(run-times)h(were)g(measured)3348 4303 y Fv(6)3408
+4336 y FP(using)297 4505 y(the)h(GNU)e Fi(time)f FP(command.)30
+b(All)20 b(experiments)j(were)e(performed)h(on)f(a)f(lightly)j(loaded)f
+(DECstation)300 4675 y(5000/200)k(running)g(Ultrix)e(4.2.)p
+300 4756 1320 4 v 400 4809 a Fu(6)434 4841 y Fy(Since)f(the)f
+(run-times)h(were)f(too)h(small)f(to)h(be)g(measured)g(accurately)g
+(with)g Ff(time)p Fy(,)f(each)h(query)g(instance)g(was)g(opti-)300
+4932 y(mized)h(3000)g(times)f(\(in)g(a)g(loop\))h(and)g(the)f(total)g
+(time)g(was)g(divided)i(by)e(3000)i(to)e(obtain)h(optimization)g(time)f
+(for)g(a)g(given)300 5024 y(query)-5 b(.)1905 5349 y
+FP(70)p eop
+%%Page: 71 83
+71 82 bop 306 403 3272 4 v 306 2101 4 1699 v 427 1843
+a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007
+@urx 501.875000 @ury 1771 @rwi @setspecial
+%%BeginDocument: runtime_Q3_oodb.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 372 l
+621 362 m
+621 372 l
+822 362 m
+822 372 l
+1023 362 m
+1023 372 l
+1225 362 m
+1225 372 l
+1426 362 m
+1426 372 l
+1627 362 m
+1627 372 l
+1828 362 m
+1828 372 l
+2030 362 m
+2030 372 l
+420 1704 m
+420 1694 l
+621 1704 m
+621 1694 l
+822 1704 m
+822 1694 l
+1023 1704 m
+1023 1694 l
+1225 1704 m
+1225 1694 l
+1426 1704 m
+1426 1694 l
+1627 1704 m
+1627 1694 l
+1828 1704 m
+1828 1694 l
+2030 1704 m
+2030 1694 l
+stroke
+420 362 m
+420 382 l
+621 362 m
+621 382 l
+822 362 m
+822 382 l
+1023 362 m
+1023 382 l
+1225 362 m
+1225 382 l
+1426 362 m
+1426 382 l
+1627 362 m
+1627 382 l
+1828 362 m
+1828 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+621 1704 m
+621 1684 l
+822 1704 m
+822 1684 l
+1023 1704 m
+1023 1684 l
+1225 1704 m
+1225 1684 l
+1426 1704 m
+1426 1684 l
+1627 1704 m
+1627 1684 l
+1828 1704 m
+1828 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 287 m
+gsave
+621 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 287 m
+gsave
+822 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 287 m
+gsave
+1023 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 287 m
+gsave
+1225 287 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 287 m
+gsave
+1426 287 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 287 m
+gsave
+1627 287 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 287 m
+gsave
+1828 287 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 496 m
+430 496 l
+420 630 m
+430 630 l
+420 765 m
+430 765 l
+420 899 m
+430 899 l
+420 1033 m
+430 1033 l
+420 1167 m
+430 1167 l
+420 1301 m
+430 1301 l
+420 1436 m
+430 1436 l
+420 1570 m
+430 1570 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 496 m
+2020 496 l
+2030 630 m
+2020 630 l
+2030 765 m
+2020 765 l
+2030 899 m
+2020 899 l
+2030 1033 m
+2020 1033 l
+2030 1167 m
+2020 1167 l
+2030 1301 m
+2020 1301 l
+2030 1436 m
+2020 1436 l
+2030 1570 m
+2020 1570 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 630 m
+440 630 l
+420 899 m
+440 899 l
+420 1167 m
+440 1167 l
+420 1436 m
+440 1436 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 630 m
+2010 630 l
+2030 899 m
+2010 899 l
+2030 1167 m
+2010 1167 l
+2030 1436 m
+2010 1436 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0.0) RJ
+(0.0) show
+grestore
+newpath
+366 630 m
+gsave
+366 630 translate
+0 rotate
+0 -30 m
+(1.0) RJ
+(1.0) show
+grestore
+newpath
+366 899 m
+gsave
+366 899 translate
+0 rotate
+0 -30 m
+(2.0) RJ
+(2.0) show
+grestore
+newpath
+366 1167 m
+gsave
+366 1167 translate
+0 rotate
+0 -30 m
+(3.0) RJ
+(3.0) show
+grestore
+newpath
+366 1436 m
+gsave
+366 1436 translate
+0 rotate
+0 -30 m
+(4.0) RJ
+(4.0) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(5.0) RJ
+(5.0) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+194 1033 m
+gsave
+194 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query E21) CS
+(Average CPU Time for Query E21) show
+grestore
+newpath
+420 386 m
+621 470 l
+822 554 l
+1023 643 l
+1225 729 l
+1426 827 l
+1627 927 l
+1828 1029 l
+2030 1503 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 386 30 0 360 arc
+gsave fill grestore
+stroke
+621 470 30 0 360 arc
+gsave fill grestore
+stroke
+822 554 30 0 360 arc
+gsave fill grestore
+stroke
+1023 643 30 0 360 arc
+gsave fill grestore
+stroke
+1225 729 30 0 360 arc
+gsave fill grestore
+stroke
+1426 827 30 0 360 arc
+gsave fill grestore
+stroke
+1627 927 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1029 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1503 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 386 m
+621 465 l
+822 545 l
+1023 617 l
+1225 705 l
+1426 786 l
+1627 878 l
+1828 974 l
+2030 1443 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 416 m
+390 386 l
+420 356 l
+450 386 l
+closepath
+gsave eofill grestore
+stroke
+621 495 m
+591 465 l
+621 435 l
+651 465 l
+closepath
+gsave eofill grestore
+stroke
+822 575 m
+792 545 l
+822 515 l
+852 545 l
+closepath
+gsave eofill grestore
+stroke
+1023 647 m
+993 617 l
+1023 587 l
+1053 617 l
+closepath
+gsave eofill grestore
+stroke
+1225 735 m
+1195 705 l
+1225 675 l
+1255 705 l
+closepath
+gsave eofill grestore
+stroke
+1426 816 m
+1396 786 l
+1426 756 l
+1456 786 l
+closepath
+gsave eofill grestore
+stroke
+1627 908 m
+1597 878 l
+1627 848 l
+1657 878 l
+closepath
+gsave eofill grestore
+stroke
+1828 1004 m
+1798 974 l
+1828 944 l
+1858 974 l
+closepath
+gsave eofill grestore
+stroke
+2030 1473 m
+2000 1443 l
+2030 1413 l
+2060 1443 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1440 m
+946 1664 l
+1574 1664 l
+1574 1440 l
+946 1440 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1608 m
+1191 1608 l
+stroke
+995 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1608 m
+gsave
+1240 1608 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1496 m
+1191 1496 l
+stroke
+995 1526 m
+965 1496 l
+995 1466 l
+1025 1496 l
+closepath
+gsave eofill grestore
+stroke
+1191 1526 m
+1161 1496 l
+1191 1466 l
+1221 1496 l
+closepath
+gsave eofill grestore
+stroke
+1240 1496 m
+gsave
+1240 1496 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 952 1977 a Fy(\(a\))18 b(Query)i(E21)p 1951
+2076 4 1649 v 2003 1843 a @beginspecial 18.067490 @llx
+18.067490 @lly 554.070007 @urx 501.875000 @ury 1771 @rwi
+@setspecial
+%%BeginDocument: runtime_Q4_oodb.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 382 l
+621 362 m
+621 382 l
+822 362 m
+822 382 l
+1023 362 m
+1023 382 l
+1225 362 m
+1225 382 l
+1426 362 m
+1426 382 l
+1627 362 m
+1627 382 l
+1828 362 m
+1828 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+621 1704 m
+621 1684 l
+822 1704 m
+822 1684 l
+1023 1704 m
+1023 1684 l
+1225 1704 m
+1225 1684 l
+1426 1704 m
+1426 1684 l
+1627 1704 m
+1627 1684 l
+1828 1704 m
+1828 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 287 m
+gsave
+621 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 287 m
+gsave
+822 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 287 m
+gsave
+1023 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 287 m
+gsave
+1225 287 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 287 m
+gsave
+1426 287 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 287 m
+gsave
+1627 287 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 287 m
+gsave
+1828 287 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 496 m
+430 496 l
+420 630 m
+430 630 l
+420 765 m
+430 765 l
+420 899 m
+430 899 l
+420 1033 m
+430 1033 l
+420 1167 m
+430 1167 l
+420 1301 m
+430 1301 l
+420 1436 m
+430 1436 l
+420 1570 m
+430 1570 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 496 m
+2020 496 l
+2030 630 m
+2020 630 l
+2030 765 m
+2020 765 l
+2030 899 m
+2020 899 l
+2030 1033 m
+2020 1033 l
+2030 1167 m
+2020 1167 l
+2030 1301 m
+2020 1301 l
+2030 1436 m
+2020 1436 l
+2030 1570 m
+2020 1570 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 630 m
+440 630 l
+420 899 m
+440 899 l
+420 1167 m
+440 1167 l
+420 1436 m
+440 1436 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 630 m
+2010 630 l
+2030 899 m
+2010 899 l
+2030 1167 m
+2010 1167 l
+2030 1436 m
+2010 1436 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0.0) RJ
+(0.0) show
+grestore
+newpath
+366 630 m
+gsave
+366 630 translate
+0 rotate
+0 -30 m
+(1.0) RJ
+(1.0) show
+grestore
+newpath
+366 899 m
+gsave
+366 899 translate
+0 rotate
+0 -30 m
+(2.0) RJ
+(2.0) show
+grestore
+newpath
+366 1167 m
+gsave
+366 1167 translate
+0 rotate
+0 -30 m
+(3.0) RJ
+(3.0) show
+grestore
+newpath
+366 1436 m
+gsave
+366 1436 translate
+0 rotate
+0 -30 m
+(4.0) RJ
+(4.0) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(5.0) RJ
+(5.0) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+194 1033 m
+gsave
+194 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query E22) CS
+(Average CPU Time for Query E22) show
+grestore
+newpath
+420 385 m
+621 472 l
+822 551 l
+1023 641 l
+1225 727 l
+1426 829 l
+1627 920 l
+1828 1022 l
+2030 1507 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 385 30 0 360 arc
+gsave fill grestore
+stroke
+621 472 30 0 360 arc
+gsave fill grestore
+stroke
+822 551 30 0 360 arc
+gsave fill grestore
+stroke
+1023 641 30 0 360 arc
+gsave fill grestore
+stroke
+1225 727 30 0 360 arc
+gsave fill grestore
+stroke
+1426 829 30 0 360 arc
+gsave fill grestore
+stroke
+1627 920 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1022 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1507 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 385 m
+621 464 l
+822 544 l
+1023 618 l
+1225 703 l
+1426 787 l
+1627 876 l
+1828 979 l
+2030 1449 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 415 m
+390 385 l
+420 355 l
+450 385 l
+closepath
+gsave eofill grestore
+stroke
+621 494 m
+591 464 l
+621 434 l
+651 464 l
+closepath
+gsave eofill grestore
+stroke
+822 574 m
+792 544 l
+822 514 l
+852 544 l
+closepath
+gsave eofill grestore
+stroke
+1023 648 m
+993 618 l
+1023 588 l
+1053 618 l
+closepath
+gsave eofill grestore
+stroke
+1225 733 m
+1195 703 l
+1225 673 l
+1255 703 l
+closepath
+gsave eofill grestore
+stroke
+1426 817 m
+1396 787 l
+1426 757 l
+1456 787 l
+closepath
+gsave eofill grestore
+stroke
+1627 906 m
+1597 876 l
+1627 846 l
+1657 876 l
+closepath
+gsave eofill grestore
+stroke
+1828 1009 m
+1798 979 l
+1828 949 l
+1858 979 l
+closepath
+gsave eofill grestore
+stroke
+2030 1479 m
+2000 1449 l
+2030 1419 l
+2060 1449 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1440 m
+946 1664 l
+1574 1664 l
+1574 1440 l
+946 1440 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1608 m
+1191 1608 l
+stroke
+995 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1608 m
+gsave
+1240 1608 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1496 m
+1191 1496 l
+stroke
+995 1526 m
+965 1496 l
+995 1466 l
+1025 1496 l
+closepath
+gsave eofill grestore
+stroke
+1191 1526 m
+1161 1496 l
+1191 1466 l
+1221 1496 l
+closepath
+gsave eofill grestore
+stroke
+1240 1496 m
+gsave
+1240 1496 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 2525 1977 a(\(b\))f(Query)g(E22)p 3574 2101
+4 1699 v 306 2104 3272 4 v 3576 2121 19 1706 v 322 2121
+3272 19 v 520 2317 a FP(Figure)24 b(5.4:)31 b(Benchmarking)26
+b(the)e(Open)f(OODB)f(optimizer)j(\320)d(queries)k(E21)d(and)h(E22)579
+2694 y(The)c(optimization)j(times)d(for)g(each)g(query)i(for)e(both)g
+(approaches)j(\(Prairie)e(and)f(V)-12 b(olcano\))22 b(are)300
+2863 y(shown)j(in)f(Figures)h(5.3)f(through)i(5.6.)33
+b(The)24 b(number)h(of)f(joins)h FH(N)34 b FP(in)24 b(each)h(set)f(of)g
+(graphs)i(was)e(varied)300 3033 y(to)f(a)h(maximum)f(of)g(8,)g(or)h
+(until)g(virtual)h(memory)f(was)f(exhausted.)579 3202
+y(The)d(\256rst)g(set)g(of)f(graphs)j(\(Figures)f(5.3\(a\))g(and)f
+(5.3\(b\)\))h(shows)g(the)f(performance)i(of)e(a)g(simple)299
+3371 y(relational-type)28 b(query)-6 b(.)32 b(The)22
+b(optimization)k(times)d(are)g(almost)h(identical)h(between)f(Prairie)f
+(and)h(V)-12 b(ol-)299 3541 y(cano,)24 b(and)g(the)f(notable)i(point)f
+(is)f(that)h(the)f(presence)i(of)e(an)g(index)i(does)f(not)f(change)i
+(the)e(optimizer)s(')-5 b(s)296 3710 y(behavior)l(,)23
+b(i.e.,)d(the)g(two)g(graphs)i(are)e(identical.)32 b(This)20
+b(arises)h(because)h(the)e(rule)h(set)f(had)h(only)g(two)e(join)300
+3879 y(algorithms)26 b(\(Ptr)p 853 3879 28 4 v 33 w(hash)p
+1051 3879 V 34 w(join)e(and)g(Hash)p 1589 3879 V 34 w(join\),)g
+(neither)h(of)f(which)g(makes)g(use)f(of)h(any)g(indices.)583
+4049 y(The)j(second)i(set)f(of)f(graphs)i(\(Figures)g(5.4\(a\))f(and)g
+(5.4\(b\)\))g(shows)g(the)g(results)h(of)e(optimiz-)298
+4218 y(ing)c(E21)e(and)i(E22.)29 b(Here,)22 b(as)g(in)g(Figures)h
+(5.3\(a\))g(and)f(5.3\(b\),)h(the)f(presence)i(\(or)e(absence\))i(of)e
+(indices)300 4387 y(makes)h(no)h(dif)n(ference.)33 b(Both)24
+b(the)f(Prairie)h(and)g(V)-12 b(olcano)24 b(approaches)j(have)d
+(comparable)h(run-times.)300 4557 y(The)e(sharp)h(jump)f(in)h(the)f
+(graphs)i(from)e(7-way)h(to)f(8-way)h(joins)g(is)f(due)h(to)f(the)h
+(fact)g(that)f(since)i(all)e(op-)299 4726 y(timization)h(is)e(done)h
+(in)f(main)g(memory)-6 b(,)23 b(dynamic)g(memory)g(allocation)i
+(\(caused)f(by)e Fi(malloc)d FP(calls\))300 4896 y(for)28
+b(storing)h(the)e(search)i(space)g(results)f(in)g(a)f(lot)g(of)h
+(thrashing)h(at)f(this)g(point.)43 b(W)-7 b(e)27 b(speculate)i(that)f
+(in)300 5065 y(systems)d(with)e(more)h(virtual)h(memory)-6
+b(,)23 b(the)h(graphs)h(will)e(be)h(smoother)-5 b(.)1905
+5349 y(71)p eop
+%%Page: 72 84
+72 83 bop 306 403 3272 4 v 306 2101 4 1699 v 427 1843
+a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007
+@urx 501.875000 @ury 1771 @rwi @setspecial
+%%BeginDocument: runtime_Q5_oodb.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 372 l
+688 362 m
+688 372 l
+956 362 m
+956 372 l
+1225 362 m
+1225 372 l
+1493 362 m
+1493 372 l
+1761 362 m
+1761 372 l
+2030 362 m
+2030 372 l
+420 1704 m
+420 1694 l
+688 1704 m
+688 1694 l
+956 1704 m
+956 1694 l
+1225 1704 m
+1225 1694 l
+1493 1704 m
+1493 1694 l
+1761 1704 m
+1761 1694 l
+2030 1704 m
+2030 1694 l
+stroke
+420 362 m
+420 382 l
+956 362 m
+956 382 l
+1493 362 m
+1493 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+956 1704 m
+956 1684 l
+1493 1704 m
+1493 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+956 287 m
+gsave
+956 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 287 m
+gsave
+1493 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 530 m
+430 530 l
+420 698 m
+430 698 l
+420 865 m
+430 865 l
+420 1033 m
+430 1033 l
+420 1201 m
+430 1201 l
+420 1368 m
+430 1368 l
+420 1536 m
+430 1536 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 530 m
+2020 530 l
+2030 698 m
+2020 698 l
+2030 865 m
+2020 865 l
+2030 1033 m
+2020 1033 l
+2030 1201 m
+2020 1201 l
+2030 1368 m
+2020 1368 l
+2030 1536 m
+2020 1536 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 698 m
+440 698 l
+420 1033 m
+440 1033 l
+420 1368 m
+440 1368 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 698 m
+2010 698 l
+2030 1033 m
+2010 1033 l
+2030 1368 m
+2010 1368 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0.0) RJ
+(0.0) show
+grestore
+newpath
+366 698 m
+gsave
+366 698 translate
+0 rotate
+0 -30 m
+(2.0) RJ
+(2.0) show
+grestore
+newpath
+366 1033 m
+gsave
+366 1033 translate
+0 rotate
+0 -30 m
+(4.0) RJ
+(4.0) show
+grestore
+newpath
+366 1368 m
+gsave
+366 1368 translate
+0 rotate
+0 -30 m
+(6.0) RJ
+(6.0) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(8.0) RJ
+(8.0) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+194 1033 m
+gsave
+194 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query E31) CS
+(Average CPU Time for Query E31) show
+grestore
+newpath
+420 408 m
+956 490 l
+1493 643 l
+2030 1698 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 408 30 0 360 arc
+gsave fill grestore
+stroke
+956 490 30 0 360 arc
+gsave fill grestore
+stroke
+1493 643 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1698 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 409 m
+956 501 l
+1493 659 l
+2030 1659 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 439 m
+390 409 l
+420 379 l
+450 409 l
+closepath
+gsave eofill grestore
+stroke
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+closepath
+gsave eofill grestore
+stroke
+1493 689 m
+1463 659 l
+1493 629 l
+1523 659 l
+closepath
+gsave eofill grestore
+stroke
+2030 1689 m
+2000 1659 l
+2030 1629 l
+2060 1659 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1440 m
+946 1664 l
+1574 1664 l
+1574 1440 l
+946 1440 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1608 m
+1191 1608 l
+stroke
+995 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1608 m
+gsave
+1240 1608 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1496 m
+1191 1496 l
+stroke
+995 1526 m
+965 1496 l
+995 1466 l
+1025 1496 l
+closepath
+gsave eofill grestore
+stroke
+1191 1526 m
+1161 1496 l
+1191 1466 l
+1221 1496 l
+closepath
+gsave eofill grestore
+stroke
+1240 1496 m
+gsave
+1240 1496 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 952 1977 a Fy(\(a\))18 b(Query)i(E31)p 1951
+2076 4 1649 v 2003 1843 a @beginspecial 18.067490 @llx
+18.067490 @lly 554.070007 @urx 501.875000 @ury 1771 @rwi
+@setspecial
+%%BeginDocument: runtime_Q6_oodb.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 372 l
+688 362 m
+688 372 l
+956 362 m
+956 372 l
+1225 362 m
+1225 372 l
+1493 362 m
+1493 372 l
+1761 362 m
+1761 372 l
+2030 362 m
+2030 372 l
+420 1704 m
+420 1694 l
+688 1704 m
+688 1694 l
+956 1704 m
+956 1694 l
+1225 1704 m
+1225 1694 l
+1493 1704 m
+1493 1694 l
+1761 1704 m
+1761 1694 l
+2030 1704 m
+2030 1694 l
+stroke
+420 362 m
+420 382 l
+956 362 m
+956 382 l
+1493 362 m
+1493 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+956 1704 m
+956 1684 l
+1493 1704 m
+1493 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+956 287 m
+gsave
+956 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 287 m
+gsave
+1493 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 496 m
+430 496 l
+420 630 m
+430 630 l
+420 765 m
+430 765 l
+420 899 m
+430 899 l
+420 1033 m
+430 1033 l
+420 1167 m
+430 1167 l
+420 1301 m
+430 1301 l
+420 1436 m
+430 1436 l
+420 1570 m
+430 1570 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 496 m
+2020 496 l
+2030 630 m
+2020 630 l
+2030 765 m
+2020 765 l
+2030 899 m
+2020 899 l
+2030 1033 m
+2020 1033 l
+2030 1167 m
+2020 1167 l
+2030 1301 m
+2020 1301 l
+2030 1436 m
+2020 1436 l
+2030 1570 m
+2020 1570 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 630 m
+440 630 l
+420 899 m
+440 899 l
+420 1167 m
+440 1167 l
+420 1436 m
+440 1436 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 630 m
+2010 630 l
+2030 899 m
+2010 899 l
+2030 1167 m
+2010 1167 l
+2030 1436 m
+2010 1436 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0.0) RJ
+(0.0) show
+grestore
+newpath
+366 630 m
+gsave
+366 630 translate
+0 rotate
+0 -30 m
+(2.0) RJ
+(2.0) show
+grestore
+newpath
+366 899 m
+gsave
+366 899 translate
+0 rotate
+0 -30 m
+(4.0) RJ
+(4.0) show
+grestore
+newpath
+366 1167 m
+gsave
+366 1167 translate
+0 rotate
+0 -30 m
+(6.0) RJ
+(6.0) show
+grestore
+newpath
+366 1436 m
+gsave
+366 1436 translate
+0 rotate
+0 -30 m
+(8.0) RJ
+(8.0) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(10.0) RJ
+(10.0) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+133 1033 m
+gsave
+133 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query E32) CS
+(Average CPU Time for Query E32) show
+grestore
+newpath
+420 399 m
+956 470 l
+1493 607 l
+2030 1576 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 399 30 0 360 arc
+gsave fill grestore
+stroke
+956 470 30 0 360 arc
+gsave fill grestore
+stroke
+1493 607 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1576 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 400 m
+956 473 l
+1493 604 l
+2030 1397 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+closepath
+gsave eofill grestore
+stroke
+956 503 m
+926 473 l
+956 443 l
+986 473 l
+closepath
+gsave eofill grestore
+stroke
+1493 634 m
+1463 604 l
+1493 574 l
+1523 604 l
+closepath
+gsave eofill grestore
+stroke
+2030 1427 m
+2000 1397 l
+2030 1367 l
+2060 1397 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1440 m
+946 1664 l
+1574 1664 l
+1574 1440 l
+946 1440 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1608 m
+1191 1608 l
+stroke
+995 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1608 m
+gsave
+1240 1608 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1496 m
+1191 1496 l
+stroke
+995 1526 m
+965 1496 l
+995 1466 l
+1025 1496 l
+closepath
+gsave eofill grestore
+stroke
+1191 1526 m
+1161 1496 l
+1191 1466 l
+1221 1496 l
+closepath
+gsave eofill grestore
+stroke
+1240 1496 m
+gsave
+1240 1496 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 2525 1977 a(\(b\))f(Query)g(E32)p 3574 2101
+4 1699 v 306 2104 3272 4 v 3576 2121 19 1706 v 322 2121
+3272 19 v 520 2317 a FP(Figure)24 b(5.5:)31 b(Benchmarking)26
+b(the)e(Open)f(OODB)f(optimizer)j(\320)d(queries)k(E31)d(and)h(E32)578
+2694 y(The)17 b(third)i(and)g(fourth)h(sets)f(of)f(graphs)h(in)g
+(Figures)g(5.5)f(and)g(5.6)g(are)h(optimizations)i(of)d(queries)300
+2863 y(with)29 b(a)h(selection)i(predicate.)51 b(In)30
+b(these)h(cases,)h(the)d(presence)j(of)e(an)g(index)g(makes)h(a)e(dif)n
+(ference)j(if)298 3033 y(the)23 b(index)g(is)f(referenced)j(in)d(the)g
+(selection)i(predicate)h(\(as)d(in)g(our)h(synthetically)i(generated)g
+(queries\).)300 3202 y(Also,)g(in)g(these)i(two)d(\256gures,)i(the)g
+(performance)i(of)d(both)h(Prairie)g(and)f(V)-12 b(olcano)27
+b(was)e(almost)h(identi-)300 3371 y(cal,)i(except)g(that)f(Prairie)h
+(does)f(slightly)i(worse)e(due)h(to)f(the)g(lar)n(ger)h(number)g(of)f
+Fi(malloc)c FP(calls)28 b(that)300 3541 y(the)d(P2V)e(preprocessor)28
+b(introduces)f(\(because)g(of)d(shared)i(property)h(structures)g(using)
+f(pointers;)h(see)300 3710 y(Figure)d(4.2\).)31 b(Also,)23
+b(note)h(that)g(we)e(could)j(only)f(go)g(up)f(to)g(3-way)h(joins)h
+(before)f(virtual)h(memory)f(was)300 3879 y(exhausted.)46
+b(As)27 b(the)h(available)j(memory)d(decreases,)j(there)d(is)g
+(increased)i(thrashing)h(\(as)d(shown)g(by)300 4049 y(the)c(sharp)g
+(changes)i(in)d(slope)i(in)f(the)f(plots\))i(resulting)h(in)e(a)f(much)
+g(slower)h(optimization)j(process.)582 4218 y(It)21 b(is)h(instructive)
+j(to)d(compare)h(the)f(memory)g(requirements)j(in)d(the)g(optimization)
+j(of)d(the)g(var)n(-)300 4387 y(ious)j(queries.)36 b(As)24
+b(mentioned)i(earlier)l(,)h(the)e(V)-12 b(olcano)26 b(rule)f(engine)h
+(implements)g(its)f(optimization)i(in)300 4557 y(main)g(memory)-6
+b(,)27 b(i.e.,)g(it)f(stores)j(the)e(search)h(space)g(of)e(a)h(query)h
+(in)e(main)h(memory)-6 b(.)41 b(This)26 b(means)i(that)300
+4726 y(memory)g(can)g(become)h(a)e(bottleneck)k(in)d(the)g(size)h(of)e
+(queries)j(that)e(can)h(be)e(optimized.)46 b(Figure)28
+b(5.7)300 4896 y(compares)j(the)f(number)h(of)e(equivalent)k
+(expressions)g(generated)f(for)e(each)g(of)g(the)g(expressions)j(E1)300
+5065 y(through)c(E4.)42 b(It)27 b(is)g(important)i(to)f(note)g(that)g
+(not)g(all)f(equivalent)j(expressions)h(lead)d(to)f(valid)i(access)1905
+5349 y(72)p eop
+%%Page: 73 85
+73 84 bop 306 403 3272 4 v 306 2101 4 1699 v 427 1843
+a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007
+@urx 501.875000 @ury 1771 @rwi @setspecial
+%%BeginDocument: runtime_Q7_oodb.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 372 l
+688 362 m
+688 372 l
+956 362 m
+956 372 l
+1225 362 m
+1225 372 l
+1493 362 m
+1493 372 l
+1761 362 m
+1761 372 l
+2030 362 m
+2030 372 l
+420 1704 m
+420 1694 l
+688 1704 m
+688 1694 l
+956 1704 m
+956 1694 l
+1225 1704 m
+1225 1694 l
+1493 1704 m
+1493 1694 l
+1761 1704 m
+1761 1694 l
+2030 1704 m
+2030 1694 l
+stroke
+420 362 m
+420 382 l
+956 362 m
+956 382 l
+1493 362 m
+1493 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+956 1704 m
+956 1684 l
+1493 1704 m
+1493 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+956 287 m
+gsave
+956 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 287 m
+gsave
+1493 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 496 m
+430 496 l
+420 630 m
+430 630 l
+420 765 m
+430 765 l
+420 899 m
+430 899 l
+420 1033 m
+430 1033 l
+420 1167 m
+430 1167 l
+420 1301 m
+430 1301 l
+420 1436 m
+430 1436 l
+420 1570 m
+430 1570 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 496 m
+2020 496 l
+2030 630 m
+2020 630 l
+2030 765 m
+2020 765 l
+2030 899 m
+2020 899 l
+2030 1033 m
+2020 1033 l
+2030 1167 m
+2020 1167 l
+2030 1301 m
+2020 1301 l
+2030 1436 m
+2020 1436 l
+2030 1570 m
+2020 1570 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 630 m
+440 630 l
+420 899 m
+440 899 l
+420 1167 m
+440 1167 l
+420 1436 m
+440 1436 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 630 m
+2010 630 l
+2030 899 m
+2010 899 l
+2030 1167 m
+2010 1167 l
+2030 1436 m
+2010 1436 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0.0) RJ
+(0.0) show
+grestore
+newpath
+366 630 m
+gsave
+366 630 translate
+0 rotate
+0 -30 m
+(2.0) RJ
+(2.0) show
+grestore
+newpath
+366 899 m
+gsave
+366 899 translate
+0 rotate
+0 -30 m
+(4.0) RJ
+(4.0) show
+grestore
+newpath
+366 1167 m
+gsave
+366 1167 translate
+0 rotate
+0 -30 m
+(6.0) RJ
+(6.0) show
+grestore
+newpath
+366 1436 m
+gsave
+366 1436 translate
+0 rotate
+0 -30 m
+(8.0) RJ
+(8.0) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(10.0) RJ
+(10.0) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+133 1033 m
+gsave
+133 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query E41) CS
+(Average CPU Time for Query E41) show
+grestore
+newpath
+420 409 m
+956 489 l
+1493 642 l
+2030 1563 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 409 30 0 360 arc
+gsave fill grestore
+stroke
+956 489 30 0 360 arc
+gsave fill grestore
+stroke
+1493 642 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1563 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 404 m
+956 481 l
+1493 621 l
+2030 1404 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 434 m
+390 404 l
+420 374 l
+450 404 l
+closepath
+gsave eofill grestore
+stroke
+956 511 m
+926 481 l
+956 451 l
+986 481 l
+closepath
+gsave eofill grestore
+stroke
+1493 651 m
+1463 621 l
+1493 591 l
+1523 621 l
+closepath
+gsave eofill grestore
+stroke
+2030 1434 m
+2000 1404 l
+2030 1374 l
+2060 1404 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1440 m
+946 1664 l
+1574 1664 l
+1574 1440 l
+946 1440 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1608 m
+1191 1608 l
+stroke
+995 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1608 m
+gsave
+1240 1608 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1496 m
+1191 1496 l
+stroke
+995 1526 m
+965 1496 l
+995 1466 l
+1025 1496 l
+closepath
+gsave eofill grestore
+stroke
+1191 1526 m
+1161 1496 l
+1191 1466 l
+1221 1496 l
+closepath
+gsave eofill grestore
+stroke
+1240 1496 m
+gsave
+1240 1496 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 952 1977 a Fy(\(a\))18 b(Query)i(E41)p 1951
+2076 4 1649 v 2003 1843 a @beginspecial 18.067490 @llx
+18.067490 @lly 554.070007 @urx 501.875000 @ury 1771 @rwi
+@setspecial
+%%BeginDocument: runtime_Q8_oodb.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 382 l
+956 362 m
+956 382 l
+1493 362 m
+1493 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+956 1704 m
+956 1684 l
+1493 1704 m
+1493 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+956 287 m
+gsave
+956 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 287 m
+gsave
+1493 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 496 m
+430 496 l
+420 630 m
+430 630 l
+420 765 m
+430 765 l
+420 899 m
+430 899 l
+420 1033 m
+430 1033 l
+420 1167 m
+430 1167 l
+420 1301 m
+430 1301 l
+420 1436 m
+430 1436 l
+420 1570 m
+430 1570 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 496 m
+2020 496 l
+2030 630 m
+2020 630 l
+2030 765 m
+2020 765 l
+2030 899 m
+2020 899 l
+2030 1033 m
+2020 1033 l
+2030 1167 m
+2020 1167 l
+2030 1301 m
+2020 1301 l
+2030 1436 m
+2020 1436 l
+2030 1570 m
+2020 1570 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 630 m
+440 630 l
+420 899 m
+440 899 l
+420 1167 m
+440 1167 l
+420 1436 m
+440 1436 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 630 m
+2010 630 l
+2030 899 m
+2010 899 l
+2030 1167 m
+2010 1167 l
+2030 1436 m
+2010 1436 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0.0) RJ
+(0.0) show
+grestore
+newpath
+366 630 m
+gsave
+366 630 translate
+0 rotate
+0 -30 m
+(2.0) RJ
+(2.0) show
+grestore
+newpath
+366 899 m
+gsave
+366 899 translate
+0 rotate
+0 -30 m
+(4.0) RJ
+(4.0) show
+grestore
+newpath
+366 1167 m
+gsave
+366 1167 translate
+0 rotate
+0 -30 m
+(6.0) RJ
+(6.0) show
+grestore
+newpath
+366 1436 m
+gsave
+366 1436 translate
+0 rotate
+0 -30 m
+(8.0) RJ
+(8.0) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(10.0) RJ
+(10.0) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+133 1033 m
+gsave
+133 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query E42) CS
+(Average CPU Time for Query E42) show
+grestore
+newpath
+420 405 m
+956 483 l
+1493 622 l
+2030 1479 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 405 30 0 360 arc
+gsave fill grestore
+stroke
+956 483 30 0 360 arc
+gsave fill grestore
+stroke
+1493 622 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1479 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 404 m
+956 482 l
+1493 620 l
+2030 1409 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 434 m
+390 404 l
+420 374 l
+450 404 l
+closepath
+gsave eofill grestore
+stroke
+956 512 m
+926 482 l
+956 452 l
+986 482 l
+closepath
+gsave eofill grestore
+stroke
+1493 650 m
+1463 620 l
+1493 590 l
+1523 620 l
+closepath
+gsave eofill grestore
+stroke
+2030 1439 m
+2000 1409 l
+2030 1379 l
+2060 1409 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1440 m
+946 1664 l
+1574 1664 l
+1574 1440 l
+946 1440 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1608 m
+1191 1608 l
+stroke
+995 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1608 m
+gsave
+1240 1608 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1496 m
+1191 1496 l
+stroke
+995 1526 m
+965 1496 l
+995 1466 l
+1025 1496 l
+closepath
+gsave eofill grestore
+stroke
+1191 1526 m
+1161 1496 l
+1191 1466 l
+1221 1496 l
+closepath
+gsave eofill grestore
+stroke
+1240 1496 m
+gsave
+1240 1496 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 2525 1977 a(\(b\))f(Query)g(E42)p 3574 2101
+4 1699 v 306 2104 3272 4 v 3576 2121 19 1706 v 322 2121
+3272 19 v 520 2317 a FP(Figure)24 b(5.6:)31 b(Benchmarking)26
+b(the)e(Open)f(OODB)f(optimizer)j(\320)d(queries)k(E41)d(and)h(E42)298
+2694 y(plans,)g(but)e(an)g(exhaustive)k(search)d(strategy)h(\(like)f(V)
+-12 b(olcano\))24 b(requires)g(the)f(expressions)i(to)d(be)g(stored)300
+2863 y(because)j(they)g(might)f(be)f(reused)i(in)f(other)g
+(expressions.)581 3033 y(W)-7 b(e)20 b(can)i(see)g(from)f(Figure)h(5.7)
+f(that)g(the)h(search)h(space)f(size)g(increases)h(by)f(lar)n(ge)g
+(magnitudes)300 3202 y(from)k(E1)f(through)j(E4.)38 b(For)25
+b(instance,)k(the)d(number)h(of)f(equivalent)j(expressions)g(for)d(E4)g
+(is)f(about)j(a)296 3371 y(million,)21 b(for)f(3-way)h(joins.)30
+b(This)20 b(is)g(the)g(reason)i(why)-6 b(,)20 b(for)g(example,)i(we)d
+(could)i(not)f(optimize)h(expres-)299 3541 y(sions)j(containing)i(more)
+d(than)g(3)f(joins)i(in)f(E4)f(\(Figure)h(5.6\).)31 b(The)22
+b(main)h(reason)h(for)f(this)h(tremendous)295 3710 y(use)c(of)g(memory)
+f(is)h(the)f(presence)j(of)d(the)h(SELECT)c(and)k(MA)-10
+b(T)17 b(operators)22 b(which)e(increases)i(the)e(num-)300
+3879 y(ber)27 b(of)g(rules)h(that)g(an)f(expression)j(matches)f(\(see)e
+(T)-6 b(able)27 b(5.1\).)42 b(These)27 b(rules)h(basically)i(permute)e
+(the)298 4049 y(SELECT)18 b(and)k(MA)-10 b(T)19 b(operators)24
+b(with)d(the)h(others)h(\(JOIN)e(and)h(RET\),)d(thus)j(creating)i(a)d
+(lar)n(ge)i(number)300 4218 y(of)g(equivalent)k(expressions.)583
+4387 y(It)j(is)g(also)h(interesting)i(to)d(compare)h(the)g(memory)f
+(usage)h(in)f(the)h(Open)f(OODB)e(optimizer)298 4557
+y(with)22 b(the)g(simple)g(centralized)j(optimizer)e(in)f(Section)h
+(5.2.)30 b(Expression)24 b(E1)d(in)h(Figure)g(5.2\(a\))g(\(which)296
+4726 y(only)f(contains)h(the)e(relational)j(operators)f(JOIN)e(and)g
+(RET\))e(is)i(similar)h(to)f(the)g(expression)j(used)e(in)f(the)294
+4896 y(centralized)g(optimizer)g(\(Figure)e(5.1\(a\)\).)30
+b(However)l(,)19 b(the)f(memory)g(usage,)i(as)e(measured)h(by)f(the)g
+(num-)299 5065 y(ber)24 b(of)f(equivalent)j(expressions)g(\(Figures)e
+(5.7)f(and)g(Figures)h(5.1\(c\)\),)g(is)f(vastly)h(dif)n(ferent)i(in)d
+(the)g(two)1905 5349 y(73)p eop
+%%Page: 74 86
+74 85 bop 323 403 3237 4 v 323 2585 4 2182 v 761 2560
+a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007
+@urx 501.875000 @ury 2834 @rwi @setspecial
+%%BeginDocument: eqlogexp_Q1-8_oodb.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 382 l
+621 362 m
+621 382 l
+822 362 m
+822 382 l
+1023 362 m
+1023 382 l
+1225 362 m
+1225 382 l
+1426 362 m
+1426 382 l
+1627 362 m
+1627 382 l
+1828 362 m
+1828 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+621 1704 m
+621 1684 l
+822 1704 m
+822 1684 l
+1023 1704 m
+1023 1684 l
+1225 1704 m
+1225 1684 l
+1426 1704 m
+1426 1684 l
+1627 1704 m
+1627 1684 l
+1828 1704 m
+1828 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+91 scalefont
+ setfont
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+420 286 m
+gsave
+420 286 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 286 m
+gsave
+621 286 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 286 m
+gsave
+822 286 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 286 m
+gsave
+1023 286 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 286 m
+gsave
+1225 286 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 286 m
+gsave
+1426 286 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 286 m
+gsave
+1627 286 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 286 m
+gsave
+1828 286 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 286 m
+gsave
+2030 286 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 134 m
+gsave
+1225 134 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+440 362 l
+420 698 m
+440 698 l
+420 1033 m
+440 1033 l
+420 1368 m
+440 1368 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 698 m
+2010 698 l
+2030 1033 m
+2010 1033 l
+2030 1368 m
+2010 1368 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(100) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(0) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 698 m
+gsave
+366 698 translate
+0 rotate
+0 -30 m
+(102) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(2) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 1033 m
+gsave
+366 1033 translate
+0 rotate
+0 -30 m
+(104) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(4) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 1368 m
+gsave
+366 1368 translate
+0 rotate
+0 -30 m
+(106) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(6) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(108) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(8) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+187 1033 m
+gsave
+187 1033 translate
+90 rotate
+0 0 m
+(Equivalent expressions) CS
+(Equivalent expressions) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Number of Equivalent Expressions) CS
+(Number of Equivalent Expressions) show
+grestore
+newpath
+420 362 m
+621 413 l
+822 463 l
+1023 514 l
+1225 564 l
+1426 615 l
+1627 665 l
+1828 716 l
+2030 766 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 362 30 0 360 arc
+gsave fill grestore
+stroke
+621 413 30 0 360 arc
+gsave fill grestore
+stroke
+822 463 30 0 360 arc
+gsave fill grestore
+stroke
+1023 514 30 0 360 arc
+gsave fill grestore
+stroke
+1225 564 30 0 360 arc
+gsave fill grestore
+stroke
+1426 615 30 0 360 arc
+gsave fill grestore
+stroke
+1627 665 30 0 360 arc
+gsave fill grestore
+stroke
+1828 716 30 0 360 arc
+gsave fill grestore
+stroke
+2030 766 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 362 m
+621 573 l
+822 703 l
+1023 834 l
+1225 964 l
+1426 1095 l
+1627 1225 l
+1828 1356 l
+2030 1486 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 392 m
+390 362 l
+420 332 l
+450 362 l
+closepath
+gsave eofill grestore
+stroke
+621 603 m
+591 573 l
+621 543 l
+651 573 l
+closepath
+gsave eofill grestore
+stroke
+822 733 m
+792 703 l
+822 673 l
+852 703 l
+closepath
+gsave eofill grestore
+stroke
+1023 864 m
+993 834 l
+1023 804 l
+1053 834 l
+closepath
+gsave eofill grestore
+stroke
+1225 994 m
+1195 964 l
+1225 934 l
+1255 964 l
+closepath
+gsave eofill grestore
+stroke
+1426 1125 m
+1396 1095 l
+1426 1065 l
+1456 1095 l
+closepath
+gsave eofill grestore
+stroke
+1627 1255 m
+1597 1225 l
+1627 1195 l
+1657 1225 l
+closepath
+gsave eofill grestore
+stroke
+1828 1386 m
+1798 1356 l
+1828 1326 l
+1858 1356 l
+closepath
+gsave eofill grestore
+stroke
+2030 1516 m
+2000 1486 l
+2030 1456 l
+2060 1486 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 362 m
+621 554 l
+822 770 l
+1023 1012 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 392 m
+390 332 l
+450 332 l
+closepath
+gsave eofill grestore
+stroke
+621 584 m
+591 524 l
+651 524 l
+closepath
+gsave eofill grestore
+stroke
+822 800 m
+792 740 l
+852 740 l
+closepath
+gsave eofill grestore
+stroke
+1023 1042 m
+993 982 l
+1053 982 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 493 m
+621 754 l
+822 1046 l
+1023 1364 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+390 523 m
+420 463 l
+450 523 l
+closepath
+gsave eofill grestore
+stroke
+591 784 m
+621 724 l
+651 784 l
+closepath
+gsave eofill grestore
+stroke
+792 1076 m
+822 1016 l
+852 1076 l
+closepath
+gsave eofill grestore
+stroke
+993 1394 m
+1023 1334 l
+1053 1394 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+72 scalefont
+ setfont
+1070 1293 m
+1070 1653 l
+1421 1653 l
+1421 1293 l
+1070 1293 l
+stroke
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1608 m
+1270 1608 l
+stroke
+1110 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1270 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1310 1608 m
+gsave
+1310 1608 translate
+0 rotate
+0 -24 m
+(E1) show
+grestore
+newpath
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1518 m
+1270 1518 l
+stroke
+1110 1548 m
+1080 1518 l
+1110 1488 l
+1140 1518 l
+closepath
+gsave eofill grestore
+stroke
+1270 1548 m
+1240 1518 l
+1270 1488 l
+1300 1518 l
+closepath
+gsave eofill grestore
+stroke
+1310 1518 m
+gsave
+1310 1518 translate
+0 rotate
+0 -24 m
+(E2) show
+grestore
+newpath
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1428 m
+1270 1428 l
+stroke
+1110 1458 m
+1080 1398 l
+1140 1398 l
+closepath
+gsave eofill grestore
+stroke
+1270 1458 m
+1240 1398 l
+1300 1398 l
+closepath
+gsave eofill grestore
+stroke
+1310 1428 m
+gsave
+1310 1428 translate
+0 rotate
+0 -24 m
+(E3) show
+grestore
+newpath
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1338 m
+1270 1338 l
+stroke
+1080 1368 m
+1110 1308 l
+1140 1368 l
+closepath
+gsave eofill grestore
+stroke
+1240 1368 m
+1270 1308 l
+1300 1368 l
+closepath
+gsave eofill grestore
+stroke
+1310 1338 m
+gsave
+1310 1338 translate
+0 rotate
+0 -24 m
+(E4) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 3557 2585 V 323 2588 3237 4 v 3558 2605
+19 2189 v 340 2605 3237 19 v 766 2801 a FP(Figure)24
+b(5.7:)31 b(Equivalent)26 b(expressions)h(in)c(the)h(Open)f(OODB)f
+(optimizer)295 3177 y(cases)e(\(256)f(for)g(E1)f(versus)j(1.5)d
+(million)i(for)f(the)g(centralized)j(optimizer)l(,)g(for)d(8-way)g
+(joins\).)30 b(What)19 b(ac-)296 3347 y(counts)i(for)f(this)g(huge)h
+(dif)n(ference?)33 b(The)19 b(key)h(lies)g(in)g(the)g(implementation)i
+(of)e(the)g(join)g(predicates.)33 b(In)298 3516 y(the)22
+b(case)h(of)f(Open)g(OODB)d(optimizer)l(,)24 b(we)d(designed)k(the)d
+(database)i(such)f(that)f(join)h(predicates)h(were)297
+3685 y(implemented)f(by)e(one-way)h(pointers)1526 3652
+y Fv(7)1588 3685 y FP(\(links\),)h(thus,)e(the)h(join)f(commutativity)i
+(transformation)i(rule)300 3855 y(did)31 b(not)g(apply;)36
+b(this)31 b(cuts)h(down)f(on)g(the)g(number)g(of)g(equivalent)j
+(expressions)g(tremendously)-6 b(.)55 b(In)300 4024 y(the)24
+b(simple)g(centralized)i(optimizer)l(,)f(attributes)h(in)e(a)f(join)h
+(predicate)i(were)d(implemented)i(as)f(normal)300 4194
+y(columns;)i(thus,)e(the)g(join)h(commutativity)h(rule)f(could)g
+(permute)g(join)g(streams)f(and)h(generate)h(equiv-)300
+4363 y(alent)e(expressions.)p 300 4444 1320 4 v 400 4498
+a Fu(7)434 4530 y Fy(The)d(reason)g(for)g(this)f(choice)h(was)g(that)f
+(if)g(join)g(predicates)i(were)e(implemented)h(as)g(set-valued)g
+(attributes,)g(then)g(join)300 4621 y(commutativity)16
+b(would)f(increase)h(the)f(number)h(of)f(equivalent)h(expressions)g(to)
+f(an)h(even)g(lar)o(ger)e(explosion)j(than)e(that)g(shown)300
+4712 y(in)k(Figure)g(5.7.)25 b(This)18 b(would)i(mean,)f(for)g
+(example,)g(that)g(it)f(might)h(not)g(have)h(been)g(possible)g(to)e
+(optimize)i(queries)f(E31)g(and)300 4803 y(E32)g(\(generated)h(from)f
+(E3\))g(even)g(for)g(3-way)h(joins.)1905 5349 y FP(74)p
+eop
+%%Page: 75 87
+75 86 bop 300 391 a FO(5.4)119 b(Summary)292 654 y FP(In)16
+b(this)h(chapter)l(,)i(we)d(presented)j(experimental)g(evidence)f(that)
+f(Prairie)g(speci\256cations)i(do)e(not)f(sacri\256ce)300
+824 y(performance)32 b(compared)f(to)e(V)-12 b(olcano.)50
+b(T)-6 b(wo)28 b(sets)i(of)g(experiments)i(were)d(performed,)j(one)e
+(with)g(a)299 993 y(simple)24 b(centralized)i(optimizer)f(and)e
+(another)i(with)e(a)g(lar)n(ge-scale)j(object-oriented)i(optimizer;)d
+(each)298 1162 y(demonstrated)f(comparable)g(performances)g(between)e
+(the)g(Prairie)g(and)g(V)-12 b(olcano)22 b(optimizers.)32
+b(There)292 1332 y(were)16 b(also)h(gains)h(in)e(lines)h(of)f(code,)j
+(and,)f(most)e(importantly)-6 b(,)20 b(gains)e(in)e(abstractions)k(and)
+d(extensibility)-6 b(.)295 1501 y(This)18 b(was)g(made)h(possible)h(by)
+f(using)h(the)f(P2V)e(preprocessor)22 b(to)d(bridge)h(the)e(gap)h
+(between)h(Prairie)f(and)300 1671 y(V)-12 b(olcano.)576
+1840 y(In)17 b(the)h(next)f(chapter)l(,)j(we)d(describe)i(how)d(to)h
+(use)h(Prairie)f(to)g(build)h(recon\256gurable)j(optimizers.)300
+2009 y(This)k(is)g(done)h(by)g(using)g(rule)g(sets)g(that)f(are)h
+(constructed)i(using)f(reusable,)g(recombinable)i(building-)300
+2179 y(blocks.)44 b(W)-7 b(e)27 b(will)g(also)h(show)g(how)f(the)h(P2V)
+e(preprocessor)31 b(can)d(generate)i(monolithic)f(optimizers)297
+2348 y(from)21 b(these)i(recon\256gurable)h(speci\256cations,)g
+(optimizers)g(that)d(are)h(as)f(ef)n(\256cient)h(as)f(any)h
+(hand-written)300 2517 y(rule)i(set.)1905 5349 y(75)p
+eop
+%%Page: 76 88
+76 87 bop 2859 1118 a FG(Chapter)44 b(6)1219 1657 y FM
+(Recon\256gurable)51 b(Optimizers)300 2159 y FP(In)28
+b(the)g(previous)i(chapter)l(,)h(we)d(presented)i(experimental)h
+(results)e(to)f(evaluate)i(the)f(performance)h(of)300
+2328 y(Prairie)24 b(optimizers.)32 b(In)24 b(this)f(chapter)l(,)j(we)c
+(describe)j(how)e(the)h(Prairie)g(framework)g(can)g(be)f(extended)295
+2498 y(to)c(construct)i(optimizers)g(that)e(satisfy)h(the)g(fourth)g
+(goal)f(listed)h(in)f(Chapter)h(1,)f(recon\256gurability)-6
+b(.)34 b(That)300 2667 y(is,)c(how)f(can)h(optimizers)h(be)f(changed)h
+(quickly)h(and)d(seamlessly)j(for)d(use)h(in)f(a)g(dif)n(ferent)j
+(database)296 2836 y(system?)f(One)20 b(technique)j(to)d(do)g(this)h
+(is)f(presented)j(in)d(this)g(chapter)-5 b(.)32 b(The)19
+b(extensions)24 b(described)e(here)300 3006 y(were)h(made)h(easier)h
+(by)e(the)h(clean)h(design)g(and)f(abstractions)j(embodied)e(in)f
+(Prairie.)300 3372 y FO(6.1)119 b(Overview)300 3635 y
+FP(Lar)n(ge-scale)26 b(software)e(development)i(is)d(an)h(expensive)i
+(undertaking.)34 b(An)22 b(approach)k(that)e(has)g(been)300
+3805 y(proposed)i(is)d(that)i(of)e(using)i(software)g(components)h([9,)
+15 b(1)m(1,)h(26,)g(27].)31 b(These)24 b(components,)i(typically)297
+3974 y(used)c(as)f(building-blocks)26 b(to)21 b(construct)j(lar)n(ger)f
+(systems,)f(have)g(well-de\256ned)h(and)f(standardized)i(im-)300
+4144 y(ported)30 b(\(input\))f(and)g(exported)h(\(output\))g
+(interfaces.)47 b(A)27 b(system)i(is)f(developed)i(by)f(\256tting)f
+(together)298 4313 y(components)d(whose)d(interfaces)i(match)f(one)f
+(another)-5 b(.)32 b(This)22 b(approach)i(not)e(only)h(has)f(the)g
+(advantage)300 4482 y(of)j(being)h(able)g(to)f(assemble)i(modular)f
+(systems)g(from)f(parts,)h(it)f(also)h(allows)f(the)h(reuse)g(of)f(the)
+g(same)300 4652 y(components)h(in)e(other)g(software)h(systems.)583
+4821 y(Database)h(management)g(systems)f(\(DBMSs\))e(are)i(lar)n
+(ge-scale)i(software)f(systems)f(that)g(can)296 4990
+y(also)c(bene\256t)f(from)g(a)g(component-based)k(approach.)32
+b(The)20 b(\256rst)g(system)g(to)g(demonstrate)j(the)d(feasibil-)1905
+5349 y(76)p eop
+%%Page: 77 89
+77 88 bop 293 391 a FP(ity)17 b(of)g(this)g(idea)g(was)g(Genesis)h([2,)
+d(3,)h(5,)f(6,)g(12].)29 b(A)16 b(DBI)g(created)i(a)f(customized)i
+(DBMS)14 b(by)j(composing)300 561 y(several)25 b(pre-de\256ned)h
+(components)h(with)c(standard)j(interfaces.)34 b(The)23
+b(result)i(was)f(a)f(DBMS)e(that)k(was)300 730 y(tailored)g(to)f(the)g
+(needs)g(of)g(a)f(particular)j(application.)582 899 y(The)c(ideas)i
+(incorporated)i(in)c(Genesis)h(are)g(not)g(unique)h(to)e(databases;)k
+(in)c(fact,)h(the)g(GenV)-12 b(oca)298 1069 y(paradigm)24
+b([7\2619,)16 b(1)m(1])22 b(has)h(shown)f(that)h(the)f(same)g
+(component-based)27 b(approach)d(also)f(applies)g(to)f(net-)300
+1238 y(works,)27 b(avionics,)j(\256le)25 b(systems,)k(and)e(data)g
+(structures.)42 b(The)26 b(P2)g(generator)j([10,)16 b(1)m(1],)27
+b(in)g(particular)l(,)298 1408 y(has)c(demonstrated)i(that)d(very)h(ef)
+n(\256cient)g(container)i(data)e(structures)h(can)f(be)f(generated)i
+(from)e(a)g(small)300 1577 y(family)i(of)g(plug-compatible)j
+(components.)579 1746 y(Query)19 b(optimizers)i(are)e(integral)i(to)e
+(most)h(DBMSs.)27 b(They)19 b(also)h(tend)g(to)f(be)g(a)g
+(signi\256cant)i(and)295 1916 y(complex)g(part)f(of)f(a)g(DBMS.)e(The)i
+(earliest)i(query)g(optimizer)g(proposed,)h(System)d(R)g([46],)h(was)f
+(mono-)300 2085 y(lithic)27 b(in)e(nature.)38 b(That)25
+b(is,)h(the)g(three)g(features)h(of)f(a)f(query)i(optimizer)l(,)g
+(namely)-6 b(,)27 b(search)g(space,)g(cost)296 2254 y(model,)20
+b(and)g(search)h(strategy)-6 b(,)23 b(were)c(all)h(hard-wired)h(into)g
+(a)e(single)i(module)f(that)g(represented)j(the)d(op-)297
+2424 y(timizer)-5 b(.)31 b(Many)21 b(contemporary)j(optimizers)f(still)
+f(follow)g(this)f(model.)31 b(However)l(,)22 b(database)h(systems)297
+2593 y(are)f(increasingly)j(being)d(used)g(to)f(store)h(traditional)i
+(relational)g(data)e(as)f(well)g(as)g(non-traditional)26
+b(data)300 2762 y(\(e.g.,)k(a)e(database)j(could)f(contain)h
+(relational)h(as)c(well)h(as)g(object-oriented)k(and)d(multimedia)g
+(data\);)300 2932 y(this)24 b(requires)i(a)d(query)i(optimizer)g(that)f
+(can)g(be)g(quickly)i(and)e(ef)n(\256ciently)h(modi\256ed)g(to)e(deal)h
+(with)g(the)299 3101 y(changing)h(properties)h(of)d(the)g(underlying)i
+(data.)32 b(For)22 b(example,)i(in)e(a)h(cost)g(model)g(that)h(is)e(a)h
+(weighted)296 3271 y(sum)d(of)h(the)f(CPU)e(and)j(I/O)f(costs,)h(it)f
+(might)h(be)f(realistic)j(to)d(weight)h(the)f(I/O)g(cost)h(more)f(than)
+h(the)g(CPU)300 3440 y(cost)31 b(when)f(optimizing)i(multimedia)f
+(queries)h(\(since)f(multimedia)g(objects)h(tend)f(to)f(be)f(extremely)
+300 3609 y(lar)n(ge,)f(I/O)e(costs)h(might)g(dominate)h(CPU)d(cost\))i
+(than)g(when)g(dealing)h(with)e(relational)j(data.)40
+b(As)26 b(an-)300 3779 y(other)j(example,)g(stored)g(\256les)f(with)f
+(pointers)j(between)f(them)e(would)h(suggest)i(speci\256c)f(join)f
+(orders)300 3948 y(than)f(when)f(no)g(pointers)i(are)e(present.)40
+b(Thus,)27 b(it)f(might)g(make)g(sense)h(to)f(modify)h(or)f(change)i
+(certain)300 4117 y(rules)c(depending)j(on)d(the)f(speci\256c)i
+(application)i(at)c(hand.)583 4287 y(In)i(this)h(chapter)l(,)h(we)d
+(describe)k(a)c(building-blocks)30 b(approach)d(to)e(the)h
+(construction)i(of)d(rule-)300 4456 y(based)k(optimizers)h(using)f
+(Prairie.)45 b(The)27 b(goal)i(is)e(to)h(generate)i(families)f(of)f
+(rule)h(sets)f(automatically)300 4625 y(where)g(each)h(rule)f(set)g
+(corresponds)j(to)d(some)g(classical)i(relational)g(optimizer)g
+(\(centralized,)i(distri-)300 4795 y(bution,)27 b(replication,)i
+(etc.\).)36 b(W)-7 b(e)25 b(discuss)i(the)f(model,)g(together)h(with)f
+(a)f(few)g(simple)h(examples,)h(and)300 4964 y(show)i(how)f(the)h(P2V)e
+(preprocessor)l(,)33 b(described)e(in)e(Chapter)g(4,)h(can)e(be)h(used)
+g(to)g(quickly)h(generate)1905 5349 y(77)p eop
+%%Page: 78 90
+78 89 bop 296 391 a FP(ef)n(\256cient)22 b(rule)f(sets)g(from)f
+(component-based)25 b(speci\256cations.)33 b(Currently)-6
+b(,)22 b(the)e(P2)g(generator)j([10,)16 b(1)m(1])300
+561 y(does)23 b(not)h(have)g(a)f(framework)h(for)f(quickly)i
+(generating)h(ef)n(\256cient)f(full-\257edged)g(optimizers.)33
+b(The)22 b(ul-)300 730 y(timate)k(goal)g(of)g(the)g(research)h
+(described)h(in)e(this)g(chapter)h(is)e(to)h(integrate)i(the)d(Prairie)
+h(speci\256cation)298 899 y(language)e(into)e(P2)f(to)g(enable)i
+(automatic)h(generation)g(of)e(rule-based)i(optimizers.)32
+b(Thus,)22 b(the)g(goal)g(of)297 1069 y(this)f(chapter)h(is)f(to)f(lay)
+h(a)f(foundation)k(for)d(using)g(Prairie)h(to)e(build)i(optimizers)g
+(for)f(novel)h(applications)300 1238 y(\(e.g.,)h(container)j(data)e
+(structures)i(using)f(P2\).)300 1605 y FO(6.2)119 b(Layer)n(ed)30
+b(Rule-Based)g(Optimizers)300 1873 y FN(6.2.1)99 b(Layers)295
+2103 y FP(In)18 b(the)h(Prairie)g(framework)h(described)h(in)d(Chapter)
+i(3,)f(optimizers)h(are)f(speci\256ed)h(using)g(rules)f(\(T)-8
+b(-rules)300 2273 y(and)30 b(I-rules\).)52 b(The)30 b(rule)g(engine)i
+(treats)f(all)f(rules)h(as)f(belonging)j(to)c(a)h(single)h(set,)h(so)e
+(at)g(any)g(given)300 2442 y(stage,)e(the)e(rule)h(engine)h(transforms)
+h(an)d(expression)j(using)f(all)e(applicable)k(rules.)40
+b(Rule)26 b(conditions)300 2611 y(determine)33 b(the)e(search)h(space)h
+(to)d(be)h(generated.)56 b(A)30 b(shortcoming)k(of)d(this)g(model)h(is)
+f(that,)i(except)300 2781 y(for)27 b(tests)h(in)f(a)g(rule,)h(the)f
+(search)i(space)f(is)f(determined)i(entirely)g(by)e(the)g(particular)j
+(search)e(strategy)300 2950 y(implemented)d(by)f(the)g(rule)g(engine.)
+576 3120 y(Prairie)17 b(allows)g(a)f(DBI)g(to)g(specify)j(rules)e(in)g
+(encapsulated)j(components.)31 b(These)17 b(components)300
+3289 y(are)26 b(called)i FD(layers)f FP(and)g(can)f(either)h(be)f
+(de\256ned)h(by)f(a)g(DBI,)f(or)h(exist)h(in)f(pre-de\256ned)i
+(component)g(li-)300 3458 y(braries.)52 b(Each)29 b(layer)i(is)f(a)f
+(collection)k(of)d(T)-8 b(-rules)30 b(and)h(I-rules)g(and)f(has)h
+(well-de\256ned)g(import)g(and)300 3628 y(export)c(interfaces)h(that)d
+(consist)i(of)f(database)h(operations.)39 b(The)25 b(general)i(form)e
+(of)g(a)g(layer)i(is)e(shown)300 3797 y(in)i(Figure)g(6.1\(a\).)41
+b(A)26 b(layer)h(translates)j(an)c(abstract)j(expression)h(consisting)f
+(of)e FD(abstract)j FP(operators)298 3966 y FC(f)p FH(O)412
+3980 y Fv(1)452 3966 y FH(;)15 b(:)g(:)g(:)32 b(;)15
+b(O)738 3980 y Fs(n)786 3966 y FC(g)21 b FP(to)h(a)f(set)h(of)f
+(concrete)j(expressions,)h(each)e(consisting)h(of)e(one)g(or)g(more)f
+FD(concr)m(ete)j FP(op-)300 4136 y(erators)i FC(f)p FH(C)681
+4150 y Fv(1)721 4136 y FH(;)15 b(:)g(:)g(:)32 b(;)15
+b(C)1003 4150 y Fs(m)1070 4136 y FC(g)24 b FP(or)h(algorithms.)36
+b(This)25 b(represents)i(a)e(one-to-many)i(mapping)f(between)g(ex-)300
+4305 y(pressions,)34 b(and)c(is)f(typically)j(the)e(method)h(used)g(by)
+e(an)h(optimizer)i(to)d(construct)j(its)e(search)h(space.)296
+4474 y(The)20 b(term)f(concrete)k(refers)e(to)e(the)i(fact)f(that)h
+(they)f(are)h(obtained)h(by)e(transforming)j(abstract)f(operators)298
+4644 y(through)h(the)f(use)g(of)f(rules;)i(concrete)h(operators)g(of)d
+(a)g(layer)h(can)g(also)g(be)g(viewed)g(as)f(calls)h(to)g(abstract)300
+4813 y(operators)k(of)d(lower)h(layers.)583 4983 y(Layers)i(in)e
+(Prairie)i(follow)f(the)g(GenV)-12 b(oca)26 b(paradigm)g([9].)35
+b(Thus,)25 b(layers)h(with)e(the)h(same)g(in-)1905 5349
+y(78)p eop
+%%Page: 79 91
+79 90 bop 300 403 3283 4 v 300 2174 4 1771 v 347 676
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.2 true 3.8 neg 6.1651
+neg 103.38464 31.6825 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial -170 x FH(O)416
+520 y Fs(i)444 506 y FP(:)31 b(Abstract)25 b(operators)347
+676 y FH(C)412 690 y Fs(i)440 676 y FP(:)i(Concrete)17
+b(operators)650 1048 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8
+neg 37.87982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(LA)-8 b(YER)989 849 y FH(O)1058 863 y Fv(1)1481 849
+y FH(O)1550 863 y Fs(n)618 1576 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 51.21492 85.3582 51.21492 59.75073 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 87.91884 72.55446
+81.09029 72.55446 74.26173 72.55446 false NArray /DS 0.5 2.5 CLW mul
+add 2 div def /Dot { 0 0 DS SD } def newpath n { gsave T Dot grestore
+} repeat end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 110.96565 85.3582 110.96565 59.75073 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+1055 1358 a FP(Prairie)24 b(Rules)618 1576 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 27.31473 -25.60745 27.31473 0.0 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 87.91884 -12.80373
+81.09029 -12.80373 74.26173 -12.80373 false NArray /DS 0.5 2.5 CLW
+mul add 2 div def /Dot { 0 0 DS SD } def newpath n { gsave T Dot grestore
+} repeat end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 134.86584 -25.60745 134.86584 0.0 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial 793 1869 a FH(C)858
+1883 y Fv(1)1672 1869 y FH(C)1737 1883 y Fs(m)890 2050
+y Fy(\(a\))19 b(General)g(form)g(of)g(a)f(layer)p 2037
+2149 4 1722 v 2145 1047 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(MERGE)2448 852 y Fd(JOIN)55 b(SOR)-5 b(T)66 b(RET)2113
+1576 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 51.21492 85.3582 51.21492 59.75073 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 81.09029 85.3582 81.09029 59.75073 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 110.96565 85.3582 110.96565 59.75073 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 2141 1186 a Fh(JOIN)p
+Fu(\()p Fn(S)2311 1196 y Fg(1)2343 1186 y Fn(;)11 b(S)2411
+1196 y Fg(2)2443 1186 y Fu(\))18 b(=)-11 b Ft(\))17 b
+Fh(JOPR)p Fu(\()p Fh(SOR)m(T)q Fu(\()p Fn(S)2926 1196
+y Fg(1)2958 1186 y Fu(\))p Fn(;)10 b Fh(SOR)m(T)q Fu(\()p
+Fn(S)3198 1196 y Fg(2)3230 1186 y Fu(\)\))2141 1274 y
+Fh(JOPR)q Fu(\()p Fn(S)2320 1284 y Fg(1)2352 1274 y Fn(;)g(S)2419
+1284 y Fg(2)2451 1274 y Fu(\))18 b(=)-11 b Ft(\))17 b
+Fh(Mer)o(ge)p 2739 1274 15 4 v 19 w(join)o Fu(\()p Fn(S)2894
+1284 y Fg(1)2926 1274 y Fn(;)11 b(S)2994 1284 y Fg(2)3026
+1274 y Fu(\))2141 1361 y Fh(JOIN)p Fu(\()p Fn(S)2311
+1371 y Fg(1)2343 1361 y Fn(;)g(S)2411 1371 y Fg(2)2443
+1361 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p 2710 1361
+V 18 w(CONC)p Fu(\()p Fn(S)2925 1371 y Fg(1)2957 1361
+y Fn(;)11 b(S)3025 1371 y Fg(2)3057 1361 y Fu(\))2141
+1448 y Fh(SOR)m(T)q Fu(\()p Fn(S)2328 1458 y Fg(1)2360
+1448 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(SOR)m(T)p 2643
+1448 V 18 w(CONC)q Fu(\()p Fn(S)2859 1458 y Fg(1)2891
+1448 y Fu(\))2141 1535 y Fh(RET)q Fu(\()p Fn(F)2298 1545
+y Fg(1)2330 1535 y Fu(\))g(=)-11 b Ft(\))18 b Fh(RET)p
+2583 1535 V 19 w(CONC)p Fu(\()p Fn(F)2800 1545 y Fg(1)2832
+1535 y Fu(\))2113 1576 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 51.21492 -25.60745 51.21492 0.0 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 81.09029 -25.60745 81.09029 0.0 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 110.96565 -25.60745 110.96565 0.0 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial 2448 1873 a Fd(JOIN)55 b(SOR)-5
+b(T)66 b(RET)2468 2050 y Fy(\(b\))18 b(An)h(example)h(layer)p
+3580 2174 4 1771 v 300 2177 3283 4 v 3581 2194 19 1778
+v 317 2194 3283 19 v 880 2390 a FP(Figure)k(6.1:)31 b(General)24
+b(form)g(of)f(a)g(Prairie)h(layer)h(and)f(an)f(example)296
+2766 y(terfaces)e(constitute)h(a)e FD(r)m(ealm)p FP(;)h(each)f(layer)h
+(is)e(plug-compatible)24 b(and)c(interchangeable)k(with)c(the)g(other)
+292 2936 y(layers)d(in)f(its)h(realm.)28 b(Layers)17
+b(in)f(Prairie)h(are)f(usually)i FD(symmetric)p FP(;)h(that)e(is,)g
+(they)g(have)g(export)h(interfaces)300 3105 y(that)24
+b(are)f(the)h(same)f(as)h(their)g(import)g(interfaces)i([9].)31
+b(T)-6 b(ypically)g(,)24 b(these)h(interfaces)h(are)d(comprised)i(of)
+300 3274 y(all)h(the)f(abstract)j(operators)f(in)f(the)f(particular)j
+(database)g(schema)e(at)f(hand.)38 b(Symmetric)25 b(layers)i(can,)298
+3444 y(thus,)22 b(be)f(composed)i(in)e(arbitrary)j(ways;)e(this)g
+(provides)i(DBIs)c(many)h(ways)h(to)f(construct)j(optimizers)297
+3613 y(using)e(the)e(same)h(layers.)31 b(However)l(,)22
+b(not)f(all)f(the)h(compositions)j(are)d(necessarily)i(meaningful)g(or)
+e(cor)n(-)300 3783 y(rect.)43 b(Batory)28 b(and)g(Geraci)f([8])h
+(describe)h(methods)g(for)e(validating)k(the)c(correctness)k(of)c
+(component)300 3952 y(compositions.)37 b(W)-7 b(e)24
+b(will)h(assume)g(that)g(compositions)j(of)d(our)g(layers)h(are)f
+(always)g(correct.)36 b(W)-7 b(e)24 b(will)300 4121 y(not)g(address)h
+(the)f(problem)h(of)e(validating)k(layer)d(compositions;)j(we)c(are)h
+(aware)f(these)i(problems)g(are)300 4291 y(present.)579
+4460 y(T)-6 b(o)19 b(allow)h(optimizer)h(speci\256cations)i(using)e
+(layers,)h(the)e(Prairie)g(speci\256cation)j(language)f(de-)293
+4629 y(\256ned)17 b(in)g(Chapter)h(3)f(was)f(extended)k(in)d(two)f
+(ways.)29 b(First,)18 b(rules)g(can)f(now)g(be)g(declared)j(as)c
+(belonging)k(to)300 4799 y(a)j(speci\256c)i(layer)f(\(a)f(layer)i
+(declaration)i(demarcates)e(rule)f(de\256nitions\).)34
+b(Second,)24 b(the)g(optimizer)h(can)300 4968 y(be)f(de\256ned)h(as)f
+(a)g(composition)j(of)d(layers.)34 b(This)24 b(composition)i(is)e
+(de\256ned)h(as)f(a)g(type)h(expression)i([9])1905 5349
+y(79)p eop
+%%Page: 80 92
+80 91 bop 297 391 a FP(expressed)23 b(as)e(a)f(linear)i(sequence)h(of)d
+(layers.)32 b(This)20 b(is)h(described)i(in)d(more)h(detail)h(in)f(the)
+f(next)i(section.)582 561 y(An)f(example)i(layer)g(is)e(shown)i(in)f
+(Figure)g(6.1\(b\).)31 b(This)22 b(layer)l(,)h(called)g(MERGE,)c
+(transforms)300 730 y(three)27 b(abstract)g(operators,)i(JOIN,)24
+b(SOR)-5 b(T)e(,)23 b(and)j(RET)e(into)i(one)g(algorithm)i(\(Mer)n(ge)p
+3036 730 28 4 v 34 w(join\))f(and)f(three)299 899 y(concrete)f
+(operators)g(\(JOIN,)c(SOR)-5 b(T)e(,)20 b(and)j(RET\).)d(Note)j(that)g
+(the)g(concrete)h(operators)h(bear)e(the)g(same)297 1069
+y(name)f(as)f(the)h(abstract)h(operators,)h(implying)e(that)g(the)g
+(MERGE)c(layer)k(is)f(symmetric.)32 b(The)20 b(MERGE)300
+1238 y(layer)25 b(consists)g(of)f(four)g(T)-8 b(-rules)24
+b(and)g(one)g(I-rule.)32 b(The)23 b(purpose)j(of)d(the)h(layer)h(is)e
+(to)h(either)h(transform)297 1408 y(the)c(JOIN)f(operator)i(into)g(the)
+f(Mer)n(ge)p 1499 1408 V 34 w(join)g(algorithm,)i(or)e(to)f(a)g
+(concrete)j(JOIN)d(operator)j(that)e(will)f(be)300 1577
+y(transformed)27 b(into)e(an)g(algorithm)h(by)f(another)h(lower)f
+(layer)-5 b(.)35 b(Since)24 b(the)h(MERGE)d(layer)j(is)g(symmet-)300
+1746 y(ric)i(\(i.e.,)f(has)h(the)g(same)f(exported)j(and)e(imported)h
+(interfaces\),)i(we)25 b(need)j(a)e(way)g(to)g(distinguish)k(the)299
+1916 y(abstract)24 b(and)e(concrete)j(operators)f(in)e(the)h(rules.)31
+b(Prairie)23 b(allows)g(a)e(DBI)g(to)h(append)i(\252)p
+3081 1916 V 33 w(CONC\272)d(to)h(an)296 2085 y(operator)g(to)d(refer)i
+(to)e(a)h(concrete)h(operator)-5 b(.)32 b(Thus,)20 b(\252JOIN\272)g
+(refers)h(to)e(the)h(abstract)i(join)e(operator)i(and)300
+2254 y(\252JOIN)p 542 2254 V 33 w(CONC\272)g(refers)i(to)g(the)g
+(concrete)h(join)f(operator)-5 b(.)300 2561 y FN(6.2.2)99
+b(Composing)24 b(Layers)581 2792 y FP(In)d(a)g(layered)h(Prairie)g
+(optimizer)h(speci\256cation,)h(a)d(DBI)e(can)j(de\256ne)f(layers,)i
+(each)f(consisting)300 2961 y(of)k(T)-8 b(-rules)26 b(and)g(I-rules.)39
+b(An)25 b(optimizer)j(can)e(then)h(be)e(constructed)30
+b(by)c(composing)i(layers)f(in)e(a)h(lin-)298 3130 y(ear)d(order)-5
+b(.)31 b(That)22 b(is,)g(the)h(speci\256cation)h(of)f(an)f(optimizer)h
+(now)f(consists)j(of)d(layers)h(stacked)h(upon)f(one)300
+3300 y(another)l(,)30 b(instead)f(of)f(a)f(set)g(of)h(rules)g
+(speci\256ed)h(in)e(a)g(single)i(component.)44 b(This)28
+b(is)f(shown)h(schemat-)300 3469 y(ically)g(in)e(Figure)h(6.2\(a\).)40
+b(The)26 b(Prairie)h(syntax)h(for)e(specifying)k(rules)d(in)f
+(individual)j(layers)f(and)f(the)297 3638 y(layer)22
+b(composition)h(are)e(shown)g(in)g(Figure)g(6.2\(b\).)31
+b(The)20 b(composition)k(shown)d(in)g(this)g(\256gure,)g(for)g(ex-)300
+3808 y(ample,)28 b(represents)h(an)e(optimizer)i(with)d(the)i
+(SEQUENTIAL,)22 b(MERGE,)i(SOR)-5 b(T)e(,)24 b(and)j(RET)e(layers)300
+3977 y(arranged)g(in)e(that)h(order)-5 b(.)32 b(This)23
+b(can)h(be)f(viewed)h(as)f(composing)i FD(parameterized)k
+FP(layers,)24 b(where)g(each)297 4146 y(layer)e(\(except)h(the)f
+(terminal)g(layer)l(,)h(RET\))c(has)j(a)e(single)j(parameter)g(that)e
+(is)g(another)i(layer)-5 b(.)31 b(Note)21 b(that)299
+4316 y(not)i(all)g(layers)h(de\256ned)f(by)g(the)g(DBI)e(are)i(used)g
+(in)g(the)g(composition;)j(the)d(P2V)e(preprocessor)27
+b(deletes)300 4485 y(unused)i(layers.)45 b(A)26 b(more)i(general)h
+(framework)f(of)g(layer)g(composition)j(in)c(the)h(future)h(will)e
+(involve)300 4655 y(hierarchical)g(compositions)f(of)e(layers)h(\(not)f
+(just)g(linear)h(compositions\).)583 4824 y(The)h(semantics)i(of)e
+(layer)g(composition)j(is)d(as)g(follows.)39 b(For)25
+b FD(each)i(new)f FP(expression)j(gener)n(-)297 4993
+y(ated)21 b(by)f(the)h(optimizer)l(,)i(the)e(rule)g(engine)h(applies)g
+(rules)g(to)e(the)h(expression)i(in)e(the)g(order)g(of)g(layering.)1905
+5349 y(80)p eop
+%%Page: 81 93
+81 92 bop 371 403 3142 4 v 371 3695 4 3292 v 679 904
+a FP(Operator)25 b(T)m(ree)579 3200 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ -17.07164 262.04977
+153.64476 262.04977 153.64476 42.6791 -17.07164 42.6791 /Lineto /lineto
+load def false Polygon gsave 0.5 setgray fill grestore gsave 2.6
+SLW 0. setgray 0 setlinecap stroke grestore gsave 1.0 SLW 1. setgray
+stroke grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 42.6791 67.43292 42.6791 273.99986 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 42.6791 67.43292 42.6791 273.99986
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray [ 49.50764 155.35202
+49.50764 251.80669 134.86584 251.80669 134.86584 155.35202 49.50764
+155.35202 /Lineto /lineto load def false Polygon gsave 1. setgray
+fill grestore end
+
+@endspecial
+1072 1258 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 6.1651
+neg 69.47731 11.23502 .5 Frame gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial(Prairie)f(Layer)g
+FA(1)579 3200 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 92.18674 212.54185 92.18674 228.58925 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 92.18674 199.73813
+92.18674 204.00604 92.18674 208.27394 false NArray /DS 0.5 2.5 CLW
+mul add 2 div def /Dot { 0 0 DS SD } def newpath n { gsave T Dot grestore
+} repeat end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 92.18674 178.56946 92.18674 195.47021 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial 1067 1804 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 6.1651
+neg 70.57487 11.23502 .5 Frame gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+
+@endspecial FP(Prairie)g(Layer)g FH(n)579 3200 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 92.18674 135.71948 92.18674 155.35202 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 92.18674 135.71948 92.18674 155.35202
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial
+1018 2158 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651
+neg 81.76248 10.43501 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial FP(P2V)e
+(Preprocessor)579 3200 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 92.18674 100.72256 92.18674 120.0136 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 92.18674 100.72256 92.18674 120.0136
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial 1081 2451 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.11488
+neg 66.36697 10.43501 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(V)-12 b(olcano)25 b(Rules)579
+3200 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 92.18674 67.43292 92.18674 87.06546 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { /ArrowAc [
+6 2 roll ] cvx def ArrowAc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow
+ moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow
+false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 92.18674 67.43292 92.18674
+87.06546 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW
+add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore gsave ArrowAc ArrowA pop pop ArrowBc ArrowB pop pop
+pop pop grestore end
+
+@endspecial 761 2725 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651
+neg 95.86615 10.43501 .5 Frame gsave 1. setgray fill grestore end
+
+
+@endspecial(V)-12 b(olcano)25 b(Rule)e(Engine)579 3200
+y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 68.28656 33.28964 68.28656 52.06854 /Lineto /lineto
+load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke
+grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave
+grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 33.28964 68.28656 52.06854
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial 925 2987 a(Access)h(Plan)505
+3479 y Fy(\(a\))13 b(Schematic)g(representation)h(\(cf.)23
+b(Figure)12 b(3.1\))p 1895 3670 4 3242 v 1921 576 a Fc(\045optimizer)g
+Fh(SEQUENTIAL)h([)f(MERGE)i([)e(SOR)m(T)h([)f(RET)h(])f(])g(])1921
+687 y Fc(\045layer)g Fh(SEQUENTIAL)1957 774 y Fc(\045trule)g
+Fh(JOIN)o Fu(\()p Fn(S)2291 784 y Fg(1)2324 774 y Fn(;)e(S)2391
+784 y Fg(2)2423 774 y Fu(\))18 b(=)-11 b Ft(\))p Fu(!)17
+b Fh(JOIN)p Fu(\()p Fn(S)2767 784 y Fg(2)2799 774 y Fn(;)10
+b(S)2866 784 y Fg(1)2898 774 y Fu(\))1957 861 y Fc(\045trule)i
+Fh(JOIN)o Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)2423 871 y Fg(1)2455
+861 y Fn(;)f(S)2523 871 y Fg(2)2555 861 y Fu(\))p Fn(;)f(S)2646
+871 y Fg(3)2679 861 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOIN)p
+Fu(\()p Fn(S)3005 871 y Fg(1)3037 861 y Fn(;)10 b Fh(JOIN)p
+Fu(\()p Fn(S)3236 871 y Fg(2)3268 861 y Fn(;)h(S)3336
+871 y Fg(3)3368 861 y Fu(\)\))1957 948 y Fc(\045trule)h
+Fh(JOIN)o Fu(\()p Fn(S)2291 958 y Fg(1)2324 948 y Fn(;)e(S)2391
+958 y Fg(2)2423 948 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p
+2690 948 15 4 v 18 w(CONC)q Fu(\()p Fn(S)2906 958 y Fg(1)2938
+948 y Fn(;)10 b(S)3005 958 y Fg(2)3037 948 y Fu(\))1957
+1036 y Fc(\045trule)i Fh(SOR)m(T)p Fu(\()p Fn(S)2308
+1046 y Fg(1)2340 1036 y Fu(\))18 b(=)-11 b Ft(\))17 b
+Fh(SOR)m(T)p 2623 1036 V 18 w(CONC)q Fu(\()p Fn(S)2839
+1046 y Fg(1)2871 1036 y Fu(\))1957 1123 y Fc(\045trule)12
+b Fh(RET)q Fu(\()p Fn(F)2279 1133 y Fg(1)2311 1123 y
+Fu(\))17 b(=)-11 b Ft(\))18 b Fh(RET)p 2563 1123 V 19
+w(CONC)p Fu(\()p Fn(F)2780 1133 y Fg(1)2812 1123 y Fu(\))1921
+1234 y Fc(\045layer)12 b Fh(SOR)m(T)1957 1321 y Fc(\045irule)g
+Fh(SOR)m(T)p Fu(\()p Fn(S)2305 1331 y Fg(1)2337 1321
+y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 2625 1321
+V 18 w(sort)p Fu(\()p Fn(S)2777 1331 y Fg(1)2809 1321
+y Fu(\))1957 1408 y Fc(\045irule)12 b Fh(SOR)m(T)p Fu(\()p
+Fn(S)2305 1418 y Fg(1)2337 1408 y Fu(\))18 b(=)-11 b
+Ft(\))17 b Fh(Null)p Fu(\()p Fn(S)2644 1418 y Fg(1)2676
+1408 y Fu(\))1957 1495 y Fc(\045trule)12 b Fh(JOIN)o
+Fu(\()p Fn(S)2291 1505 y Fg(1)2324 1495 y Fn(;)e(S)2391
+1505 y Fg(2)2423 1495 y Fu(\))18 b(=)-11 b Ft(\))17 b
+Fh(JOIN)p 2690 1495 V 18 w(CONC)q Fu(\()p Fn(S)2906 1505
+y Fg(1)2938 1495 y Fn(;)10 b(S)3005 1505 y Fg(2)3037
+1495 y Fu(\))1957 1582 y Fc(\045trule)i Fh(SOR)m(T)p
+Fu(\()p Fn(S)2308 1592 y Fg(1)2340 1582 y Fu(\))18 b(=)-11
+b Ft(\))17 b Fh(SOR)m(T)p 2623 1582 V 18 w(CONC)q Fu(\()p
+Fn(S)2839 1592 y Fg(1)2871 1582 y Fu(\))1957 1669 y Fc(\045trule)12
+b Fh(RET)q Fu(\()p Fn(F)2279 1679 y Fg(1)2311 1669 y
+Fu(\))17 b(=)-11 b Ft(\))18 b Fh(RET)p 2563 1669 V 19
+w(CONC)p Fu(\()p Fn(F)2780 1679 y Fg(1)2812 1669 y Fu(\))1921
+1780 y Fc(\045layer)12 b Fh(MERGE)1957 1867 y Fc(\045trule)g
+Fh(JOIN)o Fu(\()p Fn(S)2291 1877 y Fg(1)2324 1867 y Fn(;)e(S)2391
+1877 y Fg(2)2423 1867 y Fu(\))18 b(=)-11 b Ft(\))17 b
+Fh(JOPR)q Fu(\()p Fh(SOR)m(T)p Fu(\()p Fn(S)2906 1877
+y Fg(1)2938 1867 y Fu(\))p Fn(;)10 b Fh(SOR)m(T)q Fu(\()p
+Fn(S)3178 1877 y Fg(2)3210 1867 y Fu(\)\))1957 1955 y
+Fc(\045irule)i Fh(JOPR)p Fu(\()p Fn(S)2297 1965 y Fg(1)2329
+1955 y Fn(;)f(S)2397 1965 y Fg(2)2429 1955 y Fu(\))17
+b(=)-11 b Ft(\))18 b Fh(Mer)o(ge)p 2717 1955 V 18 w(join)p
+Fu(\()p Fn(S)2872 1965 y Fg(1)2904 1955 y Fn(;)10 b(S)2971
+1965 y Fg(2)3003 1955 y Fu(\))1957 2042 y Fc(\045trule)i
+Fh(JOIN)o Fu(\()p Fn(S)2291 2052 y Fg(1)2324 2042 y Fn(;)e(S)2391
+2052 y Fg(2)2423 2042 y Fu(\))18 b(=)-11 b Ft(\))17 b
+Fh(JOIN)p 2690 2042 V 18 w(CONC)q Fu(\()p Fn(S)2906 2052
+y Fg(1)2938 2042 y Fn(;)10 b(S)3005 2052 y Fg(2)3037
+2042 y Fu(\))1957 2129 y Fc(\045trule)i Fh(SOR)m(T)p
+Fu(\()p Fn(S)2308 2139 y Fg(1)2340 2129 y Fu(\))18 b(=)-11
+b Ft(\))17 b Fh(SOR)m(T)p 2623 2129 V 18 w(CONC)q Fu(\()p
+Fn(S)2839 2139 y Fg(1)2871 2129 y Fu(\))1957 2216 y Fc(\045trule)12
+b Fh(RET)q Fu(\()p Fn(F)2279 2226 y Fg(1)2311 2216 y
+Fu(\))17 b(=)-11 b Ft(\))18 b Fh(RET)p 2563 2216 V 19
+w(CONC)p Fu(\()p Fn(F)2780 2226 y Fg(1)2812 2216 y Fu(\))1921
+2327 y Fc(\045layer)12 b Fh(DISTRIBUTION)1957 2414 y
+Fc(\045trule)g Fh(JOIN)o Fu(\()p Fn(S)2291 2424 y Fg(1)2324
+2414 y Fn(;)e(S)2391 2424 y Fg(2)2423 2414 y Fu(\))18
+b(=)-11 b Ft(\))17 b Fh(JOIN)p 2690 2414 V 18 w(CONC)q
+Fu(\()p Fh(XFER)p Fu(\()p Fn(S)3057 2424 y Fg(1)3089
+2414 y Fu(\))p Fn(;)10 b Fh(XFER)q Fu(\()p Fn(S)3332
+2424 y Fg(2)3364 2414 y Fu(\)\))1957 2501 y Fc(\045irule)i
+Fh(XFER)p Fu(\()p Fn(S)2308 2511 y Fg(1)2340 2501 y Fu(\))18
+b(=)-11 b Ft(\))17 b Fh(Ship)p Fu(\()p Fn(S)2650 2511
+y Fg(1)2682 2501 y Fu(\))1957 2588 y Fc(\045irule)12
+b Fh(XFER)p Fu(\()p Fn(S)2308 2598 y Fg(1)2340 2588 y
+Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Null)p Fu(\()p Fn(S)2647
+2598 y Fg(1)2679 2588 y Fu(\))1957 2676 y Fc(\045trule)12
+b Fh(JOIN)o Fu(\()p Fn(S)2291 2686 y Fg(1)2324 2676 y
+Fn(;)e(S)2391 2686 y Fg(2)2423 2676 y Fu(\))18 b(=)-11
+b Ft(\))17 b Fh(JOIN)p 2690 2676 V 18 w(CONC)q Fu(\()p
+Fn(S)2906 2686 y Fg(1)2938 2676 y Fn(;)10 b(S)3005 2686
+y Fg(2)3037 2676 y Fu(\))1957 2763 y Fc(\045trule)i Fh(SOR)m(T)p
+Fu(\()p Fn(S)2308 2773 y Fg(1)2340 2763 y Fu(\))18 b(=)-11
+b Ft(\))17 b Fh(SOR)m(T)p 2623 2763 V 18 w(CONC)q Fu(\()p
+Fn(S)2839 2773 y Fg(1)2871 2763 y Fu(\))1957 2850 y Fc(\045trule)12
+b Fh(RET)q Fu(\()p Fn(F)2279 2860 y Fg(1)2311 2850 y
+Fu(\))17 b(=)-11 b Ft(\))18 b Fh(RET)p 2563 2850 V 19
+w(CONC)p Fu(\()p Fn(F)2780 2860 y Fg(1)2812 2850 y Fu(\))1921
+2961 y Fc(\045layer)12 b Fh(REPLICA)-6 b(TION)1957 3048
+y Fc(\045trule)12 b Fh(RET)q Fu(\()p Fn(F)2279 3058 y
+Fg(1)2311 3048 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(RET)p
+2563 3048 V 19 w(CONC)p Fu(\()p Fn(F)2780 3058 y Fg(11)2840
+3048 y Fu(\))1957 3135 y Fc(\045trule)12 b Fh(RET)q Fu(\()p
+Fn(F)2279 3145 y Fg(1)2311 3135 y Fu(\))17 b(=)-11 b
+Ft(\))18 b Fh(RET)p 2563 3135 V 19 w(CONC)p Fu(\()p Fn(F)2780
+3145 y Fg(12)2840 3135 y Fu(\))1921 3246 y Fc(\045layer)12
+b Fh(RET)1957 3333 y Fc(\045irule)g Fh(RET)q Fu(\()p
+Fn(F)2276 3343 y Fg(1)2308 3333 y Fu(\))18 b(=)-11 b
+Ft(\))17 b Fh(File)p 2545 3333 V 18 w(scan)p Fu(\()p
+Fn(F)2711 3343 y Fg(1)2743 3333 y Fu(\))1981 3479 y Fy(\(b\))32
+b(Syntactic)g(speci\256cation.)65 b(Rule)32 b(actions)g(are)1981
+3571 y(omitted)19 b(for)g(clarity)-5 b(.)p 3509 3695
+4 3292 v 371 3698 3142 4 v 3511 3715 19 3299 v 387 3715
+3142 19 v 1018 3911 a FP(Figure)24 b(6.2:)32 b(The)23
+b(Prairie)h(layered)h(optimizer)g(paradigm)300 4287 y(Thus,)g(rules)h
+(in)e(a)h(layer)g(are)g(applied)i(to)e(an)f(expression)k(until)e(no)f
+(more)g(applicable)i(rules)f(remain)f(in)300 4457 y(that)k(layer;)i
+(the)d(rule)h(engine)h(then)e(applies)i(rules)f(in)f(the)g(next)h
+(layer)l(,)h(and)f(so)f(on.)44 b(Layer)29 b(composi-)300
+4626 y(tion,)c(thus,)h(de\256nes)f(a)f(hierarchy)k(of)c(rules)i(that)f
+(determines)i(the)e(order)g(in)g(which)g(rules)h(are)f(applied.)298
+4795 y(This)d(hierarchy)i(provides)g(the)e(DBI)f(with)g(another)j
+(degree)f(of)f(control)h(over)g(the)f(search)h(space)g(of)f(the)300
+4965 y(optimizer)-5 b(.)1905 5349 y(81)p eop
+%%Page: 82 94
+82 93 bop 575 391 a FP(One)16 b(question)j(that)e(might)f(arise)h(is)f
+(whether)h(compacted)i(layered)f(optimizers)g(have)f(the)f(same)295
+561 y(search)k(space)g(as)f(a)g(monolithic)i(hand-coded)h(optimizer)-5
+b(.)31 b(While)20 b(it)e(is)h(dif)n(\256cult)i(to)d(prove)j(this)e(in)g
+(a)g(for)n(-)300 730 y(mal)k(sense)i(\(since)g(the)f(rule)g(actions)h
+(for)f(layered)i(optimizers)f(are)f(dif)n(ferent)i(from)e(those)h(in)e
+(a)h(mono-)300 899 y(lithic)30 b(optimizer\),)i(all)d(the)h(layered)h
+(optimizers)g(that)e(we)g(constructed)j(\(and)e(that)f(are)h(described)
+h(in)296 1069 y(this)21 b(chapter\))h(resulted)g(in)e(exactly)i(the)e
+(same)g(rule)h(set)f(as)g(the)g(corresponding)k(monolithic)f(optimizer)
+-5 b(.)300 1238 y(Moreover)l(,)25 b(although)h(the)e(corresponding)k
+(rule)c(actions)i(are)e(not)g(exactly)h(the)f(same)g(\(since)g(the)g
+(P2V)298 1408 y(preprocessor)h(adds)d(some)f(extra)i(statements\))g(in)
+f(the)f(two)g(approaches,)k(the)d(number)g(of)f(expressions)300
+1577 y(in)27 b(the)h(search)h(spaces)g(were)e(exactly)j(the)d(same)h
+(for)g(all)f(the)h(queries)h(that)f(we)f(optimized)i(using)g(the)298
+1746 y(layered)24 b(optimizers)g(and)e(their)h(monolithic)h
+(counterparts.)34 b(This)22 b(lends)h(credence)h(to)e(the)g(hypothesis)
+300 1916 y(that)i(a)g(properly)i(speci\256ed)f(layered)g(optimizer)h
+(is)d(semantically)k(equivalent)f(to)e(a)f(monolithic)j(\(non-)300
+2085 y(layered\))g(speci\256cation.)300 2449 y FO(6.3)119
+b(Examples)29 b(of)h(Layer)n(ed)f(Optimizers)299 2712
+y FP(This)23 b(section)i(describes)g(several)g(variations)g(of)e
+(traditional)j(relational)f(optimizers)g(constructed)i(us-)300
+2881 y(ing)d(layers.)300 3185 y FN(6.3.1)99 b(Example)25
+b(Layers)583 3415 y FP(Some)f(examples)h(of)f(layers)i(in)e(a)f
+(Prairie)i(speci\256cation)i(are)d(shown)h(in)f(Figure)g(6.3.)3311
+3382 y Fv(1)3383 3415 y FP(These)300 3585 y(layers)h(specify)h
+(transformations)h(typically)f(found)f(in)f(traditional)j(relational)f
+(databases.)34 b(There)24 b(are)300 3754 y(six)29 b(dif)n(ferent)j
+(layers)e(shown,)h(SEQUENTIAL,)24 b(SOR)-5 b(T)e(,)26
+b(MERGE,)h(RET)-7 b(,)27 b(DISTRIBUTION,)e(and)300 3923
+y(REPLICA)-10 b(TION.)583 4093 y(The)29 b(SEQUENTIAL)24
+b(layer)29 b(encapsulates)j(transformations)h(that)c(are)g(typically)h
+(found)g(in)300 4262 y(centralized)36 b(optimizers.)61
+b(Join)33 b(commutativity)j(and)d(associativity)j(T)-8
+b(-rules)34 b(are)f(included)i(in)e(this)298 4431 y(layer)-5
+b(.)31 b(The)22 b(remaining)h(rules)g(simply)g(transform)g(the)g
+(abstract)g(operators)i(into)d(their)h(concrete)h(coun-)300
+4601 y(terparts,)h(to)f(be)f(transformed)j(by)e(lower)f(layers.)580
+4770 y(The)d(SOR)-5 b(T)17 b(layer)k(encapsulates)j(implementations)g
+(of)c(the)h(SOR)-5 b(T)17 b(operator)-5 b(.)32 b(In)20
+b(Figure)h(6.3,)298 4940 y(the)h(SOR)-5 b(T)19 b(operator)24
+b(is)d(transformed)j(to)e(either)h(the)f(Mer)n(ge)p 2234
+4940 28 4 v 34 w(sort)h(or)e(the)h(Null)g(algorithm.)32
+b(Other)22 b(sort)p 300 5014 1320 4 v 400 5068 a Fu(1)434
+5100 y Fy(For)d(clarity)-5 b(,)18 b(we)h(omit)g(all)f(rule)h(actions)h
+(in)e(the)h(descriptions)h(of)f(these)g(layers.)1905
+5349 y FP(82)p eop
+%%Page: 83 95
+83 94 bop 323 303 3237 4 v 323 2581 4 2278 v 577 423
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494
+neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(SEQUENTIAL)545
+966 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 574 577
+a Fh(JOIN)p Fu(\()p Fn(S)744 587 y Fg(1)776 577 y Fn(;)10
+b(S)843 587 y Fg(2)875 577 y Fu(\))18 b(=)-11 b Ft(\))p
+Fu(!)17 b Fh(JOIN)p Fu(\()p Fn(S)1219 587 y Fg(2)1251
+577 y Fn(;)11 b(S)1319 587 y Fg(1)1351 577 y Fu(\))574
+664 y Fh(JOIN)p Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)876 674
+y Fg(1)908 664 y Fn(;)f(S)975 674 y Fg(2)1007 664 y Fu(\))p
+Fn(;)h(S)1099 674 y Fg(3)1131 664 y Fu(\))18 b(=)-11
+b Ft(\))17 b Fh(JOIN)p Fu(\()p Fn(S)1457 674 y Fg(1)1489
+664 y Fn(;)11 b Fh(JOIN)o Fu(\()p Fn(S)1688 674 y Fg(2)1721
+664 y Fn(;)f(S)1788 674 y Fg(3)1820 664 y Fu(\)\))574
+751 y Fh(JOIN)p Fu(\()p Fn(S)744 761 y Fg(1)776 751 y
+Fn(;)g(S)843 761 y Fg(2)875 751 y Fu(\))18 b(=)-11 b
+Ft(\))18 b Fh(JOIN)p 1143 751 15 4 v 17 w(CONC)q Fu(\()p
+Fn(S)1358 761 y Fg(1)1390 751 y Fn(;)10 b(S)1457 761
+y Fg(2)1489 751 y Fu(\))574 838 y Fh(SOR)m(T)p Fu(\()p
+Fn(S)760 848 y Fg(1)792 838 y Fu(\))18 b(=)-11 b Ft(\))17
+b Fh(SOR)m(T)p 1075 838 V 19 w(CONC)p Fu(\()p Fn(S)1291
+848 y Fg(1)1323 838 y Fu(\))574 925 y Fh(RET)q Fu(\()p
+Fn(F)731 935 y Fg(1)763 925 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(RET)p 1015 925 V 19 w(CONC)p Fu(\()p Fn(F)1232 935
+y Fg(1)1264 925 y Fu(\))2023 437 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+
+@endspecial Fe(SOR)m(T)1992 966 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+
+@endspecial 2020 577 a Fh(SOR)m(T)p Fu(\()p Fn(S)2206
+587 y Fg(1)2238 577 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p
+2526 577 V 19 w(sort)o Fu(\()p Fn(S)2678 587 y Fg(1)2710
+577 y Fu(\))2020 664 y Fh(SOR)m(T)p Fu(\()p Fn(S)2206
+674 y Fg(1)2238 664 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p
+Fu(\()p Fn(S)2545 674 y Fg(1)2577 664 y Fu(\))2020 751
+y Fh(JOIN)p Fu(\()p Fn(S)2190 761 y Fg(1)2222 751 y Fn(;)10
+b(S)2289 761 y Fg(2)2321 751 y Fu(\))18 b(=)-11 b Ft(\))18
+b Fh(JOIN)p 2589 751 V 17 w(CONC)q Fu(\()p Fn(S)2804
+761 y Fg(1)2836 751 y Fn(;)10 b(S)2903 761 y Fg(2)2936
+751 y Fu(\))2020 838 y Fh(SOR)m(T)p Fu(\()p Fn(S)2206
+848 y Fg(1)2238 838 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p
+2521 838 V 19 w(CONC)p Fu(\()p Fn(S)2737 848 y Fg(1)2769
+838 y Fu(\))2020 925 y Fh(RET)q Fu(\()p Fn(F)2177 935
+y Fg(1)2209 925 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p
+2461 925 V 19 w(CONC)q Fu(\()p Fn(F)2679 935 y Fg(1)2711
+925 y Fu(\))577 1321 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(MERGE)545 1850 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+574 1461 a Fh(JOIN)p Fu(\()p Fn(S)744 1471 y Fg(1)776
+1461 y Fn(;)10 b(S)843 1471 y Fg(2)875 1461 y Fu(\))18
+b(=)-11 b Ft(\))18 b Fh(JOPR)p Fu(\()p Fh(SOR)m(T)p Fu(\()p
+Fn(S)1358 1471 y Fg(1)1390 1461 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p
+Fu(\()p Fn(S)1630 1471 y Fg(2)1662 1461 y Fu(\)\))574
+1548 y Fh(JOPR)p Fu(\()p Fn(S)752 1558 y Fg(1)784 1548
+y Fn(;)g(S)852 1558 y Fg(2)884 1548 y Fu(\))17 b(=)-11
+b Ft(\))18 b Fh(Mer)o(ge)p 1172 1548 V 18 w(join)o Fu(\()p
+Fn(S)1326 1558 y Fg(1)1359 1548 y Fn(;)10 b(S)1426 1558
+y Fg(2)1458 1548 y Fu(\))574 1635 y Fh(JOIN)p Fu(\()p
+Fn(S)744 1645 y Fg(1)776 1635 y Fn(;)g(S)843 1645 y Fg(2)875
+1635 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1143 1635
+V 17 w(CONC)q Fu(\()p Fn(S)1358 1645 y Fg(1)1390 1635
+y Fn(;)10 b(S)1457 1645 y Fg(2)1489 1635 y Fu(\))574
+1722 y Fh(SOR)m(T)p Fu(\()p Fn(S)760 1732 y Fg(1)792
+1722 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1075
+1722 V 19 w(CONC)p Fu(\()p Fn(S)1291 1732 y Fg(1)1323
+1722 y Fu(\))574 1809 y Fh(RET)q Fu(\()p Fn(F)731 1819
+y Fg(1)763 1809 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p
+1015 1809 V 19 w(CONC)p Fu(\()p Fn(F)1232 1819 y Fg(1)1264
+1809 y Fu(\))2023 1250 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 77.69916 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(DISTRIBUTION)1992 1850 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 68.28656 162.18057
+68.28656 162.18057 0.0 0.0 0.0 0.0 68.28656 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+
+@endspecial 2020 1374 a Fh(JOIN)p Fu(\()p Fn(S)2190
+1384 y Fg(1)2222 1374 y Fn(;)10 b(S)2289 1384 y Fg(2)2321
+1374 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 2589 1374
+V 17 w(CONC)q Fu(\()p Fh(XFER)p Fu(\()p Fn(S)2955 1384
+y Fg(1)2987 1374 y Fu(\))p Fn(;)11 b Fh(XFER)p Fu(\()p
+Fn(S)3230 1384 y Fg(2)3262 1374 y Fu(\)\))2020 1461 y
+Fh(XFER)p Fu(\()p Fn(S)2209 1471 y Fg(1)2241 1461 y Fu(\))18
+b(=)-11 b Ft(\))17 b Fh(Ship)p Fu(\()p Fn(S)2551 1471
+y Fg(1)2583 1461 y Fu(\))2020 1548 y Fh(XFER)p Fu(\()p
+Fn(S)2209 1558 y Fg(1)2241 1548 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(Null)p Fu(\()p Fn(S)2548 1558 y Fg(1)2580 1548 y
+Fu(\))2020 1635 y Fh(JOIN)p Fu(\()p Fn(S)2190 1645 y
+Fg(1)2222 1635 y Fn(;)10 b(S)2289 1645 y Fg(2)2321 1635
+y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 2589 1635 V
+17 w(CONC)q Fu(\()p Fn(S)2804 1645 y Fg(1)2836 1635 y
+Fn(;)10 b(S)2903 1645 y Fg(2)2936 1635 y Fu(\))2020 1722
+y Fh(SOR)m(T)p Fu(\()p Fn(S)2206 1732 y Fg(1)2238 1722
+y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 2521 1722
+V 19 w(CONC)p Fu(\()p Fn(S)2737 1732 y Fg(1)2769 1722
+y Fu(\))2020 1809 y Fh(RET)q Fu(\()p Fn(F)2177 1819 y
+Fg(1)2209 1809 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p
+2461 1809 V 19 w(CONC)q Fu(\()p Fn(F)2679 1819 y Fg(1)2711
+1809 y Fu(\))577 2135 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 73.61931 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(REPLICA)-6 b(TION)545 2380 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 25.60745 162.18057
+25.60745 162.18057 0.0 0.0 0.0 0.0 25.60745 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+
+@endspecial 574 2252 a Fh(RET)q Fu(\()p Fn(F)731 2262
+y Fg(1)763 2252 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(RET)p
+1015 2252 V 19 w(CONC)p Fu(\()p Fn(F)1232 2262 y Fg(11)1293
+2252 y Fu(\))574 2339 y Fh(RET)q Fu(\()p Fn(F)731 2349
+y Fg(1)763 2339 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p
+1015 2339 V 19 w(CONC)p Fu(\()p Fn(F)1232 2349 y Fg(12)1293
+2339 y Fu(\))2023 2207 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8
+neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(RET)1992 2380 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057
+17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+2020 2340 a Fh(RET)q Fu(\()p Fn(F)2177 2350 y Fg(1)2209
+2340 y Fu(\))h(=)-11 b Ft(\))17 b Fh(File)p 2446 2340
+V 18 w(scan)p Fu(\()p Fn(F)2612 2350 y Fg(1)2644 2340
+y Fu(\))p 3557 2581 4 2278 v 323 2584 3237 4 v 3558 2601
+19 2285 v 340 2601 3237 19 v 721 2797 a FP(Figure)24
+b(6.3:)31 b(Example)24 b(layers.)32 b(For)23 b(clarity)-6
+b(,)25 b(all)f(rule)g(actions)h(are)f(omitted.)294 3173
+y(algorithms)c(can)e(either)h(be)f(introduced)j(in)d(this)h(or)e(other)
+i(SOR)-5 b(T)15 b(layers.)2591 3140 y Fv(2)2661 3173
+y FP(The)j(remaining)h(rules)g(trans-)300 3343 y(form)k(abstract)j
+(operators)g(into)e(concrete)i(operators.)583 3512 y(The)31
+b(MERGE)d(layer)j(transforms)i(the)d(JOIN)g(operator)j(into)e(the)g
+(Mer)n(ge)p 2984 3512 28 4 v 34 w(join)g(algorithm.)3558
+3479 y Fv(3)297 3681 y FP(Other)20 b(join)h(algorithms)i(can)e(either)h
+(be)e(encapsulated)k(in)d(the)g(MERGE)c(layer)l(,)23
+b(or)d(in)g(a)g(separate)j(layer)-5 b(.)577 3851 y(The)18
+b(DISTRIBUTION)c(layer)19 b(encapsulates)i(the)e(distribution)i(of)d
+(stored)h(\256les)f(in)f(distributed)295 4020 y(databases.)32
+b(It)18 b(transforms)j(the)e(JOIN)g(operator)i(such)e(that)h(if)e(its)h
+(inputs)i(are)e(located)i(at)d(dif)n(ferent)k(sites,)300
+4189 y(they)30 b(are)f(\256rst)g(transfered)j(to)d(the)g(home)h(site)f
+(\(i.e.,)h(the)g(site)f(where)h(the)f(JOIN)f(was)h(issued\))i(before)
+300 4359 y(the)d(join)h(is)f(performed.)46 b(As)28 b(in)g(the)g(MERGE)e
+(layer)l(,)k(the)e(XFER)e(operator)k(\(denoting)h(the)d(transfer)300
+4528 y(of)i(streams)h(between)h(sites\))f(is)f(an)g(enforcer)n
+(-operator)m(,)36 b(explicitly)d(introduced)g(via)e(a)f(T)-8
+b(-rule.)51 b(One)p 300 4609 1320 4 v 400 4663 a Fu(2)434
+4695 y Fy(In)19 b(fact,)g(we)g(can)g(use)g(any)h(sort)f(algorithm)g(in)
+g(this)f(layer)l(.)25 b(This)19 b(is)f(true)h(for)g(other)g(layers)g
+(as)g(well.)400 4754 y Fu(3)434 4786 y Fy(Note)j(that)g(the)g(JOPR)f
+(operator)i(in)e(the)h(MERGE)g(layer)g(is)f(required)i(because)g(all)e
+(enforcer)o(-operators)i(\(like)f(SOR)l(T\))300 4877
+y(are)e(explicit)f(in)h(Prairie.)26 b(However)m(,)20
+b(since)g(the)g(JOPR)f(operator)h(\(presumably\))h(does)f(not)g(occur)h
+(in)e(other)h(layers,)g(it)f(is)h(not)300 4969 y(an)f(exported)h
+(operator)g(of)f(the)g(MERGE)f(layer)m(,)h(and)g(thus,)g(is)g(not)g
+(transformed)h(into)f(a)g(concrete)g(operator)l(.)1905
+5349 y FP(83)p eop
+%%Page: 84 96
+84 95 bop 300 391 a FP(algorithm)24 b(that)g(implements)h(the)e(XFER)e
+(operator)k(is)e(Ship.)31 b(The)23 b(Ship)g(algorithm)i(here)e(is)g
+(assumed)299 561 y(to)f(be)h(a)f(block)i(transfer)g(of)f(streams)g
+(\(as)g(in)f(R)1762 528 y FB(\003)1823 561 y FP([20,)16
+b(37,)g(45]\);)24 b(other)f(transfer)i(strategies)g(\(e.g.,)d(tuple-)
+295 730 y(at-a-time\))f(could)f(be)f(de\256ned)h(in)f(this)h(or)f
+(other)h(layers)h(encapsulating)i(distribution)f(transformations.)583
+899 y(The)27 b(REPLICA)-10 b(TION)23 b(layer)28 b(models)g(replicated)i
+(databases.)44 b(Its)27 b(imported)h(interface)i(is)d(a)297
+1069 y(RET)19 b(operator)k(that)f(simulates)h(a)d(centralized,)25
+b(non-replicated)g(database.)32 b(That)21 b(is,)g(it)g(gives)h(the)f
+(illu-)300 1238 y(sion)k(of)f(a)g(single)h(physical)h(\256le)e(for)g
+(each)h(stored)h(\256le)d(in)h(the)h(database.)34 b(The)24
+b(REPLICA)-10 b(TION)20 b(layer)300 1408 y(translates)30
+b(a)c(stored)j(\256le)d(reference)j(into)f(a)f(reference)i(to)e(one)g
+(of)g(the)h(physical)h(replicas)g(of)e(the)g(\256le.)300
+1577 y(\(In)d(Figure)g(6.3,)f(we)g(assume)h(each)g(stored)h(\256le)e
+(is)g(replicated)k(twice.\))583 1746 y(The)h(RET)e(layer)i(transforms)i
+(a)e(RET)d(operator)30 b(into)f(the)f(File)p 2624 1746
+28 4 v 33 w(scan)g(algorithm.)46 b(Note)28 b(that)300
+1916 y(there)e(are)f(no)h(other)g(rules)g(transforming)i(abstract)f
+(operators)h(into)e(other)g(concrete)h(operators.)38
+b(This)300 2085 y(means)30 b(that)g(the)g(RET)d(layer)j(is)g(not)g
+(symmetric,)h(i.e.,)f(it)f(imports)i(the)f(RET)d(operator)l(,)33
+b(but)d(doesn')n(t)293 2254 y(export)19 b(any)f(concrete)h(operator)-5
+b(.)31 b(This,)18 b(in)f(turn,)i(implies)g(that)f(the)f(RET)e(layer)l
+(,)20 b(as)d(de\256ned,)i(is)f(typically)300 2424 y(last)24
+b(in)f(a)h(layer)g(composition.)583 2593 y(In)k(the)g(following)i
+(sections,)g(we)d(will)h(show)f(how)h(these)h(layers)g(can)f(be)g(used)
+g(to)g(construct)300 2762 y(some)f(simple)h(optimizers.)44
+b(As)26 b(mentioned)j(earlier)l(,)g(symmetric)g(layers)f(admit)f(more)g
+(composition)300 2932 y(possibilities,)g(since)d(the)g(exported)i(and)e
+(imported)h(interfaces)h(are)e(the)g(same.)300 3239 y
+FN(6.3.2)99 b(An)25 b(Optimizer)g(for)g(a)g(Centralized)h(Database)580
+3469 y FP(An)20 b(optimizer)i(for)f(a)f(centralized)k(database)f(is)d
+(shown)h(in)g(Figure)g(6.4.)30 b(It)20 b(is)g(formed)i(by)e(com-)297
+3638 y(posing)j(the)e(SEQUENTIAL,)c(MERGE,)h(SOR)-5 b(T)e(,)18
+b(and)k(RET)d(layers.)31 b(The)21 b(SEQUENTIAL)c(layer)22
+b(ap-)299 3808 y(plies)i(the)f(join)h(associativity)j(and)c
+(commutativity)i(T)-8 b(-rules)24 b(to)e(a)h(join)h(expression.)33
+b(The)23 b(joins)g(of)g(this)300 3977 y(expression)30
+b(are)d(then)h(transformed)h(into)f(the)f(Mer)n(ge)p
+2044 3977 V 34 w(join)h(algorithm)g(by)f(the)h(MERGE)c(layer)-5
+b(.)42 b(The)300 4146 y(SOR)-5 b(T)24 b(layer)j(then)g(transforms)h
+(the)f(SOR)-5 b(T)24 b(operator)k(into)f(the)g(Mer)n(ge)p
+2617 4146 V 34 w(sort)g(algorithm,)i(and)e(\256nally)300
+4316 y(the)j(RET)e(layer)j(transforms)i(the)d(RET)e(operator)k(into)f
+(the)f(File)p 2401 4316 V 33 w(scan)h(algorithm.)53 b(An)29
+b(example)i(of)300 4485 y(such)26 b(a)f(transformation)j(is)d(shown)h
+(in)f(Figure)g(6.4.)36 b(\(Horizontal)27 b(lines)f(separate)h(the)f
+(input)g(and)g(out-)300 4655 y(put)k(operator)i(trees)e(for)g(each)h
+(layer)-5 b(.\))50 b(Note)30 b(that)g(each)g(of)g(the)g(layers)h(has)f
+(\252dummy\272)h(T)-8 b(-rules)30 b(that)297 4824 y(transform)23
+b(abstract)g(operators)h(into)d(concrete)i(operators.)33
+b(Thus,)21 b(for)g(instance,)j(the)d(SEQUENTIAL)295 4993
+y(layer)f(can)f(either)h(apply)g(the)g(join)f(commutativity)j(rule)d
+(to)g(a)f(join)i(expression,)j(or)18 b(pass)i(the)f(expression)1905
+5349 y(84)p eop
+%%Page: 85 97
+85 96 bop 323 303 3237 4 v 323 3330 4 3027 v 772 2738
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 81.09029 239.00296 81.09029 3.41426 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial 804 565 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494
+neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(SEQUENTIAL)772 1108 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 801 718 a Fh(JOIN)p Fu(\()p
+Fn(S)971 728 y Fg(1)1003 718 y Fn(;)10 b(S)1070 728 y
+Fg(2)1102 718 y Fu(\))18 b(=)-11 b Ft(\))p Fu(!)17 b
+Fh(JOIN)p Fu(\()p Fn(S)1446 728 y Fg(2)1478 718 y Fn(;)11
+b(S)1546 728 y Fg(1)1578 718 y Fu(\))801 805 y Fh(JOIN)p
+Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)1103 815 y Fg(1)1135 805
+y Fn(;)f(S)1202 815 y Fg(2)1234 805 y Fu(\))p Fn(;)h(S)1326
+815 y Fg(3)1358 805 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOIN)p
+Fu(\()p Fn(S)1684 815 y Fg(1)1716 805 y Fn(;)11 b Fh(JOIN)o
+Fu(\()p Fn(S)1915 815 y Fg(2)1947 805 y Fn(;)g(S)2015
+815 y Fg(3)2047 805 y Fu(\)\))801 893 y Fh(JOIN)p Fu(\()p
+Fn(S)971 903 y Fg(1)1003 893 y Fn(;)f(S)1070 903 y Fg(2)1102
+893 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 893
+15 4 v 17 w(CONC)q Fu(\()p Fn(S)1585 903 y Fg(1)1617
+893 y Fn(;)10 b(S)1684 903 y Fg(2)1716 893 y Fu(\))801
+980 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 990 y Fg(1)1019 980
+y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 980
+V 19 w(CONC)p Fu(\()p Fn(S)1518 990 y Fg(1)1550 980 y
+Fu(\))801 1067 y Fh(RET)q Fu(\()p Fn(F)958 1077 y Fg(1)990
+1067 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 1067
+V 19 w(CONC)p Fu(\()p Fn(F)1459 1077 y Fg(1)1491 1067
+y Fu(\))804 1252 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(MERGE)772 1781 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+801 1391 a Fh(JOIN)p Fu(\()p Fn(S)971 1401 y Fg(1)1003
+1391 y Fn(;)10 b(S)1070 1401 y Fg(2)1102 1391 y Fu(\))18
+b(=)-11 b Ft(\))18 b Fh(JOPR)p Fu(\()p Fh(SOR)m(T)p Fu(\()p
+Fn(S)1585 1401 y Fg(1)1617 1391 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p
+Fu(\()p Fn(S)1857 1401 y Fg(2)1889 1391 y Fu(\)\))801
+1479 y Fh(JOPR)p Fu(\()p Fn(S)979 1489 y Fg(1)1011 1479
+y Fn(;)g(S)1079 1489 y Fg(2)1111 1479 y Fu(\))17 b(=)-11
+b Ft(\))18 b Fh(Mer)o(ge)p 1399 1479 V 18 w(join)o Fu(\()p
+Fn(S)1553 1489 y Fg(1)1586 1479 y Fn(;)10 b(S)1653 1489
+y Fg(2)1685 1479 y Fu(\))801 1566 y Fh(JOIN)p Fu(\()p
+Fn(S)971 1576 y Fg(1)1003 1566 y Fn(;)g(S)1070 1576 y
+Fg(2)1102 1566 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p
+1370 1566 V 17 w(CONC)q Fu(\()p Fn(S)1585 1576 y Fg(1)1617
+1566 y Fn(;)10 b(S)1684 1576 y Fg(2)1716 1566 y Fu(\))801
+1653 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 1663 y Fg(1)1019
+1653 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302
+1653 V 19 w(CONC)p Fu(\()p Fn(S)1518 1663 y Fg(1)1550
+1653 y Fu(\))801 1740 y Fh(RET)q Fu(\()p Fn(F)958 1750
+y Fg(1)990 1740 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p
+1242 1740 V 19 w(CONC)p Fu(\()p Fn(F)1459 1750 y Fg(1)1491
+1740 y Fu(\))804 1925 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(SOR)m(T)772 2454 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+801 2065 a Fh(SOR)m(T)p Fu(\()p Fn(S)987 2075 y Fg(1)1019
+2065 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 1307
+2065 V 18 w(sort)p Fu(\()p Fn(S)1459 2075 y Fg(1)1491
+2065 y Fu(\))801 2152 y Fh(SOR)m(T)p Fu(\()p Fn(S)987
+2162 y Fg(1)1019 2152 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p
+Fu(\()p Fn(S)1326 2162 y Fg(1)1358 2152 y Fu(\))801 2239
+y Fh(JOIN)p Fu(\()p Fn(S)971 2249 y Fg(1)1003 2239 y
+Fn(;)10 b(S)1070 2249 y Fg(2)1102 2239 y Fu(\))18 b(=)-11
+b Ft(\))18 b Fh(JOIN)p 1370 2239 V 17 w(CONC)q Fu(\()p
+Fn(S)1585 2249 y Fg(1)1617 2239 y Fn(;)10 b(S)1684 2249
+y Fg(2)1716 2239 y Fu(\))801 2326 y Fh(SOR)m(T)p Fu(\()p
+Fn(S)987 2336 y Fg(1)1019 2326 y Fu(\))18 b(=)-11 b Ft(\))17
+b Fh(SOR)m(T)p 1302 2326 V 19 w(CONC)p Fu(\()p Fn(S)1518
+2336 y Fg(1)1550 2326 y Fu(\))801 2413 y Fh(RET)q Fu(\()p
+Fn(F)958 2423 y Fg(1)990 2413 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(RET)p 1242 2413 V 19 w(CONC)p Fu(\()p Fn(F)1459
+2423 y Fg(1)1491 2413 y Fu(\))804 2607 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8
+neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(RET)772 2780 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057
+17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 801 2740 a Fh(RET)q Fu(\()p
+Fn(F)958 2750 y Fg(1)990 2740 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(File)p 1227 2740 V 17 w(scan)q Fu(\()p Fn(F)1393
+2750 y Fg(1)1425 2740 y Fu(\))2638 421 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 421 a FF(SOR)l(T)2649
+563 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2649 563 a FF(JOIN)2579 824 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 824 a 2516 705
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 705 a FF(RET)2800 705 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 705 a FF(RET)2579
+824 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 824 a 2579 824 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 824 a 2522 840 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522
+840 a FF(dept)2806 832 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 832 a FF(emp)2579 824 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+
+2579 824 a 2579 824 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 824 a 2638 988 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 988
+a FF(SOR)l(T)2649 1130 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2649 1130 a FF(JOIN)2579 1391
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1391 a 2516 1272 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 1272 a FF(RET)2800 1272
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 1272 a FF(RET)2579 1391 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1391 a 2579 1391
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1391 a 2522 1399 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 1399 a FF(emp)2806 1407
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 1407 a FF(dept)2579 1391 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1391 a 2579 1391
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1391 a 2638 1697 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 1697 a FF(SOR)l(T)2572
+1832 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 1832 a FF(Mer)o(ge)p 2747 1832 20 4 v 25
+w(join)2579 2100 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2100 a 2516 1980 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 1980
+a FF(RET)2800 1980 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 1980 a FF(RET)2579 2100 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579
+2100 a 2579 2100 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 2100 a 2522 2108 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 2108
+a FF(emp)2806 2115 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 2115 a FF(dept)2579 2100 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+
+2579 2100 a 2579 2100 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2100 a 2573 2257 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792
+false .5 35.61568 InitRnode } NewNode end end
+ 2573
+2257 a FF(Mer)o(ge)p 2748 2257 20 4 v 25 w(sort)2572
+2399 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 2399 a FF(Mer)o(ge)p 2747 2399 20 4 v 25
+w(join)2579 2667 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2667 a 2516 2547 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 2547
+a FF(RET)2800 2547 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 2547 a FF(RET)2579 2667 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579
+2667 a 2579 2667 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 2667 a 2522 2675 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 2675
+a FF(emp)2806 2682 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 2682 a FF(dept)2579 2667 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+
+2579 2667 a 2579 2667 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2667 a 2573 2824 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792
+false .5 35.61568 InitRnode } NewNode end end
+ 2573
+2824 a FF(Mer)o(ge)p 2748 2824 20 4 v 25 w(sort)2572
+2966 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 2966 a FF(Mer)o(ge)p 2747 2966 20 4 v 25
+w(join)2579 3234 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3234 a 2457 3114 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2457 3114
+a FF(File)p 2563 3114 20 4 v 25 w(scan)2740 3114 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2740
+3114 a FF(File)p 2846 3114 20 4 v 26 w(scan)2579 3234
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3234 a 2579 3234 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3234 a 2522 3242 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522
+3242 a FF(emp)2806 3249 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 3249 a FF(dept)2579 3234
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3234 a 2579 3234 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3234 a 808 2738 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 226.19922 179.25221 226.19922 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 145.10893 179.25221 145.10893 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 64.01865 179.25221 64.01865 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 3.41426 179.25221 3.41426 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial 3557 3330 4 3027 v 323 3333
+3237 4 v 3558 3349 19 3033 v 340 3349 3237 19 v 444 3545
+a FP(Figure)24 b(6.4:)31 b(An)23 b(optimizer)i(for)f(a)f(centralized)k
+(database)e(and)f(an)g(example)h(transformation)300 3922
+y(unchanged)i(to)c(the)h(MERGE)d(layer)-5 b(.)33 b(The)23
+b(example)i(transformation)i(shown)d(in)g(Figure)g(6.4)f(is,)h(thus,)
+300 4091 y FD(one)g FP(of)f(many)h(that)g(can)g(be)g(produced)i(by)d
+(the)h(centralized)j(layered)e(optimizer)-5 b(.)583 4261
+y(Note)23 b(that)g(some)g(operators)j(\(e.g.,)c(JOIN)p
+1923 4261 28 4 v 33 w(CONC)f(and)i(SOR)-5 b(T)p 2613
+4261 V 31 w(CONC)20 b(in)j(the)h(SOR)-5 b(T)20 b(layer\))300
+4430 y(have)29 b(no)g(implementations)j(in)d(lower)f(layers.)48
+b(The)28 b(rules)h(that)g(generate)i(these)f(operators)h(are)e(dis-)300
+4599 y(carded)f(by)e(the)g(P2V)f(preprocessor)30 b(for)c(reasons)i(to)f
+(be)f(explained)i(later;)h(this)e(is)f(described)i(in)e(Sec-)300
+4769 y(tion)e(6.4.)1905 5349 y(85)p eop
+%%Page: 86 98
+86 97 bop 323 403 3237 4 v 323 3429 4 3027 v 772 2837
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 81.09029 239.00296 81.09029 3.41426 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial 804 678 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(MERGE)772 1207 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 801 818 a Fh(JOIN)p Fu(\()p
+Fn(S)971 828 y Fg(1)1003 818 y Fn(;)10 b(S)1070 828 y
+Fg(2)1102 818 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOPR)p
+Fu(\()p Fh(SOR)m(T)p Fu(\()p Fn(S)1585 828 y Fg(1)1617
+818 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p Fu(\()p Fn(S)1857
+828 y Fg(2)1889 818 y Fu(\)\))801 905 y Fh(JOPR)p Fu(\()p
+Fn(S)979 915 y Fg(1)1011 905 y Fn(;)g(S)1079 915 y Fg(2)1111
+905 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(Mer)o(ge)p 1399
+905 15 4 v 18 w(join)o Fu(\()p Fn(S)1553 915 y Fg(1)1586
+905 y Fn(;)10 b(S)1653 915 y Fg(2)1685 905 y Fu(\))801
+992 y Fh(JOIN)p Fu(\()p Fn(S)971 1002 y Fg(1)1003 992
+y Fn(;)g(S)1070 1002 y Fg(2)1102 992 y Fu(\))18 b(=)-11
+b Ft(\))18 b Fh(JOIN)p 1370 992 V 17 w(CONC)q Fu(\()p
+Fn(S)1585 1002 y Fg(1)1617 992 y Fn(;)10 b(S)1684 1002
+y Fg(2)1716 992 y Fu(\))801 1079 y Fh(SOR)m(T)p Fu(\()p
+Fn(S)987 1089 y Fg(1)1019 1079 y Fu(\))18 b(=)-11 b Ft(\))17
+b Fh(SOR)m(T)p 1302 1079 V 19 w(CONC)p Fu(\()p Fn(S)1518
+1089 y Fg(1)1550 1079 y Fu(\))801 1167 y Fh(RET)q Fu(\()p
+Fn(F)958 1177 y Fg(1)990 1167 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(RET)p 1242 1167 V 19 w(CONC)p Fu(\()p Fn(F)1459
+1177 y Fg(1)1491 1167 y Fu(\))804 1338 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494
+neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(SEQUENTIAL)772 1881 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 801 1491 a Fh(JOIN)p Fu(\()p
+Fn(S)971 1501 y Fg(1)1003 1491 y Fn(;)10 b(S)1070 1501
+y Fg(2)1102 1491 y Fu(\))18 b(=)-11 b Ft(\))p Fu(!)17
+b Fh(JOIN)p Fu(\()p Fn(S)1446 1501 y Fg(2)1478 1491 y
+Fn(;)11 b(S)1546 1501 y Fg(1)1578 1491 y Fu(\))801 1578
+y Fh(JOIN)p Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)1103 1588
+y Fg(1)1135 1578 y Fn(;)f(S)1202 1588 y Fg(2)1234 1578
+y Fu(\))p Fn(;)h(S)1326 1588 y Fg(3)1358 1578 y Fu(\))17
+b(=)-11 b Ft(\))18 b Fh(JOIN)p Fu(\()p Fn(S)1684 1588
+y Fg(1)1716 1578 y Fn(;)11 b Fh(JOIN)o Fu(\()p Fn(S)1915
+1588 y Fg(2)1947 1578 y Fn(;)g(S)2015 1588 y Fg(3)2047
+1578 y Fu(\)\))801 1665 y Fh(JOIN)p Fu(\()p Fn(S)971
+1675 y Fg(1)1003 1665 y Fn(;)f(S)1070 1675 y Fg(2)1102
+1665 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 1665
+V 17 w(CONC)q Fu(\()p Fn(S)1585 1675 y Fg(1)1617 1665
+y Fn(;)10 b(S)1684 1675 y Fg(2)1716 1665 y Fu(\))801
+1753 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 1763 y Fg(1)1019
+1753 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302
+1753 V 19 w(CONC)p Fu(\()p Fn(S)1518 1763 y Fg(1)1550
+1753 y Fu(\))801 1840 y Fh(RET)q Fu(\()p Fn(F)958 1850
+y Fg(1)990 1840 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p
+1242 1840 V 19 w(CONC)p Fu(\()p Fn(F)1459 1850 y Fg(1)1491
+1840 y Fu(\))804 2025 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(SOR)m(T)772 2554 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+801 2164 a Fh(SOR)m(T)p Fu(\()p Fn(S)987 2174 y Fg(1)1019
+2164 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 1307
+2164 V 18 w(sort)p Fu(\()p Fn(S)1459 2174 y Fg(1)1491
+2164 y Fu(\))801 2252 y Fh(SOR)m(T)p Fu(\()p Fn(S)987
+2262 y Fg(1)1019 2252 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p
+Fu(\()p Fn(S)1326 2262 y Fg(1)1358 2252 y Fu(\))801 2339
+y Fh(JOIN)p Fu(\()p Fn(S)971 2349 y Fg(1)1003 2339 y
+Fn(;)10 b(S)1070 2349 y Fg(2)1102 2339 y Fu(\))18 b(=)-11
+b Ft(\))18 b Fh(JOIN)p 1370 2339 V 17 w(CONC)q Fu(\()p
+Fn(S)1585 2349 y Fg(1)1617 2339 y Fn(;)10 b(S)1684 2349
+y Fg(2)1716 2339 y Fu(\))801 2426 y Fh(SOR)m(T)p Fu(\()p
+Fn(S)987 2436 y Fg(1)1019 2426 y Fu(\))18 b(=)-11 b Ft(\))17
+b Fh(SOR)m(T)p 1302 2426 V 19 w(CONC)p Fu(\()p Fn(S)1518
+2436 y Fg(1)1550 2426 y Fu(\))801 2513 y Fh(RET)q Fu(\()p
+Fn(F)958 2523 y Fg(1)990 2513 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(RET)p 1242 2513 V 19 w(CONC)p Fu(\()p Fn(F)1459
+2523 y Fg(1)1491 2513 y Fu(\))804 2707 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8
+neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(RET)772 2880 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057
+17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 801 2839 a Fh(RET)q Fu(\()p
+Fn(F)958 2849 y Fg(1)990 2839 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(File)p 1227 2839 V 17 w(scan)q Fu(\()p Fn(F)1393
+2849 y Fg(1)1425 2839 y Fu(\))2638 521 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 521 a FF(SOR)l(T)2649
+663 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2649 663 a FF(JOIN)2579 924 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 924 a 2516 804
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 804 a FF(RET)2800 804 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 804 a FF(RET)2579
+924 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 924 a 2579 924 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 924 a 2522 939 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522
+939 a FF(dept)2806 932 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 932 a FF(emp)2579 924 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+
+2579 924 a 2579 924 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 924 a 2638 1088 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 1088
+a FF(SOR)l(T)2572 1223 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 1223 a FF(Mer)o(ge)p 2747
+1223 20 4 v 25 w(join)2579 1491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1491 a 2516 1371
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 1371 a FF(RET)2800 1371 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 1371 a FF(RET)2579
+1491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1491 a 2579 1491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1491 a 2522 1506
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 1506 a FF(dept)2806 1499 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 1499 a FF(emp)2579
+1491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1491 a 2579 1491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1491 a 2638 1797
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 1797 a FF(SOR)l(T)2572 1931 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 1931 a FF(Mer)o(ge)p
+2747 1931 20 4 v 25 w(join)2579 2200 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2200 a 2516
+2080 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 2080 a FF(RET)2800 2080 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 2080 a FF(RET)2579
+2200 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 2200 a 2579 2200 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 2200 a 2522 2215
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 2215 a FF(dept)2806 2208 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 2208 a FF(emp)2579
+2200 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2200 a 2579 2200 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2200 a 2573 2356
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792
+false .5 35.61568 InitRnode } NewNode end end
+ 2573 2356 a FF(Mer)o(ge)p 2748 2356 20 4 v 25 w(sort)2572
+2498 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 2498 a FF(Mer)o(ge)p 2747 2498 20 4 v 25
+w(join)2579 2766 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2766 a 2516 2647 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 2647
+a FF(RET)2800 2647 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 2647 a FF(RET)2579 2766 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579
+2766 a 2579 2766 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 2766 a 2522 2782 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 2782
+a FF(dept)2806 2774 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 2774 a FF(emp)2579 2766 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+
+2579 2766 a 2579 2766 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2766 a 2573 2923 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792
+false .5 35.61568 InitRnode } NewNode end end
+ 2573
+2923 a FF(Mer)o(ge)p 2748 2923 20 4 v 25 w(sort)2572
+3065 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 3065 a FF(Mer)o(ge)p 2747 3065 20 4 v 25
+w(join)2579 3333 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3333 a 2457 3214 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2457 3214
+a FF(File)p 2563 3214 20 4 v 25 w(scan)2740 3214 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2740
+3214 a FF(File)p 2846 3214 20 4 v 26 w(scan)2579 3333
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3333 a 2579 3333 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3333 a 2522 3349 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522
+3349 a FF(dept)2806 3341 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 3341 a FF(emp)2579 3333
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3333 a 2579 3333 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3333 a 808 2837 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 226.19922 179.25221 226.19922 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 145.10893 179.25221 145.10893 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 64.01865 179.25221 64.01865 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 3.41426 179.25221 3.41426 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial 3557 3429 4 3027 v 323 3432
+3237 4 v 3558 3449 19 3033 v 340 3449 3237 19 v 300 3645
+a FP(Figure)23 b(6.5:)31 b(An)23 b(alternative)i(optimizer)g(for)e(a)f
+(centralized)k(database)g(and)d(an)g(example)h(transforma-)300
+3758 y(tion)300 4116 y FN(6.3.3)99 b(Another)26 b(Optimizer)f(for)g(a)g
+(Centralized)h(Database)581 4346 y FP(An)21 b(alternative)k(optimizer)e
+(for)e(a)h(centralized)i(database)g(is)d(shown)h(in)g(Figure)g(6.5.)30
+b(It)21 b(is)h(sim-)300 4516 y(ilar)31 b(to)g(the)g(optimizer)i(in)e
+(Figure)g(6.4)g(with)g(the)g(SEQUENTIAL)c(and)k(MERGE)d(layers)k
+(reversed.)297 4685 y(Again,)21 b(an)f(example)i(transformation)i(of)c
+(a)g(two-way)h(join)g(expression)i(is)d(shown)h(in)g(Figure)f(6.5.)30
+b(The)300 4854 y(important)c(point)g(to)e(note)i(here)f(is)f(that)h
+(the)g(MERGE)d(layer)j(\256rst)g(transforms)h(a)e(JOIN)g(operator)j
+(into)300 5024 y(the)h(Mer)n(ge)p 677 5024 28 4 v 34
+w(join)g(algorithm,)h(then)g(the)e(SEQUENTIAL)c(layer)28
+b(applies)h(the)f(join)g(associativity)j(and)1905 5349
+y(86)p eop
+%%Page: 87 99
+87 98 bop 300 391 a FP(commutativity)28 b(rules.)39 b(However)l(,)27
+b(any)g(remaining)g(JOIN)e(operators)k(beyond)e(the)f(SEQUENTIAL)300
+561 y(layer)j(are)f(not)g(transformed)i(into)f(any)f(join)g(algorithms)
+i(\(since)f(the)g(two)e(lower)h(layers,)i(SOR)-5 b(T)25
+b(and)298 730 y(RET)19 b(only)j(transform)i(the)d(SOR)-5
+b(T)19 b(and)j(RET)d(operators,)24 b(respectively\).)34
+b(Thus,)22 b(the)g(transformations)296 899 y(in)f(the)f(SEQUENTIAL)c
+(layer)22 b(are)e(never)h(applied)i(to)d(generate)i(valid)g(access)f
+(plans.)31 b(In)20 b(other)i(words,)300 1069 y(the)j(layered)h
+(optimizer)g(speci\256cation)h(shown)e(in)g(Figure)g(6.5)f(would)h
+(remain)g(unchanged)j(in)c(its)h(be-)300 1238 y(havior)g(if)e(the)h
+(SEQUENTIAL)19 b(layer)25 b(were)e(removed.)2098 1205
+y Fv(4)583 1408 y FP(Comparison)38 b(of)d(the)h(two)e(alternative)39
+b(centralized)f(optimizers)g(in)d(Figures)h(6.4)f(and)h(6.5)298
+1577 y(shows)22 b(that)g(the)g(one)g(in)f(Figure)i(6.4)e(is)g(more)h
+(general)h(since)g(its)f(search)g(space)h(is)f(lar)n(ger)-5
+b(.)31 b(This)22 b(simple)295 1746 y(example)f(shows)e(that)h(the)f
+(order)h(of)g(layer)g(stacking)h(can)e(alter)h(the)g(search)g(space)h
+(without)f(any)f(change)294 1916 y(in)g(the)f(search)i(strategy)-6
+b(.)31 b(This,)19 b(in)g(turn,)h(implies)f(that)g(the)g(optimal)g
+(access)h(plan)f(depends)i(on)d(the)h(order)300 2085
+y(of)k(layers.)300 2392 y FN(6.3.4)99 b(An)25 b(Optimizer)g(for)g(a)g
+(Distributed)h(Database)300 2622 y FP(An)f(optimizer)i(for)e(a)g
+(distributed)k(database)f(is)d(shown)h(in)f(Figure)h(6.6.)37
+b(It)25 b(is)g(formed)h(by)g(composing)300 2792 y(the)e(SEQUENTIAL,)19
+b(DISTRIBUTION,)g(MERGE,)i(SOR)-5 b(T)e(,)21 b(and)j(RET)d(layers.)32
+b(In)23 b(other)i(words,)f(it)299 2961 y(is)f(obtained)i(by)e(adding)i
+(the)e(DISTRIBUTION)c(layer)24 b(to)f(the)g(centralized)j(optimizer)e
+(in)f(Figure)g(6.4.)300 3130 y(The)h(SEQUENTIAL)19 b(layer)25
+b(applies)h(the)e(join)h(associativity)j(and)c(commutativity)j(T)-8
+b(-rules)24 b(to)g(a)g(join)294 3300 y(expression.)32
+b(The)18 b(DISTRIBUTION)d(layer)k(then)g(ensures)h(that)f(join)g
+(streams)h(are)e(shipped)i(to)f(the)f(join)296 3469 y(site)j(by)f
+(using)h(the)f(Ship)g(algorithm.)32 b(The)19 b(JOIN)h(operator)i(is)e
+(then)g(transformed)j(into)e(the)f(Mer)n(ge)p 3433 3469
+28 4 v 34 w(join)300 3638 y(algorithm)28 b(by)f(the)g(MERGE)d(layer)-5
+b(.)41 b(The)26 b(SOR)-5 b(T)24 b(layer)j(then)h(transforms)g(the)f
+(SOR)-5 b(T)24 b(operator)29 b(into)300 3808 y(the)f(Mer)n(ge)p
+677 3808 V 34 w(sort)h(algorithm,)h(and)f(\256nally)f(the)g(RET)e
+(layer)j(transforms)h(the)e(RET)d(operator)30 b(into)f(the)300
+3977 y(File)p 446 3977 V 33 w(scan)24 b(algorithm.)33
+b(An)23 b(example)i(transformation)i(is)c(shown)h(in)f(Figure)i(6.6.)
+300 4284 y FN(6.3.5)99 b(An)25 b(Optimizer)g(for)g(a)g(Replicated)h
+(Database)299 4514 y FP(An)21 b(optimizer)j(for)e(a)g(replicated)j
+(database)f(is)e(obtained)j(from)d(a)g(centralized)j(optimizer)f(by)e
+(inserting)300 4684 y(the)j(REPLICA)-10 b(TION)21 b(layer)-5
+b(.)36 b(This)25 b(is)g(shown)g(in)g(Figure)h(6.7.)35
+b(It)25 b(is)f(formed)i(by)f(composing)i(the)f(SE-)p
+300 4765 1320 4 v 400 4818 a Fu(4)434 4850 y Fy(The)20
+b(layer)g(ordering)h(of)f(Figure)g(6.5)g(is)f(actually)h(an)g(example)h
+(of)f(a)g(composition)h(error)m(,)f(in)g(that)f(the)h(SEQUENTIAL)300
+4941 y(layer)15 b(should)h(lie)f(above)h(all)e(join)h(layers)g(for)g
+(it)f(to)h(be)g(useful.)24 b(Errors)15 b(like)g(this)f(can)i(be)f
+(detected)h(using)f(Batory)g(and)h(Geraci')l(s)300 5033
+y(algorithms)j([8].)1905 5349 y FP(87)p eop
+%%Page: 88 100
+88 99 bop 323 639 3237 4 v 323 4529 4 3891 v 772 3774
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 81.09029 324.36116 81.09029 -3.41426 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial 804 858 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494
+neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(SEQUENTIAL)772 1400 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 801 1011 a Fh(JOIN)p Fu(\()p
+Fn(S)971 1021 y Fg(1)1003 1011 y Fn(;)10 b(S)1070 1021
+y Fg(2)1102 1011 y Fu(\))18 b(=)-11 b Ft(\))p Fu(!)17
+b Fh(JOIN)p Fu(\()p Fn(S)1446 1021 y Fg(2)1478 1011 y
+Fn(;)11 b(S)1546 1021 y Fg(1)1578 1011 y Fu(\))801 1098
+y Fh(JOIN)p Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)1103 1108
+y Fg(1)1135 1098 y Fn(;)f(S)1202 1108 y Fg(2)1234 1098
+y Fu(\))p Fn(;)h(S)1326 1108 y Fg(3)1358 1098 y Fu(\))17
+b(=)-11 b Ft(\))18 b Fh(JOIN)p Fu(\()p Fn(S)1684 1108
+y Fg(1)1716 1098 y Fn(;)11 b Fh(JOIN)o Fu(\()p Fn(S)1915
+1108 y Fg(2)1947 1098 y Fn(;)g(S)2015 1108 y Fg(3)2047
+1098 y Fu(\)\))801 1185 y Fh(JOIN)p Fu(\()p Fn(S)971
+1195 y Fg(1)1003 1185 y Fn(;)f(S)1070 1195 y Fg(2)1102
+1185 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 1185
+15 4 v 17 w(CONC)q Fu(\()p Fn(S)1585 1195 y Fg(1)1617
+1185 y Fn(;)10 b(S)1684 1195 y Fg(2)1716 1185 y Fu(\))801
+1272 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 1282 y Fg(1)1019
+1272 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302
+1272 V 19 w(CONC)p Fu(\()p Fn(S)1518 1282 y Fg(1)1550
+1272 y Fu(\))801 1360 y Fh(RET)q Fu(\()p Fn(F)958 1370
+y Fg(1)990 1360 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p
+1242 1360 V 19 w(CONC)p Fu(\()p Fn(F)1459 1370 y Fg(1)1491
+1360 y Fu(\))804 1545 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 77.69916 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(DISTRIBUTION)772 2145 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 68.28656 162.18057
+68.28656 162.18057 0.0 0.0 0.0 0.0 68.28656 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+
+@endspecial 801 1668 a Fh(JOIN)p Fu(\()p Fn(S)971 1678
+y Fg(1)1003 1668 y Fn(;)10 b(S)1070 1678 y Fg(2)1102
+1668 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 1668
+V 17 w(CONC)q Fu(\()p Fh(XFER)p Fu(\()p Fn(S)1736 1678
+y Fg(1)1768 1668 y Fu(\))p Fn(;)11 b Fh(XFER)p Fu(\()p
+Fn(S)2011 1678 y Fg(2)2043 1668 y Fu(\)\))801 1755 y
+Fh(XFER)p Fu(\()p Fn(S)990 1765 y Fg(1)1022 1755 y Fu(\))18
+b(=)-11 b Ft(\))17 b Fh(Ship)p Fu(\()p Fn(S)1332 1765
+y Fg(1)1364 1755 y Fu(\))801 1842 y Fh(XFER)p Fu(\()p
+Fn(S)990 1852 y Fg(1)1022 1842 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(Null)p Fu(\()p Fn(S)1329 1852 y Fg(1)1361 1842 y
+Fu(\))801 1929 y Fh(JOIN)p Fu(\()p Fn(S)971 1939 y Fg(1)1003
+1929 y Fn(;)10 b(S)1070 1939 y Fg(2)1102 1929 y Fu(\))18
+b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 1929 V 17 w(CONC)q
+Fu(\()p Fn(S)1585 1939 y Fg(1)1617 1929 y Fn(;)10 b(S)1684
+1939 y Fg(2)1716 1929 y Fu(\))801 2017 y Fh(SOR)m(T)p
+Fu(\()p Fn(S)987 2027 y Fg(1)1019 2017 y Fu(\))18 b(=)-11
+b Ft(\))17 b Fh(SOR)m(T)p 1302 2017 V 19 w(CONC)p Fu(\()p
+Fn(S)1518 2027 y Fg(1)1550 2017 y Fu(\))801 2104 y Fh(RET)q
+Fu(\()p Fn(F)958 2114 y Fg(1)990 2104 y Fu(\))h(=)-11
+b Ft(\))17 b Fh(RET)p 1242 2104 V 19 w(CONC)p Fu(\()p
+Fn(F)1459 2114 y Fg(1)1491 2104 y Fu(\))804 2289 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(MERGE)772 2818 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 801 2428 a Fh(JOIN)p Fu(\()p
+Fn(S)971 2438 y Fg(1)1003 2428 y Fn(;)10 b(S)1070 2438
+y Fg(2)1102 2428 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOPR)p
+Fu(\()p Fh(SOR)m(T)p Fu(\()p Fn(S)1585 2438 y Fg(1)1617
+2428 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p Fu(\()p Fn(S)1857
+2438 y Fg(2)1889 2428 y Fu(\)\))801 2515 y Fh(JOPR)p
+Fu(\()p Fn(S)979 2525 y Fg(1)1011 2515 y Fn(;)g(S)1079
+2525 y Fg(2)1111 2515 y Fu(\))17 b(=)-11 b Ft(\))18 b
+Fh(Mer)o(ge)p 1399 2515 V 18 w(join)o Fu(\()p Fn(S)1553
+2525 y Fg(1)1586 2515 y Fn(;)10 b(S)1653 2525 y Fg(2)1685
+2515 y Fu(\))801 2603 y Fh(JOIN)p Fu(\()p Fn(S)971 2613
+y Fg(1)1003 2603 y Fn(;)g(S)1070 2613 y Fg(2)1102 2603
+y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 2603 V
+17 w(CONC)q Fu(\()p Fn(S)1585 2613 y Fg(1)1617 2603 y
+Fn(;)10 b(S)1684 2613 y Fg(2)1716 2603 y Fu(\))801 2690
+y Fh(SOR)m(T)p Fu(\()p Fn(S)987 2700 y Fg(1)1019 2690
+y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 2690
+V 19 w(CONC)p Fu(\()p Fn(S)1518 2700 y Fg(1)1550 2690
+y Fu(\))801 2777 y Fh(RET)q Fu(\()p Fn(F)958 2787 y Fg(1)990
+2777 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 2777
+V 19 w(CONC)p Fu(\()p Fn(F)1459 2787 y Fg(1)1491 2777
+y Fu(\))804 2962 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(SOR)m(T)772 3491 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+801 3102 a Fh(SOR)m(T)p Fu(\()p Fn(S)987 3112 y Fg(1)1019
+3102 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 1307
+3102 V 18 w(sort)p Fu(\()p Fn(S)1459 3112 y Fg(1)1491
+3102 y Fu(\))801 3189 y Fh(SOR)m(T)p Fu(\()p Fn(S)987
+3199 y Fg(1)1019 3189 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p
+Fu(\()p Fn(S)1326 3199 y Fg(1)1358 3189 y Fu(\))801 3276
+y Fh(JOIN)p Fu(\()p Fn(S)971 3286 y Fg(1)1003 3276 y
+Fn(;)10 b(S)1070 3286 y Fg(2)1102 3276 y Fu(\))18 b(=)-11
+b Ft(\))18 b Fh(JOIN)p 1370 3276 V 17 w(CONC)q Fu(\()p
+Fn(S)1585 3286 y Fg(1)1617 3276 y Fn(;)10 b(S)1684 3286
+y Fg(2)1716 3276 y Fu(\))801 3363 y Fh(SOR)m(T)p Fu(\()p
+Fn(S)987 3373 y Fg(1)1019 3363 y Fu(\))18 b(=)-11 b Ft(\))17
+b Fh(SOR)m(T)p 1302 3363 V 19 w(CONC)p Fu(\()p Fn(S)1518
+3373 y Fg(1)1550 3363 y Fu(\))801 3450 y Fh(RET)q Fu(\()p
+Fn(F)958 3460 y Fg(1)990 3450 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(RET)p 1242 3450 V 19 w(CONC)p Fu(\()p Fn(F)1459
+3460 y Fg(1)1491 3450 y Fu(\))804 3771 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8
+neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(RET)772 3945 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057
+17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 801 3904 a Fh(RET)q Fu(\()p
+Fn(F)958 3914 y Fg(1)990 3904 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(File)p 1227 3904 V 17 w(scan)q Fu(\()p Fn(F)1393
+3914 y Fg(1)1425 3904 y Fu(\))2638 757 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 757 a FF(SOR)l(T)2649
+898 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2649 898 a FF(JOIN)2579 1160 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1160 a 2516
+1040 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 1040 a FF(RET)2800 1040 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 1040 a FF(RET)2579
+1160 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1160 a 2579 1160 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1160 a 2522 1175
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 1175 a FF(dept)2806 1168 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 1168 a FF(emp)2579
+1160 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1160 a 2579 1160 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1160 a 2638 1323
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 1323 a FF(SOR)l(T)2649 1465 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2649 1465 a FF(JOIN)2579
+1726 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1726 a 2516 1607 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 1607 a FF(RET)2800
+1607 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 1607 a FF(RET)2579 1726 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1726 a 2579
+1726 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1726 a 2522 1734 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 1734 a FF(emp)2806
+1742 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 1742 a FF(dept)2579 1726 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1726 a 2579
+1726 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1726 a 2638 1961 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 1961 a FF(SOR)l(T)2649
+2103 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2649 2103 a FF(JOIN)2579 2506 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2506 a 2518
+2238 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodexfer1 16 { .5 5.43198
+1.72792 false .5 14.67188 InitRnode } NewNode end end
+ 2518 2238 a FF(Ship)2802 2238 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodexfer2 16 { .5 5.43198
+1.72792 false .5 14.67188 InitRnode } NewNode end end
+ 2802 2238 a FF(Ship)2579
+2506 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNodexfer1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 2506 a 2579 2506 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNodexfer2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 2506 a 2516 2386
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 2386 a FF(RET)2800 2386 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 2386 a FF(RET)2579
+2506 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer1
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 2506 a 2579 2506 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer2
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 2506 a 2522 2514
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 2514 a FF(emp)2806 2521 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 2521 a FF(dept)2579
+2506 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2506 a 2579 2506 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2506 a 2638 2670
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 2670 a FF(SOR)l(T)2572 2805 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 2805 a FF(Mer)o(ge)p
+2747 2805 20 4 v 25 w(join)2579 3215 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3215 a 2518
+2947 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodexfer1 16 { .5 5.43198
+1.72792 false .5 14.67188 InitRnode } NewNode end end
+ 2518 2947 a FF(Ship)2802 2947 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodexfer2 16 { .5 5.43198
+1.72792 false .5 14.67188 InitRnode } NewNode end end
+ 2802 2947 a FF(Ship)2579
+3215 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNodexfer1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3215 a 2579 3215 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNodexfer2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3215 a 2516 3095
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 3095 a FF(RET)2800 3095 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 3095 a FF(RET)2579
+3215 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer1
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3215 a 2579 3215 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer2
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3215 a 2522 3223
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 3223 a FF(emp)2806 3230 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 3230 a FF(dept)2579
+3215 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3215 a 2579 3215 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3215 a 2573 3300
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792
+false .5 35.61568 InitRnode } NewNode end end
+ 2573 3300 a FF(Mer)o(ge)p 2748 3300 20 4 v 25 w(sort)2572
+3443 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 3443 a FF(Mer)o(ge)p 2747 3443 20 4 v 25
+w(join)2579 3852 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3852 a 2518 3584 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodexfer1 16 { .5 5.43198
+1.72792 false .5 14.67188 InitRnode } NewNode end end
+ 2518 3584
+a FF(Ship)2802 3584 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodexfer2 16 { .5 5.43198
+1.72792 false .5 14.67188 InitRnode } NewNode end end
+ 2802 3584 a FF(Ship)2579 3852 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNodexfer1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+
+2579 3852 a 2579 3852 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNodexfer2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3852 a 2516 3733 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516
+3733 a FF(RET)2800 3733 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 3733 a FF(RET)2579 3852
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer1
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3852 a 2579 3852 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer2
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3852 a 2522 3860 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522
+3860 a FF(emp)2806 3868 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 3868 a FF(dept)2579 3852
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3852 a 2579 3852 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3852 a 2573 3938 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792
+false .5 35.61568 InitRnode } NewNode end end
+ 2573
+3938 a FF(Mer)o(ge)p 2748 3938 20 4 v 25 w(sort)2572
+4080 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 4080 a FF(Mer)o(ge)p 2747 4080 20 4 v 25
+w(join)2579 4490 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 4490 a 2518 4222 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodexfer1 16 { .5 5.43198
+1.72792 false .5 14.67188 InitRnode } NewNode end end
+ 2518 4222
+a FF(Ship)2802 4222 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodexfer2 16 { .5 5.43198
+1.72792 false .5 14.67188 InitRnode } NewNode end end
+ 2802 4222 a FF(Ship)2579 4490 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNodexfer1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+
+2579 4490 a 2579 4490 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNodexfer2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 4490 a 2457 4371 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2457
+4371 a FF(File)p 2563 4371 20 4 v 25 w(scan)2740 4371
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2740 4371 a FF(File)p 2846 4371 20 4 v 26 w(scan)2579
+4490 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer1
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 4490 a 2579 4490 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer2
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 4490 a 2522 4498
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 4498 a FF(emp)2806 4506 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 4506 a FF(dept)2579
+4490 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 4490 a 2579 4490 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 4490 a 808 3073 a
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 226.19922 179.25221 226.19922 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 145.10893 179.25221 145.10893 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 59.75073 179.25221 59.75073 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 -21.33954 179.25221 -21.33954 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 -97.30829 179.25221 -97.30829 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial 3557 4529 4 3891 v 323 4532
+3237 4 v 3558 4549 19 3898 v 340 4549 3237 19 v 449 4745
+a FP(Figure)24 b(6.6:)31 b(An)23 b(optimizer)i(for)f(a)f(distributed)k
+(database)e(and)f(an)g(example)h(transformation)1905
+5349 y(88)p eop
+%%Page: 89 101
+89 100 bop 323 823 3237 4 v 323 4345 4 3523 v 772 3668
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 81.09029 290.21788 81.09029 -8.53581 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial 804 1070 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494
+neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(SEQUENTIAL)772 1613 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 801 1224 a Fh(JOIN)p Fu(\()p
+Fn(S)971 1234 y Fg(1)1003 1224 y Fn(;)10 b(S)1070 1234
+y Fg(2)1102 1224 y Fu(\))18 b(=)-11 b Ft(\))p Fu(!)17
+b Fh(JOIN)p Fu(\()p Fn(S)1446 1234 y Fg(2)1478 1224 y
+Fn(;)11 b(S)1546 1234 y Fg(1)1578 1224 y Fu(\))801 1311
+y Fh(JOIN)p Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)1103 1321
+y Fg(1)1135 1311 y Fn(;)f(S)1202 1321 y Fg(2)1234 1311
+y Fu(\))p Fn(;)h(S)1326 1321 y Fg(3)1358 1311 y Fu(\))17
+b(=)-11 b Ft(\))18 b Fh(JOIN)p Fu(\()p Fn(S)1684 1321
+y Fg(1)1716 1311 y Fn(;)11 b Fh(JOIN)o Fu(\()p Fn(S)1915
+1321 y Fg(2)1947 1311 y Fn(;)g(S)2015 1321 y Fg(3)2047
+1311 y Fu(\)\))801 1398 y Fh(JOIN)p Fu(\()p Fn(S)971
+1408 y Fg(1)1003 1398 y Fn(;)f(S)1070 1408 y Fg(2)1102
+1398 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 1398
+15 4 v 17 w(CONC)q Fu(\()p Fn(S)1585 1408 y Fg(1)1617
+1398 y Fn(;)10 b(S)1684 1408 y Fg(2)1716 1398 y Fu(\))801
+1485 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 1495 y Fg(1)1019
+1485 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302
+1485 V 19 w(CONC)p Fu(\()p Fn(S)1518 1495 y Fg(1)1550
+1485 y Fu(\))801 1572 y Fh(RET)q Fu(\()p Fn(F)958 1582
+y Fg(1)990 1572 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p
+1242 1572 V 19 w(CONC)p Fu(\()p Fn(F)1459 1582 y Fg(1)1491
+1572 y Fu(\))804 1757 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(MERGE)772 2286 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+801 1897 a Fh(JOIN)p Fu(\()p Fn(S)971 1907 y Fg(1)1003
+1897 y Fn(;)10 b(S)1070 1907 y Fg(2)1102 1897 y Fu(\))18
+b(=)-11 b Ft(\))18 b Fh(JOPR)p Fu(\()p Fh(SOR)m(T)p Fu(\()p
+Fn(S)1585 1907 y Fg(1)1617 1897 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p
+Fu(\()p Fn(S)1857 1907 y Fg(2)1889 1897 y Fu(\)\))801
+1984 y Fh(JOPR)p Fu(\()p Fn(S)979 1994 y Fg(1)1011 1984
+y Fn(;)g(S)1079 1994 y Fg(2)1111 1984 y Fu(\))17 b(=)-11
+b Ft(\))18 b Fh(Mer)o(ge)p 1399 1984 V 18 w(join)o Fu(\()p
+Fn(S)1553 1994 y Fg(1)1586 1984 y Fn(;)10 b(S)1653 1994
+y Fg(2)1685 1984 y Fu(\))801 2071 y Fh(JOIN)p Fu(\()p
+Fn(S)971 2081 y Fg(1)1003 2071 y Fn(;)g(S)1070 2081 y
+Fg(2)1102 2071 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p
+1370 2071 V 17 w(CONC)q Fu(\()p Fn(S)1585 2081 y Fg(1)1617
+2071 y Fn(;)10 b(S)1684 2081 y Fg(2)1716 2071 y Fu(\))801
+2158 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 2168 y Fg(1)1019
+2158 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302
+2158 V 19 w(CONC)p Fu(\()p Fn(S)1518 2168 y Fg(1)1550
+2158 y Fu(\))801 2245 y Fh(RET)q Fu(\()p Fn(F)958 2255
+y Fg(1)990 2245 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p
+1242 2245 V 19 w(CONC)p Fu(\()p Fn(F)1459 2255 y Fg(1)1491
+2245 y Fu(\))804 2431 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+Fe(SOR)m(T)772 2960 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+801 2570 a Fh(SOR)m(T)p Fu(\()p Fn(S)987 2580 y Fg(1)1019
+2570 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 1307
+2570 V 18 w(sort)p Fu(\()p Fn(S)1459 2580 y Fg(1)1491
+2570 y Fu(\))801 2657 y Fh(SOR)m(T)p Fu(\()p Fn(S)987
+2667 y Fg(1)1019 2657 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p
+Fu(\()p Fn(S)1326 2667 y Fg(1)1358 2657 y Fu(\))801 2744
+y Fh(JOIN)p Fu(\()p Fn(S)971 2754 y Fg(1)1003 2744 y
+Fn(;)10 b(S)1070 2754 y Fg(2)1102 2744 y Fu(\))18 b(=)-11
+b Ft(\))18 b Fh(JOIN)p 1370 2744 V 17 w(CONC)q Fu(\()p
+Fn(S)1585 2754 y Fg(1)1617 2744 y Fn(;)10 b(S)1684 2754
+y Fg(2)1716 2744 y Fu(\))801 2832 y Fh(SOR)m(T)p Fu(\()p
+Fn(S)987 2842 y Fg(1)1019 2832 y Fu(\))18 b(=)-11 b Ft(\))17
+b Fh(SOR)m(T)p 1302 2832 V 19 w(CONC)p Fu(\()p Fn(S)1518
+2842 y Fg(1)1550 2832 y Fu(\))801 2919 y Fh(RET)q Fu(\()p
+Fn(F)958 2929 y Fg(1)990 2919 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(RET)p 1242 2919 V 19 w(CONC)p Fu(\()p Fn(F)1459
+2929 y Fg(1)1491 2919 y Fu(\))804 3139 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 73.61931 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(REPLICA)-6 b(TION)772 3385
+y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 25.60745 162.18057
+25.60745 162.18057 0.0 0.0 0.0 0.0 25.60745 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 801 3257 a Fh(RET)q
+Fu(\()p Fn(F)958 3267 y Fg(1)990 3257 y Fu(\))18 b(=)-11
+b Ft(\))17 b Fh(RET)p 1242 3257 V 19 w(CONC)p Fu(\()p
+Fn(F)1459 3267 y Fg(11)1520 3257 y Fu(\))801 3344 y Fh(RET)q
+Fu(\()p Fn(F)958 3354 y Fg(1)990 3344 y Fu(\))h(=)-11
+b Ft(\))17 b Fh(RET)p 1242 3344 V 19 w(CONC)p Fu(\()p
+Fn(F)1459 3354 y Fg(12)1520 3344 y Fu(\))804 3679 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8
+neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(RET)772 3852 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057
+17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 801 3812 a Fh(RET)q Fu(\()p
+Fn(F)958 3822 y Fg(1)990 3812 y Fu(\))h(=)-11 b Ft(\))17
+b Fh(File)p 1227 3812 V 17 w(scan)q Fu(\()p Fn(F)1393
+3822 y Fg(1)1425 3812 y Fu(\))2638 941 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 941 a FF(SOR)l(T)2649
+1082 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2649 1082 a FF(JOIN)2579 1344 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1344 a 2516
+1224 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 1224 a FF(RET)2800 1224 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 1224 a FF(RET)2579
+1344 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1344 a 2579 1344 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1344 a 2522 1359
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 1359 a FF(dept)2806 1352 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 1352 a FF(emp)2579
+1344 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1344 a 2579 1344 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1344 a 2638 1508
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 1508 a FF(SOR)l(T)2649 1649 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 2649 1649 a FF(JOIN)2579
+1911 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1911 a 2516 1791 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 1791 a FF(RET)2800
+1791 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 1791 a FF(RET)2579 1911 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1911 a 2579
+1911 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 1911 a 2522 1919 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 1919 a FF(emp)2806
+1926 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 1926 a FF(dept)2579 1911 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1911 a 2579
+1911 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 1911 a 2638 2216 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198
+0.08394 false .5 19.96785 InitRnode } NewNode end end
+ 2638 2216 a FF(SOR)l(T)2572
+2351 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 2351 a FF(Mer)o(ge)p 2747 2351 20 4 v 25
+w(join)2579 2619 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2619 a 2516 2500 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 2500
+a FF(RET)2800 2500 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 2500 a FF(RET)2579 2619 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579
+2619 a 2579 2619 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 2619 a 2522 2627 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 2627
+a FF(emp)2806 2635 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 2635 a FF(dept)2579 2619 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+
+2579 2619 a 2579 2619 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 2619 a 2573 2819 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792
+false .5 35.61568 InitRnode } NewNode end end
+ 2573
+2819 a FF(Mer)o(ge)p 2748 2819 20 4 v 25 w(sort)2572
+2961 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 2961 a FF(Mer)o(ge)p 2747 2961 20 4 v 25
+w(join)2579 3229 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3229 a 2516 3109 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2516 3109
+a FF(RET)2800 3109 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0
+false .5 15.11191 InitRnode } NewNode end end
+ 2800 3109 a FF(RET)2579 3229 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579
+3229 a 2579 3229 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3229 a 2522 3237 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2522 3237
+a FF(emp)2806 3244 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 13.77588 InitRnode } NewNode end end
+ 2806 3244 a FF(dept)2579 3229 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+
+2579 3229 a 2579 3229 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3229 a 2573 3343 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792
+false .5 35.61568 InitRnode } NewNode end end
+ 2573
+3343 a FF(Mer)o(ge)p 2748 3343 20 4 v 25 w(sort)2572
+3485 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 3485 a FF(Mer)o(ge)p 2747 3485 20 4 v 25
+w(join)2579 3753 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3753 a 2457 3634 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2457 3634
+a FF(File)p 2563 3634 20 4 v 25 w(scan)2740 3634 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2740
+3634 a FF(File)p 2846 3634 20 4 v 26 w(scan)2579 3753
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3753 a 2579 3753 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 3753 a 2494 3769 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 20.65588 InitRnode } NewNode end end
+ 2494
+3769 a FF(emp)p 2612 3769 20 4 v 24 w(1)2777 3769 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 20.65588 InitRnode } NewNode end end
+ 2777
+3769 a FF(dept)p 2894 3769 20 4 v 25 w(2)2579 3753 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+
+2579 3753 a 2579 3753 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 3753 a 2573 3839 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792
+false .5 35.61568 InitRnode } NewNode end end
+ 2573
+3839 a FF(Mer)o(ge)p 2748 3839 20 4 v 25 w(sort)2572
+3981 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198
+1.72792 false .5 36.0637 InitRnode } NewNode end end
+ 2572 3981 a FF(Mer)o(ge)p 2747 3981 20 4 v 25
+w(join)2579 4249 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 4249 a 2457 4130 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2457 4130
+a FF(File)p 2563 4130 20 4 v 25 w(scan)2740 4130 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198
+0.08394 false .5 29.5436 InitRnode } NewNode end end
+ 2740
+4130 a FF(File)p 2846 4130 20 4 v 26 w(scan)2579 4249
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 4249 a 2579 4249 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 2579 4249 a 2494 4265 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792
+false .5 20.65588 InitRnode } NewNode end end
+ 2494
+4265 a FF(emp)p 2612 4265 20 4 v 24 w(1)2777 4265 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792
+false .5 20.65588 InitRnode } NewNode end end
+ 2777
+4265 a FF(dept)p 2894 4265 20 4 v 25 w(2)2579 4249 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+
+2579 4249 a 2579 4249 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 2579 4249 a 808 3257 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 226.19922 179.25221 226.19922 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 145.10893 179.25221 145.10893 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 64.01865 179.25221 64.01865 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 -4.2679 179.25221 -4.2679 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 281.68205 -63.16501 179.25221 -63.16501 /Lineto
+/lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore end
+
+@endspecial
+3557 4345 4 3523 v 323 4348 3237 4 v 3558 4365 19 3529
+v 340 4365 3237 19 v 464 4561 a FP(Figure)24 b(6.7:)32
+b(An)22 b(optimizer)k(for)d(a)g(replicated)j(database)g(and)e(an)g
+(example)g(transformation)1905 5349 y(89)p eop
+%%Page: 90 102
+90 101 bop 298 391 a FP(QUENTIAL,)18 b(MERGE,)h(SOR)-5
+b(T)e(,)19 b(REPLICA)-10 b(TION,)18 b(and)k(RET)e(layers.)31
+b(The)22 b(SEQUENTIAL)17 b(layer)299 561 y(applies)25
+b(the)f(join)f(associativity)k(and)d(commutativity)h(T)-8
+b(-rules)24 b(to)f(a)f(join)i(expression.)34 b(The)22
+b(JOIN)g(op-)300 730 y(erator)k(is)f(then)h(transformed)i(into)e(the)f
+(Mer)n(ge)p 1806 730 28 4 v 35 w(join)g(algorithm)i(by)f(the)f(MERGE)e
+(layer)-5 b(.)36 b(The)25 b(SOR)-5 b(T)300 899 y(layer)31
+b(then)h(transforms)g(the)f(SOR)-5 b(T)28 b(operator)k(into)f(the)g
+(Mer)n(ge)p 2397 899 V 34 w(sort)g(algorithm.)54 b(The)30
+b(REPLICA-)298 1069 y(TION)20 b(layer)j(transforms)g(references)i(to)d
+(logical)h(stored)g(\256les)f(into)g(their)g(physical)i(replicas.)33
+b(Finally)-6 b(,)298 1238 y(the)21 b(RET)e(layer)j(transforms)i(the)d
+(RET)f(operator)j(into)f(the)f(File)p 2319 1238 V 34
+w(scan)h(algorithm.)31 b(An)21 b(example)h(trans-)300
+1408 y(formation)27 b(is)e(shown)h(in)f(Figure)h(6.7.)35
+b(Note)26 b(that)f(references)j(to)d(the)h(stored)g(\256les)f(dept)h
+(and)g(emp)f(are)294 1577 y(translated)c(by)d(the)h(REPLICA)-10
+b(TION)14 b(layer)19 b(into)g(references)i(to)d(their)h(corresponding)j
+(physical)f(stored)300 1746 y(\256les.)300 2113 y FO(6.4)119
+b(Compacting)30 b(Layer)n(ed)g(Optimizers)300 2376 y
+FP(In)c(the)g(previous)j(sections,)f(we)d(described)k(how)d(layers)h
+(can)f(be)g(used)h(to)f(de\256ne)h(small)f(rule)g(sets)h(for)300
+2545 y(optimizers,)h(and)e(how)g(these)g(layers)h(can)g(be)e(composed)j
+(to)e(construct)i(an)d(optimizer)-5 b(.)40 b(However)l(,)26
+b(as)300 2715 y(seen)f(from)f(the)g(example)h(layers)h(in)e(Section)h
+(6.3,)f(even)g(simple)h(layered)h(optimizers)g(can)e(consist)i(of)300
+2884 y(a)k(lar)n(ge)i(number)f(of)g(rules.)52 b(A)29
+b(naive)j(implementation)h(of)e(such)g(a)f(speci\256cation)j(can)e
+(result)h(in)e(an)300 3053 y(inef)n(\256cient)e(optimizer)-5
+b(.)41 b(In)26 b(this)g(section,)i(we)e(discuss)i(how)e(the)g(P2V)f
+(preprocessor)30 b(can)c(be)g(used)h(to)300 3223 y(compact)e(layered)g
+(optimizers)h(to)d(obtain)i(a)e(monolithic)j(rule)e(set.)583
+3392 y(Layers)30 b(have)f(two)f(primary)i(goals:)42 b(to)29
+b(translate)h(abstract)h(operators)g(into)e(concrete)i(ones,)297
+3562 y(and)22 b(to)e(de\256ne)i(a)e(hierarchy)k(of)c(rules)i(\(i.e.,)f
+(to)g(de\256ne)g(rule)h(precedence\).)33 b(Any)21 b(compaction)i(of)e
+(layers)300 3731 y(has)i(to)g(preserve)j(the)d(semantics)i(of)e(these)h
+(two)f(goals.)32 b(The)23 b(P2V)f(preprocessor)27 b(accomplishes)f
+(both)300 3900 y(of)f(these)g(goals.)36 b(Broadly)26
+b(speaking,)h(there)e(are)g(two)f(responsibilities)30
+b(of)24 b(the)h(P2V)f(preprocessor)k(in)299 4070 y(compacting)d
+(layers.)32 b(The)22 b(\256rst)h(is)f(to)h(compact)h(the)f(rules)h
+(themselves,)h(and)e(the)g(second)h(is)f(to)g(ensure)300
+4239 y(that)h(the)g(compaction)j(of)c(rule)i(actions)g(generates)h(a)e
+(semantically)i(equivalent)h(rule)d(set.)32 b(Below)-6
+b(,)23 b(we)300 4408 y(discuss)i(these)g(two)e(steps)i(in)e(greater)i
+(detail.)582 4578 y(The)d(translation)k(of)c(abstract)j(operators)g
+(into)e(concrete)h(ones)g(by)e(a)g(layer)i(implies)f(that)g(there)297
+4747 y(is)d(a)g(one-to-one)k(correspondence)h(between)d(a)e(concrete)j
+(operator)g(of)d(one)h(layer)h(and)f(an)f(abstract)j(op-)300
+4916 y(erator)28 b(of)g(the)f(layer)h(immediately)h(below)f(it.)42
+b(Thus,)28 b(in)f(the)g(centralized)k(optimizer)e(of)e(Figure)h(6.4,)
+300 5086 y(the)d(JOIN)p 637 5086 V 32 w(CONC)d(operator)27
+b(in)d(the)h(SEQUENTIAL)20 b(layer)25 b(corresponds)j(to)d(the)f(JOIN)g
+(operator)i(in)1905 5349 y(90)p eop
+%%Page: 91 103
+91 102 bop 323 403 3237 4 v 323 3038 4 2635 v 355 2766
+a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { } def [ 81.09029 239.00296 81.09029 3.41426 /Lineto /lineto
+load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+grestore end
+
+@endspecial 386 594 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494
+neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(SEQUENTIAL)355 1137 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 383 747 a Fh(JOIN)p Fu(\()p
+Fn(S)553 757 y Fg(1)585 747 y Fn(;)10 b(S)652 757 y Fg(2)685
+747 y Fu(\))17 b(=)-11 b Ft(\))p Fu(!)17 b Fh(JOIN)p
+Fu(\()p Fn(S)1028 757 y Fg(2)1060 747 y Fn(;)11 b(S)1128
+757 y Fg(1)1160 747 y Fu(\))383 834 y Fh(JOIN)p Fu(\()p
+Fh(JOIN)p Fu(\()p Fn(S)685 844 y Fg(1)717 834 y Fn(;)f(S)784
+844 y Fg(2)816 834 y Fu(\))p Fn(;)h(S)908 844 y Fg(3)940
+834 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p Fu(\()p
+Fn(S)1266 844 y Fg(1)1298 834 y Fn(;)11 b Fh(JOIN)p Fu(\()p
+Fn(S)1498 844 y Fg(2)1530 834 y Fn(;)f(S)1597 844 y Fg(3)1629
+834 y Fu(\)\))383 921 y Fh(JOIN)p Fu(\()p Fn(S)553 931
+y Fg(1)585 921 y Fn(;)g(S)652 931 y Fg(2)685 921 y Fu(\))17
+b(=)-11 b Ft(\))18 b Fh(JOIN)p 952 921 15 4 v 18 w(CONC)p
+Fu(\()p Fn(S)1167 931 y Fg(1)1199 921 y Fn(;)11 b(S)1267
+931 y Fg(2)1299 921 y Fu(\))383 1009 y Fh(SOR)m(T)p Fu(\()p
+Fn(S)569 1019 y Fg(1)601 1009 y Fu(\))18 b(=)-11 b Ft(\))18
+b Fh(SOR)m(T)p 885 1009 V 18 w(CONC)p Fu(\()p Fn(S)1100
+1019 y Fg(1)1132 1009 y Fu(\))383 1096 y Fh(RET)q Fu(\()p
+Fn(F)540 1106 y Fg(1)572 1096 y Fu(\))g(=)-11 b Ft(\))17
+b Fh(RET)p 824 1096 V 19 w(CONC)q Fu(\()p Fn(F)1042 1106
+y Fg(1)1074 1096 y Fu(\))386 1281 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+
+@endspecial Fe(MERGE)355 1810 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+
+@endspecial 383 1420 a Fh(JOIN)p Fu(\()p Fn(S)553 1430
+y Fg(1)585 1420 y Fn(;)10 b(S)652 1430 y Fg(2)685 1420
+y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOPR)p Fu(\()p Fh(SOR)m(T)p
+Fu(\()p Fn(S)1167 1430 y Fg(1)1199 1420 y Fu(\))p Fn(;)11
+b Fh(SOR)m(T)p Fu(\()p Fn(S)1439 1430 y Fg(2)1471 1420
+y Fu(\)\))383 1507 y Fh(JOPR)p Fu(\()p Fn(S)561 1517
+y Fg(1)593 1507 y Fn(;)g(S)661 1517 y Fg(2)693 1507 y
+Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 981 1507
+V 18 w(join)p Fu(\()p Fn(S)1136 1517 y Fg(1)1168 1507
+y Fn(;)10 b(S)1235 1517 y Fg(2)1267 1507 y Fu(\))383
+1595 y Fh(JOIN)p Fu(\()p Fn(S)553 1605 y Fg(1)585 1595
+y Fn(;)g(S)652 1605 y Fg(2)685 1595 y Fu(\))17 b(=)-11
+b Ft(\))18 b Fh(JOIN)p 952 1595 V 18 w(CONC)p Fu(\()p
+Fn(S)1167 1605 y Fg(1)1199 1595 y Fn(;)11 b(S)1267 1605
+y Fg(2)1299 1595 y Fu(\))383 1682 y Fh(SOR)m(T)p Fu(\()p
+Fn(S)569 1692 y Fg(1)601 1682 y Fu(\))18 b(=)-11 b Ft(\))18
+b Fh(SOR)m(T)p 885 1682 V 18 w(CONC)p Fu(\()p Fn(S)1100
+1692 y Fg(1)1132 1682 y Fu(\))383 1769 y Fh(RET)q Fu(\()p
+Fn(F)540 1779 y Fg(1)572 1769 y Fu(\))g(=)-11 b Ft(\))17
+b Fh(RET)p 824 1769 V 19 w(CONC)q Fu(\()p Fn(F)1042 1779
+y Fg(1)1074 1769 y Fu(\))386 1954 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+
+@endspecial Fe(SOR)m(T)355 2483 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057
+59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+
+@endspecial 383 2093 a Fh(SOR)m(T)p Fu(\()p Fn(S)569
+2103 y Fg(1)601 2093 y Fu(\))h(=)-11 b Ft(\))18 b Fh(Mer)o(ge)p
+890 2093 V 18 w(sort)o Fu(\()p Fn(S)1041 2103 y Fg(1)1073
+2093 y Fu(\))383 2181 y Fh(SOR)m(T)p Fu(\()p Fn(S)569
+2191 y Fg(1)601 2181 y Fu(\))g(=)-11 b Ft(\))18 b Fh(Null)o
+Fu(\()p Fn(S)908 2191 y Fg(1)940 2181 y Fu(\))383 2268
+y Fh(JOIN)p Fu(\()p Fn(S)553 2278 y Fg(1)585 2268 y Fn(;)10
+b(S)652 2278 y Fg(2)685 2268 y Fu(\))17 b(=)-11 b Ft(\))18
+b Fh(JOIN)p 952 2268 V 18 w(CONC)p Fu(\()p Fn(S)1167
+2278 y Fg(1)1199 2268 y Fn(;)11 b(S)1267 2278 y Fg(2)1299
+2268 y Fu(\))383 2355 y Fh(SOR)m(T)p Fu(\()p Fn(S)569
+2365 y Fg(1)601 2355 y Fu(\))18 b(=)-11 b Ft(\))18 b
+Fh(SOR)m(T)p 885 2355 V 18 w(CONC)p Fu(\()p Fn(S)1100
+2365 y Fg(1)1132 2355 y Fu(\))383 2442 y Fh(RET)q Fu(\()p
+Fn(F)540 2452 y Fg(1)572 2442 y Fu(\))g(=)-11 b Ft(\))17
+b Fh(RET)p 824 2442 V 19 w(CONC)q Fu(\()p Fn(F)1042 2452
+y Fg(1)1074 2442 y Fu(\))386 2636 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8
+neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+
+@endspecial Fe(RET)355 2809 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057
+17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+
+@endspecial 383 2769 a Fh(RET)q Fu(\()p Fn(F)540 2779
+y Fg(1)572 2769 y Fu(\))h(=)-11 b Ft(\))17 b Fh(File)p
+809 2769 V 18 w(scan)p Fu(\()p Fn(F)975 2779 y Fg(1)1007
+2769 y Fu(\))1753 1774 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745
+4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373
+0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray
+fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial
+2096 1458 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492
+neg 72.13919 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial Fe(MONOLITHIC)2064
+1916 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 51.21492 176.69157
+51.21492 176.69157 0.0 0.0 0.0 0.0 51.21492 /Lineto /lineto load def
+false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore
+stroke grestore gsave 1. setgray gsave fill grestore stroke grestore
+gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 2093 1614
+a Fu(\()p Fh(JOIN)g Fu(\(?1)h(?2\)\))g Ft(\000)-11 b(!)p
+Fu(!)17 b(\()p Fh(JOIN)h Fu(\(?2)g(?1\)\))2093 1701 y(\()p
+Fh(JOIN)f Fu(\(\()p Fh(JOIN)h Fu(\(?1)g(?2\)\))g(?3\)\))f
+Ft(\000)-10 b(!)17 b Fu(\()p Fh(JOIN)h Fu(\(?1)g(\()p
+Fh(JOIN)f Fu(\(?2)h(?3\)\)\)\))2093 1788 y(\()p Fh(JOIN)f
+Fu(\(?1)h(?2\)\))g Ft(\000)-11 b(!)18 b Fu(\()p Fh(Mer)o(ge)p
+2740 1788 V 18 w(join)f Fu(\(?1)h(?2\)\))2093 1875 y(\()p
+Fh(RET)g Fu(\(\)\))g Ft(\000)-11 b(!)18 b Fu(\()p Fh(File)p
+2539 1875 V 17 w(scan)h Fu(\(\)\))p 3557 3038 4 2635
+v 323 3041 3237 4 v 3558 3058 19 2642 v 340 3058 3237
+19 v 569 3254 a FP(Figure)24 b(6.8:)31 b(Compacting)25
+b(the)f(layered)h(centralized)i(Prairie)d(rule)g(set)g(in)f(Figure)h
+(6.4)300 3630 y(the)i(MERGE)c(layer)-5 b(.)37 b(Once)26
+b(this)g(correspondence)k(is)25 b(established,)j(the)e(P2V)e
+(preprocessor)29 b(can)d(use)299 3800 y(the)c(same)h(rule)g(compaction)
+i(techniques)g(described)g(in)d(Section)i(4.5)e(\(and)h(depicted)i(in)d
+(Figure)h(4.1)m(1\))300 3969 y(to)j(combine)h(all)f(the)h(layers)g
+(together)h(into)f(a)e(single,)j(monolithic)g(rule)f(speci\256cation.)
+41 b(For)25 b(the)i(cen-)300 4138 y(tralized)g(optimizer)g(shown)e(in)g
+(Figure)h(6.4,)f(this)g(process)i(results)g(in)e(the)g(compaction)i
+(illustrated)h(in)297 4308 y(Figure)22 b(6.8.)29 b(It)21
+b(is)g(interesting)j(to)d(note)g(that)h(the)f(monolithic)i(rule)f(set)f
+(obtained)i(by)e(layer)h(compaction)296 4477 y(is)d(basically)k(the)d
+(same)1034 4444 y Fv(5)1093 4477 y FP(\(except)h(for)f(rule)h(actions)g
+(as)f(shown)g(in)g(Figure)g(6.9\))g(as)g(one)g(that)g(might)h(have)296
+4646 y(been)g(hand-written)i(by)d(a)g(DBI;)f(the)i(layered)h
+(speci\256cation,)h(however)l(,)f(af)n(fords)g(more)f(degrees)h(of)e
+(ex-)p 300 4728 1320 4 v 400 4781 a Fu(5)434 4813 y Fy(Note,)h
+(especially)-5 b(,)21 b(that)f(rules)g(\(e.g.,)g(the)h(JOIN)f(to)g
+(JOIN)p 1959 4813 23 4 v 27 w(CONC)f(transformation)i(in)g(the)f(MERGE)
+g(layer\))g(that)g(sim-)300 4904 y(ply)g(transform)f(abstract)h
+(operators)g(to)f(concrete)i(operators)f(are)f(discarded)i(as)e(a)g
+(direct)h(consequence)i(of)d(the)g(compaction)300 4996
+y(process.)1905 5349 y FP(91)p eop
+%%Page: 92 104
+92 103 bop 318 403 3247 4 v 318 3744 4 3341 v 386 478
+a FF(JOIN)o Fv(\()p FF(JOIN)q Fv(\()p Fs(S)771 487 y
+Fu(1)806 478 y Fs(;)11 b(S)880 487 y Fu(2)915 478 y Fv(\))20
+b(:)f Fo(D)1063 487 y Fm(4)1102 478 y Fs(;)11 b(S)1176
+487 y Fu(3)1211 478 y Fv(\))20 b(:)f Fo(D)1359 487 y
+Fm(5)1417 478 y Fv(=)-12 b FB(\))20 b FF(JOIN)p Fv(\()p
+Fs(S)1765 487 y Fu(1)1800 478 y Fs(;)11 b FF(JOIN)p Fv(\()p
+Fs(S)2045 487 y Fu(2)2080 478 y Fs(;)g(S)2154 487 y Fu(3)2189
+478 y Fv(\))20 b(:)f Fo(D)2337 487 y Fm(6)2376 478 y
+Fv(\))h(:)f Fo(D)2524 487 y Fm(7)3393 478 y FF(\(6.1\))386
+557 y FB(ff)601 635 y FF(1.)j Fo(D)735 644 y Fm(6)774
+635 y Fs(:)p FF(attributes)h Fv(=)c FF(union)f Fv(\()p
+Fo(D)1392 644 y Fm(2)1432 635 y Fs(:)p FF(attributes)r
+Fs(;)12 b Fo(D)1792 644 y Fm(3)1831 635 y Fs(:)p FF(attributes)r
+Fv(\))18 b(;)386 714 y FB(gg)386 793 y FF(2.)j(is)p 505
+793 20 4 v 25 w(associative)f Fv(\()p Fo(D)923 802 y
+Fm(5)962 793 y Fs(:)p FF(join)p 1088 793 V 25 w(predicate)s
+Fs(;)12 b Fo(D)1446 802 y Fm(2)1485 793 y Fs(:)p FF(attributes)s
+Fv(\))386 872 y FB(ff)601 951 y FF(3.)22 b Fo(D)735 960
+y Fm(7)794 951 y Fv(=)d Fo(D)930 960 y Fm(5)986 951 y
+Fv(;)601 1030 y FF(4.)j Fo(D)735 1039 y Fm(7)774 1030
+y Fs(:)p FF(join)p 900 1030 V 25 w(predicate)h Fv(=)d
+Fo(D)1321 1039 y Fm(4)1360 1030 y Fs(:)p FF(join)p 1486
+1030 V 25 w(predicate)g Fv(;)601 1109 y FF(5.)i Fo(D)735
+1118 y Fm(6)774 1109 y Fs(:)p FF(join)p 900 1109 V 25
+w(predicate)h Fv(=)d Fo(D)1321 1118 y Fm(5)1360 1109
+y Fs(:)p FF(join)p 1486 1109 V 25 w(predicate)g Fv(;)601
+1188 y FF(6.)i Fo(D)735 1197 y Fm(6)774 1188 y Fs(:)p
+FF(record)p 966 1188 V 25 w(width)f Fv(=)f Fo(D)1295
+1197 y Fm(2)1334 1188 y Fs(:)p FF(record)p 1526 1188
+V 25 w(width)d Fv(+)f Fo(D)1847 1197 y Fm(3)1885 1188
+y Fs(:)p FF(record)p 2077 1188 V 26 w(width)i Fv(;)601
+1266 y FF(7.)k Fo(D)735 1275 y Fm(6)774 1266 y Fs(:)p
+FF(cardinality)i Fv(=)19 b FF(compute)p 1403 1266 V 26
+w(cardinality)h Fv(\()p Fo(D)1814 1275 y Fm(2)1854 1266
+y Fs(;)11 b Fo(D)1947 1275 y Fm(3)1986 1266 y Fv(\))17
+b(;)386 1345 y FB(gg)1533 1496 y Fy(\(a\))i(Join)g(associativity)g(T)-7
+b(-rule)p 369 1598 3146 4 v 386 1648 a Fv(\()p FF(JOIN)19
+b(?op)p 675 1648 20 4 v 25 w(ar)o(g5)i Fv(\(\()p FF(JOIN)f(?op)p
+1150 1648 V 25 w(ar)o(g4)g Fv(\(?1)h(?2\)\))g(?3\)\))g
+FB(!)e Fv(\()p FF(JOIN)h(?op)p 2089 1648 V 25 w(ar)o(g7)g
+Fv(\(?1)h(\()p FF(JOIN)f(?op)p 2652 1648 V 25 w(ar)o(g6)g
+Fv(\(?2)h(?3\)\)\)\))292 b FF(\(6.2\))386 1752 y(\045cond)p
+573 1752 V 25 w(code)386 1831 y FB(ff)601 1909 y FF(1.)22
+b(NO)p 773 1909 V 24 w(OP)17 b(;)601 1988 y(2.)22 b(if)c
+Fv(\(!\()p FF(is)p 853 1988 V 24 w(associative)i Fv(\()p
+FF(?op)p 1307 1988 V 26 w(ar)o(g5)g FB(!)f FF(op)p 1625
+1988 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1855 1988 V 25
+w(predicate)s Fs(;)12 b Fv(?2)20 b FB(!)f FF(expr)q Fs(:)p
+FF(ar)o(gument)q Fs(:)p FF(log)p 2824 1988 V 25 w(prop)h
+FB(!)f FF(attributes)t Fv(\)\))768 2093 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.8
+neg 126.85966 9.8 .5 Frame gsave 3.0 -45 PtoC Shadow 0.5 setgray gsave
+fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial(&&\()p FF(?op)p 1004 2093 V
+25 w(ar)o(g5)h FB(!)f FF(op)p 1321 2093 V 25 w(ar)o(g)p
+Fs(:)p FF(layer)i Fs(<)p Fv(=)f(1\))66 b(\))736 2214
+y FF(REJECT)16 b Fv(;)386 2293 y FB(gg)386 2372 y FF(\045appl)p
+558 2372 V 25 w(code)386 2451 y FB(ff)601 2530 y FF(3.)22
+b(?op)p 772 2530 V 25 w(ar)o(g7)f FB(!)e FF(op)p 1090
+2530 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1320 2530 V 25
+w(predicate)k Fv(=)c FF(?op)p 1777 2530 V 25 w(ar)o(g5)h
+FB(!)g FF(op)p 2095 2530 V 24 w(ar)o(g)p Fs(:)p FF(join)p
+2324 2530 V 25 w(predicate)g Fv(;)601 2609 y FF(3.)i(?op)p
+772 2609 V 25 w(ar)o(g7)f FB(!)e FF(log)p 1108 2609 V
+25 w(prop)h Fv(=)f FF(?op)p 1443 2609 V 25 w(ar)o(g5)i
+FB(!)e FF(log)p 1779 2609 V 25 w(prop)e Fv(;)601 2710
+y FF(3.)54 b @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.52792
+neg 181.5572 9.30391 .5 Frame gsave 3.0 -45 PtoC Shadow 0.5 setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+@endspecial(?op)p
+804 2710 V 25 w(ar)o(g7)20 b FB(!)f FF(op)p 1121 2710
+V 25 w(ar)o(g)p Fs(:)p FF(layer)i Fv(=)f FF(?op)p 1571
+2710 V 25 w(ar)o(g5)g FB(!)f FF(op)p 1888 2710 V 24 w(ar)o(g)q
+Fs(:)p FF(layer)f Fv(;)601 2828 y FF(4.)k(?op)p 772 2828
+V 25 w(ar)o(g7)f FB(!)e FF(op)p 1090 2828 V 24 w(ar)o(g)q
+Fs(:)p FF(join)p 1320 2828 V 25 w(predicate)k Fv(=)c
+FF(?op)p 1777 2828 V 25 w(ar)o(g4)h FB(!)g FF(op)p 2095
+2828 V 24 w(ar)o(g)p Fs(:)p FF(join)p 2324 2828 V 25
+w(predicate)g Fv(;)601 2907 y FF(5.)i(?op)p 772 2907
+V 25 w(ar)o(g6)f FB(!)e FF(op)p 1090 2907 V 24 w(ar)o(g)q
+Fs(:)p FF(join)p 1320 2907 V 25 w(predicate)k Fv(=)c
+FF(?op)p 1777 2907 V 25 w(ar)o(g5)h FB(!)g FF(op)p 2095
+2907 V 24 w(ar)o(g)p Fs(:)p FF(join)p 2324 2907 V 25
+w(predicate)g Fv(;)601 2986 y FF(6.)i(NO)p 773 2986 V
+24 w(OP)17 b(;)601 3065 y(7.)22 b(NO)p 773 3065 V 24
+w(OP)17 b(;)601 3165 y(8.)54 b @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.52792
+neg 104.77599 9.23198 .5 Frame gsave 3.0 -45 PtoC Shadow 0.5 setgray
+gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore
+stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
+end
+
+
+@endspecial(?op)p 804 3165 V 25 w(ar)o(g6)20 b FB(!)f
+FF(op)p 1121 3165 V 25 w(ar)o(g)p Fs(:)p FF(layer)i Fv(=)f(1)d(;)386
+3287 y FB(gg)423 3437 y Fy(\(b\))j(P2V)-7 b(-generated)21
+b(trans)p 1140 3437 23 4 v 27 w(rule)f(corresponding)j(to)d(the)g(T)-7
+b(-rule)19 b(in)h(\(a\).)28 b(Statement)20 b(numbers)h(correspond)h(to)
+e(the)423 3528 y(same)f(numbered)h(statements)e(in)h(\(a\).)24
+b(Boxed)19 b(clauses)g(and)g(statements)g(are)f(speci\256c)h(to)f
+(layered)h(optimizers)g(\(cf.)423 3620 y(Figure)g(4.6\(b\)\).)p
+3562 3744 4 3341 v 318 3747 3247 4 v 3564 3764 19 3348
+v 335 3764 3247 19 v 300 3960 a FP(Figure)29 b(6.9:)40
+b(T)m(ranslating)30 b(the)f(join)f(associativity)k(T)-8
+b(-rule)28 b(in)g(the)h(SEQUENTIAL)24 b(layer)29 b(\(from)f(the)300
+4073 y(centralized)f(optimizer)e(in)e(Figure)h(6.8\))300
+4449 y(tensibility)i(and)e(reusability)-6 b(.)583 4619
+y(Another)25 b(aspect)f(of)g(a)e(layered)k(optimizer)f(speci\256cation)
+h(that)d(must)h(be)f(preserved)j(by)d(com-)300 4788 y(paction)j(is)d
+(that)i(of)e(the)i(hierarchical)i(nature)e(of)f(rules.)32
+b(That)24 b(is,)f(the)h(semantics)i(of)e(layered)h(rule)g(sets)300
+4957 y(\(rules)i(in)f(a)f(layer)i(applied)h(before)f(rules)g(in)f(a)f
+(lower)i(layer\))g(must)f(be)g(maintained)i(when)e(the)g(layers)1905
+5349 y(92)p eop
+%%Page: 93 105
+93 104 bop 300 391 a FP(are)26 b(compacted.)40 b(This)26
+b(is)g(accomplished)j(by)d(the)g(P2V)f(preprocessor)k(as)d(follows.)39
+b(The)25 b(preproces-)300 561 y(sor)i(automatically)i(introduces)h(a)c
+(new)g(property)-6 b(,)29 b(called)f(layer)l(,)g(that)f(records)i(the)d
+(layer)i(number)f(in)294 730 y(which)18 b(each)h(expression)i(was)c
+(generated.)1654 697 y Fv(6)1725 730 y FP(Initially)-6
+b(,)21 b(all)d FD(new)f FP(expressions)22 b(have)c(a)g(layer)g
+(property)j(of)295 899 y(1)d(\(meaning)i(that)f(all)g(rules)h(in)e
+(layers)i(1)e(and)h(higher)i(can)e(be)f(applied)j(to)d(them\).)30
+b(As)17 b(expressions)22 b(prop-)300 1069 y(agate)27
+b(through)i(the)e(layers,)h(their)f(layer)g(property)i(values)f(are)e
+(assigned)j(by)e(the)f(P2V)g(preprocessor)297 1238 y(in)c(rule)f
+(actions.)32 b(In)21 b(other)i(words,)e(the)h(P2V)e(preprocessor)25
+b(augments)e(rule)f(actions)h(with)e(statements)299 1408
+y(that)i(set)f(the)h(layer)h(property)g(value)g(for)e(each)i(new)e
+(expression.)33 b(The)22 b(test)h(of)g(a)f(rule)h(is)f(also)h
+(modi\256ed)300 1577 y(to)h(ensure)i(that)f(an)g(expression)i
+(generated)h(in)c(a)g(lower)h(layer)g(is)f(not)h(transformed)i(in)e(a)f
+(layer)h(above.)300 1746 y(This)e(is)h(best)g(illustrated)i(by)e(an)f
+(example.)583 1916 y(Consider)37 b(the)e(join)g(associativity)k(T)-8
+b(-rule)34 b(in)h(the)g(SEQUENTIAL)c(layer)k(shown)h(in)e(Fig-)300
+2085 y(ure)25 b(6.9\(a\).)34 b(When)25 b(a)f(layered)j(optimizer)f
+(consisting)h(of)e(the)g(SEQUENTIAL)20 b(layer)25 b(\(e.g.,)g(the)g
+(cen-)300 2254 y(tralized)i(optimizer)g(in)f(Figure)g(6.4\))f(is)h
+(compacted,)h(the)f(actions)h(of)f(the)g(join)g(associativity)j(rule)d
+(are)300 2424 y(modi\256ed)f(to)f(assign)h(the)g(layer)g(property)h
+(values)g(of)e(any)g(new)g(expressions.)36 b(This)24
+b(is)g(shown)g(in)g(Fig-)299 2593 y(ure)f(6.9\(b\).)32
+b(The)22 b(boxed)i(statements)h(and)e(clause)h(\(in)f(the)g(test\))h
+(are)f(introduced)j(by)d(the)g(P2V)e(prepro-)300 2762
+y(cessor)27 b(in)e(addition)i(to)e(the)h(other)g(transformations)j
+(described)f(in)d(Chapter)i(4.)35 b(Notice)26 b(that)g(the)g(root)300
+2932 y(of)d(a)g(new)g(expression)j(obtained)g(by)d(a)g(rule)h(has)g
+(the)f(same)g(layer)i(number)f(as)f(the)h(root)g(of)f(the)g(old)h(ex-)
+300 3101 y(pression;)29 b(this)d(is)g(because)h(they)g(belong)g(to)f
+(the)f(same)h(equivalence)j(class.)38 b(New)25 b(sub-expressions,)300
+3271 y(however)l(,)j(have)e(their)h(layer)g(values)g(set)f(to)g(1;)h
+(thus,)g(all)f(rules,)h(beginning)h(from)e(the)g(\256rst)g(layer)l(,)h
+(are)300 3440 y(applicable)f(to)e(them.)583 3609 y(The)i(translation)j
+(of)c(I-rules)j(works)e(similarly)-6 b(,)27 b(i.e.,)f(the)g(test)g(of)g
+(an)g(I-rule)h(is)e(augmented)j(to)300 3779 y(check)d(if)e(the)h
+(operator)h(being)g(rewritten)g(was)e(generated)j(by)e(a)f(higher)i(or)
+e(lower)h(layer)-5 b(.)300 4145 y FO(6.5)119 b(Benchmarking)31
+b(Layer)n(ed)f(Optimizers)300 4408 y FP(In)d(the)h(previous)i(section,)
+f(we)e(described)j(how)d(layered)i(optimizer)g(speci\256cations)i(are)c
+(compacted)298 4578 y(by)c(the)f(P2V)f(preprocessor)26
+b(to)c(generate)i(monolithic)h(rule)d(sets.)31 b(The)22
+b(question)i(that)f(naturally)i(arises)300 4747 y(is)k(whether)h(this)g
+(method)f(of)g(optimizer)i(construction)i(\(layered)e(speci\256cation)h
+(followed)e(by)f(com-)298 4916 y(paction\))24 b(results)f(in)e(a)h
+(loss)g(of)f(ef)n(\256ciency)j(of)e(the)g(generated)i(optimizer)-5
+b(.)32 b(In)21 b(this)h(section,)i(we)d(present)p 300
+4998 1320 4 v 400 5051 a Fu(6)434 5083 y Fy(Layers)e(are)g(numbered)i
+(in)e(ascending)h(order)m(,)f(beginning)i(from)e(1)g(for)g(the)g
+(topmost)g(layer)l(.)1905 5349 y FP(93)p eop
+%%Page: 94 106
+94 105 bop 300 391 a FP(preliminary)28 b(experimental)f(results)g(that)
+f(demonstrate)i(that)d(the)h(ef)n(\256ciency)h(of)e(an)g(optimizer)i
+(is)e(not)300 561 y(sacri\256ced)g(by)f(using)g(a)g(layered)h
+(speci\256cation.)583 730 y(Consider)j(the)f(layered)h(centralized)h
+(optimizer)f(shown)f(in)g(Figure)g(6.4.)39 b(As)25 b(shown)i(in)f(Fig-)
+300 899 y(ure)j(6.8,)g(this)g(can)g(be)g(compacted)h(to)e(a)h
+(monolithic)h(rule)f(set.)46 b(However)l(,)30 b(rules)g(in)e(the)h
+(monolithic)300 1069 y(set)g(do)g(not)g(have)h(exactly)g(the)f(same)g
+(rule)g(actions)i(as)e(a)f(non-layered)k(Prairie)d(speci\256cation)j
+(\(since)300 1238 y(the)d(P2V)e(preprocessor)33 b(adds)c(statements)i
+(to)d(track)i(layer)f(numbers\),)j(or)c(a)g(hand-written)k(V)-12
+b(olcano)300 1408 y(speci\256cation)26 b(\(since)f(the)f(abstractions)j
+(in)c(Prairie)h(and)g(V)-12 b(olcano)25 b(are)f(dif)n(ferent\).)34
+b(T)-6 b(o)22 b(verify)j(that)f(the)293 1577 y(ef)n(\256ciency)19
+b(of)d(optimizers)j(generated)h(from)d(layered)h(speci\256cations)i(is)
+d(not)g(sacri\256ced,)j(we)c(conducted)300 1746 y(some)24
+b(experiments)i(involving)g(optimizer)f(speci\256cations)i(for)c
+(centralized,)k(distributed,)f(and)e(repli-)300 1916
+y(cated)32 b(DBMSs.)50 b(Each)31 b(optimizer)h(was)e(speci\256ed)i(in)f
+(three)g(ways:)46 b(layered)32 b(Prairie,)h(non-layered)299
+2085 y(Prairie,)23 b(and)g(hand-coded)j(V)-12 b(olcano.)32
+b(Each)22 b(resulting)j(optimizer)f(was)e(benchmarked)k(using)e(a)e
+(set)g(of)300 2254 y(randomly)j(generated)h(queries.)33
+b(The)23 b(results)i(are)f(reported)h(below)-6 b(.)583
+2424 y(The)28 b(benchmarking)j(of)d(the)h(layered)h(optimizers)g
+(consisted)g(of)e(optimizing)i(left-deep)h FH(N)10 b
+FP(-)292 2593 y(way)17 b(join)g(operator)i(trees,)g(for)d(varying)j
+(values)f(of)f FH(N)10 b FP(,)17 b(as)f(shown)h(in)g(Figure)g
+(6.10\(a\).)30 b(Random)17 b(queries)296 2762 y(were)i(generated)j
+(using)e(a)f(uniform)i(random)f(number)h(generator)l(,)i(as)c(in)g
+(Section)i(5.2.)29 b(The)19 b(set)h(of)f(rela-)297 2932
+y(tions,)j(along)f(with)g(their)g(attributes,)i(cardinalities,)i(and)c
+(record)g(widths)h(was)e(\256xed.)29 b(The)21 b(order)g(of)f(re-)294
+3101 y(lations)g(in)e(the)h(left-deep)i(tree)d(was)g(varied.)31
+b(Each)18 b(join)h(had)g(an)f(equijoin)i(predicate,)i(with)c(the)g(two)
+g(join)297 3271 y(attributes)24 b(chosen)f(at)d(random)i(from)f(the)h
+(set)f(of)g(eligible)i(attributes)g(of)e(the)h(outer)g(and)f(inner)h
+(streams.)297 3440 y(For)e(the)h(distributed)i(DBMS)c(optimizers,)k(we)
+d(simulated)i(a)e(database)j(with)d(four)h(sites;)i(each)f(relation)300
+3609 y(was)29 b(randomly)j(assigned)g(to)d(a)h(site.)50
+b(For)29 b(the)h(replicated)i(DBMS)c(case,)k(there)e(were)g(two)f
+(replicas)300 3779 y(for)23 b(each)h(stored)h(\256le)d(referenced)k(in)
+d(an)h(operator)h(tree;)f(to)f(make)h(the)f(replication)j(meaningful,)g
+(each)300 3948 y(replica)f(of)f(a)f(given)h(stored)h(\256le)e(was)g
+(assumed)i(to)f(be)f(sorted)i(on)f(dif)n(ferent)i(attributes.)583
+4117 y(For)i(each)h(value)g FH(N)38 b FP(of)28 b(the)h(number)g(of)f
+(joins,)i(we)d(generated)k(10)e(dif)n(ferent)h(queries)3375
+4084 y Fv(7)3417 4117 y FP(,)f(and)300 4287 y(optimized)i(each)f(query)
+g(using)h(optimizers)g(generated)h(from)d(three)h(dif)n(ferent)i
+(speci\256cations:)46 b(lay-)300 4456 y(ered)29 b(Prairie,)g
+(non-layered)j(Prairie,)e(and)e(hand-coded)k(V)-12 b(olcano.)46
+b(The)28 b(run)g(times)h(were)f(measured)297 4625 y(using)21
+b(the)g(GNU)e Fi(time)e FP(command,)22 b(and)f(averaged)i(over)e(the)f
+(10)h(queries)h(to)f(generate)h(the)f(per)n(-query)300
+4795 y(optimization)26 b(time.)31 b(Each)23 b(point)h(in)g(the)f
+(graph,)i(thus,)e(represents)k(the)c(average)i(CPU)d(time)h(for)g
+(opti-)p 300 4876 1320 4 v 400 4930 a Fu(7)434 4961 y
+Fy(W)-6 b(e)18 b(chose)h(10)f(instead)h(of)f(a)g(lar)o(ger)f(number)i
+(since)f(the)g(average)h(run)g(time)e(was)h(not)g(substantially)h(dif)o
+(ferent)f(for)f(more)300 5053 y(queries.)1905 5349 y
+FP(94)p eop
+%%Page: 95 107
+95 106 bop 306 403 3272 4 v 306 3745 4 3342 v 838 1438
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 838 1438 a Fs(R)891 1447 y Fu(1)819 1301 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 819 1301
+a FF(RET)882 1420 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 882 1420 a 1122 1438 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1122 1438
+a Fs(R)1175 1447 y Fu(2)1103 1301 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 1103 1301 a FF(RET)882
+1420 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 882 1420 a 952 1159 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 952 1159 a FF(JOIN)882 1420
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 882 1420 a 882 1420 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 882 1420 a 1165 995 a
+ tx@Dict begin 45. Rot end
+ 1165 995
+a 1118 999 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889
+0.0 false .5 11.3335 InitRnode } NewNode end end
+ 1118 999 a Fs(:)12 b(:)f(:)1165 995 y
+ tx@Dict begin 45. neg Rot end
+ 1165
+995 a 882 1420 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 882 1420 a 1386 1017 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344
+0.0 false .5 15.11191 InitRnode } NewNode end end
+ 1386 1017 a FF(RET)1401
+1155 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0
+false .5 11.51984 InitRnode } NewNode end end
+ 1401 1155 a Fs(R)1454 1163 y Fn(n)882 1420 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 882
+1420 a 1235 876 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198
+0.08394 false .5 17.32784 InitRnode } NewNode end end
+ 1235 876 a FF(JOIN)882 1420 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 882 1420
+a 882 1420 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 882 1420 a 668 1897 a Fy(\(a\))19 b Fq(N)8
+b Fy(-way)19 b(join)g(benchmark)i(query)p 1951 2087 4
+1660 v 2003 1763 a @beginspecial 18.067490 @llx 18.067490
+@lly 554.070007 @urx 461.724976 @ury 1771 @rwi @setspecial
+%%BeginDocument: runtime_layered_cent_vs_volcano.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 372 l
+621 362 m
+621 372 l
+822 362 m
+822 372 l
+1023 362 m
+1023 372 l
+1225 362 m
+1225 372 l
+1426 362 m
+1426 372 l
+1627 362 m
+1627 372 l
+1828 362 m
+1828 372 l
+2030 362 m
+2030 372 l
+420 1704 m
+420 1694 l
+621 1704 m
+621 1694 l
+822 1704 m
+822 1694 l
+1023 1704 m
+1023 1694 l
+1225 1704 m
+1225 1694 l
+1426 1704 m
+1426 1694 l
+1627 1704 m
+1627 1694 l
+1828 1704 m
+1828 1694 l
+2030 1704 m
+2030 1694 l
+stroke
+420 362 m
+420 382 l
+621 362 m
+621 382 l
+822 362 m
+822 382 l
+1023 362 m
+1023 382 l
+1225 362 m
+1225 382 l
+1426 362 m
+1426 382 l
+1627 362 m
+1627 382 l
+1828 362 m
+1828 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+621 1704 m
+621 1684 l
+822 1704 m
+822 1684 l
+1023 1704 m
+1023 1684 l
+1225 1704 m
+1225 1684 l
+1426 1704 m
+1426 1684 l
+1627 1704 m
+1627 1684 l
+1828 1704 m
+1828 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 287 m
+gsave
+621 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 287 m
+gsave
+822 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 287 m
+gsave
+1023 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 287 m
+gsave
+1225 287 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 287 m
+gsave
+1426 287 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 287 m
+gsave
+1627 287 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 287 m
+gsave
+1828 287 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 586 m
+430 586 l
+420 809 m
+430 809 l
+420 1033 m
+430 1033 l
+420 1257 m
+430 1257 l
+420 1480 m
+430 1480 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 586 m
+2020 586 l
+2030 809 m
+2020 809 l
+2030 1033 m
+2020 1033 l
+2030 1257 m
+2020 1257 l
+2030 1480 m
+2020 1480 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 809 m
+440 809 l
+420 1257 m
+440 1257 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 809 m
+2010 809 l
+2030 1257 m
+2010 1257 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 809 m
+gsave
+366 809 translate
+0 rotate
+0 -30 m
+(200) RJ
+(200) show
+grestore
+newpath
+366 1257 m
+gsave
+366 1257 translate
+0 rotate
+0 -30 m
+(400) RJ
+(400) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(600) RJ
+(600) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+164 1033 m
+gsave
+164 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time) CS
+(Average CPU Time) show
+grestore
+newpath
+420 375 m
+621 379 l
+822 391 l
+1023 410 l
+1225 445 l
+1426 514 l
+1627 658 l
+1828 923 l
+2030 1502 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 375 30 0 360 arc
+gsave fill grestore
+stroke
+621 379 30 0 360 arc
+gsave fill grestore
+stroke
+822 391 30 0 360 arc
+gsave fill grestore
+stroke
+1023 410 30 0 360 arc
+gsave fill grestore
+stroke
+1225 445 30 0 360 arc
+gsave fill grestore
+stroke
+1426 514 30 0 360 arc
+gsave fill grestore
+stroke
+1627 658 30 0 360 arc
+gsave fill grestore
+stroke
+1828 923 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1502 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 374 m
+621 378 l
+822 389 l
+1023 408 l
+1225 442 l
+1426 513 l
+1627 653 l
+1828 918 l
+2030 1500 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+395 349 m
+395 399 l
+445 399 l
+445 349 l
+closepath
+gsave eofill grestore
+stroke
+596 353 m
+596 403 l
+646 403 l
+646 353 l
+closepath
+gsave eofill grestore
+stroke
+797 364 m
+797 414 l
+847 414 l
+847 364 l
+closepath
+gsave eofill grestore
+stroke
+998 383 m
+998 433 l
+1048 433 l
+1048 383 l
+closepath
+gsave eofill grestore
+stroke
+1200 417 m
+1200 467 l
+1250 467 l
+1250 417 l
+closepath
+gsave eofill grestore
+stroke
+1401 488 m
+1401 538 l
+1451 538 l
+1451 488 l
+closepath
+gsave eofill grestore
+stroke
+1602 628 m
+1602 678 l
+1652 678 l
+1652 628 l
+closepath
+gsave eofill grestore
+stroke
+1803 893 m
+1803 943 l
+1853 943 l
+1853 893 l
+closepath
+gsave eofill grestore
+stroke
+2005 1475 m
+2005 1525 l
+2055 1525 l
+2055 1475 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 374 m
+621 377 l
+822 387 l
+1023 405 l
+1225 438 l
+1426 505 l
+1627 642 l
+1828 900 l
+2030 1474 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 404 m
+390 374 l
+420 344 l
+450 374 l
+closepath
+gsave eofill grestore
+stroke
+621 407 m
+591 377 l
+621 347 l
+651 377 l
+closepath
+gsave eofill grestore
+stroke
+822 417 m
+792 387 l
+822 357 l
+852 387 l
+closepath
+gsave eofill grestore
+stroke
+1023 435 m
+993 405 l
+1023 375 l
+1053 405 l
+closepath
+gsave eofill grestore
+stroke
+1225 468 m
+1195 438 l
+1225 408 l
+1255 438 l
+closepath
+gsave eofill grestore
+stroke
+1426 535 m
+1396 505 l
+1426 475 l
+1456 505 l
+closepath
+gsave eofill grestore
+stroke
+1627 672 m
+1597 642 l
+1627 612 l
+1657 642 l
+closepath
+gsave eofill grestore
+stroke
+1828 930 m
+1798 900 l
+1828 870 l
+1858 900 l
+closepath
+gsave eofill grestore
+stroke
+2030 1504 m
+2000 1474 l
+2030 1444 l
+2060 1474 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+716 1328 m
+716 1664 l
+1875 1664 l
+1875 1328 l
+716 1328 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+765 1608 m
+961 1608 l
+stroke
+765 1608 30 0 360 arc
+gsave fill grestore
+stroke
+961 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1010 1608 m
+gsave
+1010 1608 translate
+0 rotate
+0 -30 m
+(Prairie \(Layered\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+765 1496 m
+961 1496 l
+stroke
+740 1471 m
+740 1521 l
+790 1521 l
+790 1471 l
+closepath
+gsave eofill grestore
+stroke
+936 1471 m
+936 1521 l
+986 1521 l
+986 1471 l
+closepath
+gsave eofill grestore
+stroke
+1010 1496 m
+gsave
+1010 1496 translate
+0 rotate
+0 -30 m
+(Prairie \(Non-layered\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+765 1384 m
+961 1384 l
+stroke
+765 1414 m
+735 1384 l
+765 1354 l
+795 1384 l
+closepath
+gsave eofill grestore
+stroke
+961 1414 m
+931 1384 l
+961 1354 l
+991 1384 l
+closepath
+gsave eofill grestore
+stroke
+1010 1384 m
+gsave
+1010 1384 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 2058 1897 a(\(b\))30 b(Query)f(optimization)h(time)f(for)g
+(the)g(central-)2058 1988 y(ized)20 b(DBMS)e(optimizer)h(\(Figure)g
+(6.4\))p 379 2090 3148 4 v 427 3395 a @beginspecial 18.067490
+@llx 18.067490 @lly 554.070007 @urx 461.724976 @ury 1771
+@rwi @setspecial
+%%BeginDocument: runtime_layered_dist_vs_volcano.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+0.000000 0.000000 0.000000 setrgbcolor
+1 setlinewidth
+/Times-Italic findfont
+60 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 372 l
+621 362 m
+621 372 l
+822 362 m
+822 372 l
+1023 362 m
+1023 372 l
+1225 362 m
+1225 372 l
+1426 362 m
+1426 372 l
+1627 362 m
+1627 372 l
+1828 362 m
+1828 372 l
+2030 362 m
+2030 372 l
+420 1704 m
+420 1694 l
+621 1704 m
+621 1694 l
+822 1704 m
+822 1694 l
+1023 1704 m
+1023 1694 l
+1225 1704 m
+1225 1694 l
+1426 1704 m
+1426 1694 l
+1627 1704 m
+1627 1694 l
+1828 1704 m
+1828 1694 l
+2030 1704 m
+2030 1694 l
+stroke
+420 362 m
+420 382 l
+621 362 m
+621 382 l
+822 362 m
+822 382 l
+1023 362 m
+1023 382 l
+1225 362 m
+1225 382 l
+1426 362 m
+1426 382 l
+1627 362 m
+1627 382 l
+1828 362 m
+1828 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+621 1704 m
+621 1684 l
+822 1704 m
+822 1684 l
+1023 1704 m
+1023 1684 l
+1225 1704 m
+1225 1684 l
+1426 1704 m
+1426 1684 l
+1627 1704 m
+1627 1684 l
+1828 1704 m
+1828 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 287 m
+gsave
+621 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 287 m
+gsave
+822 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 287 m
+gsave
+1023 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 287 m
+gsave
+1225 287 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 287 m
+gsave
+1426 287 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 287 m
+gsave
+1627 287 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 287 m
+gsave
+1828 287 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 586 m
+430 586 l
+420 809 m
+430 809 l
+420 1033 m
+430 1033 l
+420 1257 m
+430 1257 l
+420 1480 m
+430 1480 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 586 m
+2020 586 l
+2030 809 m
+2020 809 l
+2030 1033 m
+2020 1033 l
+2030 1257 m
+2020 1257 l
+2030 1480 m
+2020 1480 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 809 m
+440 809 l
+420 1257 m
+440 1257 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 809 m
+2010 809 l
+2030 1257 m
+2010 1257 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 809 m
+gsave
+366 809 translate
+0 rotate
+0 -30 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+366 1257 m
+gsave
+366 1257 translate
+0 rotate
+0 -30 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+104 1033 m
+gsave
+104 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time) CS
+(Average CPU Time) show
+grestore
+newpath
+420 376 m
+621 375 l
+822 379 l
+1023 385 l
+1225 402 l
+1426 442 l
+1627 515 l
+1828 715 l
+2030 1431 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 376 30 0 360 arc
+gsave fill grestore
+stroke
+621 375 30 0 360 arc
+gsave fill grestore
+stroke
+822 379 30 0 360 arc
+gsave fill grestore
+stroke
+1023 385 30 0 360 arc
+gsave fill grestore
+stroke
+1225 402 30 0 360 arc
+gsave fill grestore
+stroke
+1426 442 30 0 360 arc
+gsave fill grestore
+stroke
+1627 515 30 0 360 arc
+gsave fill grestore
+stroke
+1828 715 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1431 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 373 m
+621 374 l
+822 379 l
+1023 381 l
+1225 401 l
+1426 431 l
+1627 502 l
+1828 695 l
+2030 1495 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+395 348 m
+395 398 l
+445 398 l
+445 348 l
+closepath
+gsave eofill grestore
+stroke
+596 349 m
+596 399 l
+646 399 l
+646 349 l
+closepath
+gsave eofill grestore
+stroke
+797 354 m
+797 404 l
+847 404 l
+847 354 l
+closepath
+gsave eofill grestore
+stroke
+998 356 m
+998 406 l
+1048 406 l
+1048 356 l
+closepath
+gsave eofill grestore
+stroke
+1200 376 m
+1200 426 l
+1250 426 l
+1250 376 l
+closepath
+gsave eofill grestore
+stroke
+1401 406 m
+1401 456 l
+1451 456 l
+1451 406 l
+closepath
+gsave eofill grestore
+stroke
+1602 477 m
+1602 527 l
+1652 527 l
+1652 477 l
+closepath
+gsave eofill grestore
+stroke
+1803 670 m
+1803 720 l
+1853 720 l
+1853 670 l
+closepath
+gsave eofill grestore
+stroke
+2005 1470 m
+2005 1520 l
+2055 1520 l
+2055 1470 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 373 m
+621 374 l
+822 379 l
+1023 381 l
+1225 400 l
+1426 431 l
+1627 502 l
+1828 695 l
+2030 1495 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 403 m
+390 373 l
+420 343 l
+450 373 l
+closepath
+gsave eofill grestore
+stroke
+621 404 m
+591 374 l
+621 344 l
+651 374 l
+closepath
+gsave eofill grestore
+stroke
+822 409 m
+792 379 l
+822 349 l
+852 379 l
+closepath
+gsave eofill grestore
+stroke
+1023 411 m
+993 381 l
+1023 351 l
+1053 381 l
+closepath
+gsave eofill grestore
+stroke
+1225 430 m
+1195 400 l
+1225 370 l
+1255 400 l
+closepath
+gsave eofill grestore
+stroke
+1426 461 m
+1396 431 l
+1426 401 l
+1456 431 l
+closepath
+gsave eofill grestore
+stroke
+1627 532 m
+1597 502 l
+1627 472 l
+1657 502 l
+closepath
+gsave eofill grestore
+stroke
+1828 725 m
+1798 695 l
+1828 665 l
+1858 695 l
+closepath
+gsave eofill grestore
+stroke
+2030 1525 m
+2000 1495 l
+2030 1465 l
+2060 1495 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+716 1328 m
+716 1664 l
+1875 1664 l
+1875 1328 l
+716 1328 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+765 1608 m
+961 1608 l
+stroke
+765 1608 30 0 360 arc
+gsave fill grestore
+stroke
+961 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1010 1608 m
+gsave
+1010 1608 translate
+0 rotate
+0 -30 m
+(Prairie \(Layered\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+765 1496 m
+961 1496 l
+stroke
+740 1471 m
+740 1521 l
+790 1521 l
+790 1471 l
+closepath
+gsave eofill grestore
+stroke
+936 1471 m
+936 1521 l
+986 1521 l
+986 1471 l
+closepath
+gsave eofill grestore
+stroke
+1010 1496 m
+gsave
+1010 1496 translate
+0 rotate
+0 -30 m
+(Prairie \(Non-layered\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+765 1384 m
+961 1384 l
+stroke
+765 1414 m
+735 1384 l
+765 1354 l
+795 1384 l
+closepath
+gsave eofill grestore
+stroke
+961 1414 m
+931 1384 l
+961 1354 l
+991 1384 l
+closepath
+gsave eofill grestore
+stroke
+1010 1384 m
+gsave
+1010 1384 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 483 3529 a(\(c\))c(Query)g(optimization)g(time)f(for)g
+(the)h(distributed)483 3621 y(DBMS)k(optimizer)g(\(Figure)f(6.6\))p
+1951 3720 4 1630 v 2003 3395 a @beginspecial 18.067490
+@llx 18.067490 @lly 554.070007 @urx 461.724976 @ury 1771
+@rwi @setspecial
+%%BeginDocument: runtime_layered_repl_vs_volcano.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 362 m
+420 1704 l
+2030 1704 l
+2030 362 l
+420 362 l
+stroke
+[] 0 setdash
+420 362 m
+420 372 l
+621 362 m
+621 372 l
+822 362 m
+822 372 l
+1023 362 m
+1023 372 l
+1225 362 m
+1225 372 l
+1426 362 m
+1426 372 l
+1627 362 m
+1627 372 l
+1828 362 m
+1828 372 l
+2030 362 m
+2030 372 l
+420 1704 m
+420 1694 l
+621 1704 m
+621 1694 l
+822 1704 m
+822 1694 l
+1023 1704 m
+1023 1694 l
+1225 1704 m
+1225 1694 l
+1426 1704 m
+1426 1694 l
+1627 1704 m
+1627 1694 l
+1828 1704 m
+1828 1694 l
+2030 1704 m
+2030 1694 l
+stroke
+420 362 m
+420 382 l
+621 362 m
+621 382 l
+822 362 m
+822 382 l
+1023 362 m
+1023 382 l
+1225 362 m
+1225 382 l
+1426 362 m
+1426 382 l
+1627 362 m
+1627 382 l
+1828 362 m
+1828 382 l
+2030 362 m
+2030 382 l
+420 1704 m
+420 1684 l
+621 1704 m
+621 1684 l
+822 1704 m
+822 1684 l
+1023 1704 m
+1023 1684 l
+1225 1704 m
+1225 1684 l
+1426 1704 m
+1426 1684 l
+1627 1704 m
+1627 1684 l
+1828 1704 m
+1828 1684 l
+2030 1704 m
+2030 1684 l
+/Times-Italic findfont
+90 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 287 m
+gsave
+420 287 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 287 m
+gsave
+621 287 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 287 m
+gsave
+822 287 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 287 m
+gsave
+1023 287 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 287 m
+gsave
+1225 287 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 287 m
+gsave
+1426 287 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 287 m
+gsave
+1627 287 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 287 m
+gsave
+1828 287 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 287 m
+gsave
+2030 287 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 137 m
+gsave
+1225 137 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 362 m
+430 362 l
+420 586 m
+430 586 l
+420 809 m
+430 809 l
+420 1033 m
+430 1033 l
+420 1257 m
+430 1257 l
+420 1480 m
+430 1480 l
+420 1704 m
+430 1704 l
+2030 362 m
+2020 362 l
+2030 586 m
+2020 586 l
+2030 809 m
+2020 809 l
+2030 1033 m
+2020 1033 l
+2030 1257 m
+2020 1257 l
+2030 1480 m
+2020 1480 l
+2030 1704 m
+2020 1704 l
+stroke
+420 362 m
+440 362 l
+420 809 m
+440 809 l
+420 1257 m
+440 1257 l
+420 1704 m
+440 1704 l
+2030 362 m
+2010 362 l
+2030 809 m
+2010 809 l
+2030 1257 m
+2010 1257 l
+2030 1704 m
+2010 1704 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+366 362 m
+gsave
+366 362 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 809 m
+gsave
+366 809 translate
+0 rotate
+0 -30 m
+(500) RJ
+(500) show
+grestore
+newpath
+366 1257 m
+gsave
+366 1257 translate
+0 rotate
+0 -30 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+366 1704 m
+gsave
+366 1704 translate
+0 rotate
+0 -30 m
+(1500) RJ
+(1500) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+104 1033 m
+gsave
+104 1033 translate
+90 rotate
+0 0 m
+(CPU time \(milliseconds\)) CS
+(CPU time \(milliseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1872 m
+gsave
+1225 1872 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1774 m
+gsave
+1225 1774 translate
+0 rotate
+0 0 m
+(Average CPU Time) CS
+(Average CPU Time) show
+grestore
+newpath
+420 401 m
+621 405 l
+822 398 l
+1023 407 l
+1225 428 l
+1426 473 l
+1627 573 l
+1828 899 l
+2030 1357 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 401 30 0 360 arc
+gsave fill grestore
+stroke
+621 405 30 0 360 arc
+gsave fill grestore
+stroke
+822 398 30 0 360 arc
+gsave fill grestore
+stroke
+1023 407 30 0 360 arc
+gsave fill grestore
+stroke
+1225 428 30 0 360 arc
+gsave fill grestore
+stroke
+1426 473 30 0 360 arc
+gsave fill grestore
+stroke
+1627 573 30 0 360 arc
+gsave fill grestore
+stroke
+1828 899 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1357 30 0 360 arc
+gsave fill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 398 m
+621 414 l
+822 404 l
+1023 404 l
+1225 433 l
+1426 476 l
+1627 575 l
+1828 900 l
+2030 1312 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+395 373 m
+395 423 l
+445 423 l
+445 373 l
+closepath
+gsave eofill grestore
+stroke
+596 389 m
+596 439 l
+646 439 l
+646 389 l
+closepath
+gsave eofill grestore
+stroke
+797 379 m
+797 429 l
+847 429 l
+847 379 l
+closepath
+gsave eofill grestore
+stroke
+998 379 m
+998 429 l
+1048 429 l
+1048 379 l
+closepath
+gsave eofill grestore
+stroke
+1200 408 m
+1200 458 l
+1250 458 l
+1250 408 l
+closepath
+gsave eofill grestore
+stroke
+1401 451 m
+1401 501 l
+1451 501 l
+1451 451 l
+closepath
+gsave eofill grestore
+stroke
+1602 550 m
+1602 600 l
+1652 600 l
+1652 550 l
+closepath
+gsave eofill grestore
+stroke
+1803 875 m
+1803 925 l
+1853 925 l
+1853 875 l
+closepath
+gsave eofill grestore
+stroke
+2005 1287 m
+2005 1337 l
+2055 1337 l
+2055 1287 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+420 398 m
+621 413 l
+822 404 l
+1023 403 l
+1225 431 l
+1426 475 l
+1627 573 l
+1828 899 l
+2030 1306 l
+/Times-Roman findfont
+90 scalefont
+ setfont
+stroke
+420 428 m
+390 398 l
+420 368 l
+450 398 l
+closepath
+gsave eofill grestore
+stroke
+621 443 m
+591 413 l
+621 383 l
+651 413 l
+closepath
+gsave eofill grestore
+stroke
+822 434 m
+792 404 l
+822 374 l
+852 404 l
+closepath
+gsave eofill grestore
+stroke
+1023 433 m
+993 403 l
+1023 373 l
+1053 403 l
+closepath
+gsave eofill grestore
+stroke
+1225 461 m
+1195 431 l
+1225 401 l
+1255 431 l
+closepath
+gsave eofill grestore
+stroke
+1426 505 m
+1396 475 l
+1426 445 l
+1456 475 l
+closepath
+gsave eofill grestore
+stroke
+1627 603 m
+1597 573 l
+1627 543 l
+1657 573 l
+closepath
+gsave eofill grestore
+stroke
+1828 929 m
+1798 899 l
+1828 869 l
+1858 899 l
+closepath
+gsave eofill grestore
+stroke
+2030 1336 m
+2000 1306 l
+2030 1276 l
+2060 1306 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+90 scalefont
+ setfont
+716 1328 m
+716 1664 l
+1875 1664 l
+1875 1328 l
+716 1328 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+765 1608 m
+961 1608 l
+stroke
+765 1608 30 0 360 arc
+gsave fill grestore
+stroke
+961 1608 30 0 360 arc
+gsave fill grestore
+stroke
+1010 1608 m
+gsave
+1010 1608 translate
+0 rotate
+0 -30 m
+(Prairie \(Layered\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+765 1496 m
+961 1496 l
+stroke
+740 1471 m
+740 1521 l
+790 1521 l
+790 1471 l
+closepath
+gsave eofill grestore
+stroke
+936 1471 m
+936 1521 l
+986 1521 l
+986 1471 l
+closepath
+gsave eofill grestore
+stroke
+1010 1496 m
+gsave
+1010 1496 translate
+0 rotate
+0 -30 m
+(Prairie \(Non-layered\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+765 1384 m
+961 1384 l
+stroke
+765 1414 m
+735 1384 l
+765 1354 l
+795 1384 l
+closepath
+gsave eofill grestore
+stroke
+961 1414 m
+931 1384 l
+961 1354 l
+991 1384 l
+closepath
+gsave eofill grestore
+stroke
+1010 1384 m
+gsave
+1010 1384 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 2058 3529 a(\(d\))g(Query)h(optimization)g(time)e(for)h
+(the)g(replicated)2058 3621 y(DBMS)h(optimizer)g(\(Figure)g(6.7\))p
+3574 3745 4 3342 v 306 3748 3272 4 v 3576 3765 19 3349
+v 322 3765 3272 19 v 1097 3960 a FP(Figure)24 b(6.10:)31
+b(Benchmarking)26 b(layered)g(optimizers)300 4337 y(mizing)e(10)g(dif)n
+(ferent)i(queries.)32 b(As)23 b(before,)i(all)e(experiments)j(were)e
+(performed)h(on)f(a)f(lightly)i(loaded)300 4506 y(DECstation)f
+(5000/200)i(running)g(Ultrix)e(4.2.)582 4676 y(The)e(optimization)j
+(times)e(for)g(the)f(layered)j(Prairie,)e(non-layered)i(Prairie,)e(and)
+g(hand-coded)300 4845 y(V)-12 b(olcano)28 b(optimizers)g(are)e(shown)h
+(in)f(Figures)h(6.10\(b\))2087 4812 y Fv(8)2129 4845
+y FP(,)e(6.10\(c\),)j(and)f(6.10\(d\))g(for)g(the)f(centralized)p
+300 4926 1320 4 v 400 4980 a Fu(8)434 5012 y Fy(The)18
+b(optimization)f(times)g(for)g(both)h(non-layered)h(Prairie)d(and)h(V)
+-10 b(olcano)19 b(for)e(the)g(centralized)h(optimizer)f(are)g(the)g
+(same)1905 5349 y FP(95)p eop
+%%Page: 96 108
+96 107 bop 297 391 a FP(\(Figure)21 b(6.4\),)h(distributed)h(\(Figure)f
+(6.6\),)f(and)g(replicated)j(\(Figure)d(6.7\))g(DBMS)e(optimizers,)k
+(respec-)300 561 y(tively)-6 b(.)42 b(In)26 b(each)i(case,)f(we)f(can)h
+(see)g(that)g(the)g(three)h(speci\256cations)i(are)d(virtually)i
+(equally)f(ef)n(\256cient,)296 730 y(con\256rming)21
+b(the)f(hypothesis)j(that)e(layered)h(optimizers)f(need)g(not)f
+(sacri\256ce)i(any)e(performance.)32 b(More)293 899 y(experiments)19
+b(are)e(needed,)i(however)l(,)h(to)d(verify)h(that)f(the)g(performance)
+j(is)c(good)i(when)f(scaled)h(to)f FD(lar)m(ge)300 1069
+y FP(layered)25 b(optimizers.)577 1238 y(Another)19 b(metric)g(which)f
+(can)g(measure)h(the)f(usefulness)j(of)d(layered)i(optimizer)f
+(speci\256cations)298 1408 y(is)i(the)g(ease)h(with)f(which)h(they)g
+(can)g(be)f(tailored)i(to)f(dif)n(ferent)h(applications.)34
+b(In)21 b(this)h(case,)g(the)g(layered)293 1577 y(approach)d(is)d
+(useful)i(because)h(it)e(helps)g(a)g(DBI)e(to)i(clearly)h(see)f(the)g
+(ef)n(fects)i(of)e(any)g(change)h(on)f(the)g(search)296
+1746 y(space)k(of)f(an)g(optimizer)-5 b(.)32 b(For)19
+b(instance,)k(the)d(Open)g(OODB)e(optimizer)j(results)h(in)e(an)g
+(extremely)i(lar)n(ge)300 1916 y(search)30 b(space)f(for)f(certain)i
+(queries.)47 b(If)28 b(it)g(were)g(implemented)i(using)f(layers,)i
+(then)e(the)f(DBI)f(could)299 2085 y(more)22 b(easily)i(experiment)h
+(with)d(adding)i(new)e(rules)i(and)f(layers)g(in)g(various)h(layered)g
+(con\256gurations.)297 2254 y(It)d(is)f(in)h(this)h(respect)g(that)g
+(we)e(believe)i(that)g(the)f(layered)i(approach)g(will)d(yield)i(the)g
+(most)e(productivity)300 2424 y(gains.)300 2790 y FO(6.6)119
+b(Related)31 b(W)-7 b(ork)298 3053 y FP(Optimizer)23
+b(design)g(and)f(implementation)j(using)e(pre-de\256ned)g
+(building-blocks)k(has)22 b(been)h(proposed)298 3223
+y(by)e(other)i(researchers.)33 b(Most)22 b(of)f(these)i(proposals)h
+(follow)e(a)f(rule-based)k(paradigm.)31 b(In)22 b(this)g(section,)300
+3392 y(we)28 b(brie\257y)h(describe)i(some)e(of)g(these)g(approaches.)
+50 b(The)28 b(main)h(problem)h(with)f(these)g(ideas)h(is)f(that)294
+3562 y(they)19 b(are)g(paper)g(proposals,)j(so)c(it)h(is)f(not)g
+(immediately)j(clear)e(how)f(well)g(they)h(might)g(work)f(in)g
+(practice.)297 3731 y(Moreover)l(,)24 b(as)d(we)f(have)i(seen)f(in)g
+(Chapter)h(4,)f(it)g(is)g(important)i(to)e(have)h(a)e(compiler)j(that)e
+(can)h(generate)300 3900 y(ef)n(\256cient,)27 b(compact)g(optimizers)h
+(from)e(a)f(speci\256cation)k(constructed)g(using)d(components.)40
+b(None)26 b(of)300 4070 y(the)e(proposals)i(discussed)g(in)e(this)g
+(section)h(describe)h(how)d(that)h(is)f(done,)i(or)e(even)h(if)g(it)f
+(is)g(possible.)583 4239 y(Sciore)32 b(and)f(Sieg)g([44])g(describe)i
+(an)e(optimizer)i(generator)g(model)e(that)h(allows)f(a)g(DBI)e(to)296
+4408 y(construct)22 b(a)d(rule-based)k(optimizer)e(using)g
+FD(modules)p FP(.)31 b(Each)19 b(module)i(consists)g(of)f
+FD(term)g(r)m(ewrite)g(rules)p FP(,)298 4578 y(where)i(rewrite)g(rules)
+g(transform)h(terms)f(in)f(a)g(relational)j(algebra.)32
+b(These)22 b(rules)g(can)g(have)g FD(conditions)300 4747
+y FP(associated)28 b(with)d(them.)36 b(Each)25 b(module)h(has)f
+(exported)j(and)d(imported)i(interfaces)h(which)d(consist)i(of)300
+4916 y(terms.)p 300 4979 1320 4 v 300 5064 a Fy(as)19
+b(those)g(shown)h(in)f(Figure)g(5.1\(b\).)1905 5349 y
+FP(96)p eop
+%%Page: 97 109
+97 108 bop 583 391 a FP(Each)24 b(module)h(in)f(Sciore)h(and)f(Sieg')-5
+b(s)25 b(framework)g(is)f(allowed)h(to)f(have)h(rewrite)f(rules)h(in)f
+(its)300 561 y(own)h(relational)j(algebra.)37 b(A)24
+b(module)i(can)g(also)g(specify)g(its)g(search)g(space,)h(cost)f
+(model,)f(individual)300 730 y(search)32 b(strategy)g(\(e.g.,)f
+(heuristic,)j(exhaustive,)h(simulated)d(annealing,)i(etc.\),)e
+(termination)h(policy)-6 b(,)300 899 y(and)30 b(rule)g(properties)i
+(\(e.g.,)e(rule)g(priorities)i(that)e(de\256ne)f(the)h(order)g(in)g
+(which)f(rules)i(are)e(applied)i(in)300 1069 y(each)f(module\).)50
+b(There)30 b(are)g(also)g FD(knobs)h FP(that)f(a)f(DBI)g(can)h(set)f
+(before)i(optimization)i(starts.)50 b(These)300 1238
+y(knobs)25 b(are)f(essentially)i(initialization)i(steps)c(that)g(set)g
+(various)h(parameters)h(of)d(a)g(module.)576 1408 y(An)16
+b(optimizer)j(is)e(constructed)j(by)d(stacking)i(various)g(modules)f
+(together)-5 b(.)31 b(The)16 b(order)i(of)f(mod-)299
+1577 y(ules)23 b(de\256nes)g(the)g(order)g(of)g(term)f(rewrite)h(rules)
+g(that)h(are)e(applied)i(to)f(a)f(term.)30 b(A)21 b(module)j(can)f
+(request)299 1746 y(another)i(to)e(optimize)i(a)d(term)h(and)g(return)i
+(its)e(results.)32 b(Thus,)23 b(communication)j(between)e(modules)g(is)
+300 1916 y(bi-directional.)583 2085 y(In)i(theory)-6
+b(,)27 b(Sciore)f(and)g(Sieg)f(propose)i(a)e(very)i(general)g
+(framework)f(for)g(optimizer)h(design.)297 2254 y(However)l(,)22
+b(since)f(this)h(model)f(is)f(not)h(implemented)i(\(to)e(our)g
+(knowledge\),)j(it)c(is)h(unclear)h(whether)g(this)297
+2424 y(approach)h(is)d(used)i(as)f(an)f(interpreter)k(\(thus)e
+(degrading)h(performance\),)h(or)c(to)h(generate)i(a)d(monolithic)300
+2593 y(optimizer)-5 b(.)33 b(The)24 b(algorithm)h(for)f(the)h(latter)f
+(is)g(not)g(described,)j(so)c(the)i(performance)h(of)e(the)g(resulting)
+300 2762 y(optimizer)h(is)e(hard)h(to)f(predict.)32 b(Also,)23
+b(it)g(is)g(not)h(evident)h(whether)f(the)g(general)h(nature)f(of)g
+(the)f(frame-)300 2932 y(work)i(makes)h(it)f(hard)h(and)g(unwieldy)g
+(to)g(use.)36 b(If)25 b(so,)g(then)h(it)f(defeats)i(the)f(purpose)h(of)
+e(an)g(extensible)300 3101 y(optimizer)g(generator)h(paradigm.)579
+3271 y(Mitchell,)c(Dayal,)f(and)f(Zdonik)h([39,)16 b(40])k(propose)i(a)
+d(framework)i(called)g(Epoq)f(in)g(which)g(op-)298 3440
+y(timizers)k(are)e(constructed)j(using)f(extensible)h
+FD(r)m(egions)p FP(.)32 b(A)21 b(region)i(is)f(de\256ned)h(by)f(a)g
+(stated)h FD(goal)g FP(\(e.g.,)297 3609 y(lower)f(cost,)g(join)f
+(reorder)l(,)j(etc.\).)30 b(Each)21 b(region)i(de\256nes)e(a)g(control)
+i(strategy)g(that)f(transforms)h(a)e(query)300 3779 y(into)30
+b(alternative)j(forms)d(based)h(on)f(its)f(internal)j(transformation)h
+(rules.)50 b(A)29 b(region)i(can)f(also)g(call)h(a)298
+3948 y(child)23 b(region)g(to)f(transform)h(a)e(subquery)-6
+b(.)33 b(In)22 b(this)g(approach,)i(an)e(optimizer)h(is)f(speci\256ed)h
+(as)f(a)f(rooted,)300 4117 y(directed,)k(acyclic)g(graph)g(of)f
+(regions.)582 4287 y(The)e(root)i(region)g(is)e(responsible)k(for)c
+(optimizing)j(a)d(user)h(query)-6 b(.)32 b(A)21 b(parent)j(region)g
+(controls)300 4456 y(which)i(of)g(its)h(child)g(regions)h(transforms)g
+(a)d(query)-6 b(.)40 b(Thus,)27 b(the)f(expansion)j(of)d(the)g(search)i
+(space)f(de-)294 4625 y(pends)19 b(on)f(two)g(factors:)30
+b(the)18 b(internal)i(transformations)i(of)c(a)f(region,)j(and)f(the)f
+(parent')-5 b(s)20 b(determination)300 4795 y(of)j(the)h(most)g
+(appropriate)j(region)e(\(based)g(on)e(its)h(stated)h(goal\))f(to)g(ef)
+n(fect)h(a)e(transformation.)579 4964 y(The)c(transformation)k(rules)e
+(in)f(a)f(region)i(consist)g(of)f(applicability)j(conditions)g
+(together)f(with)1905 5349 y(97)p eop
+%%Page: 98 110
+98 109 bop 296 391 a FP(a)19 b(test)g(to)h(check)h(whether)f(a)f
+(transformed)j(query)f(meets)e(the)h(region')-5 b(s)22
+b(stated)e(goal.)31 b(If)19 b(not,)h(then)g(trans-)295
+561 y(formation)g(rules)f(are)g(applied)h(repeatedly)i(\(perhaps)f
+(based)e(on)g(some)g(heuristic\))i(until)e(either)h(the)f(goal)300
+730 y(is)k(satis\256ed,)i(or)e(the)h(region)h(fails)f(and)g(returns)i
+(to)d(its)h(parent.)583 899 y(As)30 b(in)g(the)h(Sciore)f(and)h(Sieg)f
+(approach,)k(the)d(model)g(proposed)h(by)f(Mitchell,)i(Dayal,)f(and)300
+1069 y(Zdonik)26 b(has)g(not)g(been)g(implemented.)38
+b(Thus,)26 b(it)f(is)g(not)h(clear)g(whether)h(such)f(a)f(general)i
+(framework)300 1238 y(can)e(generate)i(optimizers)g(that)f(are)f(ef)n
+(\256cient)i(and)e(that)g(encompass)j(a)c(lar)n(ge)i(domain)g(of)f
+(commonly)299 1408 y(available)h(optimizers.)33 b(It)22
+b(is)h(also)h(not)f(clear)h(whether)g(the)g(interaction)i(between)e
+(regions)h(can)e(be)g(ex-)300 1577 y(pressed)j(in)f(a)f(compact)h
+(framework)h(so)e(that)h(regions)i(can)d(be)h(reused)h(in)e(various)i
+(optimizer)g(con\256g-)300 1746 y(urations.)300 2113
+y FO(6.7)119 b(Summary)300 2376 y FP(In)25 b(this)h(chapter)l(,)i(we)c
+(described)k(how)d(layered)i(optimizers)h(can)d(be)h(constructed)i
+(using)f(Prairie,)f(and)298 2545 y(how)c(the)g(P2V)e(preprocessor)26
+b(can)c(generate)i(monolithic)g(optimizers)g(from)e(a)f(layered)j
+(speci\256cation.)300 2715 y(W)-7 b(e)26 b(also)h(presented)i
+(preliminary)g(experimental)g(evidence)g(from)e(simple)g(layered)h
+(optimizers)h(that)293 2884 y(demonstrate)19 b(that)f(optimizer)g
+(performance)i(is)d(not)g(sacri\256ced)h(by)f(using)i(reusable,)h
+(extensible)f(layers.)296 3053 y(More)h(experiments)i(are)f(necessary)h
+(to)e(conclusively)j(validate)f(that)f(a)e(layered)j(optimizer)f(can)g
+(be)f(just)300 3223 y(as)27 b(ef)n(\256cient)i(as)e(\(and)h(more)g
+(extensible)i(than\))e(monolithic)i(optimizers.)44 b(Our)27
+b(primary)h(goal)g(in)g(this)300 3392 y(chapter)d(was)e(to)g(quickly)i
+(design)g(and)f(implement)h(a)e FD(practical)i FP(framework)g(for)e
+(specifying)k(layered)300 3562 y(optimizers.)36 b(Future)25
+b(work)f(can)h(add)g(more)g(generality)i(to)d(this)i(approach.)36
+b(An)23 b(important)k(goal)e(is)f(to)300 3731 y(use)g(Prairie)g(to)f
+(automatically)k(generate)f(ef)n(\256cient)f(optimizers)g(in)f(P2)e
+([10,)16 b(1)m(1].)1905 5349 y(98)p eop
+%%Page: 99 111
+99 110 bop 2859 1118 a FG(Chapter)44 b(7)2613 1657 y
+FM(Conclusion)300 2159 y FP(This)28 b(dissertation)j(described)g
+(Prairie,)e(an)f(algebraic)j(framework)e(for)f(rule-speci\256cation)k
+(in)c(query)293 2328 y(optimizers.)j(This)18 b(chapter)h(summarizes)g
+(the)f(contributions)k(of)17 b(our)h(research,)j(and)d(suggests)i
+(avenues)300 2498 y(of)j(future)i(work.)300 2864 y FO(7.1)119
+b(Contributions)31 b(of)f(Dissertation)300 3127 y FP(T)-6
+b(o)24 b(design)i(open)g(DBMSs)d(that)j(are)f(easily)h(tailorable)i
+(and)d(retar)n(getable)k(to)c(dif)n(ferent)j(architectures)300
+3297 y(and)d(applications,)k(the)c(major)g(components)i(of)e(a)f(DBMS)e
+(should)27 b(be)e(speci\256ed)h(using)g(abstractions)300
+3466 y(that)j(are)g(independent)k(of)28 b(the)h(underlying)j
+(implementation)g(details.)48 b(T)-6 b(o)27 b(that)j(end,)g(we)e(have)i
+(pro-)300 3635 y(posed,)j(designed,)i(and)c(implemented)h(Prairie,)h
+(an)e(algebraic)i(speci\256cation)g(framework)f(for)e(con-)300
+3805 y(structing)i(rule-based)g(query)f(optimizers.)50
+b(In)30 b(Chapter)g(1,)h(we)d(enumerated)k(four)e(critical)h(require-)
+300 3974 y(ments)e(in)g(such)h(a)e(framework.)48 b(Below)-6
+b(,)30 b(we)e(summarize)i(and)f(describe)i(how)e(Prairie)g(meets)g(all)
+g(of)300 4144 y(these)c(intended)g(goals.)436 4413 y
+FC(\017)46 b FI(Abstractions.)38 b FP(W)-7 b(ell-de\256ned)28
+b(and)e(high-level)i(abstractions)h(are)d(critical)h(to)f(the)g
+(success)h(of)527 4582 y(an)h(open)g(system.)43 b(Prairie)28
+b(provides)h(abstractions)i(that)d(are)f(central)i(to)f(the)f
+(speci\256cation)j(of)527 4751 y(any)20 b(optimizer;)j(these)d
+(abstractions)j(capture)e(the)e(operation)j(of)d(an)h(optimizer)h
+(without)f(regard)527 4921 y(to)28 b(their)h(implementation.)46
+b(Operators,)30 b(algorithms,)h(rules,)e(descriptors,)j(and)c(layers)h
+(repre-)527 5090 y(sent)23 b(the)f(various)i(abstractions)h(that)e(are)
+f(key)h(to)f(Prairie')-5 b(s)23 b(success.)32 b(Operators)24
+b(represent)g(the)1905 5349 y(99)p eop
+%%Page: 100 112
+100 111 bop 527 391 a FP(abstract)25 b(computations)i(on)c(streams.)31
+b(Algorithms)25 b(describe)g(the)f(implementations)i(of)d(oper)n(-)527
+561 y(ators.)30 b(Rules)20 b(\(T)-8 b(-rules)19 b(and)h(I-rules\))h
+(specify)f(the)g(transformations)i(that)e(an)f(optimizer)h(applies)527
+730 y(to)27 b(generate)i(its)e(search)h(space;)i(the)d(internal)i
+(representation)i(of)c(the)g(search)h(space)g(is)f(left)g(as)527
+899 y(an)d(implementation-level)30 b(detail.)j(Descriptors)27
+b(are)d(used)h(to)f(encapsulate)k(the)c(properties)j(of)527
+1069 y(expressions)f(in)d(the)g(search)g(space.)32 b(Unlike)23
+b(other)h(rule-based)h(optimizers)g(which)e(use)g(multi-)527
+1238 y(ple)k(structures)i(to)d(specify)j(properties)g(\(based)f(on)e
+(their)h(use\),)h(descriptors)i(represent)e(all)f(the)527
+1408 y(properties)j(used)e(in)f(an)g(optimizer;)j(the)d
+(classi\256cation)j(of)d(properties)j(based)e(on)f(their)h(usage)527
+1577 y(is)f(an)f(internal)j(detail,)f(better)f(left)g(to)g(an)f
+(implementation.)43 b(Layers)27 b(encapsulate)j(lar)n(ger)e(rule)527
+1746 y(sets;)d(each)f(layer)g(typically)i(represents)h(a)c(rule)h
+(speci\256cation)i(in)d(its)h(own)f(right.)436 1984 y
+FC(\017)46 b FI(Extensibility)-5 b(.)44 b FP(Extensibility)30
+b(refers)e(to)f(the)h(ease)g(with)f(which)h(an)f(existing)i(system)g
+(can)e(be)527 2153 y(changed.)59 b(The)32 b(language)i(constructs)h
+(that)e(Prairie)g(provides)h(to)e(specify)i(the)f(abstractions)527
+2322 y(mentioned)22 b(above)f(are)f(designed)j(to)c(enable)j(a)d(DBI)g
+(to)h(quickly)h(and)g(ef)n(\256ciently)h(add)e(or)g(delete)527
+2492 y(operators,)27 b(algorithms,)g(rules,)e(properties,)i(or)e
+(layers)h(to)e(construct)j(an)e(optimizer)h(for)e(a)h(new)527
+2661 y(query)i(environment.)41 b(This)25 b(is)h(an)g(improvement)i
+(over)e(existing)i(rule-based)h(optimizers)f(be-)527
+2830 y(cause)18 b(any)f(changes)i(made)e(by)f(the)h(DBI)f(are)h
+(seamless.)30 b(Thus,)17 b(modifying)i(an)e(optimizer)h(using)527
+3000 y(Prairie)h(need)g(not)f(result)h(in)f(a)f(system)i(with)f(lots)g
+(of)g(patches)i(applied)g(haphazardly;)j(brittleness)527
+3169 y(of)h(the)g(resulting)h(optimizer)h(is)d(less)h(of)g(a)f
+(concern.)436 3406 y FC(\017)46 b FI(Performance.)31
+b FP(Performance)21 b(of)e(an)g(optimizer)i(is)e(critical)i(since)g
+(the)e(search)i(spaces)g(are)f(typ-)527 3576 y(ically)g(exponential)i
+(in)d(the)g(size)g(of)f(an)h(operator)i(tree.)30 b(The)18
+b(experiences)k(of)c(many)h(researchers)527 3745 y(have)26
+b(shown)f(that)g(a)g(very)g(general)i(framework)e(of)g(system)g
+(construction)k(can)c(result)h(in)e(inef-)527 3914 y(\256cient)g
+(implementations)i(either)e(because)g(the)f(abstractions)k(do)22
+b(not)i(adequately)h(capture)g(the)527 4084 y(system)31
+b(semantics,)h(or)e(because)h(the)f(translation)j(of)c(the)h
+(speci\256cation)i(into)f(an)e(executable)527 4253 y(system)23
+b(does)h(not)f(exploit)h(the)e(properties)k(of)c(the)h(tar)n(get)h
+(application)h(or)e(architecture.)33 b(In)23 b(our)527
+4423 y(research,)f(we)c(have)h(used)h(V)-12 b(olcano)20
+b(as)e(the)h(tar)n(get)i(framework)e(for)g(translating)j(Prairie)d
+(speci\256-)527 4592 y(cations.)32 b(W)-7 b(e)21 b(have)i(implemented)h
+(the)e(P2V)f(preprocessor)k(that)e(transforms)h(the)e(abstractions)527
+4761 y(embodied)d(in)e(Prairie)h(to)f(the)g(lower)n(-level)i(details)g
+(expected)g(by)e(the)h(V)-12 b(olcano)18 b(rule)g(engine.)30
+b(W)-7 b(e)527 4931 y(took)28 b(care)f(to)f(ensure)i(that)f(the)g
+(translation)i(process)f(generated)i(ef)n(\256cient)d(internal)i
+(represen-)527 5100 y(tations)24 b(for)f(the)f(various)i(abstractions.)
+34 b(T)-6 b(o)21 b(validate)k(the)d(performance)j(of)d(this)h
+(approach,)i(we)1882 5349 y(100)p eop
+%%Page: 101 113
+101 112 bop 527 391 a FP(presented)25 b(various)f(benchmark)g
+(experiments,)h(both)e(with)f(small)g(and)h(lar)n(ge)g(optimizer)h
+(spec-)527 561 y(i\256cations)g(using)f(Prairie.)31 b(The)22
+b(results)h(con\256rm)f(our)h(belief)g(that)g(the)f(preprocessor)k
+(approach)527 730 y(is)e(a)f(valid)h(step,)g(and)g(that)g(Prairie)g
+(abstractions)j(have)e(ef)n(\256cient)g(implementations.)436
+974 y FC(\017)46 b FI(Recon\256gurability)-5 b(.)44 b
+FP(Layers)28 b(in)f(Prairie)h(encapsulate)j(a)c(set)h(of)f(rules;)k
+(they)d(can)g(be)f(used)h(as)527 1144 y(subsystems)f(to)d(construct)j
+(a)d(lar)n(ger)i(system)f(\(optimizer\).)36 b(W)-7 b(e)23
+b(have)i(extended)i(Prairie)e(to)f(al-)527 1313 y(low)f(DBIs)f(to)h
+(specify)h(layers,)h(and)e(to)g(build)h(optimizers)h(as)e(a)f(linear)j
+(composition)g(of)e(layers.)527 1482 y(The)f(P2V)e(preprocessor)26
+b(uses)c(the)h(composition)h(semantics)g(to)e(generate)h(an)f(ef)n
+(\256cient)i(mono-)527 1652 y(lithic)k(optimizer)h(from)e(a)f
+(composition)k(of)d(layers.)43 b(Again,)28 b(this)f(process)i(results)f
+(in)f(little)h(or)527 1821 y(no)22 b(loss)f(in)h(performance)h(of)f
+(the)f(resulting)j(optimizer)f(as)e(our)g(preliminary)j(experimental)g
+(ev-)527 1990 y(idence)h(shows.)300 2357 y FO(7.2)119
+b(Futur)n(e)31 b(W)-7 b(ork)300 2620 y FP(Prairie)28
+b(provides)h(an)e(open)h(environment)h(for)f(the)f(high-level)j
+(speci\256cation)f(of)e(query)h(optimizers.)296 2789
+y(T)-6 b(ogether)21 b(with)f(the)g(P2V)f(preprocessor)k(to)d(generate)i
+(executable)h(optimizers,)g(this)d(approach)j(results)299
+2959 y(in)f(extensible)j(speci\256cations.)34 b(Future)23
+b(work)f(will)g(make)h(this)g(paradigm)h(even)f(more)g(useful.)31
+b(In)23 b(this)300 3128 y(section,)i(we)e(describe)i(avenues)h(for)e
+(further)h(research.)436 3397 y FC(\017)46 b FP(Continuing)23
+b(validation)h(of)d(Prairie)g(is)g(important)h(to)f(ensure)h(that)f
+(the)g(abstractions)j(embodied)527 3567 y(within)29 b(it)g(are)f
+(well-de\256ned)j(and)e(represent)i(important)f(concepts)h(of)d
+(optimization.)49 b(In)29 b(this)527 3736 y(dissertation,)k(we)28
+b(have)i(presented)h(experimental)h(evidence)f(using)f(simple)f
+(optimizers)i(and)527 3905 y(the)f(Open)g(OODB)d(optimizer)-5
+b(.)50 b(In)29 b(the)h(future,)i(interesting)g(experiments)g(will)d
+(involve)j(dis-)527 4075 y(tributed)21 b(and)f(parallel)h(databases,)h
+(multi-query)g(optimization,)g(and)e(real-time)g(queries.)31
+b(Each)527 4244 y(application)i(introduces)f(a)d(set)h(of)g
+(constraints)i(concerning)h(the)d(evaluation)i(of)d(queries)j(and)527
+4413 y(experimentation)27 b(is)22 b(needed)i(to)e(verify)h(that)g
+(Prairie)g(speci\256cations)i(can)e(adequately)i(capture)527
+4583 y(the)f(semantics)i(of)e(the)g(application.)35 b(An)23
+b(example)i(of)f(such)h(an)f(application)j(is)c(extending)k(the)527
+4752 y(Open)19 b(OODB)d(optimizer)k(\(described)h(in)d(Chapter)h(5\))f
+(to)h(build)g(distributed)i(or)d(parallel)j(object-)527
+4921 y(oriented)26 b(optimizers.)1882 5349 y(101)p eop
+%%Page: 102 114
+102 113 bop 436 391 a FC(\017)46 b FP(Layered)36 b(Prairie)g
+(speci\256cations)j(present)d(several)h(opportunities)j(for)35
+b(future)h(work.)66 b(Cur)n(-)527 561 y(rently)-6 b(,)29
+b(Prairie)f(allows)f(DBIs)f(to)h(encapsulate)k(a)26 b(set)h(of)g(rules)
+h(in)f(a)g(layer)-5 b(.)42 b(Encapsulation)30 b(of)527
+730 y(other)c(abstractions)h(in)e(Prairie)g(is)f(highly)i(desirable.)36
+b(For)23 b(example,)j(a)e(layer)h(can)g(de\256ne)g(new)527
+899 y(properties)g(in)c(a)g(descriptor)l(,)k(or)c(new)h(helper)h
+(functions.)32 b(The)21 b(site)h(information)i(of)e(streams)g(in)527
+1069 y(an)j(optimizer)i(for)f(a)e(distributed)k(DBMS,)23
+b(for)i(instance,)j(can)d(be)h(de\256ned)f(as)h(a)e(new)h(property)527
+1238 y(in)20 b(the)g(DISTRIBUTION)c(layer)21 b(\(see)f(Chapter)h(6\).)
+29 b(The)20 b(P2V)e(preprocessor)24 b(can)c(be)g(modi\256ed)527
+1408 y(to)29 b(compact)g(layers)h(and)f(generate)i(a)d(monolithic)i
+(rule)f(set,)h(descriptor)l(,)j(and)c(a)f(single)i(set)e(of)527
+1577 y(helper)d(functions.)436 1821 y FC(\017)46 b FP(In)29
+b(this)g(dissertation,)j(we)c(presented)j(preliminary)g(experimental)g
+(evidence)g(to)d(validate)j(the)527 1990 y(performance)c(of)c(layered)j
+(optimizers.)33 b(Future)25 b(work)e(will)h(include)h(more)f
+(experiments)i(with)527 2160 y(lar)n(ge)i(layered)g(optimizer)g
+(speci\256cations.)43 b(For)26 b(instance,)j(the)e(Open)g(OODB)d
+(optimizer)k(is)f(a)527 2329 y(good)19 b(candidate)g(for)f(such)g(a)f
+(speci\256cation.)31 b(It)17 b(will)g(also)h(be)g(instructive)i(to)d
+(extend)i(the)e(layered)527 2498 y(Open)24 b(OODB)d(speci\256cation)26
+b(to)e(distributed)j(or)c(replicated)j(databases.)436
+2743 y FC(\017)46 b FP(Extending)23 b(the)e(Prairie)h(speci\256cation)i
+(language)f(to)e(allow)g(hierarchical,)j(non-linear)g(compo-)527
+2912 y(sitions)f(\(as)e(opposed)j(to)d(linear)h(compositions\))j(will)c
+(allow)g(a)g(DBI)f(to)h(specify)i(more)e(optimiz-)527
+3081 y(ers)j(than)g(are)g(currently)i(possible.)33 b(This)23
+b(means)h(that)h(layers)f(can)g(have)h(multiple)f(parameters,)527
+3251 y(each)18 b(of)g(which)g(can)f(be)h(instantiated)i(by)e(a)f(layer)
+-5 b(.)30 b(For)16 b(example,)k(a)d(retrieval)j(layer)e(implement-)527
+3420 y(ing)j(an)g(abstract)i(RET)c(operator)k(with)d(the)h(index)h
+(scan)g(algorithm)h(may)d(require)j(an)d(additional)527
+3589 y(parameter)i(to)d(de\256ne)h(the)h(implementation)h(of)e(the)g
+(index.)31 b(Experience)22 b(with)d(Genesis)i([4])f(has)527
+3759 y(shown)i(that)g(such)g(parameterized)i(layers)f(can)e(capture)i
+(the)f(semantics)h(of)e(many)g(widely)h(used)527 3928
+y(optimization)28 b(algorithms.)37 b(Extending)27 b(Prairie)e(to)g
+(allow)g(such)h(compositions)i(will)c(necessi-)527 4097
+y(tate)g(a)f(modi\256cation)j(of)d(P2V')-5 b(s)23 b(layer)i(compaction)
+h(algorithm.)436 4342 y FC(\017)46 b FP(Extensible)29
+b(search)f(strategies)h(is)d(another)i(important)g(area)f(of)g(future)h
+(work.)39 b(Currently)-6 b(,)29 b(the)527 4511 y(P2V)i(preprocessor)k
+(translates)f(Prairie)e(speci\256cations)j(into)d(V)-12
+b(olcano)33 b(speci\256cations)i(to)c(be)527 4680 y(compiled)h(with)f
+(V)-12 b(olcano')-5 b(s)33 b(rule)e(engine.)54 b(However)l(,)33
+b(V)-12 b(olcano')-5 b(s)32 b(rule)g(engine)g(implements)527
+4850 y(a)c(hard-wired)i(search)g(strategy)g(that)f(is)f(very)h(rigid.)
+45 b(Moreover)l(,)32 b(the)c(implementation)j(itself)527
+5019 y(does)f(not)f(lend)h(itself)f(to)g(easy)g(change;)34
+b(modifying)d(it)d(will)g(\(we)h(hypothesize\))j(require)f(ma-)1882
+5349 y(102)p eop
+%%Page: 103 115
+103 114 bop 527 391 a FP(jor)21 b(changes.)31 b(Since)21
+b(Prairie)f(provides)j(abstractions)g(that)e(are)f(high-level)j(and)e
+(\(mostly\))g(inde-)527 561 y(pendent)g(of)d(the)h(underlying)j(search)
+d(strategy)-6 b(,)22 b(we)17 b(believe)k(that)e(Prairie)g
+(speci\256cations)i(can)e(be)527 730 y(easily)27 b(translated)h(to)e
+(another)h(rule)f(engine)h(with)f(an)f(appropriate)k(preprocessor)-5
+b(.)40 b(Moreover)l(,)527 899 y(since)22 b(Prairie)g(allows)f
+(encapsulation)26 b(of)20 b(rule)i(sets)g(in)e(layers,)j(we)d(can)i
+(foresee)g(each)g(layer)g(en-)527 1069 y(capsulating)k(a)d(rule)g
+(engine.)32 b(Thus,)23 b(the)g(need)g(for)g(a)f(global)i(search)g
+(strategy)h(disappears,)h(and)527 1238 y(each)20 b(layer)h(implements)g
+(its)e(own)g(search)i(strategy)g(\(in)f(addition)i(to)d(its)g(own)g
+(search)i(space)g(and)527 1408 y(cost)i(model\).)31 b(This)21
+b(is)h(similar)h(to)f(the)g(frameworks)h(proposed)h(in)e([39,)16
+b(40,)g(44].)31 b(One)21 b(interest-)527 1577 y(ing)31
+b(problem)h(is)e(the)g(compaction)j(of)d(layers)i(\320)d(namely)-6
+b(,)33 b(how)d(can)h(we)e(generate)k(a)d(mono-)527 1746
+y(lithic)22 b(rule)f(set)f(with)h(a)f(search)h(strategy)i(that)e(is)f
+(semantically)j(equivalent)g(to)e(the)f(composition)527
+1916 y(of)26 b(the)g(search)h(strategies)h(in)e(the)g(dif)n(ferent)i
+(layers?)39 b(Since)26 b(each)g(layer)h(can)f(have)g(a)g(dif)n(ferent)
+527 2085 y(rule)21 b(engine,)h(any)f(compaction)h(of)e(layers)i(should)
+g(generate)g(a)e(monolithic)i(rule)f(engine)h(that)e(is)527
+2254 y(provably)29 b(equivalent)h(to)d(the)g(actions)h(of)f(the)g
+(hierarchical)j(ordering)e(of)f(the)g(individual)j(rule)527
+2424 y(engines.)436 2661 y FC(\017)46 b FP(In)19 b(Chapter)h(6,)f(we)e
+(mentioned)k(that)e(layers)h(in)f(Prairie)g(are)g(mostly)g(symmetric.)
+30 b(This)19 b(af)n(fords)i(a)527 2830 y(much)e(greater)h
+(\257exibility)h(in)d(layer)i(composition.)32 b(However)l(,)20
+b(not)f(all)g(legal)g(compositions)j(are)527 3000 y(necessarily)29
+b(valid)d(or)g(meaningful.)39 b(This)25 b(implies)h(a)f(need)i(for)e
+(some)h(validation)i(techniques)527 3169 y(that)23 b(can)g(detect)h
+(invalid)g(compositions.)33 b(Batory)24 b(and)e(Geraci)h([8])g
+(describe)h(a)e(useful)i(method)527 3338 y(for)17 b(design)h(rule)f
+(checking)i(in)e(layered)h(systems)g(that)f(validates)i(layer)f
+(compositions.)31 b(A)16 b(future)527 3508 y(goal)25
+b(is)e(to)g(integrate)j(this)e(validation)j(into)d(the)g(P2V)e
+(preprocessor)-5 b(.)436 3745 y FC(\017)46 b FP(Multi-phase)27
+b(query)e(optimizers)h(are)e(being)h(investigated)i(as)d(a)g(means)g
+(of)g(limiting)h(the)f(enor)n(-)527 3914 y(mous)30 b(size)h(of)f(the)g
+(search)i(spaces)f(in)f(most)g(optimizers.)52 b(In)30
+b(this)h(approach,)i(the)e(optimizer)527 4084 y(is)c(implemented)h(as)e
+(a)g(composition)j(of)e(separate)h(phases,)g(each)g(phase)f(optimizing)
+i(the)e(out-)527 4253 y(put)22 b(of)f(another)-5 b(.)32
+b(Systems)21 b(like)g(XPRS)e([48])j(and)f(Mariposa)i([47])f(are)f(some)
+g(examples)i(of)e(this)527 4423 y(approach.)44 b(The)27
+b(Mariposa)i(distributed)h(DBMS,)25 b(for)i(instance,)j(implements)e(a)
+f(three-phase)527 4592 y(optimizer;)k(these)e(phases)g(are)e
+(compilation,)k(parallelization,)h(and)c(distribution.)45
+b(The)27 b(com-)527 4761 y(pilation)32 b(phase)g(optimizes)g(an)e
+(operator)i(tree)f(assuming)h(a)e(centralized)j(DBMS,)28
+b(the)i(paral-)527 4931 y(lelization)h(phase)e(introduces)i
+(intra-operator)i(parallelism,)e(and)e(the)f(distribution)k(phase)d
+(se-)527 5100 y(lects)c(sites)g(for)f(the)g(execution)j(of)d(the)g
+(various)i(algorithms.)34 b(As)24 b(Stonebraker)i(et)e(al)g(point)h
+(out)1882 5349 y(103)p eop
+%%Page: 104 116
+104 115 bop 527 391 a FP(in)27 b([47],)i(partitioning)i(the)c
+(optimization)j(process)f(into)f(multiple)h(phases)f(can)g(result)g(in)
+f(sub-)527 561 y(optimal)21 b(plans.)31 b(However)l(,)22
+b(careful)f(design)h(and)f(implementation)i(of)d(each)h(phase)g(can)g
+(signif-)527 730 y(icantly)26 b(reduce)f(the)f(search)h(space)f(of)g
+(the)g(optimizer)h(\(and,)f(consequently)-6 b(,)27 b(the)d
+(optimization)527 899 y(time\),)i(while)f(still)h(generating)j(a)c
+(good)h(access)h(plan.)37 b(The)25 b(design)i(of)e(such)h(multi-phase)i
+(op-)527 1069 y(timizers)f(can)e(be)h(greatly)h(facilitated)h(by)d
+(ensuring)j(that)e(each)g(phase)h(is)e(recon\256gurable;)30
+b(this)527 1238 y(will)19 b(enable)i(DBIs)e(to)g(\256ne-tune)i(each)f
+(phase)h(to)f(generate)h(plans)g(that)f(are)f(most)h(likely)h(to)e
+(yield)527 1408 y(the)25 b(best)g(access)h(plan)f(for)f(queries)i(in)f
+(a)e(particular)k(application.)37 b(Prairie)25 b(may)f(be)g(a)g
+(valuable)527 1577 y(tool)d(in)f(building)i(multi-phase)h(optimizers,)g
+(where)d(each)h(phase)g(is)f(layered)i(and)e(speci\256ed)i(us-)527
+1746 y(ing)i(Prairie.)436 1990 y FC(\017)46 b FP(Since)22
+b(Prairie)g(depends)i(on)e(V)-12 b(olcano')-5 b(s)24
+b(rule)e(engine,)h(and)f(since)h(V)-12 b(olcano)23 b(implements)g(a)f
+(top-)527 2160 y(down)g(search)h(strategy)-6 b(,)23 b(a)e(future)i
+(area)f(of)g(research)h(would)f(involve)h(investigating)j(the)21
+b(use)h(of)527 2329 y(Prairie)28 b(for)f(specifying)j(bottom-up)f
+(optimizers.)44 b(Since)27 b(most)g(of)g(Prairie')-5
+b(s)29 b(abstractions)h(do)527 2498 y(not)25 b(depend)h(on)e(the)g
+(underlying)k(search)d(strategy)-6 b(,)26 b(this)f(implies)g(that)g
+(Prairie)g(might)f(serve)h(as)527 2668 y(a)e(useful)i(framework)g(for)f
+(both)g(top-down)h(and)f(bottom-up)i(optimizers.)300
+3034 y FO(7.3)119 b(Retr)n(ospective)300 3298 y FP(Our)29
+b(research)i(concentrated)h(on)e(developing)i(a)d(high-level)i
+(framework)g(for)e(rule)g(speci\256cation)j(in)300 3467
+y(query)g(optimizers,)i(and)d(a)f(preprocessor)k(for)d(the)g
+(generation)i(of)e(ef)n(\256cient)h(optimizers.)54 b(W)-7
+b(e)29 b(have)300 3636 y(used)24 b(V)-12 b(olcano)25
+b(as)f(the)g(backend)h(rule)f(engine)h(for)f(our)g(preprocessor)j(and)d
+(for)g(our)g(experiments.)576 3806 y(Most)17 b(of)f(the)h(abstractions)
+k(in)16 b(Prairie)h(capture)i(optimizer)f(actions)h(succintly)-6
+b(.)31 b(The)16 b(descriptor)295 3975 y(abstraction,)23
+b(for)d(instance,)i(not)e(only)g(allows)g(a)f(DBI)f(to)h(concisely)j
+(represent)f(all)f(properties,)i(but)e(also)296 4144
+y(for)f(the)h(same)f(expression)k(to)c(have)i(dif)n(ferent)h
+(descriptors)g(\(i.e.,)e(dif)n(ferent)i(properties\))g(depending)h(on)
+293 4314 y(which)17 b(side)h(of)f(a)f(rule)i(it)f(occurs)h(on.)29
+b(Abstract)18 b(operators)i(and)d(algorithms)i(that)f(are)f(all)g
+(treated)i(as)d(\256rst-)300 4483 y(class)24 b(objects)h(allows)f
+(Prairie)f(speci\256cations)k(to)c(scale)h(gracefully)-6
+b(.)34 b(W)-7 b(e)22 b(feel,)h(thus,)h(that)g(Prairie)g(is)f(a)300
+4652 y(good)i(beginning)h(for)e(constructing)j(extensible,)f(scalable,)
+f(and)f(ef)n(\256cient)h(optimizers.)582 4822 y(Although)f(V)-12
+b(olcano')-5 b(s)24 b(rule)f(engine)h(uses)f(an)f(ef)n(\256cient,)i
+(exhaustive)h(search)f(strategy)-6 b(,)24 b(its)e(im-)299
+4991 y(plementation)j(leaves)e(it)f(extremely)i(inextensible.)34
+b(Moreover)l(,)24 b(some)f(of)f(the)g(details)i(of)e(the)h(rule)f(en-)
+1882 5349 y(104)p eop
+%%Page: 105 117
+105 116 bop 300 391 a FP(gine)27 b(propagate)h(up)e(to)g(the)g(V)-12
+b(olcano)27 b(rule)f(speci\256cation)j(language.)40 b(For)25
+b(example,)i(the)g(data)f(struc-)300 561 y(tures)k(used)f(to)f(store)i
+(operator)h(trees)e(and)g(their)h(properties)h(are)e(optimized)h(for)f
+(maximum)f(storage)300 730 y(ef)n(\256ciency)-6 b(.)35
+b(Unfortunately)-6 b(,)28 b(this)c(also)h(means)g(that)g(the)f(DBI)f
+(has)i(to)f(be)g(careful)i(and)f(knowledgable)294 899
+y(enough)20 b(to)e(partition)j(properties)g(appropriately)-6
+b(.)33 b(Another)19 b(example)g(of)f(this)h(in\257exibility)i(is)d(the)
+g(mul-)296 1069 y(titude)j(of)f(support)i(functions)g(with)e
+(speci\256c)h(parameter)g(lists)g(that)f(is)g(required)i(by)e(V)-12
+b(olcano.)31 b(This)20 b(not)300 1238 y(only)31 b(disperses)j(the)c
+(optimizer)j(actions)f(over)f(a)g(wider)f(area,)j(but)e(also)g
+(constrains)j(the)d(DBI)e(since)299 1408 y(the)22 b(parameter)i(lists)g
+(of)e(the)g(support)j(functions)g(restrict)f(the)e(properties)j
+(accessible)h(in)c(the)h(function.)296 1577 y(Since)d(Prairie)g(is)g
+(designed)i(to)e(be)g(independent)j(of)d(many)g(of)f(these)i
+(implementation)i(details,)f(it)d(is)h(the)300 1746 y(P2V)25
+b(preprocessor)30 b(that)d(currently)h(has)f(to)f(bear)h(the)g(brunt)g
+(of)f(the)h(burden)h(of)e(generating)j(many)d(of)300
+1916 y(the)e(low-level)i(\252abstractions\272)i(of)23
+b(V)-12 b(olcano.)34 b(A)22 b(better)j(approach)i(to)c(our)i(research)g
+(would)g(probably)300 2085 y(have)f(been)g(to)f(implement)i(our)f(own)f
+(rule)h(engine)g(\(instead)i(of)d(using)i(V)-12 b(olcano\))25
+b(with)e(the)g(same)h(four)300 2254 y(goals)j(\(abstractions,)j
+(extensibility)-6 b(,)30 b(performance,)f(and)e(recon\256gurability\))j
+(as)c(the)g(rule)h(speci\256ca-)300 2424 y(tion)d(language.)583
+2593 y(Cost-based)29 b(query)e(optimization)i(is)d(a)g(well-studied)j
+(area)e(of)f(research.)41 b(Even)26 b(though)i(the)296
+2762 y(techniques)23 b(are)e(well)e(understood,)24 b(building)f(an)d
+(optimizer)h(is)f(still)h(an)f(expensive)j(proposition.)33
+b(This)296 2932 y(problem)21 b(will)e(only)i(be)f(magni\256ed)g(as)g
+(DBMSs)e(are)i(called)h(upon)g(to)f(support)h(lar)n(ger)h(amounts)f(of)
+f(data)296 3101 y(as)g(well)g(as)g(unstructured,)k(novel,)e(or)e
+(heterogeneous)k(data.)31 b(What)20 b(is)g(needed)i(are)e(tools)h(that)
+g(can)f(help)300 3271 y(in)25 b(a)g(streamlining)j(the)d(process)i(of)e
+(optimizer)i(development;)i(these)d(tools)g(have)g(to)f(be)g(general)i
+(and)300 3440 y(contain)h(abstractions)i(that)d(are)f(applicable)j(to)d
+(a)g(wide)g(variety)i(of)e(applications.)43 b(This)26
+b(dissertation)300 3609 y(is)d(a)g(step)i(in)e(that)h(direction.)1882
+5349 y(105)p eop
+%%Page: 106 118
+106 117 bop 2715 1118 a FG(Appendix)43 b(A)1145 1657
+y FM(Complexity)53 b(of)e(the)g(System)h(R)2694 2031
+y(Optimizer)296 2532 y FP(In)19 b(this)h(appendix,)j(we)18
+b(sketch)j(a)e(proof)i(for)f(the)f(asymptotic)j(complexity)g(of)d(the)h
+(System)g(R)e(optimizer)298 2702 y([46])23 b(for)g(joining)h
+FH(n)c FP(relations.)33 b(This)22 b(complexity)i(holds)g(when)e(the)g
+(query)i(graph)f(is)f(fully)h(connected)300 2871 y(or)g(the)h
+(heuristic)i(of)e(delaying)h(cross-products)j(is)c(dropped.)33
+b(This)23 b(is)g(the)h(worst-case)i(scenario.)583 3041
+y(The)h(System)f(R)g(optimizer)i(only)g(generates)h(left-deep)g
+(operator)g(trees.)41 b(That)26 b(is,)h(the)g(inner)300
+3210 y(input)h(of)e(a)h(join)g(operator)i(is)d(the)h(retrieval)i(of)e
+(a)f(stored)i(\256le.)40 b(It)26 b(is)h(easy)g(to)g(see)g(that,)h
+(under)g(this)f(as-)300 3379 y(sumption,)e(the)f(total)h(number)g(of)e
+(distinct)j(expressions)h(is)d FH(n)p FA(!)p FP(.)31
+b(However)l(,)24 b(System)g(R)e(uses)j(dynamic)300 3549
+y(programming)h([19])e(to)f(substantially)28 b(reduce)d(this)f
+(complexity)-6 b(.)583 3718 y(Below)g(,)35 b(we)d(derive)h(the)g
+(complexity)i(of)e(the)g(System)f(R)g(optimizer)i(using)g(dynamic)g
+(pro-)300 3887 y(gramming.)e(The)23 b(optimizer)i(constructs)h(optimal)
+f(plans)g(for)e(each)i(possible)g(join)g(of)e FH(j)28
+b FP(relations,)e(for)293 4057 y FH(j)31 b FA(=)25 b(0)p
+FH(;)15 b(:)g(:)g(:)32 b(;)15 b(n)p FP(.)28 b(At)16 b(each)i(stage,)h
+(only)f(the)f(best)h(plan)f(for)h(joining)h(a)d(given)i(subset)h(of)e
+(relations)i(is)e(main-)300 4226 y(tained.)38 b(Thus,)25
+b(the)h(complexity)i(of)d(the)h(System)f(R)f(optimizer)j(is)e
+(determined)j(by)d(the)h(total)g(number)300 4395 y(of)d(operator)j
+(trees)e(that)h(need)f(to)f(be)h(examined)h(at)e(each)i(stage.)583
+4565 y(The)i(number)i(of)e(operator)j(trees)e(with)f(1)g(relation)i(is)
+e FH(n)38 b FA(=)2539 4496 y Fb(\000)2577 4525 y Fs(n)2581
+4596 y Fv(0)2620 4496 y Fb(\001)2658 4565 y FP(.)k(The)26
+b(number)j(of)e(operator)300 4734 y(trees)d(with)g(1)f(relation)i
+(after)g(pruning)g(is)f FH(n)g FA(=)1801 4665 y Fb(\000)1839
+4694 y Fs(n)1843 4766 y Fv(1)1882 4665 y Fb(\001)1920
+4734 y FP(.)583 4904 y(The)k(number)h(of)f(operator)i(trees)f(with)f(2)
+g(relations)i(is)2379 4834 y Fb(\000)2417 4863 y Fs(n)2421
+4935 y Fv(1)2460 4834 y Fb(\001)2498 4904 y FA(\()p FH(n)c
+FC(\000)g FA(1\))p FP(;)2847 4834 y Fb(\000)2885 4863
+y Fs(n)2889 4935 y Fv(1)2928 4834 y Fb(\001)2993 4904
+y FP(is)i(the)g(number)h(of)300 5073 y(1-relation)h(operator)f(trees,)g
+(and)f FA(\()p FH(n)d FC(\000)g FA(1\))j FP(is)f(the)g(number)i(of)e
+(2-relation)j(operator)f(trees)g(generated)1882 5349
+y(106)p eop
+%%Page: 107 119
+107 118 bop 297 391 a FP(from)21 b(each)g(1-relation)j(tree.)30
+b(The)20 b(number)i(of)f(operator)i(trees)e(with)g(2)f(relations)j
+(after)f(pruning)h(is)3461 322 y Fb(\000)3499 351 y Fs(n)3503
+423 y Fv(2)3542 322 y Fb(\001)3580 391 y FP(.)583 561
+y(In)k(general,)h(the)f(number)g(of)f(operator)j(trees)e(with)f
+FH(j)31 b FP(relations)e(is)2748 491 y Fb(\000)2826 520
+y Fs(n)2786 592 y(j)t FB(\000)p Fv(1)2909 491 y Fb(\001)2947
+561 y FA(\()p FH(n)24 b FC(\000)f FH(j)30 b FA(+)23 b(1\))p
+FP(.)40 b(The)300 730 y(number)24 b(of)g(operator)i(trees)e(with)f
+FH(j)29 b FP(relations)c(after)g(pruning)g(is)2383 661
+y Fb(\000)2421 690 y Fs(n)2426 761 y(j)2463 661 y Fb(\001)2502
+730 y FP(.)583 899 y(The)f(complexity)h(of)f(the)g(System)f(R)f
+(optimization)27 b(algorithm)e(is,)e(thus,)h(given)h(by)f(the)f(sum)
+1464 1078 y Fs(n)p FB(\000)p Fv(1)1471 1103 y Fb(X)1469
+1285 y Fs(j)t Fv(=0)1612 1040 y Fb( )1678 1122 y FH(n)1684
+1246 y(j)1733 1040 y Fb(!)1798 1183 y FA(\()p FH(n)e
+FC(\000)e FH(j)5 b FA(\))27 b(=)e FH(n)p FA(2)2299 1146
+y Fs(n)p FB(\000)p Fv(1)578 1476 y FP(In)19 b(other)h(words,)g(the)f
+(System)g(R)f(optimizer)j(has)e(a)f(worst-case)j(complexity)h(that)d
+(is)g(exponen-)300 1646 y(tial)24 b(in)f(the)h(number)h(of)e(relations)
+j(to)d(be)h(joined.)1882 5349 y(107)p eop
+%%Page: 108 120
+108 119 bop 2724 1118 a FG(Appendix)43 b(B)1081 1657
+y FM(Bene\256ts)51 b(of)h(Rule)f(Compaction)292 2159
+y FP(In)17 b(this)g(appendix,)k(we)16 b(present)i(an)f(informal)h(ar)n
+(gument)g(that)g(the)f(run-time)h(of)e(an)h(optimizer)h(decreases)300
+2328 y(when)24 b(rules)g(are)g(compacted)h(using)g(the)f(techniques)i
+(described)h(in)c(Chapter)i(4.)583 2498 y(Assume)g(that)g
+FH(O)h FP(original)g(rules)f(are)g(compacted)h(to)e FH(C)30
+b FP(rules)25 b(\()p FH(C)35 b(<)27 b(O)s FP(\).)33 b(If)24
+b(the)g(compacted)300 2667 y(rule)i(set)h(\(with)f FH(C)31
+b FP(rules\))c(runs)g(in)f(time)g FH(T)13 b FP(,)25 b(then)h(the)h
+(original)h(rule)e(set)g(\(with)g FH(O)i FP(rules\))f(runs)g(in)3469
+2631 y Fs(O)p 3469 2646 56 4 v 3469 2698 a(C)3534 2667
+y FH(T)299 2836 y FP(time.)j(T)-6 b(o)21 b(see)i(this,)f(if)g(a)g
+(compacted)j(rule)d FH(c)g FP(is)g(obtained)j(by)d(compacting)j
+FH(k)g FP(original)f(rules,)f(then)g(one)294 3006 y(application)e(of)d
+(the)g(compacted)i(rule)f FH(c)f FP(requires)i(the)e(equivalent)j(of)d
+(the)g FH(k)i FP(original)g(rule)f(applications.)300
+3175 y(That)k(is,)g(a)h(linear)g(speedup)i(is)d(achieved)j(by)e
+(compacting)i(rules.)576 3344 y(Note,)18 b(however)l(,)i(that)e
+FH(T)29 b FP(\(the)17 b(time)g(it)g(takes)h(to)f(optimize)i(a)d
+(query\))j(is)e(actually)i(exponential)h(in)297 3514
+y FH(n)f FP(\(the)i(number)h(of)e(relations)j(to)d(be)h(joined\),)h(as)
+f(proved)h(in)e(Appendix)j(A.)28 b(Thus,)21 b(the)g(bene\256ts)g(of)g
+(rule)294 3683 y(compaction)g(also)d(extend)i(to)e(reducing)j(memory)d
+(requirements:)32 b(each)18 b(time)g(a)g(rule)h(is)f(applied,)j(a)c
+(new)294 3853 y(operator)j(tree)e(is)g(introduced.)32
+b(By)17 b(compacting)k(rules,)f(intermediate)g(trees)f(are)f(not)h
+(generated.)31 b(There)300 4022 y(might)25 b(be)g(a)f(very)h(lar)n(ge)h
+(\(e.g.,)f(exponential\))j(number)d(of)g(such)g(intermediate)j(trees)d
+(whose)g(creation)300 4191 y(are)f(eliminated)h(through)h(rule)e
+(compaction.)1882 5349 y(108)p eop
+%%Page: 109 121
+109 120 bop 2715 1118 a FG(Appendix)43 b(C)1270 1657
+y FM(The)51 b(Open)g(OODB)g(Rule)h(Set)300 2159 y FP(In)31
+b(this)h(appendix,)k(we)31 b(list)g(the)h(rules)g(that)g(appear)h(in)f
+(the)f(Open)h(OODB)d(optimizer)-5 b(.)56 b(Figure)32
+b(C.1)298 2328 y(shows)23 b(the)g(17)f(transformation)j(rules)f(and)e
+(9)g(implementation)j(rules)e(using)h(the)e(V)-12 b(olcano)24
+b(optimizer)n(-)300 2498 y(generator)-5 b(.)58 b(Figure)32
+b(C.2)f(shows)h(the)g(22)g(transformation)j(rules)d(and)h(1)m(1)e
+(implementation)k(rules)d(in)300 2667 y(the)e(Prairie)h(framework.)51
+b(Note)30 b(that)h(the)f(\256rst)g(\256ve)g(Prairie)g(T)-8
+b(-rules)31 b(\(Figure)g(C.2\))e(have)i(no)f(coun-)299
+2836 y(terparts)25 b(on)d(the)h(V)-12 b(olcano)24 b(side;)g(these)g
+(additional)h(T)-8 b(-rules)23 b(are)g(required)i(to)e(introduce)i(the)
+e(enforcer)n(-)300 3006 y(operator)29 b(PR)p 746 3006
+28 4 v 32 w(ASSEMBL)-9 b(Y)23 b(into)k(the)g(various)i(operator)g
+(trees.)42 b(Similarly)-6 b(,)28 b(the)f(last)h(two)e(Prairie)h(I-)300
+3175 y(rules)h(\(Figure)g(C.2\))e(are)h(required)j(to)d(introduce)i
+(the)f(Null)f(algorithm)h(and)g(the)f(enforcer)n(-algorithm)299
+3344 y(Enf)p 435 3344 V 33 w(assembly)-6 b(.)32 b(The)23
+b(remaining)h(Prairie)g(rules)f(have)h(a)e(one-to-one)k(correspondence)
+h(with)c(the)g(V)-12 b(ol-)300 3514 y(cano)24 b(rules.)583
+3683 y(Most)i(of)g(the)g(rules)h(in)f(the)g(Open)g(OODB)d(optimizer)28
+b(are)e(quite)g(complex)h(with)f(substantial)300 3853
+y(portions)g(of)e(code)g(for)g(manipulating)j(properties.)34
+b(W)-7 b(e)23 b(compare)h(two)g(simple)g(transformation)j(rules)300
+4022 y(in)d(Figure)g(C.3,)e(which)j(shows)f(the)g(corresponding)k
+(rules)d(for)e(delaying)k(the)d(materialization)j(opera-)297
+4191 y(tion.)k(Figure)21 b(C.3\(a\))g(shows)h(the)f(V)-12
+b(olcano)23 b(rule,)e(and)h(Figure)f(C.3\(b\))g(shows)h(the)f(Prairie)h
+(rule)f(for)g(this)300 4361 y(transformation.)34 b(Note)23
+b(that)h(the)f(Prairie)h(T)-8 b(-rule)23 b(has)h(more)f(statements)i
+(that)f(compute)h(properties)h(of)292 4530 y(new)16 b(expressions.)32
+b(This)16 b(is)g(because)j(some)d(properties)j(in)e(V)-12
+b(olcano)17 b(are)g(computed)h(automatically)i(\(by)300
+4699 y(DBI-written)26 b(support)i(functions\))g(when)e(rules)h(are)f
+(applied,)h(as)f(mentioned)i(in)d(Chapter)i(2.)37 b(Prairie)300
+4869 y(requires)26 b(a)d(DBI)f(to)h(specify)j(all)d(property)j
+(transformations)h(explicitly)-6 b(.)1882 5349 y(109)p
+eop
+%%Page: 110 122
+110 121 bop 323 1252 3237 4 v 323 3916 4 2665 v 374 1340
+a FI(T)-7 b(ransformation)25 b(rules)374 1427 y Fu(\()p
+Fh(OP)p 465 1427 15 4 v 18 w(SELECT)19 b(?op)p 755 1427
+V 18 w(ar)o(g1)e Fu(\(?1\)\))h Ft(\000)-10 b(!)17 b Fu(\()p
+Fh(OP)p 1231 1427 V 18 w(SELECT)i(?op)p 1521 1427 V 18
+w(ar)o(g2)e Fu(\(\()p Fh(OP)p 1756 1427 V 18 w(SELECT)i(?op)p
+2046 1427 V 18 w(ar)o(g3)e Fu(\(?1\)\)\)\))374 1514 y(\()p
+Fh(OP)p 465 1514 V 18 w(MA)-6 b(T)19 b(?op)p 678 1514
+V 17 w(ar)o(g1)f Fu(\(\()p Fh(OP)p 913 1514 V 17 w(SELECT)i(?op)p
+1203 1514 V 18 w(ar)o(g2)d Fu(\(?1\)\)\)\))h Ft(\000)-11
+b(!)p Fu(!\()p Fh(OP)p 1727 1514 V 17 w(SELECT)19 b(?op)p
+2016 1514 V 18 w(ar)o(g3)f Fu(\(\()p Fh(OP)p 2252 1514
+V 17 w(MA)-6 b(T)19 b(op)p 2442 1514 V 18 w(ar)o(g4)e
+Fu(\(?1\)\)\)\))374 1601 y(\()p Fh(OP)p 465 1601 V 18
+w(SELECT)i(?op)p 755 1601 V 18 w(ar)o(g1)e Fu(\(\()p
+Fh(OP)p 990 1601 V 18 w(MA)-6 b(T)19 b(?op)p 1203 1601
+V 18 w(ar)o(g2)e Fu(\(?1\)\)\)\))h Ft(\000)-11 b(!)p
+Fu(!\()p Fh(OP)p 1727 1601 V 17 w(MA)-6 b(T)19 b(?op)p
+1939 1601 V 18 w(ar)o(g3)e Fu(\(\()p Fh(OP)p 2174 1601
+V 18 w(SELECT)i(op)p 2442 1601 V 18 w(ar)o(g4)e Fu(\(?1\)\)\)\))374
+1688 y(\()p Fh(OP)p 465 1688 V 18 w(SELECT)i(?op)p 755
+1688 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 1688 V 18
+w(UNNEST)h(?op)p 1294 1688 V 18 w(ar)o(g2)f Fu(\(?1\)\)\)\))h
+Ft(\000)-11 b(!)18 b Fu(\()p Fh(OP)p 1818 1688 V 18 w(UNNEST)g(?op)p
+2122 1688 V 18 w(ar)o(g3)f Fu(\(\()p Fh(OP)p 2357 1688
+V 17 w(SELECT)j(op)p 2625 1688 V 17 w(ar)o(g4)e Fu(\(?1\)\)\)\))374
+1775 y(\()p Fh(OP)p 465 1775 V 18 w(MA)-6 b(T)19 b(?op)p
+678 1775 V 17 w(ar)o(g1)f Fu(\(?1\)\))g Ft(\000)-11 b(!)18
+b Fu(\()p Fh(OP)p 1154 1775 V 17 w(JOIN)g(?op)p 1369
+1775 V 18 w(ar)o(g2)f Fu(\(?1)h(\()p Fh(OP)p 1681 1775
+V 17 w(GET)h(?op)p 1885 1775 V 18 w(ar)o(g3)e Fu(\(\)\)\)\))374
+1863 y(\()p Fh(OP)p 465 1863 V 18 w(SELECT)i(?op)p 755
+1863 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 1863 V 18
+w(JOIN)g(?op)p 1205 1863 V 18 w(ar)o(g2)h Fu(\(?1)g(?2\)\)\)\))f
+Ft(\000)-10 b(!)17 b Fu(\()p Fh(OP)p 1806 1863 V 18 w(JOIN)g(?op)p
+2021 1863 V 18 w(ar)o(g3)h Fu(\(?1)g(\()p Fh(OP)p 2334
+1863 V 17 w(SELECT)h(op)p 2601 1863 V 18 w(ar)o(g4)f
+Fu(\(?2\)\)\)\))374 1950 y(\()p Fh(OP)p 465 1950 V 18
+w(SELECT)h(?op)p 755 1950 V 18 w(ar)o(g1)e Fu(\(\()p
+Fh(OP)p 990 1950 V 18 w(JOIN)g(?op)p 1205 1950 V 18 w(ar)o(g2)h
+Fu(\(?1)g(?2\)\)\)\))f Ft(\000)-10 b(!)17 b Fu(\()p Fh(OP)p
+1806 1950 V 18 w(JOIN)g(?op)p 2021 1950 V 18 w(ar)o(g3)h
+Fu(\(\()p Fh(OP)p 2257 1950 V 17 w(SELECT)i(op)p 2525
+1950 V 17 w(ar)o(g4)e Fu(\(?1\)\))f(?2\)\))374 2037 y(\()p
+Fh(OP)p 465 2037 V 18 w(JOIN)g(?op)p 680 2037 V 18 w(ar)o(g1)h
+Fu(\(?1)f(\()p Fh(OP)p 992 2037 V 18 w(MA)-6 b(T)19 b(?op)p
+1205 2037 V 18 w(ar)o(g2)e Fu(\(?2\)\)\)\))h Ft(\000)-11
+b(!)18 b Fu(\()p Fh(OP)p 1729 2037 V 17 w(MA)-6 b(T)19
+b(?op)p 1941 2037 V 18 w(ar)o(g3)e Fu(\(\()p Fh(OP)p
+2176 2037 V 18 w(JOIN)h(op)p 2370 2037 V 17 w(ar)o(g4)g
+Fu(\(?1)g(?2\)\)\)\))374 2124 y(\()p Fh(OP)p 465 2124
+V 18 w(JOIN)f(?op)p 680 2124 V 18 w(ar)o(g1)h Fu(\(\()p
+Fh(OP)p 916 2124 V 17 w(SELECT)h(?op)p 1205 2124 V 18
+w(ar)o(g2)f Fu(\(?1\)\))f(?2\)\))h Ft(\000)-10 b(!)p
+Fu(!\()p Fh(OP)p 1807 2124 V 17 w(SELECT)19 b(?op)p 2096
+2124 V 18 w(ar)o(g3)e Fu(\(\()p Fh(OP)p 2331 2124 V 18
+w(JOIN)g(op)p 2524 2124 V 18 w(ar)o(g4)g Fu(\(?1)h(?2\)\)\)\))374
+2211 y(\()p Fh(OP)p 465 2211 V 18 w(MA)-6 b(T)19 b(?op)p
+678 2211 V 17 w(ar)o(g1)f Fu(\(\()p Fh(OP)p 913 2211
+V 17 w(JOIN)g(?op)p 1128 2211 V 18 w(ar)o(g2)f Fu(\(?1)h(?2\)\)\)\))g
+Ft(\000)-11 b(!)18 b Fu(\()p Fh(OP)p 1729 2211 V 17 w(JOIN)g(?op)p
+1944 2211 V 18 w(ar)o(g3)f Fu(\(\()p Fh(OP)p 2179 2211
+V 18 w(MA)-6 b(T)19 b(op)p 2370 2211 V 17 w(ar)o(g4)f
+Fu(\(?1\)\))f(?2\)\))374 2298 y(\()p Fh(OP)p 465 2298
+V 18 w(JOIN)g(?op)p 680 2298 V 18 w(ar)o(g1)h Fu(\(?1)f(?2\)\))h
+Ft(\000)-10 b(!)p Fu(!\()p Fh(OP)p 1234 2298 V 17 w(JOIN)17
+b(?op)p 1448 2298 V 18 w(ar)o(g2)g Fu(\(?2)h(?1\)\))374
+2386 y(\()p Fh(OP)p 465 2386 V 18 w(SELECT)h(?op)p 755
+2386 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 2386 V 18
+w(SELECT)i(?op)p 1280 2386 V 18 w(ar)o(g2)e Fu(\(?1\)\)\)\))h
+Ft(\000)-10 b(!)p Fu(!\()p Fh(OP)p 1805 2386 V 17 w(SELECT)19
+b(?op)p 2094 2386 V 18 w(ar)o(g3)e Fu(\(\()p Fh(OP)p
+2329 2386 V 18 w(SELECT)i(op)p 2597 2386 V 18 w(ar)o(g4)e
+Fu(\(?1\)\)\)\))374 2473 y(\()p Fh(OP)p 465 2473 V 18
+w(MA)-6 b(T)19 b(?op)p 678 2473 V 17 w(ar)o(g1)f Fu(\(\()p
+Fh(OP)p 913 2473 V 17 w(MA)-6 b(T)19 b(?op)p 1125 2473
+V 18 w(ar)o(g2)e Fu(\(?1\)\)\)\))h Ft(\000)-10 b(!)p
+Fu(!\()p Fh(OP)p 1650 2473 V 17 w(MA)k(T)18 b(?op)p 1861
+2473 V 18 w(ar)o(g3)g Fu(\(\()p Fh(OP)p 2097 2473 V 17
+w(MA)-6 b(T)19 b(op)p 2287 2473 V 18 w(ar)o(g4)e Fu(\(?1\)\)\)\))374
+2560 y(\()p Fh(OP)p 465 2560 V 18 w(SELECT)i(?op)p 755
+2560 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 2560 V 18
+w(SELECT)i(?op)p 1280 2560 V 18 w(ar)o(g2)e Fu(\(?1\)\)\)\))h
+Ft(\000)-10 b(!)p Fu(!\()p Fh(OP)p 1805 2560 V 17 w(SELECT)19
+b(?op)p 2094 2560 V 18 w(ar)o(g3)e Fu(\(?1\)\))374 2647
+y(\()p Fh(OP)p 465 2647 V 18 w(JOIN)g(?op)p 680 2647
+V 18 w(ar)o(g1)h Fu(\(\()p Fh(OP)p 916 2647 V 17 w(JOIN)g(?op)p
+1131 2647 V 18 w(ar)o(g2)f Fu(\(?1)h(?2\)\))g(?3\)\))g
+Ft(\000)-11 b(!)18 b Fu(\()p Fh(OP)p 1809 2647 V 17 w(JOIN)g(?op)p
+2024 2647 V 18 w(ar)o(g3)f Fu(\(?1)h(\()p Fh(OP)p 2336
+2647 V 17 w(JOIN)g(op)p 2529 2647 V 18 w(ar)o(g4)f Fu(\(?2)h
+(?3\)\)\)\))374 2734 y(\()p Fh(OP)p 465 2734 V 18 w(MA)-6
+b(T)19 b(?op)p 678 2734 V 17 w(ar)o(g1)f Fu(\(\()p Fh(OP)p
+913 2734 V 17 w(MA)-6 b(T)19 b(?op)p 1125 2734 V 18 w(ar)o(g2)e
+Fu(\(?1\)\)\)\))h Ft(\000)-10 b(!)17 b Fu(\()p Fh(OP)p
+1649 2734 V 18 w(MA)-6 b(T)19 b(?op)p 1862 2734 V 17
+w(ar)o(g3)f Fu(\(?1\)\))374 2821 y(\()p Fh(OP)p 465 2821
+V 18 w(JOIN)f(?op)p 680 2821 V 18 w(ar)o(g1)h Fu(\(?1)f(?2\)\))h
+Ft(\000)-10 b(!)p Fu(!\()p Fh(OP)p 1234 2821 V 17 w(JOIN)17
+b(?op)p 1448 2821 V 18 w(ar)o(g2)g Fu(\(?2)h(?1\)\))374
+3019 y FI(Implementation)24 b(rules)374 3107 y Fu(\()p
+Fh(OP)p 465 3107 V 18 w(JOIN)17 b(?op)p 680 3107 V 18
+w(ar)o(g1)h Fu(\(?1)f(?2\)\))h Ft(\000)-10 b(!)17 b Fu(\()p
+Fh(Al)p 1219 3107 V 18 w(hh)p 1287 3107 V 18 w(join)g(?al)p
+1458 3107 V 18 w(ar)o(g1)g Fu(\(?1)h(?2\)\))374 3194
+y(\()p Fh(OP)p 465 3194 V 18 w(JOIN)f(?op)p 680 3194
+V 18 w(ar)o(g1)h Fu(\(?1)f(\()p Fh(OP)p 992 3194 V 18
+w(GET)i(?op)p 1197 3194 V 17 w(ar)o(g2)f Fu(\(\)\)\)\))f
+Ft(\000)-10 b(!)17 b Fu(\()p Fh(Al)p 1647 3194 V 18 w(ptr)p
+1721 3194 V 17 w(hh)p 1788 3194 V 18 w(join)g(?al)p 1959
+3194 V 18 w(ar)o(g1)g Fu(\(?1\)\))374 3281 y(\()p Fh(OP)p
+465 3281 V 18 w(SELECT)i(?op)p 755 3281 V 18 w(ar)o(g1)e
+Fu(\(?1\)\))h Ft(\000)-10 b(!)17 b Fu(\()p Fh(Al)p 1217
+3281 V 18 w(\256lter)g(?al)p 1405 3281 V 18 w(ar)o(g1)g
+Fu(\(?1\)\))374 3368 y(\()p Fh(OP)p 465 3368 V 18 w(MA)-6
+b(T)19 b(?op)p 678 3368 V 17 w(ar)o(g1)f Fu(\(?1\)\))g
+Ft(\000)-11 b(!)18 b Fu(\()p Fh(Al)p 1140 3368 V 17 w(assembly)g(?al)p
+1418 3368 V 18 w(ar)o(g1)g Fu(\(?1\)\))374 3455 y(\()p
+Fh(OP)p 465 3455 V 18 w(GET)g(?op)p 669 3455 V 18 w(ar)o(g1)f
+Fu(\(\)\))h Ft(\000)-11 b(!)18 b Fu(\()p Fh(Al)p 1072
+3455 V 18 w(\256le)p 1154 3455 V 17 w(scan)h(?al)p 1336
+3455 V 18 w(ar)o(g1)e Fu(\(\)\))374 3542 y(\()p Fh(OP)p
+465 3542 V 18 w(UNNEST)h(?op)p 769 3542 V 18 w(ar)o(g1)f
+Fu(\(?1\)\))h Ft(\000)-11 b(!)18 b Fu(\()p Fh(Al)p 1231
+3542 V 18 w(unnest)f(?al)p 1454 3542 V 18 w(ar)o(g1)h
+Fu(\(?1\)\))374 3630 y(\()p Fh(OP)p 465 3630 V 18 w(PROJECT)h(?op)p
+783 3630 V 18 w(ar)o(g1)e Fu(\(?1\)\))h Ft(\000)-11 b(!)18
+b Fu(\()p Fh(Al)p 1245 3630 V 18 w(project)f(?al)p 1477
+3630 V 18 w(ar)o(g1)g Fu(\(?1\)\))374 3717 y(\()p Fh(OP)p
+465 3717 V 18 w(SELECT)i(?op)p 755 3717 V 18 w(ar)o(g1)e
+Fu(\(\()p Fh(OP)p 990 3717 V 18 w(MA)-6 b(T)19 b(?op)p
+1203 3717 V 18 w(ar)o(g2)e Fu(\(\()p Fh(OP)p 1438 3717
+V 17 w(GET)i(?op)p 1642 3717 V 18 w(ar)o(g3)e Fu(\(\)\)\)\)\)\))h
+Ft(\000)-11 b(!)18 b Fu(\()p Fh(Al)p 2141 3717 V 17 w(index)p
+2269 3717 V 18 w(scan)g(?al)p 2451 3717 V 18 w(ar)o(g1)f
+Fu(\(\)\))374 3804 y(\()p Fh(OP)p 465 3804 V 18 w(SELECT)i(?op)p
+755 3804 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 3804
+V 18 w(GET)h(?op)p 1194 3804 V 18 w(ar)o(g2)g Fu(\(\)\)\)\))f
+Ft(\000)-11 b(!)18 b Fu(\()p Fh(Al)p 1645 3804 V 18 w(index)p
+1774 3804 V 17 w(scan)h(?al)p 1956 3804 V 18 w(ar)o(g1)e
+Fu(\(\)\))p 3557 3916 4 2665 v 323 3919 3237 4 v 3558
+3936 19 2672 v 340 3936 3237 19 v 913 4132 a FP(Figure)24
+b(C.1:)31 b(V)-12 b(olcano)25 b(rules)f(for)g(the)g(Open)f(OODB)e
+(optimizer)1884 5349 y(1)m(10)p eop
+%%Page: 111 123
+111 122 bop 323 958 3237 4 v 323 4209 4 3251 v 374 1046
+a FI(T)-7 b(ransformation)25 b(rules)374 1133 y Fh(OP)p
+441 1133 15 4 v 18 w(SELECT)q Fu(\()p Fn(S)700 1143 y
+Fg(1)733 1133 y Fu(\))17 b(:)g Fm(D)861 1143 y Fa(2)915
+1133 y Fu(=)-11 b Ft(\))17 b Fh(PR)p 1093 1133 V 18 w(SELECT)r
+Fu(\()p Fh(PR)p 1379 1133 V 18 w(ASSEMBL)-5 b(Y)q Fu(\()p
+Fn(S)1717 1143 y Fg(1)1749 1133 y Fu(\))17 b(:)h Fm(D)1878
+1143 y Fa(3)1913 1133 y Fu(\))g(:)f Fm(D)2042 1143 y
+Fa(4)374 1221 y Fh(OP)p 441 1221 V 18 w(PROJECT)q Fu(\()p
+Fn(S)728 1231 y Fg(1)760 1221 y Fu(\))h(:)f Fm(D)889
+1231 y Fa(2)943 1221 y Fu(=)-11 b Ft(\))17 b Fh(PR)p
+1121 1221 V 18 w(PROJECT)q Fu(\()p Fh(PR)p 1434 1221
+V 18 w(ASSEMBL)-5 b(Y)q Fu(\()p Fn(S)1772 1231 y Fg(1)1804
+1221 y Fu(\))18 b(:)f Fm(D)1933 1231 y Fa(3)1969 1221
+y Fu(\))g(:)h Fm(D)2098 1231 y Fa(4)374 1308 y Fh(OP)p
+441 1308 V 18 w(JOIN)p Fu(\()p Fn(S)626 1318 y Fg(1)658
+1308 y Fn(;)10 b(S)725 1318 y Fg(2)757 1308 y Fu(\))18
+b(:)f Fm(D)886 1318 y Fa(3)940 1308 y Fu(=)-11 b Ft(\))17
+b Fh(PR)p 1118 1308 V 18 w(JOIN)p Fu(\()p Fh(PR)p 1329
+1308 V 18 w(ASSEMBL)-5 b(Y)q Fu(\()p Fn(S)1667 1318 y
+Fg(1)1699 1308 y Fu(\))17 b(:)h Fm(D)1828 1318 y Fa(4)1863
+1308 y Fn(;)11 b Fh(PR)p 1957 1308 V 18 w(ASSEMBL)-5
+b(Y)q Fu(\()p Fn(S)2295 1318 y Fg(2)2327 1308 y Fu(\))17
+b(:)h Fm(D)2456 1318 y Fa(5)2491 1308 y Fu(\))g(:)f Fm(D)2620
+1318 y Fa(6)374 1395 y Fh(OP)p 441 1395 V 18 w(MA)-6
+b(T)q Fu(\()p Fn(S)623 1405 y Fg(1)655 1395 y Fu(\))18
+b(:)f Fm(D)784 1405 y Fa(2)837 1395 y Fu(=)-11 b Ft(\))18
+b Fh(PR)p 1016 1395 V 18 w(MA)-6 b(T)q Fu(\()p Fh(PR)p
+1224 1395 V 18 w(ASSEMBL)h(Y)q Fu(\()p Fn(S)1562 1405
+y Fg(1)1594 1395 y Fu(\))17 b(:)h Fm(D)1723 1405 y Fa(3)1758
+1395 y Fu(\))g(:)f Fm(D)1887 1405 y Fa(4)374 1482 y Fh(OP)p
+441 1482 V 18 w(UNNEST)p Fu(\()p Fn(S)714 1492 y Fg(1)746
+1482 y Fu(\))h(:)f Fm(D)875 1492 y Fa(2)929 1482 y Fu(=)-11
+b Ft(\))17 b Fh(PR)p 1107 1482 V 18 w(UNNEST)q Fu(\()p
+Fh(PR)p 1407 1482 V 17 w(ASSEMBL)-5 b(Y)q Fu(\()p Fn(S)1744
+1492 y Fg(1)1776 1482 y Fu(\))18 b(:)f Fm(D)1905 1492
+y Fa(3)1941 1482 y Fu(\))h(:)f Fm(D)2070 1492 y Fa(4)374
+1569 y Fh(OP)p 441 1569 V 18 w(SELECT)q Fu(\()p Fn(S)700
+1579 y Fg(1)733 1569 y Fu(\))g(:)g Fm(D)861 1579 y Fa(2)915
+1569 y Fu(=)-11 b Ft(\))17 b Fh(OP)p 1096 1569 V 18 w(SELECT)r
+Fu(\()p Fh(OP)p 1385 1569 V 17 w(SELECT)r Fu(\()p Fn(S)1644
+1579 y Fg(1)1676 1569 y Fu(\))h(:)f Fm(D)1805 1579 y
+Fa(3)1841 1569 y Fu(\))g(:)h Fm(D)1970 1579 y Fa(4)374
+1656 y Fh(OP)p 441 1656 V 18 w(MA)-6 b(T)q Fu(\()p Fh(OP)p
+652 1656 V 18 w(SELECT)q Fu(\()p Fn(S)911 1666 y Fg(1)943
+1656 y Fu(\))18 b(:)f Fm(D)1072 1666 y Fa(2)1108 1656
+y Fu(\))h(:)f Fm(D)1237 1666 y Fa(3)1290 1656 y Fu(=)-11
+b Ft(\))18 b Fh(OP)p 1472 1656 V 18 w(SELECT)q Fu(\()p
+Fh(OP)p 1760 1656 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)1942
+1666 y Fg(1)1974 1656 y Fu(\))18 b(:)f Fm(D)2103 1666
+y Fa(4)2139 1656 y Fu(\))g(:)h Fm(D)2268 1666 y Fa(5)374
+1744 y Fh(OP)p 441 1744 V 18 w(SELECT)q Fu(\()p Fh(OP)p
+729 1744 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)911 1754 y Fg(1)943
+1744 y Fu(\))18 b(:)f Fm(D)1072 1754 y Fa(2)1108 1744
+y Fu(\))h(:)f Fm(D)1237 1754 y Fa(3)1290 1744 y Fu(=)-11
+b Ft(\))p Fu(!)17 b Fh(OP)p 1489 1744 V 18 w(MA)-6 b(T)q
+Fu(\()p Fh(OP)p 1700 1744 V 18 w(SELECT)q Fu(\()p Fn(S)1959
+1754 y Fg(1)1992 1744 y Fu(\))17 b(:)g Fm(D)2120 1754
+y Fa(4)2156 1744 y Fu(\))h(:)f Fm(D)2285 1754 y Fa(5)374
+1831 y Fh(OP)p 441 1831 V 18 w(SELECT)q Fu(\()p Fh(OP)p
+729 1831 V 18 w(UNNEST)p Fu(\()p Fn(S)1002 1841 y Fg(1)1035
+1831 y Fu(\))g(:)g Fm(D)1163 1841 y Fa(2)1199 1831 y
+Fu(\))h(:)f Fm(D)1328 1841 y Fa(3)1382 1831 y Fu(=)-11
+b Ft(\))17 b Fh(OP)p 1563 1831 V 18 w(UNNEST)p Fu(\()p
+Fh(OP)p 1865 1831 V 18 w(SELECT)r Fu(\()p Fn(S)2125 1841
+y Fg(1)2157 1831 y Fu(\))g(:)h Fm(D)2286 1841 y Fa(4)2321
+1831 y Fu(\))g(:)f Fm(D)2450 1841 y Fa(5)374 1918 y Fh(OP)p
+441 1918 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)623 1928 y Fg(1)655
+1918 y Fu(\))18 b(:)f Fm(D)784 1928 y Fa(2)837 1918 y
+Fu(=)-11 b Ft(\))18 b Fh(OP)p 1019 1918 V 18 w(JOIN)o
+Fu(\()p Fn(S)1203 1928 y Fg(1)1236 1918 y Fn(;)10 b Fh(OP)p
+1332 1918 V 18 w(GET)q Fu(\()p Fn(F)1507 1928 y Fg(3)1538
+1918 y Fu(\))18 b(:)f Fm(D)1667 1928 y Fa(4)1703 1918
+y Fu(\))h(:)f Fm(D)1832 1928 y Fa(5)374 2005 y Fh(OP)p
+441 2005 V 18 w(SELECT)q Fu(\()p Fh(OP)p 729 2005 V 18
+w(JOIN)p Fu(\()p Fn(S)914 2015 y Fg(1)946 2005 y Fn(;)11
+b(S)1014 2015 y Fg(2)1046 2005 y Fu(\))17 b(:)g Fm(D)1174
+2015 y Fa(3)1210 2005 y Fu(\))h(:)f Fm(D)1339 2015 y
+Fa(4)1393 2005 y Fu(=)-11 b Ft(\))17 b Fh(OP)p 1574 2005
+V 18 w(JOIN)p Fu(\()p Fn(S)1759 2015 y Fg(1)1791 2005
+y Fn(;)10 b Fh(OP)p 1887 2005 V 18 w(SELECT)r Fu(\()p
+Fn(S)2147 2015 y Fg(2)2179 2005 y Fu(\))17 b(:)h Fm(D)2308
+2015 y Fa(5)2343 2005 y Fu(\))g(:)f Fm(D)2472 2015 y
+Fa(6)374 2092 y Fh(OP)p 441 2092 V 18 w(SELECT)q Fu(\()p
+Fh(OP)p 729 2092 V 18 w(JOIN)p Fu(\()p Fn(S)914 2102
+y Fg(1)946 2092 y Fn(;)11 b(S)1014 2102 y Fg(2)1046 2092
+y Fu(\))17 b(:)g Fm(D)1174 2102 y Fa(3)1210 2092 y Fu(\))h(:)f
+Fm(D)1339 2102 y Fa(4)1393 2092 y Fu(=)-11 b Ft(\))17
+b Fh(OP)p 1574 2092 V 18 w(JOIN)p Fu(\()p Fh(OP)p 1788
+2092 V 17 w(SELECT)r Fu(\()p Fn(S)2047 2102 y Fg(1)2079
+2092 y Fu(\))h(:)f Fm(D)2208 2102 y Fa(5)2244 2092 y
+Fn(;)10 b(S)2311 2102 y Fg(2)2343 2092 y Fu(\))18 b(:)f
+Fm(D)2472 2102 y Fa(6)374 2180 y Fh(OP)p 441 2180 V 18
+w(JOIN)p Fu(\()p Fn(S)626 2190 y Fg(1)658 2180 y Fn(;)10
+b Fh(OP)p 754 2180 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)936
+2190 y Fg(2)968 2180 y Fu(\))18 b(:)f Fm(D)1097 2190
+y Fa(3)1133 2180 y Fu(\))h(:)f Fm(D)1262 2190 y Fa(4)1315
+2180 y Fu(=)-11 b Ft(\))18 b Fh(OP)p 1497 2180 V 17 w(MA)-6
+b(T)r Fu(\()p Fh(OP)p 1708 2180 V 17 w(JOIN)p Fu(\()p
+Fn(S)1892 2190 y Fg(1)1924 2180 y Fn(;)11 b(S)1992 2190
+y Fg(2)2024 2180 y Fu(\))17 b(:)h Fm(D)2153 2190 y Fa(5)2188
+2180 y Fu(\))g(:)f Fm(D)2317 2190 y Fa(6)374 2267 y Fh(OP)p
+441 2267 V 18 w(JOIN)p Fu(\()p Fn(S)626 2277 y Fg(1)658
+2267 y Fn(;)10 b Fh(OP)p 754 2267 V 18 w(SELECT)r Fu(\()p
+Fn(S)1014 2277 y Fg(2)1046 2267 y Fu(\))17 b(:)g Fm(D)1174
+2277 y Fa(3)1210 2267 y Fu(\))h(:)f Fm(D)1339 2277 y
+Fa(4)1393 2267 y Fu(=)-11 b Ft(\))p Fu(!)17 b Fh(OP)p
+1592 2267 V 17 w(SELECT)r Fu(\()p Fh(OP)p 1880 2267 V
+18 w(JOIN)p Fu(\()p Fn(S)2065 2277 y Fg(1)2097 2267 y
+Fn(;)10 b(S)2164 2277 y Fg(2)2196 2267 y Fu(\))18 b(:)f
+Fm(D)2325 2277 y Fa(5)2361 2267 y Fu(\))h(:)f Fm(D)2490
+2277 y Fa(6)374 2354 y Fh(OP)p 441 2354 V 18 w(MA)-6
+b(T)q Fu(\()p Fh(OP)p 652 2354 V 18 w(JOIN)o Fu(\()p
+Fn(S)836 2364 y Fg(1)869 2354 y Fn(;)10 b(S)936 2364
+y Fg(2)968 2354 y Fu(\))18 b(:)f Fm(D)1097 2364 y Fa(3)1133
+2354 y Fu(\))h(:)f Fm(D)1262 2364 y Fa(4)1315 2354 y
+Fu(=)-11 b Ft(\))18 b Fh(OP)p 1497 2354 V 17 w(JOIN)p
+Fu(\()p Fh(OP)p 1710 2354 V 18 w(MA)-6 b(T)q Fu(\()p
+Fn(S)1892 2364 y Fg(1)1924 2354 y Fu(\))18 b(:)f Fm(D)2053
+2364 y Fa(5)2089 2354 y Fn(;)10 b(S)2156 2364 y Fg(2)2188
+2354 y Fu(\))18 b(:)f Fm(D)2317 2364 y Fa(6)374 2441
+y Fh(OP)p 441 2441 V 18 w(JOIN)p Fu(\()p Fn(S)626 2451
+y Fg(1)658 2441 y Fn(;)10 b(S)725 2451 y Fg(2)757 2441
+y Fu(\))18 b(:)f Fm(D)886 2451 y Fa(3)940 2441 y Fu(=)-11
+b Ft(\))p Fu(!)17 b Fh(OP)p 1139 2441 V 17 w(JOIN)p Fu(\()p
+Fn(S)1323 2451 y Fg(2)1355 2441 y Fn(;)11 b(S)1423 2451
+y Fg(1)1455 2441 y Fu(\))18 b(:)f Fm(D)1584 2451 y Fa(4)374
+2528 y Fh(OP)p 441 2528 V 18 w(SELECT)q Fu(\()p Fh(OP)p
+729 2528 V 18 w(SELECT)r Fu(\()p Fn(S)989 2538 y Fg(1)1021
+2528 y Fu(\))g(:)h Fm(D)1150 2538 y Fa(2)1186 2528 y
+Fu(\))f(:)g Fm(D)1314 2538 y Fa(3)1368 2528 y Fu(=)-11
+b Ft(\))p Fu(!)17 b Fh(OP)p 1567 2528 V 18 w(SELECT)q
+Fu(\()p Fh(OP)p 1855 2528 V 18 w(SELECT)q Fu(\()p Fn(S)2114
+2538 y Fg(1)2147 2528 y Fu(\))g(:)g Fm(D)2275 2538 y
+Fa(4)2311 2528 y Fu(\))h(:)f Fm(D)2440 2538 y Fa(5)374
+2615 y Fh(OP)p 441 2615 V 18 w(MA)-6 b(T)q Fu(\()p Fh(OP)p
+652 2615 V 18 w(MA)g(T)q Fu(\()p Fn(S)834 2625 y Fg(1)866
+2615 y Fu(\))17 b(:)h Fm(D)995 2625 y Fa(2)1030 2615
+y Fu(\))g(:)f Fm(D)1159 2625 y Fa(3)1213 2615 y Fu(=)-11
+b Ft(\))p Fu(!)17 b Fh(OP)p 1412 2615 V 18 w(MA)-6 b(T)q
+Fu(\()p Fh(OP)p 1623 2615 V 17 w(MA)g(T)q Fu(\()p Fn(S)1804
+2625 y Fg(1)1837 2615 y Fu(\))17 b(:)g Fm(D)1965 2625
+y Fa(4)2001 2615 y Fu(\))h(:)f Fm(D)2130 2625 y Fa(5)374
+2703 y Fh(OP)p 441 2703 V 18 w(SELECT)q Fu(\()p Fh(OP)p
+729 2703 V 18 w(SELECT)r Fu(\()p Fn(S)989 2713 y Fg(1)1021
+2703 y Fu(\))g(:)h Fm(D)1150 2713 y Fa(2)1186 2703 y
+Fu(\))f(:)g Fm(D)1314 2713 y Fa(3)1368 2703 y Fu(=)-11
+b Ft(\))p Fu(!)17 b Fh(OP)p 1567 2703 V 18 w(SELECT)q
+Fu(\()p Fn(S)1826 2713 y Fg(1)1858 2703 y Fu(\))h(:)f
+Fm(D)1987 2713 y Fa(4)374 2790 y Fh(OP)p 441 2790 V 18
+w(JOIN)p Fu(\()p Fh(OP)p 655 2790 V 17 w(JOIN)p Fu(\()p
+Fn(S)839 2800 y Fg(1)871 2790 y Fn(;)11 b(S)939 2800
+y Fg(2)971 2790 y Fu(\))18 b(:)f Fm(D)1100 2800 y Fa(4)1136
+2790 y Fn(;)10 b(S)1203 2800 y Fg(3)1235 2790 y Fu(\))18
+b(:)f Fm(D)1364 2800 y Fa(5)1418 2790 y Fu(=)-11 b Ft(\))17
+b Fh(OP)p 1599 2790 V 18 w(JOIN)p Fu(\()p Fn(S)1784 2800
+y Fg(1)1816 2790 y Fn(;)10 b Fh(OP)p 1912 2790 V 18 w(JOIN)p
+Fu(\()p Fn(S)2097 2800 y Fg(2)2129 2790 y Fn(;)g(S)2196
+2800 y Fg(3)2228 2790 y Fu(\))18 b(:)f Fm(D)2357 2800
+y Fa(6)2393 2790 y Fu(\))h(:)f Fm(D)2522 2800 y Fa(7)374
+2877 y Fh(OP)p 441 2877 V 18 w(MA)-6 b(T)q Fu(\()p Fh(OP)p
+652 2877 V 18 w(MA)g(T)q Fu(\()p Fn(S)834 2887 y Fg(1)866
+2877 y Fu(\))17 b(:)h Fm(D)995 2887 y Fa(2)1030 2877
+y Fu(\))g(:)f Fm(D)1159 2887 y Fa(3)1213 2877 y Fu(=)-11
+b Ft(\))17 b Fh(OP)p 1394 2877 V 18 w(MA)-6 b(T)q Fu(\()p
+Fn(S)1576 2887 y Fg(1)1608 2877 y Fu(\))18 b(:)f Fm(D)1737
+2887 y Fa(4)374 2964 y Fh(OP)p 441 2964 V 18 w(JOIN)p
+Fu(\()p Fn(S)626 2974 y Fg(1)658 2964 y Fn(;)10 b(S)725
+2974 y Fg(2)757 2964 y Fu(\))18 b(:)f Fm(D)886 2974 y
+Fa(3)940 2964 y Fu(=)-11 b Ft(\))p Fu(!)17 b Fh(OP)p
+1139 2964 V 17 w(JOIN)p Fu(\()p Fn(S)1323 2974 y Fg(2)1355
+2964 y Fn(;)11 b(S)1423 2974 y Fg(1)1455 2964 y Fu(\))18
+b(:)f Fm(D)1584 2974 y Fa(4)374 3138 y FI(Implementation)24
+b(rules)374 3226 y Fh(PR)p 438 3226 V 18 w(JOIN)p Fu(\()p
+Fn(S)623 3236 y Fg(1)655 3226 y Fn(;)11 b(S)723 3236
+y Fg(2)755 3226 y Fu(\))17 b(:)h Fm(D)884 3236 y Fa(3)937
+3226 y Fu(=)-11 b Ft(\))18 b Fh(Al)p 1105 3226 V 17 w(hh)p
+1172 3226 V 18 w(join)p Fu(\()p Fn(S)1327 3236 y Fg(1)1376
+3226 y Fu(:)g Fm(D)1464 3236 y Fa(4)1499 3226 y Fn(;)11
+b(S)1567 3236 y Fg(2)1617 3226 y Fu(:)17 b Fm(D)1704
+3236 y Fa(5)1740 3226 y Fu(\))g(:)h Fm(D)1869 3236 y
+Fa(6)374 3313 y Fh(PR)p 438 3313 V 18 w(JOIN)p Fu(\()p
+Fn(S)623 3323 y Fg(1)655 3313 y Fn(;)11 b Fh(OP)p 752
+3313 V 17 w(GET)q Fu(\()p Fn(F)926 3323 y Fg(2)958 3313
+y Fu(\))18 b(:)f Fm(D)1087 3323 y Fa(3)1123 3313 y Fu(\))g(:)h
+Fm(D)1252 3323 y Fa(4)1305 3313 y Fu(=)-11 b Ft(\))18
+b Fh(Al)p 1473 3313 V 17 w(ptr)p 1546 3313 V 18 w(hh)p
+1614 3313 V 17 w(join)p Fu(\()p Fn(S)1768 3323 y Fg(1)1818
+3313 y Fu(:)f Fm(D)1905 3323 y Fa(6)1941 3313 y Fu(\))g(:)h
+Fm(D)2070 3323 y Fa(5)374 3400 y Fh(PR)p 438 3400 V 18
+w(SELECT)r Fu(\()p Fn(S)698 3410 y Fg(1)730 3400 y Fu(\))f(:)h
+Fm(D)859 3410 y Fa(2)912 3400 y Fu(=)-11 b Ft(\))18 b
+Fh(Al)p 1080 3400 V 17 w(\256lter)p Fu(\()p Fn(S)1251
+3410 y Fg(1)1300 3400 y Fu(:)g Fm(D)1388 3410 y Fa(4)1423
+3400 y Fu(\))g(:)f Fm(D)1552 3410 y Fa(3)374 3487 y Fh(PR)p
+438 3487 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)620 3497 y Fg(1)652
+3487 y Fu(\))18 b(:)f Fm(D)781 3497 y Fa(2)835 3487 y
+Fu(=)-11 b Ft(\))17 b Fh(Al)p 1002 3487 V 18 w(assembly)p
+Fu(\()p Fn(S)1264 3497 y Fg(1)1314 3487 y Fu(:)g Fm(D)1401
+3497 y Fa(4)1437 3487 y Fu(\))h(:)f Fm(D)1566 3497 y
+Fa(3)374 3574 y Fh(OP)p 441 3574 V 18 w(GET)q Fu(\()p
+Fn(F)616 3584 y Fg(1)648 3574 y Fu(\))g(:)g Fm(D)776
+3584 y Fa(2)830 3574 y Fu(=)-11 b Ft(\))18 b Fh(Al)p
+998 3574 V 17 w(\256le)p 1079 3574 V 18 w(scan)p Fu(\()p
+Fn(F)1245 3584 y Fg(1)1277 3574 y Fu(\))g(:)f Fm(D)1406
+3584 y Fa(3)374 3661 y Fh(PR)p 438 3661 V 18 w(UNNEST)q
+Fu(\()p Fn(S)712 3671 y Fg(1)744 3661 y Fu(\))g(:)g Fm(D)872
+3671 y Fa(2)926 3661 y Fu(=)-11 b Ft(\))18 b Fh(Al)p
+1094 3661 V 17 w(unnest)p Fu(\()p Fn(S)1300 3671 y Fg(1)1350
+3661 y Fu(:)f Fm(D)1437 3671 y Fa(4)1473 3661 y Fu(\))h(:)f
+Fm(D)1602 3671 y Fa(3)374 3749 y Fh(PR)p 438 3749 V 18
+w(PROJECT)q Fu(\()p Fn(S)725 3759 y Fg(1)757 3749 y Fu(\))h(:)f
+Fm(D)886 3759 y Fa(2)940 3749 y Fu(=)-11 b Ft(\))17 b
+Fh(Al)p 1107 3749 V 18 w(project)p Fu(\()p Fn(S)1323
+3759 y Fg(1)1372 3749 y Fu(:)g Fm(D)1459 3759 y Fa(4)1495
+3749 y Fu(\))h(:)f Fm(D)1624 3759 y Fa(3)374 3836 y Fh(PR)p
+438 3836 V 18 w(SELECT)r Fu(\()p Fh(PR)p 724 3836 V 18
+w(MA)-6 b(T)q Fu(\()p Fh(OP)p 935 3836 V 17 w(GET)q Fu(\()p
+Fn(F)1109 3846 y Fg(1)1141 3836 y Fu(\))18 b(:)f Fm(D)1270
+3846 y Fa(2)1306 3836 y Fu(\))h(:)f Fm(D)1435 3846 y
+Fa(3)1471 3836 y Fu(\))g(:)g Fm(D)1599 3846 y Fa(4)1653
+3836 y Fu(=)-11 b Ft(\))18 b Fh(Al)p 1821 3836 V 17 w(index)p
+1949 3836 V 18 w(scan)p Fu(\()p Fn(F)2115 3846 y Fg(1)2147
+3836 y Fu(\))g(:)f Fm(D)2276 3846 y Fa(5)374 3923 y Fh(PR)p
+438 3923 V 18 w(SELECT)r Fu(\()p Fh(OP)p 727 3923 V 17
+w(GET)q Fu(\()p Fn(F)901 3933 y Fg(1)933 3923 y Fu(\))h(:)f
+Fm(D)1062 3933 y Fa(2)1098 3923 y Fu(\))h(:)f Fm(D)1227
+3933 y Fa(3)1280 3923 y Fu(=)-11 b Ft(\))18 b Fh(Al)p
+1448 3923 V 18 w(index)p 1577 3923 V 17 w(scan)q Fu(\()p
+Fn(F)1743 3933 y Fg(1)1775 3923 y Fu(\))f(:)h Fm(D)1904
+3933 y Fa(4)374 4010 y Fh(PR)p 438 4010 V 18 w(ASSEMBL)-5
+b(Y)q Fu(\()p Fn(S)776 4020 y Fg(1)808 4010 y Fu(\))18
+b(:)f Fm(D)937 4020 y Fa(2)990 4010 y Fu(=)-11 b Ft(\))18
+b Fh(Null)o Fu(\()p Fn(S)1255 4020 y Fg(1)1305 4010 y
+Fu(:)f Fm(D)1392 4020 y Fa(3)1428 4010 y Fu(\))h(:)f
+Fm(D)1557 4020 y Fa(4)374 4097 y Fh(PR)p 438 4097 V 18
+w(ASSEMBL)-5 b(Y)q Fu(\()p Fn(S)776 4107 y Fg(1)808 4097
+y Fu(\))18 b(:)f Fm(D)937 4107 y Fa(2)990 4097 y Fu(=)-11
+b Ft(\))18 b Fh(Enf)p 1180 4097 V 18 w(assembly)p Fu(\()p
+Fn(S)1442 4107 y Fg(1)1492 4097 y Fu(:)f Fm(D)1579 4107
+y Fa(3)1615 4097 y Fu(\))h(:)f Fm(D)1744 4107 y Fa(4)p
+3557 4209 4 3251 v 323 4212 3237 4 v 3558 4229 19 3258
+v 340 4229 3237 19 v 940 4425 a FP(Figure)24 b(C.2:)31
+b(Prairie)24 b(rules)g(for)g(the)g(Open)f(OODB)e(optimizer)1885
+5349 y(1)m(1)m(1)p eop
+%%Page: 112 124
+112 123 bop 318 1414 3247 4 v 318 3754 4 2340 v 386 1489
+a Fv(\()p FF(OP)p 502 1489 20 4 v 24 w(JOIN)19 b(?op)p
+784 1489 V 25 w(ar)o(g1)i Fv(\(?1)f(\()p FF(OP)p 1173
+1489 V 24 w(MA)-7 b(T)19 b(?op)p 1452 1489 V 25 w(ar)o(g2)h
+Fv(\(?2\)\)\)\))j FB(\000)-12 b(!)19 b Fv(\()p FF(OP)p
+2084 1489 V 24 w(MA)-7 b(T)19 b(?op)p 2363 1489 V 25
+w(ar)o(g3)h Fv(\(\()p FF(OP)p 2663 1489 V 25 w(JOIN)g(op)p
+2918 1489 V 24 w(ar)o(g4)g Fv(\(?1)h(?2\)\)\)\))16 b
+FF(\(C.1\))386 1568 y(\045cond)p 573 1568 V 25 w(code)386
+1647 y FB(ff)601 1725 y FF(1.)22 b(if)c Fv(\()p FF(dependent)p
+1032 1725 V 27 w(mat)p 1158 1725 V 24 w(and)p 1277 1725
+V 25 w(pred)q Fv(\()p FF(?op)p 1542 1725 V 26 w(ar)o(g2)p
+Fs(;)12 b FF(?op)p 1811 1725 V 25 w(ar)o(g1)p Fs(;)g
+FF(PRED)p 2154 1725 V 23 w(DEPENDS)p 2477 1725 V 23 w(ON)p
+2596 1725 V 24 w(MA)-7 b(T)o Fv(\))20 b(==)g FF(TRUE)o
+Fv(\))736 1804 y FF(REJECT)c Fv(;)386 1883 y FB(gg)386
+1962 y FF(\045appl)p 558 1962 V 25 w(code)386 2041 y
+FB(ff)601 2120 y FF(2.)22 b(copy)p 805 2120 V 25 w(operator)p
+1049 2120 V 27 w(ar)o(g)p Fv(\()p FF(?op)p 1281 2120
+V 25 w(ar)o(g4)q Fs(;)12 b FF(?op)p 1550 2120 V 24 w(ar)o(g1)q
+Fv(\))17 b(;)601 2199 y FF(3.)22 b(copy)p 805 2199 V
+25 w(operator)p 1049 2199 V 27 w(ar)o(g)p Fv(\()p FF(?op)p
+1281 2199 V 25 w(ar)o(g3)q Fs(;)12 b FF(?op)p 1550 2199
+V 24 w(ar)o(g2)q Fv(\))17 b(;)386 2278 y FB(gg)1702 2428
+y Fy(\(a\))h(V)-10 b(olcano)21 b(rule)p 369 2527 3146
+4 v 374 2577 a FF(OP)p 463 2577 20 4 v 24 w(JOIN)p Fv(\()p
+Fs(S)697 2586 y Fu(1)732 2577 y Fs(;)11 b FF(OP)p 852
+2577 V 24 w(MA)-7 b(T)o Fv(\()p Fs(S)1082 2586 y Fu(2)1117
+2577 y Fv(\))20 b(:)f Fo(D)1265 2586 y Fm(3)1304 2577
+y Fv(\))h(:)g Fo(D)1453 2586 y Fm(4)1511 2577 y Fv(=)-12
+b FB(\))19 b FF(OP)p 1733 2577 V 24 w(MA)-7 b(T)o Fv(\()p
+FF(OP)p 2009 2577 V 25 w(JOIN)p Fv(\()p Fs(S)2244 2586
+y Fu(1)2279 2577 y Fs(;)11 b(S)2353 2586 y Fu(2)2387
+2577 y Fv(\))20 b(:)g Fo(D)2536 2586 y Fm(5)2575 2577
+y Fv(\))g(:)f Fo(D)2723 2586 y Fm(6)3371 2577 y FF(\(C.2\))374
+2681 y FB(ff)374 2839 y(gg)374 2918 y FF(1.)j(dependent)p
+720 2918 V 27 w(mat)p 846 2918 V 25 w(and)p 966 2918
+V 24 w(pred)q Fv(\(&\()p Fo(D)1275 2927 y Fm(3)1315 2918
+y Fs(:)p FF(oa)p Fv(\))p Fs(;)12 b Fv(&\()p Fo(D)1600
+2927 y Fm(4)1640 2918 y Fs(:)p FF(oa)p Fv(\))p Fs(;)g
+FF(PRED)p 1955 2918 V 23 w(DEPENDS)p 2278 2918 V 23 w(ON)p
+2397 2918 V 24 w(MA)-7 b(T)o Fv(\)!)20 b(=)f FF(TRUE)374
+2997 y FB(ff)590 3075 y FF(2.)j(dcopy)q Fv(\()p Fo(D)913
+3084 y Fm(5)953 3075 y Fs(:)p FF(oa)p Fs(;)11 b Fo(D)1128
+3084 y Fm(4)1167 3075 y Fs(:)p FF(oa)q Fv(\))17 b(;)590
+3154 y FF(3.)22 b(dcopy)q Fv(\()p Fo(D)913 3163 y Fm(6)953
+3154 y Fs(:)p FF(oa)p Fs(;)11 b Fo(D)1128 3163 y Fm(3)1167
+3154 y Fs(:)p FF(oa)q Fv(\))17 b(;)590 3233 y FF(4.)22
+b(dcopy)q Fv(\()p Fo(D)913 3242 y Fm(6)953 3233 y Fs(:)p
+FF(lp)p Fs(;)11 b Fo(D)1117 3242 y Fm(4)1156 3233 y Fs(:)p
+FF(lp)q Fv(\);)590 3312 y FF(5.)22 b(init)p 753 3312
+V 25 w(descriptor)p 1041 3312 V 27 w(OP)p 1153 3312 V
+24 w(JOIN)p Fv(\(&\()p Fo(D)1488 3321 y Fm(5)1527 3312
+y Fv(\))p Fs(;)12 b Fv(&\()p Fo(D)1730 3321 y Fm(1)1770
+3312 y Fv(\))p Fs(;)f Fv(&\()p Fo(D)1972 3321 y Fm(2)2012
+3312 y Fv(\)\))17 b(;)374 3391 y FB(gg)434 3541 y Fy(\(b\))h(Prairie)f
+(rule)g(corresponding)j(to)e(the)g(rule)f(in)h(\(a\).)24
+b(Statement)17 b(numbers)i(correspond)h(to)d(the)h(same)g(numbered)434
+3633 y(statements)i(in)e(\(a\).)p 3562 3754 4 2340 v
+318 3757 3247 4 v 3564 3774 19 2347 v 335 3774 3247 19
+v 1070 3970 a FP(Figure)24 b(C.3:)31 b(Comparison)25
+b(of)e(an)h(Open)f(OODB)f(rule)1884 5349 y(1)m(12)p eop
+%%Page: 113 125
+113 124 bop 2441 1180 a FM(Bibliography)345 1681 y FP([1])47
+b(M.)22 b(M.)g(Astrahan)j(et)e(al.)33 b(System)23 b(R:)g(Relational)i
+(approach)h(to)d(database)i(management.)35 b FD(ACM)497
+1851 y(T)-5 b(ransactions)26 b(on)e(Database)h(Systems)p
+FP(,)g(1\(2\):97\261137,)h(June)f(1976.)345 2095 y([2])47
+b(Don)17 b(Batory)-6 b(.)21 b(Modeling)e(the)e(storage)i(architectures)
+i(of)16 b(commercial)j(database)g(systems.)j FD(ACM)497
+2264 y(T)-5 b(ransactions)26 b(on)e(Database)h(Systems)p
+FP(,)g(10\(4\):463\261528,)i(December)e(1985.)345 2508
+y([3])47 b(Don)25 b(Batory)-6 b(.)42 b(Extensible)27
+b(cost)f(models)g(and)f(query)h(optimization)i(in)d(GENESIS.)39
+b FD(Database)497 2678 y(Engineering)p FP(,)26 b(9\(4\):30\26136,)g
+(December)f(1986.)345 2922 y([4])47 b(Don)23 b(Batory)-6
+b(.)34 b(Building)25 b(blocks)g(of)f(database)h(management)h(systems.)
+34 b(T)-6 b(echnical)25 b(Report)f(TR)497 3091 y(87\26123,)h(The)e
+(University)i(of)f(T)-6 b(exas)23 b(at)h(Austin,)f(February)i(1988.)345
+3335 y([5])47 b(Don)17 b(Batory)-6 b(.)23 b(On)17 b(the)h(reusability)i
+(of)e(query)h(optimization)h(algorithms.)k FD(Information)c(Systems)p
+FP(,)497 3505 y(49\(1/3\),)25 b(1989.)345 3749 y([6])47
+b(Don)24 b(Batory)-6 b(.)40 b(The)25 b(Genesis)g(database)i(system)f
+(compiler:)35 b(User)24 b(manual.)41 b(T)-6 b(echnical)26
+b(Report)497 3918 y(TR)c(90\26127,)j(The)e(University)i(of)f(T)-6
+b(exas)23 b(at)g(Austin,)h(August)h(1990.)345 4162 y([7])47
+b(Don)28 b(Batory)-6 b(,)31 b(Lou)d(Coglianese,)k(Mark)c(Goodwin,)i
+(and)f(Steve)g(Shafer)-5 b(.)59 b(Creating)30 b(reference)497
+4332 y(architectures:)52 b(An)31 b(example)i(from)f(avionics.)78
+b(In)31 b FD(Pr)m(oceedings)k(Symposium)e(on)f(Softwar)m(e)497
+4501 y(Reusability)p FP(,)25 b(Seattle,)f(April)g(1995.)345
+4745 y([8])47 b(Don)24 b(Batory)h(and)g(Bart)f(Geraci.)37
+b(V)-10 b(alidating)26 b(component)g(compositions)i(in)c(software)h
+(system)497 4914 y(generators.)36 b(T)-6 b(echnical)25
+b(Report)f(TR)e(95\26103,)j(The)e(University)i(of)f(T)-6
+b(exas)23 b(at)h(Austin,)f(1995.)1884 5349 y(1)m(13)p
+eop
+%%Page: 114 126
+114 125 bop 345 391 a FP([9])47 b(Don)24 b(Batory)h(and)f(Sean)g
+(O'Malley)-6 b(.)37 b(The)24 b(design)h(and)g(implementation)i(of)d
+(hierarchical)j(soft-)497 561 y(ware)21 b(systems)h(with)f(reusable)i
+(components.)31 b FD(ACM)19 b(T)-5 b(ransactions)24 b(on)d(Softwar)m(e)
+i(Engineering)497 730 y(and)h(Methodology)p FP(,)i(1\(4\):355\261398,)i
+(October)c(1992.)300 974 y([10])47 b(Don)33 b(Batory)-6
+b(,)36 b(V)-5 b(ivek)34 b(Singhal,)i(Marty)e(Sirkin,)i(and)e(Jef)n(f)g
+(Thomas.)82 b(Scalable)35 b(software)f(li-)497 1144 y(braries.)60
+b(In)28 b FD(Pr)m(oceedings)j(1993)f(ACM)c(SIGSOFT)h(Confer)m(ence)p
+FP(,)32 b(pages)e(191\261199,)i(Los)c(An-)497 1313 y(geles,)c(December)
+g(1993.)303 1557 y([1)m(1])47 b(Don)38 b(Batory)-6 b(,)42
+b(V)-5 b(ivek)38 b(Singhal,)k(Jef)n(f)d(Thomas,)i(Sankar)e(Dasari,)j
+(Bart)c(Geraci,)j(and)e(Marty)497 1726 y(Sirkin.)28 b(The)19
+b(GenV)-12 b(oca)21 b(model)g(of)f(software-system)k(generators.)30
+b FD(IEEE)18 b(Softwar)m(e)p FP(,)k(1)m(1\(5\):89\261)497
+1896 y(94,)h(September)i(1994.)300 2140 y([12])47 b(Don)20
+b(Batory)h(and)g(Devang)g(V)-10 b(asavada.)28 b(Software)21
+b(components)i(for)d(object-oriented)25 b(database)497
+2309 y(systems.)30 b FD(International)25 b(Journal)f(of)d(Softwar)m(e)h
+(Engineering)i(and)e(Knowledge)h(Engineering)p FP(,)497
+2478 y(3\(2\):165\261192,)k(1993.)300 2723 y([13])47
+b(Dina)18 b(Bitton,)h(David)g(J.)e(DeW)l(itt,)j(and)e(Carolyn)h(T)m
+(urby\256ll.)24 b(Benchmarking)d(database)f(systems:)497
+2892 y(A)26 b(systematic)k(approach.)55 b(In)28 b FD(Pr)m(oceedings)h
+(9th)f(International)k(Confer)m(ence)d(on)f(V)-10 b(ery)27
+b(Lar)m(ge)497 3061 y(Data)c(Bases)p FP(,)h(pages)h(8\26119,)f
+(Florence,)h(November)f(1983.)300 3305 y([14])47 b(Dina)26
+b(Bitton)i(and)f(Carolyn)h(T)m(urby\256ll.)48 b(A)26
+b(retrospective)k(on)d(the)g(wisconsin)h(benchmark.)51
+b(In)497 3475 y(Michael)26 b(Stonebraker)l(,)i(editor)l(,)f
+FD(Readings)f(in)f(Database)i(Systems)p FP(.)e(Mor)n(gan)i(Kaufmann,)f
+(San)497 3644 y(Mateo,)e(second)h(edition,)g(1994.)300
+3888 y([15])47 b(Jos)617 3887 y(\302)612 3888 y(e)27
+b(A.)e(Blakeley)-6 b(,)29 b(W)l(illiam)e(J.)f(McKenna,)i(and)f(Goetz)g
+(Graefe.)49 b(Experiences)29 b(building)g(the)497 4058
+y(Open)17 b(OODB)d(query)19 b(optimizer)-5 b(.)22 b(In)17
+b FD(Pr)m(oceedings)i(1993)f(ACM)d(SIGMOD)g(International)21
+b(Con-)497 4227 y(fer)m(ence)k(on)e(Management)j(of)d(Data)p
+FP(,)h(pages)g(287\261296,)i(W)-7 b(ashington,)25 b(May)f(1993.)300
+4471 y([16])47 b(M.)25 b(W)-8 b(.)25 b(Blasgen)i(and)g(K.)e(P)-10
+b(.)25 b(Eswaran.)47 b(Storage)27 b(and)g(access)h(in)e(relational)j
+(data)e(bases.)48 b FD(IBM)497 4640 y(Systems)24 b(Journal)p
+FP(,)i(16\(4\):363\261377,)i(1977.)300 4884 y([17])47
+b(Michael)32 b(J.)e(Carey)-6 b(,)34 b(David)d(J.)f(DeW)l(itt,)j(Daniel)
+f(Frank,)h(Goetz)e(Graefe,)i(M.)d(Muralikrishna,)497
+5054 y(Joel)d(E.)e(Richardson,)k(and)e(Eugene)h(J.)d(Shekita.)49
+b(The)26 b(architecture)k(of)d(the)f(EXODUS)e(exten-)1884
+5349 y(1)m(14)p eop
+%%Page: 115 127
+115 126 bop 497 391 a FP(sible)29 b(DBMS.)55 b(In)28
+b FD(Pr)m(oceedings)j(International)h(W)-8 b(orkshop)30
+b(on)e(Object-Oriented)k(Database)497 561 y(Systems)p
+FP(,)24 b(pages)h(52\26165,)g(Asilomar)l(,)f(September)g(1986.)300
+805 y([18])47 b(Chin-Liang)22 b(Chang)e(and)h(Richard)g(Char)n(-T)m
+(ung)h(Lee.)27 b FD(Symbolic)21 b(Logic)g(and)g(Mechanical)h(The-)497
+974 y(or)m(em)h(Pr)m(oving)p FP(.)34 b(Academic)24 b(Press,)g(1973.)300
+1218 y([19])47 b(Thomas)26 b(Cormen,)g(Charles)g(Leiserson,)i(and)e
+(Ronald)g(Rivest.)45 b FD(Intr)m(oduction)29 b(to)c(Algorithms)p
+FP(.)497 1388 y(MIT)d(Press,)i(Cambridge,)g(1990.)300
+1632 y([20])47 b(Dean)30 b(Daniels,)j(Pat)d(Selinger)l(,)j(Laura)e
+(Haas,)g(Bruce)g(Lindsay)-6 b(,)33 b(C.)c(Mohan,)k(Adrian)e(W)-7
+b(alker)l(,)497 1801 y(and)24 b(Paul)f(W)l(ilms.)34 b(An)22
+b(introduction)28 b(to)23 b(distributed)k(query)e(compilation)h(in)d(R)
+3077 1768 y FB(\003)3116 1801 y FP(.)33 b(In)23 b FD(Pr)m(oceed-)497
+1970 y(ings)i(2nd)f(International)29 b(Confer)m(ence)d(on)e
+(Distributed)i(Databases)p FP(,)g(pages)g(291\261309,)g(Berlin,)497
+2140 y(September)e(1982.)300 2384 y([21])47 b(Dinesh)28
+b(Das)g(and)g(Don)f(Batory)-6 b(.)55 b(Prairie:)40 b(An)27
+b(algebraic)k(framework)d(for)g(rule)g(speci\256cation)497
+2553 y(in)f(query)i(optimizers.)55 b(In)28 b FD(Pr)m(oceedings)h(of)f
+(the)g(W)-8 b(orkshop)29 b(on)e(Database)i(Query)f(Optimizer)497
+2723 y(Generators)e(and)e(Rule-Based)h(Optimizers)p FP(,)f(pages)h
+(139\261154,)g(Dallas,)f(September)h(1993.)300 2967 y([22])47
+b(Dinesh)27 b(Das)e(and)i(Don)f(Batory)-6 b(.)47 b(Prairie:)37
+b(A)25 b(rule)i(speci\256cation)h(framework)g(for)e(query)h(opti-)497
+3136 y(mizers.)34 b(T)-6 b(echnical)25 b(Report)f(TR)e(94\26116,)i(The)
+f(University)j(of)d(T)-6 b(exas)24 b(at)f(Austin,)h(May)g(1994.)300
+3380 y([23])47 b(Dinesh)30 b(Das)e(and)i(Don)f(Batory)-6
+b(.)62 b(Prairie:)43 b(A)28 b(rule)h(speci\256cation)j(framework)e(for)
+g(query)g(op-)497 3549 y(timizers.)51 b(In)26 b FD(Pr)m(oceedings)k(1)
+-7 b(1th)28 b(International)i(Confer)m(ence)f(on)e(Data)g(Engineering)p
+FP(,)j(pages)497 3719 y(201\261210,)c(T)-6 b(aipei,)23
+b(March)h(1995.)300 3963 y([24])47 b(Leonidas)29 b(Fegaras,)h(David)e
+(Maier)l(,)h(and)g(T)m(im)d(Sheard.)56 b(Specifying)30
+b(rule-based)g(query)f(opti-)497 4132 y(mizers)e(in)f(a)g(re\257ective)
+i(framework.)49 b(In)26 b FD(Pr)m(oceedings)j(Thir)m(d)d(International)
+31 b(Confer)m(ence)d(on)497 4302 y(Deductive)21 b(and)e
+(Object-Oriented)k(Databases)p FP(,)e(pages)g(146\261168,)h(Phoenix,)f
+(December)e(1993.)300 4546 y([25])47 b(Johann)27 b(Christoph)f
+(Freytag.)42 b(A)24 b(rule-based)k(view)d(of)f(query)j(optimization.)43
+b(In)25 b FD(Pr)m(oceedings)497 4715 y(1987)i(ACM)e(SIGMOD)g
+(International)30 b(Confer)m(ence)e(on)f(Management)h(of)e(Data)p
+FP(,)h(pages)g(173\261)497 4884 y(180,)d(San)f(Francisco,)i(May)e
+(1987.)1884 5349 y(1)m(15)p eop
+%%Page: 116 128
+116 127 bop 300 391 a FP([26])47 b(E.)42 b(Gamma,)48
+b(R.)43 b(Helm,)48 b(R.)43 b(Johnson,)51 b(and)45 b(J.)e(Vlissides.)137
+b FD(Design)45 b(Patterns:)74 b(Micr)m(o-)497 561 y(Ar)m(chitectur)m
+(es)24 b(for)d(Reusable)i(Object-Oriented)i(Design)p
+FP(.)30 b(Addison-W)-7 b(esley)h(,)25 b(Reading,)d(1994.)300
+805 y([27])47 b(D.)20 b(Garlan)j(and)f(M.)f(Shaw)-6 b(.)29
+b(An)21 b(introduction)26 b(to)21 b(software)i(architecture.)34
+b(In)22 b(V)-12 b(.)20 b(Ambriloa)j(and)497 974 y(G.)k(T)-6
+b(ortora,)29 b(editors,)i FD(Advances)f(in)e(Softwar)m(e)i(Engineering)
+g(and)f(Knowledge)h(Engineering)p FP(,)497 1144 y(volume)24
+b(1.)f(W)-7 b(orld)24 b(Scienti\256c)g(Publishing)i(Company)-6
+b(,)24 b(1993.)300 1388 y([28])47 b(Goetz)24 b(Graefe.)34
+b FD(Rule-Based)24 b(Query)g(Optimization)i(in)d(Extensible)j(Database)
+f(Systems)p FP(.)34 b(PhD)497 1557 y(thesis,)24 b(University)i(of)d(W)l
+(isconsin\261Madison,)29 b(1987.)300 1801 y([29])47 b(Goetz)21
+b(Graefe.)28 b(Query)21 b(evaluation)j(techniques)f(for)e(lar)n(ge)h
+(databases.)31 b FD(ACM)18 b(Computing)k(Sur)n(-)497
+1970 y(veys)p FP(,)i(25\(2\):73\261170,)j(June)e(1993.)300
+2214 y([30])47 b(Goetz)18 b(Graefe)g(and)g(David)g(J.)f(DeW)l(itt.)22
+b(The)17 b(EXODUS)e(optimizer)k(generator)-5 b(.)24 b(In)18
+b FD(Pr)m(oceedings)497 2384 y(1987)27 b(ACM)e(SIGMOD)g(International)
+30 b(Confer)m(ence)e(on)f(Management)h(of)e(Data)p FP(,)h(pages)g
+(387\261)497 2553 y(394,)d(San)f(Francisco,)i(May)e(1987.)300
+2797 y([31])47 b(Goetz)23 b(Graefe)g(and)g(W)l(illiam)g(McKenna.)32
+b(The)22 b(V)-12 b(olcano)24 b(optimizer)g(generator:)33
+b(Extensibility)497 2967 y(and)25 b(ef)n(\256cient)g(search.)39
+b(In)24 b FD(Pr)m(oceedings)i(9th)f(International)j(Confer)m(ence)f(on)
+d(Data)g(Engineer)n(-)497 3136 y(ing)p FP(,)g(pages)g(209\261218,)i(V)
+-5 b(ienna,)23 b(April)h(1993.)300 3380 y([32])47 b(Jim)25
+b(Gray)-6 b(.)44 b FD(The)25 b(Benchmark)i(Handbook)g(for)f(Database)i
+(and)e(T)-5 b(ransaction)28 b(Pr)m(ocessing)g(Sys-)497
+3549 y(tems)p FP(.)33 b(Mor)n(gan)25 b(Kaufman,)f(San)f(Mateo,)g
+(second)j(edition,)f(1993.)300 3794 y([33])47 b(L.)14
+b(M.)h(Haas,)j(J.)d(C.)g(Freytag,)j(G.)c(M.)h(Lohman,)j(and)e(H.)f
+(Pirahesh.)21 b(Extensible)d(query)f(processing)497 3963
+y(in)30 b(Starburst.)65 b(Research)31 b(Report)g(RJ)e(6610,)j(IBM)c
+(Almaden)i(Research)i(Center)l(,)f(December)497 4132
+y(1988.)300 4376 y([34])47 b(Matthias)21 b(Jarke)g(and)g(J)1239
+4375 y(\310)1231 4376 y(ur)n(gen)h(Koch.)27 b(Query)21
+b(optimization)h(in)e(database)j(systems.)28 b FD(ACM)18
+b(Com-)497 4546 y(puting)25 b(Surveys)p FP(,)g(16\(2\):1)m(1)m
+(1\261152,)i(June)e(1984.)300 4790 y([35])47 b(W)-7 b(on)19
+b(Kim,)g(David)g(S.)f(Reiner)l(,)j(and)f(Don)f(S.)f(Batory)-6
+b(,)20 b(editors.)27 b FD(Query)20 b(Pr)m(ocessing)h(in)f(Database)497
+4959 y(Systems)p FP(.)34 b(Springer)n(-V)-10 b(erlag,)26
+b(1985.)1884 5349 y(1)m(16)p eop
+%%Page: 117 129
+117 128 bop 300 391 a FP([36])47 b(Guy)25 b(M.)f(Lohman.)42
+b(Grammar)n(-like)26 b(functional)j(rules)d(for)f(representing)k(query)
+d(optimization)497 561 y(alternatives.)42 b(In)25 b FD(Pr)m(oceedings)i
+(1988)e(ACM)e(SIGMOD)g(International)29 b(Confer)m(ence)d(on)f(Man-)497
+730 y(agement)g(of)e(Data)p FP(,)g(pages)i(18\26127,)g(Chicago,)f(June)
+h(1988.)300 959 y([37])47 b(Guy)26 b(M.)e(Lohman,)j(C.)e(Mohan,)i
+(Laura)f(M.)f(Haas,)h(Bruce)g(G.)f(Lindsay)-6 b(,)27
+b(Patricia)g(G.)e(Selinger)l(,)497 1128 y(Paul)d(F)-7
+b(.)21 b(W)l(ilms,)h(and)h(Dean)g(Daniels.)32 b(Query)23
+b(processing)i(in)d(R)2561 1095 y FB(\003)2600 1128 y
+FP(.)31 b(Research)24 b(Report)f(RJ)e(4272,)497 1297
+y(IBM)h(Research)j(Laboratory)-6 b(,)26 b(San)d(Jose,)h(April)f(1984.)
+300 1526 y([38])47 b(W)l(illiam)23 b(McKenna.)31 b FD(Ef\256cient)23
+b(Sear)m(ch)h(in)e(Extensible)i(Database)f(Query)g(Optimization:)33
+b(The)497 1696 y(Volcano)25 b(Optimizer)f(Generator)p
+FP(.)35 b(PhD)23 b(thesis,)h(University)i(of)d(Colorado)i(at)f(Boulder)
+l(,)g(1993.)300 1924 y([39])47 b(Gail)16 b(Mitchell,)j(Umeshwar)d
+(Dayal,)i(and)f(Stanley)h(B.)c(Zdonik.)21 b(Control)d(of)e(an)h
+(extensible)i(query)497 2094 y(optimizer:)31 b(A)19 b(planning-based)24
+b(approach.)29 b(In)20 b FD(Pr)m(oceedings)i(19th)e(International)k
+(Confer)m(ence)497 2263 y(on)g(V)-10 b(ery)23 b(Lar)m(ge)g(Data)h
+(Bases)p FP(,)f(pages)i(517\261528,)h(Dublin,)e(August)g(1993.)300
+2492 y([40])47 b(Gail)17 b(Mitchell,)i(Stanley)g(B.)c(Zdonik,)20
+b(and)d(Umeshwar)h(Dayal.)k(An)16 b(architecture)21 b(for)c(query)i
+(pro-)497 2661 y(cessing)j(in)e(persistent)j(object)f(stores.)29
+b(In)20 b FD(Pr)m(oceedings)j(of)d(the)g(Hawaii)h(International)j
+(Confer)n(-)497 2830 y(ence)g(on)g(System)g(Sciences)p
+FP(,)h(volume)g(II,)e(pages)i(787\261798,)g(January)h(1992.)300
+3059 y([41])47 b(Patrick)34 b(O'Neil.)81 b FD(Database:)52
+b(Principles,)38 b(Pr)m(ogramming,)e(and)e(Performance)p
+FP(.)83 b(Mor)n(gan)497 3228 y(Kaufmann,)24 b(San)f(Mateo,)h(1994.)300
+3457 y([42])47 b(W)-8 b(.)18 b(B.)g(Rubenstein,)k(M.)d(S.)f(Kubicar)l
+(,)j(and)f(R.)e(G.)g(G.)g(Cattell.)27 b(Benchmarking)22
+b(simple)e(database)497 3626 y(operations.)57 b(In)28
+b FD(Pr)m(oceedings)i(1987)f(ACM)c(SIGMOD)i(International)32
+b(Confer)m(ence)d(on)f(Man-)497 3796 y(agement)d(of)e(Data)p
+FP(,)g(pages)i(387\261394,)h(San)d(Francisco,)i(May)e(1987.)300
+4024 y([43])47 b(P)-10 b(.)19 b(Schwarz,)i(W)-8 b(.)20
+b(Chang,)h(J.)f(C.)g(Freytag,)i(G.)d(Lohman,)i(J.)g(McPherson,)h(C.)d
+(Mohan,)j(and)g(H.)d(Pi-)497 4194 y(rahesh.)49 b(Extensibility)29
+b(in)e(the)f(Starburst)i(database)h(system.)48 b(In)26
+b FD(Pr)m(oceedings)j(International)497 4363 y(W)-8 b(orkshop)26
+b(on)f(Object-Oriented)j(Database)f(Systems)p FP(,)f(pages)g(85\26192,)
+g(Asilomar)l(,)g(September)497 4533 y(1986.)300 4761
+y([44])47 b(Edward)25 b(Sciore)h(and)f(John)i(Sieg,)e(Jr)-5
+b(.)41 b(A)24 b(modular)j(query)f(optimizer)h(generator)-5
+b(.)44 b(In)25 b FD(Pr)m(oceed-)497 4931 y(ings)20 b(6th)g
+(International)k(Confer)m(ence)e(on)d(Data)h(Engineering)p
+FP(,)j(pages)e(146\261153,)h(Los)d(Angeles,)497 5100
+y(February)25 b(1990.)1884 5349 y(1)m(17)p eop
+%%Page: 118 130
+118 129 bop 300 391 a FP([45])47 b(P)-10 b(.)24 b(G.)h(Selinger)i(and)f
+(M.)f(Adiba.)45 b(Access)27 b(path)g(selection)h(in)e(distributed)j
+(data)d(base)h(manage-)497 561 y(ment)17 b(systems.)23
+b(In)17 b(Deen)g(and)g(Hammersly)-6 b(,)19 b(editors,)h
+FD(Pr)m(oceedings)f(International)i(Confer)m(ence)497
+730 y(on)j(Databases)p FP(,)h(pages)g(204\261215,)g(University)h(of)d
+(Aberdeen,)i(July)f(1980.)300 974 y([46])47 b(P)-10 b(.)17
+b(G.)g(Selinger)l(,)k(M.)c(M.)g(Astrahan,)k(D.)c(D.)g(Chamberlin,)k(R.)
+c(A.)g(Lorie,)i(and)g(T)-7 b(.)17 b(G.)h(Price.)24 b(Access)497
+1144 y(path)c(selection)j(in)c(a)h(relational)i(database)g(management)f
+(system.)28 b(In)19 b FD(Pr)m(oceedings)j(1979)f(ACM)497
+1313 y(SIGMOD)30 b(International)36 b(Confer)m(ence)d(on)f(Management)h
+(of)f(Data)p FP(,)h(pages)g(23\26134,)i(Boston,)497 1482
+y(May)23 b(1979.)300 1726 y([47])47 b(Michael)27 b(Stonebraker)l(,)i
+(Paul)d(M.)f(Aoki,)h(Robert)h(Devine,)g(W)l(itold)g(Litwin,)f(and)h
+(Michael)g(Ol-)497 1896 y(son.)35 b(Mariposa:)f(A)22
+b(new)i(architecture)j(for)d(distributed)j(data.)36 b(In)23
+b FD(Pr)m(oceedings)j(10th)f(Interna-)497 2065 y(tional)g(Confer)m
+(ence)g(on)f(Data)f(Engineering)p FP(,)j(pages)f(54\26165,)g(Houston,)f
+(February)h(1994.)300 2309 y([48])47 b(Michael)23 b(Stonebraker)l(,)i
+(Randy)e(Katz,)f(David)g(Patterson,)i(and)f(John)g(Ousterhout.)33
+b(The)22 b(design)497 2478 y(of)27 b(XPRS.)47 b(In)27
+b FD(Pr)m(oceedings)i(14th)f(International)j(Confer)m(ence)e(on)e(V)-10
+b(ery)26 b(Lar)m(ge)h(Data)g(Bases)p FP(,)497 2648 y(pages)e
+(318\261330,)g(Los)e(Angeles,)i(1988.)300 2892 y([49])47
+b(Michael)22 b(Stonebraker)i(and)e(Lawrence)f(A.)f(Rowe.)29
+b(The)20 b(design)j(of)e(Postgres.)31 b(In)21 b FD(Pr)m(oceedings)497
+3061 y(1986)27 b(ACM)e(SIGMOD)g(International)30 b(Confer)m(ence)e(on)f
+(Management)h(of)e(Data)p FP(,)h(pages)g(340\261)497
+3231 y(355,)d(W)-7 b(ashington,)25 b(May)f(1986.)300
+3475 y([50])47 b(David)27 b(L.)d(W)-7 b(ells,)27 b(Jos)1222
+3474 y(\302)1217 3475 y(e)g(A.)e(Blakeley)-6 b(,)28 b(and)e(Craig)h(W)
+-8 b(.)24 b(Thompson.)48 b(Architecture)29 b(of)d(an)g(open)497
+3644 y(object-oriented)k(database)e(management)f(system.)44
+b FD(IEEE)24 b(Computer)p FP(,)i(25\(10\):74\26182,)k(Octo-)497
+3813 y(ber)24 b(1992.)300 4058 y([51])47 b(C.)25 b(T)-7
+b(.)26 b(Y)-10 b(u)26 b(and)h(C.)f(C.)f(Chang.)51 b(Distributed)29
+b(query)f(processing.)53 b FD(ACM)25 b(Computing)k(Surveys)p
+FP(,)497 4227 y(16\(4\):399\261433,)f(December)c(1984.)1884
+5349 y(1)m(18)p eop
+%%Page: 119 131
+119 130 bop 3229 1180 a FM(V)-8 b(ita)300 1681 y FP(Dinesh)25
+b(Das)e(was)h(born)g(in)g(Kharagpur)l(,)i(India)f(on)f(August)h(4,)e
+(1967,)i(the)f(son)h(of)f(Joshi)h(Markandeya)300 1851
+y(Das)f(and)g(Annapurna)j(Das.)32 b(After)24 b(graduating)j(from)d
+(Central)h(School)g(in)f(1984,)h(he)g(entered)h(the)e(In-)298
+2020 y(dian)e(Institute)h(of)e(T)-6 b(echnology)g(,)24
+b(Kharagpur)l(,)g(where)d(he)h(received)h(the)f(degree)h(of)e(Bachelor)
+i(of)e(T)-6 b(ech-)295 2190 y(nology)20 b(in)f(Computer)h(Science)g
+(and)f(Engineering)i(with)e(honors)h(in)f(June)h(1988.)30
+b(In)19 b(September)h(1988,)300 2359 y(he)26 b(entered)i(the)e
+(Graduate)h(School)g(of)f(The)g(University)i(of)e(T)-6
+b(exas)26 b(at)f(Austin.)39 b(He)26 b(received)i(the)e(de-)300
+2528 y(gree)e(of)f(Master)h(of)f(Science)h(in)g(Computer)g(Sciences)g
+(from)g(The)f(University)i(of)e(T)-6 b(exas)23 b(at)h(Austin)g(in)300
+2698 y(December)g(1990.)300 3339 y(Permanent)h(Address:)32
+b(P)-10 b(.O.)21 b(Box)j(8734)1065 3509 y(Austin,)g(TX)e(78713)300
+3960 y(This)h(dissertation)k(was)c(typeset)j(with)d(L)1578
+3945 y FF(A)1613 3960 y FP(T)1654 3981 y(E)1697 3960
+y(X)14 b(2)1822 3974 y FH(")1868 3927 y Fv(1)1930 3960
+y FP(by)24 b(the)g(author)-5 b(.)p 300 4832 1320 4 v
+400 4886 a Fu(1)434 4917 y Fy(L)453 4901 y Fh(A)478 4917
+y Fy(T)512 4934 y(E)548 4917 y(X)11 b(2)650 4925 y Fq(")706
+4917 y Fy(is)17 b(an)g(extension)h(of)f(L)1261 4901 y
+Fh(A)1286 4917 y Fy(T)1320 4934 y(E)1355 4917 y(X.)24
+b(L)1471 4901 y Fh(A)1496 4917 y Fy(T)1530 4934 y(E)1565
+4917 y(X)16 b(is)h(a)f(collection)i(of)f(macros)g(for)g(T)2512
+4934 y(E)2547 4917 y(X.)24 b(T)2678 4934 y(E)2713 4917
+y(X)17 b(is)f(a)h(trademark)h(of)f(the)f(Amer)o(-)300
+5009 y(ican)22 b(Mathematical)h(Society)-5 b(.)35 b(The)22
+b(macros)g(used)h(in)f(formatting)g(this)g(dissertation)h(were)f
+(written)f(by)i(Dinesh)f(Das,)h(De-)300 5100 y(partment)c(of)g
+(Computer)h(Sciences,)f(The)f(University)i(of)f(T)-5
+b(exas)18 b(at)h(Austin.)1884 5349 y FP(1)m(19)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/macros/latex/contrib/utthesis/icde-11.ps b/macros/latex/contrib/utthesis/icde-11.ps
new file mode 100644
index 0000000000..2bc25582c5
--- /dev/null
+++ b/macros/latex/contrib/utthesis/icde-11.ps
@@ -0,0 +1,6724 @@
+%!PS-Adobe-2.0
+%%Creator: dvips 5.55 Copyright 1986, 1994 Radical Eye Software
+%%Title: paper.dvi
+%%CreationDate: Tue Oct 11 09:30:40 1994
+%%Pages: 10
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: Times-Roman Times-Italic Times-Bold Courier
+%%EndComments
+%DVIPSCommandLine: dvips -D 600 paper -o
+%DVIPSParameters: dpi=600, comments removed
+%DVIPSSource: TeX output 1994.10.11:0929
+%%BeginProcSet: tex.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]}
+if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage
+userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
+B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
+4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
+p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pstricks.pro
+% PostScript prologue for pstricks.tex.
+% Created 1993/3/12. Source file was pstricks.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@Dict 200 dict def tx@Dict begin
+/ADict 25 dict def
+/CM { matrix currentmatrix } bind def
+/SLW /setlinewidth load def
+/CLW /currentlinewidth load def
+/CP /currentpoint load def
+/ED { exch def } bind def
+/L /lineto load def
+/T /translate load def
+/Atan { /atan load stopped { pop pop 0 } if } def
+/Div { dup 0 eq { pop } { div } ifelse } def
+/NET { neg exch neg exch T } def
+/Pyth { dup mul exch dup mul add sqrt } def
+/PtoC { 2 copy cos mul 3 1 roll sin mul } def
+/PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def }
+def
+/PathLength { flattenpath /z 0 def { /y1 ED /x1 ED /y2 y1 def /x2 x1 def
+} { /y ED /x ED PathLength@ } {} { /y y2 def /x x2 def PathLength@ }
+pathforall z } def
+/STP { .996264 dup scale } def
+/STV { SDict begin normalscale end STP } def
+/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def
+PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y
+mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul
+/y ED x mul /x ED x 0 eq y 0 eq and { /x 1 def /y 1 def } if [ y x ] 1 a
+sub y mul setdash stroke } def
+/DotLine { /b PathLength def /a ED /z ED /y CLW def /z y z add def a 0 gt
+{ /b b a div def } { a 0 eq { /b b y sub def } { a -3 eq { /b b y add
+def } if } ifelse } ifelse [ 0 b b z Div round Div dup 0 le { pop 1 } if
+] a 0 gt { 0 } { y 2 div a -2 gt { neg } if } ifelse setdash 1
+setlinecap stroke } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap n { currentstrokeadjust == x1 y1 moveto x2 y1 L
+stroke /y1 y1 a add def } repeat grestore } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap systemdict /currentstrokeadjust known {
+currentstrokeadjust } { false } ifelse { /t { } def } { /t { transform
+0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }
+bind def } ifelse n { x1 y1 t moveto x2 y1 t L stroke /y1 y1 a add def }
+repeat grestore } def
+/BeginArrow { ADict begin /@mtrx CM def gsave 2 copy T 2 index sub neg
+exch 3 index sub exch Atan rotate newpath } def
+/EndArrow { @mtrx setmatrix CP grestore end } def
+/Arrow { CLW mul add dup 2 div /w ED mul dup /h ED mul /a ED { 0 h T 1 -1
+scale } if w neg h moveto 0 0 L w h L w neg a neg rlineto gsave fill
+grestore } def
+/Tbar { CLW mul add /z ED z -2 div CLW 2 div moveto z 0 rlineto stroke 0
+CLW moveto } def
+/Bracket { CLW mul add dup CLW sub 2 div /x ED mul CLW add /y ED /z CLW 2
+div def x neg y moveto x neg CLW 2 div L x CLW 2 div L x y L stroke 0
+CLW moveto } def
+/RoundBracket { CLW mul add dup 2 div /x ED mul /y ED /mtrx CM def 0 CLW
+2 div T x y mul 0 ne { x y scale } if 1 1 moveto .85 .5 .35 0 0 0
+curveto -.35 0 -.85 .5 -1 1 curveto mtrx setmatrix stroke 0 CLW moveto }
+def
+/Shadow { [ { /moveto load } { /lineto load } { /curveto load } {
+/closepath load } pathforall ] cvx newpath 3 1 roll T exec } def
+/SD { 0 360 arc fill } def
+/SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def
+/ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def
+/SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore }
+def
+/NArray { aload length 2 div dup dup cvi eq not { exch pop } if /n exch
+cvi def } def
+/NArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop } if
+f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def
+/Line { NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub
+def n { Lineto } repeat CP 4 2 roll ArrowB L pop pop } if } def
+/Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 }
+ifelse { pop } repeat a } def
+/CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq
+and { pop pop /n n 1 sub def } if } def
+/Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop }
+repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1
+ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1
+moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto
+Lineto pop pop closepath } ifelse } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1
+def CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp
+mul dy1 l0 c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos
+abs b exp a mul dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def
+/y2 y l0 dy mul m mul sub def /dx l1 dx mul m mul neg def /dy l1 dy mul
+m mul neg def } def
+/IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if }
+ifelse /a a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def }
+def
+/BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def
+/NC { CC x1 y1 x2 y2 x y curveto } def
+/EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def
+/BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def
+/NAC { x2 y2 x y curveto CC x1 y1 } def
+/EAC { x2 y2 x y ArrowB curveto pop pop } def
+/OpenCurve { NArray n 3 lt { n { pop pop } repeat } { BOC /n n 3 sub def
+n { NC } repeat EOC } ifelse } def
+/AltCurve { { false NArray n 2 mul 2 roll [ n 2 mul 3 sub 1 roll ] aload
+/Points ED n 2 mul -2 roll } { false NArray } ifelse n 4 lt { n { pop
+pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse } def
+/ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt {
+CheckClosed } if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC }
+repeat closepath pop pop } ifelse } def
+/EndDot { { /z DS def } { /z 0 def } ifelse /b ED 0 z DS SD b { 0 z DS
+CLW sub SD } if 0 DS z add CLW 4 div sub moveto } def
+/Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto
+x1 y1 lineto closepath } def
+/OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1
+y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div
+exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse
+/b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto
+x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath }
+ifelse } def
+/Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add
+/y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq {
+pop pop Rect } { OvalFrame } ifelse } def
+/Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1
+sub 3 div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA
+x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0
+y0 x0 2 mul x1 sub y1 ] def } def
+/Grid { /a 4 string def /b ED /d ED /n ED cvi dup 1 lt { pop 1 } if /c ED
+c div dup 0 eq { pop 1 } if /cy ED c div dup 0 eq { pop 1 } if /cx ED cy
+div cvi /y ED cx div cvi /x ED cy div cvi /y2 ED cx div cvi /x2 ED cy
+div cvi /y1 ED cx div cvi /x1 ED /h y2 y1 sub 0 gt { 1 } { -1 } ifelse
+def /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def b 0 gt { /z1 b 4 div CLW 2
+div add def /Helvetica findfont b scalefont setfont /b b .95 mul CLW 2
+div add def } if gsave n 0 gt { 1 setlinecap [ 0 cy n div ] 0 setdash }
+{ 2 setlinecap } ifelse /c x1 def /i 500 w mul x1 add def /e y cy mul
+def /f y1 cy mul def /g y2 cy mul def x1 cx mul 0 T { newpath 0 e moveto
+b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1} {z1 z2
+add neg} ifelse h 0 gt {b neg} {z1} ifelse rmoveto show grestore } if 0
+f moveto 0 g L stroke cx w mul 0 T c x2 eq c i eq or {exit} if /c c w
+add def } loop grestore gsave n 0 gt { 1 setlinecap [ 0 cx n div ] 0
+setdash } { 2 setlinecap } ifelse /c y1 def /i 500 h mul y1 add def /e x
+cx mul def /f x1 cx mul def /g x2 cx mul def 0 y1 cy mul T { newpath e 0
+moveto b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1 z2
+add neg} {z1} ifelse h 0 gt {z1} {b neg} ifelse rmoveto show grestore }
+if f 0 moveto g 0 L stroke 0 cy h mul T c y2 eq c i eq or {exit} if /c c
+h add def } loop grestore } def
+/ArcArrow { /d ED /b ED /a ED gsave newpath 0 -1000 moveto clip newpath 0
+1 0 0 b grestore c mul /e ED pop pop pop r a e d PtoC y add exch x add
+exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c
+mul neg d } def
+/Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def
+/Rot { CP CP translate 3 -1 roll neg rotate NET } def
+/PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def
+/PutBegin { /lmtrx [ tx@Dict /lmtrx known { lmtrx aload pop } if CM ] def
+CP 4 2 roll T moveto } def
+/PutEnd { CP /lmtrx [ lmtrx aload pop setmatrix ] def moveto } def
+/Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s
+abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b
+div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } {
+h1 abs h sub dup s mul abs } ifelse } def
+/UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s
+mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q
+{ x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add
+exch } def
+/BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { CP OLUnit T
+moveto /IfVisible true def } if } { IfVisible { CP OLUnit NET moveto
+/IfVisible false def } if } ifelse } def
+/InitOL { /OLUnit [ gsave CM STV 2890.79999 dup moveto setmatrix CP
+grestore ] cvx def /BOL { BeginOL } def /IfVisible true def } def
+end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pst-node.pro
+% PostScript prologue for pst-node.tex.
+% Created 1993/3/12. Source file was pst-node.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@NodeDict 200 dict def tx@NodeDict begin
+/NewNode { gsave /next ED dict dup 3 -1 roll ED begin tx@Dict begin STV
+CP T exec end /NodeMtrx CM def next end grestore } def
+/InitPnode { /Y ED /X ED /NodePos { Nodesep Cos mul Nodesep Sin mul } def
+} def
+/InitCnode { /r ED /Y ED /X ED /NodePos { Nodesep r add dup Cos mul exch
+Sin mul } def } def
+/GetRnodePos { Cos 0 gt { /dx r Nodesep add def } { /dx l Nodesep sub def
+} ifelse Sin 0 gt { /dy u Nodesep add def } { /dy d Nodesep sub def }
+ifelse dx Sin mul abs dy Cos mul abs gt { dy Cos mul Sin div dy } { dx
+dup Sin mul Cos Div } ifelse } def
+/InitRnode { /r ED r mul neg /l ED /r r l add def /X l neg def { neg /d
+ED /u ED /Y 0 def } { neg /Y ED Y sub /u ED u mul neg /d ED /u u d add
+def /Y Y d sub def } ifelse /NodePos { GetRnodePos } def } def
+/InitRNode { /Y ED /X ED /r ED /X r 2 div X add def /r r X sub def /l X
+neg def Y add neg /d ED Y sub /u ED /NodePos { GetRnodePos } def } def
+/GetOnodePos { /ww w Nodesep add def /hh h Nodesep add def Sin ww mul Cos
+hh mul Atan dup cos ww mul exch sin hh mul } def
+/GetCenter { begin X Y NodeMtrx transform CM itransform end } def
+/GetAngle { nodeA GetCenter nodeB GetCenter 3 -1 roll sub 3 1 roll sub
+neg Atan } def
+/GetEdge { begin /Nodesep ED dup 1 0 NodeMtrx dtransform CM idtransform
+exch atan sub dup sin /Sin ED cos /Cos ED NodePos Y add exch X add exch
+NodeMtrx transform CM itransform end 4 2 roll 1 index 0 eq { pop pop } {
+2 copy 5 2 roll cos mul add 4 1 roll sin mul sub exch } ifelse } def
+/GetPos { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED OffsetB
+AngleB NodesepB nodeB GetEdge /y2 ED /x2 ED } def
+/InitNC { /nodeB ED /nodeA ED /NodesepB ED /NodesepA ED /OffsetB ED
+/OffsetA ED tx@NodeDict nodeA known tx@NodeDict nodeB known and dup {
+/nodeA nodeA load def /nodeB nodeB load def } if } def
+/LineMP { 4 copy 1 t sub mul exch t mul add 3 1 roll 1 t sub mul exch t
+mul add exch 6 2 roll sub 3 1 roll sub Atan } def
+/NCCoor { GetAngle /AngleA ED /AngleB AngleA 180 add def GetPos /LPutVar
+[ x2 x1 y2 y1 ] cvx def /LPutPos { LPutVar LineMP } def x1 y1 x2 y2 }
+def
+/NCLine { NCCoor tx@Dict begin ArrowB 4 2 roll ArrowA lineto end } def
+/BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED
+/t ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3
+mul cx sub def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx
+sub def /ay y3 y0 sub cy sub by sub def ax t 3 exp mul bx t t mul mul
+add cx t mul add x0 add ay t 3 exp mul by t t mul mul add cy t mul add
+y0 add 3 ay t t mul mul mul 2 by t mul mul add cy add 3 ax t t mul mul
+mul 2 bx t mul mul add cx add atan } def
+/GetArms { /x1a armA AngleA cos mul x1 add def /y1a armA AngleA sin mul
+y1 add def /x2a armB AngleB cos mul x2 add def /y2a armB AngleB sin mul
+y2 add def } def
+/NCCurve { GetPos x1 x2 sub y1 y2 sub Pyth 2 div dup 3 -1 roll mul /armA
+ED mul /armB ED GetArms x1a y1a x1 y1 tx@Dict begin ArrowA end x2a y2a
+x2 y2 tx@Dict begin ArrowB end curveto /LPutVar [ x1 y1 x1a y1a x2a y2a
+x2 y2 ] cvx def /LPutPos { t LPutVar BezierMidpoint } def } def
+/AnglesMP { LPutVar t 3 gt { /t t 3 sub def } { t 2 gt { /t t 2 sub def
+10 -2 roll } { t 1 gt { /t t 1 sub def 10 -4 roll } { 10 4 roll } ifelse
+} ifelse } ifelse 6 { pop } repeat 3 -1 roll exch LineMP } def
+/NCAngles { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform exch pop mtrx itransform /y0 ED /x0
+ED mark armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1a y1a armA 0 ne { x1 y1 }
+if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a y2a x0 y0 x1a y1a
+x1 y1 ] cvx def /LPutPos { AnglesMP } def } def
+/NCAngle { GetPos /x2a armB AngleB cos mul x2 add def /y2a armB AngleB
+sin mul y2 add def /mtrx AngleA matrix rotate def x2a y2a mtrx transform
+pop x1 y1 mtrx transform exch pop mtrx itransform /y0 ED /x0 ED mark
+armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1 y1 tx@Dict begin false Line end
+/LPutVar [ x2 y2 x2 y2 x2a y2a x0 y0 x1 y1 ] cvx def /LPutPos { AnglesMP
+} def } def
+/NCBar { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform pop sub dup 0 mtrx itransform 3 -1
+roll 0 gt { /y2a exch y2a add def /x2a exch x2a add def } { /y1a exch
+neg y1a add def /x2a exch neg x2a add def } ifelse mark x2 y2 x2a y2a
+x1a y1a x1 y1 tx@Dict begin false Line end /LPutVar [ x2 y2 x2 y2 x2a
+y2a x1a y1a x1 y1 ] cvx def /LPutPos { LPutVar AnglesMP } def } def
+/NCDiag { GetPos GetArms mark x2 y2 x2a y2a x1a y1a x1 y1 tx@Dict begin
+false Line end /LPutVar [ x2 y2 x2 y2 x2a y2a x1a y1a x1 y1 ] cvx def
+/LPutPos { AnglesMP } def } def
+/NCDiagg { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED /x1a armA
+AngleA cos mul x1 add def /y1a armA AngleA sin mul y1 add def nodeB
+GetCenter y1a sub exch x1a sub Atan 180 add /AngleB ED OffsetB AngleB
+NodesepB nodeB GetEdge /y2 ED /x2 ED mark x2 y2 x1a y1a x1 y1 tx@Dict
+begin false Line end /LPutVar [ x2 y2 x2 y2 x2 y2 x1a y1a x1 y1] cvx def
+/LPutPos { AnglesMP } def } def
+/LoopMP { /t t abs def [ LPutVar ] length 2 div 1 sub dup t lt { /t ED }
+{ pop } ifelse mark LPutVar t cvi { /t t 1 sub def pop pop } repeat
+counttomark 1 add 4 roll cleartomark 3 -1 roll exch LineMP } def
+/NCLoop { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform loopsize add /y1b ED /x1b ED /x2b x2a y2a mtrx transform pop
+def x2b y1b mtrx itransform /y2b ED /x2b ED x1b y1b mtrx itransform /y1b
+ED /x1b ED mark armB 0 ne { x2 y2 } if x2a y2a x2b y2b x1b y1b x1a y1a
+armA 0 ne { x1 y1 } if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a
+y2a x2b y2b x1b y1b x1a y1a x1 y1 ] cvx def /LPutPos { LoopMP } def }
+def
+/NCCircle { nodeA GetCenter 0 0 NodesepA nodeA GetEdge pop 3 1 roll /Y ED
+/X ED X sub 2 div dup 2 exp r r mul sub abs sqrt atan 2 mul /a ED r
+AngleA 90 add PtoC Y add exch X add exch 2 copy /LPutVar [ 4 2 roll r a
+] def /LPutPos { LPutVar aload pop t 360 mul add dup 5 1 roll 90 sub
+PtoC 3 -1 roll add 3 1 roll add exch 3 -1 roll } def r AngleA 90 sub a
+add AngleA 270 add a sub tx@Dict begin /angleB ED /angleA ED /r ED /c
+57.2957 r Div def /y ED /x ED } def
+/LPutCoor { tx@NodeDict /LPutPos known { gsave LPutPos tx@Dict begin
+/langle ED CM 3 1 roll STV CP 3 -1 roll sub neg 3 1 roll sub exch moveto
+setmatrix CP end grestore } { 0 0 tx@Dict /langle 0 def end } ifelse }
+def
+end
+%%EndProcSet
+%%BeginProcSet: texps.pro
+TeXDict begin /rf{findfont dup length 1 add dict begin{1 index /FID ne 2
+index /UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics
+exch def dict begin Encoding{exch dup type /integertype ne{pop pop 1 sub
+dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}
+ifelse}forall Metrics /Metrics currentdict end def[2 index currentdict
+end definefont 3 -1 roll makefont /setfont load]cvx def}def
+/ObliqueSlant{dup sin S cos div neg}B /SlantFont{4 index mul add}def
+/ExtendFont{3 -1 roll mul exch}def /ReEncodeFont{/Encoding exch def}def
+end
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale false def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+%%EndProcSet
+TeXDict begin @defspecial
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+@fedspecial end TeXDict begin
+40258431 52099146 1000 600 600
+(/v/ahhnold/v3/ddas/research/papers/ICDE-11/paper.dvi)
+@start /Fa 188[28 67[{}1 41.666668 /Times-Italic rf /Fb
+1 60 df<38FEFEFFFFFF3B0303030706060E0C1C3830706008147A8614>59
+D E /Fc 7 57 df<003FC00000FFF00003E07C0007C03E000F801F000F000F001E000780
+1E0007803E0007C03E0007C07C0003E07C0003E07C0003E07C0003E07C0003E0FC0003F0
+FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0
+FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F07C0003E07C0003E07C0003E0
+7E0007E03E0007C03E0007C03E0007C01F000F800F000F000F801F0007C03E0003F0FC00
+00FFF000003FC0001C2D7DAB23>48 D<000C00003C00007C0003FC00FFFC00FC7C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C
+00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000FE007FFF
+FE7FFFFE172C7AAB23>I<007F800001FFF0000780FC000E003F001C001F8038000FC070
+000FC0600007E0F00007E0FC0007F0FE0007F0FE0003F0FE0003F0FE0003F07C0007F000
+0007F0000007F0000007E000000FE000000FC000001FC000001F8000003F0000007E0000
+007C000000F8000001F0000003E0000007C000000F8000001E0000003C00000078000000
+F0003000E0003001C0003003800060070000600E0000E01FFFFFE03FFFFFE07FFFFFC0FF
+FFFFC0FFFFFFC01C2C7DAB23>I<003FC00001FFF00007C0FC000E007E001C003F001C00
+1F803F001FC03F001FC03F800FC03F000FC03F000FC00C001FC000001FC000001F800000
+1F8000003F0000003E0000007C000000F8000003F00000FFC00000FFF0000000FC000000
+3F0000001F8000001FC000000FC000000FE000000FE0000007F0000007F0380007F07C00
+07F0FE0007F0FE0007F0FE0007F0FE000FE0F8000FE060000FC070001FC038001F801E00
+3F000780FC0001FFF000007FC0001C2D7DAB23>I<00000E0000000E0000001E0000003E
+0000003E0000007E000000FE000000FE000001BE000003BE0000033E0000063E00000E3E
+00000C3E0000183E0000383E0000303E0000603E0000E03E0000C03E0001803E0003803E
+0003003E0006003E000E003E000C003E0018003E0038003E0030003E0060003E00E0003E
+00FFFFFFFCFFFFFFFC00003E0000003E0000003E0000003E0000003E0000003E0000003E
+0000003E0000003E0000007F00001FFFFC001FFFFC1E2D7EAC23>I<0C0001800FC01F80
+0FFFFF000FFFFE000FFFFC000FFFF0000FFFC0000C7E00000C0000000C0000000C000000
+0C0000000C0000000C0000000C0000000C0000000C1FC0000C7FF8000DE07C000F801F00
+0F001F800E000F800C0007C0000007E0000007E0000003E0000003F0000003F0000003F0
+000003F0780003F0FC0003F0FC0003F0FC0003F0FC0003F0F80007E0E00007E0600007C0
+70000FC038000F801C001F000E003E000780F80001FFE000007F80001C2D7DAB23>I<00
+1FC00000FFF00003E07C0007801E000F000F001E0007801E0007803C0003C03C0003C03C
+0003C03C0003C03E0003C03E0007C03F0007801FC00F801FE00F001FF81E000FFC3C0007
+FFF80003FFE00000FFE000003FF80000FFFC0003C7FF000783FF801F00FFC01E003FC03C
+001FE07C0007E0780003F0F80003F0F00001F0F00000F0F00000F0F00000F0F00000F0F8
+0000E0780001E07C0001C03C0003C01E0007800F800F0007E03C0001FFF000003FC0001C
+2D7DAB23>56 D E /Fd 135[50 3[50 50 3[50 50 50 50 2[50
+2[50 50 1[50 50 50 97[{}13 83.333336 /Courier rf /Fe
+1 49 df<038007C007C007C00F800F800F800F001F001E001E003E003C003C0038007800
+780070007000E000E0000A157D9612>48 D E /Ff 6 104 df<FFFFFFFFFEFFFFFFFFFE
+FFFFFFFFFE27037A8F34>0 D<003800003800003800003800003800403804F0381EF810
+3E7E10FC0F11E003938000FE0000380000FE000393800F11E07E10FCF8103EF0381E4038
+0400380000380000380000380000380017197B9A22>3 D<000000003000000000000000
+380000000000000038000000000000003C000000000000001E000000000000000E000000
+000000000F00000000000000078000000000000003C000007FFFFFFFFFE00000FFFFFFFF
+FFF00000FFFFFFFFFFFC000000000000003E000000000000000F8000000000000007E000
+000000000001FC000000000000007F800000000000003F80000000000000FC0000000000
+0003F00000000000000F800000000000001F000000000000003C0000FFFFFFFFFFF80000
+FFFFFFFFFFF000007FFFFFFFFFE000000000000003C00000000000000780000000000000
+0F000000000000000E000000000000001E000000000000003C0000000000000038000000
+0000000038000000000000003000000039237C9F42>41 D<00F001F803F803F803F807F0
+07F007F007E007E00FC00FC00FC00F801F801F001F001F003E003E003C003C007C007800
+78007000F000F000E0000D1D7D9F13>48 D<00007E0003FE0007E0000F00001E00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C0000780000780000F00003E000FF8000FC0000
+FF800003E00000F000007800007800003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+001E00000F000007E00003FE00007E173B7BAB22>102 D<FC0000FF800007E00001F000
+007800003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00001E00001E00000F000007C0
+0001FE00007E0001FE0007C0000F00001E00001E00003C00003C00003C00003C00003C00
+003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00
+003C00003C0000780001F00007E000FF8000FC0000173B7BAB22>I
+E /Fg 7 56 df<001C00007C0007FC00FFFC00FFFC00F8FC0000FC0000FC0000FC0000FC
+0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC
+0000FC0000FC0000FC007FFFF87FFFF87FFFF8151C7B9B1F>49 D<03FE000FFFC03FFFF0
+7E07F8F803FCFC01FCFC00FEFC00FEFC007E7800FE0000FE0000FE0001FC0001F80003F0
+0007E0000F80003E00007C0000F00E01E00E07801C0FFFFC1FFFFC7FFFFCFFFFFCFFFFF8
+FFFFF8171C7C9B1F>I<00FF800003FFE0000FFFF8001F01FC003E00FE003F007E003F00
+7E003F007E003F00FE000C00FC000001FC000003F00000FFC00000FFF0000001FC000000
+FE0000007F0000003F8000003F8030003F80FC003F80FC003F80FC003F80FC007F00F800
+FF007E01FE003FFFF8000FFFF00001FF8000191D7D9B1F>I<0003F0000003F0000007F0
+00000FF000001DF0000039F0000039F0000071F00000E1F00001C1F0000381F0000701F0
+000701F0000E01F0001C01F0003801F0007001F000F001F000FFFFFF80FFFFFF80FFFFFF
+800003F0000003F0000003F0000003F00000FFFF8000FFFF8000FFFF80191C7D9B1F>I<
+3800783FFFF83FFFF03FFFE03FFF803FFE003FF0003C00003C00003C00003CFF003FFFC0
+3F03F03E01F83C00FC38007C00007E00007E00007E78007EFC007EFC007EFC00FCF800FC
+7801F87E03F03FFFE00FFF8003FE00171D7C9B1F>I<001FE00000FFF80003FFFC0007F0
+3E000FC07E001F807E003F007E003E007E007E003C007E000000FC3F8000FCFFF000FDC0
+FC00FF807E00FF003F00FE001F00FE001F80FC001F80FC001F80FC001F807C001F807E00
+1F807E001F803E003F003F003F001F80FE000FFFF80003FFF000007F8000191D7D9B1F>
+I<380000003FFFFF803FFFFF807FFFFF807FFFFF007FFFFE007FFFFC007000F800E001F0
+00E003E0000007C000000F8000001F0000001F0000003E0000007E0000007C0000007C00
+0000FC000000FC000000F8000001F8000001F8000001F8000001F8000001F8000001F800
+0001F8000000F00000191D7C9B1F>I E /Fh 7 62 df<007C00000000600001FF000000
+00F00003C380000001F0000700C0000001E0000E0060000003E0001E007000000FC0001C
+003C00001F80003C003F00007F80003C001BE003FF00007C0018FFFF9E00007800181FFC
+3E000078000C00007C0000F8000C0000780000F8000C0000F80000F8000C0001F00000F8
+000C0001E00000F8000C0003E00000F8000C0007C00000F8000C0007800000F8000C000F
+800000F8000C001F00000078000C001E000000780018003E0000007C0018007C0000003C
+001800780000003C003000F80000001C003001F00000001E006001E00000000E006003E0
+0000000700C007C000000003C380078000000001FF000F80000000007C001F0000000000
+00001E0007C0000000003E001FF0000000007C003C38000000007800700C00000000F800
+F00600000001F001E00600000001E001E00300000003E003C00300000007C003C0018000
+00078007C0018000000F800780018000001F000780018000001E000F8000C000003E000F
+8000C000007C000F8000C0000078000F8000C00000F8000F8000C00001F0000F8000C000
+01E0000F8000C00003E0000F8000C00007C0000F8000C0000780000F8000C0000F800007
+800180001F000007800180001E000007C00180003E000003C00180007C000003C0030000
+78000001E0030000F8000001E0060001F0000000F0060001E0000000700C0003E0000000
+3C380003C00000001FF000018000000007C0003A437BBD45>37 D<0003F80000001FFF00
+00007E0FC00000F803E00003E000F80003C000780007C0007C000F80003E000F80003E00
+1F00001F001F00001F003F00001F803F00001F803F00001F807E00000FC07E00000FC07E
+00000FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00
+000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE0000
+0FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000F
+C07E00000FC07E00000FC07E00000FC07F00001FC03F00001F803F00001F803F00001F80
+1F00001F001F00001F000F80003E000F80003E0007C0007C0003E000F80003E000F80000
+F803E000007E0FC000001FFF00000007FC000023387DB62A>48 D<000180000007800000
+0F8000003F800001FF8000FFFF8000FFDF8000FE1F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
+1F8000001F8000001F8000001F8000003FC0007FFFFFE07FFFFFE07FFFFFE01B3779B62A
+>I<0007F80000003FFF000000FFFFC00001F00FE000038003F000070001F8000F0001FC
+000FC001FE001FE000FE001FE000FF001FE000FF001FE000FF000FE000FF000FC000FF00
+038000FF00000000FE00000000FE00000001FE00000001FC00000001F800000003F00000
+0003E000000007C00000000F800000007F0000001FFC0000001FFF800000000FE0000000
+03F000000001FC00000000FE00000000FF000000007F000000007F800000007FC0000000
+3FC00000003FC00000003FE00000003FE03E00003FE07F00003FE0FF80003FE0FF80003F
+E0FF80003FE0FF80003FC0FF00007FC07E00007F807C00007F80300000FF00380000FE00
+1C0001FC000F0003F80007F00FF00001FFFFC000007FFF8000000FFC000023387DB62A>
+51 D<0600000C000780003C0007F003F80007FFFFF00007FFFFE00007FFFFC00007FFFF
+800007FFFF000007FFFC0000067FE0000006000000000600000000060000000006000000
+000600000000060000000006000000000600000000060000000006000000000600000000
+0607F80000063FFF000006F80F800007C003C000070001F000060000F800040000F80000
+00007C000000007E000000007E000000003F000000003F000000003F000000003F800000
+003F800000003F803C00003F807E00003F80FF00003F80FF00003F80FF00003F80FF0000
+3F00FE00003F00FC00007F006000007E006000007E00300000FC00380000F800180001F8
+000E0003F000070007E00003E03F800001FFFF0000007FFC0000001FE0000021387CB62A
+>53 D<1C003E007F00FF80FF80FF807F003E001C00000000000000000000000000000000
+0000000000000000000000000000000000000000001C003E007F00FF80FF80FF807F003E
+001C00092479A317>58 D<7FFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFF
+FFFFFC000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFC
+FFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFFFFFFF836167B9F41>61
+D E /Fi 3 106 df<001FF00000FFFF0003E03FC00F801FE01F000FF01F800FF83FC007
+F83FE007F83FE007F83FE007F83FE00FF83FE00FF01FC00FF007001FE000003FE000007F
+800000FF00007FFC00007FF800007FFF0000003FC000000FF0000007F8000007FC0C0007
+FC3F0003FE7F8003FEFFC003FEFFC003FEFFC003FEFFC003FEFFC003FC7F8007FC7F0007
+F83F000FF01FC03FE007FFFFC001FFFF00003FF0001F277DA526>51
+D<FFFFFFFF000000FFFFFFFFF00000FFFFFFFFFC000003FE0007FF000003FE00007FC000
+03FE00003FE00003FE00000FF00003FE000007F80003FE000003F80003FE000003FC0003
+FE000001FE0003FE000001FE0003FE000000FF0003FE000000FF0003FE000000FF0003FE
+000000FF0003FE000000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE00
+0000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE000000FF8003FE0000
+00FF0003FE000000FF0003FE000000FF0003FE000001FE0003FE000001FE0003FE000003
+FC0003FE000003FC0003FE000007F80003FE00000FF00003FE00001FE00003FE00007FC0
+0003FE0003FF0000FFFFFFFFFE0000FFFFFFFFF00000FFFFFFFF00000031287DA739>68
+D<0F801FC03FE03FE03FE03FE03FE01FC00F80000000000000000000000000FFE0FFE0FF
+E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F
+E00FE00FE0FFFCFFFCFFFC0E297CA816>105 D E /Fj 1 69 df<FFFFFFFFFF800000FF
+FFFFFFFFF80000FFFFFFFFFFFF0000FFFFFFFFFFFFC000007FF80007FFF000007FF80000
+7FF800007FF800001FFE00007FF800000FFF00007FF8000003FF80007FF8000001FFC000
+7FF8000001FFC0007FF8000000FFE0007FF80000007FF0007FF80000007FF0007FF80000
+003FF8007FF80000003FF8007FF80000003FFC007FF80000001FFC007FF80000001FFC00
+7FF80000001FFE007FF80000001FFE007FF80000001FFE007FF80000001FFE007FF80000
+001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF00
+7FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFF007FF80000
+001FFF007FF80000001FFF007FF80000001FFF007FF80000001FFE007FF80000001FFE00
+7FF80000001FFE007FF80000001FFE007FF80000001FFC007FF80000003FFC007FF80000
+003FFC007FF80000003FF8007FF80000007FF8007FF80000007FF0007FF8000000FFE000
+7FF8000000FFE0007FF8000001FFC0007FF8000003FF80007FF8000007FF00007FF80000
+1FFE00007FF800007FFC00007FF80007FFF000FFFFFFFFFFFFC000FFFFFFFFFFFF0000FF
+FFFFFFFFFC0000FFFFFFFFFF80000040397DB849>68 D E /Fk 3
+106 df<00000000003C00000000000000003C00000000000000003E0000000000000000
+1E00000000000000001F00000000000000000F8000000000000000078000000000000000
+07C00000000000000003E00000000000000001F00000000000000000F800000000000000
+00FC00007FFFFFFFFFFFFE0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF8000FFFFFFFFFF
+FFFFC00000000000000003E00000000000000001F80000000000000000FE000000000000
+00003F00000000000000001FE00000000000000007F80000000000000001FF0000000000
+000001FF0000000000000007F8000000000000001FE0000000000000003F000000000000
+0000FE0000000000000001F80000000000000003E000FFFFFFFFFFFFFFC000FFFFFFFFFF
+FFFF8000FFFFFFFFFFFFFF00007FFFFFFFFFFFFE0000000000000000FC00000000000000
+00F80000000000000001F00000000000000003E00000000000000007C000000000000000
+0780000000000000000F80000000000000001F00000000000000001E0000000000000000
+3E00000000000000003C00000000000000003C000000482E7BAB53>41
+D<0000C00001E00003E00003E00003C00007C00007C0000780000F80000F80001F00001F
+00001E00003E00003E00007C00007C0000780000F80000F80001F00001F00001E00003E0
+0003E00003C00007C00007C0000F80000F80000F00001F00001F00003E00003E00003C00
+007C00007C0000780000F80000F80000F80000F800007800007C00007C00003C00003E00
+003E00001F00001F00000F00000F80000F800007C00007C00003C00003E00003E00001E0
+0001F00001F00000F80000F800007800007C00007C00003E00003E00001E00001F00001F
+00000F80000F800007800007C00007C00003C00003E00003E00001E00000C0135278BD20
+>104 D<600000F00000F80000F800007800007C00007C00003C00003E00003E00001F00
+001F00000F00000F80000F800007C00007C00003C00003E00003E00001F00001F00000F0
+0000F80000F800007800007C00007C00003E00003E00001E00001F00001F00000F80000F
+800007800007C00007C00003C00003E00003E00003E00003E00003C00007C00007C00007
+80000F80000F80001F00001F00001E00003E00003E00007C00007C0000780000F80000F8
+0000F00001F00001F00003E00003E00003C00007C00007C0000F80000F80000F00001F00
+001F00003E00003E00003C00007C00007C0000780000F80000F80000F000006000001352
+7CBD20>I E /Fl 3 111 df<70F8F8F87005057A8413>58 D<03FFFFC00003FFFFF80000
+3C007E00003C001F00003C000F80003C000F800078000F800078000F800078000F800078
+001F0000F0003E0000F000780000F003E00000FFFE000001E007000001E003C00001E001
+C00001E001E00003C001E00003C001E00003C001E00003C001E000078003E000078003E0
+60078003E060078003E0C0FFF801F0C0FFF800F1800000003E00231D7B9B2B>82
+D<0F03F00033861C0021D81E0061F01E00C3E01E00C3C01E0003C01E0003C01E0007803C
+0007803C0007803C00078078200F0078600F00F0600F00F0C00F00F0C01E0071800C003E
+001B127D9125>110 D E /Fm 139[12 16 14 1[21 21 21 1[12
+2[12 1[21 1[18 21 18 1[18 12[25 23 28 2[30 30 37 25 1[16
+14 2[23 25 1[28 1[30 20[10 2[14 14 40[{}29 41.666668
+/Times-Roman rf /Fn 3 52 df<00600001E0000FE000FFE000F1E00001E00001E00001
+E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001
+E00001E00001E00001E00001E00001E00001E0007FFF807FFF80111C7B9B1C>49
+D<03FC000FFF801C0FC03003E06001F0E000F0E000F8F00078F000786000780000F80000
+F00001F00001E00003C0000700000E00001C0000300000E0000180180300180600180800
+383FFFF07FFFF0FFFFF0FFFFF0151C7D9B1C>I<03FC000FFF001C07C03001E07001F078
+01F07800F03001F00001F00001E00003C0000780001E0003FC000007800003C00001E000
+00F00000F80000F86000F8F000F8F000F8E000F06001F07003E03C07C00FFF0003FC0015
+1D7D9B1C>I E /Fo 81[32 51[26 29 29 1[29 29 16 23 19 1[29
+29 29 45 16 1[16 16 29 29 19 26 29 26 29 26 7[42 2[42
+42 36 32 39 42 32 42 42 52 2[23 19 1[42 32 36 42 39 1[42
+1[26 5[29 29 29 29 29 29 29 29 29 3[19 15 2[19 19 40[{}57
+58.333336 /Times-Roman rf /Fp 134[29 29 2[32 19 23 26
+1[32 29 32 48 16 2[16 32 29 1[26 32 26 1[29 14[42 45
+36 45 5[23 3[39 42 2[42 1[29 63[{}27 58.333336 /Times-Bold
+rf /Fq 138[33 18 26 26 1[33 1[33 48 3[18 1[33 1[29 3[33
+97[{}11 66.666664 /Times-Italic rf /Fr 7 56 df<00E00001E00007E000FFE000
+F9E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000
+01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000
+01E00001E00003F000FFFFC0FFFFC012217AA01E>49 D<01FC0007FF801C0FC03003E060
+01F06000F8F800F8FC00FCFC00FCFC007C78007C3000FC0000FC0000F80000F80001F000
+03E00003C0000780000F00001E0000380000700000E00001C00C03800C0600180C001818
+00183FFFF87FFFF8FFFFF0FFFFF016217CA01E>I<00FF0003FFC00F03E01C00F01C00F8
+3E00FC3E007C3E007C1E00FC0C00FC0000F80000F80001F00003E0000FC001FF0001FF00
+0003E00000F000007800007C00003E00003F30003F78003FFC003FFC003FFC003EF8007E
+60007C3800F81E03F00FFFC001FF0018227DA01E>I<0000E00001E00001E00003E00007
+E00007E0000DE0001DE00039E00031E00061E000E1E000C1E00181E00381E00701E00601
+E00C01E01C01E01801E03001E07001E0E001E0FFFFFFFFFFFF0001E00001E00001E00001
+E00001E00001E00003F0003FFF003FFF18227DA11E>I<1000301E01F01FFFE01FFFC01F
+FF801FFE001BF00018000018000018000018000018000018FE001BFF801F03C01C01E018
+00F01800F800007800007800007C00007C30007C78007CF8007CF8007CF80078F000F860
+00F07001E03801E01E078007FF0001F80016227CA01E>I<000FC0007FF001F03803C018
+07803C0F007C1E007C1C00383C00003C00007C0000780000787FC0F8FFE0F980F0FA0038
+FE003CFC001EFC001EF8001FF8001FF8001FF8001F78001F78001F78001F3C001E3C001E
+1C003C1E00380F00700781E001FFC0007F0018227DA01E>I<3000003C00003FFFFF3FFF
+FF7FFFFE7FFFFC60001C600038600070C000E0C000C00001C0000380000700000600000E
+00001C00001C0000380000380000780000780000780000F00000F00000F00000F00001F0
+0001F00001F00001F00001F00001F00001F00000E00018237CA11E>I
+E /Fs 1 4 df<7FFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFCF0
+00000000003CF000000000003CF000000000003CF000000000003CF000000000003CF000
+000000003CF000000000003CF000000000003CF000000000003CF000000000003CF00000
+0000003CF000000000003CF000000000003CF000000000003CF000000000003CF0000000
+00003CF000000000003CF000000000003CF000000000003CF000000000003CF000000000
+003CF000000000003CF000000000003CF000000000003CF000000000003CF00000000000
+3CF000000000003CF000000000003CF000000000003CF000000000003CF000000000003C
+F000000000003CF000000000003CF000000000003CF000000000003CF000000000003CF0
+00000000003CF000000000003CF000000000003CF000000000003CF000000000003CF000
+000000003CF000000000003CF000000000003CF000000000003CF000000000003CF00000
+0000003CF000000000003CFFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFF
+FFFFF836387BB741>3 D E /Ft 18 112 df<387CFEFEFEFEFEFE7C7C7C7C7C7C7C7C7C
+7C3838383838383838383810000000000038FEFEFEFEFE3807297BA813>33
+D<0006000C00180030006000E001C00380038007000F000E001E001E001C003C003C003C
+0078007800780078007800F800F000F000F000F000F000F000F000F000F000F000F000F8
+00780078007800780078003C003C003C001C001E001E000E000F0007000380038001C000
+E0006000300018000C00060F3B7AAB1A>40 D<C0006000300018000C000E000700038003
+8001C001E000E000F000F00070007800780078003C003C003C003C003C003E001E001E00
+1E001E001E001E001E001E001E001E001E003E003C003C003C003C003C00780078007800
+7000F000F000E001E001C00380038007000E000C00180030006000C0000F3B7DAB1A>I<
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E000000FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000
+00000E0000002B2B7DA333>43 D<00380000780001F8001FF800FEF800E0F80000F80000
+F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000
+F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000
+F80000F80000F80000F80001FC00FFFFF8FFFFF815267BA521>49
+D<00FF000003FFE0000E03F0001800F80030007C0060003E0078001F00FC001F00FE001F
+80FE001F80FE000F80FE000F807C000F8000001F8000001F0000001F0000003F0000003E
+0000007C00000078000000F0000001E0000003C00000078000000F0000001C0000003800
+000070018000E0018001C0018003800300060003000C0003001FFFFF003FFFFF007FFFFE
+00FFFFFE00FFFFFE0019267DA521>I<00FF000003FFE0000F01F8001C007C0030003E00
+3C003E007E003F007E001F007E001F007E003F003C003F0000003E0000003E0000007C00
+0000F8000001F0000007E00001FF800001FF00000001E0000000F00000007C0000003E00
+00003F0000001F0000001F8000001F8038001F807C001F80FE001F80FE001F80FE001F00
+FC003F0078003E0070007C003800F8001F01F00007FFC00000FF000019277DA521>I<00
+00380000003800000078000000F8000001F8000001F8000003F8000007F8000006F80000
+0CF800001CF8000018F8000030F8000070F8000060F80000C0F80001C0F8000180F80003
+00F8000700F8000E00F8000C00F8001C00F8003800F8003000F8006000F800E000F800FF
+FFFFE0FFFFFFE00000F8000000F8000000F8000000F8000000F8000000F8000000F80000
+01FC00003FFFE0003FFFE01B277EA621>I<18000C001F007C001FFFF8001FFFF0001FFF
+E0001FFF800019FC00001800000018000000180000001800000018000000180000001800
+0000187F000019FFE0001F81F0001E0078001C003C0018003E0000003E0000001F000000
+1F0000001F8000001F8030001F807C001F80FC001F80FC001F80FC001F80FC001F00F000
+1F0060003E0070003E0030007C001C00F8000F03E00003FFC00000FE000019277DA521>
+I<000FE000003FF80000F81C0001E0060003801F0007003F000F003F001E003F001E003F
+003C001E003C0000007C0000007800000078040000783FC000F8FFF000F9807800FB003C
+00FA001E00FC001E00FC000F00FC000F00F8000F80F8000F80F8000F80F8000F8078000F
+8078000F8078000F8078000F803C000F003C000F001C001E001E001E000E003C00070078
+0003C0F00001FFC000007F000019277DA521>I<300000003C0000003FFFFFE03FFFFFE0
+3FFFFFC07FFFFF807FFFFF807000070060000E0060000C00C0001C00C0003800C0007000
+0000E0000000C0000001C000000380000003800000070000000F0000000E0000001E0000
+001E0000001E0000003E0000003C0000003C0000007C0000007C0000007C0000007C0000
+00FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000780000
+1B287DA621>I<387CFEFEFE7C380000000000000000000000387CFEFEFE7C3807197B98
+13>58 D<387CFEFEFE7C380000000000000000000000387CFCFEFE7E3E0606060C0C0C18
+1830702007247B9813>I<7FFFFFFFFFC0FFFFFFFFFFE0FFFFFFFFFFE000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000FFFFFFFFFFE0FFFFFFFFFFE07F
+FFFFFFFFC02B117D9633>61 D<01FF000FFFE01E01F038007860007CF8003EFC003EFC00
+3EFC003E78003E30007C00007C0000F80001F00003C0000780000F00000E00001C000018
+000038000030000030000030000030000030000030000030000020000000000000000000
+0000000000000000700001FC0001FC0001FC0001FC0001FC0000700017297DA81F>63
+D<007E03E001FF8FF00781F8F00F00F0F01E0078001C0038003C003C003C003C003C003C
+003C003C003C003C003C003C001C0038001E0078000F00F0000781E00009FF8000087E00
+0018000000180000001C0000001E0000000FFFF0000FFFFC0007FFFF000FFFFF801C001F
+C0380007C0780003E0F00001E0F00001E0F00001E0F00001E0780003C07C0007C03E000F
+800FC07E0003FFF800007FC0001C277E9921>103 D<0F80FF80FF801F800F800F800F80
+0F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F80
+0F800F800F800F800F800F800F800F800F800F800F800F801FC0FFF8FFF80D287EA713>
+108 D<003F800000FFE00003E0F80007803C000F001E001E000F003C0007803C00078078
+0003C0780003C0780003C0F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0F8
+0003E0780003C0780003C07C0007C03C0007801E000F001F001F000F803E0003E0F80001
+FFF000003F80001B1C7E9A21>111 D E /Fu 11 121 df<387CFEFEFE7C3807077A8614>
+58 D<387CFEFFFF7F3B0303030606060C1838702008127A8614>I<E000000000F8000000
+00FE000000003F800000000FE000000003F800000000FE000000003F800000000FE00000
+0003F800000000FE000000003F800000000FE000000003F800000000FE000000003F8000
+00000FE000000003F800000000FE000000003E00000000FE00000003F80000000FE00000
+003F80000000FE00000003F80000000FE00000003F80000000FE00000003F80000000FE0
+0000003F80000000FE00000003F80000000FE00000003F80000000FE00000000F8000000
+00E00000000027277AA134>62 D<00000001800000000003800000000007800000000007
+C0000000000FC0000000001FC0000000001FC00000000037C00000000037C00000000067
+C000000000C7C000000000C7E00000000183E00000000383E00000000303E00000000603
+E00000000E03E00000000C03E00000001803F00000001801F00000003001F00000006001
+F00000006001F0000000C001F0000001C001F00000018001F0000003FFFFF8000003FFFF
+F80000060000F800000C0000F800000C0000F80000180000F80000380000F80000300000
+FC00006000007C0000E000007C0000C000007C0001C000007C0003C000007C000FC00000
+FE00FFF8000FFFE0FFF8000FFFE02B2A7DA932>65 D<003FFFFFFFF8003FFFFFFFF80001
+F80003F80001F00000F80001F00000780003F00000300003F00000300003E00000300003
+E00000300007E00000300007E00000300007C00180300007C0018030000FC0038000000F
+C0030000000F80030000000F80070000001F801F0000001FFFFE0000001FFFFE0000001F
+001E0000003F000E0000003F000C0000003E000C0000003E000C0000007E001C01C0007E
+00180180007C00000180007C0000038000FC0000070000FC0000070000F800000E0000F8
+00000E0001F800001C0001F800003C0001F00000780001F00001F80003F0000FF000FFFF
+FFFFF000FFFFFFFFE0002D287CA731>69 D<003FFFFFFFE0003FFFFFFFE00001F80007E0
+0001F00003E00001F00001E00003F00000C00003F00000C00003E00000C00003E00000C0
+0007E00000C00007E00000C00007C00000C00007C00300C0000FC0070000000FC0060000
+000F80060000000F800E0000001F800E0000001F803C0000001FFFFC0000001FFFFC0000
+003F003C0000003F00180000003E00180000003E00180000007E00380000007E00300000
+007C00300000007C0000000000FC0000000000FC0000000000F80000000000F800000000
+01F80000000001F80000000001F00000000001F00000000003F000000000FFFFE0000000
+FFFFE00000002B287CA72A>I<000001FF000000001FFFE00000007E01F8000001F0007E
+000007C0001F00000F80000F80001E000007C0007C000007C000F8000003E001F0000003
+E001F0000001F003E0000001F007C0000001F00FC0000001F00F80000001F81F80000001
+F81F00000001F83F00000001F83F00000001F07E00000003F07E00000003F07E00000003
+F07E00000003F07E00000007E0FC00000007E0FC0000000FC0FC0000000FC0FC0000001F
+80FC0000001F807C0000003F007E0000003E007E0000007E003E000000FC003E000001F8
+001F000003F0001F800007C0000F80000F800007C0003F000003F000FC000000FC03F000
+00003FFFC000000007FC0000002D2A7DA832>79 D<003FFFFFC000003FFFFFF8000001F8
+00FE000001F0001F000001F0000F800003F0000FC00003F00007C00003E00007C00003E0
+0007E00007E00007E00007E0000FC00007C0000FC00007C0000FC0000FC0001F80000FC0
+001F00000F80003E00000F80007C00001F8001F000001F800FE000001FFFFF0000001FFF
+FE0000003F001F0000003F0007C000003E0007C000003E0003E000007E0003E000007E00
+03E000007C0003E000007C0003E00000FC0007E00000FC0007E00000F80007E00000F800
+07E00001F80007E01001F80007E03001F00007E03001F00007E07003F00007E0E0FFFF80
+03F1C0FFFF8001FF80000000007E002C297CA732>82 D<00001FE0080000FFFC180003E0
+1E380007000770000E0003F000180001F000300000F000700000E000E00000E000E00000
+E000E00000E001E00000C001E00000C001E000000001F000000000F800000000FE000000
+007FE00000007FFE0000003FFFE000000FFFF0000001FFF80000001FFC00000001FE0000
+00003E000000001F000000000F000000000F000000000F00180000070018000007003800
+000E003000000E003800000C003800001C0078000038007C000070007E0000E000770003
+C000E3E00F0000C0FFFE0000801FF00000252A7CA829>I<000E00001F00001F00001E00
+000C0000000000000000000000000000000000000000000000000003E00007F0000C7800
+183800303800303800607800607800C07800C0F00000F00001E00001E00001E00003C000
+03C0000780000781800781800F01800F03000F03000F06000F0C000F1C0007F00001E000
+11287DA617>105 D<00F807C001FE1FF0070738380E07B0381C03E0781803C0F83003C0
+F83003C07060078000600780000007800000078000000F0000000F0000000F0000000F00
+00001E0000001E0030001E0030301E0060783E0060F83E00C0F87E00C0F06E038061CF07
+007F83FC001E01F8001D1B7D9926>120 D E /Fv 11 121 df<1C007F00FF80FF80FF80
+FF80FF807F001C000909798817>58 D<1C007F00FF80FF80FFC0FFC0FFC07FC01CC000C0
+00C000C000C001C00180018003800300070006000E001C003800700060000A19798817>
+I<00000000006000000000000070000000000000F0000000000001F0000000000001F000
+0000000003F0000000000003F0000000000007F000000000000FF000000000000FF00000
+0000001FF800000000001FF8000000000033F8000000000073F8000000000063F8000000
+0000C3F80000000000C3F8000000000183F8000000000183F8000000000303F800000000
+0603F8000000000603FC000000000C03FC000000000C01FC000000001801FC0000000030
+01FC000000003001FC000000006001FC000000006001FC00000000C001FC00000001C001
+FC000000018001FC000000030001FE000000030001FE000000060000FE0000000E0000FE
+0000000C0000FE000000180000FE0000001FFFFFFE0000003FFFFFFE0000003FFFFFFE00
+0000600000FE000000C00000FE000000C00000FF000001800000FF0000018000007F0000
+030000007F0000060000007F0000060000007F00000C0000007F00000C0000007F000018
+0000007F0000380000007F0000700000007F0000F00000007F8001F80000007F8007F800
+0000FF80FFFF80003FFFFFFFFF80007FFFFFFFFF80007FFFFF383C7DBB3E>65
+D<0003FFFFFFFFFFF00007FFFFFFFFFFF00007FFFFFFFFFFF0000007F800003FF0000007
+F0000007F0000007F0000003E000000FF0000001E000000FF0000000E000000FE0000000
+E000000FE0000000E000001FE0000000E000001FE0000000E000001FC0000000E000001F
+C0000000C000003FC0000000C000003FC0000000C000003F80003000C000003F80003000
+C000007F80007000C000007F800070000000007F000060000000007F0000E000000000FF
+0000E000000000FF0001E000000000FE0003C000000000FE000FC000000001FFFFFFC000
+000001FFFFFFC000000001FFFFFF8000000001FC000F8000000003FC00078000000003FC
+00078000000003F800030000000003F800030000000007F800070000000007F800070003
+000007F000060003000007F00006000700000FF00006000600000FF00000000600000FE0
+0000000E00000FE00000000C00001FE00000001C00001FE00000001800001FC000000038
+00001FC00000003800003FC00000007000003FC0000000F000003F80000001E000003F80
+000001E000007F80000007E000007F8000000FC000007F0000003FC00000FF000003FF80
+00FFFFFFFFFFFF8000FFFFFFFFFFFF8000FFFFFFFFFFFF00003C397DB83D>69
+D<0003FFFFFFFFFFE00007FFFFFFFFFFE00007FFFFFFFFFFE0000007F800003FE0000007
+F000000FE0000007F0000003C000000FF0000003C000000FF0000001C000000FE0000001
+C000000FE0000001C000001FE0000001C000001FE0000001C000001FC0000001C000001F
+C00000018000003FC00000018000003FC00000018000003F800000018000003F80006001
+8000007F8000E0018000007F8000E0000000007F0000C0000000007F0000C000000000FF
+0001C000000000FF0001C000000000FE00038000000000FE00078000000001FE001F8000
+000001FFFFFF8000000001FFFFFF0000000001FFFFFF0000000003FC001F0000000003FC
+000F0000000003F8000E0000000003F8000E0000000007F8000E0000000007F8000E0000
+000007F0000C0000000007F0000C000000000FF0001C000000000FF0001C000000000FE0
+0000000000000FE00000000000001FE00000000000001FE00000000000001FC000000000
+00001FC00000000000003FC00000000000003FC00000000000003F800000000000003F80
+0000000000007F800000000000007F800000000000007F00000000000000FF8000000000
+00FFFFFFC000000000FFFFFFC000000000FFFFFFC0000000003B397DB835>I<0003FFF8
+00001FFFF80007FFFC00003FFFF80007FFFC00003FFFF8000007FC000001FF00000007FE
+0000007C00000006FE000000780000000EFF000000700000000E7F000000700000000C7F
+800000600000000C7F800000600000001C3F800000E00000001C3FC00000C0000000181F
+C00000C0000000181FE00000C0000000381FE00001C0000000380FF0000180000000300F
+F00001800000003007F00001800000007007F80003800000007003F80003000000006003
+FC0003000000006003FC000300000000E001FC000700000000E001FE000600000000C000
+FE000600000000C000FF000600000001C0007F000E00000001C0007F800C000000018000
+7F800C0000000180003F800C0000000380003FC01C0000000380001FC018000000030000
+1FE0180000000300000FE0180000000700000FF0380000000700000FF030000000060000
+07F03000000006000007F8300000000E000003F8700000000E000003FC600000000C0000
+03FC600000000C000001FE600000001C000001FEE00000001C000000FEC0000000180000
+00FFC0000000180000007FC0000000380000007FC0000000380000007F80000000300000
+003F80000000300000003F80000000700000001F80000000700000001F00000000F00000
+000F00000007FC0000000F000000FFFFE000000F000000FFFFE0000006000000FFFFE000
+000600000045397DB843>78 D<00000001FF00000000001FFFF000000000FE01FC000000
+03F0007E00000007C0001F8000001F80000FC000003E000007E00000FC000003F00001F8
+000003F00003F0000001F80007E0000001F8000FC0000000FC001F80000000FC003F0000
+0000FE007F000000007E00FE000000007E00FC000000007F01FC000000007F03F8000000
+007F03F8000000007F07F0000000007F07F0000000007F0FF0000000007F0FE000000000
+7F1FE000000000FF1FE000000000FF3FC000000000FF3FC000000000FF3FC000000000FF
+7F8000000001FE7F8000000001FE7F8000000001FE7F8000000001FEFF8000000003FCFF
+0000000003FCFF0000000003FCFF0000000007F8FF0000000007F8FF000000000FF0FF00
+0000000FF0FF000000000FE0FF000000001FE0FF000000001FC0FF000000003F807F0000
+00007F807F000000007F007F00000000FE007F00000001FC003F80000001F8003F800000
+03F8001F80000007F0001FC000000FE0000FC000001F800007E000003F000007F000007E
+000003F00001F8000001FC0003F00000007E000FC00000003F807F0000000007FFF80000
+000000FF80000000383D7CBA3F>I<0003FFFFFFF800000007FFFFFFFF80000007FFFFFF
+FFE000000007F8001FF800000007F00003FC00000007F00000FE0000000FF000007F0000
+000FF000007F0000000FE000003F8000000FE000003F8000001FE000003FC000001FE000
+003FC000001FC000003FC000001FC000003FC000003FC000003FC000003FC000007F8000
+003F8000007F8000003F8000007F8000007F800000FF0000007F800000FE0000007F0000
+01FC0000007F000003F8000000FF000007F0000000FF00000FE0000000FE00001F800000
+00FE00007F00000001FE0007F800000001FFFFFFE000000001FFFFFF0000000001FC000F
+C000000003FC0003F000000003FC0001F800000003F80000FC00000003F80000FE000000
+07F80000FE00000007F800007E00000007F000007E00000007F000007F0000000FF00000
+FF0000000FF00000FE0000000FE00000FE0000000FE00000FE0000001FE00001FE000000
+1FE00001FE0000001FC00001FE0000001FC00001FE0000003FC00001FE0000003FC00003
+FE0000003F800003FC0060003F800003FC0060007F800003FC00E0007F800003FC00C000
+7F000003FC01C000FF800001FC0180FFFFFF0001FC0380FFFFFF0000FE0700FFFFFF0000
+7E0E0000000000001FFC00000000000007F0003B3B7DB83F>82 D<0000001FE003800000
+00FFFC0300000003FFFE070000000FE01F8F0000003F0007DF0000007E0001FE000000F8
+0000FE000001F00000FE000003E000007E000003E000007C000007C000003C00000F8000
+003C00000F8000003C00001F8000003800001F0000003800001F0000003800001F000000
+3800003F0000003000003F0000003000003F8000003000003F8000000000003FC0000000
+00003FE000000000001FF000000000001FFE00000000001FFFE0000000000FFFFE000000
+0007FFFFC000000003FFFFF000000001FFFFF800000000FFFFFC000000001FFFFE000000
+0003FFFF00000000003FFF000000000003FF800000000000FF8000000000007F80000000
+00003F8000000000001F8000000000001F8000000000001F80000C0000001F80000C0000
+000F80000C0000000F80001C0000001F80001C0000001F00001C0000001F00001C000000
+1F00003C0000003E00003C0000003E00003C0000007C00003E000000F800007E000000F8
+00007F000001F000007F800003E000007FC0000FC00000F9F0001F800000F0FE00FE0000
+00E03FFFF8000000E00FFFE0000000C001FF00000000313D7CBA33>I<0000E00001F800
+03F80003F80003F80003F00001C000000000000000000000000000000000000000000000
+000000000000000000000000000000F80003FE00070F000E0F801C0F80180F80380F8030
+0F80701F80601F80603F80E03F00C03F00C07F00007E00007E0000FE0000FC0001FC0001
+FC0001F80003F80003F00003F00007F01807E01807E0380FE0300FC0300FC0700F80600F
+80E00F80C00F81C00F838007870003FE0000F80015397EB71D>105
+D<0007E001F000001FF807FE0000783E0E0F0000E01F1C0F0001C01F383F8003800FF03F
+8003000FE03F8007000FE03F000E000FC03F000C000FC01C000C001FC000001C001F8000
+0018001F80000018001F80000000003F80000000003F80000000003F00000000003F0000
+0000007F00000000007F00000000007E00000000007E0000000000FE0000000000FE0000
+000000FC000C000000FC000C000001FC001C000001FC0018001C01F80018007E01F80038
+007E03F8007000FE03F8006000FE07F800E000FE0E7C01C000781C7C03800078383E0F00
+003FF00FFC000007C003F0000029267EA42F>120 D E /Fw 139[28
+32 37 1[46 42 46 69 23 2[23 46 42 1[37 46 37 46 42 12[55
+46 2[51 65 8[51 1[60 2[60 18[21 46[{}24 83.333336 /Times-Bold
+rf /Fx 133[44 50 50 1[50 55 33 39 44 55 55 50 55 83 28
+2[28 55 50 33 44 55 44 1[50 12[66 3[61 78 72 4[39 4[72
+1[66 12[50 50 50 50 50 2[25 46[{}35 100.000000 /Times-Bold
+rf /Fy 135[40 2[40 40 40 2[40 2[40 3[40 2[40 40 40 40
+1[40 50[40 46[{}13 66.666664 /Courier rf /Fz 69[29 8[33
+1[37 37 3[29 47[29 33 33 48 33 33 18 26 22 33 33 33 33
+52 18 33 1[18 33 33 22 29 33 29 33 29 8[48 63 48 48 41
+37 44 48 37 48 48 59 41 1[26 22 1[48 37 41 48 44 1[48
+5[18 1[33 33 33 33 33 33 33 33 33 33 1[17 22 17 2[22
+22 40[{}67 66.666664 /Times-Roman rf /FA 2 122 df<0060000070000060000060
+00406020E06070F861F07C63E00F6F0003FC0000600003FC000F6F007C63E0F861F0E060
+7040602000600000600000700000600014157B9620>3 D<00600000F00000F00000F000
+00F00000F00000F0000060000060000060000060000060000060007861E0FFFFF0FFFFF0
+7861E000600000600000600000600000F00000F00000F00000F00000F00000F00000F000
+00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000
+006000006000006000006000006000006000006000142F7CA31E>121
+D E /FB 81[66 53[60 86 1[66 40 47 53 1[66 60 66 100 33
+66 1[33 66 60 40 53 66 53 66 60 10[86 1[80 1[86 1[73
+6[47 3[80 1[86 1[86 6[40 3[60 60 60 60 60 60 3[40 45[{}38
+119.999947 /Times-Bold rf /FC 78[50 55[50 50 1[50 50
+28 39 33 1[50 50 50 78 3[28 50 1[33 44 50 44 50 44 11[72
+61 55 14[72 66 66 72 92 7[50 50 4[50 50 2[25 1[25 44[{}34
+100.000000 /Times-Roman rf /FD 4 122 df<00007000000000F800000000F8000000
+00F800000000F800000000F800000000F800000000F800000000F8000000007000007800
+7000F07C007001F0FF007007F87F80700FF03FE0703FE00FF0707F8003F870FE0000FE73
+F800003F77E000000FFF80000003FE00000000F800000003FE0000000FFF8000003F77E0
+0000FE73F80003F870FE000FF0707F803FE0703FE07F80700FF0FF007007F87C007001F0
+78007000F000007000000000F800000000F800000000F800000000F800000000F8000000
+00F800000000F800000000F800000000700000252B7AAD32>3 D<0000000FE0000000FF
+E0000003FC0000000FE00000003FC00000007F80000000FF00000000FE00000001FC0000
+0001FC00000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000003F800000003F800000003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000007F000000007F00000000FE00000001FE00000
+003FC00000007F80000000FE00000007F8000000FFE0000000FFE000000007F800000000
+FE000000007F800000003FC00000001FE00000000FE000000007F000000007F000000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000003F800000003F80000
+0003F800000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000001FC00000001FC00000000FE00000000FF000000007F80000000
+3FC00000000FE000000003FC00000000FFE00000000FE0236479CA32>102
+D<FE00000000FFE000000007F800000000FE000000007F800000003FC00000001FE00000
+000FE000000007F000000007F000000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000003F800000003F800000003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000001FC00000001FC0000
+0000FE00000000FF000000007F800000003FC00000000FE000000003FC00000000FFE000
+0000FFE0000003FC0000000FE00000003FC00000007F80000000FF00000000FE00000001
+FC00000001FC00000003F800000003F800000003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800
+000003F800000003F800000003F800000003F800000003F800000003F800000003F80000
+0003F800000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F800000003F800000003F800000003F800000007F000000007F00000000FE00000001F
+E00000003FC00000007F80000000FE00000007F8000000FFE0000000FE00000000236479
+CA32>I<0001C000000007F000000007F000000007F000000007F000000007F000000007
+F000000007F000000007F000000007F000000007F000000003E000000003E000000003E0
+00000003E000000003E000000003E000000003E000000001C000000001C000000001C000
+000001C000000001C000000001C000003E01C03E00FFE1C3FF80FFFFFFFF80FFFFFFFF80
+FFFFFFFF80FFE1C3FF803E01C03E000001C000000001C000000001C000000001C0000000
+03E000000003E000000003E000000003E000000003E000000007F000000007F000000007
+F000000007F000000007F000000007F000000007F000000007F000000007F000000007F0
+00000007F000000007F000000007F000000007F000000007F000000007F000000007F000
+000007F000000007F000000007F000000007F000000007F000000007F000000007F00000
+0007F000000007F000000003E000000003E000000003E000000003E000000003E0000000
+03E000000003E000000003E000000003E000000003E000000003E000000003E000000003
+E000000003E000000003E000000001C000000001C000000001C000000001C000000001C0
+00000001C000000001C000000001C000000001C000000001C00000215B7BC52C>121
+D E /FE 81[80 51[64 72 1[104 1[80 48 56 64 1[80 72 80
+120 40 80 1[40 2[48 64 1[64 1[72 13[80 104 112 88 112
+8[88 4[104 6[48 58[{}27 144.000000 /Times-Bold rf /FF
+81[42 51[32 37 37 55 37 42 23 32 32 42 42 42 42 60 23
+37 23 23 42 42 23 37 42 37 42 42 9[69 51 60 46 42 51
+60 51 60 1[69 3[28 1[60 51 51 60 55 51 51 6[28 42 42
+42 42 2[42 42 42 2[21 28 21 44[{}56 83.333336 /Times-Italic
+rf /FG 47[83 13[28 7[37 8[42 1[46 46 3[37 47[37 42 42
+60 42 42 23 32 28 42 42 42 42 65 23 42 23 23 42 42 28
+37 42 37 42 37 3[28 1[28 2[60 78 60 60 51 46 55 60 46
+60 60 74 51 60 32 28 60 60 46 51 60 55 55 60 1[37 3[23
+23 42 42 42 42 42 42 42 42 42 42 23 21 28 21 47 1[28
+28 28 1[69 37[{}81 83.333336 /Times-Roman rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop -112 -353 3343 4 v -112 -227 4 126 v -84 -270
+a FG(T)-7 b(o)20 b(appear)f(in)h FF(Pr)l(oceedings)f(11th)h
+(International)e(Confer)m(ence)h(on)h(Data)g(Engineering)p
+FG(,)e(T)-7 b(aipei,)20 b(March)f(1995)p 3227 -227 V
+-112 -224 3343 4 v 684 286 a FE(Prairie:)49 b(A)36 b(Rule)f
+(Speci\256cation)e(Framew)o(ork)1268 469 y(f)l(or)j(Query)e(Optimizers)
+2598 417 y FD(\003)-16 b(y)1160 710 y FC(Dinesh)24 b(Das)650
+b(Don)25 b(Batory)1262 826 y(Department)g(of)g(Computer)f(Sciences)1277
+942 y(The)h(Uni)n(v)o(ersity)d(of)j(T)-7 b(e)o(xas)25
+b(at)f(Austin)1416 1058 y(Austin,)g(T)-7 b(e)o(xas)24
+b(78712\2611188)1358 1175 y FD(f)p FC(ddas,batory)p FD(g)p
+FC(@cs.ute)o(xas.edu)-112 1500 y FB(Abstract)-112 1692
+y FF(F)-5 b(r)l(om)28 b(our)f(e)n(xperience)o(,)h(curr)m(ent)f
+(rule-based)f(query)h(optimizer)o(s)-112 1792 y(do)22
+b(not)g(pr)l(o)o(vide)h(a)f(very)i(intuitive)e(and)g(well-de\256ned)f
+(fr)o(ame)o(work)-112 1891 y(to)30 b(de\256ne)f(rules)i(and)e(actions.)
+59 b(T)-8 b(o)31 b(r)m(emedy)f(this)h(situation,)h(we)-112
+1991 y(pr)l(opose)24 b(an)h(e)n(xtensible)g(and)g(structur)m(ed)g(alg)o
+(ebr)o(aic)f(fr)o(ame)o(work)-112 2090 y(called)e(Pr)o(airie)h(for)g
+(specifying)g(rules.)38 b(Pr)o(airie)23 b(facilitates)g(rule-)-112
+2190 y(writing)h(by)f(enabling)f(a)i(user)g(to)g(write)h(rules)f(and)f
+(actions)g(mor)m(e)-112 2290 y(quic)n(kly)-5 b(,)30 b(corr)m(ectly)f
+(and)e(in)i(an)f(easy-to-under)o(stand)d(and)j(easy-)-112
+2389 y(to-deb)n(ug)18 b(manner)-9 b(.)-29 2492 y(Query)24
+b(optimizer)o(s)h(consist)g(of)g(thr)m(ee)g(major)f(parts:)39
+b(a)24 b(sear)m(c)o(h)-112 2592 y(space)o(,)17 b(a)g(cost)h(model)e
+(and)h(a)g(sear)m(c)o(h)g(str)o(ate)m(gy)-5 b(.)28 b(The)17
+b(appr)l(oac)o(h)e(we)-112 2692 y(tak)o(e)20 b(is)h(only)f(to)g(de)o
+(velop)f(the)h(alg)o(ebr)o(a)f(whic)o(h)h(de\256nes)f(the)h(sear)m(c)o
+(h)-112 2791 y(space)29 b(and)g(the)h(cost)g(model)f(and)g(use)h(the)g
+(V)-9 b(olcano)28 b(optimizer)n(-)-112 2891 y(g)o(ener)o(ator)c(as)j
+(our)e(sear)m(c)o(h)h(engine)o(.)45 b(Using)26 b(Pr)o(airie)g(as)g(a)g
+(fr)l(ont-)-112 2990 y(end,)i(we)h(tr)o(anslate)f(Pr)o(airie)g(rules)g
+(to)g(V)-9 b(olcano)26 b(to)i(validate)f(our)-112 3090
+y(claim)20 b(that)g(Pr)o(airie)g(mak)o(es)g(it)h(easier)g(to)f(write)i
+(rules.)-29 3193 y(W)-8 b(e)17 b(describe)f(our)g(alg)o(ebr)o(a)f(and)h
+(pr)m(esent)g(e)n(xperimental)g(r)m(esults)-112 3293
+y(whic)o(h)e(show)h(that)g(using)g(a)g(high-le)o(vel)e(fr)o(ame)o(work)
+i(lik)o(e)g(Pr)o(airie)h(to)-112 3392 y(design)d(lar)m(g)o(e-scale)g
+(optimizer)o(s)h(does)g(not)f(sacri\256ce)h(ef)o(\256ciency)-5
+b(.)-112 3691 y FB(1)119 b(Intr)n(oduction)-112 3883
+y FG(Query)30 b(optimization)f([8])i(is)h(a)f(fundamental)e(part)i(of)f
+(database)-112 3982 y(systems.)43 b(It)26 b(is)g(the)f(process)f(of)h
+(generating)e(an)i(ef)n(\256cient)f(access)-112 4082
+y(plan)f(for)h(a)g(database)g(query)-5 b(.)39 b(Informally)-5
+b(,)22 b(an)i(access)g(plan)g(is)h(an)-112 4182 y(e)o(x)o(ecution)12
+b(strate)o(gy)i(for)h(a)g(query;)g(it)h(is)g(the)f(sequence)e(of)i(lo)n
+(w-le)n(v)o(el)-112 4281 y(database)24 b(retrie)n(v)n(al)h(operations)f
+(that,)i(when)f(e)o(x)o(ecuted,)g(produce)-112 4381 y(the)e(database)f
+(records)g(that)i(satisfy)f(the)g(query)-5 b(.)37 b(There)22
+b(are)h(three)-112 4481 y(basic)h(aspects)h(that)f(de\256ne)g(and)g
+(in\257uence)f(query)g(optimization:)-112 4580 y(the)d(search)g(space,)
+f(the)i(cost)f(model,)f(and)h(the)g(search)g(strate)o(gy)-5
+b(.)-29 4683 y(The)20 b FF(sear)m(c)o(h)f(space)h FG(is)i(the)e(set)h
+(of)f(logically)g(equi)n(v)n(alent)e(access)-112 4783
+y(plans)27 b(that)h(can)f(be)h(used)f(to)h(e)n(v)n(aluate)e(a)i(query)
+-5 b(.)50 b(All)28 b(plans)g(in)f(a)p -112 4867 788 4
+v -29 4921 a FA(\003)7 4944 y Fz(This)18 b(research)i(w)o(as)e
+(supported)i(in)f(part)g(by)f(grants)h(from)f(The)g(Uni)n(v)o(ersity)j
+(of)-112 5023 y(T)-5 b(e)o(xas)23 b(Applied)h(Research)h(Laboratories,)
+h(Schlumber)o(ger)m(,)g(and)e(Digital)g(Equip-)-112 5102
+y(ment)17 b(Corporation.)-26 5160 y FA(y)7 5184 y Fz(An)e(e)o(xpanded)i
+(v)o(ersion)f(of)f(this)h(paper)g(is)f(a)o(v)n(ailable)k(as)c(T)-5
+b(echnical)18 b(Report)e(TR)-112 5263 y(94\26116)h(by)g(anon)o(ymous)h
+(ftp)f(from)g Fy(ftp.cs.utexas.edu)p Fz(.)2044 1500 y
+FG(query')-5 b(s)20 b(search)h(space)h(return)e(the)h(same)h(result;)g
+(ho)n(we)n(v)o(er)m(,)d(some)2044 1600 y(plans)f(are)g(more)f(ef)n
+(\256cient)h(than)g(others.)28 b(The)17 b FF(cost)i(model)f
+FG(assigns)2044 1699 y(a)h(cost)h(to)g(each)f(plan)f(in)i(the)f(search)
+g(space.)29 b(The)19 b(cost)h(of)f(a)g(plan)g(is)2044
+1799 y(an)e(estimate)h(of)g(the)f(resources)g(used)g(when)g(the)h(plan)
+f(is)i(e)o(x)o(ecuted;)2044 1899 y(the)k(lo)n(wer)h(the)f(cost,)i(the)f
+(better)f(the)h(plan.)39 b(The)23 b FF(sear)m(c)o(h)h(str)o(ate)m(gy)
+2044 1998 y FG(is)i(a)f(speci\256cation)f(of)h(which)f(plans)h(in)g
+(the)g(search)g(space)g(are)g(to)2044 2098 y(be)20 b(e)o(xamined.)2127
+2197 y(T)m(raditionally)-5 b(,)19 b(query)h(optimizers)g(ha)n(v)o(e)h
+(been)f(b)n(uilt)i(as)g(mono-)2044 2297 y(lithic)i(subsystems)f(of)h(a)
+g(DBMS.)h(This)f(simply)f(re\257ects)h(the)g(f)o(act)2044
+2397 y(that)16 b(traditional)g(database)g(systems)g(are)h(themselv)o
+(es)f(monolithic:)2044 2496 y(the)j(algorithms)f(used)h(for)f(storing)g
+(and)h(retrie)n(ving)e(data)i(are)g(hard-)2044 2596 y(wired)25
+b(and)g(are)g(rather)g(dif)n(\256cult)f(to)i(change.)43
+b(The)25 b(need)g(to)h(ha)n(v)o(e)2044 2696 y(e)o(xtensible)16
+b(database)i(systems,)g(and)f(in)h(turn)f(e)o(xtensible)g(optimiz-)2044
+2795 y(ers,)27 b(has)g(long)e(been)g(recognized)f(in)i(systems)g(lik)o
+(e)h(Genesis)f([1],)2044 2895 y(EXODUS)15 b([9],)g(Starb)n(urst)g
+([10],)f(and)h(Postgres)g([12].)26 b(Rule-based)2044
+2994 y(query)18 b(optimizers)i(are)g(among)e(the)j(major)e(conceptual)f
+(adv)n(ances)2044 3094 y(that)29 b(ha)n(v)o(e)f(been)h(proposed)e(to)i
+(deal)g(with)g(query)f(optimizer)g(e)o(x-)2044 3194 y(tensibility)c
+([6,)13 b(7,)g(9,)g(10].)40 b(The)24 b(e)o(xtensibility)g(translates)g
+(into)g(the)2044 3293 y(ability)e(to)h(incorporate)d(ne)n(w)i
+(operators,)g(algorithms,)f(cost)i(mod-)2044 3393 y(els,)k(or)e(search)
+g(strate)o(gies)g(without)g(changing)e(the)j(optimization)2044
+3493 y(algorithm.)2127 3592 y(In)21 b(this)i(paper)m(,)d(we)i(describe)
+f(an)h(algebraic)f(frame)n(w)o(ork)e(called)2044 3692
+y FF(Pr)o(airie)g FG(for)f(specifying)f(rules)i(in)g(a)g(rule-based)f
+(query)f(optimizer)-5 b(.)2044 3791 y(Prairie)27 b(is)h(similar)f(to)h
+(other)e(rule)h(speci\256cation)f(languages)g(lik)o(e)2044
+3891 y(Starb)n(urst)d([10])g(and)h(V)-11 b(olcano)23
+b([7],)h(and)f(indeed,)h(we)g(ha)n(v)o(e)f(based)2044
+3991 y(our)h(w)o(ork)h(on)g(V)-11 b(olcano)24 b(to)h(capture)f(most)i
+(of)f(the)g(adv)n(antages)e(of)2044 4090 y(rule-based)15
+b(optimizers.)27 b(Ho)n(we)n(v)o(er)m(,)15 b(Prairie)i(attempts)f(to)h
+(pro)o(vide)2044 4190 y(some)26 b(k)o(e)o(y)f(features)g(that,)j(we)e
+(ha)n(v)o(e)f(found,)h(simplify)f(the)h(ef)n(fort)2044
+4290 y(in)20 b(writing)g(rules:)2106 4466 y(1.)41 b(A)27
+b(frame)n(w)o(ork)d(in)i(which)g(users)h(can)f(de\256ne)g(a)h(query)e
+(opti-)2210 4565 y(mizer)i(concisely)h(in)g(terms)g(of)g(a)g
+(well-de\256ned)f(set)i(of)f(op-)2210 4665 y(erators)g(and)g
+(algorithms.)52 b FF(All)29 b FG(operators)e(and)h(algorithms)2210
+4764 y(are)21 b(considered)e(\256rst-class)j(objects,)f(i.e.,)h
+FF(any)e FG(of)h(them)g(can)2210 4864 y(occur)26 b(in)h(an)o(y)g(rule,)
+h(and)f FF(only)g FG(these)g(operators)f(and)h(algo-)2210
+4964 y(rithms)19 b(can)g(appear)f(in)h(rules.)29 b(This)19
+b(scheme)g(eliminates)g(the)2210 5063 y(need)29 b(for)h(special)g
+(classes)h(of)f(operators)e(and)i(algorithms,)2210 5163
+y(such)17 b(as)i(enforcers)d(in)i(V)-11 b(olcano)17 b(and)h(glue)f(in)h
+(Starb)n(urst,)g(that)2210 5263 y(signi\256cantly)h(complicate)g(rule)h
+(speci\256cation.)p eop
+%%Page: 2 2
+2 1 bop -50 21 a FG(2.)41 b(A)17 b(frame)n(w)o(ork)e(in)i(which)f
+(users)h(can)g(de\256ne)g(a)g(list)h(of)f(proper)n(-)54
+120 y(ties)g(to)f(characterize)f(the)h(e)o(xpressions)f(generated)g(in)
+h(the)h(op-)54 220 y(timization)g(process.)28 b(Again,)18
+b(the)h(goal)e(here)h(is)i(to)e(allo)n(w)h(the)54 319
+y(user)h(to)h(treat)g FF(all)g FG(properties)e(as)j(ha)n(ving)d(equal)h
+(status.)32 b(This)54 419 y(is)22 b(dif)n(ferent)d(from)h(V)-11
+b(olcano)21 b(where)f(the)h(user)g(must)h(classify)54
+519 y(properties)30 b(as)i(logical,)h(physical,)g(or)f
+(operator/algorithm)54 618 y(ar)o(guments.)-50 789 y(3.)41
+b(A)15 b(frame)n(w)o(ork)d(in)j(which)g(users)g(can)f(specify)g
+(mapping)f(func-)54 889 y(tions)k(between)g(properties)g(concomitantly)
+e(with)j(the)g(corre-)54 988 y(sponding)13 b(rules.)23
+b(This)13 b(contrasts)g(with)g(e)o(xisting)g(approach)o(es)54
+1088 y(in)20 b(which)f(mappings)g(between)g(properties)g(are)h
+(fragmented)54 1188 y(into)d(multiple)g(functions)f(and)g(at)i
+(logically)f(dif)n(ferent)f(places)54 1287 y(than)h(the)h
+(corresponding)d(rules.)28 b(Research)18 b(into)f(rule-based)54
+1387 y(optimizers)31 b(has)i(re)n(v)o(ealed)d(that)j(property-mapping)
+27 b(func-)54 1487 y(tions)k(are)g(a)h(major)f(source)g(of)g(user)g(ef)
+n(fort,)i(so)f(this)g(is)g(an)54 1586 y(important)18
+b(goal.)-50 1757 y(4.)41 b(The)16 b(format)h(\(Prairie\))f(in)i(which)e
+(users)i(can)f(cleanly)f(specify)54 1857 y(rules)e(is)i(not)e
+(necessarily)h(the)f(same)h(format)f(needed)g(for)g(gen-)54
+1956 y(erating)24 b(ef)n(\256cient)i(optimizers.)45 b(Thus,)26
+b(there)f(is)i(a)f(need)f(for)54 2056 y(a)c(pre-processor)e(\(written)h
+(by)h(us\))g(that)g(translates)h(between)54 2156 y(these)e(competing)e
+(representations.)-29 2343 y(Prairie)26 b(stri)n(v)o(es)h(for)f
+(uniformity)f(in)i(dealing)f(with)h(issues)h(that)-112
+2443 y(ha)n(v)o(e)h(been)g(a)h(source)f(of)h(most)g(user)g(ef)n(fort)f
+(and)g(potential)g(user)-112 2542 y(errors.)69 b(In)33
+b(the)h(follo)n(wing)f(sections,)k(we)d(present)f(the)h(Prairie)-112
+2642 y(frame)n(w)o(ork.)45 b(W)-7 b(e)27 b(e)o(xplain)e(ho)n(w)h(our)f
+(P2V)h(pre-processor)e(maps)-112 2742 y(Prairie)30 b(rule)g
+(speci\256cations)g(into)g(V)-11 b(olcano)29 b(rule)h(speci\256cations)
+-112 2841 y(that)g(can)g(be)g(processed)f(ef)n(\256ciently)-5
+b(.)58 b(Experimental)28 b(results)j(to)-112 2941 y(support)26
+b(this)i(claim)g(are)g(gi)n(v)o(en)f(in)h(Section)f(4,)j(where)d(we)i
+(com-)-112 3041 y(pare)13 b(implementations)f(of)i(the)h(T)-6
+b(e)o(xas)14 b(Instruments)e(Open)i(OODB)-112 3140 y(query)25
+b(optimizer)h(using)h(both)f(Prairie)h(and)g(V)-11 b(olcano.)49
+b(W)-7 b(e)29 b(con-)-112 3240 y(clude)19 b(with)h(a)h(summary)e(and)g
+(related)h(research.)-112 3527 y FB(2)119 b(Prairie:)55
+b(A)37 b(language)f(f)m(or)f(rule)i(speci-)67 3676 y(\256cation)-112
+3864 y FG(The)22 b(basic)h(concepts)f(and)h(de\256nitions)f(that)h
+(underlie)f(the)h(Prairie)-112 3964 y(model)13 b(are)h(presented)f(in)h
+(this)h(section.)27 b(The)14 b(goal)g(is)h(to)f(lay)h(a)f(foun-)-112
+4063 y(dation)g(for)h(reasoning)f(about)g(query)h(optimization)e
+(algebraically;)-112 4163 y(this)21 b(is)i(necessary)d(for)h(our)f
+(subsequent)g(discussion)h(about)f(trans-)-112 4262 y(lating)f(Prairie)
+h(speci\256cations)g(to)h(those)f(of)f(V)-11 b(olcano.)-112
+4507 y Fx(2.1)99 b(Notation)24 b(and)i(assumptions)-112
+4665 y Fw(Stor)o(ed)k(Files)i(and)g(Str)o(eams.)81 b
+FG(A)32 b(\256le)g(is)g FF(stor)m(ed)i FG(if)e(its)g(tuples)-112
+4764 y(reside)c(on)g(disk.)54 b(In)29 b(the)f(case)h(of)g(relational)e
+(databases,)j(stored)-112 4864 y(\256les)i(are)f(sometimes)g(called)g
+FF(base)g(r)m(elations)p FG(;)37 b(we)32 b(will)g(denote)-112
+4964 y(them)25 b(by)h Fv(R)h FG(or)e Fv(R)438 4976 y
+Fu(i)466 4964 y FG(.)47 b(In)25 b(object-oriented)f(schemas,)i(stored)g
+(\256les)-112 5063 y(are)g FF(classes)p FG(;)j(we)e(will)g(denote)e
+(them)g(by)h FF(C)h FG(or)f FF(C)1366 5075 y Fu(i)1394
+5063 y FG(.)47 b(Henceforth,)-112 5163 y(whene)n(v)o(er)21
+b(we)j(refer)f(to)h(a)g(stored)f(\256le,)i(we)f(mean)f(a)h(relation)f
+(or)g(a)-112 5263 y(class;)d(when)f(the)g(distinction)g(is)h
+(unimportant,)d(we)j(will)g(use)f Fv(F)32 b FG(or)2044
+21 y Fv(F)2097 33 y Fu(i)2125 21 y FG(.)44 b(A)26 b FF(str)m(eam)f
+FG(is)i(a)e(sequence)f(of)h(tuples)g(and)f(is)j(the)e(result)g(of)g(a)
+2044 120 y(computation)d(on)i(one)f(or)h(more)g(streams)g(or)g(stored)g
+(\256les;)j(tuples)2044 220 y(of)21 b(streams)i(are)e(returned)g(one)g
+(at)i(a)f(time,)g(typically)f(on)h(demand.)2044 319 y(Streams)e(can)g
+(be)g FF(named)p FG(,)f(denoted)g(by)g Fv(S)3268 331
+y Fu(i)3296 319 y FG(,)h(or)g FF(unnamed)p FG(.)2044
+559 y Fw(Database)f(Operations.)82 b FG(An)21 b FF(oper)o(ation)d
+FG(is)k(a)f(computation)d(on)2044 659 y(one)j(or)h(more)f(streams)h(or)
+g(stored)g(\256les.)35 b(There)21 b(are)h(tw)o(o)h(types)e(of)2044
+759 y(database)d(operations)e(in)j(Prairie:)29 b(abstract)18
+b(\(or)g(implementation-)2044 858 y(unspeci\256ed\))34
+b(operators)f(and)i(concrete)g(algorithms.)73 b(Each)35
+b(is)2044 958 y(detailed)19 b(belo)n(w)-5 b(.)2210 1157
+y Fw(Operators.)39 b FG(Abstract)13 b(\(or)g(conceptual\))g
+FF(op)o(er)o(ato)o(r)o(s)g FG(specify)2392 1257 y(computations)20
+b(on)i(streams)g(or)g(stored)g(\256les;)i(the)o(y)d(are)2392
+1357 y(denoted)d(by)h(all)h(capital)g(letters)f(\(e.g.,)g(JOIN\).)g
+(Opera-)2392 1456 y(tors)24 b(ha)n(v)o(e)f(tw)o(o)h(types)f(of)g
+(parameters:)35 b(essential)24 b(and)2392 1556 y(additional.)49
+b FF(Essential)28 b(par)o(ameter)o(s)f FG(are)g(the)g(stream)2392
+1656 y(or)18 b(\256le)g(inputs)f(to)g(an)h(operator;)e(these)i(are)f
+(the)h(primary)2392 1755 y(inputs)g(to)h(be)f(processed)f(by)h(an)g
+(operator)-5 b(.)27 b FF(Additional)2392 1855 y(par)o(ameter)o(s)j
+FG(are)f(\252\256ne-grain\272)f(quali\256cations)h(of)g(an)2392
+1954 y(operator;)21 b(their)g(purpose)e(is)k(to)e(describe)g(an)g
+(operator)2392 2054 y(in)g(more)e(detail)h(than)g(essential)h
+(parameters.)2210 2194 y Fw(Algorithms.)40 b FF(Algorithms)55
+b FG(are)h(concrete)e(implementa-)2392 2293 y(tions)21
+b(of)g(conceptual)e(operators;)h(the)o(y)g(will)i(be)e(repre-)2392
+2393 y(sented)13 b(in)g(lo)n(wer)g(case)g(with)g(the)g(\256rst)g
+(letter)g(capitalized)2392 2493 y(\(e.g.,)k(Nested)p
+2815 2493 25 4 v 29 w(loops\).)28 b(Algorithms)15 b(ha)n(v)o(e)i(at)g
+(least)h(the)2392 2592 y(same)30 b(essential)f(and)f(additional)g
+(parameters)f(as)j(the)2392 2692 y(conceptual)21 b(operators)h(that)g
+(the)o(y)g(implement.)3798 2662 y Ft(1)3871 2692 y FG(Fur)n(-)2392
+2792 y(thermore,)28 b(there)g(can)g(be,)h(and)f(usually)f(are,)j(se)n
+(v)o(eral)2392 2891 y(algorithms)19 b(for)h(a)h(particular)d(operator)
+-5 b(.)2044 3091 y(T)e(able)26 b(1)h(lists)h(some)f(operators)e(and)h
+(algorithms)f(implementing)2044 3191 y(them)20 b(together)e(with)j
+(their)f(additional)f(parameters.)2044 3430 y Fw(Operator)i(T)-6
+b(r)o(ees.)82 b FG(An)23 b FF(oper)o(ator)e(tr)m(ee)i
+FG(is)h(a)f(rooted)e(tree)h(whose)2044 3530 y(non-leaf,)27
+b(or)g FF(interior)p FG(,)i(nodes)e(are)h(database)e(operations)g
+(\(oper)n(-)2044 3630 y(ators)g(or)g(algorithms\))f(and)g(whose)h(leaf)
+h(nodes)e(are)i(stored)e(\256les.)2044 3729 y(The)e(children)g(of)g(an)
+h(interior)e(node)h(in)h(an)g(operator)e(tree)h(are)h(the)2044
+3829 y(essential)i(parameters)e(\(i.e.,)i(the)g(stream)f(or)g(\256le)h
+(parameters\))e(of)2044 3928 y(the)h(node.)43 b(Additional)24
+b(parameters)g(are)i(implicitly)e(attached)h(to)2044
+4028 y(each)h(node.)49 b(Algebraically)-5 b(,)26 b(operator)f(trees)j
+(are)f(compositions)2044 4128 y(of)18 b(database)g(operations;)g(thus,)
+g(we)h(will)g(also)g(call)g(operator)e(trees)2044 4227
+y FF(e)n(xpr)m(essions)p FG(;)j(both)g(terms)g(will)h(be)f(used)g
+(interchangeably)-5 b(.)2044 4447 y(E)p Fz(XAMPLE)19
+b FG(1.)153 b(A)29 b(simple)f(e)o(xpression)f(and)h(its)h(operator)e
+(tree)2044 4547 y(representation)22 b(are)h(sho)n(wn)h(in)g(Figure)f
+(1\(a\).)40 b(Relations)24 b Fv(R)3831 4559 y Ft(1)3893
+4547 y FG(and)2044 4646 y Fv(R)2107 4658 y Ft(2)2172
+4646 y FG(are)j(\256rst)h(RET)m(rie)n(v)o(ed,)f(then)g(JOINed,)h(and)f
+(\256nally)g(SOR)-5 b(T)f(ed)2044 4746 y(resulting)13
+b(in)h(a)h(stream)f(sorted)g(on)f(a)i(speci\256c)f(attrib)n(ute.)27
+b(The)14 b(\256gure)2044 4846 y(sho)n(ws)g(only)g(the)h(essential)g
+(parameters)e(of)i(the)f(v)n(arious)g(operators,)2044
+4945 y(not)20 b(the)g(additional)f(parameters.)915 b
+Fs(\003)p 2044 5107 788 4 v 2129 5160 a Fr(1)2163 5184
+y Fz(Algorithms)20 b(may)f(ha)o(v)o(e)g Fq(tuning)h(par)o(ameter)o(s)g
+Fz(which)f(are)h(not)f(parameters)h(of)2044 5263 y(the)e(operators)g
+(the)o(y)g(implement.)p eop
+%%Page: 3 3
+3 2 bop -112 71 2323 13 v -112 138 4 67 v -59 118 a Fp(Operator)p
+330 138 V 211 w(Description)p 912 138 V 294 w(Additional)17
+b(P)o(arameters)p 1581 138 V 102 w(Algorithm)p 2206 138
+V -112 150 2323 13 v -112 216 4 67 v -59 231 a Fo(JOIN\()p
+Fu(S)127 239 y Fn(1)159 231 y Fo(,)d Fu(S)229 239 y Fn(2)261
+231 y Fo(\))p 330 216 V 384 232 a(Join)g(streams)g Fu(S)728
+240 y Fn(1)760 232 y Fo(,)g Fu(S)830 240 y Fn(2)p 912
+216 V 965 197 a Fo(tuple)p 1084 197 18 4 v 22 w(order)p
+1581 216 4 67 v 409 w(Nested)p 1799 197 18 4 v 21 w(loops\()p
+Fu(S)2003 205 y Fn(1)2035 197 y Fo(,)g Fu(S)2105 205
+y Fn(2)2137 197 y Fo(\))p 2206 216 4 67 v 1585 220 626
+4 v -112 283 4 67 v 330 283 V 912 283 V 965 263 a(join)p
+1058 263 18 4 v 22 w(predicate)p 1581 283 4 67 v 344
+w(Mer)o(ge)p 1788 263 18 4 v 21 w(join\()p Fu(S)1956
+271 y Fn(1)1989 263 y Fo(,)g Fu(S)2059 271 y Fn(2)2091
+263 y Fo(\))p 2206 283 4 67 v -112 286 2323 4 v -112
+363 4 77 v -59 407 a(RET\()p Fu(F)9 b Fo(\))p 330 363
+V 384 412 a(Retrie)o(v)o(e)14 b(\256le)g Fu(F)p 912 363
+V 965 339 a Fo(tuple)p 1084 339 18 4 v 22 w(order)p 1581
+363 4 77 v 1634 352 a(File)p 1727 352 18 4 v 22 w(scan\()p
+Fu(F)9 b Fo(\))p 2206 363 4 77 v -112 429 4 67 v 330
+429 V 912 429 V 965 410 a(selection)p 1175 410 18 4 v
+21 w(predicate)p 1581 429 4 67 v 1585 397 622 4 v 2206
+429 4 67 v -112 497 4 68 v 330 497 V 912 497 V 965 477
+a(projected)p 1184 477 18 4 v 22 w(attrib)o(utes)p 1581
+497 4 68 v 1634 469 a(Inde)o(x)p 1768 469 18 4 v 22 w(scan\()p
+Fu(F)g Fo(\))p 2206 497 4 68 v -112 500 2323 4 v -112
+567 4 67 v -59 582 a(SOR)m(T\()p Fu(S)147 590 y Fn(1)178
+582 y Fo(\))p 330 567 V 384 583 a(Sort)15 b(stream)f
+Fu(S)705 591 y Fn(1)p 912 567 V 965 580 a Fo(tuple)p
+1084 580 18 4 v 22 w(order)p 1581 567 4 67 v 1634 547
+a(Mer)o(ge)p 1788 547 18 4 v 21 w(sort\()p Fu(S)1953
+555 y Fn(1)1986 547 y Fo(\))p 2206 567 4 67 v 1585 570
+626 4 v -112 633 4 67 v 330 633 V 912 633 V 1581 633
+V 1634 613 a(Null\()p Fu(S)1797 621 y Fn(1)1830 613 y
+Fo(\))p 2206 633 V -112 646 2323 13 v -112 793 a FG(T)-7
+b(able)18 b(1:)28 b(Operators)17 b(and)g(algorithms)g(in)h(a)h
+(centralized)e(query)f(optimizer)h(and)-112 893 y(their)i(additional)g
+(parameters)p 2477 33 1523 13 v 2477 99 4 67 v 2530 80
+a Fp(Pr)o(operty)p 3032 99 V 333 w(Description)p 3996
+99 V 2477 112 1523 13 v 2477 178 4 67 v 2530 158 a Fo(join)p
+2623 158 18 4 v 22 w(predicate)p 3032 178 4 67 v 230
+w(join)c(predicate)g(for)g(JOIN)g(operator)p 3996 178
+V 2477 182 1523 4 v 2477 248 4 67 v 2530 228 a(selection)p
+2740 228 18 4 v 21 w(predicate)p 3032 248 4 67 v 114
+w(selection)g(predicate)f(for)h(RET)f(operator)p 3996
+248 V 2477 251 1523 4 v 2477 318 4 67 v 2530 331 a(tuple)p
+2649 331 18 4 v 21 w(order)p 3032 318 4 67 v 3085 298
+a(tuple)h(order)g(of)g(resulting)g(stream,)p 3996 318
+V 2477 384 V 3032 384 V 3085 364 a(DONT)p 3250 364 18
+4 v 21 w(CARE)e(if)i(none)p 3996 384 4 67 v 2477 388
+1523 4 v 2477 454 4 67 v 2530 434 a(num)p 2636 434 18
+4 v 21 w(records)p 3032 454 4 67 v 260 w(number)h(of)e(tuples)h(of)g
+(resulting)g(stream)p 3996 454 V 2477 457 1523 4 v 2477
+524 4 67 v 2530 504 a(tuple)p 2649 504 18 4 v 21 w(size)p
+3032 524 4 67 v 327 w(size)f(of)h(indi)o(vidual)g(tuple)g(in)g(stream)p
+3996 524 V 2477 527 1523 4 v 2477 593 4 67 v 2530 574
+a(projected)p 2749 574 18 4 v 21 w(attrib)o(utes)p 3032
+593 4 67 v 103 w(projected)g(attrib)o(utes)g(for)g(RET)f(operator)p
+3996 593 V 2477 597 1523 4 v 2477 663 4 67 v 2530 643
+a(attrib)o(utes)p 3032 663 V 340 w(list)h(of)g(attrib)o(utes)p
+3996 663 V 2477 666 1523 4 v 2477 733 4 67 v 2530 713
+a(cost)p 3032 733 V 461 w(estimated)g(cost)f(of)h(algorithm)p
+3996 733 V 2477 745 1523 13 v 2477 893 a FG(T)-7 b(able)16
+b(2:)28 b(Properties)15 b(of)h(nodes)f(in)i(an)f(operator)e(tree)p
+-105 1246 1938 4 v -105 2116 4 870 v 61 1362 a Fm(SOR)n(T)c(\(JOIN)g
+(\(RET)h(\()p Fl(R)449 1374 y Fn(1)481 1362 y Fm(\),)f(RET)h(\()p
+Fl(R)661 1374 y Fn(2)693 1362 y Fm(\)\)\))346 1462 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 3.36499
+0.06248 false .5 12.47998 InitRnode } NewNode end end
+
+346 1462 a Fm(SOR)n(T)353 1557 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 3.36499
+0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 353 1557 a Fm(JOIN)303
+1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303 1732 a 264 1651 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 264 1651 a Fm(RET)453 1651
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 453 1651 a Fm(RET)303 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 303 1732 a 303 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+
+303 1732 a 265 1740 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 265 1740 a Fl(R)308 1752 y Fn(1)455
+1740 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 455 1740 a Fl(R)498 1752 y Fn(2)303 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303
+1732 a 303 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 303 1732 a 27 1914 a Fz(\(a\))37 b(An)f(e)o
+(xpression)j(and)e(its)27 1993 y(corresponding)19 b(operator)g(tree)p
+872 2091 4 820 v 1237 1457 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodemergesort 16 { .5 3.36499
+1.09 false .5 22.25996 InitRnode } NewNode end end
+ 1237 1457 a Fm(Mer)o(ge)p
+1346 1457 13 4 v 16 w(sort)1219 1552 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodenestedloops 16 { .5 3.36499
+1.07999 false .5 26.51999 InitRnode } NewNode end end
+ 1219 1552 a Fm(Nested)p
+1336 1552 13 4 v 16 w(loops)1235 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodemergesort
+/TheNodenestedloops InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1158
+1651 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr1 16 { .5 3.36499
+0.04 false .5 18.465 InitRnode } NewNode end end
+ 1158 1651 a Fm(File)p 1225 1651 13 4 v 15 w(scan)1347
+1651 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr2 16 { .5 3.36499
+0.04 false .5 18.465 InitRnode } NewNode end end
+ 1347 1651 a Fm(File)p 1414 1651 13 4 v 15 w(scan)1235
+1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodenestedloops
+/TheNodefilescanr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1235 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodenestedloops
+/TheNodefilescanr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1235 1732 a 1197 1740
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 1197 1740 a Fl(R)1240 1752 y Fn(1)1386 1740 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.41667 1.5
+false .5 9.05264 InitRnode } NewNode end end
+ 1386
+1740 a Fl(R)1429 1752 y Fn(2)1235 1732 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodefilescanr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1235 1732 a
+1235 1732 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodefilescanr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1235 1732 a 959 1914 a Fz(\(b\))h(Possible)i(access)g(plan)
+g(for)959 1993 y(operator)d(tree)f(in)f(\(a\))p 1829
+2116 4 870 v -105 2119 1938 4 v 1831 2136 19 877 v -89
+2136 1938 19 v -26 2318 a FG(Figure)i(1:)30 b(Example)19
+b(of)h(an)g(operator)e(tree)i(and)g(access)h(plan)-112
+2520 y Fw(Descriptors.)82 b FG(A)16 b FF(pr)l(operty)g
+FG(of)g(a)h(node)e(is)i(a)g(\(user)n(-de\256ned\))d(v)n(ari-)-112
+2620 y(able)31 b(that)g(contains)g(information)e(used)i(by)g(an)h
+(optimizer)-5 b(.)62 b(An)-112 2720 y FF(annotation)25
+b FG(is)k(a)f Fk(h)p FF(pr)l(operty)-5 b(,)21 b(value)n
+Fk(i)29 b FG(pair)f(that)g(is)h(assigned)e(to)h(a)-112
+2819 y(node.)40 b(A)25 b FF(descriptor)h FG(is)g(a)f(list)g(of)f
+(annotations)f(that)h(describes)g(a)-112 2919 y(node)j(of)h(an)h
+(operator)e(tree;)33 b(e)n(v)o(ery)27 b(node)g(has)i(its)h(o)n(wn)e
+(descrip-)-112 3019 y(tor)-5 b(.)56 b(As)30 b(an)f(e)o(xample,)h(T)-7
+b(able)29 b(2)h(lists)g(some)f(typical)g(properties)-112
+3118 y(that)20 b(might)g(be)h(used)g(in)f(a)i(descriptor)-5
+b(.)29 b(Note)21 b(that)g(descriptors)e(for)-112 3218
+y(stream)24 b(and)h(stored)f(\256les)i(may)f(ha)n(v)o(e)f(dif)n(ferent)
+g(properties.)42 b(The)-112 3317 y(follo)n(wing)17 b(notations)g(will)j
+(be)e(useful)g(in)h(our)f(subsequent)f(discus-)-112 3417
+y(sions.)27 b(If)14 b Fv(S)228 3429 y Fu(i)268 3417 y
+FG(is)g(a)g(stream,)g(then)g Fj(D)876 3429 y Fi(i)913
+3417 y FG(is)g(its)g(descriptor)-5 b(.)26 b(Annotations)-112
+3517 y(of)20 b Fv(S)29 3529 y Fu(i)78 3517 y FG(are)h(accessed)g(by)f
+(a)i(structure)e(member)f(relationship,)h(e.g.,)-112
+3616 y Fj(D)-39 3628 y Fi(i)-14 3616 y Fv(:)p FG(num)p
+163 3616 25 4 v 29 w(records)n(.)29 b(Also,)20 b(let)h
+Fv(E)k FG(be)20 b(an)g(e)o(xpression)e(and)h(let)h Fj(D)h
+FG(be)-112 3716 y(its)g(descriptor)-5 b(.)28 b(W)-7 b(e)21
+b(will)g(write)g(this)f(as)h Fv(E)28 b Fh(:)23 b Fj(D)p
+FG(.)-112 3904 y(E)p Fz(XAMPLE)c FG(2.)145 b(The)19 b(e)o(xpression,)
+-112 4055 y Fo(SOR)m(T)o Ft(\()p Fo(JOIN)o Ft(\()p Fo(RET)o
+Ft(\()p Fu(R)396 4063 y Fn(1)428 4055 y Ft(\):)p Fi(D)530
+4063 y Fg(3)566 4055 y Fu(;)p Fo(RET)o Ft(\()p Fu(R)772
+4063 y Fn(2)804 4055 y Ft(\):)p Fi(D)906 4063 y Fg(4)942
+4055 y Ft(\):)p Fi(D)1044 4063 y Fg(5)1079 4055 y Ft(\):)p
+Fi(D)1181 4063 y Fg(6)-112 4206 y FG(corresponds)k(to)j(the)g(operator)
+e(tree)i(in)g(Figure)f(1\(a\),)h(and)g(sho)n(ws)-112
+4305 y(the)20 b(descriptors)f(of)h(the)g(v)n(arious)f(nodes.)706
+b Fs(\003)-29 4466 y FG(A)19 b(notational)e(simpli\256cation)h(can)g
+(be)h(made)f(here.)28 b(Additional)-112 4565 y(parameters)13
+b(of)i(operators)f(can)h(be)g(treated)g(the)g(same)g(w)o(ay)h(as)g
+(other)-112 4665 y(properties)j(of)i(a)h(node;)f(essential)h
+(parameters,)e(ho)n(we)n(v)o(er)m(,)f(are)j FF(e)n(x-)-112
+4764 y(pr)m(essions)p FG(.)28 b(Thus,)17 b(the)h(term)f(descriptor)f
+(in)h(the)h(remainder)d(of)i(this)-112 4864 y(paper)24
+b(will)i(refer)f(to)h(a)g(set)h(of)e(properties,)g(including)f
+(additional)-112 4964 y(parameters,)18 b(as)j(sho)n(wn)f(in)g(T)-7
+b(able)20 b(2.)-29 5063 y(Currently)-5 b(,)34 b(descriptor)e
+(properties)g(are)h(de\256ned)f(entirely)g(by)-112 5163
+y(the)i(user;)42 b(ho)n(we)n(v)o(er)m(,)36 b(we)f(en)m(vision)e(pro)o
+(viding)f(a)j(hierarchy)d(of)-112 5263 y(pre-de\256ned)17
+b(descriptor)i(types)h(to)g(aid)h(this)f(process.)2044
+1243 y Fw(Access)f(Plans.)82 b FG(An)18 b FF(access)h(plan)e
+FG(is)i(an)f(operator)e(tree)i(in)h(which)2044 1342 y(all)i(interior)e
+(nodes)g(are)h(algorithms.)2044 1593 y(E)p Fz(XAMPLE)f
+FG(3.)144 b(An)19 b(access)h(plan)f(for)g(the)g(operator)e(tree)j(in)f
+(Fig-)2044 1692 y(ure)h(1\(a\))f(is)i(sho)n(wn)f(in)g(Figure)f(1\(b\).)
+828 b Fs(\003)2044 1977 y Fx(2.2)99 b(Prairie)25 b(optimization)f
+(paradigm)2044 2149 y FG(Prairie)k(admits)g(tw)o(o)g(rather)g(dif)n
+(ferent)e(means)i(of)g(optimization:)2044 2248 y(top-do)n(wn)20
+b(and)h(bottom-up.)33 b(A)22 b(top-do)n(wn)e(query)h(optimizer)g(op-)
+2044 2348 y(timizes)27 b(the)f(parents)g(of)h(a)g(node)e(prior)h(to)h
+(optimizing)d(the)j(node)2044 2447 y(itself.)54 b(A)28
+b(bottom-up)e(optimizer)h(optimizes)h(the)g(children)f(of)h(a)2044
+2547 y(node)i(prior)h(to)g(optimizing)f(the)h(node.)62
+b(The)31 b(earliest)h(optimiz-)2044 2647 y(ers)g(\(System)g(R)h([11])e
+(and)h(R)2945 2617 y Ff(\003)3016 2647 y FG([3]\))f(emplo)o(yed)f(the)j
+(bottom-up)2044 2746 y(approach.)2127 2854 y(Our)19 b(research)f
+(concentrates)g(on)h(a)h(top-do)n(wn)e(optimization)f(of)2044
+2954 y(operator)24 b(trees.)49 b(W)-7 b(e)27 b(ha)n(v)o(e)f(chosen)g
+(this)h(approach)d(because)i(we)2044 3054 y(intend)d(to)h(translate)g
+(Prairie)g(rules)g(into)f(the)h(format)f(required)f(by)2044
+3153 y(the)28 b(V)-11 b(olcano)28 b(query)f(optimizer)g(generator)f
+([7])i(which)g(is)h(based)2044 3253 y(on)h(a)h(top-do)n(wn)e(strate)o
+(gy)-5 b(.)60 b(Gi)n(v)o(en)30 b(an)h(appropriate)d(search)i(en-)2044
+3353 y(gine,)24 b(Prairie)f(can)g(potentially)g(also)h(be)f(used)h
+(with)f(a)i(bottom-up)2044 3452 y(optimization)19 b(strate)o(gy;)g(ho)n
+(we)n(v)o(er)m(,)f(we)j(will)g(not)g(discuss)f(this)h(ap-)2044
+3552 y(proach)d(in)j(this)f(paper)-5 b(.)2127 3660 y(In)18
+b(query)e(optimization,)h(there)h(are)g(certain)f(annotations)g(\(such)
+2044 3760 y(as)30 b(additional)e(parameters\))f(that)j(are)f(kno)n(wn)e
+(before)h(an)o(y)h(opti-)2044 3859 y(mization)c(is)j(be)o(gun.)46
+b(These)26 b(annotations)f(can)i(be)f(computed)f(at)2044
+3959 y(the)32 b(time)g(that)g(the)g(operator)f(tree)h(is)h
+(initialized,)h(and)e(will)g(not)2044 4059 y(change)16
+b(with)i(application)e(of)h(rules.)28 b(Our)17 b(follo)n(wing)f
+(discussions)2044 4158 y(assume)k(operator)e(trees)j(are)f
+(initialized.)2127 4266 y(There)41 b(are)i(tw)o(o)f(types)g(of)g
+(algebraic)g(transformations)e(\(or)2044 4366 y FF(r)m(e)o(write)33
+b(rules)p FG(\))g(in)f(Prairie:)54 b(T)-8 b(-rules)32
+b(\(\252transformation)e(rules\272\))2044 4466 y(and)21
+b(I-rules)h(\(\252implementation)d(rules\272\).)35 b(Each)22
+b(rule)f(transforms)2044 4565 y(an)26 b(e)o(xpression)e(into)i(another)
+e(based)h(on)h(additional)e(conditions;)2044 4665 y(the)h
+(transformation)d(also)j(results)g(in)g(a)g(mapping)e(of)h(descriptors)
+2044 4764 y(between)13 b(e)o(xpressions.)24 b(W)-7 b(e)13
+b(de\256ne)g(T)-8 b(-rules)13 b(and)g(I-rules)g(precisely)2044
+4864 y(in)19 b(the)g(follo)n(wing)f(sections)h(and)f(illustrate)h(them)
+g(with)g(e)o(xamples.)2044 4964 y(Our)f(e)o(xamples)f(are)i(chosen)e
+(from)h(rules)g(that)h(w)o(ould)e(be)i(used)f(in)h(a)2044
+5063 y(centralized)24 b(relational)g(query)g(optimizer;)j(the)e
+(operators,)g(algo-)2044 5163 y(rithms,)h(and)e(properties)g(are)h
+(subsets)g(of)g(those)g(in)g(T)-7 b(ables)25 b(1)h(and)2044
+5263 y(2.)p eop
+%%Page: 4 4
+4 3 bop -110 24 1947 4 v -110 1928 4 1905 v 31 101 a
+Fu(E)s Ft(\()p Fu(x)147 109 y Fn(1)178 101 y Fu(;)11
+b(:)h(:)f(:)g(;)g(x)372 109 y Fl(n)412 101 y Ft(\))19
+b(:)g Fi(D)552 109 y Fg(1)606 101 y Ft(=)-11 b Ff(\))19
+b Fu(E)783 72 y Fe(0)805 101 y Ft(\()p Fu(x)869 109 y
+Fn(1)901 101 y Fu(;)12 b(:)f(:)g(:)g(;)g(x)1095 109 y
+Fl(n)1135 101 y Ft(\))19 b(:)g Fi(D)1275 109 y Fg(2)1656
+101 y Fo(\(1\))31 167 y Ff(ff)244 234 y Fo(pre-test)c(statements)31
+300 y Ff(gg)31 367 y Fo(test)31 433 y Ff(ff)244 500 y
+Fo(post-test)g(statements)31 566 y Ff(gg)493 708 y Fz(\(a\))j(General)g
+(form)f(of)g(a)g(T)-6 b(-rule)p -61 806 1849 4 v 31 883
+a Fo(JOIN)o Ft(\()p Fo(JOIN)p Ft(\()p Fu(S)375 891 y
+Fn(1)407 883 y Fu(;)11 b(S)479 891 y Fn(2)512 883 y Ft(\))18
+b(:)h Fi(D)651 891 y Fg(4)687 883 y Fu(;)11 b(S)759 891
+y Fn(3)791 883 y Ft(\))19 b(:)g Fi(D)931 891 y Fg(5)1656
+883 y Fo(\(2\))89 983 y Ft(=)-11 b Ff(\))18 b Fo(JOIN)p
+Ft(\()p Fu(S)406 991 y Fn(1)438 983 y Fu(;)11 b Fo(JOIN)p
+Ft(\()p Fu(S)662 991 y Fn(2)694 983 y Fu(;)g(S)766 991
+y Fn(3)799 983 y Ft(\))18 b(:)h Fi(D)938 991 y Fg(6)974
+983 y Ft(\))g(:)g Fi(D)1114 991 y Fg(7)31 1066 y Ff(ff)244
+1132 y Fi(D)301 1140 y Fg(6)337 1132 y Fu(:)p Fo(attrib)o(utes)g
+Ft(=)g Fo(union)c Ft(\()p Fi(D)891 1140 y Fg(2)927 1132
+y Fu(:)p Fo(attrib)o(utes)o Fu(;)c Fi(D)1249 1140 y Fg(3)1285
+1132 y Fu(:)p Fo(attrib)o(utes)p Ft(\))k(;)31 1199 y
+Ff(gg)31 1265 y Fo(is)p 73 1265 18 4 v 20 w(associati)o(v)o(e)e
+Ft(\()p Fi(D)440 1273 y Fg(6)476 1265 y Fu(:)p Fo(join)p
+589 1265 V 21 w(predicate)p Fu(;)e Fi(D)908 1273 y Fg(6)944
+1265 y Fu(:)p Fo(attrib)o(utes)p Fu(;)g Fi(D)1267 1273
+y Fg(5)1303 1265 y Fu(:)p Fo(join)p 1416 1265 V 21 w(predicate)p
+Ft(\))31 1332 y Ff(ff)244 1398 y Fi(D)301 1406 y Fg(7)356
+1398 y Ft(=)19 b Fi(D)483 1406 y Fg(5)533 1398 y Ft(;)244
+1464 y Fi(D)301 1472 y Fg(7)337 1464 y Fu(:)p Fo(join)p
+450 1464 V 21 w(predicate)g Ft(=)g Fi(D)827 1472 y Fg(4)863
+1464 y Fu(:)p Fo(join)p 976 1464 V 21 w(predicate)14
+b Ft(;)244 1531 y Fi(D)301 1539 y Fg(6)337 1531 y Fu(:)p
+Fo(tuple)p 476 1531 V 21 w(size)k Ft(=)h Fi(D)730 1539
+y Fg(2)766 1531 y Fu(:)p Fo(tuple)p 905 1531 V 21 w(size)14
+b Ft(+)h Fi(D)1151 1539 y Fg(3)1187 1531 y Fu(:)p Fo(tuple)p
+1326 1531 V 21 w(size)f Ft(;)244 1597 y Fi(D)301 1605
+y Fg(6)337 1597 y Fu(:)p Fo(num)p 463 1597 V 21 w(records)19
+b Ft(=)g Fo(cardinality)c Ft(\()p Fi(D)1087 1605 y Fg(2)1123
+1597 y Fu(;)c Fi(D)1211 1605 y Fg(3)1247 1597 y Ft(\))j(;)31
+1664 y Ff(gg)588 1806 y Fz(\(b\))j(Join)g(associati)n(vity)p
+1834 1928 4 1905 v -110 1931 1947 4 v 1835 1948 19 1912
+v -93 1948 1947 19 v 606 2131 a FG(Figure)i(2:)30 b(T)-8
+b(-rule)-112 2371 y Fx(2.3)99 b(T)-7 b(ransf)n(ormation)24
+b(rules)-112 2549 y FG(T)m(ransformation)30 b(rules,)35
+b(or)e(T)-8 b(-rules)32 b(for)h(short,)i(de\256ne)d(equi)n(v)n(a-)-112
+2649 y(lences)f(among)f(pairs)h(of)g(e)o(xpressions;)k(the)o(y)c
+(de\256ne)f(mappings)-112 2748 y(from)g(one)h(operator)f(tree)i(to)g
+(another)-5 b(.)63 b(Let)32 b Fv(E)37 b FG(and)31 b Fv(E)1585
+2718 y Ff(0)1641 2748 y FG(be)g(e)o(x-)-112 2848 y(pressions)20
+b(that)h(in)m(v)n(olv)o(e)e(only)h(abstract)h(operators.)29
+b(Equation)19 b(\(1\))-112 2948 y(\(sho)n(wn)j(in)i(Figure)g(2\(a\)\))e
+(sho)n(ws)i(the)g(general)f(form)g(of)g(a)i(T)-8 b(-rule.)-112
+3047 y(The)20 b(actions)g(of)h(a)g(T)-8 b(-rule)20 b(de\256ne)g(the)h
+(equi)n(v)n(alences)e(between)h(the)-112 3147 y(descriptors)d(of)i
+(nodes)g(of)f(the)i(original)d(operator)h(tree)h Fv(E)25
+b FG(with)19 b(the)-112 3246 y(nodes)g(of)g(the)h(output)e(tree)i
+Fv(E)756 3216 y Ff(0)780 3246 y FG(;)g(these)g(actions)g(consist)g(of)f
+(a)h(series)-112 3346 y(of)h(\(C)i(or)f(C++\))g(assignment)751
+3316 y Ft(2)809 3346 y FG(statements.)35 b(The)22 b(left-hand)e(sides)
+-112 3446 y(of)30 b(these)i(statements)f(refer)g(to)g(descriptors)f(of)
+h(e)o(xpressions)f(on)-112 3545 y(the)20 b(right-hand)e(side)j(of)f
+(the)g(T)-8 b(-rule;)20 b(the)h(right-hand)d(sides)j(of)f(the)-112
+3645 y(statements)14 b(can)h(refer)e(to)i(an)o(y)f(descriptor)f(in)i
+(the)f(T)-8 b(-rule.)27 b(Function)-112 3745 y(\(called)d
+FF(helper)i FG(functions\))d(calls)j(can)e(also)i(appear)d(on)i(the)f
+(right)-112 3844 y(side)d(of)g(the)g(assignment)f(statements.)32
+b(Thus,)20 b(descriptors)g(on)h(the)-112 3944 y FF(left-hand)29
+b(side)i FG(of)g(a)g(T)-8 b(-rule)31 b(are)g FF(ne)o(ver)h
+FG(changed)e(in)h(the)g(rule')-5 b(s)-112 4043 y(actions.)28
+b(A)18 b FF(test)i FG(is)f(needed)d(to)i(determine)e(if)i(the)g
+(transformations)-112 4143 y(of)h(the)i(T)-8 b(-rule)19
+b(are)h(in)h(f)o(act)f(applicable.)-29 4254 y(Purely)15
+b(as)h(an)g(optimization,)f(it)h(is)h(usually)f(the)f(case)i(that)f
+(not)f(all)-112 4354 y(statements)g(in)g(a)g(T)-8 b(-rule')j(s)15
+b(actions)g(need)f(to)h(be)g(e)o(x)o(ecuted)e(prior)h(to)h(a)-112
+4454 y(T)-8 b(-rule')j(s)18 b(test.)29 b(F)o(or)18 b(this)h(reason,)f
+(the)g(actions)g(of)g(a)h(T)-8 b(-rule)18 b(are)g(split)-112
+4553 y(into)j(tw)o(o)h(groups;)f(those)h(that)g(need)f(to)h(be)g(e)o(x)
+o(ecuted)e(prior)h(to)h(the)-112 4653 y(T)-8 b(-rule')j(s)13
+b(test,)i(and)e(those)g(that)h(can)f(be)g(e)o(x)o(ecuted)f(after)h(a)h
+(successful)-112 4752 y(test.)29 b(These)19 b(groups)f(of)h(statements)
+g(comprise,)g(respecti)n(v)o(ely)-5 b(,)17 b(the)p -112
+4870 788 4 v -28 4924 a Fr(2)7 4947 y Fz(The)c(actions)i(can)f(be)f
+(non-assignment)j(statements)f(\(lik)o(e)g(function)g(calls\),)g(b)o
+(ut)-112 5026 y(in)23 b(this)h(case,)i(the)e(P2V)f(pre-processor)j
+(\(described)f(in)f(Section)h(3\))f(needs)g(some)-112
+5105 y(hints)h(about)i(the)f(properties)h(that)g(are)f(changed)h(by)e
+(the)h(statement)h(in)f(order)g(to)-112 5184 y(correctly)17
+b(cate)o(gorize)h(each)d(property)l(.)25 b(F)o(or)14
+b(simplicity)l(,)j(in)d(this)h(paper)m(,)h(we)f(assume)-112
+5263 y(all)j(actions)g(consist)g(of)f(assignment)i(statements.)p
+2046 24 1947 4 v 2046 1687 4 1664 v 2187 92 a Fu(E)s
+Ft(\()p Fu(x)2303 100 y Fn(1)2335 92 y Fu(;)11 b(:)g(:)g(:)g(;)g(x)2528
+100 y Fl(n)2568 92 y Ft(\))19 b(:)g Fi(D)2708 100 y Fg(1)2763
+92 y Ft(=)-11 b Ff(\))18 b Fu(A)p Ft(\()p Fu(x)3001 100
+y Fn(1)3033 92 y Fu(;)11 b(:)g(:)g(:)g(;)h(x)3227 100
+y Fl(n)3267 92 y Ft(\))19 b(:)f Fi(D)3406 100 y Fg(2)3812
+92 y Fo(\(3\))2187 159 y(test)2187 225 y Ff(ff)2401 292
+y Fo(pre-opt)d(statements)2187 358 y Ff(gg)2187 424 y(ff)2401
+491 y Fo(post-opt)g(statements)2187 557 y Ff(gg)2639
+700 y Fz(\(a\))i(General)i(form)e(of)g(an)g(I-rule)p
+2095 798 1849 4 v 2187 875 a Fo(SOR)m(T)o Ft(\()p Fu(S)2399
+883 y Fn(1)2431 875 y Ft(\))i(:)f Fi(D)2570 883 y Fg(2)2625
+875 y Ft(=)-11 b Ff(\))19 b Fo(Mer)o(ge)p 2904 875 18
+4 v 21 w(sort)p Ft(\()p Fu(S)3076 883 y Fn(1)3108 875
+y Ft(\))g(:)f Fi(D)3247 883 y Fg(3)3812 875 y Fo(\(4\))2187
+958 y Ft(\()p Fi(D)2270 966 y Fg(2)2306 958 y Fu(:)p
+Fo(tuple)p 2445 958 V 20 w(order)e Ft(!)9 b(=)18 b Fo(DONT)p
+2862 958 V 21 w(CARE)o Ft(\))2187 1024 y Ff(ff)2401 1090
+y Fi(D)2458 1098 y Fg(3)2512 1090 y Ft(=)h Fi(D)2639
+1098 y Fg(2)2690 1090 y Ft(;)2187 1157 y Ff(gg)2187 1223
+y(ff)2401 1290 y Fi(D)2458 1298 y Fg(3)2493 1290 y Fu(:)p
+Fo(cost)g Ft(=)g Fi(D)2753 1298 y Fg(1)2788 1290 y Fu(:)p
+Fo(cost)2699 1356 y Ft(+\()p Fi(D)2833 1364 y Fg(3)2868
+1356 y Fu(:)p Fo(num)p 2994 1356 V 21 w(records)p Ft(\))c
+Ff(\003)h Ft(log\()p Fi(D)3442 1364 y Fg(3)3478 1356
+y Fu(:)p Fo(num)p 3604 1356 V 21 w(records)p Ft(\))f(;)2187
+1423 y Ff(gg)2630 1565 y Fz(\(b\))i(Mer)o(ge-sort)i(sort)e(algorithm)p
+3990 1687 4 1664 v 2046 1690 1947 4 v 3992 1707 19 1670
+v 2063 1707 1947 19 v 2770 1890 a FG(Figure)i(3:)30 b(I-rule)2044
+2113 y FF(pr)m(e-test)22 b FG(and)d FF(post-test)j FG(statements)e(of)g
+(the)g(T)-8 b(-rule.)3566 2083 y Ft(3)2044 2330 y FG(E)p
+Fz(XAMPLE)19 b FG(4.)145 b(The)21 b(associati)n(vity)f(of)h(JOINs)g(is)
+h(e)o(xpressed)d(by)2044 2429 y(T)-8 b(-rule)19 b(\(2\))h(in)g(Figure)g
+(2\(b\).)1082 b Fs(\003)2044 2683 y Fx(2.4)99 b(Implementation)26
+b(rules)2044 2844 y FG(Implementation)k(rules,)37 b(or)c(I-rules)f(for)
+h(short,)j(de\256ne)d(equi)n(v)n(a-)2044 2944 y(lences)f(between)f(e)o
+(xpressions)f(and)i(their)f(implementing)f(algo-)2044
+3043 y(rithms.)k(Let)23 b Fv(E)k FG(be)22 b(an)g(e)o(xpression)f(and)g
+Fv(A)i FG(be)f(an)g(algorithm)f(that)2044 3143 y(implements)27
+b Fv(E)5 b FG(.)52 b(The)28 b(general)e(form)h(of)h(an)f(I-rule)g(is)i
+(gi)n(v)o(en)d(by)2044 3243 y(Equation)18 b(\(3\))i(\(sho)n(wn)f(in)h
+(Figure)g(3\(a\)\).)2127 3345 y(The)g(actions)h(associated)g(with)g(an)
+g(I-rule)f(are)h(de\256ned)e(in)j(three)2044 3445 y(parts.)37
+b(The)23 b(\256rst)h(part,)f(or)g FF(test)p FG(,)h(is)g(a)g(boolean)d
+(e)o(xpression)g(whose)2044 3544 y(v)n(alue)e(determines)g(whether)g
+(or)h(not)g(the)g(rule)g(can)g(be)g(applied.)2127 3647
+y(The)c(second)g(part,)h(or)f FF(pr)m(e-opt)f(statements)p
+FG(,)j(is)f(a)g(set)h(of)e(descrip-)2044 3747 y(tor)23
+b(assignment)g(statements)h(that)g(are)g(e)o(x)o(ecuted)d(only)i(if)h
+(the)g(test)2044 3846 y(is)h(true)f(and)g FF(befor)m(e)g
+FG(an)o(y)f(of)h(the)h(inputs)e Fv(x)3295 3858 y Fu(i)3348
+3846 y FG(of)h Fv(E)30 b FG(are)25 b(optimized.)2044
+3946 y(Additional)d(parameters)g(of)i(nodes)f(are)g(usually)g(assigned)
+g(in)h(the)2044 4045 y(pre-opt)f(section.)45 b(This)25
+b(is)h(necessary)f(before)f(an)o(y)g(of)h(the)h(nodes)2044
+4145 y(on)20 b(the)g(right)f(side)i(can)f(be)g(optimized.)2127
+4248 y(The)g(third)h(part,)g(or)f FF(post-opt)g(statements)p
+FG(,)h(is)h(a)g(set)f(of)g(descrip-)2044 4347 y(tor)i(assignment)g
+(statements)g(that)h(are)f(e)o(x)o(ecuted)e FF(after)26
+b FG(all)e Fv(x)3859 4359 y Fu(i)3911 4347 y FG(are)2044
+4447 y(optimized.)29 b(Normally)-5 b(,)19 b(the)i(post-opt)f
+(statements)g(compute)g(cost)2044 4546 y(properties)15
+b(that)h(can)h(only)e(be)i(determined)d(once)i(the)g(inputs)g(to)h(the)
+2044 4646 y(algorithm)k(are)h(completely)f(optimized)g(and)h(their)g
+(costs)h(kno)n(wn.)2044 4746 y(This)34 b FF(does)f(not)p
+FG(,)k(ho)n(we)n(v)o(er)m(,)e(imply)e(a)h(bottom-up)e(optimization)2044
+4845 y(strate)o(gy)-5 b(.)43 b(It)25 b(simply)g(means)g(that)g
+(although)f(I-rules)g(are)h(applied)2044 4945 y(to)20
+b(parents)g(before)f(their)i(children)e(are)h(optimized,)f(the)i
+FF(cost)h FG(\(and)p 2044 5028 788 4 v 2129 5081 a Fr(3)2163
+5105 y Fz(W)-5 b(e)28 b(suspect)h(it)g(is)f(possible)i(to)f(use)f
+(data-\257o)n(w)i(analysis)g(to)e(partition)j(the)2044
+5184 y(assignment)17 b(statements)h(automatically)l(,)h(b)o(ut)d(for)g
+(no)n(w)l(,)g(we)f(let)i(the)g(rule-writer)h(do)2044
+5263 y(the)g(partitioning.)p eop
+%%Page: 5 5
+5 4 bop -112 21 a FG(other)17 b(properties)f(in)i(the)g(post-opt)e
+(section\))i(of)f(the)h(parent)f(cannot)-112 120 y(be)j(computed)e
+(until)i(the)g(children)f(ha)n(v)o(e)g(been)h(optimized.)-112
+325 y(E)p Fz(XAMPLE)f FG(5.)149 b(Equation)24 b(\(4\))g(\(in)g(Figure)h
+(3\(b\)\))e(sho)n(ws)i(the)g(I-)-112 425 y(rule)19 b(that)i(implements)
+e(the)h(SOR)-5 b(T)21 b(operator)d(by)i(Mer)o(ge)p 1564
+425 25 4 v 28 w(sort.)59 b Fs(\003)-112 668 y Fx(2.5)99
+b(Null)24 b(algorithm)-112 826 y FG(Recall)h(that,)g(in)g(Section)f(1,)
+h(we)g(mentioned)e(that)h(Prairie)h(allo)n(ws)-112 925
+y(users)f(to)g(treat)g(all)g(operators)f(and)g(algorithms)g(as)i
+(\256rst-class)g(ob-)-112 1025 y(jects,)g(i.e.,)g(all)f(operators)f
+(and)h(algorithms)e(are)i(e)o(xplicit,)h(in)f(con-)-112
+1125 y(trast)36 b(to)h(enforcers)e(in)h(V)-11 b(olcano)36
+b(or)g(glue)g(in)g(Starb)n(urst.)78 b(This)-112 1224
+y(requires)23 b(that)h(Prairie)h(pro)o(vide)d(a)j(mechanism)e(where)g
+(users)i(can)-112 1324 y(also)20 b(\252delete\272)g(one)g(or)g(more)g
+(of)g(the)g(e)o(xplicit)g(operators)f(from)g(e)o(x-)-112
+1423 y(pressions.)37 b(This)24 b(is)g(done)e(by)h(ha)n(ving)f(a)h
+(special)h(class)g(of)f(I-rules)-112 1523 y(that)16 b(ha)n(v)o(e)g(the)
+h(form)f(gi)n(v)o(en)f(by)i(Equation)e(\(5\))h(in)h(Figure)f(4\(a\).)27
+b(The)-112 1623 y(left)21 b(side)h(of)g(the)f(rule)g(is)i(a)f(single)g
+(abstract)f(operator)f Fv(O)25 b FG(with)c(one)-112 1722
+y(stream)j(input)f Fv(S)380 1734 y Ft(1)418 1722 y FG(.)42
+b(The)24 b(right)g(side)g(of)g(the)h(rule)f(is)h(an)f(algorithm)-112
+1822 y(called)f(\252Null\272)g(with)h(the)f(same)h(stream)f(input)g(b)n
+(ut)g(with)h(a)g(dif)n(fer)n(-)-112 1922 y(ent)d(descriptor)-5
+b(.)34 b(As)23 b(the)f(name)f(suggests,)h(the)g(Null)g(algorithm)f(is)
+-112 2021 y(supposed)26 b(to)i(pass)h(its)f(input)g(unchanged)d(to)j
+(algorithms)e(abo)o(v)o(e)-112 2121 y(it)e(in)f(an)g(operator)f(tree.)
+39 b(This)23 b(is)h(accomplished)e(in)h(the)h(I-rule)e(as)-112
+2220 y(follo)n(ws.)-29 2321 y(The)g(test)h(for)f(this)h(I-rule)f(is)h
+(al)o(w)o(ays)g(TR)m(UE,)f(i.e.,)h(an)o(y)f(node)g(in)-112
+2421 y(an)f(operator)f(tree)i(with)g Fv(O)k FG(as)c(its)h(operator)d
+(can)i(be)g(implemented)-112 2520 y(by)d(the)g(Null)h(algorithm.)27
+b(The)20 b(actions)f(associated)g(with)h(this)g(rule)-112
+2620 y(ha)n(v)o(e)c(a)i(speci\256c)f(pattern.)27 b(The)17
+b(pre-opt)f(section)h(consists)g(of)g(three)-112 2720
+y(statements.)38 b(The)22 b(\256rst)i(statement)f(copies)g(the)g
+(descriptor)f(of)h(the)-112 2819 y(operator)29 b Fv(O)35
+b FG(to)d(the)g(algorithm)e(Null.)65 b(The)31 b(second)g(statement)-112
+2919 y(sets)36 b(the)f(descriptor)e(of)i(the)g(stream)g
+Fv(S)1102 2931 y Ft(1)1174 2919 y FG(on)g(the)g(right)f(side)i(to)-112
+3018 y(the)31 b(descriptor)g(of)g(the)h(stream)g Fv(S)926
+3030 y Ft(1)996 3018 y FG(on)f(the)h(left)g(side.)64
+b(Why)32 b(is)-112 3118 y(it)23 b(necessary)f(to)h(do)f(this?)38
+b(The)22 b(k)o(e)o(y)h(lies)g(in)g(the)g(third)f(statement.)-112
+3218 y(This)13 b(statement)g(copies)g(the)g(property)g(\252prop)o(erty)
+o(\272)g(of)g(the)f(oper)o(ator)-112 3317 y Fv(O)21 b
+FG(node)d(on)g(the)g(left)h(side)g(to)g(the)f(\252property\272)e(of)j
+(the)f(input)g(stream)-112 3417 y Fv(S)-61 3429 y Ft(1)-5
+3417 y FG(on)g(the)g(right)g(side.)29 b(Since)18 b(left-hand)f(side)i
+(descriptors)e(cannot)-112 3517 y(be)25 b(changed)g(in)h(an)g(I-rule,)g
+(a)h(ne)n(w)e(descriptor)g Fj(D)1383 3529 y Fi(3)1452
+3517 y FG(is)i(necessary)-112 3616 y(for)19 b Fv(S)56
+3628 y Ft(1)114 3616 y FG(to)h(con)m(v)o(e)o(y)e(the)i(property)e
+(propagation)f(information.)-29 3717 y(The)48 b(post-opt)f(section)h
+(in)h(the)g(I-rule)e(has)i(only)f(a)h(cost-)-112 3816
+y(assignment)23 b(statement;)k(this)e(simply)g(sets)h(the)e(cost)h(of)g
+(the)g(Null)-112 3916 y(node)19 b(to)h(the)g(cost)h(of)f(its)h
+(optimized)e(input)g(stream.)-29 4017 y(The)f(Null)h(algorithm,)e
+(therefore,)g(serv)o(es)h(to)h(ef)n(fecti)n(v)o(ely)e(trans-)-112
+4116 y(form)i(a)h(single)g(operator)f(to)h(a)h(no-op.)-112
+4322 y(E)p Fz(XAMPLE)e FG(6.)149 b(Equation)24 b(\(6\))g(\(in)g(Figure)
+h(4\(b\)\))e(sho)n(ws)i(the)g(I-)-112 4421 y(rule)15
+b(that)g(re)n(writes)h(the)f(SOR)-5 b(T)17 b(operator)c(to)j(use)g(a)g
+(Null)g(algorithm.)-112 4521 y Fs(\003)-112 4876 y FB(3)119
+b(The)30 b(P2V)g(pr)n(e-pr)n(ocessor)-112 5063 y FG(In)38
+b(Section)g(1,)43 b(we)c(enumerated)e(the)h(four)g(primary)f(goals)h
+(of)-112 5163 y(Prairie,)22 b(viz.,)g(uniformity)e(in)i(operator)e(and)
+i(algorithms;)f(unifor)n(-)-112 5263 y(mity)i(in)h(properties;)h
+(uniformity)c(in)j(property-transformations;)p 2046 24
+1947 4 v 2046 1886 4 1863 v 2187 92 a Fu(O)r Ft(\()p
+Fu(S)2306 100 y Fn(1)2338 92 y Ft(\))19 b(:)g Fi(D)2478
+100 y Fg(2)2532 92 y Ft(=)-11 b Ff(\))19 b Fo(Null)q
+Ft(\()p Fu(S)2828 100 y Fn(1)2879 92 y Ft(:)f Fi(D)2973
+100 y Fg(3)3009 92 y Ft(\))h(:)g Fi(D)3149 100 y Fg(4)3812
+92 y Fo(\(5\))2187 159 y(TR)n(UE)2187 225 y Ff(ff)2401
+292 y Fi(D)2458 300 y Fg(4)2512 292 y Ft(=)g Fi(D)2639
+300 y Fg(2)2690 292 y Ft(;)2401 358 y Fi(D)2458 366 y
+Fg(3)2512 358 y Ft(=)g Fi(D)2639 366 y Fg(1)2690 358
+y Ft(;)2401 424 y Fi(D)2458 432 y Fg(3)2493 424 y Fu(:)p
+Fo(property)h Ft(=)f Fi(D)2856 432 y Fg(2)2892 424 y
+Fu(:)p Fo(property)c Ft(;)2187 491 y Ff(gg)2187 557 y(ff)2401
+624 y Fi(D)2458 632 y Fg(4)2493 624 y Fu(:)p Fo(cost)k
+Ft(=)g Fi(D)2753 632 y Fg(3)2788 624 y Fu(:)p Fo(cost)14
+b Ft(;)2187 690 y Ff(gg)2559 832 y Fz(\(a\))j(General)i(form)e(of)g(a)g
+(\252Null\272)h(I-rule)p 2095 931 1849 4 v 2187 1007
+a Fo(SOR)m(T)o Ft(\()p Fu(S)2399 1015 y Fn(1)2431 1007
+y Ft(\))h(:)f Fi(D)2570 1015 y Fg(2)2683 1007 y Ft(=)-11
+b Ff(\))19 b Fo(Null)p Ft(\()p Fu(S)2978 1015 y Fn(1)3029
+1007 y Ft(:)g Fi(D)3124 1015 y Fg(3)3160 1007 y Ft(\))g(:)g
+Fi(D)3300 1015 y Fg(4)3812 1007 y Fo(\(6\))2187 1090
+y(TR)n(UE)2187 1157 y Ff(ff)2401 1223 y Fi(D)2458 1231
+y Fg(4)2512 1223 y Ft(=)g Fi(D)2639 1231 y Fg(2)2690
+1223 y Ft(;)2401 1290 y Fi(D)2458 1298 y Fg(3)2512 1290
+y Ft(=)g Fi(D)2639 1298 y Fg(1)2690 1290 y Ft(;)2401
+1356 y Fi(D)2458 1364 y Fg(3)2493 1356 y Fu(:)p Fo(tuple)p
+2632 1356 18 4 v 21 w(order)h Ft(=)f Fi(D)2919 1364 y
+Fg(2)2955 1356 y Fu(:)p Fo(tuple)p 3094 1356 V 20 w(order)d
+Ft(;)2187 1423 y Ff(gg)2187 1489 y(ff)2401 1555 y Fi(D)2458
+1563 y Fg(4)2493 1555 y Fu(:)p Fo(cost)j Ft(=)g Fi(D)2753
+1563 y Fg(3)2788 1555 y Fu(:)p Fo(cost)14 b Ft(;)2187
+1622 y Ff(gg)2718 1764 y Fz(\(b\))j(Null)h(sort)f(algorithm)p
+3990 1886 4 1863 v 2046 1889 1947 4 v 3992 1906 19 1870
+v 2063 1906 1947 19 v 2365 2089 a FG(Figure)j(4:)29 b(The)20
+b(\252Null\272)g(algorithm)f(concept)2044 2301 y(and)36
+b(ef)n(\256cient)h(generation)f(of)h(Prairie)g(optimizers.)79
+b(The)37 b(\256rst)2044 2401 y(three)17 b(goals)h(are)f(dri)n(v)o(en)f
+(by)i(the)f(need)g(for)g(conceptual)f(simplicity;)2044
+2500 y(ho)n(we)n(v)o(er)m(,)34 b(the)o(y)e(alone)h(do)g(not)g
+(necessarily)f(generate)h(ef)n(\256cient)2044 2600 y(optimizers.)62
+b(The)32 b(P2V)g(pre-processor)d(ensures)i(that)h(ef)n(\256cient)2044
+2699 y(optimizers)e(can)h(be)f(realized)h(from)f(Prairie)h
+(speci\256cations,)h(by)2044 2799 y(translating)d(them)g(to)h(the)g(V)
+-11 b(olcano)29 b(frame)n(w)o(ork)f(and)i(then)f(gen-)2044
+2899 y(erating)22 b(an)h(optimizer)f(by)h(compiling)f(with)h(the)g(V)
+-11 b(olcano)22 b(search)2044 2998 y(engine.)27 b(This)17
+b(Prairie)g(optimizer)n(-generator)c(paradigm)i(is)j(sho)n(wn)2044
+3098 y(schematically)k(in)g(Figure)g(5.)37 b(The)22 b(pre-processor)f
+(itself)i(is)g(4500)2044 3198 y(lines)f(of)j Fd(flex)d
+FG(and)f Fd(bison)g FG(code.)33 b(In)21 b(this)h(section,)g(we)g
+(brie\257y)2044 3297 y(describe)13 b(the)h(pre-processor)d(steps)k(and)
+f(e)o(xplain)e(why)h(the)i(Prairie-)2044 3397 y(to-V)-11
+b(olcano)26 b(transformation)g(is)k(non-tri)n(vial.)51
+b(A)29 b(more)f(detailed)2044 3496 y(description)18 b(of)i(the)h
+(pre-processor)c(is)k(gi)n(v)o(en)e(in)i([5].)2127 3596
+y(The)c(speci\256cation)h(of)f(an)h(optimizer)f(in)h(V)-11
+b(olcano)17 b(consists)i(of)f(a)2044 3696 y(set)i(of)f(transformation)e
+(rules)j(\(called)f(\252trans)p 3386 3696 25 4 v 29 w(rules\272\))g
+(and)g(imple-)2044 3795 y(mentation)14 b(rules)g(\(called)g(\252impl)p
+3004 3795 V 24 w(rules\272\),)g(a)g(set)g(of)g(properties,)e(and)2044
+3895 y(some)i(support)g(functions.)22 b(The)14 b(join)g(associati)n
+(vity)g(trans)p 3736 3895 V 26 w(rule)g(\(cf.)2044 3995
+y(Figure)19 b(2\(b\)\))g(in)h(V)-11 b(olcano)20 b(is)h(as)g(follo)n(ws)
+3259 3964 y Ft(4)3295 3995 y FG(:)2210 4155 y Ft(\()p
+Fo(JOIN)f(?op)p 2469 4155 18 4 v 21 w(ar)o(g5)h Ft(\(\()p
+Fo(JOIN)g(?op)p 2896 4155 V 21 w(ar)o(g4)g Ft(\(?1)g(?2\)\))g(?3\)\))
+2293 4280 y Ff(\000)-23 b Fu(>)p Ft(\()p Fo(JOIN)20 b(?op)p
+2633 4280 V 21 w(ar)o(g7)h Ft(\(?1)g(\()p Fo(JOIN)g(?op)p
+3145 4280 V 21 w(ar)o(g6)g Ft(\(?2)g(?3\)\)\)\))2044
+4440 y FG(The)32 b(important)f(point)h(to)g(note)h(is)g(the)g(use)f(of)
+h FF(oper)o(ator)e(ar)m(gu-)2044 4540 y(ments)21 b FG(\(denoted)e(by)h
+(\252op)p 2801 4540 25 4 v 29 w(ar)o(g\272)g(in)g(rules\);)h(these)g
+(ar)o(guments)e(con-)2044 4640 y(tain)i(properties)g(used)g(in)h(the)g
+(rule')-5 b(s)21 b(actions,)h(b)n(ut)f(unlik)o(e)g(Prairie,)2044
+4739 y(the)o(y)31 b(do)g(not)h(contain)e FF(all)j FG(the)e(properties)g
+(of)g(an)h(operator)e(tree)2044 4839 y(node.)e(There)18
+b(are)h(other)f(property)f(classes,)k(lik)o(e)e(algorithm)f(ar)o(gu-)
+2044 4939 y(ment,)26 b(logical)f(property)-5 b(,)23 b(system)j
+(property)-5 b(,)24 b(physical)g(property)-5 b(,)2044
+5038 y(and)25 b(cost.)46 b(Thus,)26 b(while)g(Prairie)g(uses)g(a)g
+(uniform)e(descriptor)g(to)p 2044 5107 788 4 v 2129 5160
+a Fr(4)2163 5184 y Fz(There)15 b(are)f(conditions)j(and)d(actions)i
+(associated)g(with)f(V)-9 b(olcano)16 b(rules)e(that)h(are)2044
+5263 y(not)i(sho)n(wn)h(here.)p eop
+%%Page: 6 6
+6 5 bop -98 24 1923 4 v -98 1420 4 1397 v 371 1324 a
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 17.07164 128.0373
+119.50148 128.0373 119.50148 25.60745 17.07164 25.60745 /Lineto /lineto
+load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 153.64476
+102.42984 153.64476 102.42984 136.57312 34.14328 136.57312 /Lineto
+/lineto load def false Polygon gsave 1. setgray fill grestore gsave
+0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 754 139 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.0875
+neg 47.33098 7.711 .5 Frame gsave 1. setgray fill grestore end
+
+
+@endspecial Fo(Prairie)15 b(Rule)f(Set)371 1324 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 119.50148 68.28656 136.57312
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 34.14328 119.50148
+102.42984 119.50148 102.42984 102.42984 34.14328 102.42984 /Lineto
+/lineto load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap
+stroke grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial
+719 416 a(P2V)h(Pre-processor)371 1324 y @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 85.3582 68.28656 102.42984
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 85.3582 102.42984
+85.3582 102.42984 68.28656 34.14328 68.28656 /Lineto /lineto load
+def false Polygon gsave 0.5 setgray fill grestore gsave 0.8 SLW 0.
+setgray 0 setlinecap stroke grestore end
+
+@endspecial
+736 706 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.0875
+neg 51.482 7.711 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(V)-7
+b(olcano)14 b(Rule)h(Set)371 1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 51.21492 68.28656 68.28656
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 34.14328 51.21492
+102.42984 51.21492 102.42984 34.14328 34.14328 34.14328 /Lineto /lineto
+load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial 843
+950 a(V)-7 b(olcano)694 1017 y(Optimizer)o(-Generator)371
+1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 68.28656 17.07164 68.28656 34.14328
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 34.14328 17.07164
+102.42984 17.07164 102.42984 0.0 34.14328 0.0 /Lineto /lineto load
+def false Polygon gsave 0.5 setgray fill grestore gsave 0.8 SLW 0.
+setgray 0 setlinecap stroke grestore end
+
+@endspecial 740 1267 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 4.526
+neg 50.62799 7.711 .5 Frame gsave 1. setgray fill grestore end
+
+
+@endspecial(Query)15 b(Optimizer)-948 b(Operator)15
+b(T)n(ree)371 1324 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 34.14328 8.53581 17.07164 8.53581
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 119.50148 8.53581 102.42984 8.53581
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial 1363 1273 a(Access)e(Plan)p
+1822 1420 V -98 1423 1923 4 v 1823 1440 19 1403 v -81
+1440 1923 19 v -112 1623 a FG(Figure)58 b(5:)107 b(The)58
+b(Prairie)h(optimizer)n(-generator)c(paradigm.)-112 1722
+y(Double-box)o(ed)60 b(modules)j(represent)f(softw)o(are)i(generators,)
+-112 1822 y(shaded)17 b(box)o(es)g(represent)g(generated)g(programs.)26
+b(The)18 b(outermost)-112 1922 y(double-box)o(ed)e(portion)k(denotes)g
+(the)h(Prairie)g(optimizer)f(genera-)-112 2021 y(tor)-5
+b(.)-112 2214 y(encode)14 b(properties,)h(V)-11 b(olcano)14
+b(partitions)h(the)h(properties)e(into)h(dif-)-112 2314
+y(ferent)27 b(classes.)53 b(The)27 b(P2V)h(pre-processor)e(partitions)h
+(a)h(Prairie)-112 2414 y(descriptor)33 b(into)i(the)h(dif)n(ferent)d
+(property)g(classes)k(required)c(by)-112 2513 y(V)-11
+b(olcano.)30 b(This)22 b(is)g(a)f(non-tri)n(vial)e(task,)j(since)f(it)h
+(requires)e(parsing)-112 2613 y(the)g(Prairie)g(rules)g(and)g(their)g
+(actions.)-29 2713 y(Impl)p 134 2713 25 4 v 28 w(rules)15
+b(in)g(V)-11 b(olcano)14 b(defer)g(most)h(of)g(the)f(actions)h
+(associated)-112 2812 y(with)j(the)g(rules)f(to)h(support)f(functions.)
+27 b(Each)17 b(algorithm)g(has)h(four)-112 2912 y(support)d(functions)g
+(associated)i(with)g(it.)29 b(A)17 b(Prairie)g(speci\256cation,)-112
+3011 y(on)f(the)g(other)g(hand,)g(contains)g(all)h(the)g(actions)f(in)h
+(the)g(correspond-)-112 3111 y(ing)i(rule.)29 b(The)19
+b(P2V)h(pre-processor)e(parses)i(a)g(Prairie)g(I-rule,)e(and)-112
+3211 y(automatically)29 b(generates)h(all)i(the)f(V)-11
+b(olcano)30 b(support)g(functions)-112 3310 y(from)24
+b(the)h(rule.)44 b(This)26 b(is)g(also)g(a)f(comple)o(x)f(process,)i
+(since)f(it)h(de-)-112 3410 y(pends)c(partly)h(on)g(the)h(partitioning)
+e(of)h(properties)f(mentioned)g(in)-112 3510 y(the)28
+b(last)i(paragraph,)e(and)h(also)g(because)f(it)h(requires)f
+(relocating)-112 3609 y(pieces)d(of)g(code)f(from)g(Prairie)h(rules)h
+(to)f(V)-11 b(olcano)24 b(support)g(func-)-112 3709 y(tions.)-29
+3808 y(The)d(third)g(salient)h(feature)e(of)i(a)g(V)-11
+b(olcano)20 b(speci\256cation)h(is)i(the)-112 3908 y(presence)13
+b(of)h(implicit,)i(or)e(hidden,)g(algorithms,)g(called)h
+FF(enfor)m(cer)o(s)p FG(.)-112 4008 y(In)f(Prairie,)h(all)g(algorithms)
+e(are)h(e)o(xplicit.)26 b(Consider)m(,)15 b(for)e(e)o(xample,)-112
+4107 y(the)18 b(Mer)o(ge)p 230 4107 V 28 w(sort)h(algorithm)e(in)i
+(Figure)f(3\(b\).)27 b(In)18 b(a)h(V)-11 b(olcano)18
+b(spec-)-112 4207 y(i\256cation,)24 b(this)g(algorithm)f(w)o(ould)g(be)
+h(classi\256ed)h(as)f(an)g(enforcer)m(,)-112 4307 y(since)34
+b(it)h(enforces)e(the)h(sortedness)g(property)-5 b(.)69
+b(The)34 b(P2V)h(pre-)-112 4406 y(processor)27 b(determines)h(the)h
+(Prairie)g(algorithms)f(that)h(are)g(func-)-112 4506
+y(tionally)g(V)-11 b(olcano)30 b(enforcers,)h(and)e(deletes)i(the)f
+(corresponding)-112 4605 y(Prairie)k(rules)g(to)g(generate)f(the)h(V)
+-11 b(olcano)33 b(speci\256cation.)71 b(This)-112 4705
+y(requires)33 b(the)i(pre-processor)e(to)i(migrate)f(the)h(\(deleted\))
+f(rule')-5 b(s)-112 4805 y(actions)19 b(to)i(V)-11 b(olcano)19
+b(support)g(functions.)-29 4904 y(The)27 b(P2V)i(pre-processor)c(also)k
+(generates)e(a)i(set)g(of)f(compact)-112 5004 y(V)-11
+b(olcano)24 b(rules)i(by)f(mer)o(ging)f(Prairie)h(rules)h(whene)n(v)o
+(er)d(possible.)-112 5104 y(Consider)m(,)18 b(for)i(e)o(xample,)f(the)h
+(follo)n(wing)e(set)j(of)f(rules)g(in)h(Prairie:)-103
+5263 y Fo(JOIN)p Ft(\()p Fu(S)90 5271 y Fn(1)122 5263
+y Fu(;S)183 5271 y Fn(2)215 5263 y Ft(\):)p Fi(D)317
+5271 y Fg(3)436 5263 y Fh(=)-14 b Fk(\))83 b Fo(JOPR)o
+Ft(\()p Fo(SOR)m(T)o Ft(\()p Fu(S)1026 5271 y Fn(1)1058
+5263 y Ft(\):)p Fi(D)1160 5271 y Fg(4)1196 5263 y Fu(;)p
+Fo(SOR)m(T)o Ft(\()p Fu(S)1428 5271 y Fn(2)1460 5263
+y Ft(\):)p Fi(D)1562 5271 y Fg(5)1597 5263 y Ft(\):)p
+Fi(D)1699 5271 y Fg(6)2127 21 y Fo(SOR)m(T)o Ft(\()p
+Fu(S)2339 29 y Fn(1)2371 21 y Ft(\):)p Fi(D)2473 29 y
+Fg(2)2592 21 y Fh(=)-14 b Fk(\))83 b Fo(Null)p Ft(\()p
+Fu(S)2979 29 y Fn(1)3011 21 y Ft(:)p Fi(D)3087 29 y Fg(3)3123
+21 y Ft(\):)p Fi(D)3225 29 y Fg(4)2044 145 y Fo(JOPR)o
+Ft(\()p Fu(S)2246 153 y Fn(1)2279 145 y Fu(;S)2340 153
+y Fn(2)2371 145 y Ft(\):)p Fi(D)2473 153 y Fg(3)2592
+145 y Fh(=)-14 b Fk(\))83 b Fo(Nested)p 2974 145 18 4
+v 20 w(loops)p Ft(\()p Fu(S)3184 153 y Fn(1)3216 145
+y Ft(:)p Fi(D)3292 153 y Fg(4)3328 145 y Fu(;S)3389 153
+y Fn(2)3421 145 y Ft(\):)p Fi(D)3523 153 y Fg(5)2044
+316 y FG(The)24 b(\256rst)g(rule)g(is)h(a)g(T)-8 b(-rule,)24
+b(and)f(the)i(ne)o(xt)e(tw)o(o)h(are)g(I-rules.)40 b(The)2044
+416 y(P2V)26 b(pre-processor)d(combines)h(the)i(abo)o(v)o(e)e(set)i(of)
+g(Prairie)f(rules)2044 515 y(into)20 b(a)g(single)g(I-rule,)2044
+686 y Fo(JOIN)p Ft(\()p Fu(S)2237 694 y Fn(1)2269 686
+y Fu(;S)2330 694 y Fn(2)2362 686 y Ft(\):)p Fi(D)2464
+694 y Fg(3)2582 686 y Fh(=)-14 b Fk(\))83 b Fo(Nested)p
+2964 686 V 20 w(loops)p Ft(\()p Fu(S)3174 694 y Fn(1)3206
+686 y Ft(:)p Fi(D)3282 694 y Fg(4)3318 686 y Fu(;S)3379
+694 y Fn(2)3411 686 y Ft(\):)p Fi(D)3513 694 y Fg(5)2044
+857 y FG(and)19 b(then)h(translates)g(it)h(into)f(a)h(single)f(V)-11
+b(olcano)19 b(impl)p 3625 857 25 4 v 29 w(rule.)2044
+1151 y FB(4)119 b(Experimental)30 b(r)n(esults)2044 1341
+y FG(This)k(section)g(presents)g(e)o(xperimental)e(results)i(which)g
+(demon-)2044 1441 y(strate)e(the)h(v)n(alue)f(of)g(Prairie)g(in)g
+(specifying)f(rule)h(sets)i(of)e(rule-)2044 1541 y(based)f(optimizers.)
+64 b(Our)32 b(e)o(xperiments)e(consist)j(of)f(specifying)2044
+1640 y(rule-based)17 b(optimizers)i(using)g(Prairie)g(and)g(generating)
+e(optimiz-)2044 1740 y(ers)f(using)f(the)g(P2V)h(pre-processor)c(and)j
+(the)h(optimizer)n(-generator)2044 1839 y(paradigm)i(of)i(Figure)g(5.)
+2127 1942 y(In)26 b([4],)g(we)h(presented)d(an)i(implementation)e(of)i
+(a)g(centralized)2044 2041 y(relational)33 b(query)f(optimizer)h(using)
+h(Prairie.)70 b(Using)34 b(the)g(P2V)2044 2141 y(translator)m(,)g(we)e
+(translated)g(this)g(to)h(V)-11 b(olcano)31 b(format)g(and)h(opti-)2044
+2240 y(mized)h(se)n(v)o(eral)h(queries)f(using)g(the)h(resultant)g
+(optimizer)-5 b(.)69 b(F)o(or)2044 2340 y(comparison,)22
+b(we)h(hand-coded)d(the)k(same)f(optimizer)f(directly)h(in)2044
+2440 y(V)-11 b(olcano.)66 b(The)32 b(results)h(presented)f(there)g(sho)
+n(wed)g(that,)k(using)2044 2539 y(Prairie)19 b(\(compared)f(to)i
+(directly)f(using)g(V)-11 b(olcano\))18 b(resulted)i(in)f(ap-)2044
+2639 y(proximately)27 b(50\045)j(sa)n(vings)f(in)h(lines)g(of)g(code)f
+(with)h(ne)o(gligible)2044 2739 y(\(less)d(than)e(5\045\))h(increase)g
+(in)g(query)f(optimization)f(time.)48 b(Ho)n(w-)2044
+2838 y(e)n(v)o(er)m(,)23 b(the)h(optimizer)e(w)o(as)j(quite)e(small)i
+(in)f(terms)g(of)f(the)h(number)2044 2938 y(of)c(operators,)e
+(algorithms)h(and)h(rules.)2127 3040 y(F)o(or)i(a)h(more)f(realistic)h
+(e)n(v)n(aluation)e(of)i(Prairie,)g(we)g(needed)e(an-)2044
+3139 y(swers)g(to)f(the)g(follo)n(wing)f(questions:)2106
+3313 y(1.)41 b(Is)20 b(Prairie)h(adequate)d(for)i(lar)o(ge-scale)f
+(rule)h(sets?)2106 3489 y(2.)41 b(Ho)n(w)13 b(is)i(programmer)c
+(producti)n(vity)g(enhanced)h(by)h(the)h(high-)2210 3588
+y(le)n(v)o(el)20 b(abstractions)f(of)h(Prairie?)2106
+3764 y(3.)41 b(Can)30 b(Prairie)f(rule)h(sets)g(be)g(translated)f
+(automatically)f(into)2210 3864 y(ef)n(\256cient)20 b(implementations?)
+2127 4037 y(W)-7 b(e)18 b(addressed)e(the)i(\256rst)g(question)e(by)h
+(using)g(the)g(T)-6 b(e)o(xas)17 b(Instru-)2044 4137
+y(ments)j(Open)g(OODB)i(query)d(optimizer)g(rule)i(set,)g(which)f(has)h
+(the)2044 4237 y(lar)o(gest)29 b(publicly)h(a)n(v)n(ailable)f(rule)h
+(set.)61 b(W)-7 b(e)31 b(describe)f(this)h(opti-)2044
+4336 y(mizer)22 b(in)i(the)f(ne)o(xt)f(section,)h(and)g(then)f(gi)n(v)o
+(e)h(our)f(assessments)i(to)2044 4436 y(the)c(last)h(tw)o(o)f
+(questions)g(in)g(subsequent)f(sections.)2044 4687 y
+Fx(4.1)99 b(The)74 b(T)-9 b(exas)73 b(Instruments)h(Open)g(OODB)2268
+4803 y(query)26 b(optimizer)2044 4964 y FG(The)45 b(T)-6
+b(e)o(xas)46 b(Instruments)f(Open)g(Object-Oriented)f(Database)2044
+5063 y(Management)16 b(System)j(is)h(an)e(open,)g(e)o(xtensible,)g
+(object-oriented)2044 5163 y(database)49 b(system)g(which)h(pro)o
+(vides)d(users)j(an)g(architectural)2044 5263 y(frame)n(w)o(ork)27
+b(that)j(is)h(con\256gurable)c(in)j(an)g(incremental)e(manner)-5
+b(.)p eop
+%%Page: 7 7
+7 6 bop -112 21 a FG(The)42 b(query)f(optimizer)g(in)i(the)g(Open)f
+(OODB)h([2])f(is)i(gener)n(-)-112 120 y(ated)35 b(using)f(V)-11
+b(olcano.)74 b(It)36 b(is)g(written)f(as)h(a)f(set)i(of)e(trans)p
+1671 120 25 4 v 29 w(rules)-112 220 y(and)21 b(impl)p
+188 220 V 29 w(rules)h(that)h(de\256ne)e(the)i(algebra)e(of)h(an)g
+(object-oriented)-112 319 y(database)34 b(system.)75
+b(Currently)-5 b(,)37 b(there)e(are)g(17)g(transformation)-112
+419 y(rules)13 b(and)g(9)h(implementation)e(rules)i(together)e(with)i
+(about)f Fh(13)p Fv(;)h Fh(000)-112 519 y FG(lines)26
+b(of)f(code)g(for)g(support)f(functions;)j(this,)g(of)f(course,)f(can)h
+(be)-112 618 y(changed)18 b(by)i(an)g(Open)f(OODB)i(user)f(for)g
+(speci\256c)g(needs.)-112 895 y Fx(4.2)99 b(Pr)n(ogrammer)25
+b(pr)n(oducti)o(vity)-112 1064 y FG(Programmer)11 b(producti)n(vity)g
+(can)i(be)h(measured)e(in)i(dif)n(ferent)e(w)o(ays.)-112
+1164 y(An)29 b(admittedly)f(simplistic)j(metric)e(is)h(the)g(number)e
+(of)h(lines)h(of)-112 1263 y(code)24 b(that)i(must)f(be)g(written.)45
+b(But)26 b(there)e(are)i(also)f(less)i(tangible)-112
+1363 y(measures,)16 b(such)h(as)g(the)g(amount)e(of)i(conceptual)e(ef)n
+(fort)g(needed)h(to)-112 1463 y(understand)k(a)k(particular)d
+(programming)f(task.)37 b(Our)23 b(e)o(xperience)-112
+1562 y(with)d(the)h(Open)f(OODB)i(query)d(optimizer)g(suggests)i(that)g
+(Prairie)-112 1662 y(e)o(xcels)f(on)g(the)g(latter)m(,)g(while)g(of)n
+(fering)f(modest)g(reductions)g(in)i(the)-112 1762 y(v)n(olume)e(of)h
+(code)f(that)h(needs)g(to)h(be)f(written.)-29 1868 y(W)-7
+b(e)16 b(con)m(v)o(erted)e(by)h(hand)g(the)h(Open)f(OODB)h(query)f
+(optimizer')-5 b(s)-112 1968 y(V)-11 b(olcano)15 b(speci\256cations)g
+(to)h(Prairie.)28 b(This)16 b(w)o(as)h(a)f(non-tri)n(vial)f(task)-112
+2068 y(because)27 b(of)h(the)h(relati)n(v)o(ely)e(lar)o(ge)g(size)i(of)
+f(the)h(rule)f(set)h(and)f(the)-112 2167 y(comple)o(xity)f(of)j(the)g
+(support)e(functions.)57 b(This)30 b(w)o(as)g(where)f(we)-112
+2267 y(found)c(Prairie)j(helped)f(in)g(conceptually)f(simplifying)g
+(the)i(rules)-112 2366 y(and)j(actions.)63 b(W)-7 b(e)33
+b(then)e(used)g(our)g(P2V)h(pre-processor)d(to)j(re-)-112
+2466 y(constitute)22 b(these)i(Prairie)f(speci\256cations)g(as)i(V)-11
+b(olcano)22 b(speci\256ca-)-112 2566 y(tions.)59 b(As)31
+b(described)e(in)i(Section)f(3,)i(this)f(process)f(in)m(v)n(olv)o(ed)e
+(a)-112 2665 y(considerable)19 b(le)n(v)o(el)i(of)h(comple)o(xity)-5
+b(,)19 b(partly)i(because)f(the)i(Prairie)-112 2765 y(speci\256cation)h
+(had)g(22)g(T)-8 b(-rules)24 b(and)f(11)g(I-rules)h(compared)d(to)j(17)
+-112 2865 y(trans)p 55 2865 V 29 w(rules)32 b(and)g(9)h(impl)p
+659 2865 V 29 w(rules)g(in)f(the)h(V)-11 b(olcano)31
+b(speci\256cation;)-112 2964 y(the)25 b(reconstituted)f(V)-11
+b(olcano)24 b(speci\256cation)g(had)h(the)h(same)f(num-)-112
+3064 y(ber)19 b(of)g(trans)p 270 3064 V 29 w(rules)h(and)f(impl)p
+774 3064 V 29 w(rules)h(as)g(the)g(original)e(hand-coded)-112
+3163 y(speci\256cation.)-29 3270 y(Con)m(v)o(erting)c(the)g(Open)g
+(OODB)g(op)o(timizer)f(ru)o(le)h(set)g(into)f(Prair)o(ie)-112
+3370 y(format)19 b(actually)h(simpli\256ed)g(its)i(speci\256cation)e
+(as)h(the)g(comple)o(xi-)-112 3469 y(ties)i(of)g(the)g(V)-11
+b(olcano)22 b(model)h(were)f(remo)o(v)o(ed.)36 b(The)22
+b(reduction)g(in)-112 3569 y(lines)14 b(of)g(code)f(w)o(as)i(modest)f
+(\320)h(there)e(w)o(as)i(about)e(a)i(10\045)f(sa)n(vings.)1820
+3539 y Ft(5)-112 3669 y FG(Ho)n(we)n(v)o(er)m(,)24 b(as)j(mentioned)c
+(abo)o(v)o(e,)j(sa)n(vings)f(in)h(lines)g(of)f(code)g(do)-112
+3768 y(not)i(adequately)g(re\257ect)h(increases)g(in)g(programmer)d
+(producti)n(v-)-112 3868 y(ity)-5 b(.)38 b(W)-7 b(e)25
+b(found)d(the)h(encapsulated)f(speci\256cations)h(of)g(Prairie)g(\320)
+-112 3968 y(namely)-5 b(,)34 b(the)f(use)h(of)e(a)i(single)f
+(descriptor)e(and)i(fe)n(wer)f(e)o(xplicit)-112 4067
+y(support)18 b(functions)h(\320)i(made)e(rule)h(programming)d
+FF(muc)o(h)i FG(easier)-5 b(.)-112 4344 y Fx(4.3)99 b(P)n(erf)n
+(ormance)81 b(r)n(esults)g(using)g(the)h(Open)112 4460
+y(OODB)24 b(optimizer)-29 4629 y FG(The)17 b(acid)g(test)h(of)f
+(Prairie)g(w)o(as)i(whether)d(Prairie)h(speci\256cations)-112
+4729 y(could)c(be)i(translated)f(into)g(ef)n(\256cient)h(optimizer)e
+(implementations.)-112 4828 y(Our)24 b(e)o(xperiments)f(using)h(the)h
+(Open)g(OODB)g(consisted)g(of)f(opti-)-112 4928 y(mizing)j(8)h(dif)n
+(ferent)e(queries)h(using)h(the)g(tw)o(o)g(query)f(optimizers)p
+-112 5028 788 4 v -28 5081 a Fr(5)7 5105 y Fz(The)16
+b(original)j(V)-9 b(olcano)18 b(speci\256cation)i(had)c
+Fc(13)p Fb(;)c Fc(400)17 b Fz(lines,)g(the)g(Prairie)h(spec-)-112
+5184 y(i\256cation)25 b(had)f Fc(12)p Fb(;)12 b Fc(100)23
+b Fz(lines,)j(and)e(the)g(P2V)-7 b(-generated)26 b(V)-9
+b(olcano)26 b(speci\256cation)-112 5263 y(had)17 b Fc(15)p
+Fb(;)12 b Fc(800)17 b Fz(lines.)2044 21 y FG(generated,)h(respecti)n(v)
+o(ely)-5 b(,)19 b(using)h(Prairie)g(and)g(using)h(V)-11
+b(olcano)19 b(di-)2044 120 y(rectly)d(\(in)g(the)h(remainder)e(of)h
+(this)h(section,)g(we)g(will)h(use)e(\252Prairie\272)2044
+220 y(and)g(\252V)-11 b(olcano\272)15 b(to)h(denote)g(these)g(tw)o(o)h
+(approaches\).)26 b(There)15 b(were)2044 319 y(4)j(distinct)h(e)o
+(xpressions)e(that)i(were)f(used)g(to)h(generate)e(the)i(queries)2044
+419 y(used)h(in)i(the)f(e)o(xperiments;)e(these)i(are)g(sho)n(wn)f(in)i
+(Figure)e(6.)32 b(Each)2044 519 y(e)o(xpression)18 b(represents)i(an)g
+Fv(N)9 b FG(-w)o(ay)19 b(join)h(query)f(for)h(v)n(arying)e
+Fv(N)9 b FG(.)2127 627 y(The)27 b(\256rst)g(e)o(xpression)f(E1)h(is)h
+(a)g(simple)f(retrie)n(v)n(al)f(and)g(join)h(of)2044
+726 y(base)21 b(classes.)33 b(The)21 b(second,)f(E2,)h(is)i(also)e(a)h
+(join)f(of)g(base)g(classes;)2044 826 y(ho)n(we)n(v)o(er)m(,)33
+b(after)f(each)h(class)g(retrie)n(v)n(al,)i(an)d(attrib)n(ute)g(has)h
+(to)g(be)2044 926 y(materialized)25 b(\(i.e.,)j(brought)d(into)h(vie)n
+(w\))g(before)f(the)i(join.)48 b(The)2044 1025 y(third)17
+b(and)g(fourth)f(e)o(xpressions)g(\(E3)h(and)g(E4\))g(are)g(the)h(same)
+g(as)g(the)2044 1125 y(\256rst)23 b(and)f(second)g(\(E1)g(and)h(E2\))f
+(respecti)n(v)o(ely)-5 b(,)21 b(e)o(xcept)h(that)h(there)2044
+1224 y(is)g(a)g(selection)e(of)h(attrib)n(utes)g(\(the)g(select)h
+(operator)d(is)k(the)e(root)f(of)2044 1324 y(the)f(e)o(xpressions\).)
+2603 1294 y Ft(6)2127 1432 y FG(The)35 b(algebra)g(that)i(w)o(as)f
+(used)g(in)g(the)g(Prairie)g(and)g(V)-11 b(olcano)2044
+1532 y(optimizers)19 b(for)g(our)g(e)o(xperiments)e(consisted)j(of)f(5)
+h(relational)f(op-)2044 1631 y(erators)f(SELECT)-6 b(,)18
+b(PR)m(OJECT)-6 b(,)18 b(JOIN,)h(RET)g(and)f(UNNEST)g(\(for)2044
+1731 y(set-v)n(alued)g(attrib)n(utes\))h(and)f(an)h(object-oriented)e
+(operator)g(called)2044 1831 y(MA)-9 b(T)13 b(\(for)f(MA)-9
+b(T)j(erialize;)15 b(it)f(is)g(fundamentally)d(a)j(pointer)n(-chasing)
+2044 1930 y(operator)k(for)i(attrib)n(utes)g(of)g(a)g(class\).)30
+b(There)19 b(were)i(8)f(algorithms.)2127 2038 y(There)13
+b(are)g(man)o(y)g(param)o(eters)g(th)o(at)g(can)f(be)g(v)m(aried)g(whe)
+o(n)h(b)o(en)o(ch-)2044 2138 y(marking)f(a)j(query)e(optimizer)-5
+b(.)26 b(Since)14 b(our)f(objecti)n(v)o(e)g(w)o(as)i(to)f(v)o(erify)
+2044 2237 y(that)j(the)h(Prairie)f(approach)f(did)h(not)g(sacri\256ce)h
+(ef)n(\256cienc)o(y)-5 b(,)16 b(our)g(cri-)2044 2337
+y(teria)g(for)g(the)g(queries)g(w)o(as)h(that)f(the)o(y)g(test)h(a)g
+(majority)e(of)h(the)g(rules,)2044 2437 y(with)32 b(v)n(arying)d
+(properties)i(of)g(the)h(base)f(classes.)65 b(T)-7 b(o)32
+b(this)g(end,)2044 2536 y(we)21 b(tested)h(our)e(optimizer)g(\(and)g
+(the)h(V)-11 b(olcano)20 b(optimizer\))g(with)h(8)2044
+2636 y(dif)n(ferent)g(queries)i(\(sho)n(wn)f(in)h(T)-7
+b(able)24 b(3\).)38 b(The)23 b(eight)f(queries)h(Q1)2044
+2736 y(through)d(Q8)i(are)g(deri)n(v)o(ed)f(from)g(the)h(4)g(e)o
+(xpressions)f(in)i(Figure)e(6.)2044 2835 y(Each)15 b(e)o(xpression)f
+(E1)i(through)d(E4)j(is)g(used)g(to)g(obtain)f(tw)o(o)h(queries)2044
+2935 y(for)k(a)h(\256x)o(ed)f(number)e Fv(N)30 b FG(of)20
+b(JOINs)i(in)e(the)h(e)o(xpression.)29 b(The)20 b(only)2044
+3034 y(dif)n(ference)13 b(between)h(the)h(tw)o(o)g(queries)f(obtained)g
+(from)g(an)g(e)o(xpres-)2044 3134 y(sion)19 b(is)i(that)e(the)h
+(\256rst)g(one)f(does)h(not)f(contain)g(an)o(y)f(indices)i(on)f(an)o(y)
+2044 3234 y(classes,)25 b(whereas)e(the)g(second)f(one)h(contains)g(a)g
+(single)g(inde)o(x)f(on)2044 3333 y(each)f(base)i(class)g(occurring)c
+(in)j(the)h(e)o(xpression.)33 b(In)21 b(e)o(xpressions)2044
+3433 y(where)16 b(a)i(SELECT)f(is)h(present)e(\(E3)h(and)f(E4\),)h(the)
+h(selection)e(pred-)2044 3533 y(icate)21 b(is)g(a)g(conjunction)e(of)h
+(equality)g(predicates)f FF(bc)3585 3545 y Fu(i)3636
+3533 y Fh(==)k FF(const)3964 3545 y Fu(i)3992 3533 y
+FG(,)2044 3632 y(where)17 b FF(bc)2344 3644 y Fu(i)2390
+3632 y FG(is)i(an)f(attrib)n(ute)g(of)g(class)h FF(C)3178
+3644 y Fu(i)3206 3632 y FG(,)g(and)e FF(const)3560 3644
+y Fu(i)3606 3632 y FG(is)i(a)g(constant)2044 3732 y(\(we)k(arbitrarily)
+f(set)h(this)h(to)f Fv(i)p FG(,)h(because)e(its)j(v)n(alue)d(doesn')o
+(t)g(af)n(fect)2044 3831 y(the)j(correctness)g(or)g(performance)d(of)k
+(the)f(optimizer\).)44 b(In)25 b(addi-)2044 3931 y(tion,)32
+b(for)e(queries)g(with)h(a)g(SELECT)g(and)f(whose)g(base)h(classes)2044
+4031 y(ha)n(v)o(e)24 b(indices)h(\(Q6)g(and)g(Q8)g(in)h(T)-7
+b(able)25 b(3\),)h(the)f(\(single\))f(inde)o(x)g(of)2044
+4130 y(each)c(base)h(class)h(w)o(as)g(chosen)e(to)h(be)g(the)g(attrib)n
+(ute)f(referenced)f(in)2044 4230 y(the)25 b(selection)g(predicate.)44
+b(F)o(or)25 b(e)o(xample,)g(class)i FF(C)3574 4242 y
+Fu(i)3628 4230 y FG(w)o(as)f(chosen)2044 4330 y(to)i(ha)n(v)o(e)g(an)g
+(inde)o(x)f(on)g(attrib)n(ute)h FF(bc)3132 4342 y Fu(i)3160
+4330 y FG(.)54 b(The)28 b(join)f(predicates)h(for)2044
+4429 y(each)13 b(JOIN)i(were)f(chosen)f(at)i(random,)e(and)h(were)f(al)
+o(w)o(ays)i(equality)2044 4529 y(predicates.)27 b(The)17
+b(choice)g(of)g(JOIN)h(predicates)f(w)o(as)h(such)f(that)h(the)p
+2044 4633 V 2129 4687 a Fr(6)2163 4710 y Fz(The)23 b(most)g(comple)o(x)
+i(e)o(xpression)f(E4)f(consists)h(of)f(all)h(operators)h(in)f(the)f
+(al-)2044 4789 y(gebra,)17 b(e)o(xcept)i(PR)m(OJECT)d(and)h(UNNEST)-5
+b(.)15 b(PR)m(OJECT)h(w)o(as)h(not)h(considered)h(be-)2044
+4868 y(cause)d(it)g(appeared)i(in)d(only)h(one)g(impl)p
+2948 4868 20 4 v 25 w(rule)g(and)g(no)g(trans)p 3412
+4868 V 25 w(rules,)g(and)g(thus,)f(w)o(ould)2044 4947
+y(not)22 b(af)n(fect)h(the)f(size)h(of)e(the)h(search)h(space)f(of)f
+(abstract)j(e)o(xpressions.)39 b(UNNEST)2044 5026 y(w)o(as)20
+b(not)h(considered)i(because)f(it)f(appeared)i(in)e(e)o(xactly)h(one)f
+(trans)p 3656 5026 V 25 w(rule)h(and)f(one)2044 5105
+y(impl)p 2169 5105 V 24 w(rule;)g(including)h(it)d(in)g(our)g(queries)h
+(w)o(ould)g(ha)o(v)o(e)f(increased)i(the)f(number)f(of)2044
+5184 y(parameters)f(that)f(could)h(af)n(fect)g(our)f(run-times.)25
+b(W)-5 b(e)15 b(preferred)k(to)d(concentrate)k(on)2044
+5263 y(simple)d(JOIN)g(e)o(xpressions.)p eop
+%%Page: 8 8
+8 7 bop -112 24 2130 4 v -112 1001 4 978 v -37 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+
+-37 707 a Fa(C)-10 719 y Fn(1)-47 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ -47 618 a Fm(RET)-7
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 152 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 152 707 a Fa(C)179 719 y Fn(2)142
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 142 618 a Fm(RET)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 42 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 3.36499 0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 42
+524 a Fm(JOIN)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 182
+415 a
+ tx@Dict begin 45. Rot end
+ 182 415 a 143 418 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 143 418 a Fl(:)10 b(:)g(:)182
+415 y
+ tx@Dict begin 45. neg Rot end
+ 182 415 a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ -7 699 a 331 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 331 429 a
+Fm(RET)336 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.37999 0.99998
+false .5 8.23898 InitRnode } NewNode end end
+ 336 520 a Fa(C)364 528 y Fl(n)-7 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 231 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.36499
+0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 231 335 a Fm(JOIN)-7 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ -7 699
+a -7 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ -7 699 a 100 881 a Fz(\(a\))17 b(E1)p 447
+976 4 928 v 476 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 476 707 a Fa(C)504 719 y Fn(1)467
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 467 618 a Fm(RET)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 665 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+
+665 707 a Fa(C)693 719 y Fn(2)656 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 656 618 a Fm(RET)506
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 463 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 463 524 a Fm(MA)-5 b(T)506
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 652 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 652 524 a Fm(MA)g(T)506 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 556 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 3.36499 0.06248 false .5 10.82999 InitRnode } NewNode end
+end
+ 556 429 a Fm(JOIN)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506
+699 a 506 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506 699 a 695 321 a
+ tx@Dict begin 45. Rot end
+ 695 321 a 656 324
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 656 324 a Fl(:)11 b(:)f(:)695 321 y
+ tx@Dict begin 45. neg Rot end
+ 695 321 a 506 699
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 506 699 a 845 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 845 429 a Fm(RET)850 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.37999 0.99998
+false .5 8.23898 InitRnode } NewNode end end
+ 850
+520 a Fa(C)878 528 y Fl(n)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 841 335
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 841 335 a Fm(MA)-5 b(T)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 506 699 a 745 240
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.36499
+0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 745 240 a Fm(JOIN)506 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 506 699 a 506 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 506
+699 a 611 881 a Fz(\(b\))17 b(E2)p 961 976 4 928 v 990
+707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 990 707 a Fa(C)1018 719 y Fn(1)981 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 981 618
+a Fm(RET)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1179 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 1179 707 a
+Fa(C)1207 719 y Fn(2)1170 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 1170 618 a Fm(RET)1020
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1070 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 3.36499 0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 1070 524 a Fm(JOIN)1020 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1209 415 a
+ tx@Dict begin 45. Rot end
+ 1209 415
+a 1170 418 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 1170 418 a Fl(:)11 b(:)f(:)1209 415 y
+ tx@Dict begin 45. neg Rot end
+ 1209
+415 a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699 a 1359 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 1359 429 a Fm(RET)1364
+520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.37999 0.99998
+false .5 8.23898 InitRnode } NewNode end end
+ 1364 520 a Fa(C)1392 528 y Fl(n)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020
+699 a 1259 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.36499
+0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 1259 335 a Fm(JOIN)1020 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699
+a 1020 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1020 699 a 1227 240 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 3.36499
+0.06248 false .5 18.33496 InitRnode } NewNode end end
+ 1227 240 a Fm(SELECT)1020
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1020 699 a 1127 881 a Fz(\(c\))17 b(E3)p 1474 976
+4 928 v 1504 707 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 1504 707 a Fa(C)1531 719 y Fn(1)1495
+618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 1495 618 a Fm(RET)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1693 707
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 3.37999 1.5
+false .5 7.23782 InitRnode } NewNode end end
+ 1693 707 a Fa(C)1720 719 y Fn(2)1684 618 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 1684 618
+a Fm(RET)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1490 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 1490 524 a
+Fm(MA)-5 b(T)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1679 524 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 1679 524
+a Fm(MA)g(T)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1583 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 3.36499 0.06248 false .5 10.82999 InitRnode } NewNode end
+end
+ 1583 429
+a Fm(JOIN)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a
+1723 321 a
+ tx@Dict begin 45. Rot end
+ 1723 321 a 1684 324 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.61111
+0.0 false .5 9.32877 InitRnode } NewNode end end
+ 1684 324 a Fl(:)10 b(:)h(:)1723
+321 y
+ tx@Dict begin 45. neg Rot end
+ 1723 321 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1873 429 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 3.36499
+0.0 false .5 9.44498 InitRnode } NewNode end end
+ 1873
+429 a Fm(RET)1878 520 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 3.37999 0.99998
+false .5 8.23898 InitRnode } NewNode end end
+ 1878 520 a Fa(C)1905 528 y Fl(n)1534
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1868 335 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 3.36499
+0.0 false .5 10.55498 InitRnode } NewNode end end
+ 1868 335 a Fm(MA)-5 b(T)1534
+699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1534 699 a 1772 240 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 3.36499
+0.06248 false .5 10.82999 InitRnode } NewNode end end
+ 1772 240 a Fm(JOIN)1534 699
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1534 699 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1534 699 a 1741 146 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 3.36499
+0.06248 false .5 18.33496 InitRnode } NewNode end end
+ 1741 146
+a Fm(SELECT)1534 699 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 1.0 1.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1534 699 a 1639 881 a Fz(\(d\))17
+b(E4)p 2014 1001 4 978 v -112 1004 2130 4 v 2015 1021
+19 984 v -96 1021 2130 19 v -112 1204 a FG(Figure)g(6:)28
+b(Expressions)17 b(used)h(in)g(generating)e(queries)h(for)h(e)o
+(xperiments)p 2359 358 1644 13 v 2359 424 4 67 v 2412
+438 a Fp(Query)p 2620 424 V 2673 443 a(Indices?)p 2930
+424 V 2983 438 a(Expr)o(ession)p 3306 424 V 3471 404
+a(Rules)d(matched)p 3999 424 V 3309 427 694 4 v 2359
+491 4 67 v 2620 491 V 2930 491 V 3306 491 V 3359 471
+a Fo(trans)p 3475 471 18 4 v 21 w(rules)p 3656 491 4
+67 v 103 w(impl)p 3818 471 18 4 v 22 w(rules)p 3999 491
+4 67 v 2359 503 1644 13 v 2359 569 4 67 v 2456 549 a(Q1)p
+2620 569 V 214 w(No)p 2930 569 V 3087 589 a(E1)p 3306
+569 V 316 w(3)p 3656 569 V 318 w(3)p 3999 569 V 2359
+573 575 4 v 2359 636 4 67 v 2456 616 a(Q2)p 2620 636
+V 207 w(Y)-6 b(es)p 2930 636 V 3306 636 V 3656 636 V
+3999 636 V 2359 639 1644 4 v 2359 706 4 67 v 2456 686
+a(Q3)p 2620 706 V 214 w(No)p 2930 706 V 3087 725 a(E2)p
+3306 706 V 316 w(8)p 3656 706 V 318 w(4)p 3999 706 V
+2359 709 575 4 v 2359 772 4 67 v 2456 752 a(Q4)p 2620
+772 V 207 w(Y)g(es)p 2930 772 V 3306 772 V 3656 772 V
+3999 772 V 2359 775 1644 4 v 2359 842 4 67 v 2456 822
+a(Q5)p 2620 842 V 214 w(No)p 2930 842 V 3087 861 a(E3)p
+3306 842 V 316 w(9)p 3656 842 V 3815 862 a(5)p 3999 842
+V 2359 845 575 4 v 2359 908 4 67 v 2456 888 a(Q6)p 2620
+908 V 207 w(Y)g(es)p 2930 908 V 3306 908 V 3656 908 V
+3999 908 V 2359 911 1644 4 v 2359 978 4 67 v 2456 958
+a(Q7)p 2620 978 V 214 w(No)p 2930 978 V 3087 997 a(E4)p
+3306 978 V 302 w(16)p 3656 978 V 303 w(7)p 3999 978 V
+2359 981 575 4 v 2359 1044 4 67 v 2456 1024 a(Q8)p 2620
+1044 V 207 w(Y)g(es)p 2930 1044 V 3306 1044 V 3656 1044
+V 3999 1044 V 2359 1057 1644 13 v 2566 1204 a FG(T)f(able)20
+b(3:)30 b(Queries)20 b(used)g(in)g(e)o(xperiments)-112
+1554 y(queries)i(corresponded)e(to)k(linear)f(query)f(graphs.)38
+b(In)23 b(the)g(future,)-112 1654 y(we)16 b(will)h(e)o(xperiment)d
+(with)i(non-linear)e(\(e.g.,)i(star\))g(query)f(graphs.)-29
+1755 y(T)-7 b(able)52 b(3)h(also)g(sho)n(ws)g(the)f(number)f(of)h
+(trans)p 1497 1755 25 4 v 30 w(rules)g(and)-112 1855
+y(impl)p 46 1855 V 29 w(rules)23 b(that)h(are)f(matched)g(by)g(each)g
+(e)o(xpression.)38 b(These)23 b(are)-112 1954 y(the)36
+b(rules)h(whose)f(left)h(hand)f(sides)h(match)g(a)g(sub-e)o(xpression.)
+-112 2054 y(Ho)n(we)n(v)o(er)m(,)20 b(not)i(all)g(the)g(rules)g(were)g
+(necessarily)g(applicable.)33 b(F)o(or)-112 2153 y(instance,)25
+b(an)g(impl)p 469 2153 V 29 w(rule)g(with)g(an)h(inde)o(x)d(scan)j(w)o
+(ould)e(not)h(apply)-112 2253 y(to)20 b(Q3,)g(although)e(it)j(might)f
+(apply)f(to)h(Q4.)-29 2354 y(Queries)32 b(Q1)h(through)e(Q8)i(were)g
+(optimized)f(for)g(increasing)-112 2454 y(number)d Fv(N)41
+b FG(of)31 b(JOINs.)64 b(F)o(or)32 b(a)g(\256x)o(ed)e(number)g(of)h
+(JOINs)i(in)e(a)-112 2554 y(query)-5 b(,)14 b(we)i(v)n(aried)f(the)h
+(cardinalities)f(of)g(the)h(base)g(classes)h(5)f(times,)-112
+2653 y(each)h(time)h(generating)e(a)i(query)f(with)h(dif)n(ferent)e
+(class)i(properties,)-112 2753 y(and)30 b(a)n(v)o(eraged)g(the)h
+(run-times)f(o)o(v)o(er)g(the)h(5)h(query)d(instances)j(to)-112
+2852 y(generate)20 b(the)h(per)n(-query)f(optimization)g(time.)33
+b(Thus,)21 b(each)h(point)-112 2952 y(in)g(our)f(graphs)g(represents)h
+(the)g(a)n(v)o(erage)f(of)h(5)g(queries.)34 b(The)22
+b(run-)-112 3052 y(times)c(were)f(measured)585 3022 y
+Ft(7)639 3052 y FG(using)g(the)h(GNU)g Fd(time)g FG(command.)26
+b(All)-112 3151 y(e)o(xperiments)13 b(were)i(performed)e(on)i(a)h
+(lightly)f(loaded)f(DECstation)-112 3251 y(5000/200)j(running)h(Ultrix)
+i(4.2.)-29 3352 y(The)13 b(optimization)g(times)g(for)g(ea)o(ch)f(qu)o
+(ery)g(fo)o(r)h(b)o(oth)f(ap)o(pr)o(oach)o(es)-112 3452
+y(\(Prairie)h(and)g(V)-11 b(olcano\))13 b(are)g(sho)n(wn)g(in)g
+(Figures)g(7\(a\))g(thro)o(ug)o(h)g(7\()o(h\))o(.)-112
+3552 y(The)25 b(number)g(of)h(joins)g(in)g(each)g(set)h(of)f(graphs)f
+(w)o(as)i(v)n(aried)e(to)h(a)-112 3651 y(maximum)18 b(of)i(8,)g(or)g
+(until)g(virtual)f(memory)g(w)o(as)i(e)o(xhausted.)-29
+3753 y(The)i(\256rst)h(set)h(of)e(graphs)f(\(Figures)h(7\(a\))g(and)g
+(7\(b\)\))f(sho)n(ws)i(the)-112 3852 y(performance)32
+b(of)k(a)g(simple)f(relational-type)f(query)-5 b(.)73
+b(The)36 b(op-)-112 3952 y(timization)30 b(times)j(are)e(almost)h
+(identical)f(between)g(Prairie)g(and)-112 4051 y(V)-11
+b(olcano,)32 b(and)f(the)h(notable)e(point)h(is)h(that)f(the)h
+(presence)e(of)h(an)-112 4151 y(inde)o(x)16 b(does)h(not)g(change)f
+(the)i(optimizer')-5 b(s)16 b(beha)n(vior)m(,)g(i.e.,)i(the)g(tw)o(o)
+-112 4251 y(graphs)24 b(are)i(identical.)46 b(This)26
+b(arises)h(because)e(the)h(optimizer)f(al-)-112 4350
+y(gebra)g(had)h(only)g(tw)o(o)h(join)f(algorithms)g(\(pointer)f(join)h
+(and)g(hash)-112 4450 y(join\),)19 b(neither)g(of)h(which)g(mak)o(es)g
+(use)g(of)g(an)o(y)f(indices.)-29 4551 y(The)13 b(second)f(set)i(of)g
+(graphs)e(\(Figures)h(7\(c\))f(and)h(7\(d\)\))f(sho)n(ws)i(the)-112
+4651 y(results)25 b(of)g(optimizing)f(Q3)i(and)f(Q4.)44
+b(Here,)27 b(as)f(in)g(Figures)f(7\(a\))-112 4750 y(and)33
+b(7\(b\),)i(the)f(presence)f(\(or)g(absence\))g(of)g(indices)h(mak)o
+(es)f(no)-112 4850 y(dif)n(ference.)46 b(Both)26 b(the)h(Prairie)f(and)
+g(V)-11 b(olcano)26 b(approaches)e(ha)n(v)o(e)-112 4950
+y(comparable)d(run-times.)40 b(The)24 b(sharp)f(jump)h(in)g(the)g
+(graphs)f(from)p -112 5028 788 4 v -28 5081 a Fr(7)7
+5105 y Fz(Since)j(the)g(run-times)h(were)f(too)f(small)h(to)g(be)f
+(measured)h(accurately)j(with)-112 5184 y Fy(time)p Fz(,)19
+b(each)i(query)g(instance)h(w)o(as)f(optimized)h(3000)f(times)f(\(in)h
+(a)f(loop\))h(and)f(the)-112 5263 y(total)e(time)g(w)o(as)f(di)n(vided)
+i(by)e(3000)h(to)f(get)h(the)g(per)o(-query)g(optimization)i(time.)2044
+1554 y FG(7-w)o(ay)12 b(to)i(8-w)o(ay)f(joins)g(is)i(due)d(to)i(the)f
+(f)o(act)h(that)g(since)f(all)h(optimiza-)2044 1654 y(tion)25
+b(is)h(done)f(in)h(main)f(memory)-5 b(,)24 b(dynamic)g(memory)g
+(allocation)2044 1753 y(\(caused)29 b(by)h Fd(malloc)g
+FG(calls\))h(results)g(in)f(a)h(lot)f(of)h(thrashing)e(at)2044
+1853 y(this)d(point.)44 b(W)-7 b(e)26 b(speculate)f(that)g(in)h
+(systems)g(with)f(more)g(virtual)2044 1952 y(memory)-5
+b(,)18 b(the)i(graphs)f(will)i(be)f(smoother)-5 b(.)2127
+2057 y(The)15 b(third)f(and)g(fourth)g(sets)i(of)f(graphs)f(in)h
+(Figures)g(7\(e\))f(through)2044 2157 y(7\(h\))k(are)i(optimizations)f
+(of)g(queries)h(with)g(a)g(selection)f(predicate.)2044
+2257 y(In)c(these)h(cases,)g(the)g(presence)e(of)i(an)f(inde)o(x)f(mak)
+o(es)h(a)h(dif)n(ference)e(if)2044 2356 y(the)21 b(inde)o(x)e(is)j
+(referenced)c(in)j(the)g(selection)g(predicate)e(\(as)i(we)g(de-)2044
+2456 y(signed\).)27 b(Also,)19 b(in)g(these)g(tw)o(o)f(\256gures,)h
+(the)f(performance)e(of)i(both)2044 2556 y(Prairie)e(and)h(V)-11
+b(olcano)16 b(w)o(as)h(almost)g(identical,)g(e)o(xcept)e(that)i
+(Prairie)2044 2655 y(does)29 b(slightly)f(w)o(orse)h(due)g(to)g(the)g
+(lar)o(ger)f(number)f(of)33 b Fd(malloc)2044 2755 y FG(calls)23
+b(that)f(the)h(P2V)f(translator)g(introduces.)34 b(Also,)23
+b(note)f(that)h(we)2044 2854 y(could)c(only)g(go)g(up)h(to)g(3-w)o(ay)f
+(joins)g(before)g(virtual)g(memory)f(w)o(as)2044 2954
+y(e)o(xhausted.)34 b(As)23 b(the)g(a)n(v)n(ailable)f(memory)e
+(decreases,)j(there)f(is)h(in-)2044 3054 y(creased)15
+b(thrashing)f(\(as)i(sho)n(wn)f(by)h(the)g(sharp)f(changes)f(in)i
+(slope)g(in)2044 3153 y(the)k(plots\))g(resulting)f(in)i(a)f(much)f
+(slo)n(wer)h(optimization)f(process.)2127 3258 y(In)j(all)h(four)f
+(sets)i(of)e(plots,)h(we)g(can)f(see)i(that)e(Prairie)h(performs)2044
+3358 y(with)34 b(almost)g(\(less)h(than)e Fh(5\045)i
+FG(v)n(ariation\))d(the)i(same)g(ef)n(\256cienc)o(y)2044
+3457 y(as)i(V)-11 b(olcano.)76 b(In)36 b(e)o(xtreme)e(cases,)41
+b(when)35 b(memory)f(is)j(scarce,)2044 3557 y(Prairie)17
+b(runs)f(more)h(slo)n(wly)g(\(about)e Fh(15\045)p FG(\))i(\(e.g.,)f
+(Figure)h(7\(f\)\),)f(b)n(ut)2044 3657 y(we)31 b(belie)n(v)o(e)f(that)h
+(this)h(situation)e(already)g(represents)g(a)h(serious)2044
+3756 y(bottleneck)18 b(for)i(both)f(V)-11 b(olcano)20
+b(and)f(Prairie.)2127 3861 y(The)13 b(results)h(presented)e(in)h(this)h
+(section)g(sho)n(w)f(that)g(Prairie)h(opti-)2044 3961
+y(mizers)h(need)g(not)g(sacri\256ce)h(ef)n(\256cienc)o(y)e(for)g
+(clarity)-5 b(,)16 b(e)n(v)o(en)e(for)h(lar)o(ge)2044
+4060 y(rule)f(sets.)28 b(More)14 b(research)g(and)g(v)n(alidation)f(is)
+i(necessary)f(to)g(v)o(erify)2044 4160 y(that)20 b(Prairie)g(is)h(an)f
+(ef)n(\256cient)g(tool)g(for)g(optimizer)f(speci\256cation.)2044
+4469 y FB(5)119 b(Related)31 b(r)n(esear)n(ch)2044 4665
+y FG(The)d(System)h(R)g(optimizer)f([11])f(w)o(as)j(the)f(most)f
+(important)f(de-)2044 4764 y(v)o(elopment)g(in)j(query)f(optimization)f
+(research.)57 b(It)30 b(w)o(as)h(a)f(cost-)2044 4864
+y(based)19 b(centralized)f(relational)g(query)g(optimizer)h(and)f
+(introduced)2044 4964 y(a)g(v)n(ariety)e(of)h(k)o(e)o(y)g(concepts)f
+(lik)o(e)i(\252interesting\272)e(e)o(xpressions,)g(car)n(-)2044
+5063 y(dinality)35 b(estimation)g(using)h(selecti)n(vity)g(f)o(actors)f
+(and)h(dynamic)2044 5163 y(programming)14 b(with)j(pruning)e(of)i
+(search)g(space.)28 b(These)17 b(concepts)2044 5263 y(continue)h(to)j
+(be)f(important)f(in)h(query)f(optimizer)g(research.)p
+eop
+%%Page: 9 9
+9 8 bop -104 24 1935 4 v -104 3720 4 3697 v 66 715 a
+@beginspecial 50 @llx 50 @lly 500 @urx 375 @ury 850 @rwi
+@setspecial
+%%BeginDocument: runtime.Q1.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 611 m
+430 611 l
+420 846 m
+430 846 l
+420 1081 m
+430 1081 l
+420 1315 m
+430 1315 l
+420 1550 m
+430 1550 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 611 m
+2020 611 l
+2030 846 m
+2020 846 l
+2030 1081 m
+2020 1081 l
+2030 1315 m
+2020 1315 l
+2030 1550 m
+2020 1550 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 846 m
+440 846 l
+420 1315 m
+440 1315 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 846 m
+2010 846 l
+2030 1315 m
+2010 1315 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 846 m
+gsave
+348 846 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 1315 m
+gsave
+348 1315 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 418 m
+621 537 l
+822 661 l
+1023 789 l
+1225 909 l
+1426 1046 l
+1627 1183 l
+1828 1320 l
+2030 1449 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 537 30 0 360 arc
+gsave fill grestore
+stroke
+822 661 30 0 360 arc
+gsave fill grestore
+stroke
+1023 789 30 0 360 arc
+gsave fill grestore
+stroke
+1225 909 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1046 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1183 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1320 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1449 30 0 360 arc
+gsave fill grestore
+stroke
+420 421 m
+621 541 l
+822 670 l
+1023 801 l
+1225 935 l
+1426 1066 l
+1627 1229 l
+1828 1355 l
+2030 1504 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 451 m
+390 421 l
+420 391 l
+450 421 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 451 m
+390 421 l
+420 391 l
+450 421 l
+420 451 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 571 m
+591 541 l
+621 511 l
+651 541 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 571 m
+591 541 l
+621 511 l
+651 541 l
+621 571 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 700 m
+792 670 l
+822 640 l
+852 670 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 700 m
+792 670 l
+822 640 l
+852 670 l
+822 700 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 831 m
+993 801 l
+1023 771 l
+1053 801 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 831 m
+993 801 l
+1023 771 l
+1053 801 l
+1023 831 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 965 m
+1195 935 l
+1225 905 l
+1255 935 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 965 m
+1195 935 l
+1225 905 l
+1255 935 l
+1225 965 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 1096 m
+1396 1066 l
+1426 1036 l
+1456 1066 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 1096 m
+1396 1066 l
+1426 1036 l
+1456 1066 l
+1426 1096 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 1259 m
+1597 1229 l
+1627 1199 l
+1657 1229 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 1259 m
+1597 1229 l
+1627 1199 l
+1657 1229 l
+1627 1259 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+1828 1385 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+2030 1534 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 842 a Fz(\(a\))17 b(Query)h(1)974 715
+y @beginspecial 50 @llx 50 @lly 500 @urx 375 @ury 850
+@rwi @setspecial
+%%BeginDocument: runtime.Q2.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 611 m
+430 611 l
+420 846 m
+430 846 l
+420 1081 m
+430 1081 l
+420 1315 m
+430 1315 l
+420 1550 m
+430 1550 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 611 m
+2020 611 l
+2030 846 m
+2020 846 l
+2030 1081 m
+2020 1081 l
+2030 1315 m
+2020 1315 l
+2030 1550 m
+2020 1550 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 846 m
+440 846 l
+420 1315 m
+440 1315 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 846 m
+2010 846 l
+2030 1315 m
+2010 1315 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 846 m
+gsave
+348 846 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 1315 m
+gsave
+348 1315 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+420 418 m
+621 539 l
+822 664 l
+1023 783 l
+1225 906 l
+1426 1037 l
+1627 1176 l
+1828 1304 l
+2030 1451 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 539 30 0 360 arc
+gsave fill grestore
+stroke
+822 664 30 0 360 arc
+gsave fill grestore
+stroke
+1023 783 30 0 360 arc
+gsave fill grestore
+stroke
+1225 906 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1037 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1176 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1304 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1451 30 0 360 arc
+gsave fill grestore
+stroke
+420 412 m
+621 533 l
+822 661 l
+1023 796 l
+1225 926 l
+1426 1063 l
+1627 1212 l
+1828 1355 l
+2030 1504 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 442 m
+390 412 l
+420 382 l
+450 412 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 442 m
+390 412 l
+420 382 l
+450 412 l
+420 442 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 563 m
+591 533 l
+621 503 l
+651 533 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 563 m
+591 533 l
+621 503 l
+651 533 l
+621 563 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 691 m
+792 661 l
+822 631 l
+852 661 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 691 m
+792 661 l
+822 631 l
+852 661 l
+822 691 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 826 m
+993 796 l
+1023 766 l
+1053 796 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 826 m
+993 796 l
+1023 766 l
+1053 796 l
+1023 826 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 956 m
+1195 926 l
+1225 896 l
+1255 926 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 956 m
+1195 926 l
+1225 896 l
+1255 926 l
+1225 956 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 1093 m
+1396 1063 l
+1426 1033 l
+1456 1063 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 1093 m
+1396 1063 l
+1426 1033 l
+1456 1063 l
+1426 1093 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 1242 m
+1597 1212 l
+1627 1182 l
+1657 1212 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 1242 m
+1597 1212 l
+1627 1182 l
+1657 1212 l
+1627 1242 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+1828 1385 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+2030 1534 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 842 a(\(b\))f(Query)h(2)p -34 943 1816
+4 v 66 1632 a @beginspecial 50 @llx 50 @lly 500 @urx
+375 @ury 850 @rwi @setspecial
+%%BeginDocument: runtime.Q3.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 401 m
+621 489 l
+822 578 l
+1023 672 l
+1225 762 l
+1426 865 l
+1627 969 l
+1828 1076 l
+2030 1574 l
+stroke
+420 401 30 0 360 arc
+gsave fill grestore
+stroke
+621 489 30 0 360 arc
+gsave fill grestore
+stroke
+822 578 30 0 360 arc
+gsave fill grestore
+stroke
+1023 672 30 0 360 arc
+gsave fill grestore
+stroke
+1225 762 30 0 360 arc
+gsave fill grestore
+stroke
+1426 865 30 0 360 arc
+gsave fill grestore
+stroke
+1627 969 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1076 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1574 30 0 360 arc
+gsave fill grestore
+stroke
+420 402 m
+621 485 l
+822 568 l
+1023 644 l
+1225 736 l
+1426 821 l
+1627 918 l
+1828 1019 l
+2030 1511 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 432 m
+390 402 l
+420 372 l
+450 402 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 432 m
+390 402 l
+420 372 l
+450 402 l
+420 432 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 515 m
+591 485 l
+621 455 l
+651 485 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 515 m
+591 485 l
+621 455 l
+651 485 l
+621 515 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 598 m
+792 568 l
+822 538 l
+852 568 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 598 m
+792 568 l
+822 538 l
+852 568 l
+822 598 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 674 m
+993 644 l
+1023 614 l
+1053 644 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 674 m
+993 644 l
+1023 614 l
+1053 644 l
+1023 674 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 766 m
+1195 736 l
+1225 706 l
+1255 736 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 766 m
+1195 736 l
+1225 706 l
+1255 736 l
+1225 766 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 851 m
+1396 821 l
+1426 791 l
+1456 821 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 851 m
+1396 821 l
+1426 791 l
+1456 821 l
+1426 851 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 948 m
+1597 918 l
+1627 888 l
+1657 918 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 948 m
+1597 918 l
+1627 888 l
+1657 918 l
+1627 948 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1049 m
+1798 1019 l
+1828 989 l
+1858 1019 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1049 m
+1798 1019 l
+1828 989 l
+1858 1019 l
+1828 1049 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1541 m
+2000 1511 l
+2030 1481 l
+2060 1511 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1541 m
+2000 1511 l
+2030 1481 l
+2060 1511 l
+2030 1541 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 1760 a(\(c\))f(Query)h(3)974 1632 y
+@beginspecial 50 @llx 50 @lly 500 @urx 375 @ury 850 @rwi
+@setspecial
+%%BeginDocument: runtime.Q4.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+621 276 m
+gsave
+621 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+822 276 m
+gsave
+822 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 276 m
+gsave
+1023 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 276 m
+gsave
+1225 276 translate
+0 rotate
+0 -40 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 276 m
+gsave
+1426 276 translate
+0 rotate
+0 -40 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 276 m
+gsave
+1627 276 translate
+0 rotate
+0 -40 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 276 m
+gsave
+1828 276 translate
+0 rotate
+0 -40 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+420 400 m
+621 492 l
+822 575 l
+1023 669 l
+1225 759 l
+1426 866 l
+1627 962 l
+1828 1069 l
+2030 1578 l
+stroke
+420 400 30 0 360 arc
+gsave fill grestore
+stroke
+621 492 30 0 360 arc
+gsave fill grestore
+stroke
+822 575 30 0 360 arc
+gsave fill grestore
+stroke
+1023 669 30 0 360 arc
+gsave fill grestore
+stroke
+1225 759 30 0 360 arc
+gsave fill grestore
+stroke
+1426 866 30 0 360 arc
+gsave fill grestore
+stroke
+1627 962 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1069 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1578 30 0 360 arc
+gsave fill grestore
+stroke
+420 400 m
+621 484 l
+822 567 l
+1023 645 l
+1225 735 l
+1426 823 l
+1627 915 l
+1828 1024 l
+2030 1517 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+420 430 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+621 514 m
+591 484 l
+621 454 l
+651 484 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+621 514 m
+591 484 l
+621 454 l
+651 484 l
+621 514 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+822 597 m
+792 567 l
+822 537 l
+852 567 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+822 597 m
+792 567 l
+822 537 l
+852 567 l
+822 597 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1023 675 m
+993 645 l
+1023 615 l
+1053 645 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1023 675 m
+993 645 l
+1023 615 l
+1053 645 l
+1023 675 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1225 765 m
+1195 735 l
+1225 705 l
+1255 735 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1225 765 m
+1195 735 l
+1225 705 l
+1255 735 l
+1225 765 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1426 853 m
+1396 823 l
+1426 793 l
+1456 823 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1426 853 m
+1396 823 l
+1426 793 l
+1456 823 l
+1426 853 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1627 945 m
+1597 915 l
+1627 885 l
+1657 915 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1627 945 m
+1597 915 l
+1627 885 l
+1657 915 l
+1627 945 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1828 1054 m
+1798 1024 l
+1828 994 l
+1858 1024 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1828 1054 m
+1798 1024 l
+1828 994 l
+1858 1024 l
+1828 1054 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1547 m
+2000 1517 l
+2030 1487 l
+2060 1517 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1547 m
+2000 1517 l
+2030 1487 l
+2060 1517 l
+2030 1547 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 1760 a(\(d\))f(Query)h(4)p -34 1861
+V 66 2550 a @beginspecial 50 @llx 50 @lly 500 @urx 375
+@ury 850 @rwi @setspecial
+%%BeginDocument: runtime.Q5.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 552 m
+430 552 l
+420 728 m
+430 728 l
+420 904 m
+430 904 l
+420 1081 m
+430 1081 l
+420 1257 m
+430 1257 l
+420 1433 m
+430 1433 l
+420 1609 m
+430 1609 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 552 m
+2020 552 l
+2030 728 m
+2020 728 l
+2030 904 m
+2020 904 l
+2030 1081 m
+2020 1081 l
+2030 1257 m
+2020 1257 l
+2030 1433 m
+2020 1433 l
+2030 1609 m
+2020 1609 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 728 m
+440 728 l
+420 1081 m
+440 1081 l
+420 1433 m
+440 1433 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 728 m
+2010 728 l
+2030 1081 m
+2010 1081 l
+2030 1433 m
+2010 1433 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 728 m
+gsave
+348 728 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 1081 m
+gsave
+348 1081 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1433 m
+gsave
+348 1433 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-2 1080 m
+gsave
+-2 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 424 m
+956 511 l
+1493 671 l
+2030 1778 l
+stroke
+420 424 30 0 360 arc
+gsave fill grestore
+stroke
+956 511 30 0 360 arc
+gsave fill grestore
+stroke
+1493 671 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1778 30 0 360 arc
+gsave fill grestore
+stroke
+420 426 m
+956 522 l
+1493 688 l
+2030 1737 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 456 m
+390 426 l
+420 396 l
+450 426 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 456 m
+390 426 l
+420 396 l
+450 426 l
+420 456 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 552 m
+926 522 l
+956 492 l
+986 522 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 552 m
+926 522 l
+956 492 l
+986 522 l
+956 552 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 718 m
+1463 688 l
+1493 658 l
+1523 688 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 718 m
+1463 688 l
+1493 658 l
+1523 688 l
+1493 718 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1767 m
+2000 1737 l
+2030 1707 l
+2060 1737 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1767 m
+2000 1737 l
+2030 1707 l
+2060 1737 l
+2030 1767 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 267 2680 a(\(e\))f(Query)h(5)974 2550 y
+@beginspecial 50 @llx 50 @lly 500 @urx 375 @ury 850 @rwi
+@setspecial
+%%BeginDocument: runtime.Q6.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 386 l
+956 376 m
+956 386 l
+1493 376 m
+1493 386 l
+2030 376 m
+2030 386 l
+420 1785 m
+420 1775 l
+956 1785 m
+956 1775 l
+1493 1785 m
+1493 1775 l
+2030 1785 m
+2030 1775 l
+stroke
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+420 415 m
+956 490 l
+1493 633 l
+2030 1651 l
+stroke
+420 415 30 0 360 arc
+gsave fill grestore
+stroke
+956 490 30 0 360 arc
+gsave fill grestore
+stroke
+1493 633 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1651 30 0 360 arc
+gsave fill grestore
+stroke
+420 416 m
+956 493 l
+1493 631 l
+2030 1462 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 446 m
+390 416 l
+420 386 l
+450 416 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 446 m
+390 416 l
+420 386 l
+450 416 l
+420 446 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 523 m
+926 493 l
+956 463 l
+986 493 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 523 m
+926 493 l
+956 463 l
+986 493 l
+956 523 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 661 m
+1463 631 l
+1493 601 l
+1523 631 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 661 m
+1463 631 l
+1493 601 l
+1523 631 l
+1493 661 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1492 m
+2000 1462 l
+2030 1432 l
+2060 1462 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1492 m
+2000 1462 l
+2030 1432 l
+2060 1462 l
+2030 1492 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1178 2678 a(\(f\))f(Query)h(6)p -34 2781
+V 66 3470 a @beginspecial 50 @llx 50 @lly 500 @urx 375
+@ury 850 @rwi @setspecial
+%%BeginDocument: runtime.Q7.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+-83 1080 m
+gsave
+-83 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+420 425 m
+956 510 l
+1493 670 l
+2030 1637 l
+stroke
+420 425 30 0 360 arc
+gsave fill grestore
+stroke
+956 510 30 0 360 arc
+gsave fill grestore
+stroke
+1493 670 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1637 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 501 l
+1493 648 l
+2030 1470 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+420 450 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+956 531 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 678 m
+1463 648 l
+1493 618 l
+1523 648 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 678 m
+1463 648 l
+1493 618 l
+1523 648 l
+1493 678 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1500 m
+2000 1470 l
+2030 1440 l
+2060 1470 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1500 m
+2000 1470 l
+2030 1440 l
+2060 1470 l
+2030 1500 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 265 3598 a(\(g\))f(Query)h(7)974 3470 y
+@beginspecial 50 @llx 50 @lly 500 @urx 375 @ury 850 @rwi
+@setspecial
+%%BeginDocument: runtime.Q8.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+120 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+120 scalefont
+ setfont
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+420 276 m
+gsave
+420 276 translate
+0 rotate
+0 -40 m
+(0) CS
+(0) show
+grestore
+newpath
+956 276 m
+gsave
+956 276 translate
+0 rotate
+0 -40 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 276 m
+gsave
+1493 276 translate
+0 rotate
+0 -40 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 276 m
+gsave
+2030 276 translate
+0 rotate
+0 -40 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+1225 76 m
+gsave
+1225 76 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+120 scalefont
+ setfont
+stroke
+348 376 m
+gsave
+348 376 translate
+0 rotate
+0 -40 m
+(0) RJ
+(0) show
+grestore
+newpath
+348 658 m
+gsave
+348 658 translate
+0 rotate
+0 -40 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+348 940 m
+gsave
+348 940 translate
+0 rotate
+0 -40 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+348 1221 m
+gsave
+348 1221 translate
+0 rotate
+0 -40 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+348 1503 m
+gsave
+348 1503 translate
+0 rotate
+0 -40 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+348 1785 m
+gsave
+348 1785 translate
+0 rotate
+0 -40 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+420 421 m
+956 504 l
+1493 650 l
+2030 1549 l
+stroke
+420 421 30 0 360 arc
+gsave fill grestore
+stroke
+956 504 30 0 360 arc
+gsave fill grestore
+stroke
+1493 650 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1549 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 502 l
+1493 647 l
+2030 1475 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+420 450 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+956 532 m
+926 502 l
+956 472 l
+986 502 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+956 532 m
+926 502 l
+956 472 l
+986 502 l
+956 532 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1493 677 m
+1463 647 l
+1493 617 l
+1523 647 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1493 677 m
+1463 647 l
+1493 617 l
+1523 647 l
+1493 677 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+2030 1505 m
+2000 1475 l
+2030 1445 l
+2060 1475 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+2030 1505 m
+2000 1475 l
+2030 1445 l
+2060 1475 l
+2030 1505 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+929 1359 m
+929 1659 l
+1771 1659 l
+1771 1359 l
+929 1359 l
+stroke
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1584 m
+1259 1584 l
+stroke
+995 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1259 1584 30 0 360 arc
+gsave fill grestore
+stroke
+1325 1584 m
+gsave
+1325 1584 translate
+0 rotate
+0 -40 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+120 scalefont
+ setfont
+995 1434 m
+1259 1434 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+995 1464 m
+965 1434 l
+995 1404 l
+1025 1434 l
+995 1464 l
+stroke
+1.000000 1.000000 1.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+closepath
+gsave eofill grestore
+stroke
+0.000000 0.000000 0.000000 setrgbcolor
+1259 1464 m
+1229 1434 l
+1259 1404 l
+1289 1434 l
+1259 1464 l
+stroke
+1325 1434 m
+gsave
+1325 1434 translate
+0 rotate
+0 -40 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1173 3598 a(\(h\))f(Query)h(8)p 1827 3720
+4 3697 v -104 3723 1935 4 v 1829 3740 19 3703 v -87 3740
+1935 19 v -39 3923 a FG(Figure)i(7:)29 b(Query)19 b(optimization)g
+(times)h(for)g(Q1)g(through)e(Q8)-29 4158 y(The)29 b(query)g(optimizer)
+g(in)h(R)849 4128 y Ff(\003)918 4158 y FG([3])g(w)o(orks)f(in)i
+(essentially)f(the)-112 4257 y(same)16 b(w)o(ay)g(as)g(that)g(of)g
+(System)g(R,)h(e)o(xcept)d(that)i(R)1322 4227 y Ff(\003)1378
+4257 y FG(is)g(a)h(distrib)n(uted)-112 4357 y(database)31
+b(system)i(which)f(introduces)f(some)h(subtle)g(complica-)-112
+4457 y(tions)20 b(in)g(its)h(query)e(optimizer)-5 b(.)-29
+4565 y(The)23 b(Starb)n(urst)h(query)f(optimizer)g([10])g(uses)i(rules)
+f(for)f(all)i(de-)-112 4665 y(cisions)i(that)g(need)f(to)h(be)g(tak)o
+(en)f(by)h(the)g(query)e(optimizer)-5 b(.)49 b(The)-112
+4764 y(rules)17 b(are)g(functional)e(in)j(nature)e(and)g(transform)g(a)
+i(gi)n(v)o(en)e(operator)-112 4864 y(tree)k(into)g(another)-5
+b(.)28 b(The)19 b(rules)i(are)f(commonly)e(those)i(that)g(re\257ect)
+-112 4964 y(relational)27 b(calculus)g(f)o(acts.)53 b(In)27
+b(Starb)n(urst,)j(the)d(query)g(re)n(writing)-112 5063
+y(phase)21 b(is)i(dif)n(ferent)e(from)g(the)h(optimization)f(phase.)35
+b(The)21 b(re)n(writ-)-112 5163 y(ing)13 b(phase)g(transforms)g(the)g
+(query)g(itself)h(into)g(equi)n(v)n(alent)e(operator)-112
+5263 y(trees)21 b(based)f(on)h(relational)f(calculus)g(rules.)31
+b(The)21 b(plan)f(optimiza-)2044 21 y(tion)e(phase)g(selects)h
+(algorithms)e(for)h(each)g(operator)f(in)h(the)g(opera-)2044
+120 y(tor)g(tree)g(that)h(is)g(obtained)e(after)h(re)n(writing.)28
+b(The)18 b(disadv)n(antage)e(of)2044 220 y(separating)21
+b(the)i(query)e(re)n(write)i(and)f(the)g(optimization)g(phases)g(is)
+2044 319 y(that)17 b(pruning)e(of)j(the)f(search)g(space)g(is)i(not)e
+(possible)g(during)e(query)2044 419 y(re)n(write,)k(since)i(the)f(re)n
+(write)g(phase)f(is)j(non-cost-based.)2127 519 y(Fre)o(ytag)13
+b([6])i(describes)f(a)h(rule-based)e(query)g(optimizer)h(similar)2044
+618 y(to)26 b(Starb)n(urst.)45 b(The)25 b(rules)h(are)g(based)f(on)g
+(LISP-lik)o(e)h(representa-)2044 718 y(tions)d(of)g(access)h(plans.)37
+b(The)23 b(rules)g(themselv)o(es)g(are)g(recursi)n(v)o(ely)2044
+818 y(de\256ned)j(on)g(smaller)h(e)o(xpressions)f(\(operator)f
+(trees\).)49 b(Although)2044 917 y(se)n(v)o(eral)23 b(e)o(xpressions)f
+(can)i(contain)f(a)h(common)e(sub-e)o(xpression,)2044
+1017 y(Fre)o(ytag)d(doesn')o(t)f(consider)g(the)i(possibility)g(of)f
+(sharing.)28 b(Expres-)2044 1116 y(sions)22 b(are)f(e)n(v)n(aluated)f
+(each)h(time)h(the)o(y)f(are)g(encountered.)30 b(This)22
+b(is)2044 1216 y(ob)o(viously)14 b(inef)n(\256cient.)27
+b(In)17 b(addition,)f(as)h(in)g(Starb)n(urst,)g(he)g(doesn')o(t)2044
+1316 y(consider)j(the)i(cost)f(transformations)e(inherent)i(in)g(an)o
+(y)g(query)f(op-)2044 1415 y(timizer;)g(rules)g(are)g(syntactic)g
+(transformation)e(rules.)2127 1515 y(EXODUS)j([9])g(pro)o(vides)f(an)h
+(optimizer)f(generator)f(which)i(ac-)2044 1615 y(cepts)j(a)g
+(rule-based)e(speci\256cation)h(of)g(the)h(data)g(model)f(as)h(input.)
+2044 1714 y(The)18 b(optimizer)g(generator)f(compiles)h(these)h(rules,)
+f(together)g(with)2044 1814 y(pre-de\256ned)d(rules,)k(to)f(generate)f
+(an)h(optimizer)f(for)g(the)h(particular)2044 1913 y(data)25
+b(model)g(and)g(set)h(of)f(operators.)44 b(Unlik)o(e)25
+b(Fre)o(ytag,)g(the)h(opti-)2044 2013 y(mizer)18 b(generator)g(for)g
+(EXODUS)h(allo)n(ws)h(for)e(C)i(code)f(along)f(with)2044
+2113 y(de\256nitions)28 b(of)h(ne)n(w)g(rules.)56 b(This)29
+b(allo)n(ws)g(the)g(database)g(imple-)2044 2212 y(mentor)17
+b(the)h(freedom)e(to)i(associate)g(an)o(y)f(action)h(with)g(a)g
+(particular)2044 2312 y(rule.)28 b(Operator)15 b(trees)j(in)f(EXODUS)h
+(are)f(constructed)f(bottom-up)2044 2412 y(from)j(pre)n(viously)f
+(constructed)h(trees.)2127 2511 y(The)14 b(V)-11 b(olcano)14
+b(optimizer)g(generator)f(project)h([7])g(e)n(v)n(olv)o(ed)f(from)2044
+2611 y(the)22 b(EXODUS)g(project.)33 b(It)22 b(is)h(dif)n(ferent)d
+(from)h(all)i(the)f(abo)o(v)o(e)e(op-)2044 2710 y(timizers)k(in)h(one)e
+(signi\256cant)h(w)o(ay:)38 b(it)25 b(is)g(a)g(top-do)n(wn)d(optimizer)
+2044 2810 y(compared)16 b(with)i(the)g(bottom-up)e(strate)o(gy)h(of)h
+(the)g(others.)28 b(Opera-)2044 2910 y(tor)16 b(trees)i(are)e
+(optimized)g(starting)g(from)g(the)h(root)f(while)h(sub-trees)2044
+3009 y(are)g(not)h(yet)g(optimized.)27 b(This)18 b(leads)g(to)g(a)g
+(constraint-dri)n(v)o(en)c(gen-)2044 3109 y(eration)23
+b(of)g(the)h(search)f(space.)40 b(While)25 b(this)f(method)f(results)h
+(in)g(a)2044 3209 y(tight)k(control)g(of)g(the)h(search)f(space,)i(it)g
+(is)f(uncon)m(v)o(entional)c(and)2044 3308 y(requires)16
+b(careful)g(attention)h(on)g(the)g(part)g(of)g(the)h(optimizer)e
+(imple-)2044 3408 y(mentor)j(to)h(ensure)f(that)h(le)o(gal)g(operator)e
+(trees)i(are)h(not)e(accidently)2044 3508 y(left)25 b(out)g(of)f(the)h
+(search)g(space.)43 b(W)-7 b(e)26 b(ha)n(v)o(e)e(used)h(V)-11
+b(olcano)24 b(as)i(our)2044 3607 y(back-end)18 b(search)i(engine.)2044
+3881 y FB(6)119 b(Conclusion)31 b(and)g(futur)n(e)f(w)o(ork)2044
+4067 y FG(Current)24 b(rule-based)f(query)h(optimizers)g(do)h(not)g
+(pro)o(vide)e(a)i(v)o(ery)2044 4167 y(intuiti)n(v)o(e)c(and)g
+(conceptually)f(streamlined)h(frame)n(w)o(ork)f(to)i(de\256ne)2044
+4266 y(rules)31 b(and)f(actions.)61 b(Our)30 b(e)o(xperiences)f(with)i
+(the)g(V)-11 b(olcano)30 b(op-)2044 4366 y(timizer)j(generator)f
+(suggest)h(that)h(its)h(model)e(of)g(rules)h(and)f(the)2044
+4466 y(e)o(xpression)17 b(of)h(these)h(rules)f(is)h(much)f(more)g
+(complicated)e(and)i(too)2044 4565 y(lo)n(w-le)n(v)o(el)25
+b(than)h(it)h(needs)e(to)i(be.)47 b(As)27 b(a)g(consequence,)e(rule)h
+(sets)2044 4665 y(in)k(V)-11 b(olcano)28 b(are)i(fragile,)h(hard)e(to)h
+(write,)i(and)d(deb)n(ug.)56 b(Similar)2044 4764 y(problems)16
+b(may)i(e)o(xist)g(in)g(other)f(contemporary)e(rule-based)h(query)2044
+4864 y(optimizers.)2127 4964 y(W)-7 b(e)21 b(belie)n(v)o(e)d(that)i
+(rule-based)e(query)g(optimizers)h(will)h(be)g(stan-)2044
+5063 y(dard)h(tools)i(of)f(future)f(database)h(systems.)36
+b(The)23 b(pragmatic)e(dif)n(\256-)2044 5163 y(culties)h(of)f(using)g
+(e)o(xisting)g(rule-based)f(optimizers)g(led)i(us)g(to)f(de-)2044
+5263 y(v)o(elop)f(Prairie,)h(an)g(e)o(xtensible)f(and)h(structured)e
+(algebraic)h(frame-)p eop
+%%Page: 10 10
+10 9 bop -112 21 a FG(w)o(ork)36 b(for)g(specifying)f(rules.)78
+b(Prairie)37 b(is)h(similar)f(to)g(e)o(xisting)-112 120
+y(optimizers)21 b(in)i(that)f(it)h(supports)f(both)f(transformation)f
+(rules)i(and)-112 220 y(implementation)g(rules.)42 b(Ho)n(we)n(v)o(er)m
+(,)23 b(Prairie)i(mak)o(es)f(se)n(v)o(eral)g(im-)-112
+319 y(pro)o(v)o(ements:)-50 503 y(1.)41 b(it)14 b(of)n(fers)e(a)i
+(conceptually)e(more)g(streamlined)h(model)f(for)h(rule)54
+603 y(speci\256cation;)-50 793 y(2.)41 b(rules)18 b(are)g
+(encapsulated,)e(there)i(are)g(no)g(\252hidden\272)e(operators)54
+893 y(or)j(\252hidden\272)g(algorithms;)-50 1083 y(3.)41
+b(implementation)19 b(hints)i(\(e.g.,)f(enforcers\))g(are)h(deduced)e
+(au-)54 1182 y(tomatically;)-50 1372 y(4.)41 b(and)19
+b(it)i(has)g(ef)n(\256cient)e(implementations.)-29 1556
+y(W)-7 b(e)26 b(ha)n(v)o(e)f(e)o(xplained)f(ho)n(w)h(the)h(\256rst)g
+(three)f(points)g(are)h(impor)n(-)-112 1656 y(tant)19
+b(for)g(simplifying)f(rule)h(speci\256cations)g(and)g(making)g(rule)g
+(sets)-112 1755 y(less)27 b(brittle)g(for)f(e)o(xtensibility)-5
+b(.)46 b(A)27 b(consequence)e(is)i(that)g(Prairie)-112
+1855 y(rules)20 b(are)h(simpler)g(and)f(more)g(rob)n(ust)h(than)f
+(rules)h(of)f(e)o(xisting)h(op-)-112 1955 y(timizers)j(\(e.g.,)h(V)-11
+b(olcano\).)41 b(W)-7 b(e)25 b(addressed)f(the)g(fourth)f(point)h(by)
+-112 2054 y(b)n(uilding)h(a)i(P2V)g(pre-processor)d(which)i(uses)h
+(sophisticated)f(al-)-112 2154 y(gorithms)e(to)j(compose)e(and)g
+(compact)g(a)i(Prairie)f(rule)g(set)h(into)e(a)-112 2253
+y(V)-11 b(olcano)22 b(rule)i(set.)41 b(T)-7 b(o)24 b(demonstrate)e(the)
+i(scalability)g(of)f(our)g(ap-)-112 2353 y(proach,)18
+b(we)j(re)n(wrote)e(the)i(TI)f(Open)g(OODB)h(rule)f(set)h(as)g(a)g
+(Prairie)-112 2453 y(rule)e(set,)h(generated)d(its)k(V)-11
+b(olcano)18 b(counterpart,)f(and)i(sho)n(wed)g(that)-112
+2552 y(the)g(performance)e(of)j(the)f(synthesized)g(V)-11
+b(olcano)19 b(rule)g(set)i(closely)-112 2652 y(matches)e(the)i
+(hand-crafted)c(V)-11 b(olcano)19 b(rule)h(set.)-29 2758
+y(Our)26 b(future)f(w)o(ork)h(will)h(concentrate)e(on)h(de)n(v)o
+(eloping)e(higher)n(-)-112 2857 y(le)n(v)o(el)13 b(abstractions)g
+(using)g(Prairie,)c(including)k(automatically)g(gen-)-112
+2957 y(erating)i(Prairie)i(rule)g(sets,)h(and)f(combining)d(multiple)i
+(Prairie)h(rule)-112 3056 y(sets)k(to)f(automatically)f(generate)g(ef)n
+(\256cient)h(optimizers.)-112 3369 y FB(Ackno)o(wledgments)-112
+3566 y FG(W)-7 b(e)31 b(wish)f(to)g(thank)f(T)-6 b(e)o(xas)29
+b(Instruments,)i(Inc.)e(for)g(making)g(the)-112 3666
+y(Open)h(OODB)h(source)g(code)f(a)n(v)n(ailable)g(to)h(us.)62
+b(Comments)30 b(by)-112 3766 y(Jos)-1 3765 y(\302)-6
+3766 y(e)20 b(Blak)o(ele)o(y)-5 b(,)19 b(Anne)g(Ngu,)g(V)-5
+b(i)n(v)o(ek)19 b(Singhal,)g(Thomas)f(W)-7 b(oo)20 b(and)-112
+3865 y(the)h(anon)o(ymous)d(referees)i(greatly)h(impro)o(v)o(ed)d(the)j
+(quality)g(of)g(the)-112 3965 y(paper)-5 b(.)-112 4278
+y FB(Refer)n(ences)-71 4475 y FG([1])40 b(D.)15 b(S.)h(Batory)-5
+b(.)19 b(Building)14 b(blocks)g(of)h(database)f(management)67
+4574 y(systems.)28 b(T)-6 b(echnical)18 b(Report)g(TR\26187\26123,)f
+(The)h(Uni)n(v)o(ersity)67 4674 y(of)i(T)-6 b(e)o(xas)20
+b(at)h(Austin,)f(February)e(1988.)-71 4864 y([2])40 b(Jos)178
+4863 y(\302)173 4864 y(e)e(A.)f(Blak)o(ele)o(y)-5 b(,)40
+b(W)m(illiam)d(J.)h(McK)n(enna,)i(and)c(Goetz)67 4964
+y(Graefe.)h(Experiences)21 b(b)n(uilding)h(the)h(Open)f(OODB)i(query)67
+5063 y(optimizer)-5 b(.)28 b(In)19 b FF(Pr)l(oceedings)f(1993)h(A)n(CM)
+h(SIGMOD)f(Inter)n(-)67 5163 y(national)27 b(Confer)m(ence)h(on)g(Mana)
+o(g)o(ement)f(of)i(Data)p FG(,)h(pages)67 5263 y(287\261296,)17
+b(W)-7 b(ashington,)20 b(May)f(1993.)2085 21 y([3])41
+b(Dean)33 b(Daniels,)k(P)o(atricia)c(Selinger)m(,)j(Laura)c(Haas,)37
+b(Bruce)2224 120 y(Lindsay)-5 b(,)24 b(C.)i(Mohan,)f(Adrian)g(W)-7
+b(alk)o(er)m(,)26 b(and)f(P)o(aul)g(W)m(ilms.)2224 220
+y(An)13 b(introduction)e(to)j(distrib)n(uted)f(query)f(compilation)f
+(in)j(R)3953 190 y Ff(\003)3992 220 y FG(.)2224 319 y(In)22
+b FF(Pr)l(oceedings)g(2nd)g(International)e(Confer)m(ence)i(on)h(Dis-)
+2224 419 y(trib)n(uted)14 b(Databases)p FG(,)e(pages)i(291\261309,)c
+(Berlin,)k(September)2224 519 y(1982.)2085 685 y([4])41
+b(Dinesh)31 b(Das)g(and)g(Don)g(Batory)-5 b(.)57 b(Prairie:)52
+b(An)31 b(algebraic)2224 784 y(frame)n(w)o(ork)38 b(for)i(rule)g
+(speci\256cation)g(in)h(query)e(optimiz-)2224 884 y(ers.)72
+b(In)36 b FF(Pr)l(oceedings)f(of)i(the)f(W)-8 b(orkshop)36
+b(on)g(Database)2224 984 y(Query)14 b(Optimizer)h(Gener)o(ator)o(s)f
+(and)g(Rule-Based)f(Optimiz-)2224 1083 y(er)o(s)p FG(,)21
+b(pages)f(139\261154,)d(Dallas,)j(September)f(1993.)2085
+1249 y([5])41 b(Dinesh)31 b(Das)i(and)f(Don)g(Batory)-5
+b(.)60 b(Prairie:)53 b(A)33 b(rule)e(spec-)2224 1349
+y(i\256cation)e(frame)n(w)o(ork)f(for)h(query)f(optimizers.)54
+b(T)-6 b(echnical)2224 1449 y(Report)22 b(TR)i(94\26116,)e(The)g(Uni)n
+(v)o(ersity)g(of)h(T)-6 b(e)o(xas)23 b(at)g(Austin,)2224
+1548 y(May)d(1994.)2085 1714 y([6])41 b(Johann)15 b(Christoph)h(Fre)o
+(ytag.)23 b(A)18 b(rule-based)d(vie)n(w)i(of)f(query)2224
+1814 y(optimization.)22 b(In)17 b FF(Pr)l(oceedings)f(1987)g(A)n(CM)i
+(SIGMOD)f(In-)2224 1913 y(ternational)12 b(Confer)m(ence)g(on)h(Mana)o
+(g)o(ement)f(of)h(Data)p FG(,)h(pages)2224 2013 y(173\261180,)j(San)j
+(Francisco,)f(May)h(1987.)2085 2179 y([7])41 b(Goetz)c(Graefe.)74
+b(V)-11 b(olcano,)41 b(an)c(e)o(xtensible)g(and)g(parallel)2224
+2279 y(query)25 b(e)n(v)n(aluation)h(system.)48 b(T)-6
+b(echnical)26 b(Report)h(CU\261CS\261)2224 2378 y(481\26190,)15
+b(Uni)n(v)o(ersity)g(of)i(Colorado)e(at)j(Boulder)m(,)e(July)h(1990.)
+2085 2544 y([8])41 b(Goetz)25 b(Graefe.)44 b(Query)26
+b(e)n(v)n(aluation)e(techniques)h(for)g(lar)o(ge)2224
+2644 y(databases.)58 b FF(A)n(CM)32 b(Computing)e(Surve)n(ys)p
+FG(,)k(25\(2\):73\261170,)2224 2744 y(June)20 b(1993.)2085
+2910 y([9])41 b(Goetz)32 b(Graefe)g(and)g(Da)n(vid)h(J.)g(DeW)m(itt.)63
+b(The)33 b(EXODUS)2224 3009 y(optimizer)23 b(generator)-5
+b(.)38 b(In)24 b FF(Pr)l(oceedings)f(1987)g(A)n(CM)i(SIG-)2224
+3109 y(MOD)40 b(International)e(Confer)m(ence)h(on)h(Mana)o(g)o(ement)e
+(of)2224 3209 y(Data)p FG(,)19 b(pages)h(387\261394,)d(San)j
+(Francisco,)g(May)g(1987.)2044 3375 y([10])40 b(L.)23
+b(M.)g(Haas,)h(J.)g(C.)g(Fre)o(ytag,)f(G.)g(M.)h(Lohman,)e(and)g(H.)i
+(Pi-)2224 3474 y(rahesh.)31 b(Extensible)20 b(query)g(processing)g(in)i
+(Starb)n(urst.)32 b(Re-)2224 3574 y(search)20 b(Report)g(RJ)i(6610,)e
+(IBM)h(Almaden)e(Research)i(Cen-)2224 3674 y(ter)m(,)e(December)g
+(1988.)2044 3840 y([11])40 b(P)-9 b(.)33 b(G.)g(Selinger)m(,)h(M.)f(M.)
+g(Astrahan,)i(D.)e(D.)g(Chamberlin,)2224 3939 y(R.)17
+b(A.)g(Lorie,)g(and)f(T)-6 b(.)17 b(G.)g(Price.)24 b(Access)18
+b(path)e(selection)h(in)g(a)2224 4039 y(relational)24
+b(database)g(management)f(system.)41 b(In)25 b FF(Pr)l(oceed-)2224
+4138 y(ings)34 b(1979)f(A)n(CM)i(SIGMOD)g(International)d(Confer)m
+(ence)2224 4238 y(on)26 b(Mana)o(g)o(ement)f(of)i(Data)p
+FG(,)h(pages)f(23\26134,)f(Boston,)i(May)2224 4338 y(1979.)2044
+4504 y([12])40 b(Michael)18 b(Stonebrak)o(er)e(and)i(La)o(wrence)g(A.)h
+(Ro)n(we.)26 b(The)18 b(de-)2224 4603 y(sign)g(of)g(Postgres.)27
+b(In)18 b FF(Pr)l(oceedings)f(1986)g(A)n(CM)i(SIGMOD)2224
+4703 y(International)38 b(Confer)m(ence)h(on)h(Mana)o(g)o(ement)f(of)i
+(Data)p FG(,)2224 4803 y(pages)19 b(340\261355,)e(W)-7
+b(ashington,)20 b(May)g(1986.)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/macros/latex/contrib/utthesis/tr94-16.ps b/macros/latex/contrib/utthesis/tr94-16.ps
new file mode 100644
index 0000000000..5bef7ffec0
--- /dev/null
+++ b/macros/latex/contrib/utthesis/tr94-16.ps
@@ -0,0 +1,7614 @@
+%!PS-Adobe-2.0
+%%Creator: dvips 5.521 Copyright 1986, 1993 Radical Eye Software
+%%Title: paper.dvi
+%%CreationDate: Fri May 20 20:04:27 1994
+%%Pages: 25
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: Times-Bold Times-Roman Times-Italic Courier
+%%EndComments
+%DVIPSCommandLine: dvips paper -o
+%DVIPSSource: TeX output 1994.05.20:2003
+%%BeginProcSet: tex.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR matrix currentmatrix dup dup 4 get round 4 exch put dup dup 5 get
+round 5 exch put setmatrix}N /@landscape{/isls true N}B /@manualfeed{
+statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0
+0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn
+begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X
+array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo
+setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx
+FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{
+pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}
+B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup
+length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B
+/ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type
+/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp
+0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2
+index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff
+ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice
+ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{
+ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]}if nn
+/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1
+sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{cc 1 add D
+}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0
+moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add
+.99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage
+userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale rulex ruley
+false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex ruley
+scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave
+transform round exch round exch itransform moveto rulex 0 rlineto 0
+ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta
+0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}
+B /c{-4 M}B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{
+3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p
+-1 w}B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{
+3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pstricks.pro
+% PostScript prologue for pstricks.tex.
+% Created 1993/3/12. Source file was pstricks.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@Dict 200 dict def tx@Dict begin
+/ADict 25 dict def
+/CM { matrix currentmatrix } bind def
+/SLW /setlinewidth load def
+/CLW /currentlinewidth load def
+/CP /currentpoint load def
+/ED { exch def } bind def
+/L /lineto load def
+/T /translate load def
+/Atan { /atan load stopped { pop pop 0 } if } def
+/Div { dup 0 eq { pop } { div } ifelse } def
+/NET { neg exch neg exch T } def
+/Pyth { dup mul exch dup mul add sqrt } def
+/PtoC { 2 copy cos mul 3 1 roll sin mul } def
+/PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def }
+def
+/PathLength { flattenpath /z 0 def { /y1 ED /x1 ED /y2 y1 def /x2 x1 def
+} { /y ED /x ED PathLength@ } {} { /y y2 def /x x2 def PathLength@ }
+pathforall z } def
+/STP { .996264 dup scale } def
+/STV { SDict begin normalscale end STP } def
+/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def
+PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y
+mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul
+/y ED x mul /x ED x 0 eq y 0 eq and { /x 1 def /y 1 def } if [ y x ] 1 a
+sub y mul setdash stroke } def
+/DotLine { /b PathLength def /a ED /z ED /y CLW def /z y z add def a 0 gt
+{ /b b a div def } { a 0 eq { /b b y sub def } { a -3 eq { /b b y add
+def } if } ifelse } ifelse [ 0 b b z Div round Div dup 0 le { pop 1 } if
+] a 0 gt { 0 } { y 2 div a -2 gt { neg } if } ifelse setdash 1
+setlinecap stroke } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap n { currentstrokeadjust == x1 y1 moveto x2 y1 L
+stroke /y1 y1 a add def } repeat grestore } def
+/LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED
+/x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul
+def newpath 2 setlinecap systemdict /currentstrokeadjust known {
+currentstrokeadjust } { false } ifelse { /t { } def } { /t { transform
+0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }
+bind def } ifelse n { x1 y1 t moveto x2 y1 t L stroke /y1 y1 a add def }
+repeat grestore } def
+/BeginArrow { ADict begin /@mtrx CM def gsave 2 copy T 2 index sub neg
+exch 3 index sub exch Atan rotate newpath } def
+/EndArrow { @mtrx setmatrix CP grestore end } def
+/Arrow { CLW mul add dup 2 div /w ED mul dup /h ED mul /a ED { 0 h T 1 -1
+scale } if w neg h moveto 0 0 L w h L w neg a neg rlineto gsave fill
+grestore } def
+/Tbar { CLW mul add /z ED z -2 div CLW 2 div moveto z 0 rlineto stroke 0
+CLW moveto } def
+/Bracket { CLW mul add dup CLW sub 2 div /x ED mul CLW add /y ED /z CLW 2
+div def x neg y moveto x neg CLW 2 div L x CLW 2 div L x y L stroke 0
+CLW moveto } def
+/RoundBracket { CLW mul add dup 2 div /x ED mul /y ED /mtrx CM def 0 CLW
+2 div T x y mul 0 ne { x y scale } if 1 1 moveto .85 .5 .35 0 0 0
+curveto -.35 0 -.85 .5 -1 1 curveto mtrx setmatrix stroke 0 CLW moveto }
+def
+/Shadow { [ { /moveto load } { /lineto load } { /curveto load } {
+/closepath load } pathforall ] cvx newpath 3 1 roll T exec } def
+/SD { 0 360 arc fill } def
+/SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def
+/ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def
+/SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore }
+def
+/NArray { aload length 2 div dup dup cvi eq not { exch pop } if /n exch
+cvi def } def
+/NArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop } if
+f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def
+/Line { NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub
+def n { Lineto } repeat CP 4 2 roll ArrowB L pop pop } if } def
+/Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 }
+ifelse { pop } repeat a } def
+/CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq
+and { pop pop /n n 1 sub def } if } def
+/Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop }
+repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1
+ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1
+moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto
+Lineto pop pop closepath } ifelse } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth
+def } def
+/CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1
+def CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp
+mul dy1 l0 c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos
+abs b exp a mul dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def
+/y2 y l0 dy mul m mul sub def /dx l1 dx mul m mul neg def /dy l1 dy mul
+m mul neg def } def
+/IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if }
+ifelse /a a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def }
+def
+/BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def
+/NC { CC x1 y1 x2 y2 x y curveto } def
+/EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def
+/BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def
+/NAC { x2 y2 x y curveto CC x1 y1 } def
+/EAC { x2 y2 x y ArrowB curveto pop pop } def
+/OpenCurve { NArray n 3 lt { n { pop pop } repeat } { BOC /n n 3 sub def
+n { NC } repeat EOC } ifelse } def
+/AltCurve { { false NArray n 2 mul 2 roll [ n 2 mul 3 sub 1 roll ] aload
+/Points ED n 2 mul -2 roll } { false NArray } ifelse n 4 lt { n { pop
+pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse } def
+/ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt {
+CheckClosed } if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC }
+repeat closepath pop pop } ifelse } def
+/EndDot { { /z DS def } { /z 0 def } ifelse /b ED 0 z DS SD b { 0 z DS
+CLW sub SD } if 0 DS z add CLW 4 div sub moveto } def
+/Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto
+x1 y1 lineto closepath } def
+/OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1
+y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div
+exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse
+/b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto
+x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath }
+ifelse } def
+/Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add
+/y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq {
+pop pop Rect } { OvalFrame } ifelse } def
+/Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1
+sub 3 div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA
+x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0
+y0 x0 2 mul x1 sub y1 ] def } def
+/Grid { /a 4 string def /b ED /d ED /n ED cvi dup 1 lt { pop 1 } if /c ED
+c div dup 0 eq { pop 1 } if /cy ED c div dup 0 eq { pop 1 } if /cx ED cy
+div cvi /y ED cx div cvi /x ED cy div cvi /y2 ED cx div cvi /x2 ED cy
+div cvi /y1 ED cx div cvi /x1 ED /h y2 y1 sub 0 gt { 1 } { -1 } ifelse
+def /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def b 0 gt { /z1 b 4 div CLW 2
+div add def /Helvetica findfont b scalefont setfont /b b .95 mul CLW 2
+div add def } if gsave n 0 gt { 1 setlinecap [ 0 cy n div ] 0 setdash }
+{ 2 setlinecap } ifelse /c x1 def /i 500 w mul x1 add def /e y cy mul
+def /f y1 cy mul def /g y2 cy mul def x1 cx mul 0 T { newpath 0 e moveto
+b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1} {z1 z2
+add neg} ifelse h 0 gt {b neg} {z1} ifelse rmoveto show grestore } if 0
+f moveto 0 g L stroke cx w mul 0 T c x2 eq c i eq or {exit} if /c c w
+add def } loop grestore gsave n 0 gt { 1 setlinecap [ 0 cx n div ] 0
+setdash } { 2 setlinecap } ifelse /c y1 def /i 500 h mul y1 add def /e x
+cx mul def /f x1 cx mul def /g x2 cx mul def 0 y1 cy mul T { newpath e 0
+moveto b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1 z2
+add neg} {z1} ifelse h 0 gt {z1} {b neg} ifelse rmoveto show grestore }
+if f 0 moveto g 0 L stroke 0 cy h mul T c y2 eq c i eq or {exit} if /c c
+h add def } loop grestore } def
+/ArcArrow { /d ED /b ED /a ED gsave newpath 0 -1000 moveto clip newpath 0
+1 0 0 b grestore c mul /e ED pop pop pop r a e d PtoC y add exch x add
+exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c
+mul neg d } def
+/Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def
+/Rot { CP CP translate 3 -1 roll neg rotate NET } def
+/PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def
+/PutBegin { /lmtrx [ tx@Dict /lmtrx known { lmtrx aload pop } if CM ] def
+CP 4 2 roll T moveto } def
+/PutEnd { CP /lmtrx [ lmtrx aload pop setmatrix ] def moveto } def
+/Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s
+abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b
+div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } {
+h1 abs h sub dup s mul abs } ifelse } def
+/UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s
+mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q
+{ x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add
+exch } def
+/BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { CP OLUnit T
+moveto /IfVisible true def } if } { IfVisible { CP OLUnit NET moveto
+/IfVisible false def } if } ifelse } def
+/InitOL { /OLUnit [ gsave CM STV 2890.79999 dup moveto setmatrix CP
+grestore ] cvx def /BOL { BeginOL } def /IfVisible true def } def
+end
+%%EndProcSet
+%%BeginProcSet: /u/ddas/tex/pstricks/ps/pst-node.pro
+% PostScript prologue for pst-node.tex.
+% Created 1993/3/12. Source file was pst-node.doc
+% Version 0.93a, 93/03/12.
+% For use with Rokicki's dvips.
+/tx@NodeDict 200 dict def tx@NodeDict begin
+/NewNode { gsave /next ED dict dup 3 -1 roll ED begin tx@Dict begin STV
+CP T exec end /NodeMtrx CM def next end grestore } def
+/InitPnode { /Y ED /X ED /NodePos { Nodesep Cos mul Nodesep Sin mul } def
+} def
+/InitCnode { /r ED /Y ED /X ED /NodePos { Nodesep r add dup Cos mul exch
+Sin mul } def } def
+/GetRnodePos { Cos 0 gt { /dx r Nodesep add def } { /dx l Nodesep sub def
+} ifelse Sin 0 gt { /dy u Nodesep add def } { /dy d Nodesep sub def }
+ifelse dx Sin mul abs dy Cos mul abs gt { dy Cos mul Sin div dy } { dx
+dup Sin mul Cos Div } ifelse } def
+/InitRnode { /r ED r mul neg /l ED /r r l add def /X l neg def { neg /d
+ED /u ED /Y 0 def } { neg /Y ED Y sub /u ED u mul neg /d ED /u u d add
+def /Y Y d sub def } ifelse /NodePos { GetRnodePos } def } def
+/InitRNode { /Y ED /X ED /r ED /X r 2 div X add def /r r X sub def /l X
+neg def Y add neg /d ED Y sub /u ED /NodePos { GetRnodePos } def } def
+/GetOnodePos { /ww w Nodesep add def /hh h Nodesep add def Sin ww mul Cos
+hh mul Atan dup cos ww mul exch sin hh mul } def
+/GetCenter { begin X Y NodeMtrx transform CM itransform end } def
+/GetAngle { nodeA GetCenter nodeB GetCenter 3 -1 roll sub 3 1 roll sub
+neg Atan } def
+/GetEdge { begin /Nodesep ED dup 1 0 NodeMtrx dtransform CM idtransform
+exch atan sub dup sin /Sin ED cos /Cos ED NodePos Y add exch X add exch
+NodeMtrx transform CM itransform end 4 2 roll 1 index 0 eq { pop pop } {
+2 copy 5 2 roll cos mul add 4 1 roll sin mul sub exch } ifelse } def
+/GetPos { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED OffsetB
+AngleB NodesepB nodeB GetEdge /y2 ED /x2 ED } def
+/InitNC { /nodeB ED /nodeA ED /NodesepB ED /NodesepA ED /OffsetB ED
+/OffsetA ED tx@NodeDict nodeA known tx@NodeDict nodeB known and dup {
+/nodeA nodeA load def /nodeB nodeB load def } if } def
+/LineMP { 4 copy 1 t sub mul exch t mul add 3 1 roll 1 t sub mul exch t
+mul add exch 6 2 roll sub 3 1 roll sub Atan } def
+/NCCoor { GetAngle /AngleA ED /AngleB AngleA 180 add def GetPos /LPutVar
+[ x2 x1 y2 y1 ] cvx def /LPutPos { LPutVar LineMP } def x1 y1 x2 y2 }
+def
+/NCLine { NCCoor tx@Dict begin ArrowB 4 2 roll ArrowA lineto end } def
+/BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED
+/t ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3
+mul cx sub def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx
+sub def /ay y3 y0 sub cy sub by sub def ax t 3 exp mul bx t t mul mul
+add cx t mul add x0 add ay t 3 exp mul by t t mul mul add cy t mul add
+y0 add 3 ay t t mul mul mul 2 by t mul mul add cy add 3 ax t t mul mul
+mul 2 bx t mul mul add cx add atan } def
+/GetArms { /x1a armA AngleA cos mul x1 add def /y1a armA AngleA sin mul
+y1 add def /x2a armB AngleB cos mul x2 add def /y2a armB AngleB sin mul
+y2 add def } def
+/NCCurve { GetPos x1 x2 sub y1 y2 sub Pyth 2 div dup 3 -1 roll mul /armA
+ED mul /armB ED GetArms x1a y1a x1 y1 tx@Dict begin ArrowA end x2a y2a
+x2 y2 tx@Dict begin ArrowB end curveto /LPutVar [ x1 y1 x1a y1a x2a y2a
+x2 y2 ] cvx def /LPutPos { t LPutVar BezierMidpoint } def } def
+/AnglesMP { LPutVar t 3 gt { /t t 3 sub def } { t 2 gt { /t t 2 sub def
+10 -2 roll } { t 1 gt { /t t 1 sub def 10 -4 roll } { 10 4 roll } ifelse
+} ifelse } ifelse 6 { pop } repeat 3 -1 roll exch LineMP } def
+/NCAngles { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform exch pop mtrx itransform /y0 ED /x0
+ED mark armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1a y1a armA 0 ne { x1 y1 }
+if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a y2a x0 y0 x1a y1a
+x1 y1 ] cvx def /LPutPos { AnglesMP } def } def
+/NCAngle { GetPos /x2a armB AngleB cos mul x2 add def /y2a armB AngleB
+sin mul y2 add def /mtrx AngleA matrix rotate def x2a y2a mtrx transform
+pop x1 y1 mtrx transform exch pop mtrx itransform /y0 ED /x0 ED mark
+armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1 y1 tx@Dict begin false Line end
+/LPutVar [ x2 y2 x2 y2 x2a y2a x0 y0 x1 y1 ] cvx def /LPutPos { AnglesMP
+} def } def
+/NCBar { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform pop x2a y2a mtrx transform pop sub dup 0 mtrx itransform 3 -1
+roll 0 gt { /y2a exch y2a add def /x2a exch x2a add def } { /y1a exch
+neg y1a add def /x2a exch neg x2a add def } ifelse mark x2 y2 x2a y2a
+x1a y1a x1 y1 tx@Dict begin false Line end /LPutVar [ x2 y2 x2 y2 x2a
+y2a x1a y1a x1 y1 ] cvx def /LPutPos { LPutVar AnglesMP } def } def
+/NCDiag { GetPos GetArms mark x2 y2 x2a y2a x1a y1a x1 y1 tx@Dict begin
+false Line end /LPutVar [ x2 y2 x2 y2 x2a y2a x1a y1a x1 y1 ] cvx def
+/LPutPos { AnglesMP } def } def
+/NCDiagg { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED /x1a armA
+AngleA cos mul x1 add def /y1a armA AngleA sin mul y1 add def nodeB
+GetCenter y1a sub exch x1a sub Atan 180 add /AngleB ED OffsetB AngleB
+NodesepB nodeB GetEdge /y2 ED /x2 ED mark x2 y2 x1a y1a x1 y1 tx@Dict
+begin false Line end /LPutVar [ x2 y2 x2 y2 x2 y2 x1a y1a x1 y1] cvx def
+/LPutPos { AnglesMP } def } def
+/LoopMP { /t t abs def [ LPutVar ] length 2 div 1 sub dup t lt { /t ED }
+{ pop } ifelse mark LPutVar t cvi { /t t 1 sub def pop pop } repeat
+counttomark 1 add 4 roll cleartomark 3 -1 roll exch LineMP } def
+/NCLoop { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx
+transform loopsize add /y1b ED /x1b ED /x2b x2a y2a mtrx transform pop
+def x2b y1b mtrx itransform /y2b ED /x2b ED x1b y1b mtrx itransform /y1b
+ED /x1b ED mark armB 0 ne { x2 y2 } if x2a y2a x2b y2b x1b y1b x1a y1a
+armA 0 ne { x1 y1 } if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a
+y2a x2b y2b x1b y1b x1a y1a x1 y1 ] cvx def /LPutPos { LoopMP } def }
+def
+/NCCircle { nodeA GetCenter 0 0 NodesepA nodeA GetEdge pop 3 1 roll /Y ED
+/X ED X sub 2 div dup 2 exp r r mul sub abs sqrt atan 2 mul /a ED r
+AngleA 90 add PtoC Y add exch X add exch 2 copy /LPutVar [ 4 2 roll r a
+] def /LPutPos { LPutVar aload pop t 360 mul add dup 5 1 roll 90 sub
+PtoC 3 -1 roll add 3 1 roll add exch 3 -1 roll } def r AngleA 90 sub a
+add AngleA 270 add a sub tx@Dict begin /angleB ED /angleA ED /r ED /c
+57.2957 r Div def /y ED /x ED } def
+/LPutCoor { tx@NodeDict /LPutPos known { gsave LPutPos tx@Dict begin
+/langle ED CM 3 1 roll STV CP 3 -1 roll sub neg 3 1 roll sub exch moveto
+setmatrix CP end grestore } { 0 0 tx@Dict /langle 0 def end } ifelse }
+def
+end
+%%EndProcSet
+%%BeginProcSet: texps.pro
+TeXDict begin /rf{findfont dup length 1 add dict begin{1 index /FID ne 2
+index /UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics
+exch def dict begin Encoding{exch dup type /integertype ne{pop pop 1 sub
+dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}
+ifelse}forall Metrics /Metrics currentdict end def[2 index currentdict
+end definefont 3 -1 roll makefont /setfont load]cvx def}def
+/ObliqueSlant{dup sin S cos div neg}B /SlantFont{4 index mul add}def
+/ExtendFont{3 -1 roll mul exch}def /ReEncodeFont{/Encoding exch def}def
+end
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale false def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+%%EndProcSet
+TeXDict begin @defspecial
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+ TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4
+copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind
+def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch
+} if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min
+radius sub /miny exch store max radius add /maxy exch store 2 copy
+min radius sub /minx exch store max radius add /maxx exch store newpath
+minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy
+minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx
+miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox
+gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end
+
+@fedspecial end TeXDict begin
+40258431 52099146 1000 300 300
+(/v/ahhnold/v3/ddas/research/papers/TR94-16/paper.dvi)
+@start /Fa 139[22 6[22 3[22 3[22 101[{}4 37.500000 /Courier
+rf /Fb 188[22 67[{}1 33.333332 /Times-Italic rf /Fc 135[27
+3[27 27 3[27 27 27 27 2[27 2[27 27 1[27 27 27 97[{}13
+45.624989 /Courier rf /Fd 3 49 df<020002000200C218F2783AE00F800F803AE0F2
+78C2180200020002000D0E7E8E12>3 D<0000600000003000000030000000180000000C
+00FFFFFE00FFFFFF00000001C0000000F00000003C00000070000001C000000380FFFFFE
+00FFFFFC0000000C00000018000000300000003000000060001E147E9123>41
+D<060F0F0E1E1E1C3C383830707060E0C04008117F910A>48 D E
+/Fe 4 104 df<0300030003000300E31C73381FE0078007801FE07338E31C0300030003
+0003000E107E9013>3 D<000018000000000C000000000C000000000600000000070000
+0000030000FFFFFFC000FFFFFFE00000000038000000001E0000000007800000000E0000
+000038000000007000FFFFFFC000FFFFFF80000000030000000006000000000600000000
+0C000000000C0000000018000021167E9326>41 D<003C00E001C0038003800380038003
+800380038003800380038003800380038007001E00F8001E000700038003800380038003
+800380038003800380038003800380038001C000E0003C0E257E9B13>102
+D<F8001E000700038003800380038003800380038003800380038003800380038001C000
+E0003C00E001C0038003800380038003800380038003800380038003800380038007001E
+00F8000E257E9B13>I E /Ff 7 56 df<06003E00CE000E000E000E000E000E000E000E
+000E000E000E000E000E007FE00B107E8F11>49 D<3F8079C0F8E0F8707070007000E000
+E001C0038006000C3018303FE07FE0FFE00C107E8F11>I<0FC038707878783878783870
+00E00FC000702038703CF83CF83CF03870701FC00E107F8F11>I<00E001E003E002E006
+E00CE018E030E060E0C0E0FFFC00E000E000E000E007FC0E107F8F11>I<60607FC07F80
+7F00600060007F8061C040E000F060F0F0F0F0F0F0E061C03F000C107E8F11>I<07E01C
+30303870786078E030E7C0E830F018E01CE01CE01C601C301818300FC00E107F8F11>I<
+60007FFC7FF87FF0C060C0C001800300070006000E000E001E001E001E001E000C000E11
+7E9011>I E /Fg 1 69 df<FFFFF000FFFFFC000F803F000F800F800F8007C00F8003E0
+0F8003E00F8001F00F8001F00F8001F80F8001F80F8001F80F8001F80F8001F80F8001F8
+0F8001F80F8001F80F8001F00F8001F00F8003F00F8003E00F8007C00F800F800F803F00
+FFFFFC00FFFFF0001D1A7E9922>68 D E /Fh 1 111 df<71F09A189C18981818183030
+303030323062606460380F0B7E8A13>110 D E /Fi 10 112 df<60F0F0F0F0F0F06060
+6060606060606060200000000060F0F060041A7D990B>33 D<00800100020004000C0008
+0018003000300030006000600060006000E000E000E000E000E000E000E000E000E000E0
+006000600060006000300030003000180008000C00040002000100008009267D9B0F>40
+D<8000400020001000180008000C00060006000600030003000300030003800380038003
+8003800380038003800380038003000300030003000600060006000C0008001800100020
+004000800009267E9B0F>I<000C0000000C0000000C0000000C0000000C0000000C0000
+000C0000000C0000000C0000000C0000000C0000000C0000FFFFFF80FFFFFF80000C0000
+000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000
+000C0000000C0000191A7E951E>43 D<60F0F060000000000000000060F0F06004107D8F
+0B>58 D<60F0F060000000000000000060F0F0701010102020404004177D8F0B>I<FFFF
+FF80FFFFFF80000000000000000000000000000000000000000000000000FFFFFF80FFFF
+FF80190A7E8D1E>61 D<0FCF001871803030007038007038007038007038003030001860
+002FC0006000006000007000003FF0003FFC001FFE00600F00C00300C00300C00300C003
+00600600381C0007E00011187F8F13>103 D<FC001C001C001C001C001C001C001C001C
+001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF8009
+1A80990A>108 D<07E01C38300C700E6006E007E007E007E007E007E0076006700E381C
+1C3807E010107F8F13>111 D E /Fj 15 64 df<07800018001840001800302000300030
+1800E00060170360006008FCC000E008018000E008018000E008030000E008060000E008
+060000E0080C0000600818000060101800003010300000302060000018406000000780C0
+000000018078000001818400000303020000030301000006070100000C060100000C0E00
+8000180E008000300E008000300E008000600E008000C00E008000C00E00800180060100
+0300070100030003010006000302000C00018400040000780021257EA126>37
+D<0040008001000300060004000C001800180038003000300070006000600060006000E0
+00E000E000E000E000E000E000E000E000E000E000E00060006000600060007000300030
+003800180018000C000400060003000100008000400A2E7BA112>40
+D<8000400020003000180008000C00060006000700030003000380018001800180018001
+C001C001C001C001C001C001C001C001C001C001C001C001800180018001800380030003
+000700060006000C000800180030002000400080000A2E7EA112>I<0003000000030000
+000300000003000000030000000300000003000000030000000300000003000000030000
+00030000000300000003000000030000FFFFFFFCFFFFFFFC000300000003000000030000
+000300000003000000030000000300000003000000030000000300000003000000030000
+0003000000030000000300001E207E9A23>43 D<03F0000E1C001C0E0018060038070070
+0380700380700380700380F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F0
+03C0F003C0F003C0F003C0F003C07003807003807003807807803807001806001C0E000E
+1C0003F000121F7E9D17>48 D<008003800F80F380038003800380038003800380038003
+80038003800380038003800380038003800380038003800380038003800380038007C0FF
+FE0F1E7C9D17>I<03F0000C1C00100E00200700400780800780F007C0F803C0F803C0F8
+03C02007C00007C0000780000780000F00000E00001C0000380000700000600000C00001
+80000300000600400C00401800401000803FFF807FFF80FFFF80121E7E9D17>I<03F000
+0C1C00100E00200F00780F80780780780780380F80000F80000F00000F00001E00001C00
+00700007F000003C00000E00000F000007800007800007C02007C0F807C0F807C0F807C0
+F00780400780400F00200E00183C0007F000121F7E9D17>I<000600000600000E00000E
+00001E00002E00002E00004E00008E00008E00010E00020E00020E00040E00080E00080E
+00100E00200E00200E00400E00C00E00FFFFF0000E00000E00000E00000E00000E00000E
+00000E0000FFE0141E7F9D17>I<1803001FFE001FFC001FF8001FE00010000010000010
+000010000010000010000011F000161C00180E001007001007800003800003800003C000
+03C00003C07003C0F003C0F003C0E00380400380400700200600100C0008380007E00012
+1F7E9D17>I<007C000182000701000E03800C0780180780380300380000780000700000
+700000F1F000F21C00F40600F80700F80380F80380F003C0F003C0F003C0F003C0F003C0
+7003C07003C07003803803803807001807000C0E00061C0001F000121F7E9D17>I<70F8
+F8F8700000000000000000000070F8F8F87005147C930D>58 D<70F8F8F8700000000000
+000000000070F0F8F878080808101010202040051D7C930D>I<7FFFFFF8FFFFFFFC0000
+000000000000000000000000000000000000000000000000000000000000FFFFFFFC7FFF
+FFF81E0C7E9023>61 D<0FE0103C601E400EE00FF00FF00F600F001E001C003800700060
+00C00080008001000100010001000100010000000000000000000000038007C007C007C0
+038010207E9F15>63 D E /Fk 8 108 df<01800780FF80FF8007800780078007800780
+0780078007800780078007800780078007800780FFF8FFF80D157D9414>49
+D<0FC03FF870FCF83CF83EF81E701E003E003C0038007000E001C0038006060C06180E3F
+FC7FFCFFFCFFFC0F157E9414>I<0FC01FF03078787C783C783C107C007800E00FE00078
+003C003C003E703EF83EF83EF83C70783FF00FC00F157E9414>I<000C00001C00003C00
+007C0000FC0001BC00033C00063C000C3C00183C00303C00603C00C03C00FFFF80FFFF80
+003C00003C00003C00003C0003FF8003FF8011157F9414>I<700C7FF87FF07FE07F8060
+006000600067E07870603C003C003E003E703EF03EF03EE03C70783FF00FC00F157E9414
+>I<03F00FF81E1C383C383C70187000F000F3E0F438F81CF01CF01EF01EF01E701E701E
+781C3C381FF007E00F157E9414>I<387C7C7C3800000000FCFC3C3C3C3C3C3C3C3C3C3C
+3CFFFF08187F970B>105 D<FC0000FC00003C00003C00003C00003C00003C00003C0000
+3C1F803C1F803C1C003C38003C60003DC0003FE0003FE0003E70003C78003C3C003C1E00
+3C0E00FF1FC0FF1FC012177F9615>107 D E /Fl 3 80 df<FFFFFE0000FFFFFFC00007
+E007F00007E001F80007E000FC0007E0007E0007E0003F0007E0003F0007E0001F8007E0
+001F8007E0001F8007E0001FC007E0001FC007E0001FC007E0001FC007E0001FC007E000
+1FC007E0001FC007E0001FC007E0001FC007E0001F8007E0001F8007E0001F8007E0003F
+0007E0003F0007E0007E0007E000FC0007E001F80007E007F000FFFFFFC000FFFFFE0000
+221F7E9E28>68 D<FFFFFFFF07E007E007E007E007E007E007E007E007E007E007E007E0
+07E007E007E007E007E007E007E007E007E007E007E007E007E007E007E0FFFFFFFF101F
+7E9E14>73 D<001FF80000FFFF0001F81F8007E007E00FC003F01F8001F81F0000F83F00
+00FC7F0000FE7E00007E7E00007EFE00007FFE00007FFE00007FFE00007FFE00007FFE00
+007FFE00007FFE00007FFE00007F7E00007E7F0000FE7F0000FE3F0000FC3F8001FC1F80
+01F80FC003F007E007E001F81F8000FFFF00001FF800201F7D9E27>79
+D E /Fm 1 4 df<FFFFFFFCFFFFFFFCC000000CC000000CC000000CC000000CC000000C
+C000000CC000000CC000000CC000000CC000000CC000000CC000000CC000000CC000000C
+C000000CC000000CC000000CC000000CC000000CC000000CC000000CC000000CC000000C
+C000000CC000000CC000000CC000000CFFFFFFFC7FFFFFFC1E1F7E9E23>3
+D E /Fn 167[26 7[20 2[32 22 6[22 3[26 65[{}6 36.499977
+/Times-Roman rf /Fo 139[9 13 11 1[17 17 17 1[9 2[9 1[17
+1[15 17 15 1[15 12[20 18 22 2[24 24 30 20 1[13 11 2[18
+20 1[22 1[24 20[8 2[11 11 40[{}29 33.333332 /Times-Roman
+rf /Fp 8 121 df<60F0F06004047D830B>58 D<60F0F07010101020204040040B7D830B
+>I<000010000000300000007000000070000000F8000000B80000013800000238000002
+380000043800000C38000008380000103C0000101C0000201C0000401C00007FFC000080
+1C0000801C0001001C0002001C0002000E0004000E000C000E001C000E00FF00FFC01A1A
+7F991D>65 D<03FFFFC0007001C0007000C00070004000E0004000E0004000E0004000E0
+004001C0200001C0200001C0200001C0600003FFC0000380C00003804000038040000700
+80000700010007000100070002000E0002000E0006000E0004000E000C001C003800FFFF
+F8001A1A7E991C>69 D<03FFFFC0007001C0007000C00070004000E0004000E0004000E0
+004000E0004001C0200001C0200001C0200001C0600003FFC0000380C000038040000380
+4000070080000700000007000000070000000E0000000E0000000E0000000E0000001E00
+0000FFE000001A1A7E9919>I<000FE0000038380000E00E0001C00700070007000F0003
+800E0003801C0003803C0003C0380003C0780003C0780003C0F0000780F0000780F00007
+80F0000F00F0000F00F0000E00F0001E00F0003C0070003800700070003800E0001C03C0
+000E0F000003F800001A1A7E991D>79 D<001F080060D800803801003803001006001006
+001006001006000007000007C00003FC0001FF00007F80000FC00001C00001C00000C020
+00C02000C0600180600180600300700600CC1C0083F000151A7E9917>83
+D<07878008C8C010F1C020E0C020E00020E00001C00001C00001C00001C0000381000381
+00C38100E58200C5840078780012107F8F16>120 D E /Fq 134[19
+19 2[21 12 15 17 1[21 19 21 31 10 2[10 21 19 1[17 21
+17 1[19 10[27 3[27 29 23 29 5[15 3[25 27 2[27 1[19 63[{}28
+37.500000 /Times-Bold rf /Fr 134[17 3[19 10 15 15 19
+19 1[19 27 3[10 19 19 10 17 3[19 97[{}15 37.500000 /Times-Italic
+rf /Fs 10 58 df<1F00318060C04040C060C060C060C060C060C060C060C060404060C0
+31801F000B107F8F0F>48 D<187898181818181818181818181818FF08107D8F0F>I<1F
+00618040C08060C0600060006000C00180030006000C00102020207FC0FFC00B107F8F0F
+>I<1F00218060C060C000C0008001001F00008000400060C060C060804060801F000B10
+7F8F0F>I<01800180038005800D801980118021804180C180FFE001800180018001800F
+E00B107F8F0F>I<20C03F802E002000200020002F0030802040006000600060C06080C0
+61801F000B107F8F0F>I<0780184030C060C06000C000CF00F080E040C060C060C06040
+6060C030801F000B107F8F0F>I<40007FF07FE080408040008001000200020006000400
+04000C000C000C000C000C000C117F900F>I<1F00318060C060C060C031803F000E0033
+8061C0C060C060C060C04060C01F000B107F8F0F>I<1F00318060C0C040C060C060C060
+40E021E01E600060004060C0608063001E000B107F8F0F>I E /Ft
+11 62 df<07C018303018701C600C600CE00EE00EE00EE00EE00EE00EE00EE00EE00E60
+0C600C701C30181C7007C00F157F9412>48 D<06000E00FE000E000E000E000E000E000E
+000E000E000E000E000E000E000E000E000E000E000E00FFE00B157D9412>I<0F8030E0
+40708030C038E0384038003800700070006000C00180030006000C08080810183FF07FF0
+FFF00D157E9412>I<0FE030306018701C701C001C00180038006007E000300018000C00
+0E000EE00EE00EC00C401830300FE00F157F9412>I<00300030007000F001F001700270
+047008701870107020704070C070FFFE0070007000700070007003FE0F157F9412>I<60
+307FE07FC0440040004000400040004F8070E040700030003800384038E038E038803040
+6020C01F000D157E9412>I<01F00608080C181C301C70006000E000E3E0EC30F018F00C
+E00EE00EE00E600E600E300C3018183007C00F157F9412>I<40007FFE7FFC7FF8C00880
+1080200040008000800100030003000200060006000E000E000E000E000E0004000F167E
+9512>I<07E018302018600C600C700C78183E101F6007C00FF018F8607C601EC00EC006
+C006C004600C38300FE00F157F9412>I<07C0183030186018E00CE00CE00EE00EE00E60
+1E301E186E0F8E000E000C001C70187018603020E01F800F157F9412>I<FFFFFCFFFFFC
+000000000000000000000000000000000000FFFFFCFFFFFC160A7E8C1B>61
+D E /Fu 6 106 df<FFFFFFC0FFFFFFC01A027C8B23>0 D<70F8F8F87005057C8D0D>I<
+03F0000FFC001FFE003FFF007FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0
+7FFF807FFF803FFF001FFE000FFC0003F00012127E9317>15 D<000000C000000000C000
+00000060000000006000000000300000000018000000000C007FFFFFFE00FFFFFFFF0000
+000001C000000000E0000000003C000000000F000000003C000000007000000001C00000
+000380FFFFFFFE007FFFFFFC000000001800000000180000000030000000006000000000
+6000000000C000000000C000281A7E972D>41 D<0020006000C000C000C0018001800300
+03000300060006000C000C0018001800180030003000600060006000C000C00060006000
+6000300030001800180018000C000C00060006000300030003000180018000C000C000C0
+006000200B2E7CA112>104 D<C000C000600060006000300030001800180018000C000C
+00060006000300030003000180018000C000C000C00060006000C000C000C00180018003
+0003000300060006000C000C0018001800180030003000600060006000C000C0000B2E7E
+A112>I E /Fv 9 111 df<60F0F06004047D830A>58 D<00080018003000300030006000
+60006000C000C000C0018001800180030003000600060006000C000C000C001800180018
+00300030003000600060006000C000C0000D217E9812>61 D<07FFF00000E01C0000E006
+0000E0070000E0070001C0070001C0070001C0070001C00E0003801C000380700003FF80
+000380E000070070000700380007003800070038000E0070000E0070000E0070800E0070
+801C003100FF801E0019177F961B>82 D<071018F0307060706060C060C060C06080C080
+C480C4C1C446C838700E0E7E8D13>97 D<7C001800180018001800300030003000300067
+8068C070406060C060C060C060C06080C080C08180C10046003C000B177E960F>I<07C0
+0C20107020706000C000C000C00080008000C010C02060C03F000C0E7E8D0F>I<030003
+8003000000000000000000000000001C002400460046008C000C00180018001800310031
+00320032001C0009177F960C>105 D<00180038001000000000000000000000000001C0
+022004300430086000600060006000C000C000C000C001800180018001806300E300C600
+78000D1D80960E>I<383C0044C6004702004602008E06000C06000C06000C0600180C00
+180C40181840181880300980300E00120E7F8D15>110 D E /Fw
+19 121 df<70F8F8F87005057C840D>58 D<70F0F8F878080808101010202040050E7C84
+0D>I<0000400000C0000180000180000180000300000300000300000600000600000C00
+000C00000C0000180000180000180000300000300000600000600000600000C00000C000
+00C0000180000180000180000300000300000600000600000600000C00000C00000C0000
+180000180000300000300000300000600000600000600000C00000C00000122D7EA117>
+61 D<E0000000780000001E0000000780000001E0000000780000001C00000007000000
+03C0000000F00000003C0000000F00000003C0000003C000000F0000003C000000F00000
+03C00000070000001C00000078000001E00000078000001E00000078000000E00000001A
+1A7C9723>I<000002000000060000000E0000000E0000001E0000001F0000002F000000
+6F0000004F0000008F0000008F0000010F0000030F0000020F0000040F8000040F800008
+078000180780001007800020078000200780007FFF800080078000800780010007C00100
+03C0020003C0040003C0040003C00C0003C03C0007C0FF003FFC1E207E9F22>65
+D<01FFFFFF80001E000F00001E000300001E000300001E000100003C000100003C000100
+003C000100003C000100007802020000780200000078020000007806000000F00C000000
+FFFC000000F00C000000F00C000001E008000001E008000001E008000001E000040003C0
+00080003C000080003C000100003C0001000078000200007800060000780004000078001
+C0000F0007C000FFFFFF8000211F7E9E22>69 D<01FFFFFF001E001E001E0006001E0006
+001E0002003C0002003C0002003C0002003C000200780004007802000078020000780200
+00F0040000F00C0000FFFC0000F00C0001E0080001E0080001E0080001E0080003C00000
+03C0000003C0000003C00000078000000780000007800000078000000F800000FFFC0000
+201F7E9E1D>I<01FFF0001F00001E00001E00001E00003C00003C00003C00003C000078
+0000780000780000780000F00000F00000F00000F00001E00001E00001E00001E00003C0
+0003C00003C00003C0000780000780000780000780000F8000FFF000141F7E9E14>73
+D<01FE00000FF8001E00001F80001700001F00001700002F00001700004F00002700005E
+00002700009E00002700011E00002700011E00004380023C00004380023C00004380043C
+00004380083C000083800878000083801078000083802078000081C02078000101C040F0
+000101C080F0000101C080F0000101C100F0000201C101E0000201C201E0000201C401E0
+000200E401E0000400E803C0000400F003C0000400F003C0000C00E003C0001E00C007C0
+00FFC0C07FFC002D1F7E9E2C>77 D<01FF001FF8001F0003C0001F800100001780010000
+178001000023C002000023C002000021E002000021E002000041F004000040F004000040
+F004000040780400008078080000807C080000803C080000803C080001001E100001001E
+100001000F100001000F100002000FA000020007A000020007A000020003E000040003C0
+00040003C000040001C0000C0001C0001E00008000FFC0008000251F7E9E25>I<0000FF
+00000781C0001C00E0003800700070003801C0001C03C0001C0380001E0700000E0F0000
+0E1E00000E1E00000E3C00000E3C00000E7800001E7800001E7800001E7800001EF00000
+3CF000003CF0000038F0000078F0000070700000F0700001E0780001C078000380380007
+001C000E001C001C000F0070000381C00000FF00001F217F9F23>I<01FFFF80001E00F0
+001E0038001E001C001E001C003C001E003C001E003C001E003C001E0078003C0078003C
+00780078007800F000F001C000F0070000FFF80000F00E0001E0070001E0078001E00380
+01E003C003C0078003C0078003C0078003C0078007800F0007800F0207800F0207800F04
+0F800704FFF80308000001F01F207E9E23>82 D<0003F040000C08C00030058000600380
+00C0038001C00180018001000380010003800100038001000380000003C0000003E00000
+03FC000001FFC00000FFF000007FF800001FF8000001FC0000007C0000003C0000001C00
+00001C0020001C0020001C00200018006000380060003000600070007000E000E8018000
+C603000081FC00001A217E9F1C>I<00F1800389C00707800E03801C03803C0380380700
+780700780700780700F00E00F00E00F00E00F00E10F01C20F01C20703C20705C40308C40
+0F078014147E9318>97 D<07803F8007000700070007000E000E000E000E001C001C001C
+F01D0C3A0E3C0E380F380F700F700F700F700FE01EE01EE01EE01CE03CE038607060E031
+C01F0010207E9F14>I<007C0001C3000700800E07801E07801C07003C02007800007800
+00780000F00000F00000F00000F00000F000007001007002003004001838000FC0001114
+7E9314>I<00E001E001E000C000000000000000000000000000000E0013002380438043
+8043808700070007000E000E001C001C001C20384038403840388019000E000B1F7E9E10
+>105 D<0000C00001E00001E00001C00000000000000000000000000000000000000000
+00001E00002300004380008380010380010380020700000700000700000700000E00000E
+00000E00000E00001C00001C00001C00001C000038000038000038000038000070000070
+0030700078E000F1C0006380003E00001328819E13>I<03C1C00C62201034701038F020
+38F020386040700000700000700000700000E00000E00000E00000E02061C040F1C040F1
+C080E2C080446300383C0014147E931A>120 D E /Fx 138[25 15
+18 20 1[25 23 25 38 13 2[13 25 23 1[20 25 20 25 23 12[30
+25 2[28 35 5[18 2[28 1[33 2[33 13[23 23 23 2[11 15 45[{}30
+45.624989 /Times-Bold rf /Fy 133[22 25 25 1[25 28 17
+19 22 28 28 25 28 41 14 2[14 28 25 17 22 28 22 1[25 10[36
+1[33 1[36 1[30 39 36 4[19 4[36 36 33 12[25 25 25 25 25
+2[12 46[{}38 50.000000 /Times-Bold rf /Fz 47[37 21[17
+10[21 21 3[17 47[17 19 19 27 19 19 10 15 12 19 19 19
+19 29 10 19 10 10 19 19 12 17 19 17 19 17 7[27 1[35 27
+27 23 21 25 27 21 27 27 33 23 1[15 12 1[27 21 23 27 25
+1[27 5[10 1[19 19 19 19 19 19 19 19 19 19 10 9 12 9 2[12
+12 40[{}69 37.500000 /Times-Roman rf /FA 2 49 df<0C000C00CCC0EDC07F800C
+007F80EDC0CCC00C000C000A0B7D8B10>3 D<081C1C3838383070706060C0C0060D7E8D
+09>48 D E /FB 133[18 20 20 1[20 23 13 18 18 1[23 23 23
+33 13 20 13 13 23 23 13 20 23 20 23 23 9[38 3[23 28 33
+28 33 1[38 3[15 1[33 1[28 33 30 28 28 7[23 23 23 23 2[23
+23 23 3[15 11 44[{}47 45.624989 /Times-Italic rf /FC
+81[33 53[30 43 1[33 20 23 27 1[33 30 33 50 17 33 1[17
+33 30 20 27 33 27 1[30 10[43 1[40 1[43 1[37 6[23 3[40
+1[43 1[43 6[20 3[30 30 30 30 30 30 3[20 45[{}37 59.999973
+/Times-Bold rf /FD 81[23 51[18 21 21 30 21 21 12 16 14
+21 21 21 21 32 12 21 12 12 21 21 14 18 21 18 21 18 9[39
+30 30 25 2[30 23 30 30 3[16 14 2[23 6[18 3[12 12 2[21
+21 21 21 5[10 14 10 2[14 14 40[{}50 41.666668 /Times-Roman
+rf /FE 139[14 16 18 14[18 23 21 31[30 65[{}7 41.666668
+/Times-Bold rf /FF 78[25 55[25 25 1[25 25 14 19 17 1[25
+25 25 39 3[14 25 1[17 22 25 22 25 22 11[36 30 28 14[36
+33 33 36 46 7[25 25 4[25 25 2[12 1[12 44[{}34 50.000000
+/Times-Roman rf /FG 47[45 13[15 7[20 8[23 1[25 25 3[20
+47[20 23 23 33 23 23 13 18 15 23 23 23 23 35 13 23 13
+13 23 23 15 20 23 20 23 20 3[15 1[15 1[33 33 43 33 33
+28 25 30 33 25 33 33 40 28 33 18 15 33 33 25 28 33 30
+30 33 1[20 3[13 13 23 23 23 23 23 23 23 23 23 23 13 11
+15 11 26 1[15 15 15 1[38 37[{}82 45.624989 /Times-Roman
+rf /FH 3 104 df<00C00000C00000C00000C00000C000E0C1C0F0C3C038C7000EDC0003
+F00000C00003F0000EDC0038C700F0C3C0E0C1C000C00000C00000C00000C00000C00012
+157D9619>3 D<0003C0001E0000380000700000E00000E00000E00000E00000E00000E0
+0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00001C0
+000380000F0000F800000F000003800001C00000E00000E00000E00000E00000E00000E0
+0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000070
+00003800001E000003C012317DA419>102 D<F800000F000003800001C00000E00000E0
+0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0
+0000E00000E00000E000007000003800001E000003C0001E0000380000700000E00000E0
+0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0
+0000E00000E00000E00001C0000380000F0000F8000012317DA419>I
+E /FI 81[40 51[32 36 1[52 1[40 24 28 32 1[40 36 40 60
+20 40 1[20 2[24 32 1[32 1[36 13[40 52 56 44 56 8[44 4[52
+6[24 58[{}27 72.000000 /Times-Bold rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300dpi
+TeXDict begin
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 342 206 a FI(Prairie:)25 b(A)17 b(Rule)h(Speci\256cation)e
+(Framew)o(ork)643 306 y(f)n(or)i(Query)f(Optimizers)1308
+280 y FH(\003)722 407 y FG(T)m(echnical)11 b(Report)g(TR)g(94\26116)580
+539 y FF(Dinesh)i(Das)325 b(Don)12 b(Batory)631 603 y(Department)g(of)g
+(Computer)f(Sciences)638 667 y(The)i(Uni)o(v)o(ersity)f(of)g(T)m(e)o
+(xas)h(at)g(Austin)708 731 y(Austin,)g(T)m(e)o(xas)g(78712\2611188)679
+795 y FH(f)p FF(ddas,batory)p FH(g)p FF(@cs.ute)o(xas.edu)898
+996 y FE(Abstract)241 1066 y FD(From)i(our)g(e)o(xperience,)j(current)d
+(rule-based)h(query)e(optimizers)h(do)g(not)g(pro)o(vide)f(a)i(v)o(ery)
+f(intuiti)o(v)o(e)179 1121 y(and)e(well-de\256ned)f(frame)o(work)h(to)g
+(de\256ne)g(rules)g(and)g(actions.)23 b(T)m(o)13 b(remedy)h(this)e
+(situation,)g(we)i(propose)179 1176 y(an)i(e)o(xtensible)g(and)g
+(structured)f(algebraic)i(frame)o(work)e(called)i(Prairie)e(for)h
+(specifying)f(rules.)33 b(Prairie)179 1231 y(facilitates)10
+b(rule-writing)f(by)i(enabling)f(a)i(user)g(to)e(write)h(rules)g(and)h
+(actions)f(more)g(quickly)m(,)g(correctly)g(and)179 1285
+y(in)e(an)i(easy-to-understand)e(and)i(easy-to-deb)o(ug)e(manner)n(.)
+241 1340 y(Query)14 b(optimizers)g(consist)g(of)g(three)h(major)f
+(parts:)23 b(a)15 b(search)h(space,)h(a)e(cost)f(model)h(and)f(a)h
+(search)179 1395 y(strate)o(gy)m(.)25 b(The)14 b(approach)g(we)g(take)f
+(is)h(only)e(to)h(de)o(v)o(elop)h(the)f(algebra)h(which)f(de\256nes)h
+(the)f(search)i(space)179 1450 y(and)d(the)g(cost)g(model;)g(we)g(do)g
+(not)f(propose)h(a)g(search)h(engine)f(\(i.e.,)h(search)h(strate)o
+(gy\))d(to)h(dri)o(v)o(e)f(the)h(rules.)179 1505 y(W)m(e)j(ha)o(v)o(e)h
+(chosen)f(the)f(V)-5 b(olcano)14 b(optimizer)g(generator)h(as)g(our)g
+(search)g(engine,)h(because)h(it)d(is)g(publicly)179
+1559 y(a)o(v)o(ailable,)c(and)f(also)h(because)h(it)e(has)g(an)h(ef)o
+(\256cient)g(branch-and-bound)e(search)i(strate)o(gy)m(.)16
+b(Using)8 b(Prairie)i(as)179 1614 y(a)g(front-end,)e(we)i(translate)f
+(Prairie)h(rules)f(to)g(V)-5 b(olcano)8 b(to)h(v)o(alidate)g(our)g
+(claim)h(that)e(Prairie)i(makes)g(it)e(easier)179 1669
+y(to)h(write)h(rules.)241 1724 y(W)m(e)g(describe)h(our)e(algebra)h
+(and)g(present)g(e)o(xperimental)g(results)g(which)f(sho)o(w)h(that)f
+(using)g(a)i(high-le)o(v)o(el)179 1779 y(frame)o(work)f(like)f(Prairie)
+h(to)g(design)g(lar)o(ge-scale)h(optimizers)f(does)g(not)f(sacri\256ce)
+j(ef)o(\256cienc)o(y)m(.)75 1931 y FC(1)60 b(Intr)o(oduction)75
+2041 y FG(Query)19 b(optimization)e([9,)8 b(12,)f(20])19
+b(is)f(a)i(fundamental)e(part)h(of)g(database)f(systems.)40
+b(It)18 b(is)h(the)g(process)f(of)75 2103 y(generating)11
+b(an)i(ef)o(\256cient)f(access)g(plan)g(for)g(a)h(database)f(query)m(.)
+19 b(Informally)m(,)12 b(an)h(access)f(plan)g(is)f(an)i(e)o(x)o
+(ecution)75 2165 y(strate)o(gy)8 b(for)i(a)f(query;)g(it)f(is)h(the)g
+(sequence)f(of)h(lo)o(w-le)o(v)o(el)f(database)h(retrie)o(v)o(al)f
+(operations)g(that,)h(when)f(e)o(x)o(ecuted,)75 2227
+y(produce)14 b(the)g(database)g(records)h(that)f(satisfy)f(the)h(query)
+m(.)26 b(There)15 b(are)g(three)g(basic)f(aspects)g(that)g(de\256ne)g
+(and)75 2289 y(in\257uence)d(query)g(optimization:)j(the)d(search)g
+(space,)h(the)f(cost)f(model,)i(and)f(the)g(search)g(strate)o(gy)m(.)
+137 2351 y(The)k FB(sear)n(c)o(h)f(space)g FG(is)g(the)h(set)f(of)g
+(logically)f(equi)o(v)o(alent)g(access)i(plans)f(that)f(can)i(be)g
+(used)f(to)g(e)o(v)o(aluate)g(a)75 2413 y(query)m(.)27
+b(All)14 b(plans)g(in)g(a)h(query')m(s)g(search)g(space)f(return)h(the)
+f(same)h(result;)h(ho)o(we)o(v)o(er)n(,)g(some)e(plans)g(are)i(more)75
+2475 y(ef)o(\256cient)c(than)g(others.)20 b(The)12 b
+FB(cost)g(model)f FG(assigns)g(a)i(cost)f(to)g(each)h(plan)e(in)h(the)g
+(search)h(space.)20 b(The)13 b(cost)e(of)i(a)75 2537
+y(plan)d(is)g(an)g(estimate)g(of)h(the)f(resources)g(used)g(when)g(the)
+g(plan)g(is)f(e)o(x)o(ecuted;)i(the)f(lo)o(wer)g(the)g(cost,)g(the)g
+(better)g(the)p 75 2576 720 2 v 124 2603 a FA(\003)142
+2619 y Fz(This)e(research)f(was)g(supported)g(in)h(part)h(by)f(grants)f
+(from)i(The)f(Uni)o(v)o(ersity)h(of)f(T)m(e)o(xas)g(Applied)f(Research)
+g(Laboratories,)g(Schlum-)75 2669 y(ber)o(ger)o(,)i(and)f(Digital)i
+(Equipment)f(Corporation.)964 2793 y FG(1)p eop
+%%Page: 2 2
+2 1 bop 75 14 a FG(plan.)20 b(The)12 b FB(sear)n(c)o(h)h(str)o(ate)n
+(gy)e FG(is)h(a)h(speci\256cation)e(of)i(which)f(plans)f(in)h(the)h
+(search)f(space)h(are)g(to)f(be)h(e)o(xamined.)75 77
+y(If)i(the)g(search)f(space)h(is)f(small,)i(a)f(viable)f(strate)o(gy)g
+(is)g(to)h(enumerate)g(and)f(e)o(v)o(aluate)g(e)o(v)o(ery)h(plan.)27
+b(Ho)o(we)o(v)o(er)n(,)75 139 y(most)14 b(search)g(spaces,)h(e)o(v)o
+(en)f(for)h(simple)e(queries,)i(are)g(enormous,)f(and)g(thus)f(query)h
+(optimizers)f(often)h(need)75 201 y(heuristics)c(to)g(control)g(the)h
+(number)h(of)f(plans)f(to)h(be)g(e)o(xamined.)137 263
+y(T)n(raditionally)m(,)19 b(query)f(optimizers)f(ha)o(v)o(e)i(been)g(b)
+o(uilt)e(as)h(monolithic)f(subsystems)f(of)j(a)f(DBMS.)i(This)75
+325 y(simply)11 b(re\257ects)h(the)g(fact)f(that)g(traditional)f
+(database)i(systems)f(are)h(themselv)o(es)g(monolithic:)j(the)d
+(algorithms)75 387 y(used)k(for)g(storing)f(and)h(retrie)o(ving)g(data)
+g(are)h(hard-wired)f(and)g(are)h(rather)g(dif)o(\256cult)e(to)h
+(change.)32 b(The)16 b(need)75 449 y(to)e(ha)o(v)o(e)i(e)o(xtensible)d
+(database)i(systems,)g(and)g(in)f(turn)g(e)o(xtensible)g(optimizers,)h
+(has)g(long)f(been)h(recognized)75 511 y(in)i(systems)f(like)f(Genesis)
+i([1],)h(EXODUS)f([3],)i(Starb)o(urst)d([15])h(and)g(Postgres)f([18].)
+34 b(Rule-based)16 b(query)75 573 y(optimizers)e(are)h(among)f(the)g
+(major)h(conceptual)e(adv)o(ances)h(that)g(ha)o(v)o(e)h(been)f
+(proposed)g(to)g(deal)g(with)g(query)75 635 y(optimizer)f(e)o
+(xtensibility)e([6\2618,)c(10,)g(11,)h(13].)23 b(The)14
+b(e)o(xtensibility)d(translates)h(into)h(the)g(ability)f(to)h
+(incorporate)75 698 y(ne)o(w)18 b(operators,)i(algorithms,)f(cost)e
+(models,)j(or)e(search)h(strate)o(gies)e(without)f(changing)h(the)h
+(optimization)75 760 y(algorithm.)137 822 y(In)12 b(this)f(paper)n(,)i
+(we)f(describe)g(an)g(algebraic)g(frame)o(work)g(called)f
+FB(Pr)o(airie)g FG(for)h(specifying)f(rules)h(in)f(a)h(query)75
+884 y(optimizer)m(.)k(Prairie)10 b(is)f(similar)g(to)g(other)h(rule)f
+(speci\256cation)g(languages)f(like)h(Starb)o(urst)g([13])g(and)h(V)-6
+b(olcano)9 b([8],)75 946 y(and)14 b(indeed,)h(we)g(ha)o(v)o(e)g(based)f
+(our)g(work)g(on)g(V)-6 b(olcano)14 b(to)g(capture)g(most)g(of)h(the)f
+(adv)o(antages)f(of)i(rule-based)75 1008 y(optimizers.)22
+b(Ho)o(we)o(v)o(er)n(,)14 b(Prairie)f(attempts)g(to)g(pro)o(vide)f
+(some)i(ke)o(y)e(features)i(that,)f(we)h(ha)o(v)o(e)f(found,)g
+(simplify)75 1070 y(the)e(ef)o(fort)g(in)g(writing)e(rules:)124
+1165 y(1.)21 b(A)10 b(frame)o(work)h(in)f(which)g(users)g(can)g
+(de\256ne)h(a)g(query)f(optimizer)g(concisely)g(in)g(terms)g(of)h(a)g
+(well-de\256ned)179 1228 y(set)e(of)g(operators)f(and)h(algorithms.)15
+b FB(All)8 b FG(operators)h(and)g(algorithms)e(are)j(considered)e
+(\256rst-class)h(objects,)179 1290 y(i.e.,)k FB(any)e
+FG(of)h(them)g(can)g(occur)g(in)f(an)o(y)h(rule,)g(and)f
+FB(only)g FG(these)h(operators)f(and)g(algorithms)g(can)h(appear)g(in)
+179 1352 y(rules.)22 b(This)12 b(scheme)i(eliminates)e(the)h(need)g
+(for)h(special)e(classes)h(of)g(operators)g(and)g(algorithms,)g(such)
+179 1414 y(as)e(enforcers)g(in)g(V)-6 b(olcano)11 b(and)g(glue)f(in)h
+(Starb)o(urst,)g(that)g(signi\256cantly)e(complicate)i(rule)g
+(speci\256cation.)124 1509 y(2.)21 b(A)16 b(frame)o(work)h(in)f(which)g
+(users)g(can)h(de\256ne)g(a)g(list)e(of)h(properties)g(to)g
+(characterize)h(the)g(e)o(xpressions)179 1571 y(generated)e(in)f(the)h
+(optimization)e(process.)27 b(Again,)16 b(the)e(goal)h(here)g(is)f(to)h
+(allo)o(w)f(the)h(user)g(to)f(treat)h FB(all)179 1633
+y FG(properties)10 b(as)i(ha)o(ving)e(equal)h(status.)16
+b(This)10 b(is)h(dif)o(ferent)g(from)h(V)-6 b(olcano)11
+b(where)h(the)f(user)g(must)g(classify)179 1695 y(properties)f(as)h
+(logical,)g(physical,)f(or)h(operator/algorithm)e(ar)o(guments.)124
+1791 y(3.)21 b(A)10 b(frame)o(work)f(in)h(which)f(users)g(can)h
+(specify)f(mapping)h(functions)e(between)h(properties)g(concomitantly)
+179 1853 y(with)16 b(the)h(corresponding)e(rules.)33
+b(This)16 b(contrasts)g(with)g(e)o(xisting)g(approaches)g(in)h(which)f
+(mappings)179 1915 y(between)g(properties)f(are)i(fragmented)g(into)e
+(multiple)g(functions)g(and)h(at)h(logically)d(dif)o(ferent)i(places)
+179 1977 y(than)11 b(the)g(corresponding)f(rules.)17
+b(Research)12 b(into)e(rule-based)h(optimizers)g(has)g(re)o(v)o(ealed)h
+(that)f(property-)179 2039 y(mapping)f(functions)g(are)i(a)f(major)h
+(source)f(of)g(user)g(ef)o(fort,)g(so)g(this)f(is)h(an)g(important)f
+(goal.)124 2135 y(4.)21 b(The)9 b(format)g(\(Prairie\))h(in)e(which)h
+(users)f(can)i(cleanly)e(specify)h(rules)f(is)h(not)f(necessarily)g
+(the)h(same)h(format)179 2197 y(needed)i(for)h(generating)f(ef)o
+(\256cient)h(optimizers.)21 b(Thus,)12 b(there)h(is)g(a)g(need)g(for)g
+(a)g(pre-processor)f(\(written)179 2259 y(by)f(us\))g(that)f
+(translates)g(between)h(these)g(competing)f(representations.)137
+2354 y(Prairie)k(stri)o(v)o(es)e(for)i(uniformity)d(in)i(dealing)f
+(with)h(issues)f(that)g(ha)o(v)o(e)i(been)f(a)h(source)f(of)g(most)g
+(user)g(ef)o(fort)75 2416 y(and)f(potential)f(user)h(errors.)21
+b(In)13 b(the)f(follo)o(wing)e(sections,)i(we)g(present)g(the)h
+(Prairie)f(frame)o(work.)21 b(W)l(e)13 b(e)o(xplain)75
+2478 y(ho)o(w)c(our)h(P2V)g(pre-processor)f(maps)h(Prairie)g(rule)g
+(speci\256cations)f(into)f(V)-6 b(olcano)9 b(rule)h(speci\256cations)f
+(that)g(can)75 2540 y(be)h(processed)g(ef)o(\256ciently)m(.)15
+b(Experimental)9 b(results)g(to)h(support)f(this)f(claim)j(are)f(gi)o
+(v)o(en)g(in)g(Section)f(4,)i(where)f(we)75 2602 y(compare)h
+(implementations)d(of)i(the)g(T)m(e)o(xas)g(Instruments)e(Open)i(OODB)g
+(query)g(optimizer)f(using)g(both)g(Prairie)75 2665 y(and)i(V)-6
+b(olcano.)16 b(W)l(e)c(conclude)e(with)g(a)i(summary)f(and)g(related)g
+(research.)964 2793 y(2)p eop
+%%Page: 3 3
+3 2 bop 75 14 a FC(2)60 b(Prairie:)18 b(A)e(language)e(f)o(or)f(rule)h
+(speci\256cation)75 124 y FG(The)d(basic)g(concepts)g(and)g
+(de\256nitions)f(that)h(underly)f(the)h(Prairie)h(model)g(are)g
+(presented)f(in)g(this)f(section.)16 b(The)75 186 y(goal)c(is)f(to)h
+(lay)f(a)i(foundation)d(for)i(reasoning)f(about)h(query)f(optimizers)g
+(algebraically;)h(this)f(is)g(necessary)h(for)75 248
+y(our)f(subsequent)e(discussion)g(about)h(translating)g(Prairie)h
+(speci\256cations)f(to)h(those)f(of)h(V)-6 b(olcano.)75
+378 y Fy(2.1)50 b(Notation)11 b(and)h(assumptions)75
+471 y Fx(Stor)o(ed)j(Files)f(and)g(Str)o(eams.)47 b FG(A)14
+b(\256le)g(is)g FB(stor)n(ed)h FG(if)f(its)f(tuples)g(reside)h(on)g
+(disk.)25 b(In)14 b(the)g(case)h(of)f(relational)75 533
+y(databases,)i(stored)e(\256les)h(are)h(sometimes)f(called)g
+FB(base)g(r)n(elations)p FG(;)f(we)i(will)e(denote)g(them)i(by)e
+Fw(R)i FG(or)f Fw(R)1784 540 y Fv(i)1797 533 y FG(.)29
+b(In)75 595 y(object-oriented)15 b(schemas,)j(stored)e(\256les)h(are)g
+FB(classes)p FG(;)h(we)f(will)e(denote)h(them)h(by)f
+FB(C)h FG(or)g FB(C)1601 602 y Fv(i)1615 595 y FG(.)33
+b(Henceforth,)75 657 y(whene)o(v)o(er)9 b(we)h(refer)g(to)f(a)g(stored)
+g(\256le,)h(we)g(mean)f(a)h(relation)e(or)i(a)f(class;)g(when)g(the)g
+(distinction)e(is)h(unimportant,)75 719 y(we)15 b(will)e(use)h
+Fw(F)22 b FG(or)14 b Fw(F)435 726 y Fv(i)450 719 y FG(.)26
+b(A)15 b FB(str)n(eam)f FG(is)g(a)g(sequence)h(of)f(tuples)g(and)g(is)g
+(the)g(result)g(of)g(a)h(computation)e(on)h(one)75 781
+y(or)f(more)h(streams)f(or)h(stored)e(\256les;)i(tuples)e(of)h(streams)
+h(are)f(returned)g(one)g(at)h(a)f(time,)h(typically)e(on)h(demand.)75
+844 y(Streams)f(can)f(be)h FB(named)p FG(,)e(denoted)h(by)g
+Fw(S)746 851 y Fv(i)760 844 y FG(,)g(or)g FB(unnamed)p
+FG(.)75 972 y Fx(Database)16 b(Operations.)46 b FG(An)17
+b FB(oper)o(ation)e FG(is)h(a)h(computation)e(on)i(one)f(or)h(more)g
+(streams)g(or)g(stored)f(\256les.)75 1034 y(There)i(are)g(two)e(types)h
+(of)g(database)g(operations)f(in)h(Prairie:)29 b(abstract)17
+b(\(or)g(implementation-unspeci\256ed\))75 1096 y(operators)10
+b(and)h(concrete)h(algorithms.)j(Each)c(is)g(detailed)f(belo)o(w)m(.)
+179 1200 y Fx(Operators.)21 b FG(Abstract)7 b(\(or)g(conceptual\))g
+FB(oper)o(ators)g FG(sp)o(ecify)g(computati)o(ons)f(on)h(st)o(reams)g
+(or)g(stored)g(\256les;)270 1262 y(the)o(y)h(are)g(denoted)f(by)g(all)g
+(capital)g(letters)g(\(e.g.,)j(JOIN\).)e(Operators)f(ha)o(v)o(e)h(two)e
+(types)h(of)h(parameters:)270 1324 y(essential)h(and)g(additional.)14
+b FB(Essential)8 b(par)o(ameters)g FG(are)i(the)g(stream)g(or)g(\256le)
+g(inputs)e(to)h(an)h(operator;)270 1386 y(these)j(are)h(the)f(primary)h
+(inputs)d(to)i(be)h(processed)f(by)g(an)g(operator)m(.)23
+b FB(Additional)11 b(par)o(ameters)g FG(are)270 1448
+y(\252\256ne-grain\272)19 b(quali\256cations)d(of)i(an)g(operator;)j
+(their)d(purpose)f(is)h(to)g(describe)g(an)g(operator)g(in)270
+1510 y(more)10 b(detail)f(than)g(essential)g(parameters.)16
+b(As)10 b(e)o(xamples,)g(some)g(operators)f(are)h(described)f(belo)o
+(w;)270 1573 y(for)15 b(each)g(we)g(e)o(xplicitly)e(indicate)h(their)g
+(essential)g(parameters)h(and)f(parenthetically)f(note)i(their)270
+1635 y(additional)9 b(parameters.)304 1713 y Fu(\017)21
+b FG(SOR)m(T\()p Fw(S)504 1720 y Ft(1)524 1713 y FG(\))10
+b(sorts)f(stream)h Fw(S)804 1720 y Ft(1)824 1713 y FG(.)16
+b(The)10 b(sorting)e(attrib)o(ute)h(is)g(an)h(additional)e(parameter)j
+(of)f(SOR)m(T)m(.)304 1784 y Fu(\017)21 b FG(RET\()p
+Fw(F)6 b FG(\))13 b(retrie)o(v)o(es)f(tuples)e(of)j(stored)e(\256le)h
+Fw(F)6 b FG(.)20 b(Additional)10 b(parameters)j(to)e(RET)h(include)f
+(the)348 1846 y(selection)f(predicate,)h(the)g(projected)f(attrib)o
+(utes)g(list,)g(and)h(the)g(output)f(tuple)g(order)m(.)304
+1916 y Fu(\017)21 b FG(JOIN\()p Fw(S)490 1923 y Ft(1)509
+1916 y FG(,)12 b Fw(S)560 1923 y Ft(2)579 1916 y FG(\))g(joins)e
+(streams)h Fw(S)884 1923 y Ft(1)915 1916 y FG(and)g Fw(S)1020
+1923 y Ft(2)1040 1916 y FG(.)17 b(\()p Fw(S)1111 1923
+y Ft(1)1142 1916 y FG(denotes)10 b(the)h FB(outer)g(str)n(eam)f
+FG(and)h Fw(S)1705 1923 y Ft(2)1736 1916 y FG(denotes)348
+1978 y(the)17 b FB(inner)f(str)n(eam)p FG(\).)34 b(Additional)14
+b(parameters)k(to)f(JOIN)f(include)h(the)f(join)g(predicate)h(and)348
+2040 y(output)9 b(stream)j(tuple)e(order)m(.)270 2119
+y(Other)h(operators)f(are)i(de\256ned)g(as)f(the)o(y)g(are)h(needed.)
+179 2198 y Fx(Algorithms.)20 b FB(Algorithms)10 b FG(are)k(concrete)f
+(implementations)f(of)h(conceptual)g(operators;)g(the)o(y)g(will)f(be)
+270 2260 y(represented)j(in)f(lo)o(wer)g(case)i(with)d(the)i(\256rst)g
+(letter)f(capitalized.)27 b(Algorithms)13 b(ha)o(v)o(e)i(at)g(least)f
+(the)270 2322 y(same)7 b(essential)g(and)g(additional)g(p)o(arameters)g
+(as)g(the)g(conceptual)f(operators)h(t)o(hat)g(t)o(he)o(y)g(implement.)
+1858 2306 y Ft(1)270 2384 y FG(Furthermore,)15 b(there)e(can)h(be,)h
+(and)e(usually)f(are,)j(se)o(v)o(eral)e(algorithms)f(for)i(a)g
+(particular)f(operator)m(.)270 2446 y(F)o(or)c(e)o(xample,)g(File)p
+588 2446 14 2 v 16 w(scan,)g(Btree)p 803 2446 V 17 w(scan)e(and)h(Inde)
+o(x)p 1085 2446 V 16 w(scan)g(are)h(all)e(v)o(alid)g(algorithms)f(that)
+i(implement)270 2508 y(the)14 b(operator)g(RET)m(,)g(and)g(Mer)o(ge)p
+814 2508 V 17 w(join)g(and)g(Nested)p 1124 2508 V 15
+w(loops)f(are)i(algorithms)e(that)h(implement)f(the)270
+2571 y(JOIN)e(operator)m(.)17 b(Dif)o(ferent)10 b(algorithms)g(of)o
+(fer)i(dif)o(ferent)f(e)o(x)o(ecution)f(ef)o(\256ciencies.)p
+75 2611 720 2 v 125 2641 a Fs(1)142 2657 y Fz(Algorithms)g(may)e(ha)o
+(v)o(e)h Fr(tuning)g(par)o(ameters)d Fz(which)j(are)g(not)g(parameters)
+f(in)i(the)f(operators)f(the)o(y)h(implement.)964 2793
+y FG(3)p eop
+%%Page: 4 4
+4 3 bop 277 17 1396 7 v 277 67 2 51 v 304 52 a Fq(Operator)p
+535 67 V 106 w(Description)p 881 67 V 161 w(Additional)9
+b(Parameters)p 1297 67 V 49 w(Algorithm)p 1671 67 V 277
+73 1396 7 v 277 123 2 51 v 304 133 a Fz(JOIN\()p Fp(S)420
+137 y Fs(1)438 133 y Fz(,)g Fp(S)479 137 y Fs(2)497 133
+y Fz(\))p 535 123 V 52 w(Join)g(streams)f Fp(S)779 137
+y Fs(1)797 133 y Fz(,)i Fp(S)839 137 y Fs(2)p 881 123
+V 908 108 a Fz(tuple)p 985 108 12 2 v 13 w(order)p 1297
+123 2 51 v 248 w(Nested)p 1430 108 12 2 v 12 w(loops\()p
+Fp(S)1557 112 y Fs(1)1575 108 y Fz(,)f Fp(S)1616 112
+y Fs(2)1634 108 y Fz(\))p 1671 123 2 51 v 1298 125 375
+2 v 277 173 2 51 v 535 173 V 881 173 V 908 158 a(join)p
+968 158 12 2 v 13 w(predicate)p 1297 173 2 51 v 206 w(Mer)o(ge)p
+1422 158 12 2 v 13 w(join\()p Fp(S)1526 162 y Fs(1)1545
+158 y Fz(,)g Fp(S)1586 162 y Fs(2)1604 158 y Fz(\))p
+1671 173 2 51 v 277 175 1396 2 v 277 232 2 57 v 304 262
+a(RET\()p Fp(F)c Fz(\))p 535 232 V 561 266 a(Retrie)o(v)o(e)10
+b(\256le)f Fp(F)p 881 232 V 908 213 a Fz(tuple)p 985
+213 12 2 v 13 w(order)p 1297 232 2 57 v 1323 225 a(File)p
+1383 225 12 2 v 14 w(scan\()p Fp(F)c Fz(\))p 1671 232
+2 57 v 277 282 2 51 v 535 282 V 881 282 V 908 267 a(selection)p
+1044 267 12 2 v 12 w(predicate)p 1297 282 2 51 v 1298
+259 374 2 v 1671 282 2 51 v 277 333 V 535 333 V 881 333
+V 908 317 a(projected)p 1050 317 12 2 v 12 w(attrib)o(utes)p
+1297 333 2 51 v 1323 308 a(Inde)o(x)p 1410 308 12 2 v
+13 w(scan\()p Fp(F)g Fz(\))p 1671 333 2 51 v 277 335
+1396 2 v 277 385 2 51 v 304 394 a(SOR)n(T\()p Fp(S)433
+398 y Fs(1)450 394 y Fz(\))p 535 385 V 561 396 a(Sort)10
+b(stream)f Fp(S)765 400 y Fs(1)p 881 385 V 908 394 a
+Fz(tuple)p 985 394 12 2 v 13 w(order)p 1297 385 2 51
+v 1323 370 a(Mer)o(ge)p 1422 370 12 2 v 13 w(sort\()p
+Fp(S)1524 374 y Fs(1)1543 370 y Fz(\))p 1671 385 2 51
+v 1298 387 375 2 v 277 435 2 51 v 535 435 V 881 435 V
+1297 435 V 1323 420 a(Null\()p Fp(S)1424 424 y Fs(1)1443
+420 y Fz(\))p 1671 435 V 277 442 1396 7 v 80 518 a FG(T)l(able)i(1:)16
+b(Operators)11 b(and)g(algorithms)e(in)i(a)h(centralized)e(query)h
+(optimizer)g(and)g(their)f(additional)g(parameters)p
+88 662 1766 2 v 88 1208 2 546 v 286 725 a Fo(SOR)n(T)f(\(JOIN)f(\(RET)h
+(\()p Fv(R)588 730 y Fs(1)605 725 y Fo(\),)g(RET)g(\()p
+Fv(R)742 730 y Fs(2)759 725 y Fo(\)\)\))498 798 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.384 0.09999
+false .5 19.96799 InitRnode } NewNode end end
+ 498
+798 a Fo(SOR)n(T)503 869 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.384 0.09999
+false .5 17.328 InitRnode } NewNode end end
+ 503 869 a Fo(JOIN)468 1000
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort
+/TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 468 1000 a 437 940 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+ 437 940 a Fo(RET)578 940 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+ 578
+940 a Fo(RET)468 1000 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 468 1000 a 468 1000 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 468 1000
+a 446 1009 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 446 1009 a Fv(R)473 1014 y Fs(1)588 1009
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 588 1009 a Fv(R)615 1014 y Fs(2)468 1000 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 468 1000
+a 468 1000 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 468 1000 a 155 1103 a Fz(\(a\))16 b(An)g(e)o(xpression)d
+(and)i(its)h(corresponding)d(operator)155 1153 y(tree)p
+976 1195 2 521 v 1329 795 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodemergesort 16 { .5 5.384
+1.744 false .5 35.61601 InitRnode } NewNode end end
+ 1329 795 a Fo(Mer)o(ge)p
+1418 795 10 2 v 11 w(sort)1315 865 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodenestedloops 16 { .5 5.384
+1.728 false .5 42.432 InitRnode } NewNode end end
+ 1315 865 a Fo(Nested)p
+1410 865 10 2 v 11 w(loops)1332 1000 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodemergesort
+/TheNodenestedloops InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1332 1000 a 1271
+940 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr1 16 { .5 5.384
+0.064 false .5 29.544 InitRnode } NewNode end end
+ 1271 940 a Fo(File)p 1324 940 10 2 v 12 w(scan)1412
+940 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr2 16 { .5 5.384
+0.064 false .5 29.544 InitRnode } NewNode end end
+ 1412 940 a Fo(File)p 1465 940 10 2 v 13 w(scan)1332
+1000 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodenestedloops
+/TheNodefilescanr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1332 1000 a 1332 1000 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodenestedloops
+/TheNodefilescanr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1332 1000 a 1310 1009
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1310 1009 a Fv(R)1337 1014 y Fs(1)1452 1009 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1452
+1009 a Fv(R)1479 1014 y Fs(2)1332 1000 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodefilescanr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1332 1000 a
+1332 1000 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodefilescanr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1332 1000 a 1054 1103 a Fz(\(b\))d(Possible)e(access)f
+(plan)h(for)i(operator)f(tree)g(in)h(\(a\))p 1852 1208
+2 546 v 88 1210 1766 2 v 1853 1218 10 549 v 96 1218 1766
+10 v 483 1321 a FG(Figure)h(1:)16 b(Example)11 b(of)g(an)h(operator)e
+(tree)i(and)f(access)g(plan)75 1501 y(T)l(able)20 b(1)g(lists)e(some)i
+(operators)f(and)h(algorithms)e(implementing)h(them)h(together)f(with)g
+(their)g(additional)75 1563 y(parameters.)75 1692 y Fx(Operator)12
+b(T)m(r)o(ees.)46 b FG(An)11 b FB(oper)o(ator)e(tr)n(ee)i
+FG(is)f(a)h(rooted)g(tree)g(whose)f(non-leaf,)h(or)g
+FB(interior)p FG(,)e(nodes)h(are)i(database)75 1754 y(operations)k
+(\(operators)h(or)h(algorithms\))f(and)g(whose)g(leaf)h(nodes)f(are)i
+(stored)e(\256les.)36 b(The)17 b(children)g(of)h(an)75
+1816 y(interior)12 b(node)g(in)g(an)h(operator)f(tree)h(are)g(the)g
+(essential)e(parameters)i(\(i.e.,)i(the)d(stream)h(or)g(\256le)g
+(parameters\))g(of)75 1878 y(the)e(node.)18 b(Additional)10
+b(parameters)i(are)g(implicitly)e(attached)i(to)f(each)h(node.)18
+b(Algebraically)m(,)11 b(operator)g(trees)75 1940 y(are)17
+b(compositions)c(of)j(database)g(operations;)g(thus,)h(we)f(will)f
+(also)g(call)h(operator)g(trees)g FB(e)o(xpr)n(essions)p
+FG(;)g(both)75 2003 y(terms)11 b(will)f(be)i(used)e(interchangeably)m
+(.)75 2114 y(E)p Fn(XAMPLE)j FG(1.)79 b(A)12 b(simple)g(e)o(xpression)g
+(and)g(its)g(operator)g(tree)h(representation)e(are)j(sho)o(wn)d(in)h
+(Figure)g(1\(a\).)75 2177 y(Relations)c Fw(R)291 2184
+y Ft(1)320 2177 y FG(and)h Fw(R)430 2184 y Ft(2)459 2177
+y FG(are)h(\256rst)f(RET)n(rie)o(v)o(ed,)h(and)g(then)e(JOINed,)i(and)f
+(\256nally)g(SOR)m(T)m(ed)h(resulting)d(in)i(a)h(stream)75
+2239 y(sorted)e(on)g(a)g(speci\256c)h(attrib)o(ute.)14
+b(The)8 b(\256gure)h(sho)o(ws)e(only)g(the)h(essential)f(parameters)i
+(of)f(the)g(v)o(arious)g(operators,)75 2301 y(not)i(the)h(additional)f
+(parameters.)1225 b Fm(\003)75 2463 y Fx(Descriptors.)45
+b FG(A)14 b FB(pr)n(operty)d FG(of)i(a)h(node)e(is)h(a)g(\(user)o
+(-de\256ned\))h(v)o(ariable)e(that)g(contains)g(information)g(used)h
+(by)75 2525 y(an)f(optimizer)m(.)17 b(An)11 b FB(annotation)e
+FG(is)i(a)h Fu(h)p FB(pr)n(operty)m(,)e(value)p Fu(i)h
+FG(pair)h(that)e(is)h(assigned)g(to)g(a)h(node.)17 b(A)11
+b FB(descriptor)g FG(is)g(a)75 2587 y(list)h(of)g(annotations)f(that)h
+(describes)g(a)h(node)f(of)h(an)g(operator)f(tree;)i(e)o(v)o(ery)f
+(node)f(has)h(its)f(o)o(wn)g(descriptor)m(.)20 b(As)75
+2649 y(an)10 b(e)o(xample,)h(T)l(able)f(2)g(lists)e(some)i(typical)f
+(properties)g(that)g(might)h(be)g(used)f(in)h(a)g(descriptor)m(.)16
+b(It)9 b(must)h(be)g(noted)964 2793 y(4)p eop
+%%Page: 5 5
+5 4 bop 376 17 1198 7 v 376 67 2 51 v 403 52 a Fq(Pr)o(operty)p
+719 67 V 198 w(Description)p 1572 67 V 376 73 1198 7
+v 376 123 2 51 v 403 108 a Fz(join)p 463 108 12 2 v 13
+w(predicate)p 719 123 2 51 v 133 w(join)10 b(predicate)e(for)i(JOIN)f
+(operator)p 1572 123 V 376 125 1198 2 v 376 175 2 51
+v 403 160 a(selection)p 539 160 12 2 v 12 w(predicate)p
+719 175 2 51 v 58 w(selection)f(predicate)h(for)g(RET)g(operator)p
+1572 175 V 376 177 1198 2 v 376 227 2 51 v 403 212 a(tuple)p
+480 212 12 2 v 13 w(order)p 719 227 2 51 v 175 w(tuple)g(order)g(of)h
+(resulting)f(stream,)g(DONT)p 1322 212 12 2 v 13 w(CARE)g(if)i(none)p
+1572 227 2 51 v 376 229 1198 2 v 376 279 2 51 v 403 264
+a(num)p 472 264 12 2 v 13 w(records)p 719 279 2 51 v
+151 w(number)e(of)g(tuples)g(of)g(resulting)g(stream)p
+1572 279 V 376 281 1198 2 v 376 331 2 51 v 403 316 a(tuple)p
+480 316 12 2 v 13 w(size)p 719 331 2 51 v 195 w(size)g(of)g(indi)o
+(vidual)g(tuple)g(in)g(stream)p 1572 331 V 376 332 1198
+2 v 376 383 2 51 v 403 368 a(projected)p 545 368 12 2
+v 12 w(attrib)o(utes)p 719 383 2 51 v 52 w(list)h(of)g(projected)e
+(attrib)o(utes)i(for)f(RET)g(operator)p 1572 383 V 376
+384 1198 2 v 376 435 2 51 v 403 419 a(attrib)o(utes)p
+719 435 V 204 w(list)h(of)g(attrib)o(utes)p 1572 435
+V 376 436 1198 2 v 376 486 2 51 v 403 471 a(cost)p 719
+486 V 281 w(estimated)f(cost)f(of)i(algorithm)p 1572
+486 V 376 493 1198 7 v 546 569 a FG(T)l(able)i(2:)j(Properties)c(of)g
+(nodes)g(in)f(an)i(operator)e(tree)75 749 y(here)i(that)f(streams)h
+(and)g(stored)f(\256les)g(may)i(ha)o(v)o(e)f(dif)o(ferent)f(descriptor)
+g(structures.)17 b(The)12 b(follo)o(wing)d(notations)75
+811 y(will)g(be)h(useful)f(in)h(our)g(subsequent)e(discussions.)14
+b(If)c Fw(S)962 818 y Fv(i)986 811 y FG(is)g(a)g(stream,)h(then)f
+Fl(D)1329 818 y Fk(i)1352 811 y FG(is)g(its)f(descriptor)m(.)16
+b(Annotations)75 873 y(of)g Fw(S)157 880 y Fv(i)187 873
+y FG(are)g(accessed)g(by)f(a)h(structure)f(member)i(relationship,)e
+(e.g.,)j Fl(D)1247 880 y Fk(i)1261 873 y Fw(:)p FG(num)p
+1358 873 14 2 v 15 w(records.)31 b(Also,)16 b(let)f Fw(E)j
+FG(be)e(an)75 935 y(e)o(xpression)10 b(and)h(let)g Fl(D)g
+FG(be)h(its)e(descriptor)m(.)16 b(W)l(e)c(will)e(write)h(this)f(as)h
+Fw(E)k Fj(:)d Fl(D)p FG(.)75 1047 y(E)p Fn(XAMPLE)h FG(2.)77
+b(The)11 b(e)o(xpression,)75 1142 y(SOR)m(T)p Fj(\()p
+FG(JOIN)p Fj(\()p FG(RET)o Fj(\()p Fw(R)461 1149 y Ft(1)480
+1142 y Fj(\))h(:)h Fl(D)576 1149 y Fk(3)598 1142 y Fw(;)8
+b FG(RET)o Fj(\()p Fw(R)757 1149 y Ft(2)776 1142 y Fj(\))k(:)h
+Fl(D)872 1149 y Fk(4)894 1142 y Fj(\))f(:)h Fl(D)990
+1149 y Fk(5)1012 1142 y Fj(\))f(:)h Fl(D)1108 1149 y
+Fk(6)75 1238 y FG(corresponds)j(to)g(the)g(operator)h(tree)g(in)f
+(Figure)h(1\(a\),)i(and)e(represents)f(the)g(join)g(of)h(two)f
+(relations)f Fw(R)1773 1245 y Ft(1)1809 1238 y FG(and)75
+1300 y Fw(R)110 1307 y Ft(2)129 1300 y FG(.)24 b(The)13
+b(two)g(relations)f(are)i(\256rst)f(RET)n(rie)o(v)o(ed,)i(then)e
+(JOINed)g(and)g(\256nally)g(SOR)m(T)m(ed.)24 b Fl(D)1559
+1307 y Fk(3)1595 1300 y FG(and)13 b Fl(D)1714 1307 y
+Fk(4)1750 1300 y FG(are)h(the)75 1362 y(descriptors)9
+b(of)i(the)f(two)f(RETs)h(respecti)o(v)o(ely)m(,)g Fl(D)869
+1369 y Fk(5)902 1362 y FG(is)g(the)g(descriptor)g(of)g(the)g(JOIN,)h
+(and)f Fl(D)1553 1369 y Fk(6)1586 1362 y FG(is)g(the)g(descriptor)75
+1424 y(of)i(the)g(SOR)m(T)m(.)h(Assuming)d(that)i(the)g(descriptor)f
+(\256elds)g(for)i(this)e(e)o(xpression)g(are)h(those)g(gi)o(v)o(en)f
+(in)h(T)l(able)g(2,)g(the)75 1486 y(selection)d(predicate)i(for)f(the)h
+(\256rst)f(RET)h(is)f Fl(D)814 1493 y Fk(3)836 1486 y
+Fw(:)p FG(selection)p 1015 1486 V 15 w(predicate,)h(and)f(that)g(for)h
+(the)f(second)g(RET)h(is)f(gi)o(v)o(en)75 1548 y(by)h
+Fl(D)172 1555 y Fk(4)194 1548 y Fw(:)p FG(selection)p
+373 1548 V 15 w(predicate.)17 b(The)11 b(join)f(predicate)h(of)g(the)h
+(JOIN)e(node)h(is)g(gi)o(v)o(en)g(by)g Fl(D)1498 1555
+y Fk(5)1520 1548 y Fw(:)p FG(join)p 1608 1548 V 15 w(predicate)o(,)h
+(and)75 1610 y(the)d(attrib)o(utes)f(that)g(are)i(output)e(are)i(gi)o
+(v)o(en)e(by)h Fl(D)854 1617 y Fk(5)877 1610 y Fw(:)p
+FG(attrib)o(utes)n(.)16 b(The)9 b(order)g(in)g(which)f(SOR)m(T)i
+(returns)f(the)g(output)75 1672 y(stream)j(is)e(gi)o(v)o(en)h(by)g
+Fl(D)457 1679 y Fk(6)479 1672 y Fw(:)p FG(tuple)p 587
+1672 V 15 w(order.)1134 b Fm(\003)137 1768 y FG(A)11
+b(notational)e(simpli\256cation)g(can)i(be)g(made)g(here.)17
+b(Additional)9 b(parameters)i(of)g(operators)f(can)h(be)g(treated)75
+1830 y(the)i(same)g(way)g(as)g(other)f(properties)g(of)h(a)h(node;)f
+(essential)e(parameters,)k(ho)o(we)o(v)o(er)n(,)e(are)h
+FB(e)o(xpr)n(essions)p FG(.)21 b(Thus,)75 1892 y(the)8
+b(term)i(descriptor)d(in)i(the)f(remainder)i(of)e(this)g(paper)h(will)f
+(refer)h(to)g(a)g(set)f(of)h(properties,)g(including)d(additional)75
+1954 y(parameters,)12 b(as)f(sho)o(wn)f(in)h(T)l(able)g(2.)137
+2016 y(Currently)m(,)g(descriptor)e(properties)h(are)h(de\256ned)g
+(entirely)e(by)i(the)f(user;)g(ho)o(we)o(v)o(er)n(,)h(we)g(en)n(vision)
+e(pro)o(viding)75 2078 y(a)j(hierarchy)e(of)i(pre-de\256ned)f
+(descriptor)f(types)g(to)h(aid)g(this)f(process.)75 2207
+y Fx(Access)h(Plans.)45 b FG(An)11 b FB(access)g(plan)f
+FG(is)h(an)g(operator)g(tree)g(in)g(which)g(all)f(interior)h(nodes)f
+(are)i(algorithms.)75 2319 y(E)p Fn(XAMPLE)h FG(3.)75
+b(An)8 b(access)g(plan)g(for)h(the)f(operator)g(tree)h(in)f(Figure)g
+(1\(a\))h(is)f(sho)o(wn)f(in)h(Figure)h(1\(b\).)15 b(Relations)75
+2381 y Fw(R)110 2388 y Ft(1)141 2381 y FG(and)d Fw(R)254
+2388 y Ft(2)286 2381 y FG(are)g(each)h(retrie)o(v)o(ed)f(using)e(the)i
+(File)p 873 2381 V 16 w(scan)g(algorithm,)g(joined)e(using)h(Nested)p
+1546 2381 V 16 w(loops,)g(and)h(\256nally)75 2443 y(sorted)e(using)g
+(Mer)o(ge)p 427 2443 V 17 w(sort.)1319 b Fm(\003)964
+2793 y FG(5)p eop
+%%Page: 6 6
+6 5 bop 85 -30 1773 2 v 85 388 2 418 v 122 15 a Fp(E)r
+Fi(\()p Fp(x)189 19 y Fs(1)206 15 y Fp(;)6 b(:)g(:)g(:)g(;)g(x)313
+19 y Fh(n)334 15 y Fi(\))11 b(:)f Fg(D)415 19 y Ff(1)445
+15 y Fi(=)-6 b Fe(\))11 b Fp(E)548 -3 y FA(0)559 15 y
+Fi(\()p Fp(x)596 19 y Fs(1)613 15 y Fp(;)6 b(:)g(:)g(:)g(;)g(x)720
+19 y Fh(n)741 15 y Fi(\))11 b(:)f Fg(D)822 19 y Ff(2)1788
+15 y Fz(\(1\))122 65 y Fe(ff)230 115 y Fz(pre-test)g(statements)122
+165 y Fe(gg)122 216 y Fz(test)122 266 y Fe(ff)230 316
+y Fz(post-test)f(statements)122 366 y Fe(gg)p 1855 388
+V 85 390 1773 2 v 1856 398 10 421 v 93 398 1773 10 v
+662 502 a FG(Figure)i(2:)k(General)d(form)f(of)h(a)f(T)l(-rule)75
+682 y Fy(2.2)50 b(Prairie)13 b(optimization)e(paradigm)75
+775 y FG(Query)k(optimizers)f(map)i(operator)f(trees)g(to)g(access)g
+(plans.)1063 758 y Ft(2)1111 775 y FG(Prairie)g(admits)g(two)f(rather)h
+(dif)o(ferent)g(means)75 837 y(of)d(optimization:)k(top-do)o(wn)11
+b(and)h(bottom-up.)18 b(A)13 b(top-do)o(wn)d(query)i(optimizer)g
+(optimizes)f(the)h(parents)g(of)g(a)75 899 y(node)h(prior)h(to)f
+(optimizing)f(the)i(node)f(itself.)24 b(A)14 b(bottom-up)e(optimizer)h
+(optimizes)g(the)h(children)f(of)g(a)i(node)75 961 y(prior)f(to)g
+(optimizing)f(the)i(node.)26 b(The)15 b(earliest)f(optimizers)f
+(\(System)i(R)g([17])g(and)f(R)1485 944 y Fd(\003)1520
+961 y FG([16]\))h(employed)e(the)75 1023 y(bottom-up)d(approach.)137
+1085 y(Our)k(research)h(concentrates)f(on)f(a)i(top-do)o(wn)d
+(optimization)h(of)h(operator)g(trees.)25 b(W)l(e)15
+b(ha)o(v)o(e)g(chosen)e(this)75 1147 y(approach)e(because)g(we)h
+(intend)e(to)h(translate)f(Prairie)i(rules)f(into)f(the)h(format)h
+(required)f(by)g(the)g(V)-6 b(olcano)10 b(query)75 1209
+y(optimizer)16 b(generator)g([8].)31 b(V)-6 b(olcano)16
+b(is)f(based)h(on)g(a)g(top-do)o(wn)f(strate)o(gy)m(.)31
+b(Gi)o(v)o(en)15 b(an)i(appropriate)e(search)75 1271
+y(engine,)g(Prairie)g(can)g(potentially)e(also)h(be)h(used)f(with)g(a)h
+(bottom-up)e(optimization)g(strate)o(gy;)i(ho)o(we)o(v)o(er)n(,)h(we)75
+1333 y(will)10 b(not)h(discuss)e(this)h(approach)h(in)g(this)f(paper)m
+(.)137 1396 y(In)18 b(query)g(optimization,)g(there)g(are)g(certain)g
+(annotations)e(\(such)i(as)g(additional)e(parameters\))i(that)f(are)75
+1458 y(kno)o(wn)12 b(before)i(an)o(y)g(optimization)e(is)h(be)o(gun.)24
+b(These)13 b(annotations)f(can)i(be)f(computed)h(at)f(the)h(time)f
+(that)g(the)75 1520 y(operator)d(tree)i(is)e(initialized,)f(and)i(will)
+f(not)g(change)h(with)f(application)f(of)h(rules.)17
+b(Our)10 b(follo)o(wing)f(discussions)75 1582 y(assume)i(operator)g
+(trees)g(are)h(initialized.)75 1712 y Fy(2.3)50 b(T)l(ransf)o(ormation)
+12 b(rules)137 1805 y FG(T)n(ransformation)f(rules,)h(or)f(T)l(-rules)g
+(for)h(short,)f(de\256ne)h(equi)o(v)o(alences)e(among)i(pairs)f(of)g(e)
+o(xpressions;)f(the)o(y)75 1867 y(de\256ne)j(mappings)e(from)i(one)g
+(operator)f(tree)h(to)f(another)m(.)21 b(Let)12 b Fw(E)j
+FG(and)d Fw(E)1264 1851 y Fd(0)1288 1867 y FG(be)g(e)o(xpressions)g
+(that)f(in)n(v)o(olv)o(e)h(only)75 1929 y(abstract)d(operators.)15
+b(Equation)8 b(\(1\))i(\(sho)o(wn)e(in)i(Figure)f(2\))h(sho)o(ws)e(the)
+h(general)h(form)g(of)f(a)h(T)l(-rule.)16 b(The)9 b(actions)75
+1991 y(of)j(a)g(T)l(-rule)g(de\256ne)g(the)f(equi)o(v)o(alences)g
+(between)g(the)h(descriptors)e(of)i(nodes)f(of)h(the)g(original)e
+(operator)i(tree)g Fw(E)75 2053 y FG(with)i(the)g(nodes)g(of)g(the)h
+(output)e(tree)h Fw(E)735 2037 y Fd(0)746 2053 y FG(;)i(these)e
+(actions)g(consist)f(of)i(a)g(series)f(of)g(\(C)i(or)e(C++\))h
+(assignment)1857 2037 y Ft(3)75 2116 y FG(statements.)j(The)12
+b(left-hand)f(sides)g(of)h(these)f(statements)g(refer)i(to)f
+(descriptors)e(of)i(e)o(xpressions)f(on)g(the)h(right-)75
+2178 y(hand)k(side)f(of)h(the)g(T)l(-rule;)i(the)e(right-hand)f(sides)g
+(of)h(the)g(statements)f(can)i(refer)g(to)e(an)o(y)i(descriptor)e(in)g
+(the)75 2240 y(T)l(-rule.)k(Function)11 b(\(called)i
+FB(helper)f FG(functions\))f(calls)h(can)g(also)g(appear)g(on)g(the)g
+(right)g(side)f(of)h(the)g(assignment)75 2302 y(statements.)j(Thus,)8
+b(descriptors)g(on)g(the)g FB(left-hand)f(side)i FG(of)f(a)h(T)l(-rule)
+g(are)g FB(ne)o(ver)h FG(changed)e(in)h(the)f(rule')m(s)h(actions.)p
+75 2342 720 2 v 125 2369 a Fs(2)142 2385 y Fz(Actually)n(,)j(query)e
+(optimizers)h(operate)f(on)g(the)h(output)g(of)g(a)g(query)g(compiler)g
+(which)f(translates)g(a)h(high-le)o(v)o(el)g(query)n(,)g(e.g.,)h(one)75
+2435 y(e)o(xpressed)t(in)7 b(SQL,)f(into)h(an)f(intermediate)g
+(structure)h(called)e(a)h Fr(query)f(gr)o(aph)g Fz(and)h(then)g(into)g
+(an)g(operator)g(tree.)13 b(The)6 b(query)f(compilation)75
+2486 y(process)i(is)j(well-kno)o(wn)f(and)f(we)h(assume)e(it)j(is)f
+(carried)g(out)h(before)e(query)h(optimization)g(be)o(gins.)125
+2517 y Fs(3)142 2533 y Fz(The)e(actions)g(can)g(be)h(non-assignment)d
+(statements)i(\(like)h(function)g(calls\),)h(b)o(ut)f(in)g(this)g
+(case,)f(the)g(P2V)h(pre-processor)e(\(described)75 2583
+y(in)j(Section)e(3\))i(needs)d(some)i(hints)g(about)f(the)h(properties)
+g(that)h(are)f(changed)e(by)i(the)g(statement)f(in)i(order)f(to)h
+(correctly)f(cate)o(gorize)g(each)75 2633 y(property)n(.)13
+b(F)o(or)d(simplicity)n(,)f(in)h(this)f(paper)o(,)f(we)h(assume)e(all)j
+(actions)e(consist)h(of)g(assignment)e(statements.)964
+2793 y FG(6)p eop
+%%Page: 7 7
+7 6 bop 75 14 a FG(A)11 b FB(test)g FG(is)g(needed)g(to)g(determine)g
+(if)g(the)g(transformations)f(of)h(the)g(T)l(-rule)g(are)h(in)e(fact)h
+(applicable.)137 77 y(Purely)h(as)g(an)g(optimization,)e(it)h(is)g
+(usually)f(the)i(case)g(that)f(not)g(all)h(statements)e(in)i(a)g(T)l
+(-rule')m(s)f(actions)g(need)75 139 y(to)k(be)h(e)o(x)o(ecuted)h(prior)
+e(to)h(a)g(T)l(-rule')m(s)g(test.)30 b(F)o(or)16 b(this)f(reason,)i
+(the)f(actions)f(of)h(a)g(T)l(-rule)f(are)i(split)d(into)h(two)75
+201 y(groups;)j(those)d(that)h(need)g(to)g(be)h(e)o(x)o(ecuted)f(prior)
+g(to)g(the)g(T)l(-rule')m(s)h(test,)g(and)f(those)g(that)g(can)g(be)h
+(e)o(x)o(ecuted)75 263 y(after)12 b(a)g(successful)e(test.)16
+b(These)c(groups)e(of)h(statements)g(comprise,)g(respecti)o(v)o(ely)m
+(,)g(the)g FB(pr)n(e-test)h FG(and)f FB(post-test)75
+325 y FG(statements)f(of)h(the)g(T)l(-rule.)515 308 y
+Ft(4)137 387 y FG(W)l(e)j(no)o(w)f(de\256ne)g(the)g(actions)g(and)g
+(tests)f(of)h(a)h(T)l(-rule)f(more)h(precisely)m(.)22
+b(Let)13 b Fw(O)1429 394 y Fv(i)1456 387 y FG(be)g(an)h(abstract)f
+(operator)75 449 y(of)i Fw(E)165 433 y Fd(0)175 449 y
+FG(,)h(and)f(let)f Fl(O)382 456 y Fk(i)410 449 y FG(be)h(its)f
+(descriptor)m(.)26 b(Similarly)m(,)15 b(let)f Fw(I)1016
+456 y Fv(i)1045 449 y FG(be)h(an)f(abstract)g(operator)g(of)h
+Fw(E)i FG(and)d(let)g Fl(I)1746 456 y Fk(i)1774 449 y
+FG(be)h(its)75 511 y(descriptor)m(.)29 b(\()p Fw(I)330
+518 y Fv(i)360 511 y FG(is)15 b(an)g(operator)h(that)e(is)h(input)g(to)
+g(the)g(rule)g(and)g Fw(O)1195 518 y Fv(i)1225 511 y
+FG(is)g(an)g(operator)h(that)e(is)h(output)f(by)h(the)75
+573 y(rule\).)24 b(Let)14 b Fw(M)315 580 y Fv(i)343 573
+y FG(denote)f(the)g Fw(i)p FG(th)g(descriptor)g(property)m(.)23
+b(Thus,)14 b Fl(O)1150 580 y Fk(i)1164 573 y Fw(:M)1221
+580 y Fv(j)1253 573 y FG(is)f(the)g(v)o(alue)g(of)h(the)g
+Fw(j)s FG(th)e(property)h(of)75 635 y(descriptor)d Fl(O)307
+642 y Fk(i)321 635 y FG(.)18 b(The)11 b(left-hand)g(side)f(of)i(an)f
+(assignment)g(refers)h(to)f(an)g(output)f(descriptor)g(\()p
+Fl(O)1604 642 y Fk(i)1618 635 y FG(\))i(or)f(a)h(member)75
+698 y(of)g(an)f(output)f(descriptor)h(\()p Fl(O)555 705
+y Fk(i)569 698 y Fw(:M)626 705 y Fv(j)644 698 y FG(\).)18
+b(The)11 b(right-hand)g(side)g(is)g(an)g(e)o(xpression)g(or)h(a)g
+(helper)f(function)f(call)i(that)75 760 y(only)e(references)i(input)e
+(descriptors)g(and/or)g(their)h(members.)17 b(Here)12
+b(are)g(a)g(fe)o(w)f(e)o(xamples:)181 850 y Fl(O)220
+857 y Fk(i)275 850 y Fj(=)42 b Fl(I)372 857 y Fk(k)407
+850 y Fj(;)416 b Fw(==)10 b FG(copy)h(descriptor)f Fl(I)1205
+857 y Fk(k)1240 850 y FG(to)g Fl(O)1325 857 y Fk(i)106
+912 y Fl(O)145 919 y Fk(i)159 912 y Fw(:M)216 919 y Fv(j)275
+912 y Fj(=)42 b Fl(I)372 919 y Fk(k)396 912 y Fw(:M)453
+919 y Fv(j)481 912 y Fj(+)10 b(4)h(;)263 b Fw(==)10 b
+FG(e)o(xpression)h(de\256ning)f Fl(O)1297 919 y Fk(i)1311
+912 y Fw(:M)1368 919 y Fv(j)96 975 y Fl(O)135 982 y Fk(3)157
+975 y Fw(:M)214 982 y Ft(5)275 975 y Fj(=)42 b FG(helper)11
+b Fj(\()p Fl(I)515 982 y Fk(1)537 975 y Fw(:M)594 982
+y Ft(5)614 975 y Fw(;)d Fl(I)655 982 y Fk(2)676 975 y
+Fw(:M)733 982 y Ft(5)752 975 y Fj(\))j(;)42 b Fw(==)10
+b FG(helper)h(function)f(that)h(computes)f Fl(O)1484
+982 y Fk(3)1507 975 y Fw(:M)1564 982 y Ft(5)836 1037
+y Fw(==)g FG(from)i(inputs)e Fl(I)1135 1044 y Fk(1)1157
+1037 y Fw(:M)1214 1044 y Ft(5)1245 1037 y FG(and)h Fl(I)1342
+1044 y Fk(2)1364 1037 y Fw(:M)1421 1044 y Ft(5)1440 1037
+y FG(.)137 1123 y(The)g(test)g(for)g(a)h(T)l(-rule')m(s)f
+(applicability)d(is)j(a)h(boolean)e(e)o(xpression)g(and)h(normally)g
+(in)n(v)o(olv)o(es)f(checks)h(on)f(the)75 1185 y(v)o(alues)g(of)i
+(output)d(descriptors)h(\(e.g.,)i Fl(O)731 1192 y Fk(3)754
+1185 y Fw(:M)811 1192 y Ft(5)843 1185 y Fw(>)h Fj(6)p
+FG(\);)e(occasionally)m(,)f(helper)h(functions)f(may)h(be)g(needed.)137
+1247 y(Again,)i(it)f(is)h(important)f(to)g(remember)j(that)d(the)h
+(pre-test)f(actions)g(are)i(carried)f(out)f(prior)h(to)f(the)h(test;)f
+(the)75 1310 y(post-test)c(actions)h(are)h(performed)h(only)e(if)h(a)g
+(T)l(-rule')m(s)g(test)f(e)o(v)o(aluates)g(to)g(TR)n(UE,)h(and)g(all)g
+(post-test)e(actions)g(are)75 1372 y(performed)14 b(immediately)m(,)g
+(with)e(no)h(intermediate)g(optimization)e(of)i(an)o(y)h(descendant)e
+(nodes)h(of)g(the)g(root)g(of)75 1434 y Fw(E)s FG(.)137
+1496 y(Note)h(that)g(there)h(are)g(no)f(actions)g(that)f(are)j(carried)
+e(out)g FB(after)h FG(the)f(essential)f(parameters)i(of)g(the)f(root)g
+(of)75 1558 y Fw(E)h FG(are)f(optimized.)20 b(This)12
+b(is)h(because)f(a)i(T)l(-rule)e(only)g(logically)f(transforms)i(a)g
+(conceptual)f(tree)h(into)f(another)75 1620 y(conceptual)e(tree.)75
+1732 y(E)p Fn(XAMPLE)j FG(4.)79 b(The)14 b(associati)o(vity)c(of)k
+(JOINs)e(is)h(e)o(xpressed)g(by)g(T)l(-rule)g(\(2\))g(in)g(Figure)g
+(3\(a\).)24 b(It)13 b(re)o(writes)g(a)75 1794 y(two-way)e(join)i(into)f
+(an)h(equi)o(v)o(alent)e(operator)i(tree.)23 b(The)13
+b(\(single\))f(pre-test)h(statement)g(computes)f(the)h(list)f(of)75
+1856 y(attrib)o(utes)h(of)i(the)f(ne)o(w)h(JOIN)f(node)h(on)f(the)g
+(right)g(side.)27 b(The)14 b(test)g(of)h(the)g(T)l(-rule)f(consists)f
+(of)i(a)g(call)f(to)g(the)75 1918 y(helper)f(function)g(\252is)p
+422 1918 14 2 v 15 w(associati)o(v)o(e\272,)h(which)f(returns)g(TR)n
+(UE)g(or)h(F)m(ALSE)f(depending)f(on)h(whether)g(the)h(T)l(-rule)75
+1980 y(is)j(applicable.)36 b(If)18 b(it)g(is)f(not,)i(then)f(the)f
+(rule)h(is)f(rejected)h(\(e.g.,)j(because)d(it)f(generates)h(a)g
+(cross-product\),)75 2042 y(otherwise)d(the)h(post-test)f(statements)g
+(are)i(e)o(x)o(ecuted.)32 b(The)16 b(post-test)e(statements)i(compute)g
+(v)o(arious)f(other)75 2105 y(annotations)f(of)i(the)g(ne)o(w)h(nodes)e
+(that)h(are)h(generated)f(by)g(applying)e(the)j(T)l(-rule.)31
+b(Note)16 b(the)g(use)g(of)g(helper)75 2167 y(functions)10
+b(\252cardinality\272)g(and)h(\252union\272)f(to)h(compute)g
+(descriptor)f(properties.)137 2229 y(Consider)g(three)g(relations)f
+Fw(R)615 2236 y Ft(1)634 2229 y FG(,)i Fw(R)691 2236
+y Ft(2)721 2229 y FG(and)f Fw(R)832 2236 y Ft(3)851 2229
+y FG(,)h(and)f(let)g Fw(a)1029 2236 y Fv(i)1043 2229
+y FG(,)h Fw(b)1085 2236 y Fv(i)1109 2229 y FG(and)f Fw(c)1205
+2236 y Fv(i)1229 2229 y FG(be)g(their)g(respecti)o(v)o(e)g(sets)f(of)h
+(attrib)o(utes.)75 2291 y(Figures)i(3\(b\))f(and)h(3\(c\))h(sho)o(w)m
+(,)e(respecti)o(v)o(ely)m(,)h(e)o(xamples)g(of)g(the)f(applicability)f
+(and)i(non-applicability)c(of)k(the)75 2353 y(join)e(associati)o(vity)f
+(T)l(-rule.)1324 b Fm(\003)p 75 2427 720 2 v 125 2454
+a Fs(4)142 2470 y Fz(W)m(e)10 b(suspect)e(it)i(is)g(possible)f(to)h
+(use)e(data-\257o)o(w)h(analysis)g(to)g(partition)i(the)e(assignment)f
+(statements)h(automatically)n(,)g(b)o(ut)h(for)h(no)o(w)n(,)75
+2520 y(we)e(let)h(the)f(rule-writer)i(do)d(the)h(partitioning.)964
+2793 y FG(7)p eop
+%%Page: 8 8
+8 7 bop 75 12 1796 2 v 75 1134 2 1122 v 123 52 a Fz(JOIN)p
+Fi(\()p Fz(JOIN)p Fi(\()p Fp(S)338 56 y Fs(1)356 52 y
+Fp(;)6 b(S)396 56 y Fs(2)413 52 y Fi(\))11 b(:)f Fg(D)494
+56 y Ff(4)514 52 y Fp(;)c(S)554 56 y Fs(3)571 52 y Fi(\))11
+b(:)f Fg(D)652 56 y Ff(5)682 52 y Fi(=)-6 b Fe(\))11
+b Fz(JOIN)p Fi(\()p Fp(S)874 56 y Fs(1)891 52 y Fp(;)6
+b Fz(JOIN)p Fi(\()p Fp(S)1027 56 y Fs(2)1045 52 y Fp(;)g(S)1085
+56 y Fs(3)1103 52 y Fi(\))k(:)h Fg(D)1184 56 y Ff(6)1203
+52 y Fi(\))g(:)f Fg(D)1284 56 y Ff(7)1790 52 y Fz(\(2\))123
+103 y Fe(ff)232 153 y Fg(D)266 157 y Ff(6)285 153 y Fp(:)p
+Fz(attrib)o(utes)h Fi(=)g Fz(union)d Fi(\()p Fg(D)629
+157 y Ff(2)648 153 y Fp(:)p Fz(attrib)o(utes)p Fp(;)e
+Fg(D)848 157 y Ff(3)867 153 y Fp(:)p Fz(attrib)o(utes)p
+Fi(\))k(;)123 203 y Fe(gg)123 253 y Fz(is)p 150 253 12
+2 v 14 w(associati)o(v)o(e)d Fi(\()p Fg(D)382 257 y Ff(6)402
+253 y Fp(:)p Fz(join)p 473 253 V 13 w(predicate)o Fp(;)f
+Fg(D)672 257 y Ff(6)691 253 y Fp(:)p Fz(attrib)o(utes)p
+Fp(;)g Fg(D)891 257 y Ff(5)910 253 y Fp(:)p Fz(join)p
+981 253 V 13 w(predicate)o Fi(\))123 304 y Fe(ff)232
+354 y Fg(D)266 358 y Ff(7)296 354 y Fi(=)11 b Fg(D)371
+358 y Ff(5)399 354 y Fi(;)232 404 y Fg(D)266 408 y Ff(7)285
+404 y Fp(:)p Fz(join)p 356 404 V 14 w(predicate)e Fi(=)i
+Fg(D)590 408 y Ff(4)609 404 y Fp(:)p Fz(join)p 680 404
+V 13 w(predicate)d Fi(;)232 454 y Fg(D)266 458 y Ff(6)285
+454 y Fp(:)p Fz(tuple)p 373 454 V 13 w(size)i Fi(=)h
+Fg(D)528 458 y Ff(2)547 454 y Fp(:)p Fz(tuple)p 635 454
+V 13 w(size)c Fi(+)i Fg(D)785 458 y Ff(3)804 454 y Fp(:)p
+Fz(tuple)p 892 454 V 13 w(size)f Fi(;)232 504 y Fg(D)266
+508 y Ff(6)285 504 y Fp(:)p Fz(num)p 365 504 V 13 w(records)i
+Fi(=)g Fz(cardinality)f Fi(\()p Fg(D)755 508 y Ff(2)774
+504 y Fp(;)d Fg(D)825 508 y Ff(3)845 504 y Fi(\))j(;)123
+555 y Fe(gg)764 631 y Fz(\(a\))g(Join)g(Associati)o(vity)g(T)m(-rule)p
+100 682 1745 2 v 319 734 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.384
+0.09999 false .5 17.328 InitRnode } NewNode end end
+ 319 734 a Fo(JOIN)192 733
+y Fv(b)207 738 y Fs(2)234 733 y Ft(=)i Fv(c)287 738 y
+Fs(1)248 805 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2 16 { .5 5.384
+0.09999 false .5 17.328 InitRnode } NewNode end end
+ 248 805 a Fo(JOIN)120 804 y Fv(a)139 809
+y Fs(1)166 804 y Ft(=)f Fv(b)218 809 y Fs(1)181 876 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+
+181 876 a Fo(RET)323 876 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+ 323 876 a Fo(RET)394 806 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+
+394 806 a Fo(RET)191 945 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 191 945 a Fv(R)218 950 y Fs(1)333
+945 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 333 945 a Fv(R)360 950 y Fs(2)404 874 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 404 874
+a Fv(R)431 879 y Fs(3)213 936 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 213 936 a 213 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 213
+936 a 213 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNodejoinr1r2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 213 936 a 213 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 213 936 a 213 936
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 213 936 a 213 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 213 936 a 213 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3
+/TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 213 936 a 497
+836 a Ft(=)-6 b Fd(\))679 734 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.384
+0.09999 false .5 17.328 InitRnode } NewNode end end
+ 679 734 a Fo(JOIN)763
+733 y Fv(a)782 738 y Fs(1)809 733 y Ft(=)10 b Fv(b)861
+738 y Fs(1)750 805 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr2r3 16 { .5 5.384
+0.09999 false .5 17.328 InitRnode } NewNode end end
+ 750 805 a Fo(JOIN)836 804 y Fv(b)851
+809 y Fs(2)878 804 y Ft(=)g Fv(c)930 809 y Fs(1)613 806
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+ 613 806 a Fo(RET)683 876 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+ 683 876 a Fo(RET)825 876
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+ 825 876 a Fo(RET)622 874 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 622 874 a Fv(R)649 879 y
+Fs(1)693 945 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 693 945 a Fv(R)720 950 y Fs(2)835 945
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 835 945 a Fv(R)862 950 y Fs(3)644 936 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 644 936 a 644
+936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNodejoinr2r3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 644 936 a 644 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 644 936 a 644 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3
+/TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 644 936
+a 644 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 644 936 a 644 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 644 936 a 644 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3
+/TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 644
+936 a 142 1021 a Fz(\(b\))j(Example)d(of)j(the)e(associati)o(vity)g
+(rule)h(applied)f(to)h(an)142 1072 y(operator)d(tree)p
+951 1121 2 440 v 1191 734 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.384
+0.09999 false .5 17.328 InitRnode } NewNode end end
+ 1191 734 a Fo(JOIN)1063 729
+y Fv(a)1082 734 y Fs(2)1109 729 y Ft(=)h Fv(c)1161 734
+y Fs(1)1121 805 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2 16 { .5 5.384
+0.09999 false .5 17.328 InitRnode } NewNode end end
+ 1121 805 a Fo(JOIN)993 804 y Fv(a)1012
+809 y Fs(1)1038 804 y Ft(=)h Fv(b)1091 809 y Fs(1)1054
+876 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+ 1054 876 a Fo(RET)1196 876 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+ 1196 876 a Fo(RET)1267
+806 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+ 1267 806 a Fo(RET)1064 945 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1064 945 a Fv(R)1091
+950 y Fs(1)1206 945 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1206 945 a Fv(R)1233 950 y Fs(2)1276
+874 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1276 874 a Fv(R)1303 879 y Fs(3)1086 936 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1086
+936 a 1086 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1086 936 a 1086 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNodejoinr1r2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1086 936 a 1086
+936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1086 936 a 1086 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1086 936 a 1086 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1086
+936 a 1086 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3
+/TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1086 936 a 1370 836 a Ft(=)-6 b Fd(\))1390
+838 y Fv(=)1552 734 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.384
+0.09999 false .5 17.328 InitRnode } NewNode end end
+ 1552 734 a Fo(JOIN)1623 805 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinr2r3 16 { .5 5.384
+0.09999 false .5 17.328 InitRnode } NewNode end end
+ 1623
+805 a Fo(JOIN)1485 806 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+ 1485 806 a Fo(RET)1556 876 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+
+1556 876 a Fo(RET)1698 876 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.384 0.0
+false .5 15.112 InitRnode } NewNode end end
+ 1698 876 a Fo(RET)1495 874
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1495 874 a Fv(R)1522 879 y Fs(1)1566 945 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1566 945
+a Fv(R)1593 950 y Fs(2)1707 945 y
+ tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111
+false .5 10.56842 InitRnode } NewNode end end
+ 1707 945 a Fv(R)1734
+950 y Fs(3)1517 936 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1517 936 a 1517 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3
+/TheNodejoinr2r3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1517 936
+a 1517 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3
+/TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1517 936 a 1517 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3
+/TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1517 936 a 1517 936
+a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1
+/TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1517 936 a 1517 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2
+/TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1517 936 a 1517 936 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3
+/TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1517 936
+a 1015 1021 a Fz(\(c\))11 b(Example)f(of)i(an)e(operator)h(tree)g
+(where)f(the)h(associa-)1015 1072 y(ti)o(vity)f(rule)g(does)d(not)j
+(apply)p 1868 1134 2 1122 v 75 1136 1796 2 v 1869 1144
+10 1126 v 83 1144 1796 10 v 727 1247 a FG(Figure)i(3:)j(Join)10
+b(associati)o(vity)p 85 1392 1773 2 v 85 1806 2 414 v
+122 1432 a Fp(E)r Fi(\()p Fp(x)189 1436 y Fs(1)206 1432
+y Fp(;)c(:)g(:)g(:)g(;)g(x)313 1436 y Fh(n)334 1432 y
+Fi(\))11 b(:)f Fg(D)415 1436 y Ff(1)445 1432 y Fi(=)-6
+b Fe(\))11 b Fp(A)p Fi(\()p Fp(x)584 1436 y Fs(1)600
+1432 y Fp(;)6 b(:)h(:)f(:)g(;)g(x)708 1436 y Fh(n)729
+1432 y Fi(\))k(:)h Fg(D)810 1436 y Ff(2)1788 1432 y Fz(\(3\))122
+1482 y(test)122 1533 y Fe(ff)230 1583 y Fz(pre-opt)f(statements)122
+1633 y Fe(gg)122 1683 y(ff)230 1734 y Fz(post-opt)f(statements)122
+1784 y Fe(gg)p 1855 1806 V 85 1808 1773 2 v 1856 1816
+10 418 v 93 1816 1773 10 v 654 1919 a FG(Figure)i(4:)16
+b(General)11 b(form)h(of)f(an)h(I-rule)75 2099 y Fy(2.4)50
+b(Implementation)12 b(rules)75 2192 y FG(Implementation)d(rules,)i(or)f
+(I-rules)g(for)h(short,)f(de\256ne)g(equi)o(v)o(alences)f(between)h(e)o
+(xpressions)f(and)h(their)g(imple-)75 2254 y(menting)f(algorithms.)15
+b(Let)10 b Fw(E)i FG(be)e(an)g(e)o(xpression)f(and)h
+Fw(A)g FG(be)g(an)g(algorithm)f(that)h(implements)f Fw(E)s
+FG(.)15 b(The)10 b(general)75 2316 y(form)i(of)f(an)g(I-rule)h(is)e(gi)
+o(v)o(en)h(by)g(Equation)e(\(3\))i(\(sho)o(wn)f(in)h(Figure)g(4\).)137
+2378 y(The)f(actions)e(associated)h(with)f(an)i(I-rule)f(are)i
+(de\256ned)e(in)g(three)h(parts.)15 b(The)10 b(\256rst)f(part,)h(or)g
+FB(test)p FG(,)f(is)g(a)h(boolean)75 2440 y(e)o(xpression)g(whose)h(v)o
+(alue)f(determines)h(whether)g(or)g(not)g(the)f(rule)h(can)h(be)f
+(applied.)137 2503 y(The)17 b(second)g(part,)i(or)e FB(pr)n(e-opt)f
+(statements)p FG(,)h(is)g(a)g(set)g(of)g(descriptor)f(assignment)g
+(statements)g(that)h(are)75 2565 y(e)o(x)o(ecuted)f(only)f(if)h(the)g
+(test)f(is)g(true)h(and)g FB(befor)n(e)g FG(an)o(y)g(of)g(the)f(inputs)
+g Fw(x)1249 2572 y Fv(i)1279 2565 y FG(of)h Fw(E)i FG(are)f(optimized.)
+30 b(Additional)75 2627 y(parameters)12 b(of)f(nodes)g(are)h(usually)d
+(assigned)h(in)h(the)g(pre-opt)g(section.)16 b(This)10
+b(is)h(necessary)g(before)h(an)o(y)f(of)g(the)964 2793
+y(8)p eop
+%%Page: 9 9
+9 8 bop 85 12 1773 2 v 85 426 2 414 v 122 52 a Fz(SOR)n(T)o
+Fi(\()p Fp(S)253 56 y Fs(1)270 52 y Fi(\))11 b(:)f Fg(D)351
+56 y Ff(2)381 52 y Fi(=)-6 b Fe(\))11 b Fz(Mer)o(ge)p
+553 52 12 2 v 13 w(sort)p Fi(\()p Fp(S)658 56 y Fs(1)676
+52 y Fi(\))f(:)h Fg(D)757 56 y Ff(3)1788 52 y Fz(\(4\))122
+103 y Fi(\()p Fg(D)171 107 y Ff(2)190 103 y Fp(:)p Fz(tuple)p
+278 103 V 13 w(order)e Fi(!)t(=)h Fz(DONT)p 538 103 V
+14 w(CARE)o Fi(\))122 153 y Fe(ff)230 203 y Fg(D)264
+207 y Ff(3)294 203 y Fi(=)h Fg(D)369 207 y Ff(2)397 203
+y Fi(;)122 253 y Fe(gg)122 304 y(ff)230 354 y Fg(D)264
+358 y Ff(3)284 354 y Fp(:)p Fz(cost)e Fi(=)i Fg(D)440
+358 y Ff(1)459 354 y Fp(:)p Fz(cost)c Fi(+)i(\()p Fg(D)626
+358 y Ff(3)645 354 y Fp(:)p Fz(num)p 725 354 V 12 w(records)o
+Fi(\))g Fe(\003)g Fi(log)q(\()p Fg(D)995 358 y Ff(3)1014
+354 y Fp(:)p Fz(num)p 1094 354 V 13 w(records)o Fi(\))g(;)122
+404 y Fe(gg)p 1855 426 2 414 v 85 428 1773 2 v 1856 436
+10 418 v 93 436 1773 10 v 650 539 a FG(Figure)i(5:)16
+b(Mer)o(ge-sort)11 b(sort)g(algorithm)75 719 y(nodes)f(on)h(the)g
+(right)f(side)h(can)g(be)h(optimized.)137 782 y(The)19
+b(third)f(part,)i(or)f FB(post-opt)e(statements)p FG(,)i(is)f(a)h(set)g
+(of)g(descriptor)e(assignment)h(statements)f(that)i(are)75
+844 y(e)o(x)o(ecuted)f FB(after)f FG(all)g Fw(x)446 851
+y Fv(i)477 844 y FG(are)h(optimized.)34 b(Normally)m(,)19
+b(the)e(post-opt)e(statements)i(compute)g(cost)f(properties)75
+906 y(that)f(can)g(only)g(be)g(determined)g(once)g(the)g(inputs)f(to)h
+(the)g(algorithm)f(are)i(completely)e(optimized)h(and)g(their)75
+968 y(costs)e(kno)o(wn.)25 b(This)14 b FB(does)g(not)p
+FG(,)g(ho)o(we)o(v)o(er)n(,)i(imply)e(a)g(bottom-up)f(optimization)g
+(strate)o(gy)m(.)25 b(It)15 b(simply)e(means)75 1030
+y(that)f(although)g(I-rules)g(are)i(applied)e(to)g(parents)h(before)g
+(their)f(children)g(are)i(optimized,)f(the)g FB(cost)g
+FG(\(and)g(other)75 1092 y(properties)h(in)g(the)h(post-opt)e
+(section\))h(of)h(the)g(parent)f(cannot)g(be)h(computed)g(until)e(the)i
+(children)f(ha)o(v)o(e)h(been)75 1154 y(optimized.)75
+1266 y(E)p Fn(XAMPLE)e FG(5.)78 b(Equation)11 b(\(4\))h(\(in)g(Figure)g
+(5\))g(sho)o(ws)e(the)i(I-rule)g(that)g(implements)f(the)h(SOR)m(T)h
+(operator)f(by)75 1328 y(Mer)o(ge)p 195 1328 14 2 v 17
+w(sort.)21 b(I-rule)13 b(\(4\))g(re)o(writes)f(a)i(stream)f(such)f
+(that)g(it)h(is)f(sorted)g(using)g(the)g(Mer)o(ge)p 1499
+1328 V 18 w(sort)g(algorithm.)20 b(The)75 1390 y(test)14
+b(for)h(this)f(I-rule)h(is)g(that)f(the)h(tuple)f(order)h(of)g(the)g
+(sorted)f(stream)h(must)g(not)f(be)h(a)g(DONT)p 1621
+1390 V 16 w(CARE)g(order)m(.)75 1452 y(The)g(pre-opt)g(section)f
+(consists)g(of)h(the)g(default)f(statement)h(that)g(copies)f(the)h
+(descriptor)g(from)h(the)f(left)g(side)75 1515 y(to)g(the)f(e)o
+(xpression)g(on)h(the)g(right.)27 b(The)15 b(post-opt)e(section)h
+(consists)g(of)h(a)g(cost-assigning)d(statement)j(to)f(the)75
+1577 y(Mer)o(ge)p 195 1577 V 17 w(sort)d(node.)1451 b
+Fm(\003)75 1722 y FG(E)p Fn(XAMPLE)13 b FG(6.)74 b(Equation)7
+b(\(5\))i(\(sho)o(wn)e(in)h(Figure)g(6\))h(is)e(the)i(I-rule)f(that)g
+(selects)f(the)i(Nested)p 1579 1722 V 15 w(loops)e(algorithm)75
+1784 y(to)12 b(implement)g(the)h(JOIN)f(operator)m(.)20
+b(The)13 b(test)f(for)g(this)g(rule)g(is)g(TR)n(UE)h(since)f(Nested)p
+1486 1784 V 16 w(loops)f(can)i(be)f(applied)75 1846 y(re)o(gardless)k
+(of)h(an)o(y)h(property)e(v)o(alues.)33 b(The)17 b(pre-opt)f(section)g
+(consists)f(of)i(three)g(assignment)f(statements.)75
+1908 y(The)11 b(\256rst)h(statement)e(sets)h(the)g(descriptor)g(of)g
+(Nested)p 945 1908 V 16 w(loops)f(to)h(that)f(of)i(the)f(JOIN.)g(The)h
+(ne)o(xt)f(two)f(statements)75 1970 y(e)o(xpress)i(the)f(fact)h(that)f
+(the)g(tuple)g(order)h(of)g(Nested)p 908 1970 V 15 w(loops)f(is)g(the)h
+(same)g(as)g(the)f(tuple)g(order)h(of)g(its)f(left)g(\(outer\))75
+2032 y(input;)h(all)g(other)g(properties)g(remain)h(the)f(same.)21
+b(The)13 b(third)f(statement)g(in)g(the)g(pre-opt)g(section)g(ensures)g
+(that)75 2094 y(this)e(requirement)h(is)g(met)g(by)g(setting)f(the)h
+(tuple)p 856 2094 V 15 w(order)g(of)g Fw(S)1052 2101
+y Ft(1)1083 2094 y FG(on)g(the)g(right)f(side.)1389 2078
+y Ft(5)p 75 2135 720 2 v 125 2162 a Fs(5)142 2178 y Fz(Actually)n(,)17
+b(it)f(is)f(not)g(enough)f(to)h(simply)g(set)g(the)g(desired)g(tuple)g
+(order)g(of)g Fp(S)1216 2182 y Fs(1)1234 2178 y Fz(;)k(it)d(is)f(also)g
+(necessary)e(to)i(ensure)f(that)h Fr(after)75 2228 y
+Fz(optimization,)e Fp(S)309 2232 y Fs(1)339 2228 y Fz(does)d(indeed)h
+(ha)o(v)o(e)g(the)h(required)f(property)n(.)21 b(One)12
+b(way)f(to)h(satisfy)f(this)h(is)g(to)g(insert)h(a)e(SOR)n(T)g(node)g
+(in)h(front)h(of)75 2278 y Fp(S)98 2282 y Fs(1)126 2278
+y Fz(that)d(can)g(meet)g(the)g(sortedness)e(requirement)i(of)g
+Fp(S)815 2282 y Fs(1)833 2278 y Fz(.)17 b(Thus,)9 b(in)i(this)f(case,)f
+(we)h(would)g(need)e(a)i(T)m(-rule)h(\(which)f(introduces)f(a)h(ne)o(w)
+75 2328 y(operator)f(JOPR\),)75 2412 y(JOIN)p Fi(\()p
+Fp(S)194 2416 y Fs(1)212 2412 y Fp(;)d(S)252 2416 y Fs(2)269
+2412 y Fi(\))11 b(:)f Fg(D)350 2416 y Ff(3)380 2412 y
+Fi(=)-6 b Fe(\))11 b Fz(JOPR)o Fi(\()p Fz(SOR)n(T)o Fi(\()p
+Fp(S)686 2416 y Fs(1)704 2412 y Fi(\))f(:)h Fg(D)785
+2416 y Ff(4)804 2412 y Fp(;)6 b Fz(SOR)n(T)o Fi(\()p
+Fp(S)952 2416 y Fs(2)970 2412 y Fi(\))11 b(:)f Fg(D)1051
+2416 y Ff(5)1070 2412 y Fi(\))h(:)f Fg(D)1151 2416 y
+Ff(6)1170 2412 y Fp(;)75 2495 y Fz(and)e(an)h(I-rule,)75
+2579 y(JOPR)o Fi(\()p Fp(S)200 2583 y Fs(1)218 2579 y
+Fp(;)d(S)258 2583 y Fs(2)276 2579 y Fi(\))k(:)h Fg(D)357
+2583 y Ff(3)387 2579 y Fi(=)-6 b Fe(\))10 b Fz(Nested)p
+566 2579 12 2 v 12 w(loops)o Fi(\()p Fp(S)695 2583 y
+Fs(1)724 2579 y Fi(:)g Fg(D)779 2583 y Ff(4)798 2579
+y Fp(;)c(S)838 2583 y Fs(2)856 2579 y Fi(\))11 b(:)f
+Fg(D)937 2583 y Ff(5)956 2579 y Fp(:)75 2662 y Fz(In)f(our)h
+(discussions,)c(this)k(additional)f(le)o(v)o(el)g(of)h(detail)f(will)h
+(be)f(ignored)f(for)i(the)f(sake)f(of)h(simplicity)n(.)964
+2793 y FG(9)p eop
+%%Page: 10 10
+10 9 bop 85 12 1773 2 v 85 526 2 515 v 122 52 a Fz(JOIN)o
+Fi(\()p Fp(S)240 56 y Fs(1)258 52 y Fp(;)6 b(S)298 56
+y Fs(2)316 52 y Fi(\))11 b(:)f Fg(D)397 56 y Ff(3)427
+52 y Fi(=)-6 b Fe(\))10 b Fz(Nested)p 606 52 12 2 v 13
+w(loops)n Fi(\()p Fp(S)735 56 y Fs(1)764 52 y Fi(:)g
+Fg(D)819 56 y Ff(4)838 52 y Fp(;)c(S)878 56 y Fs(2)896
+52 y Fi(\))11 b(:)f Fg(D)977 56 y Ff(5)1788 52 y Fz(\(5\))122
+103 y(TR)o(UE)122 153 y Fe(ff)230 203 y Fg(D)264 207
+y Ff(5)294 203 y Fi(=)h Fg(D)369 207 y Ff(3)397 203 y
+Fi(;)230 253 y Fg(D)264 257 y Ff(4)294 253 y Fi(=)g Fg(D)369
+257 y Ff(1)397 253 y Fi(;)230 304 y Fg(D)264 308 y Ff(4)284
+304 y Fp(:)p Fz(tuple)p 372 304 V 13 w(order)f Fi(=)h
+Fg(D)547 308 y Ff(3)566 304 y Fp(:)p Fz(tuple)p 654 304
+V 13 w(order)e Fi(;)122 354 y Fe(gg)122 404 y(ff)230
+454 y Fg(D)264 458 y Ff(5)284 454 y Fp(:)p Fz(cost)g
+Fi(=)i Fg(D)440 458 y Ff(4)459 454 y Fp(:)p Fz(cost)c
+Fi(+)i(\()p Fg(D)626 458 y Ff(4)645 454 y Fp(:)p Fz(num)p
+725 454 V 12 w(records)o Fi(\))g Fe(\003)g Fg(D)931 458
+y Ff(2)950 454 y Fp(:)p Fz(cost)f Fi(;)122 504 y Fe(gg)p
+1855 526 2 515 v 85 528 1773 2 v 1856 536 10 518 v 93
+536 1773 10 v 631 640 a FG(Figure)j(6:)16 b(Nested)10
+b(loops)g(join)g(algorithm)137 820 y(The)i(post-opt)e(section)h(is)h(e)
+o(x)o(ecuted)g(after)g Fw(S)860 827 y Ft(1)892 820 y
+FG(and)g Fw(S)998 827 y Ft(2)1030 820 y FG(are)g(optimized;)f(it)h
+(consists)e(of)i(a)g(single)f(statement)75 882 y(that)d(assigns)f(the)i
+(cost)f(of)h(the)f(Nested)p 680 882 14 2 v 16 w(loops)f(node.)16
+b(The)8 b(cost)g(is)h(indicati)o(v)o(e)e(of)i(the)f(fact)h(that)f(in)g
+(this)g(algorithm,)75 944 y(each)k(tuple)e(of)h(the)g(stream)h
+Fw(S)549 951 y Ft(1)580 944 y FG(in)n(v)o(olv)o(es)e(scanning)f(the)i
+(entire)g(stream)h Fw(S)1257 951 y Ft(2)1276 944 y FG(;)f
+Fw(S)1328 951 y Ft(1)1359 944 y FG(is)g(scanned)g(only)f(once.)92
+b Fm(\003)75 1108 y Fy(2.5)50 b(Null)12 b(algorithm)75
+1201 y FG(Recall)e(that,)g(in)g(Section)f(1,)i(we)f(mentioned)f(that)g
+(Prairie)h(allo)o(ws)f(users)h(to)f(treat)h(all)g(operators)f(and)h
+(algorithms)75 1263 y(as)f(\256rst-class)f(objects,)h(i.e.,)h(all)f
+(operators)f(and)g(algorithms)g(are)h(e)o(xplicit,)g(in)f(contrast)g
+(to)g(enforcers)i(in)e(V)-6 b(olcano)75 1325 y(or)13
+b(glue)f(in)g(Starb)o(urst.)21 b(This)12 b(requires)g(that)g(Prairie)h
+(pro)o(vide)f(a)i(mechanism)f(where)g(users)f(can)h(also)f
+(\252delete\272)75 1387 y(one)i(or)g(more)h(of)f(the)g(e)o(xplicit)f
+(operators)g(from)i(e)o(xpressions.)23 b(This)14 b(is)f(done)h(by)f(ha)
+o(ving)h(a)g(special)g(class)f(of)75 1449 y(I-rules)f(that)g(ha)o(v)o
+(e)h(the)f(form)g(gi)o(v)o(en)g(by)g(Equation)f(\(6\))h(in)g(Figure)g
+(7\(a\).)20 b(The)13 b(left)f(side)f(of)i(the)f(rule)g(is)g(a)g(single)
+75 1511 y(abstract)k(operator)g Fw(O)i FG(with)d(one)h(stream)h(input)e
+Fw(S)909 1518 y Ft(1)929 1511 y FG(.)33 b(The)16 b(right)g(side)f(of)i
+(the)f(rule)g(is)g(an)h(algorithm)e(called)75 1573 y(\252Null\272)e
+(with)f(the)h(same)h(stream)f(input)f(b)o(ut)h(with)f(a)h(dif)o(ferent)
+g(descriptor)m(.)22 b(As)13 b(the)g(name)h(suggests,)e(the)h(Null)75
+1635 y(algorithm)d(is)g(supposed)g(to)g(pass)g(its)h(input)e(unchanged)
+h(to)h(algorithms)e(abo)o(v)o(e)i(it)g(in)f(an)h(operator)g(tree.)17
+b(This)10 b(is)75 1697 y(accomplished)g(in)h(the)g(I-rule)g(as)g(follo)
+o(ws.)137 1759 y(The)h(test)g(for)g(this)f(I-rule)h(is)g(always)e(TR)n
+(UE,)j(i.e.,)g(an)o(y)f(node)g(in)g(an)g(operator)g(tree)g(with)f
+Fw(O)i FG(as)f(its)g(operator)75 1822 y(can)j(be)g(implemented)g(by)f
+(the)h(Null)f(algorithm.)27 b(The)15 b(actions)f(associated)g(with)g
+(this)g(rule)g(ha)o(v)o(e)i(a)f(speci\256c)75 1884 y(pattern.)21
+b(The)13 b(pre-opt)f(section)g(consists)f(of)i(three)g(statements.)21
+b(The)12 b(\256rst)h(statement)f(copies)h(the)f(descriptor)75
+1946 y(of)g(the)g(operator)g Fw(O)i FG(to)e(the)g(algorithm)f(Null.)19
+b(The)13 b(second)e(statement)h(sets)g(the)g(descriptor)f(of)i(the)f
+(stream)g Fw(S)1855 1953 y Ft(1)75 2008 y FG(on)g(the)g(right)g(side)f
+(to)h(the)h(descriptor)e(of)h(the)g(stream)h Fw(S)976
+2015 y Ft(1)1008 2008 y FG(on)f(the)h(left)f(side.)19
+b(Why)12 b(is)g(it)g(necessary)g(to)g(do)g(this?)75 2070
+y(The)f(ke)o(y)f(lies)h(in)f(the)h(third)f(statement.)16
+b(This)10 b(statement)g(copies)g(the)h(property)f(\252property\272)h
+(of)g(the)f(operator)h Fw(O)75 2132 y FG(node)g(on)g(the)g(left)g(side)
+g(to)g(the)g(\252property\272)g(of)h(the)f(input)f(stream)i
+Fw(S)1159 2139 y Ft(1)1190 2132 y FG(on)f(the)g(right)g(side.)16
+b(Since)c(left-hand)f(side)75 2194 y(descriptors)h(cannot)g(be)i
+(changed)f(in)f(an)i(I-rule,)g(a)g(ne)o(w)f(descriptor)f
+Fl(D)1232 2201 y Fk(3)1268 2194 y FG(is)h(necessary)g(for)g
+Fw(S)1596 2201 y Ft(1)1629 2194 y FG(to)g(con)n(v)o(e)o(y)g(the)75
+2256 y(property)d(propagation)g(information.)137 2318
+y(The)h(post-opt)f(section)g(in)g(the)h(I-rule)g(has)g(only)f(a)i
+(cost-assignment)d(statement;)h(this)g(simply)g(sets)h(the)g(cost)75
+2380 y(of)g(the)g(Null)f(node)h(to)g(the)g(cost)f(of)h(its)g(optimized)
+f(input)g(stream.)137 2443 y(The)h(Null)f(algorithm,)h(therefore,)h
+(serv)o(es)f(to)g(ef)o(fecti)o(v)o(ely)g(transform)g(a)g(single)f
+(operator)h(to)g(a)g(no-op.)75 2554 y(E)p Fn(XAMPLE)i
+FG(7.)80 b(Equation)12 b(\(7\))i(\(in)f(Figure)h(7\(b\)\))g(sho)o(ws)e
+(the)i(I-rule)g(that)f(re)o(writes)g(the)h(SOR)m(T)g(operator)g(to)75
+2617 y(use)f(a)g(Null)e(algorithm.)21 b(The)12 b(third)g(pre-opt)g
+(statement)g(sets)h(the)f(tuple)g(order)h(of)f Fw(S)1439
+2624 y Ft(1)1472 2617 y FG(on)g(the)h(right)f(side)g(to)g(be)952
+2793 y(10)p eop
+%%Page: 11 11
+11 10 bop 75 12 1800 2 v 75 679 2 667 v 135 61 a Fp(O)q
+Fi(\()p Fp(S)203 65 y Fs(1)221 61 y Fi(\))10 b(:)g Fg(D)301
+65 y Ff(2)331 61 y Fi(=)-6 b Fe(\))11 b Fz(Null)p Fi(\()p
+Fp(S)508 65 y Fs(1)537 61 y Fi(:)f Fg(D)592 65 y Ff(3)611
+61 y Fi(\))h(:)f Fg(D)692 65 y Ff(4)919 61 y Fz(\(6\))135
+111 y(TR)o(UE)135 161 y Fe(ff)244 211 y Fg(D)278 215
+y Ff(4)307 211 y Fi(=)h Fg(D)382 215 y Ff(2)411 211 y
+Fi(;)244 262 y Fg(D)278 266 y Ff(3)307 262 y Fi(=)g Fg(D)382
+266 y Ff(1)411 262 y Fi(;)244 312 y Fg(D)278 316 y Ff(3)297
+312 y Fp(:)p Fz(property)f Fi(=)g Fg(D)519 316 y Ff(2)538
+312 y Fp(:)p Fz(property)f Fi(;)135 362 y Fe(gg)135 412
+y(ff)244 463 y Fg(D)278 467 y Ff(4)297 463 y Fp(:)p Fz(cost)g
+Fi(=)i Fg(D)453 467 y Ff(3)472 463 y Fp(:)p Fz(cost)d
+Fi(;)135 513 y Fe(gg)284 616 y Fz(\(a\))h(General)g(form)h(of)f(a)g
+(\252Null\272)g(I-rule)p 985 666 2 642 v 1010 52 a(SOR)n(T)o
+Fi(\()p Fp(S)1141 56 y Fs(1)1159 52 y Fi(\))h(:)h Fg(D)1240
+56 y Ff(2)1269 52 y Fi(=)-6 b Fe(\))11 b Fz(Null)p Fi(\()p
+Fp(S)1446 56 y Fs(1)1475 52 y Fi(:)f Fg(D)1530 56 y Ff(3)1549
+52 y Fi(\))h(:)f Fg(D)1630 56 y Ff(4)1794 52 y Fz(\(7\))1010
+111 y(TR)o(UE)1010 161 y Fe(ff)1119 211 y Fg(D)1153 215
+y Ff(4)1183 211 y Fi(=)g Fg(D)1257 215 y Ff(2)1286 211
+y Fi(;)1119 262 y Fg(D)1153 266 y Ff(3)1183 262 y Fi(=)g
+Fg(D)1257 266 y Ff(1)1286 262 y Fi(;)1119 312 y Fg(D)1153
+316 y Ff(3)1172 312 y Fp(:)p Fz(tuple)p 1260 312 12 2
+v 13 w(order)g Fi(=)h Fg(D)1435 316 y Ff(2)1454 312 y
+Fp(:)p Fz(tuple)p 1542 312 V 13 w(order)e Fi(;)1010 362
+y Fe(gg)1010 412 y(ff)1119 463 y Fg(D)1153 467 y Ff(4)1172
+463 y Fp(:)p Fz(cost)g Fi(=)i Fg(D)1328 467 y Ff(3)1347
+463 y Fp(:)p Fz(cost)d Fi(;)1010 513 y Fe(gg)1248 616
+y Fz(\(b\))i(Null)g(sort)f(algorithm)p 1873 679 2 667
+v 75 681 1800 2 v 1874 688 10 670 v 83 688 1800 10 v
+612 792 a FG(Figure)i(7:)16 b(The)11 b(\252Null\272)f(algorithm)h
+(concept)75 972 y(the)g(tuple)g(order)h(of)g(the)f(SOR)m(T)h(node,)g
+(thus)e(ensuring)h(that)g(when)g Fw(S)1181 979 y Ft(1)1213
+972 y FG(is)g(optimized)f(on)i(the)f(right)g(side,)g(it)g(will)75
+1034 y(ha)o(v)o(e)h(the)e(same)i(tuple)f(order)g(as)g(the)g(SOR)m(T)h
+(node.)947 b Fm(\003)75 1221 y FC(3)60 b(The)14 b(P2V)h(pr)o(e-pr)o
+(ocessor)75 1330 y FG(In)i(Section)f(1,)j(we)e(enumerated)g(the)g(four)
+f(primary)h(goals)f(of)h(Prairie,)i(viz.,)g(uniformity)c(in)i(operator)
+f(and)75 1393 y(algorithms;)6 b(uniformity)h(in)g(properties;)e
+(uniformity)i(in)g(property)o(-transformatio)o(ns;)e(and)i(ef)o
+(\256cient)g(generation)75 1455 y(of)i(Prairie)g(optimizers.)15
+b(The)9 b(\256rst)g(three)g(goals)f(are)i(dri)o(v)o(en)f(by)f(the)h
+(need)g(for)g(conceptual)f(simplicity;)g(ho)o(we)o(v)o(er)n(,)75
+1517 y(the)o(y)16 b(alone)g(do)f(not)h(necessarily)f(generate)h(ef)o
+(\256cient)g(optimizers.)31 b(The)16 b(P2V)g(pre-processor)f(ensures)h
+(that)75 1579 y(ef)o(\256cient)d(optimizers)g(can)g(be)g(realized)h
+(from)f(Prairie)h(speci\256cations,)f(by)g(translating)e(them)i(to)g
+(the)g(V)-6 b(olcano)75 1641 y(frame)o(work)15 b(and)f(then)g
+(generating)g(an)h(optimizer)f(by)g(compiling)g(with)f(the)i(V)-6
+b(olcano)14 b(search)h(engine.)26 b(This)75 1703 y(Prairie)13
+b(optimizer)o(-generator)f(paradigm)h(is)g(sho)o(wn)e(schematically)h
+(in)h(Figure)f(8.)22 b(The)13 b(pre-processor)f(itself)75
+1765 y(is)h(4500)g(lines)g(of)k Fc(flex)e FG(and)f Fc(bison)h
+FG(code.)25 b(In)14 b(this)f(section,)h(we)g(describe)f(the)h
+(pre-processor)f(steps)g(and)75 1827 y(e)o(xplain)d(why)h(the)g
+(Prairie-to-V)-6 b(olcano)10 b(transformation)g(is)h(non-tri)o(vial.)75
+1958 y Fy(3.1)50 b(Corr)o(espondence)12 b(of)g(elements)h(in)f(Prairie)
+h(and)f(V)-5 b(olcano)75 2050 y FG(T)l(able)14 b(3)g(sho)o(ws)e(the)i
+(relationship)e(between)h(the)h(basic)f(elements)h(of)g(a)g(Prairie)h
+(and)e(V)-6 b(olcano)14 b(speci\256cation;)75 2113 y(these)c
+(correspondences)g(are)i(preserv)o(ed)f(by)g(the)f(P2V)h(pre-processor)
+m(.)17 b(Operators)10 b(and)h(algorithms)e(in)i(Prairie)75
+2175 y(correspond)f(directly)h(to)f(operators)h(and)g(algorithms,)f
+(respecti)o(v)o(ely)m(,)h(in)f(V)-6 b(olcano.)137 2237
+y(The)11 b(concept)f(of)h(enforcer)o(-operators)g(and)f(enforcer)o
+(-algorithms)g(needs)h(some)g(e)o(xplanation.)k(In)c(a)g(Prairie)75
+2299 y(speci\256cation,)f(one)h(can)h(ha)o(v)o(e)g(a)f(set)g(of)g
+(I-rules)g(of)g(the)g(form:)75 2394 y Fw(O)q Fj(\()p
+Fw(S)157 2401 y Ft(1)176 2394 y Fj(\))i(:)f Fl(D)272
+2401 y Fk(2)336 2394 y Fj(=)-8 b Fu(\))43 b Fw(A)485
+2401 y Ft(1)504 2394 y Fj(\()p Fw(S)550 2401 y Ft(1)570
+2394 y Fj(\))12 b(:)g Fl(D)665 2401 y Fk(3)346 2470 y
+Fu(\001)c(\001)g(\001)75 2546 y Fw(O)q Fj(\()p Fw(S)157
+2553 y Ft(1)176 2546 y Fj(\))13 b(:)f Fl(D)272 2553 y
+Fk(2)336 2546 y Fj(=)-8 b Fu(\))43 b Fw(A)485 2553 y
+Fv(n)508 2546 y Fj(\()p Fw(S)554 2553 y Ft(1)573 2546
+y Fj(\))13 b(:)f Fl(D)669 2553 y Fk(3)75 2621 y Fw(O)q
+Fj(\()p Fw(S)157 2628 y Ft(1)176 2621 y Fj(\))h(:)f Fl(D)272
+2628 y Fk(2)336 2621 y Fj(=)-8 b Fu(\))43 b FG(Null)n
+Fj(\()p Fw(S)577 2628 y Ft(1)609 2621 y Fj(:)12 b Fl(D)674
+2628 y Fk(3)697 2621 y Fj(\))g(:)h Fl(D)793 2628 y Fk(4)952
+2793 y FG(11)p eop
+%%Page: 12 12
+12 11 bop 90 12 1761 2 v 90 982 2 970 v 498 922 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 22.76219 170.71643
+204.85973 170.71643 204.85973 34.14328 22.76219 34.14328 /Lineto /lineto
+load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 45.52438 204.85973
+182.09753 204.85973 182.09753 182.09753 45.52438 182.09753 /Lineto
+/lineto load def false Polygon gsave 1. setgray fill grestore gsave
+0.8 SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial
+827 134 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.13687
+neg 72.34619 10.36934 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial FG(Prairie)11
+b(Rule)h(Set)498 922 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 113.81096 159.33534 113.81096 182.09753
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 45.52438 159.33534
+182.09753 159.33534 182.09753 136.57315 45.52438 136.57315 /Lineto
+/lineto load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap
+stroke grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial 800 318 a(P2V)f(Pre-processor)
+498 922 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 113.81096 113.81096 113.81096 136.57315
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 45.52438 113.81096
+182.09753 113.81096 182.09753 91.04877 45.52438 91.04877 /Lineto /lineto
+load def false Polygon gsave 0.5 setgray fill grestore gsave 0.8
+SLW 0. setgray 0 setlinecap stroke grestore end
+
+@endspecial 813 512 a @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.13687
+neg 78.83955 10.36934 .5 Frame gsave 1. setgray fill grestore end
+
+
+@endspecial(V)-6 b(olcano)11 b(Rule)g(Set)498 922 y
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 113.81096 68.28658 113.81096 91.04877
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 45.52438 68.28658
+182.09753 68.28658 182.09753 45.52438 45.52438 45.52438 /Lineto /lineto
+load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave 1.0 SLW 1. setgray stroke grestore end
+
+@endspecial 702 696 a(V)-6 b(olcano)11 b(Optimizer)g
+(Generator)498 922 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 113.81096 22.76219 113.81096 45.52438
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 45.52438 22.76219
+182.09753 22.76219 182.09753 0.0 45.52438 0.0 /Lineto /lineto load
+def false Polygon gsave 0.5 setgray fill grestore gsave 0.8 SLW 0.
+setgray 0 setlinecap stroke grestore end
+
+@endspecial 816 885 a @beginspecial
+@setspecial
+ tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3871
+neg 77.5037 10.36934 .5 Frame gsave 1. setgray fill grestore end
+
+@endspecial(Query)g(Optimizer)-788 b(Operator)11
+b(T)n(ree)498 922 y @beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 45.52438 11.38109 22.76219 11.38109
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial
+@beginspecial @setspecial
+ tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def
+/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4
+1.4 2.0 3. Arrow EndArrow } def [ 204.85973 11.38109 182.09753 11.38109
+ /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1.
+setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke
+ grestore gsave ArrowBc ArrowB pop pop pop pop grestore end
+
+@endspecial 1349 890 a(Access)g(Plan)p
+1850 982 V 90 984 1761 2 v 1850 992 10 974 v 99 992 1761
+10 v 75 1095 a(Figure)16 b(8:)26 b(The)17 b(Prairie)f(optimizer)o
+(-generator)g(paradigm.)32 b(Double-box)o(ed)15 b(modules)h(represent)g
+(software)75 1157 y(generators,)22 b(shaded)e(box)o(es)g(represent)f
+(generated)h(programs.)44 b(The)20 b(outermost)f(double-box)o(ed)g
+(portion)75 1220 y(denotes)10 b(the)h(Prairie)h(optimizer)e(generator)m
+(.)p 549 1368 852 7 v 549 1419 2 51 v 664 1404 a Fq(Prairie)p
+889 1419 V 304 w(V)l(olcano)p 1399 1419 V 549 1425 852
+7 v 549 1475 2 51 v 653 1460 a Fz(Operator)p 889 1475
+V 292 w(Operator)p 1399 1475 V 549 1477 852 2 v 549 1527
+2 51 v 642 1512 a(Algorithm)p 889 1527 V 270 w(Algorithm)p
+1399 1527 V 549 1529 852 2 v 549 1579 2 51 v 586 1564
+a(Enforcer)o(-operator)p 889 1579 V 273 w(\320)p 1399
+1579 V 549 1581 852 2 v 549 1631 2 51 v 576 1616 a(Enforcer)o
+(-algorithm)p 889 1631 V 216 w(Enforcer)p 1399 1631 V
+549 1632 852 2 v 549 1683 2 51 v 587 1668 a(\252Null\272)f(Algorithm)p
+889 1683 V 275 w(\320)p 1399 1683 V 549 1684 852 2 v
+549 1735 2 51 v 615 1720 a(Operator)g(T)o(ree)p 889 1735
+V 175 w(Logical)f(Expression)p 1399 1735 V 549 1736 852
+2 v 549 1787 2 51 v 629 1771 a(Access)f(Plan)p 889 1787
+V 183 w(Physical)g(Expression)p 1399 1787 V 549 1788
+852 2 v 549 1838 2 51 v 636 1872 a(Descriptor)p 889 1838
+V 915 1823 a(Operator/Algorithm)j(Ar)o(gument)p 1399
+1838 V 890 1840 511 2 v 549 1889 2 51 v 889 1889 V 1013
+1874 a(Physical)e(property)p 1399 1889 V 890 1890 511
+2 v 549 1939 2 51 v 889 1939 V 1110 1924 a(Cost)p 1399
+1939 V 549 1941 852 2 v 549 1991 2 51 v 701 1976 a(\320)p
+889 1991 V 281 w(Logical)g(Property)p 1399 1991 V 549
+1992 852 2 v 549 2043 2 51 v 701 2028 a(\320)p 889 2043
+V 283 w(System)g(Property)p 1399 2043 V 549 2049 852
+7 v 427 2125 a FG(T)l(able)j(3:)16 b(Correspondence)11
+b(of)g(elements)g(in)f(Prairie)i(and)f(V)-6 b(olcano)75
+2305 y(i.e.,)12 b(an)e(operator)g Fw(O)i FG(has)e(algorithms)f
+Fw(A)725 2312 y Ft(1)756 2305 y FG(through)g Fw(A)942
+2312 y Fv(n)966 2305 y FG(,)i(and)f(Null,)g(as)h(implementations.)j
+(The)d(pre-processor)75 2367 y(classi\256es)k Fw(O)h
+FG(as)g(an)f FB(enfor)n(cer)o(-oper)o(ator)p FG(,)g(and)g(algorithms)f
+Fw(A)1096 2374 y Ft(1)1132 2367 y FG(through)g Fw(A)1323
+2374 y Fv(n)1362 2367 y FG(as)h FB(enfor)n(cer)o(-algorithms)p
+FG(.)26 b(An)75 2429 y(e)o(xample)12 b(of)f(an)h(enforcer)o(-operator)f
+(is)g(the)g(SOR)m(T)h(operator)n(,)f(and)h(an)f(enforcer)o(-algorithm)g
+(is)g(the)g(Mer)o(ge)p 1793 2429 14 2 v 17 w(sort)75
+2491 y(algorithm)e(\(sho)o(wn)g(in)h(T)l(able)g(1\).)17
+b(Enforcer)o(-algorithms)9 b(in)g(the)h(Prairie)h(model)f(are)h
+(translated)e(into)g(enforcers)75 2554 y(in)e(the)g(V)-6
+b(olcano)7 b(model;)f(enforcer)o(-operators)h(disappear)g(in)g(V)-6
+b(olcano)7 b(when)g(th)o(e)g(P2V)g(pre-processor)g(combi)o(nes)75
+2616 y(se)o(v)o(eral)k(I-rules)g(to)g(generate)g(a)h(V)-6
+b(olcano)10 b(rule)h(\(this)g(is)f(described)h(in)g(Section)f(3.3\).)
+952 2793 y(12)p eop
+%%Page: 13 13
+13 12 bop 137 14 a FG(Another)12 b(major)i(responsibilit)o(y)c(of)j
+(the)g(P2V)g(pre-processor)g(is)f(classifying)f(dif)o(ferent)i
+(properties)f(in)g(the)75 77 y(descriptor)m(.)25 b(V)-6
+b(olcano)14 b(forces)g(users)g(to)g(classify)f(properties)g(\(as)i
+(logical,)f(physical,)g(or)g(operator/algorithm)75 139
+y(ar)o(guments\))8 b(according)g(to)h(their)f(use.)15
+b(The)9 b(classi\256cation)e(of)h(properties)g(helps)g(optimize)f(the)i
+(performance)g(of)75 201 y(V)-6 b(olcano.)20 b(Unfortunately)m(,)11
+b(property)h(classi\256cation)f(is)h(actually)f(rule-dependent.)20
+b(That)12 b(is,)g(adding)g(another)75 263 y(rule)f(to)g(a)h(V)-6
+b(olcano)10 b(rule)i(set)f(may)g(cause)h(a)g(property)e(that)h(was)f
+(pre)o(viously)g(considered)g(\252logical\272)h(to)g(become)75
+325 y(\252physical\272,)d(or)h(vice)f(v)o(ersa.)16 b(Migrating)7
+b(properties)h(between)g(classi\256cations)e(entails)i(a)g
+(considerable)g(amount)75 387 y(of)g(reprogramming)g(on)g(the)g(user')m
+(s)g(part,)h(and)f(consequently)e(makes)i(V)-6 b(olcano)7
+b(rule)h(sets)g(rather)g(brittle.)14 b(Prairie,)75 449
+y(in)h(contrast,)i(does)e(not)g(ask)g(users)h(to)f(make)h(these)f
+(distinctions;)g(the)g(P2V)h(pre-processor)f(determines)g(the)75
+511 y(classi\256cation)e(of)i(properties)f(automatically)f(and)i(thus)f
+(signi\256cantly)f(facilitates)g(the)h(e)o(xtensibility)e(of)j(rule)75
+573 y(sets.)38 b(This)17 b(is)h(done)g(by)g(transforming)f(a)i(single)e
+(descriptor)g(structure)h(into)f(three)h(parts)g(\(see)h(T)l(able)f
+(3\):)75 635 y(an)i(operator/algorithm)e(ar)o(gument,)k(physical)d
+(properties)g(and)g(cost.)42 b(Brie\257y)m(,)23 b(physical)c
+(properties)g(are)75 698 y(properties)c(that)g(are)i(requested)e(by)h
+(the)f(user)n(,)j(cost)d(represents)h(an)g(estimate)f(of)h(an)g
+(algorithm')m(s)f(cost,)i(and)75 760 y(operator/algorithm)d(ar)o
+(guments)h(are)h(all)f(remaining)h(properties)e(\(including)g
+(additional)f(properties\).)29 b(The)75 822 y(pre-processor)7
+b(achie)o(v)o(es)g(the)g(classi\256cation)g(of)g(prop)o(erties)g(by)f
+(e)o(xamining)h(t)o(he)g(action)o(s)g(of)g(all)f(rules:)11
+b(a)c(property)75 884 y(with)i(a)i(type)f(\252COST\272)h(is)f
+(classi\256ed)f(as)i(a)f(cost)g(property)m(,)g(properties)f(changed)h
+(in)g(pre-opt)g(sections)f(of)h(I-rules)75 946 y(\(e.g.,)h(tuple)p
+272 946 14 2 v 15 w(order)e(in)f(I-rule)h(\(5\)\))g(are)h(physical)d
+(properties,)h(and)h(all)g(other)f(properties)g(are)h
+(operator/algorithm)75 1008 y(ar)o(guments.)137 1070
+y(Operator)g(trees)h(and)f(access)g(plans)g(in)g(Prairie)h(correspond)e
+(to)h(logical)f(and)h(physical)f(e)o(xpressions,)h(respec-)75
+1132 y(ti)o(v)o(ely)m(,)h(in)h(V)-6 b(olcano;)10 b(the)h(notations)e
+(are)j(v)o(ery)g(similar)m(.)75 1263 y Fy(3.2)50 b(Corr)o(espondence)12
+b(of)g(rules)75 1355 y Fx(3.2.1)45 b(T)l(-rules)75 1448
+y FG(T)l(-rules)7 b(in)g(Prairie)g(are)g(translated)g(to)g(trans)p
+763 1448 V 14 w(rules)g(\(transformation)g(rules\))g(in)g(V)-6
+b(olcano;)5 b(e)o(xpressions)i(occurring)75 1510 y(on)14
+b(either)g(side)g(of)g(a)h(T)l(-rule)f(are)h(transformed)f(into)f(V)-6
+b(olcano)14 b(logical)f(e)o(xpressions.)24 b(T)l(able)15
+b(4\(a\))f(sho)o(ws)f(the)75 1572 y(correspondence)h(between)f(Prairie)
+i(T)l(-rules)e(and)h(V)-6 b(olcano)14 b(trans)p 1152
+1572 V 15 w(rules.)25 b(The)14 b(join)f(associati)o(vity)f(trans)p
+1792 1572 V 15 w(rule)75 1635 y(\(corresponding)e(to)g(the)h(T)l(-rule)
+g(in)g(Figure)g(3\))g(in)g(V)-6 b(olcano)10 b(is)h(as)g(follo)o(ws)1256
+1618 y Ft(6)1274 1635 y FG(:)75 1730 y Fj(\()p FD(JOIN)g(?op)p
+256 1730 13 2 v 15 w(ar)o(g5)g Fj(\(\()p FD(JOIN)g(?op)p
+552 1730 V 15 w(ar)o(g4)g Fj(\(?1)g(?2\)\))g(?3\)\))41
+b Fu(\000)m Fw(>)i Fj(\()p FD(JOIN)11 b(?op)p 1225 1730
+V 15 w(ar)o(g7)g Fj(\(?1)g(\()p FD(JOIN)g(?op)p 1576
+1730 V 15 w(ar)o(g6)h Fj(\(?2)f(?3\)\)\)\))75 1825 y
+FG(The)f(pre-test)f(and)h(test)f(portions)g(of)h(a)g(T)l(-rule)g(are)g
+(mapped)g(to)g(the)g(cond)p 1232 1825 14 2 v 15 w(code)g(\(condition)e
+(code\))i(of)h(a)f(V)-6 b(olcano)75 1887 y(trans)p 167
+1887 V 16 w(rule,)21 b(and)f(the)f(post-test)e(portion)h(is)h(mapped)h
+(to)f(the)g(appl)p 1194 1887 V 15 w(code)h(\(application)d(code\).)42
+b(Ho)o(we)o(v)o(er)n(,)75 1949 y(e)o(xpressions)18 b(in)g(Prairie)i(T)l
+(-rules)e(can)i(contain)e(enforcer)o(-operators.)40 b(According)18
+b(to)h(T)l(able)g(3,)i(enforcer)o(-)75 2011 y(operators)7
+b(are)h(deleted)f(by)g(the)h(P2V)f(pre-processor)n(,)i(so)e(T)l(-rules)
+g(containing)f(enforcer)o(-operators)h(are)h(modi\256ed)75
+2074 y(before)g(being)g(translated)f(into)g(V)-6 b(olcano.)15
+b(Sometimes,)9 b(this)e(can)h(result)f(in)h(rules)g(that)f(can)i(be)f
+(further)g(combined)75 2136 y(into)i(one)h(as)g(an)h(optimization)d
+(measure;)i(this)f(is)h(discussed)f(in)g(Section)h(3.3.)75
+2264 y Fx(3.2.2)45 b(I-rules)75 2357 y FG(I-rules)10
+b(in)f(Prairie)i(correspond)e(to)h(impl)p 726 2357 V
+15 w(rules)g(\(implementation)f(rules\))g(in)h(V)-6 b(olcano;)9
+b(the)h(complete)g(relation-)75 2419 y(ship)i(is)h(sho)o(wn)e(in)i(T)l
+(able)g(4\(b\).)22 b(Ho)o(we)o(v)o(er)n(,)14 b(the)f(transformation)f
+(is)g(complicated)h(by)f(se)o(v)o(eral)i(factors.)21
+b(First,)75 2481 y(Prairie)14 b(adopts)f(a)i(per)o(-rule)f(approach)g
+(of)g(specifying)f(property)g(transformations,)h(i.e.,)h(properties)e
+(of)i(algo-)75 2543 y(rithms)9 b(are)i(speci\256ed)f(in)f(an)h(I-rule,)
+h(whereas)f(V)-6 b(olcano)9 b(adopts)g(a)h(per)o(-algorithm)f(approach)
+h(where)g(properties)p 75 2584 720 2 v 125 2614 a Fs(6)142
+2630 y Fz(There)f(are)g(conditions)f(and)g(actions)g(associated)f(with)
+j(V)-5 b(olcano)8 b(rules)h(that)g(are)g(not)g(sho)o(wn)f(here.)952
+2793 y FG(13)p eop
+%%Page: 14 14
+14 13 bop 212 214 665 7 v 212 264 2 51 v 316 249 a Fq(Prairie)p
+530 264 V 211 w(V)l(olcano)p 874 264 V 212 270 665 7
+v 212 320 2 51 v 327 305 a Fz(T)m(-rule)p 530 320 V 214
+w(trans)p 706 305 12 2 v 13 w(rule)p 874 320 2 51 v 212
+322 665 2 v 212 372 2 51 v 305 357 a(Operator)p 530 372
+V 199 w(Operator)p 874 372 V 212 374 665 2 v 212 424
+2 51 v 238 409 a(Enforcer)o(-operator)p 530 424 V 179
+w(\320)p 874 424 V 212 426 665 2 v 212 476 2 51 v 293
+461 a(Descriptor)p 530 476 V 106 w(Operator)9 b(Ar)o(gument)p
+874 476 V 212 478 665 2 v 212 528 2 51 v 275 513 a(Pre-test)g(code)p
+530 528 V 151 w(Cond)p 705 513 12 2 v 12 w(code)p 874
+528 2 51 v 212 530 665 2 v 212 580 2 51 v 341 565 a(T)m(est)p
+530 580 V 218 w(Cond)p 705 565 12 2 v 12 w(code)p 874
+580 2 51 v 212 581 665 2 v 212 632 2 51 v 267 617 a(Post-test)g(code)p
+530 632 V 147 w(Appl)p 701 617 12 2 v 13 w(code)p 874
+632 2 51 v 212 638 665 7 v 357 742 a(\(a\))h(T)o(ranslation)e(of)h(T)m
+(-rules)p 1034 58 744 7 v 1034 108 2 51 v 1166 93 a Fq(Prairie)p
+1409 108 V 251 w(V)l(olcano)p 1776 108 V 1034 114 744
+7 v 1034 165 2 51 v 1181 150 a Fz(I-rule)p 1409 165 V
+260 w(impl)p 1593 150 12 2 v 14 w(rule)p 1776 165 2 51
+v 1034 166 744 2 v 1034 217 2 51 v 1156 202 a(Operator)p
+1409 217 V 238 w(Operator)p 1776 217 V 1034 218 744 2
+v 1034 268 2 51 v 1145 253 a(Algorithm)p 1409 268 V 215
+w(Algorithm)p 1776 268 V 1034 270 744 2 v 1034 320 2
+51 v 1072 305 a(Operator)h(Descriptor)p 1409 320 V 74
+w(Operator)f(Ar)o(gument)p 1776 320 V 1034 322 744 2
+v 1034 372 2 51 v 1061 357 a(Algorithm)h(Descriptor)p
+1409 372 V 51 w(Algorithm)g(Ar)o(gument)p 1776 372 V
+1034 374 744 2 v 1034 424 2 51 v 1192 409 a(T)m(est)p
+1409 424 V 257 w(Cond)p 1595 409 12 2 v 12 w(code)p 1776
+424 2 51 v 1034 426 744 2 v 1034 476 2 51 v 1127 461
+a(Pre-opt)g(code)p 1409 476 V 161 w(\252do)p 1537 461
+12 2 v 13 w(an)o(y)p 1604 461 V 13 w(good\272)p 1776
+476 2 51 v 1034 478 744 2 v 1034 528 2 51 v 1120 513
+a(Post-opt)f(code)p 1409 528 V 129 w(\252deri)o(v)o(e)p
+1566 513 12 2 v 13 w(phy)p 1636 513 V 12 w(prop\272)p
+1776 528 2 51 v 1034 530 744 2 v 1034 580 2 51 v 1204
+565 a(\320)p 1409 580 V 305 w(\252cost\272)p 1776 580
+V 1034 581 744 2 v 1034 632 2 51 v 1204 617 a(\320)p
+1409 632 V 242 w(\252get)p 1548 617 12 2 v 13 w(input)p
+1638 617 V 13 w(pv\272)p 1776 632 2 51 v 1034 638 744
+7 v 1022 742 a(\(b\))16 b(T)o(ranslation)e(of)i(I-rules.)32
+b(Quoted)14 b(strings)h(denote)1022 792 y(helper)9 b(functions.)463
+918 y FG(T)l(able)j(4:)j(Correspondence)c(of)g(rules)g(in)g(Prairie)g
+(and)g(V)-6 b(olcano)75 1090 y(of)14 b(an)g(algorithm)f(are)i
+(speci\256ed)f(in)g(a)g(helper)g(function)f(for)h(that)g(algorithm.)24
+b(W)l(e)15 b(belie)o(v)o(e)f(that)f(the)h(per)o(-rule)75
+1152 y(approach)e(is)h(more)g(general)f(and)h(intuiti)o(v)o(e.)19
+b(The)12 b(generality)g(arises)g(from)h(the)g(fact)f(that)g(the)h
+(property)f(trans-)75 1214 y(formations)g(can)i(be)f(dif)o(ferent)g(in)
+g(dif)o(ferent)f(I-rules)h(for)h(the)f(same)g(algorithm;)g(thus,)g(the)
+g(per)o(-rule)g(approach)75 1277 y(is)i(a)h(superset)f(of)h(the)g(per)o
+(-algorithm)f(approach.)30 b(The)16 b(per)o(-rule)g(approach)f(is)g
+(intuiti)o(v)o(e)f(because)i(property)75 1339 y(mappings)10
+b(are)h(made)h(together)e(with)f(the)i(rule)g(in)n(v)o(ocation,)e
+(instead)h(of)h(a)g(logically)e(disjoint)g(helper)h(function.)137
+1401 y(The)j(second)g(complicating)f(factor)h(in)f(V)-6
+b(olcano)13 b(in)n(v)o(olv)o(es)f(the)h(reliance)g(on)g(se)o(v)o(eral)g
+(helper)g(functions)f(to)75 1463 y(achie)o(v)o(e)h(property)f
+(transformations.)21 b(F)o(or)13 b(instance,)g(using)f(Prairie)h
+(terminology)m(,)g(a)g(V)-6 b(olcano)12 b(implementa-)75
+1525 y(tion)h(rule)i(requires)f(an)g(additional)f(four)h(functions)f
+(\(called)h(\252do)p 1142 1525 14 2 v 16 w(an)o(y)p 1223
+1525 V 17 w(good\272,)h(\252cost\272,)g(\252get)p 1594
+1525 V 16 w(input)p 1705 1525 V 15 w(pv\272,)g(and)75
+1587 y(\252deri)o(v)o(e)p 210 1587 V 16 w(phy)p 295 1587
+V 16 w(prop\272\).)30 b(Although)14 b(the)h(purpose)g(of)h(these)g
+(functions)e(is)h(purportedly)f(to)i(enhance)g(V)-6 b(olcano)75
+1649 y(performance,)12 b(the)o(y)g(add)f(considerable)f(comple)o(xity)g
+(to)h(the)g(design)f(of)h(rule)g(sets.)17 b(Prairie,)12
+b(in)e(contrast,)h(elim-)75 1711 y(inates)i(the)g(need)g(for)h(users)f
+(to)g(specify)f(these)h(functions,)g(by)g(adopting)f(the)h(per)o(-rule)
+g(approach)h(of)f(property)75 1773 y(transformations;)i(as)g(sho)o(wn)f
+(in)h(T)l(able)g(4\(b\),)h(the)f(P2V)g(pre-processor)f(generates)h(two)
+f(of)h(these)g(functions)75 1835 y(\(\252do)p 159 1835
+V 16 w(an)o(y)p 240 1835 V 16 w(good\272)h(and)h(\252deri)o(v)o(e)p
+599 1835 V 16 w(phy)p 684 1835 V 15 w(prop\272\))g(automatically)e
+(from)i(I-rule)f(speci\256cations.)32 b(The)16 b(other)g(two)75
+1898 y(helper)11 b(functions)e(are)j(short-circuited,)d(suggesting)g
+(that)h(the)h(V)-6 b(olcano)10 b(model)h(and)f(implementation)g(is)g
+(actu-)75 1960 y(ally)h(more)g(complicated)g(than)f(it)h(needs)g(to)g
+(be.)75 2088 y Fy(3.3)50 b(Rule)12 b(merging)75 2181
+y FG(In)7 b(the)h(process)f(of)g(translating)f(Prairie)h
+(speci\256cations)f(to)h(V)-6 b(olcano,)8 b(se)o(v)o(eral)g
+(opportunities)t(arise)g(for)f(obtaining)75 2243 y(a)14
+b(compact)h(set)f(of)g(rules.)25 b(These)13 b(opportunities)f(arise)i
+(either)f(because)i(the)e(user)h(speci\256es)g(a)h(non-compact)75
+2305 y(set)e(of)f(rules,)i(or)f(because)f(of)h(the)g(translation)e
+(process)h(itself.)21 b(An)12 b(e)o(xample)i(of)f(the)f(latter)h(case)g
+(arises)g(when)75 2367 y(enforcer)o(-operators)g(are)h(deleted)e(by)h
+(the)f(P2V)h(pre-processor)m(.)22 b(Consider)n(,)14 b(for)f(e)o
+(xample,)h(the)f(follo)o(wing)e(set)75 2429 y(of)g(rules)g(in)g
+(Prairie:)83 2517 y(JOIN)o Fj(\()p Fw(S)227 2524 y Ft(1)246
+2517 y Fw(;)d(S)295 2524 y Ft(2)314 2517 y Fj(\))k(:)h
+Fl(D)410 2524 y Fk(3)474 2517 y Fj(=)-8 b Fu(\))42 b
+FG(JOPR)q Fj(\()p FG(SOR)m(T)p Fj(\()p Fw(S)872 2524
+y Ft(1)891 2517 y Fj(\))12 b(:)h Fl(D)987 2524 y Fk(4)1009
+2517 y Fw(;)8 b FG(SOR)m(T)p Fj(\()p Fw(S)1189 2524 y
+Ft(2)1208 2517 y Fj(\))k(:)g Fl(D)1303 2524 y Fk(5)1326
+2517 y Fj(\))g(:)h Fl(D)1422 2524 y Fk(6)135 2593 y FG(SOR)m(T)q
+Fj(\()p Fw(S)295 2600 y Ft(1)314 2593 y Fj(\))f(:)h Fl(D)410
+2600 y Fk(2)474 2593 y Fj(=)-8 b Fu(\))42 b FG(Null)o
+Fj(\()p Fw(S)715 2600 y Ft(1)747 2593 y Fj(:)12 b Fl(D)812
+2600 y Fk(3)835 2593 y Fj(\))g(:)g Fl(D)930 2600 y Fk(4)75
+2669 y FG(JOPR)p Fj(\()p Fw(S)227 2676 y Ft(1)246 2669
+y Fw(;)c(S)295 2676 y Ft(2)314 2669 y Fj(\))k(:)h Fl(D)410
+2676 y Fk(3)474 2669 y Fj(=)-8 b Fu(\))42 b FG(Nested)p
+718 2669 V 16 w(loops)o Fj(\()p Fw(S)876 2676 y Ft(1)907
+2669 y Fj(:)13 b Fl(D)973 2676 y Fk(4)995 2669 y Fw(;)8
+b(S)1044 2676 y Ft(2)1063 2669 y Fj(\))k(:)h Fl(D)1159
+2676 y Fk(5)952 2793 y FG(14)p eop
+%%Page: 15 15
+15 14 bop 75 14 a FG(The)17 b(\256rst)f(rule)h(is)f(a)h(T)l(-rule,)h
+(and)f(the)f(ne)o(xt)g(two)g(are)h(I-rules.)33 b(Note)17
+b(that)f(SOR)m(T)h(is)f(an)h(enforcer)o(-operator)75
+77 y(\(because)g(it)f(has)g(a)h(Null)e(implementation\),)i(so)f(it)g
+(is)g(deleted)g(in)g(the)h(transformation)e(process.)32
+b(The)16 b(\256rst)75 139 y(rule)c(then)f(becomes)h(a)g(mapping)f(from)
+h(one)g(operator)f(JOIN)h(to)f(another)g(JOPR)h(which)f(can)h(be)g(vie)
+o(wed)f(as)h(an)75 201 y(idempotence)g(mapping;)f(the)h(resulting)f
+(rule)h(set)g(can)g(be)g(optimized)g(by)f(deleting)g(this)g(idempotent)
+g(rule)h(and)75 263 y(replacing)f(all)g(occurrences)g(of)h(JOPR)g(with)
+e(JOIN.)h(Thus,)g(the)g(abo)o(v)o(e)h(set)f(of)h(Prairie)g(rules)f(can)
+g(be)h(combined)75 325 y(into)e(a)i(single)e(I-rule,)75
+420 y(JOIN)o Fj(\()p Fw(S)219 427 y Ft(1)239 420 y Fw(;)e(S)288
+427 y Ft(2)307 420 y Fj(\))k(:)g Fl(D)402 427 y Fk(3)437
+420 y Fj(=)-8 b Fu(\))14 b FG(Nested)p 653 420 14 2 v
+16 w(loops)n Fj(\()p Fw(S)810 427 y Ft(1)842 420 y Fj(:)e
+Fl(D)907 427 y Fk(4)930 420 y Fw(;)c(S)979 427 y Ft(2)998
+420 y Fj(\))k(:)g Fl(D)1093 427 y Fk(5)75 516 y FG(which)e(can)h(then)f
+(be)g(translated)g(into)f(a)i(V)-6 b(olcano)10 b(impl)p
+959 516 V 16 w(rule.)16 b(In)11 b(general,)g(the)f(number)g(of)h(T)l
+(-rules)f(in)g(a)h(Prairie)75 578 y(rule)g(set)g(is)g(equal)g(to)g(the)
+g(number)g(of)g(trans)p 776 578 V 16 w(rules)g(in)g(a)h(V)-6
+b(olcano)10 b(rule)h(set)g(plus)g(an)g(additional)e(T)l(-rule)i(for)h
+(each)75 640 y(operator)m(.)235 623 y Ft(7)279 640 y
+FG(Also,)i(the)f(number)h(of)g(I-rules)g(is)f(the)g(same)i(as)f(the)f
+(number)h(of)g(impl)p 1432 640 V 15 w(rules)g(plus)e(an)i(additional)75
+702 y(I-rule)j(for)f(each)h(enforcer)o(-operator)g(\(for)g(Null)e
+(implementations,)i(as)f(described)g(in)g(Section)g(2.5\))h(and)f(an)75
+764 y(additional)f(I-rule)i(for)g(each)g(enforcer)g(\(since)g
+(enforcers)g(appear)g(as)g(I-rules)f(in)h(Prairie,)h(instead)e(of)h
+(being)75 826 y(implicit,)c(as)h(in)e(V)-6 b(olcano\).)23
+b(The)14 b(lar)o(ger)f(number)h(of)f(rules)g(represents)g(a)h
+(conceptual)f(simpli\256cation)e(in)i(rule)75 888 y(writing.)23
+b(Ho)o(we)o(v)o(er)n(,)15 b(the)f(P2V)g(pre-processor)f(ensures)g(that)
+h(the)f(transformation)g(from)h(Prairie)g(to)g(V)-6 b(olcano)75
+950 y(always)10 b(produces)g(a)i(compact)f(set)g(of)g(rules.)75
+1104 y FC(4)60 b(Experimental)12 b(r)o(esults)75 1213
+y FG(This)e(section)g(presents)g(e)o(xperimental)h(results)f(which)g
+(demonstrate)h(the)f(v)o(alue)h(of)g(Prairie)g(in)g(specifying)e(rule)
+75 1275 y(sets)14 b(of)h(rule-based)f(optimizers.)26
+b(Our)15 b(e)o(xperiments)f(consist)f(of)i(specifying)e(rule-based)i
+(optimizers)f(using)75 1337 y(Prairie)9 b(and)f(generating)f
+(optimizers)h(using)f(the)h(P2V)g(pre-processor)g(and)h(the)f
+(optimizer)o(-generator)f(paradigm)75 1400 y(of)k(Figure)g(8.)137
+1462 y(In)g([5],)g(we)g(presented)f(an)h(implementation)f(of)g(a)i
+(centralized)e(relational)f(query)i(optimizer)f(using)f(Prairie.)75
+1524 y(Using)i(the)g(P2V)h(translator)n(,)g(we)g(translated)f(this)f
+(to)i(V)-6 b(olcano)11 b(format)h(and)g(optimized)f(se)o(v)o(eral)h
+(queries)g(using)75 1586 y(the)j(resultant)f(optimizer)m(.)28
+b(F)o(or)16 b(comparison,)f(we)g(hand-coded)g(the)g(same)g(optimizer)g
+(directly)f(in)h(V)-6 b(olcano.)75 1648 y(The)10 b(results)f(presented)
+h(there)g(sho)o(wed)f(that,)h(using)f(Prairie)h(\(compared)h(to)e
+(directly)h(using)e(V)-6 b(olcano\))10 b(resulted)75
+1710 y(in)16 b(approximately)f(50\045)i(sa)o(vings)e(in)h(lines)f(of)i
+(code)g(with)e(ne)o(gligible)g(\(less)h(than)g(5\045\))h(increase)f(in)
+h(query)75 1772 y(optimization)c(time.)29 b(Ho)o(we)o(v)o(er)n(,)16
+b(the)f(optimizer)f(was)h(quite)f(small)h(in)g(terms)g(of)g(the)g
+(number)g(of)h(operators,)75 1834 y(algorithms)10 b(and)h(rules.)137
+1896 y(F)o(or)h(a)g(more)f(realistic)g(e)o(v)o(aluation)e(of)i
+(Prairie,)h(we)g(needed)f(answers)f(to)h(the)g(follo)o(wing)e
+(questions:)124 1992 y(1.)21 b(Is)11 b(Prairie)h(adequate)e(for)i(lar)o
+(ge-scale)f(rule)g(sets?)124 2087 y(2.)21 b(Ho)o(w)10
+b(is)h(programmer)h(producti)o(vity)d(enhanced)i(by)f(the)h(high-le)o
+(v)o(el)f(abstractions)g(of)h(Prairie?)124 2182 y(3.)21
+b(Can)11 b(Prairie)h(rule)f(sets)g(be)g(translated)f(automatically)g
+(into)g(ef)o(\256cient)h(implementations?)137 2278 y(W)l(e)16
+b(addressed)e(the)g(\256rst)h(question)e(by)i(using)e(the)i(T)m(e)o
+(xas)f(Instruments)g(Open)h(OODB)f(query)h(optimizer)75
+2340 y(rule)g(set,)h(which)e(has)h(the)g(lar)o(gest)f(publicly)g(a)o(v)
+o(ailable)g(rule)h(set.)27 b(W)l(e)16 b(describe)f(this)f(optimizer)g
+(in)h(the)f(ne)o(xt)75 2402 y(section,)c(and)h(then)g(gi)o(v)o(e)g(our)
+g(assessments)f(to)h(the)g(last)f(two)g(questions)f(in)i(subsequent)e
+(sections.)p 75 2442 720 2 v 125 2472 a Fs(7)142 2488
+y Fz(This)g(is)g(to)h(introduce)e(enforcer)o(-operators)h(in)g(e)o
+(xpressions,)e(as)i(mentioned)f(in)h(footnote)g(5.)952
+2793 y FG(15)p eop
+%%Page: 16 16
+16 15 bop 75 14 a Fy(4.1)50 b(The)13 b(T)-5 b(exas)13
+b(Instruments)g(Open)e(OODB)h(query)g(optimizer)75 107
+y FG(The)i(T)m(e)o(xas)g(Instruments)f(Open)h(Object-Oriented)e
+(Database)i(Management)h(System)f([19])g(is)g(an)g(open,)h(e)o(x-)75
+169 y(tensible,)f(object-oriented)f(database)h(system)g(which)g(pro)o
+(vides)g(users)g(an)g(architectural)g(frame)o(work)h(that)f(is)75
+231 y(con\256gurable)g(in)g(an)g(incremental)g(manner)m(.)27
+b(It)14 b(consists)f(of)h(three)g(sets)g(of)g(modules:)22
+b(a)14 b(core)h(set)f(pro)o(viding)75 294 y(lo)o(w-le)o(v)o(el)e
+(primiti)o(v)o(es)f(for)i(creating)g(ne)o(w)f(en)n(vironments,)g(a)i
+(set)e(of)h(functional)e(modules)h(that)g(facilitates)g(e)o(x-)75
+356 y(tensibility)d(using)i(functional)f(requirements,)j(and)f(a)g
+(meta-architecture)g(module)g(housing)e(the)i(e)o(xtensibility)75
+418 y(concepts)f(of)h(Open)f(OODB.)h(Examples)f(of)h(the)f(core)h(set)f
+(are)i(communication)d(and)i(address)f(space)h(manage-)75
+480 y(ment,)f(while)e(e)o(xamples)h(of)f(functional)g(modules)g(are)h
+(persistence,)g(distrib)o(ution)c(and)k(query)g(processing.)k(The)75
+542 y(meta-architecture)d(module)g(consists)e(of)j(e)o(v)o(ents,)f
+(sentries,)f(and)h(polic)o(y)g(manager)g(interfaces.)137
+604 y(The)g(query)g(processing)e(module)i(pro)o(vides)f(users)g(with)g
+(a)h(query)g(language)f(\(OQL[C++]\))h(based)g(on)f(SQL)75
+666 y(and)f(C++.)16 b(A)9 b(query)f(e)o(xpressed)h(in)g(this)f(high-le)
+o(v)o(el)f(format)j(is)e(parsed)h(and)g(transformed)g(into)f(an)h
+(operator)g(tree)75 728 y(suitable)h(for)i(optimization.)17
+b(The)12 b(query)f(optimizer)h(generates)f(an)h(optimal)f(access)h
+(plan)f(from)i(this)e(operator)75 790 y(tree)g(which)g(is)g(then)f
+(transformed)h(into)f(a)i(C++)f(program)g(ready)h(for)f(e)o(x)o
+(ecution.)137 852 y(The)h(query)f(optimizer)g(in)h(the)f(Open)g(OODB)h
+([2])g(is)f(generated)h(using)e(V)-6 b(olcano.)17 b(It)12
+b(is)f(written)g(as)h(a)g(set)f(of)75 915 y(trans)p 167
+915 14 2 v 16 w(rules)g(and)h(impl)p 445 915 V 16 w(rules)f(that)g
+(de\256ne)i(the)e(algebra)h(of)g(an)g(object-oriented)e(database)i
+(system.)18 b(Currently)m(,)75 977 y(there)9 b(are)h(17)e
+(transformation)g(rules)g(and)h(9)g(implementation)e(rules)i(together)f
+(with)g(about)g Fj(13000)f FG(lines)h(of)h(code)75 1039
+y(for)14 b(support)f(functions;)g(this,)h(of)g(course,)g(can)h(be)f
+(changed)f(by)h(an)g(Open)f(OODB)h(user)g(for)g(speci\256c)g(needs.)75
+1101 y(There)c(are)h(also)e FB(catalogs)f FG(which)h(contain)g
+(information)g(about)g(base)h(classes)g(that)f(are)i(used)f(by)f(the)h
+(optimizer)m(.)75 1231 y Fy(4.2)50 b(Pr)o(ogrammer)14
+b(pr)o(oductivity)75 1324 y FG(Programmer)e(producti)o(vity)c(can)j(be)
+g(measured)g(in)g(dif)o(ferent)f(ways.)15 b(An)c(admittedly)e
+(simplistic)g(metric)i(is)f(the)75 1386 y(number)i(of)f(lines)g(of)g
+(code)h(that)f(must)g(be)h(written.)k(But)c(there)f(are)h(also)f(less)g
+(tangible)g(measures,)h(such)f(as)g(the)75 1448 y(amount)i(of)g
+(conceptual)g(ef)o(fort)g(needed)h(to)e(understand)g(a)i(particular)f
+(programming)g(task.)23 b(Our)13 b(e)o(xperience)75 1510
+y(with)k(the)g(Open)g(OODB)h(query)g(optimizer)f(suggests)f(that)h
+(Prairie)h(e)o(xcels)g(on)f(the)g(latter)n(,)j(while)d(of)o(fering)75
+1572 y(modest)11 b(reductions)e(in)i(the)g(v)o(olume)g(of)g(code)g
+(that)g(needs)g(to)f(be)i(written.)137 1635 y(W)l(e)e(con)n(v)o(erted)g
+(by)f(hand)g(the)g(Open)h(OODB)f(query)g(optimizer')m(s)h(V)-6
+b(olcano)8 b(speci\256cations)h(to)g(Prairie.)16 b(This)75
+1697 y(was)d(a)h(non-tri)o(vial)d(task)i(because)g(of)h(the)f(relati)o
+(v)o(ely)f(lar)o(ge)i(size)f(of)h(the)f(rule)g(set)g(and)g(the)h
+(comple)o(xity)e(of)h(the)75 1759 y(support)7 b(functions.)15
+b(This)7 b(was)i(where)g(we)g(found)f(Prairie)h(helped)f(in)h
+(conceptually)e(simplifying)f(the)j(rules)f(and)75 1821
+y(actions.)16 b(W)l(e)c(then)f(used)f(our)h(P2V)h(pre-processor)f(to)f
+(reconstitute)g(these)h(Prairie)h(speci\256cations)e(as)h(V)-6
+b(olcano)75 1883 y(speci\256cations.)18 b(As)12 b(described)f(in)h
+(Section)f(3,)i(this)e(process)g(in)n(v)o(olv)o(ed)g(a)i(considerable)e
+(le)o(v)o(el)h(of)g(comple)o(xity)m(,)75 1945 y(partly)j(because)h(the)
+f(Prairie)h(speci\256cation)f(had)g(22)h(T)l(-rules)f(and)g(11)h
+(I-rules)f(compared)h(to)g(17)f(trans)p 1774 1945 V 16
+w(rules)75 2007 y(and)d(9)g(impl)p 275 2007 V 16 w(rules)f(in)h(the)f
+(V)-6 b(olcano)12 b(speci\256cation;)f(the)h(reconstituted)e(V)-6
+b(olcano)11 b(speci\256cation)g(had)h(the)g(same)75 2069
+y(number)f(of)g(trans)p 366 2069 V 16 w(rules)g(and)g(impl)p
+643 2069 V 16 w(rules)f(as)i(the)e(original)g(hand-coded)h
+(speci\256cation.)137 2131 y(Con)n(v)o(erting)i(the)h(Open)f(OODB)g
+(optimizer)g(rule)h(set)f(into)g(Prairie)h(format)g(actually)f
+(simpli\256ed)f(its)h(spec-)75 2193 y(i\256cation)g(as)i(the)e(comple)o
+(xities)g(of)i(the)f(V)-6 b(olcano)13 b(model)h(were)h(remo)o(v)o(ed.)
+26 b(The)14 b(reduction)f(in)h(lines)f(of)h(code)75 2256
+y(was)e(modest)f(\320)i(there)f(was)g(about)f(a)i(10\045)e(sa)o(vings.)
+934 2239 y Ft(8)972 2256 y FG(Ho)o(we)o(v)o(er)n(,)i(as)f(mentioned)f
+(abo)o(v)o(e,)i(sa)o(vings)e(in)h(lines)f(of)75 2318
+y(code)k(do)f(not)f(adequately)h(re\257ect)h(increases)g(in)f
+(programmer)h(producti)o(vity)m(.)24 b(W)l(e)15 b(found)f(the)g
+(encapsulated)75 2380 y(speci\256cations)7 b(of)i(Prairie)g(\320)g
+(namely)m(,)h(the)e(use)g(of)h(a)g(single)e(descriptor)h(and)g(fe)o
+(wer)h(e)o(xplicit)f(support)f(functions)75 2442 y(\320)12
+b(made)g(rule)f(programming)f FB(muc)o(h)i FG(easier)m(.)p
+75 2482 720 2 v 125 2509 a Fs(8)142 2525 y Fz(The)d(original)g(V)-5
+b(olcano)8 b(speci\256cation)f(had)i(13400)e(lines,)i(the)g(Prairie)h
+(speci\256cation)d(had)i(12100)e(lines,)i(and)g(the)g(P2V)l(-generated)
+75 2575 y(V)-5 b(olcano)8 b(speci\256cation)f(had)i(15800)e(lines.)952
+2793 y FG(16)p eop
+%%Page: 17 17
+17 16 bop 75 14 a Fy(4.3)50 b(P)o(erf)o(ormance)13 b(r)o(esults)g
+(using)f(the)f(Open)h(OODB)g(optimizer)75 107 y FG(The)d(acid)g(test)g
+(of)g(Prairie)h(was)f(whether)g(Prairie)g(speci\256cations)f(could)h
+(be)g(translated)f(into)g(ef)o(\256cient)i(optimizer)75
+169 y(implementations.)k(Our)7 b(e)o(xperiments)g(using)f(the)h(Open)g
+(OODB)h(consisted)d(of)j(optimizing)d(8)j(dif)o(ferent)f(queries)75
+231 y(using)j(the)h(two)f(query)h(optimizers)f(generated,)h(respecti)o
+(v)o(ely)m(,)g(using)f(Prairie)h(and)g(using)f(V)-6 b(olcano)10
+b(directly)g(\(in)75 294 y(the)h(remainder)g(of)g(this)f(section,)g(we)
+i(will)e(use)g(\252Prairie\272)i(and)f(\252V)-6 b(olcano\272)11
+b(to)f(denote)h(these)f(two)g(approaches\).)75 356 y(There)k(were)h(4)f
+(distinct)e(e)o(xpressions)g(that)i(were)g(used)g(to)g(generate)g(the)f
+(queries)h(used)g(in)f(the)h(e)o(xperiments;)75 418 y(these)d(are)h
+(sho)o(wn)e(in)g(Figure)h(9.)17 b(Each)11 b(e)o(xpression)f(represents)
+h(an)g Fw(N)5 b FG(-way)10 b(join)g(query)h(for)h(v)o(arying)e
+Fw(N)5 b FG(.)137 480 y(The)15 b(\256rst)f(e)o(xpression)g(E1)g(is)g(a)
+h(simple)f(retrie)o(v)o(al)g(and)g(join)g(of)h(base)f(classes.)26
+b(The)15 b(second,)g(E2,)h(is)e(also)75 542 y(a)h(join)e(of)h(base)g
+(classes;)h(ho)o(we)o(v)o(er)n(,)g(after)g(each)g(class)f(retrie)o(v)o
+(al,)g(an)h(attrib)o(ute)e(has)h(to)g(be)g(materialized)g(\(i.e.,)75
+604 y(brought)e(into)h(vie)o(w\))g(before)h(the)g(join.)23
+b(The)14 b(third)f(and)g(fourth)h(e)o(xpressions)e(\(E3)i(and)f(E4\))h
+(are)g(the)g(same)g(as)75 666 y(the)d(\256rst)g(and)f(second)h(\(E1)f
+(and)h(E2\))g(respecti)o(v)o(ely)m(,)f(e)o(xcept)h(that)g(there)g(is)f
+(a)i(selection)d(of)i(attrib)o(utes)f(\(the)h(select)75
+728 y(operator)g(is)f(the)h(root)g(of)g(the)g(e)o(xpressions\).)786
+712 y Ft(9)137 790 y FG(The)i(algebra)h(that)f(was)f(used)h(in)g(the)g
+(Prairie)h(and)f(V)-6 b(olcano)13 b(optimizers)f(for)i(our)f(e)o
+(xperiments)g(consisted)75 852 y(of)f(5)g(relational)f(operators)h
+(SELECT)m(,)g(PR)n(OJECT)m(,)g(JOIN,)g(RET)h(and)f(UNNEST)f(\(for)i
+(set-v)o(alued)e(attrib)o(utes\))75 915 y(and)g(an)g(object-oriented)e
+(operator)h(called)h(MA)-5 b(T)11 b(\(for)g(MA)-5 b(T)m(erialize;)11
+b(it)f(is)g(fundamentally)g(a)h(pointer)o(-chasing)75
+977 y(operator)g(for)g(attrib)o(utes)f(of)h(a)h(class\).)k(There)11
+b(were)h(8)f(algorithms.)137 1039 y(There)16 b(are)h(man)o(y)f
+(parameters)h(that)e(can)h(be)g(v)o(aried)g(when)f(benchmarking)g(a)i
+(query)e(optimizer)m(.)31 b(Since)75 1101 y(our)12 b(objecti)o(v)o(e)f
+(was)h(to)g(v)o(erify)g(that)f(the)h(Prairie)h(approach)f(did)f(not)h
+(sacri\256ce)h(ef)o(\256cienc)o(y)m(,)g(our)f(criteria)g(for)g(the)75
+1163 y(queries)e(was)g(that)g(the)o(y)g(test)g(a)h(majority)e(of)i(the)
+f(rules,)h(with)e(v)o(arying)g(properties)h(of)g(the)h(base)f(classes.)
+16 b(T)l(o)10 b(this)75 1225 y(end,)g(we)f(tested)f(our)h(optimizer)f
+(\(and)h(the)g(V)-6 b(olcano)9 b(optimizer\))f(with)g(8)h(dif)o(ferent)
+g(queries)f(\(sho)o(wn)g(in)h(T)l(able)g(5\).)75 1287
+y(The)k(eight)e(queries)h(Q1)h(through)e(Q8)i(are)g(deri)o(v)o(ed)f
+(from)i(the)e(4)h(e)o(xpressions)e(in)h(Figure)h(9.)21
+b(Each)12 b(e)o(xpression)75 1349 y(E1)f(through)g(E4)g(is)g(used)g(to)
+h(obtain)e(two)h(queries)g(for)h(a)g(\256x)o(ed)g(number)g
+Fw(N)k FG(of)c(JOINs)f(in)g(the)g(e)o(xpression.)17 b(The)75
+1411 y(only)12 b(dif)o(ference)i(between)f(the)g(two)f(queries)h
+(obtained)f(from)i(an)g(e)o(xpression)e(is)h(that)f(the)i(\256rst)f
+(one)g(does)g(not)75 1473 y(contain)8 b(an)o(y)g(indices)g(on)g(an)o(y)
+h(classes,)g(whereas)f(the)h(second)f(one)g(contains)f(a)i(single)f
+(inde)o(x)g(on)g(each)h(base)g(class)75 1536 y(occurring)j(in)g(the)g
+(e)o(xpression.)19 b(In)12 b(e)o(xpressions)f(where)i(a)f(SELECT)h(is)e
+(present)h(\(E3)g(and)h(E4\),)f(the)g(selection)75 1598
+y(predicate)e(is)f(a)h(conjunction)e(of)i(equality)f(predicates)g
+FB(bc)989 1605 y Fv(i)1016 1598 y Fj(==)k FB(const)1195
+1605 y Fv(i)1209 1598 y FG(,)e(where)f FB(bc)1395 1605
+y Fv(i)1419 1598 y FG(is)f(an)h(attrib)o(ute)f(of)h(class)f
+FB(C)1850 1605 y Fv(i)1864 1598 y FG(,)75 1660 y(and)j
+FB(const)249 1667 y Fv(i)276 1660 y FG(is)g(a)h(constant)e(\(we)h
+(arbitrarily)g(set)g(this)f(to)h Fw(i)p FG(,)h(because)f(its)g(v)o
+(alue)g(doesn')o(t)f(af)o(fect)i(the)g(correctness)75
+1722 y(or)g(performance)g(of)g(the)f(optimizer\).)20
+b(In)13 b(addition,)e(for)i(queries)f(with)g(a)h(SELECT)f(and)g(whose)g
+(base)h(classes)75 1784 y(ha)o(v)o(e)j(indices)e(\(Q6)h(and)g(Q8)g(in)g
+(T)l(able)h(5\),)g(the)f(\(single\))g(inde)o(x)g(of)g(each)h(base)f
+(class)g(was)f(chosen)h(to)g(be)g(the)75 1846 y(attrib)o(ute)8
+b(referenced)j(in)e(the)g(selection)g(predicate.)15 b(F)o(or)c(e)o
+(xample,)f(class)g FB(C)1288 1853 y Fv(i)1312 1846 y
+FG(was)f(chosen)g(to)g(ha)o(v)o(e)h(an)f(inde)o(x)h(on)75
+1908 y(attrib)o(ute)h FB(bc)281 1915 y Fv(i)295 1908
+y FG(.)21 b(The)12 b(join)f(predicates)h(for)h(each)g(JOIN)f(were)h
+(chosen)f(at)g(random,)h(and)g(were)g(always)e(equality)75
+1970 y(predicates.)23 b(The)13 b(choice)g(of)g(JOIN)g(predicates)g(was)
+g(such)g(that)f(the)h(queries)g(corresponded)g(to)f(linear)h(query)75
+2032 y(graphs.)j(In)11 b(the)g(future,)g(we)h(will)e(e)o(xperiment)h
+(with)f(non-linear)g(\(e.g.,)j(star\))e(query)g(graphs.)137
+2094 y(T)l(able)e(5)g(also)g(sho)o(ws)f(the)g(number)i(of)f(trans)p
+835 2094 14 2 v 15 w(rules)g(and)g(impl)p 1107 2094 V
+16 w(rules)f(that)h(are)g(matched)h(by)e(each)i(e)o(xpression.)75
+2157 y(These)i(are)i(the)e(rules)g(whose)g(left)g(hand)g(sides)g(match)
+h(a)g(sub-e)o(xpression.)19 b(Ho)o(we)o(v)o(er)n(,)13
+b(not)f(all)g(the)h(rules)f(were)75 2219 y(necessarily)7
+b(applicable.)14 b(F)o(or)8 b(instance,)g(an)g(impl)p
+875 2219 V 16 w(rule)f(with)g(an)g(inde)o(x)g(scan)h(would)e(not)h
+(apply)f(to)i(Q3,)g(although)75 2281 y(it)j(might)f(apply)g(to)h(Q4.)
+137 2343 y(Queries)g(Q1)g(through)f(Q8)h(were)h(optimized)e(for)h
+(increasing)f(number)i Fw(N)k FG(of)11 b(JOINs.)16 b(F)o(or)c(a)f
+(\256x)o(ed)h(number)p 75 2383 720 2 v 125 2410 a Fs(9)142
+2426 y Fz(The)c(most)g(comple)o(x)g(e)o(xpression)e(E4)i(consists)f(of)
+i(all)g(operators)e(in)i(the)f(algebra,)g(e)o(xcept)f(PR)o(OJECT)g(and)
+g(UNNEST)m(.)i(PR)o(OJECT)75 2476 y(was)e(not)h(considered)f(because)f
+(it)j(appeared)d(in)j(only)f(one)f(impl)p 912 2476 12
+2 v 14 w(rule)i(and)e(no)h(trans)p 1174 2476 V 13 w(rules,)h(and)e
+(thus,)i(would)e(not)h(af)o(fect)h(the)f(size)g(of)g(the)75
+2527 y(search)g(space)f(of)i(abstract)f(e)o(xpressions.)k(UNNEST)c(was)
+g(not)h(considered)e(because)g(it)j(appeared)d(in)i(e)o(xactly)f(one)h
+(trans)p 1680 2527 V 13 w(rule)g(and)f(one)75 2577 y(impl)p
+145 2577 V 14 w(rule;)i(including)e(it)i(in)f(our)g(queries)f(would)g
+(ha)o(v)o(e)g(increased)g(the)g(number)h(of)g(parameters)f(that)h
+(could)f(af)o(fect)h(our)g(run-times.)14 b(W)m(e)75 2627
+y(preferred)9 b(to)h(concentrate)d(on)i(simple)g(JOIN)g(e)o
+(xpressions.)952 2793 y FG(17)p eop
+%%Page: 18 18
+18 17 bop 90 12 1761 2 v 90 655 2 644 v 164 500 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.40799 1.1111
+false .5 9.50261 InitRnode } NewNode end end
+ 164
+500 a Fb(C)186 505 y Fs(1)152 431 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 152 431 a Fo(RET)183
+491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 183 491 a 305 500 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.40799 1.1111
+false .5 9.50261 InitRnode } NewNode end end
+ 305 500 a Fb(C)328 505 y Fs(2)294
+431 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 294 431 a Fo(RET)183 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 183 491 a 218 360 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 5.384 0.09999 false .5 17.328 InitRnode } NewNode end end
+
+218 360 a Fo(JOIN)183 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 183 491 a 183 491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 183 491
+a 325 279 a
+ tx@Dict begin 45. Rot end
+ 325 279 a 304 281 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889
+0.0 false .5 9.91681 InitRnode } NewNode end end
+ 304 281 a Fv(:)6 b(:)g(:)325
+279 y
+ tx@Dict begin 45. neg Rot end
+ 325 279 a 183 491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 183 491 a 436 290 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 436 290
+a Fo(RET)445 359 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.40799 1.0
+false .5 10.45403 InitRnode } NewNode end end
+ 445 359 a Fb(C)467 363 y Fh(n)183
+491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 183 491 a 360 219 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.384 0.09999
+false .5 17.328 InitRnode } NewNode end end
+ 360 219 a Fo(JOIN)183 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+
+183 491 a 183 491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 183 491 a 279 595 a Fz(\(a\))k(E1)p
+545 643 2 619 v 594 500 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.40799 1.1111
+false .5 9.50261 InitRnode } NewNode end end
+ 594 500 a Fb(C)616 505 y Fs(1)583
+431 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 583 431 a Fo(RET)614 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 614 491 a 736 500 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.40799 1.1111
+false .5 9.50261 InitRnode } NewNode end end
+
+736 500 a Fb(C)758 505 y Fs(2)724 431 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 724 431 a Fo(RET)614
+491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 614 491 a 579 361 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 5.384
+0.0 false .5 16.888 InitRnode } NewNode end end
+ 579 361 a Fo(MA)l(T)614 491
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 614 491 a 721 361 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 5.384
+0.0 false .5 16.888 InitRnode } NewNode end end
+ 721 361 a Fo(MA)l(T)614 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 614
+491 a 649 289 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 5.384 0.09999 false .5 17.328 InitRnode } NewNode end end
+ 649 289 a Fo(JOIN)614 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 614 491 a
+614 491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 614 491 a 756 208 a
+ tx@Dict begin 45. Rot end
+ 756 208 a 735 210 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889
+0.0 false .5 9.91681 InitRnode } NewNode end end
+ 735
+210 a Fv(:)c(:)f(:)756 208 y
+ tx@Dict begin 45. neg Rot end
+ 756 208 a 614 491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 614
+491 a 866 290 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 866 290 a Fo(RET)876 359 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.40799 1.0
+false .5 10.45403 InitRnode } NewNode end end
+ 876 359 a
+Fb(C)898 363 y Fh(n)614 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 614 491 a 862 219 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 5.384
+0.0 false .5 16.888 InitRnode } NewNode end end
+ 862
+219 a Fo(MA)l(T)614 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 614 491 a 791 148 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.384 0.09999
+false .5 17.328 InitRnode } NewNode end end
+ 791 148
+a Fo(JOIN)614 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 614 491 a 614 491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 614 491 a 708
+595 a Fz(\(b\))10 b(E2)p 975 643 2 619 v 1025 500 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.40799 1.1111
+false .5 9.50261 InitRnode } NewNode end end
+ 1025
+500 a Fb(C)1047 505 y Fs(1)1013 431 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 1013 431 a Fo(RET)1044
+491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1044 491 a 1166 500 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.40799 1.1111
+false .5 9.50261 InitRnode } NewNode end end
+ 1166 500 a Fb(C)1188 505
+y Fs(2)1155 431 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 1155 431 a Fo(RET)1044 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1044 491
+a 1079 360 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 {
+.5 5.384 0.09999 false .5 17.328 InitRnode } NewNode end end
+ 1079 360 a Fo(JOIN)1044 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1044 491 a
+1044 491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1044 491 a 1186 279 a
+ tx@Dict begin 45. Rot end
+ 1186 279 a 1165 281
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889
+0.0 false .5 9.91681 InitRnode } NewNode end end
+ 1165 281 a Fv(:)c(:)g(:)1186 279 y
+ tx@Dict begin 45. neg Rot end
+ 1186 279 a 1044
+491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1044 491 a 1296 290 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 1296 290 a Fo(RET)1306 359
+y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.40799 1.0
+false .5 10.45403 InitRnode } NewNode end end
+ 1306 359 a Fb(C)1328 363 y Fh(n)1044 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1044 491
+a 1221 219 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.384 0.09999
+false .5 17.328 InitRnode } NewNode end end
+ 1221 219 a Fo(JOIN)1044 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1044 491 a
+1044 491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1044 491 a 1196 148 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 5.384
+0.09999 false .5 29.336 InitRnode } NewNode end end
+ 1196 148 a Fo(SELECT)1044
+491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1044 491 a 1140 595 a Fz(\(c\))k(E3)p 1405 643
+2 619 v 1455 500 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.40799 1.1111
+false .5 9.50261 InitRnode } NewNode end end
+ 1455 500 a Fb(C)1477 505 y Fs(1)1443
+431 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 1443 431 a Fo(RET)1475 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1
+/TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1475 491 a 1597 500
+a
+ tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.40799 1.1111
+false .5 9.50261 InitRnode } NewNode end end
+ 1597 500 a Fb(C)1619 505 y Fs(2)1585 431 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 1585 431
+a Fo(RET)1475 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2
+/TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1475 491 a 1440 361 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 5.384
+0.0 false .5 16.888 InitRnode } NewNode end end
+ 1440 361 a
+Fo(MA)l(T)1475 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl1
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1475 491 a 1581 361 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 5.384
+0.0 false .5 16.888 InitRnode } NewNode end end
+ 1581 361 a
+Fo(MA)l(T)1475 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1475 491 a 1510 289 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2
+16 { .5 5.384 0.09999 false .5 17.328 InitRnode } NewNode end end
+ 1510 289 a
+Fo(JOIN)1475 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1475 491 a 1475 491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1475 491 a 1616
+208 a
+ tx@Dict begin 45. Rot end
+ 1616 208 a 1595 210 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889
+0.0 false .5 9.91681 InitRnode } NewNode end end
+ 1595 210 a Fv(:)d(:)e(:)1616
+208 y
+ tx@Dict begin 45. neg Rot end
+ 1616 208 a 1475 491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1475 491 a 1727 290 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.384
+0.0 false .5 15.112 InitRnode } NewNode end end
+ 1727
+290 a Fo(RET)1737 359 y
+ tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.40799 1.0
+false .5 10.45403 InitRnode } NewNode end end
+ 1737 359 a Fb(C)1759 363 y Fh(n)1475
+491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1475 491 a 1723 219 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 5.384
+0.0 false .5 16.888 InitRnode } NewNode end end
+ 1723 219 a Fo(MA)l(T)1475
+491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodematgetcln
+/TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0
+setlinecap stroke grestore grestore end
+ 1475 491 a 1651 148 a
+ tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.384 0.09999
+false .5 17.328 InitRnode } NewNode end end
+ 1651 148 a Fo(JOIN)1475 491
+y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1475 491 a 1475 491 a
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot
+/TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray
+0 setlinecap stroke grestore grestore end
+ 1475 491 a 1626 77 a
+ tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 5.384
+0.09999 false .5 29.336 InitRnode } NewNode end end
+ 1626 77
+a Fo(SELECT)1475 491 y
+ tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto
+} def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodeselect
+/TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap
+stroke grestore grestore end
+ 1475 491 a 1569 595 a Fz(\(d\))10
+b(E4)p 1850 655 2 644 v 90 657 1761 2 v 1850 665 10 647
+v 99 665 1761 10 v 382 769 a FG(Figure)h(9:)16 b(Expressions)9
+b(used)i(in)f(generating)g(queries)h(for)g(e)o(xperiments)p
+484 918 983 7 v 484 968 2 51 v 510 977 a Fq(Query)p 637
+968 V 663 981 a(Indices?)p 821 968 V 848 977 a(Expr)o(ession)p
+1048 968 V 1140 953 a(Rules)d(matched)p 1465 968 V 1050
+970 417 2 v 484 1018 2 51 v 637 1018 V 821 1018 V 1048
+1018 V 1075 1003 a Fz(trans)p 1150 1003 12 2 v 13 w(rules)p
+1259 1018 2 51 v 51 w(impl)p 1355 1003 12 2 v 14 w(rules)p
+1465 1018 2 51 v 484 1025 983 7 v 484 1075 2 51 v 538
+1060 a(Q1)p 637 1075 V 123 w(No)p 821 1075 V 915 1087
+a(E1)p 1048 1075 V 188 w(3)p 1259 1075 V 189 w(3)p 1465
+1075 V 484 1076 340 2 v 484 1125 2 51 v 538 1110 a(Q2)p
+637 1125 V 119 w(Y)l(es)p 821 1125 V 1048 1125 V 1259
+1125 V 1465 1125 V 484 1127 983 2 v 484 1177 2 51 v 538
+1162 a(Q3)p 637 1177 V 123 w(No)p 821 1177 V 915 1190
+a(E2)p 1048 1177 V 1145 1189 a(8)p 1259 1177 V 1353 1190
+a(4)p 1465 1177 V 484 1179 340 2 v 484 1227 2 51 v 538
+1212 a(Q4)p 637 1227 V 119 w(Y)l(es)p 821 1227 V 1048
+1227 V 1259 1227 V 1465 1227 V 484 1229 983 2 v 484 1279
+2 51 v 538 1264 a(Q5)p 637 1279 V 123 w(No)p 821 1279
+V 915 1291 a(E3)p 1048 1279 V 188 w(9)p 1259 1279 V 1353
+1292 a(5)p 1465 1279 V 484 1281 340 2 v 484 1329 2 51
+v 538 1314 a(Q6)p 637 1329 V 119 w(Y)l(es)p 821 1329
+V 1048 1329 V 1259 1329 V 1465 1329 V 484 1331 983 2
+v 484 1381 2 51 v 538 1366 a(Q7)p 637 1381 V 123 w(No)p
+821 1381 V 915 1394 a(E4)p 1048 1381 V 179 w(16)p 1259
+1381 V 179 w(7)p 1465 1381 V 484 1383 340 2 v 484 1431
+2 51 v 538 1416 a(Q8)p 637 1431 V 119 w(Y)l(es)p 821
+1431 V 1048 1431 V 1259 1431 V 1465 1431 V 484 1438 983
+7 v 636 1515 a FG(T)l(able)j(5:)16 b(Queries)10 b(used)h(in)g(e)o
+(xperiments)75 1695 y(of)j(JOINs)g(in)g(a)g(query)m(,)h(we)g(v)o(aried)
+f(the)f(cardinalities)g(of)h(the)g(base)g(classes)g(5)g(times,)h(each)g
+(time)f(generating)75 1757 y(a)i(query)f(with)g(dif)o(ferent)g(class)g
+(properties,)h(and)f(a)o(v)o(eraged)i(the)e(run-times)g(o)o(v)o(er)h
+(the)f(5)h(query)f(instances)g(to)75 1819 y(generate)d(the)g(per)o
+(-query)g(optimization)e(time.)20 b(Thus,)11 b(each)i(point)e(in)g(our)
+h(graphs)g(represents)f(the)h(a)o(v)o(erage)h(of)75 1881
+y(5)f(queries.)18 b(The)12 b(run-times)f(were)h(measured)814
+1865 y Ft(10)864 1881 y FG(using)f(the)g(GNU)h Fc(time)h
+FG(command.)19 b(All)11 b(e)o(xperiments)h(were)75 1944
+y(performed)g(on)e(a)i(lightly)d(loaded)i(DECstation)e(5000/200)g
+(running)h(Ultrix)g(4.2.)137 2006 y(The)j(optimization)e(times)i(for)h
+(each)f(query)g(for)h(both)e(approaches)h(\(Prairie)g(and)g(V)-6
+b(olcano\))13 b(are)h(sho)o(wn)e(in)75 2068 y(Figures)e(10)h(through)e
+(13.)16 b(The)11 b(number)f(of)h(joins)e(in)i(each)g(set)f(of)h(graphs)
+f(was)g(v)o(aried)h(to)f(a)h(maximum)g(of)g(8,)g(or)75
+2130 y(until)f(virtual)g(memory)i(was)e(e)o(xhausted.)137
+2192 y(The)f(\256rst)g(set)f(of)h(graphs,)g(in)f(Figure)h(10)g(sho)o
+(ws)e(the)i(performance)g(of)g(a)g(simple)g(relational-type)e(query)m
+(.)15 b(The)75 2254 y(optimization)d(times)h(are)h(almost)f(identical)g
+(between)g(Prairie)h(and)f(V)-6 b(olcano,)14 b(and)g(the)f(notable)f
+(point)h(is)g(that)75 2316 y(the)d(presence)h(of)g(an)f(inde)o(x)g
+(does)g(not)g(change)g(the)h(optimizer')m(s)f(beha)o(vior)n(,)h(i.e.,)g
+(the)g(two)e(graphs)h(are)h(identical.)75 2378 y(This)f(arises)h
+(because)g(the)g(optimizer)f(algebra)h(had)g(only)f(two)g(join)g
+(algorithms)f(\(pointer)h(join)g(and)h(hash)g(join\),)75
+2440 y(neither)g(of)g(which)f(makes)h(use)g(of)g(an)o(y)h(indices.)137
+2502 y(The)i(second)g(set)g(of)g(graphs)f(\(Figure)h(11\))g(sho)o(ws)f
+(the)h(results)f(of)h(optimizing)e(Q3)i(and)g(Q4.)25
+b(Here,)15 b(as)g(in)p 75 2543 720 2 v 110 2570 a Fs(10)142
+2586 y Fz(Since)10 b(the)g(run-times)g(were)g(too)g(small)g(to)h(be)e
+(measured)g(accurately)f(with)j Fa(time)p Fz(,)i(each)8
+b(query)i(instance)f(was)g(optimized)g(3000)75 2636 y(times)g(\(in)h(a)
+f(loop\))g(and)g(the)g(total)g(time)h(was)e(di)o(vided)h(by)f(3000)g
+(to)i(get)f(the)g(per)o(-query)g(optimization)g(time.)952
+2793 y FG(18)p eop
+%%Page: 19 19
+19 18 bop 88 12 1766 2 v 88 909 2 898 v 149 744 a @beginspecial
+18 @llx 18 @lly 552 @urx 482 @ury 1872 @rwi @setspecial
+%%BeginDocument: runtime.Q1.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+91 scalefont
+ setfont
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+420 300 m
+gsave
+420 300 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 300 m
+gsave
+621 300 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 300 m
+gsave
+822 300 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 300 m
+gsave
+1023 300 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 300 m
+gsave
+1225 300 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 300 m
+gsave
+1426 300 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 300 m
+gsave
+1627 300 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 300 m
+gsave
+1828 300 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 300 m
+gsave
+2030 300 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 148 m
+gsave
+1225 148 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+440 376 l
+420 611 m
+440 611 l
+420 846 m
+440 846 l
+420 1081 m
+440 1081 l
+420 1315 m
+440 1315 l
+420 1550 m
+440 1550 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 611 m
+2010 611 l
+2030 846 m
+2010 846 l
+2030 1081 m
+2010 1081 l
+2030 1315 m
+2010 1315 l
+2030 1550 m
+2010 1550 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+366 376 m
+gsave
+366 376 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 611 m
+gsave
+366 611 translate
+0 rotate
+0 -30 m
+(500) RJ
+(500) show
+grestore
+newpath
+366 846 m
+gsave
+366 846 translate
+0 rotate
+0 -30 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+366 1081 m
+gsave
+366 1081 translate
+0 rotate
+0 -30 m
+(1500) RJ
+(1500) show
+grestore
+newpath
+366 1315 m
+gsave
+366 1315 translate
+0 rotate
+0 -30 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+366 1550 m
+gsave
+366 1550 translate
+0 rotate
+0 -30 m
+(2500) RJ
+(2500) show
+grestore
+newpath
+366 1785 m
+gsave
+366 1785 translate
+0 rotate
+0 -30 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+100 1080 m
+gsave
+100 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1953 m
+gsave
+1225 1953 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1855 m
+gsave
+1225 1855 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query 1) CS
+(Average CPU Time for Query 1) show
+grestore
+newpath
+420 418 m
+621 537 l
+822 661 l
+1023 789 l
+1225 909 l
+1426 1046 l
+1627 1183 l
+1828 1320 l
+2030 1449 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 537 30 0 360 arc
+gsave fill grestore
+stroke
+822 661 30 0 360 arc
+gsave fill grestore
+stroke
+1023 789 30 0 360 arc
+gsave fill grestore
+stroke
+1225 909 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1046 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1183 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1320 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1449 30 0 360 arc
+gsave fill grestore
+stroke
+420 421 m
+621 541 l
+822 670 l
+1023 801 l
+1225 935 l
+1426 1066 l
+1627 1229 l
+1828 1355 l
+2030 1504 l
+stroke
+420 451 m
+390 421 l
+420 391 l
+450 421 l
+closepath
+gsave eofill grestore
+stroke
+621 571 m
+591 541 l
+621 511 l
+651 541 l
+closepath
+gsave eofill grestore
+stroke
+822 700 m
+792 670 l
+822 640 l
+852 670 l
+closepath
+gsave eofill grestore
+stroke
+1023 831 m
+993 801 l
+1023 771 l
+1053 801 l
+closepath
+gsave eofill grestore
+stroke
+1225 965 m
+1195 935 l
+1225 905 l
+1255 935 l
+closepath
+gsave eofill grestore
+stroke
+1426 1096 m
+1396 1066 l
+1426 1036 l
+1456 1066 l
+closepath
+gsave eofill grestore
+stroke
+1627 1259 m
+1597 1229 l
+1627 1199 l
+1657 1229 l
+closepath
+gsave eofill grestore
+stroke
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+420 418 m
+621 537 l
+822 661 l
+1023 789 l
+1225 909 l
+1426 1046 l
+1627 1183 l
+1828 1320 l
+2030 1449 l
+stroke
+420 421 m
+621 541 l
+822 670 l
+1023 801 l
+1225 935 l
+1426 1066 l
+1627 1229 l
+1828 1355 l
+2030 1504 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1516 m
+946 1740 l
+1574 1740 l
+1574 1516 l
+946 1516 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1684 m
+1191 1684 l
+stroke
+995 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1684 m
+gsave
+1240 1684 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1572 m
+1191 1572 l
+stroke
+995 1602 m
+965 1572 l
+995 1542 l
+1025 1572 l
+closepath
+gsave eofill grestore
+stroke
+1191 1602 m
+1161 1572 l
+1191 1542 l
+1221 1572 l
+closepath
+gsave eofill grestore
+stroke
+1240 1572 m
+gsave
+1240 1572 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 453 847 a Fz(\(a\))10 b(Query)e(1)p 976
+897 2 873 v 1013 744 a @beginspecial 18 @llx 18 @lly
+552 @urx 482 @ury 1872 @rwi @setspecial
+%%BeginDocument: runtime.Q2.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+91 scalefont
+ setfont
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+420 300 m
+gsave
+420 300 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 300 m
+gsave
+621 300 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 300 m
+gsave
+822 300 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 300 m
+gsave
+1023 300 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 300 m
+gsave
+1225 300 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 300 m
+gsave
+1426 300 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 300 m
+gsave
+1627 300 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 300 m
+gsave
+1828 300 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 300 m
+gsave
+2030 300 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 148 m
+gsave
+1225 148 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+440 376 l
+420 611 m
+440 611 l
+420 846 m
+440 846 l
+420 1081 m
+440 1081 l
+420 1315 m
+440 1315 l
+420 1550 m
+440 1550 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 611 m
+2010 611 l
+2030 846 m
+2010 846 l
+2030 1081 m
+2010 1081 l
+2030 1315 m
+2010 1315 l
+2030 1550 m
+2010 1550 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+366 376 m
+gsave
+366 376 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 611 m
+gsave
+366 611 translate
+0 rotate
+0 -30 m
+(500) RJ
+(500) show
+grestore
+newpath
+366 846 m
+gsave
+366 846 translate
+0 rotate
+0 -30 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+366 1081 m
+gsave
+366 1081 translate
+0 rotate
+0 -30 m
+(1500) RJ
+(1500) show
+grestore
+newpath
+366 1315 m
+gsave
+366 1315 translate
+0 rotate
+0 -30 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+366 1550 m
+gsave
+366 1550 translate
+0 rotate
+0 -30 m
+(2500) RJ
+(2500) show
+grestore
+newpath
+366 1785 m
+gsave
+366 1785 translate
+0 rotate
+0 -30 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+100 1080 m
+gsave
+100 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1953 m
+gsave
+1225 1953 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1855 m
+gsave
+1225 1855 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query 2) CS
+(Average CPU Time for Query 2) show
+grestore
+newpath
+420 418 m
+621 539 l
+822 664 l
+1023 783 l
+1225 906 l
+1426 1037 l
+1627 1176 l
+1828 1304 l
+2030 1451 l
+stroke
+420 418 30 0 360 arc
+gsave fill grestore
+stroke
+621 539 30 0 360 arc
+gsave fill grestore
+stroke
+822 664 30 0 360 arc
+gsave fill grestore
+stroke
+1023 783 30 0 360 arc
+gsave fill grestore
+stroke
+1225 906 30 0 360 arc
+gsave fill grestore
+stroke
+1426 1037 30 0 360 arc
+gsave fill grestore
+stroke
+1627 1176 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1304 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1451 30 0 360 arc
+gsave fill grestore
+stroke
+420 412 m
+621 533 l
+822 661 l
+1023 796 l
+1225 926 l
+1426 1063 l
+1627 1212 l
+1828 1355 l
+2030 1504 l
+stroke
+420 442 m
+390 412 l
+420 382 l
+450 412 l
+closepath
+gsave eofill grestore
+stroke
+621 563 m
+591 533 l
+621 503 l
+651 533 l
+closepath
+gsave eofill grestore
+stroke
+822 691 m
+792 661 l
+822 631 l
+852 661 l
+closepath
+gsave eofill grestore
+stroke
+1023 826 m
+993 796 l
+1023 766 l
+1053 796 l
+closepath
+gsave eofill grestore
+stroke
+1225 956 m
+1195 926 l
+1225 896 l
+1255 926 l
+closepath
+gsave eofill grestore
+stroke
+1426 1093 m
+1396 1063 l
+1426 1033 l
+1456 1063 l
+closepath
+gsave eofill grestore
+stroke
+1627 1242 m
+1597 1212 l
+1627 1182 l
+1657 1212 l
+closepath
+gsave eofill grestore
+stroke
+1828 1385 m
+1798 1355 l
+1828 1325 l
+1858 1355 l
+closepath
+gsave eofill grestore
+stroke
+2030 1534 m
+2000 1504 l
+2030 1474 l
+2060 1504 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1516 m
+946 1740 l
+1574 1740 l
+1574 1516 l
+946 1516 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1684 m
+1191 1684 l
+stroke
+995 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1684 m
+gsave
+1240 1684 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1572 m
+1191 1572 l
+stroke
+995 1602 m
+965 1572 l
+995 1542 l
+1025 1572 l
+closepath
+gsave eofill grestore
+stroke
+1191 1602 m
+1161 1572 l
+1191 1542 l
+1221 1572 l
+closepath
+gsave eofill grestore
+stroke
+1240 1572 m
+gsave
+1240 1572 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1316 847 a(\(b\))h(Query)g(2)p 1852 909
+2 898 v 88 911 1766 2 v 1853 919 10 901 v 96 919 1766
+10 v 503 1023 a FG(Figure)i(10:)k(Query)c(optimization)e(times)i(for)h
+(Q1)f(and)g(Q2)75 1203 y(Figure)h(10,)h(the)f(presence)h(\(or)f
+(absence\))h(of)f(indices)g(makes)g(no)g(dif)o(ference.)21
+b(Both)12 b(the)g(Prairie)h(and)f(V)-6 b(olcano)75 1265
+y(approaches)13 b(ha)o(v)o(e)h(comparable)g(run-times.)22
+b(The)14 b(sharp)f(jump)g(in)g(the)g(graphs)g(from)h(7-way)f(to)g
+(8-way)g(joins)75 1327 y(is)g(due)g(to)g(the)g(fact)g(that)g(since)g
+(all)g(optimization)e(is)i(done)g(in)f(main)i(memory)m(,)h(dynamic)e
+(memory)h(allocation)75 1389 y(\(caused)g(by)f Fc(malloc)i
+FG(calls\))f(results)e(in)h(a)h(lot)f(of)h(thrashing)e(at)i(this)e
+(point.)23 b(W)l(e)14 b(speculate)f(that)g(in)g(systems)75
+1451 y(with)d(more)i(virtual)e(memory)m(,)i(the)f(graphs)g(will)f(be)h
+(smoother)m(.)137 1514 y(The)16 b(third)f(and)h(fourth)f(sets)h(of)g
+(graphs)f(in)h(Figures)g(12)f(and)h(13)g(are)g(optimizations)e(of)i
+(queries)g(with)f(a)75 1576 y(selection)h(predicate.)34
+b(In)17 b(these)f(cases,)j(the)e(presence)g(of)g(an)g(inde)o(x)g(makes)
+g(a)g(dif)o(ference)g(if)g(the)g(inde)o(x)g(is)75 1638
+y(referenced)c(in)f(the)g(selection)f(predicate)h(\(as)g(we)h
+(designed\).)18 b(Also,)12 b(in)g(these)g(two)f(\256gures,)h(the)g
+(performance)75 1700 y(of)g(both)f(Prairie)h(and)g(V)-6
+b(olcano)12 b(was)f(almost)g(identical,)h(e)o(xcept)g(that)f(Prairie)i
+(does)e(slightly)f(worse)h(due)h(to)f(the)75 1762 y(lar)o(ger)j(number)
+f(of)j Fc(malloc)f FG(calls)e(that)g(the)g(P2V)g(translator)f
+(introduces.)22 b(Also,)13 b(note)g(that)g(we)h(could)e(only)75
+1824 y(go)i(up)g(to)g(3-way)g(joins)g(before)g(virtual)g(memory)h(was)f
+(e)o(xhausted.)26 b(As)14 b(the)g(a)o(v)o(ailable)g(memory)i
+(decreases,)75 1886 y(there)10 b(is)f(increased)h(thrashing)e(\(as)i
+(sho)o(wn)f(by)g(the)h(sharp)f(changes)h(in)f(slope)g(in)g(the)h
+(plots\))e(resulting)g(in)i(a)g(much)75 1948 y(slo)o(wer)g
+(optimization)g(process.)137 2010 y(In)15 b(all)e(four)h(sets)g(of)g
+(plots,)g(we)h(can)f(see)h(that)e(Prairie)i(performs)f(with)f(almost)h
+(\(less)g(than)f Fj(5\045)h FG(v)o(ariation\))75 2072
+y(the)c(same)i(ef)o(\256cienc)o(y)f(as)f(V)-6 b(olcano.)16
+b(In)11 b(e)o(xtreme)g(cases,)g(when)g(memory)g(is)f(scarce,)i(Prairie)
+f(runs)f(more)h(slo)o(wly)75 2135 y(\(about)17 b Fj(15\045)p
+FG(\))g(\(e.g.,)k(Figure)c(12\(b\)\),)j(b)o(ut)d(we)g(belie)o(v)o(e)h
+(that)f(this)f(situation)g(already)h(represents)g(a)h(serious)75
+2197 y(bottleneck)10 b(for)h(both)f(V)-6 b(olcano)11
+b(and)g(Prairie.)137 2259 y(Figure)g(14)g(sho)o(ws)f(the)g(v)o
+(ariation)g(of)h(the)g(number)g(of)g(equi)o(v)o(alence)f(classes)h
+(\(the)o(y)g(are)h(the)f(same)g(in)g(Prairie)75 2321
+y(and)i(V)-6 b(olcano\))13 b(as)g(a)h(function)d(of)j(the)f(number)g
+(of)g(joins)f(in)h(the)g(query)m(.)22 b(The)13 b(gro)o(wth)f(rate)i(of)
+f(the)g(number)g(of)75 2383 y(equi)o(v)o(alence)f(classes)g(increases)g
+(with)g(the)g(increase)h(in)f(the)g(comple)o(xity)g(of)h(the)f(e)o
+(xpressions.)20 b(In)12 b(particular)n(,)75 2445 y(for)f(E3)g(and)g
+(E4,)g(the)g(introduction)d(of)j(the)g(SELECT)g(operator)f(results)g
+(in)h(a)g(dramatic)g(increase)h(in)e(the)h(search)75
+2507 y(space,)i(since)e(this)g(operator)h(has)g(man)o(y)g(interactions)
+f(with)g(the)g(other)h(operators)f(of)i(the)e(algebra;)h(this)f(is)h
+(also)75 2569 y(re\257ected)e(in)e(T)l(able)h(5)g(where)g(E3)g(matches)
+g(three)g(times)g(as)g(man)o(y)g(trans)p 1220 2569 14
+2 v 16 w(rules)f(as)h(E1)g(and)g(E4)f(matches)i(twice)e(as)75
+2631 y(man)o(y)i(trans)p 277 2631 V 16 w(rules)f(as)h(E2.)16
+b(The)10 b(lesson)e(to)i(be)g(learnt)f(here)h(is)g(that)f(e)o(xtending)
+g(an)h(e)o(xisting)e(query)h(optimizer)h(by)952 2793
+y(19)p eop
+%%Page: 20 20
+20 19 bop 88 12 1766 2 v 88 909 2 898 v 149 744 a @beginspecial
+18 @llx 18 @lly 552 @urx 482 @ury 1872 @rwi @setspecial
+%%BeginDocument: runtime.Q3.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+91 scalefont
+ setfont
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+420 300 m
+gsave
+420 300 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 300 m
+gsave
+621 300 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 300 m
+gsave
+822 300 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 300 m
+gsave
+1023 300 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 300 m
+gsave
+1225 300 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 300 m
+gsave
+1426 300 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 300 m
+gsave
+1627 300 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 300 m
+gsave
+1828 300 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 300 m
+gsave
+2030 300 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 148 m
+gsave
+1225 148 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+440 376 l
+420 517 m
+440 517 l
+420 658 m
+440 658 l
+420 799 m
+440 799 l
+420 940 m
+440 940 l
+420 1081 m
+440 1081 l
+420 1221 m
+440 1221 l
+420 1362 m
+440 1362 l
+420 1503 m
+440 1503 l
+420 1644 m
+440 1644 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 517 m
+2010 517 l
+2030 658 m
+2010 658 l
+2030 799 m
+2010 799 l
+2030 940 m
+2010 940 l
+2030 1081 m
+2010 1081 l
+2030 1221 m
+2010 1221 l
+2030 1362 m
+2010 1362 l
+2030 1503 m
+2010 1503 l
+2030 1644 m
+2010 1644 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+366 376 m
+gsave
+366 376 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 517 m
+gsave
+366 517 translate
+0 rotate
+0 -30 m
+(500) RJ
+(500) show
+grestore
+newpath
+366 658 m
+gsave
+366 658 translate
+0 rotate
+0 -30 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+366 799 m
+gsave
+366 799 translate
+0 rotate
+0 -30 m
+(1500) RJ
+(1500) show
+grestore
+newpath
+366 940 m
+gsave
+366 940 translate
+0 rotate
+0 -30 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+366 1081 m
+gsave
+366 1081 translate
+0 rotate
+0 -30 m
+(2500) RJ
+(2500) show
+grestore
+newpath
+366 1221 m
+gsave
+366 1221 translate
+0 rotate
+0 -30 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+366 1362 m
+gsave
+366 1362 translate
+0 rotate
+0 -30 m
+(3500) RJ
+(3500) show
+grestore
+newpath
+366 1503 m
+gsave
+366 1503 translate
+0 rotate
+0 -30 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+366 1644 m
+gsave
+366 1644 translate
+0 rotate
+0 -30 m
+(4500) RJ
+(4500) show
+grestore
+newpath
+366 1785 m
+gsave
+366 1785 translate
+0 rotate
+0 -30 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+100 1080 m
+gsave
+100 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1953 m
+gsave
+1225 1953 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1855 m
+gsave
+1225 1855 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query 3) CS
+(Average CPU Time for Query 3) show
+grestore
+newpath
+420 401 m
+621 489 l
+822 578 l
+1023 672 l
+1225 762 l
+1426 865 l
+1627 969 l
+1828 1076 l
+2030 1574 l
+stroke
+420 401 30 0 360 arc
+gsave fill grestore
+stroke
+621 489 30 0 360 arc
+gsave fill grestore
+stroke
+822 578 30 0 360 arc
+gsave fill grestore
+stroke
+1023 672 30 0 360 arc
+gsave fill grestore
+stroke
+1225 762 30 0 360 arc
+gsave fill grestore
+stroke
+1426 865 30 0 360 arc
+gsave fill grestore
+stroke
+1627 969 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1076 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1574 30 0 360 arc
+gsave fill grestore
+stroke
+420 402 m
+621 485 l
+822 568 l
+1023 644 l
+1225 736 l
+1426 821 l
+1627 918 l
+1828 1019 l
+2030 1511 l
+stroke
+420 432 m
+390 402 l
+420 372 l
+450 402 l
+closepath
+gsave eofill grestore
+stroke
+621 515 m
+591 485 l
+621 455 l
+651 485 l
+closepath
+gsave eofill grestore
+stroke
+822 598 m
+792 568 l
+822 538 l
+852 568 l
+closepath
+gsave eofill grestore
+stroke
+1023 674 m
+993 644 l
+1023 614 l
+1053 644 l
+closepath
+gsave eofill grestore
+stroke
+1225 766 m
+1195 736 l
+1225 706 l
+1255 736 l
+closepath
+gsave eofill grestore
+stroke
+1426 851 m
+1396 821 l
+1426 791 l
+1456 821 l
+closepath
+gsave eofill grestore
+stroke
+1627 948 m
+1597 918 l
+1627 888 l
+1657 918 l
+closepath
+gsave eofill grestore
+stroke
+1828 1049 m
+1798 1019 l
+1828 989 l
+1858 1019 l
+closepath
+gsave eofill grestore
+stroke
+2030 1541 m
+2000 1511 l
+2030 1481 l
+2060 1511 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1516 m
+946 1740 l
+1574 1740 l
+1574 1516 l
+946 1516 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1684 m
+1191 1684 l
+stroke
+995 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1684 m
+gsave
+1240 1684 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1572 m
+1191 1572 l
+stroke
+995 1602 m
+965 1572 l
+995 1542 l
+1025 1572 l
+closepath
+gsave eofill grestore
+stroke
+1191 1602 m
+1161 1572 l
+1191 1542 l
+1221 1572 l
+closepath
+gsave eofill grestore
+stroke
+1240 1572 m
+gsave
+1240 1572 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 453 847 a Fz(\(a\))10 b(Query)e(3)p 976
+897 2 873 v 1013 744 a @beginspecial 18 @llx 18 @lly
+552 @urx 482 @ury 1872 @rwi @setspecial
+%%BeginDocument: runtime.Q4.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+91 scalefont
+ setfont
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+420 300 m
+gsave
+420 300 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 300 m
+gsave
+621 300 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 300 m
+gsave
+822 300 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 300 m
+gsave
+1023 300 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 300 m
+gsave
+1225 300 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 300 m
+gsave
+1426 300 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 300 m
+gsave
+1627 300 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 300 m
+gsave
+1828 300 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 300 m
+gsave
+2030 300 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 148 m
+gsave
+1225 148 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+440 376 l
+420 517 m
+440 517 l
+420 658 m
+440 658 l
+420 799 m
+440 799 l
+420 940 m
+440 940 l
+420 1081 m
+440 1081 l
+420 1221 m
+440 1221 l
+420 1362 m
+440 1362 l
+420 1503 m
+440 1503 l
+420 1644 m
+440 1644 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 517 m
+2010 517 l
+2030 658 m
+2010 658 l
+2030 799 m
+2010 799 l
+2030 940 m
+2010 940 l
+2030 1081 m
+2010 1081 l
+2030 1221 m
+2010 1221 l
+2030 1362 m
+2010 1362 l
+2030 1503 m
+2010 1503 l
+2030 1644 m
+2010 1644 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+366 376 m
+gsave
+366 376 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 517 m
+gsave
+366 517 translate
+0 rotate
+0 -30 m
+(500) RJ
+(500) show
+grestore
+newpath
+366 658 m
+gsave
+366 658 translate
+0 rotate
+0 -30 m
+(1000) RJ
+(1000) show
+grestore
+newpath
+366 799 m
+gsave
+366 799 translate
+0 rotate
+0 -30 m
+(1500) RJ
+(1500) show
+grestore
+newpath
+366 940 m
+gsave
+366 940 translate
+0 rotate
+0 -30 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+366 1081 m
+gsave
+366 1081 translate
+0 rotate
+0 -30 m
+(2500) RJ
+(2500) show
+grestore
+newpath
+366 1221 m
+gsave
+366 1221 translate
+0 rotate
+0 -30 m
+(3000) RJ
+(3000) show
+grestore
+newpath
+366 1362 m
+gsave
+366 1362 translate
+0 rotate
+0 -30 m
+(3500) RJ
+(3500) show
+grestore
+newpath
+366 1503 m
+gsave
+366 1503 translate
+0 rotate
+0 -30 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+366 1644 m
+gsave
+366 1644 translate
+0 rotate
+0 -30 m
+(4500) RJ
+(4500) show
+grestore
+newpath
+366 1785 m
+gsave
+366 1785 translate
+0 rotate
+0 -30 m
+(5000) RJ
+(5000) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+100 1080 m
+gsave
+100 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1953 m
+gsave
+1225 1953 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1855 m
+gsave
+1225 1855 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query 4) CS
+(Average CPU Time for Query 4) show
+grestore
+newpath
+420 400 m
+621 492 l
+822 575 l
+1023 669 l
+1225 759 l
+1426 866 l
+1627 962 l
+1828 1069 l
+2030 1578 l
+stroke
+420 400 30 0 360 arc
+gsave fill grestore
+stroke
+621 492 30 0 360 arc
+gsave fill grestore
+stroke
+822 575 30 0 360 arc
+gsave fill grestore
+stroke
+1023 669 30 0 360 arc
+gsave fill grestore
+stroke
+1225 759 30 0 360 arc
+gsave fill grestore
+stroke
+1426 866 30 0 360 arc
+gsave fill grestore
+stroke
+1627 962 30 0 360 arc
+gsave fill grestore
+stroke
+1828 1069 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1578 30 0 360 arc
+gsave fill grestore
+stroke
+420 400 m
+621 484 l
+822 567 l
+1023 645 l
+1225 735 l
+1426 823 l
+1627 915 l
+1828 1024 l
+2030 1517 l
+stroke
+420 430 m
+390 400 l
+420 370 l
+450 400 l
+closepath
+gsave eofill grestore
+stroke
+621 514 m
+591 484 l
+621 454 l
+651 484 l
+closepath
+gsave eofill grestore
+stroke
+822 597 m
+792 567 l
+822 537 l
+852 567 l
+closepath
+gsave eofill grestore
+stroke
+1023 675 m
+993 645 l
+1023 615 l
+1053 645 l
+closepath
+gsave eofill grestore
+stroke
+1225 765 m
+1195 735 l
+1225 705 l
+1255 735 l
+closepath
+gsave eofill grestore
+stroke
+1426 853 m
+1396 823 l
+1426 793 l
+1456 823 l
+closepath
+gsave eofill grestore
+stroke
+1627 945 m
+1597 915 l
+1627 885 l
+1657 915 l
+closepath
+gsave eofill grestore
+stroke
+1828 1054 m
+1798 1024 l
+1828 994 l
+1858 1024 l
+closepath
+gsave eofill grestore
+stroke
+2030 1547 m
+2000 1517 l
+2030 1487 l
+2060 1517 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1516 m
+946 1740 l
+1574 1740 l
+1574 1516 l
+946 1516 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1684 m
+1191 1684 l
+stroke
+995 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1684 m
+gsave
+1240 1684 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1572 m
+1191 1572 l
+stroke
+995 1602 m
+965 1572 l
+995 1542 l
+1025 1572 l
+closepath
+gsave eofill grestore
+stroke
+1191 1602 m
+1161 1572 l
+1191 1542 l
+1221 1572 l
+closepath
+gsave eofill grestore
+stroke
+1240 1572 m
+gsave
+1240 1572 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1316 847 a(\(b\))h(Query)g(4)p 1852 909
+2 898 v 88 911 1766 2 v 1853 919 10 901 v 96 919 1766
+10 v 503 1023 a FG(Figure)i(11:)k(Query)c(optimization)e(times)i(for)h
+(Q3)f(and)g(Q4)p 88 1167 1766 2 v 88 2065 2 898 v 149
+1899 a @beginspecial 18 @llx 18 @lly 552 @urx 482 @ury
+1872 @rwi @setspecial
+%%BeginDocument: runtime.Q5.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+91 scalefont
+ setfont
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+420 300 m
+gsave
+420 300 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+956 300 m
+gsave
+956 300 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 300 m
+gsave
+1493 300 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 300 m
+gsave
+2030 300 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 148 m
+gsave
+1225 148 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 552 m
+430 552 l
+420 728 m
+430 728 l
+420 904 m
+430 904 l
+420 1081 m
+430 1081 l
+420 1257 m
+430 1257 l
+420 1433 m
+430 1433 l
+420 1609 m
+430 1609 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 552 m
+2020 552 l
+2030 728 m
+2020 728 l
+2030 904 m
+2020 904 l
+2030 1081 m
+2020 1081 l
+2030 1257 m
+2020 1257 l
+2030 1433 m
+2020 1433 l
+2030 1609 m
+2020 1609 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 728 m
+440 728 l
+420 1081 m
+440 1081 l
+420 1433 m
+440 1433 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 728 m
+2010 728 l
+2030 1081 m
+2010 1081 l
+2030 1433 m
+2010 1433 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+366 376 m
+gsave
+366 376 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 728 m
+gsave
+366 728 translate
+0 rotate
+0 -30 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+366 1081 m
+gsave
+366 1081 translate
+0 rotate
+0 -30 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+366 1433 m
+gsave
+366 1433 translate
+0 rotate
+0 -30 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+366 1785 m
+gsave
+366 1785 translate
+0 rotate
+0 -30 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+100 1080 m
+gsave
+100 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1953 m
+gsave
+1225 1953 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1855 m
+gsave
+1225 1855 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query 5) CS
+(Average CPU Time for Query 5) show
+grestore
+newpath
+420 424 m
+956 511 l
+1493 671 l
+2030 1778 l
+stroke
+420 424 30 0 360 arc
+gsave fill grestore
+stroke
+956 511 30 0 360 arc
+gsave fill grestore
+stroke
+1493 671 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1778 30 0 360 arc
+gsave fill grestore
+stroke
+420 426 m
+956 522 l
+1493 688 l
+2030 1737 l
+stroke
+420 456 m
+390 426 l
+420 396 l
+450 426 l
+closepath
+gsave eofill grestore
+stroke
+956 552 m
+926 522 l
+956 492 l
+986 522 l
+closepath
+gsave eofill grestore
+stroke
+1493 718 m
+1463 688 l
+1493 658 l
+1523 688 l
+closepath
+gsave eofill grestore
+stroke
+2030 1767 m
+2000 1737 l
+2030 1707 l
+2060 1737 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1516 m
+946 1740 l
+1574 1740 l
+1574 1516 l
+946 1516 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1684 m
+1191 1684 l
+stroke
+995 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1684 m
+gsave
+1240 1684 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1572 m
+1191 1572 l
+stroke
+995 1602 m
+965 1572 l
+995 1542 l
+1025 1572 l
+closepath
+gsave eofill grestore
+stroke
+1191 1602 m
+1161 1572 l
+1191 1542 l
+1221 1572 l
+closepath
+gsave eofill grestore
+stroke
+1240 1572 m
+gsave
+1240 1572 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 453 2003 a Fz(\(a\))f(Query)e(5)p 976 2052
+2 873 v 1013 1899 a @beginspecial 18 @llx 18 @lly 552
+@urx 482 @ury 1872 @rwi @setspecial
+%%BeginDocument: runtime.Q6.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 386 l
+688 376 m
+688 386 l
+956 376 m
+956 386 l
+1225 376 m
+1225 386 l
+1493 376 m
+1493 386 l
+1761 376 m
+1761 386 l
+2030 376 m
+2030 386 l
+420 1785 m
+420 1775 l
+688 1785 m
+688 1775 l
+956 1785 m
+956 1775 l
+1225 1785 m
+1225 1775 l
+1493 1785 m
+1493 1775 l
+1761 1785 m
+1761 1775 l
+2030 1785 m
+2030 1775 l
+stroke
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+91 scalefont
+ setfont
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+420 300 m
+gsave
+420 300 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+956 300 m
+gsave
+956 300 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 300 m
+gsave
+1493 300 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 300 m
+gsave
+2030 300 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 148 m
+gsave
+1225 148 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+366 376 m
+gsave
+366 376 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 658 m
+gsave
+366 658 translate
+0 rotate
+0 -30 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+366 940 m
+gsave
+366 940 translate
+0 rotate
+0 -30 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+366 1221 m
+gsave
+366 1221 translate
+0 rotate
+0 -30 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+366 1503 m
+gsave
+366 1503 translate
+0 rotate
+0 -30 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+366 1785 m
+gsave
+366 1785 translate
+0 rotate
+0 -30 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+40 1080 m
+gsave
+40 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1953 m
+gsave
+1225 1953 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1855 m
+gsave
+1225 1855 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query 6) CS
+(Average CPU Time for Query 6) show
+grestore
+newpath
+420 415 m
+956 490 l
+1493 633 l
+2030 1651 l
+stroke
+420 415 30 0 360 arc
+gsave fill grestore
+stroke
+956 490 30 0 360 arc
+gsave fill grestore
+stroke
+1493 633 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1651 30 0 360 arc
+gsave fill grestore
+stroke
+420 416 m
+956 493 l
+1493 631 l
+2030 1462 l
+stroke
+420 446 m
+390 416 l
+420 386 l
+450 416 l
+closepath
+gsave eofill grestore
+stroke
+956 523 m
+926 493 l
+956 463 l
+986 493 l
+closepath
+gsave eofill grestore
+stroke
+1493 661 m
+1463 631 l
+1493 601 l
+1523 631 l
+closepath
+gsave eofill grestore
+stroke
+2030 1492 m
+2000 1462 l
+2030 1432 l
+2060 1462 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1516 m
+946 1740 l
+1574 1740 l
+1574 1516 l
+946 1516 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1684 m
+1191 1684 l
+stroke
+995 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1684 m
+gsave
+1240 1684 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1572 m
+1191 1572 l
+stroke
+995 1602 m
+965 1572 l
+995 1542 l
+1025 1572 l
+closepath
+gsave eofill grestore
+stroke
+1191 1602 m
+1161 1572 l
+1191 1542 l
+1221 1572 l
+closepath
+gsave eofill grestore
+stroke
+1240 1572 m
+gsave
+1240 1572 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1316 2003 a(\(b\))h(Query)g(6)p 1852 2065
+2 898 v 88 2067 1766 2 v 1853 2075 10 901 v 96 2075 1766
+10 v 503 2178 a FG(Figure)i(12:)k(Query)c(optimization)e(times)i(for)h
+(Q5)f(and)g(Q6)75 2358 y(adding)d(operators,)i(algorithms)e(or)i(rules)
+f(can)h(result)f(in)g(an)g(enormous)g(increase)h(in)f(optimization)f
+(comple)o(xity)m(,)75 2421 y(especially)15 b(if)h(the)f(additions)f
+(impact)i(a)g(signi\256cant)e(fraction)i(of)g(the)f(equi)o(v)o(alence)g
+(classes.)30 b(Extensibility)m(,)75 2483 y(thus,)10 b(must)h(be)h
+(judiciously)c(coupled)i(with)g(user)h(heuristics)f(to)h(a)o(v)o(oid)f
+(unpleasant)g(surprises.)137 2545 y(The)g(results)f(presented)g(in)h
+(this)f(section)g(sho)o(w)g(that)g(Prairie)h(optimizers)g(need)g(not)f
+(sacri\256ce)h(ef)o(\256cienc)o(y)h(for)75 2607 y(clarity)m(,)f(e)o(v)o
+(en)h(for)g(lar)o(ge)g(rule)f(sets.)16 b(More)11 b(research)h(and)e(v)o
+(alidation)f(is)h(necessary)g(to)g(v)o(erify)h(that)f(Prairie)h(is)f
+(an)952 2793 y(20)p eop
+%%Page: 21 21
+21 20 bop 88 12 1766 2 v 88 909 2 898 v 149 744 a @beginspecial
+18 @llx 18 @lly 552 @urx 482 @ury 1872 @rwi @setspecial
+%%BeginDocument: runtime.Q7.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+91 scalefont
+ setfont
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+420 300 m
+gsave
+420 300 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+956 300 m
+gsave
+956 300 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 300 m
+gsave
+1493 300 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 300 m
+gsave
+2030 300 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 148 m
+gsave
+1225 148 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+366 376 m
+gsave
+366 376 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 658 m
+gsave
+366 658 translate
+0 rotate
+0 -30 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+366 940 m
+gsave
+366 940 translate
+0 rotate
+0 -30 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+366 1221 m
+gsave
+366 1221 translate
+0 rotate
+0 -30 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+366 1503 m
+gsave
+366 1503 translate
+0 rotate
+0 -30 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+366 1785 m
+gsave
+366 1785 translate
+0 rotate
+0 -30 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+40 1080 m
+gsave
+40 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1953 m
+gsave
+1225 1953 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1855 m
+gsave
+1225 1855 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query 7) CS
+(Average CPU Time for Query 7) show
+grestore
+newpath
+420 425 m
+956 510 l
+1493 670 l
+2030 1637 l
+stroke
+420 425 30 0 360 arc
+gsave fill grestore
+stroke
+956 510 30 0 360 arc
+gsave fill grestore
+stroke
+1493 670 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1637 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 501 l
+1493 648 l
+2030 1470 l
+stroke
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+956 531 m
+926 501 l
+956 471 l
+986 501 l
+closepath
+gsave eofill grestore
+stroke
+1493 678 m
+1463 648 l
+1493 618 l
+1523 648 l
+closepath
+gsave eofill grestore
+stroke
+2030 1500 m
+2000 1470 l
+2030 1440 l
+2060 1470 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1516 m
+946 1740 l
+1574 1740 l
+1574 1516 l
+946 1516 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1684 m
+1191 1684 l
+stroke
+995 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1684 m
+gsave
+1240 1684 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1572 m
+1191 1572 l
+stroke
+995 1602 m
+965 1572 l
+995 1542 l
+1025 1572 l
+closepath
+gsave eofill grestore
+stroke
+1191 1602 m
+1161 1572 l
+1191 1542 l
+1221 1572 l
+closepath
+gsave eofill grestore
+stroke
+1240 1572 m
+gsave
+1240 1572 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 453 847 a Fz(\(a\))10 b(Query)e(7)p 976
+897 2 873 v 1013 744 a @beginspecial 18 @llx 18 @lly
+552 @urx 482 @ury 1872 @rwi @setspecial
+%%BeginDocument: runtime.Q8.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+90 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+956 376 m
+956 396 l
+1493 376 m
+1493 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+956 1785 m
+956 1765 l
+1493 1785 m
+1493 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+91 scalefont
+ setfont
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+420 300 m
+gsave
+420 300 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+956 300 m
+gsave
+956 300 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+1493 300 m
+gsave
+1493 300 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+2030 300 m
+gsave
+2030 300 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 148 m
+gsave
+1225 148 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+430 376 l
+420 517 m
+430 517 l
+420 658 m
+430 658 l
+420 799 m
+430 799 l
+420 940 m
+430 940 l
+420 1081 m
+430 1081 l
+420 1221 m
+430 1221 l
+420 1362 m
+430 1362 l
+420 1503 m
+430 1503 l
+420 1644 m
+430 1644 l
+420 1785 m
+430 1785 l
+2030 376 m
+2020 376 l
+2030 517 m
+2020 517 l
+2030 658 m
+2020 658 l
+2030 799 m
+2020 799 l
+2030 940 m
+2020 940 l
+2030 1081 m
+2020 1081 l
+2030 1221 m
+2020 1221 l
+2030 1362 m
+2020 1362 l
+2030 1503 m
+2020 1503 l
+2030 1644 m
+2020 1644 l
+2030 1785 m
+2020 1785 l
+stroke
+420 376 m
+440 376 l
+420 658 m
+440 658 l
+420 940 m
+440 940 l
+420 1221 m
+440 1221 l
+420 1503 m
+440 1503 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 658 m
+2010 658 l
+2030 940 m
+2010 940 l
+2030 1221 m
+2010 1221 l
+2030 1503 m
+2010 1503 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+366 376 m
+gsave
+366 376 translate
+0 rotate
+0 -30 m
+(0) RJ
+(0) show
+grestore
+newpath
+366 658 m
+gsave
+366 658 translate
+0 rotate
+0 -30 m
+(2000) RJ
+(2000) show
+grestore
+newpath
+366 940 m
+gsave
+366 940 translate
+0 rotate
+0 -30 m
+(4000) RJ
+(4000) show
+grestore
+newpath
+366 1221 m
+gsave
+366 1221 translate
+0 rotate
+0 -30 m
+(6000) RJ
+(6000) show
+grestore
+newpath
+366 1503 m
+gsave
+366 1503 translate
+0 rotate
+0 -30 m
+(8000) RJ
+(8000) show
+grestore
+newpath
+366 1785 m
+gsave
+366 1785 translate
+0 rotate
+0 -30 m
+(10000) RJ
+(10000) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+40 1080 m
+gsave
+40 1080 translate
+90 rotate
+0 0 m
+(CPU time \(microseconds\)) CS
+(CPU time \(microseconds\)) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1953 m
+gsave
+1225 1953 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1855 m
+gsave
+1225 1855 translate
+0 rotate
+0 0 m
+(Average CPU Time for Query 8) CS
+(Average CPU Time for Query 8) show
+grestore
+newpath
+420 421 m
+956 504 l
+1493 650 l
+2030 1549 l
+stroke
+420 421 30 0 360 arc
+gsave fill grestore
+stroke
+956 504 30 0 360 arc
+gsave fill grestore
+stroke
+1493 650 30 0 360 arc
+gsave fill grestore
+stroke
+2030 1549 30 0 360 arc
+gsave fill grestore
+stroke
+420 420 m
+956 502 l
+1493 647 l
+2030 1475 l
+stroke
+420 450 m
+390 420 l
+420 390 l
+450 420 l
+closepath
+gsave eofill grestore
+stroke
+956 532 m
+926 502 l
+956 472 l
+986 502 l
+closepath
+gsave eofill grestore
+stroke
+1493 677 m
+1463 647 l
+1493 617 l
+1523 647 l
+closepath
+gsave eofill grestore
+stroke
+2030 1505 m
+2000 1475 l
+2030 1445 l
+2060 1475 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+946 1516 m
+946 1740 l
+1574 1740 l
+1574 1516 l
+946 1516 l
+stroke
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1684 m
+1191 1684 l
+stroke
+995 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1191 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1240 1684 m
+gsave
+1240 1684 translate
+0 rotate
+0 -30 m
+(Prairie) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+995 1572 m
+1191 1572 l
+stroke
+995 1602 m
+965 1572 l
+995 1542 l
+1025 1572 l
+closepath
+gsave eofill grestore
+stroke
+1191 1602 m
+1161 1572 l
+1191 1542 l
+1221 1572 l
+closepath
+gsave eofill grestore
+stroke
+1240 1572 m
+gsave
+1240 1572 translate
+0 rotate
+0 -30 m
+(Volcano) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1316 847 a(\(b\))h(Query)g(8)p 1852 909
+2 898 v 88 911 1766 2 v 1853 919 10 901 v 96 919 1766
+10 v 503 1023 a FG(Figure)i(13:)k(Query)c(optimization)e(times)i(for)h
+(Q7)f(and)g(Q8)p 90 1167 1761 2 v 90 2298 2 1131 v 371
+2285 a @beginspecial 18 @llx 18 @lly 552 @urx 510 @ury
+2880 @rwi @setspecial
+%%BeginDocument: eqlogexp.Q1-8.ps
+/m {moveto} bind def
+/l {lineto} bind def
+/RJ {
+ stringwidth neg exch neg exch
+ rmoveto
+} bind def
+/CS {
+ stringwidth
+ 2 div neg exch 2 div neg exch
+ rmoveto
+} bind def
+0.25 0.25 scale
+1 setlinecap
+/Times-Italic findfont
+72 scalefont
+ setfont
+[] 0 setdash
+420 376 m
+420 1785 l
+2030 1785 l
+2030 376 l
+420 376 l
+stroke
+[] 0 setdash
+420 376 m
+420 396 l
+621 376 m
+621 396 l
+822 376 m
+822 396 l
+1023 376 m
+1023 396 l
+1225 376 m
+1225 396 l
+1426 376 m
+1426 396 l
+1627 376 m
+1627 396 l
+1828 376 m
+1828 396 l
+2030 376 m
+2030 396 l
+420 1785 m
+420 1765 l
+621 1785 m
+621 1765 l
+822 1785 m
+822 1765 l
+1023 1785 m
+1023 1765 l
+1225 1785 m
+1225 1765 l
+1426 1785 m
+1426 1765 l
+1627 1785 m
+1627 1765 l
+1828 1785 m
+1828 1765 l
+2030 1785 m
+2030 1765 l
+/Times-Italic findfont
+91 scalefont
+ setfont
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+420 300 m
+gsave
+420 300 translate
+0 rotate
+0 -30 m
+(0) CS
+(0) show
+grestore
+newpath
+621 300 m
+gsave
+621 300 translate
+0 rotate
+0 -30 m
+(1) CS
+(1) show
+grestore
+newpath
+822 300 m
+gsave
+822 300 translate
+0 rotate
+0 -30 m
+(2) CS
+(2) show
+grestore
+newpath
+1023 300 m
+gsave
+1023 300 translate
+0 rotate
+0 -30 m
+(3) CS
+(3) show
+grestore
+newpath
+1225 300 m
+gsave
+1225 300 translate
+0 rotate
+0 -30 m
+(4) CS
+(4) show
+grestore
+newpath
+1426 300 m
+gsave
+1426 300 translate
+0 rotate
+0 -30 m
+(5) CS
+(5) show
+grestore
+newpath
+1627 300 m
+gsave
+1627 300 translate
+0 rotate
+0 -30 m
+(6) CS
+(6) show
+grestore
+newpath
+1828 300 m
+gsave
+1828 300 translate
+0 rotate
+0 -30 m
+(7) CS
+(7) show
+grestore
+newpath
+2030 300 m
+gsave
+2030 300 translate
+0 rotate
+0 -30 m
+(8) CS
+(8) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+1225 148 m
+gsave
+1225 148 translate
+0 rotate
+0 0 m
+(Number of joins) CS
+(Number of joins) show
+grestore
+newpath
+420 376 m
+440 376 l
+420 728 m
+440 728 l
+420 1081 m
+440 1081 l
+420 1433 m
+440 1433 l
+420 1785 m
+440 1785 l
+2030 376 m
+2010 376 l
+2030 728 m
+2010 728 l
+2030 1081 m
+2010 1081 l
+2030 1433 m
+2010 1433 l
+2030 1785 m
+2010 1785 l
+/Times-Roman findfont
+91 scalefont
+ setfont
+stroke
+366 376 m
+gsave
+366 376 translate
+0 rotate
+0 -30 m
+(100) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(0) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 728 m
+gsave
+366 728 translate
+0 rotate
+0 -30 m
+(102) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(2) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 1081 m
+gsave
+366 1081 translate
+0 rotate
+0 -30 m
+(104) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(4) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 1433 m
+gsave
+366 1433 translate
+0 rotate
+0 -30 m
+(106) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(6) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+366 1785 m
+gsave
+366 1785 translate
+0 rotate
+0 -30 m
+(108) RJ
+(10) show
+/Times-Roman findfont
+54 scalefont
+ setfont
+0 54 rmoveto
+(8) show
+/Times-Roman findfont
+91 scalefont
+ setfont
+0 -54 rmoveto
+() show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+187 1080 m
+gsave
+187 1080 translate
+90 rotate
+0 0 m
+(Equivalence classes) CS
+(Equivalence classes) show
+grestore
+newpath
+/Times-Roman findfont
+90 scalefont
+ setfont
+/Times-Bold findfont
+90 scalefont
+ setfont
+1225 1953 m
+gsave
+1225 1953 translate
+0 rotate
+0 0 m
+(N-way Join Queries) CS
+(N-way Join Queries) show
+grestore
+newpath
+/Times-Bold findfont
+84 scalefont
+ setfont
+/Times-Roman findfont
+84 scalefont
+ setfont
+1225 1855 m
+gsave
+1225 1855 translate
+0 rotate
+0 0 m
+(Number of Equivalence Classes) CS
+(Number of Equivalence Classes) show
+grestore
+newpath
+420 376 m
+621 429 l
+822 482 l
+1023 535 l
+1225 588 l
+1426 641 l
+1627 694 l
+1828 747 l
+2030 800 l
+stroke
+420 376 30 0 360 arc
+gsave fill grestore
+stroke
+621 429 30 0 360 arc
+gsave fill grestore
+stroke
+822 482 30 0 360 arc
+gsave fill grestore
+stroke
+1023 535 30 0 360 arc
+gsave fill grestore
+stroke
+1225 588 30 0 360 arc
+gsave fill grestore
+stroke
+1426 641 30 0 360 arc
+gsave fill grestore
+stroke
+1627 694 30 0 360 arc
+gsave fill grestore
+stroke
+1828 747 30 0 360 arc
+gsave fill grestore
+stroke
+2030 800 30 0 360 arc
+gsave fill grestore
+stroke
+420 376 m
+621 597 l
+822 734 l
+1023 871 l
+1225 1008 l
+1426 1145 l
+1627 1282 l
+1828 1419 l
+2030 1556 l
+stroke
+420 406 m
+390 376 l
+420 346 l
+450 376 l
+closepath
+gsave eofill grestore
+stroke
+621 627 m
+591 597 l
+621 567 l
+651 597 l
+closepath
+gsave eofill grestore
+stroke
+822 764 m
+792 734 l
+822 704 l
+852 734 l
+closepath
+gsave eofill grestore
+stroke
+1023 901 m
+993 871 l
+1023 841 l
+1053 871 l
+closepath
+gsave eofill grestore
+stroke
+1225 1038 m
+1195 1008 l
+1225 978 l
+1255 1008 l
+closepath
+gsave eofill grestore
+stroke
+1426 1175 m
+1396 1145 l
+1426 1115 l
+1456 1145 l
+closepath
+gsave eofill grestore
+stroke
+1627 1312 m
+1597 1282 l
+1627 1252 l
+1657 1282 l
+closepath
+gsave eofill grestore
+stroke
+1828 1449 m
+1798 1419 l
+1828 1389 l
+1858 1419 l
+closepath
+gsave eofill grestore
+stroke
+2030 1586 m
+2000 1556 l
+2030 1526 l
+2060 1556 l
+closepath
+gsave eofill grestore
+stroke
+420 376 m
+621 578 l
+822 805 l
+1023 1059 l
+stroke
+420 406 m
+390 346 l
+450 346 l
+closepath
+gsave eofill grestore
+stroke
+621 608 m
+591 548 l
+651 548 l
+closepath
+gsave eofill grestore
+stroke
+822 835 m
+792 775 l
+852 775 l
+closepath
+gsave eofill grestore
+stroke
+1023 1089 m
+993 1029 l
+1053 1029 l
+closepath
+gsave eofill grestore
+stroke
+420 513 m
+621 787 l
+822 1094 l
+1023 1428 l
+stroke
+390 543 m
+420 483 l
+450 543 l
+closepath
+gsave eofill grestore
+stroke
+591 817 m
+621 757 l
+651 817 l
+closepath
+gsave eofill grestore
+stroke
+792 1124 m
+822 1064 l
+852 1124 l
+closepath
+gsave eofill grestore
+stroke
+993 1458 m
+1023 1398 l
+1053 1458 l
+closepath
+gsave eofill grestore
+stroke
+/Times-Roman findfont
+72 scalefont
+ setfont
+1070 1369 m
+1070 1729 l
+1665 1729 l
+1665 1369 l
+1070 1369 l
+stroke
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1684 m
+1270 1684 l
+stroke
+1110 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1270 1684 30 0 360 arc
+gsave fill grestore
+stroke
+1310 1684 m
+gsave
+1310 1684 translate
+0 rotate
+0 -24 m
+(Query 1, 2) show
+grestore
+newpath
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1594 m
+1270 1594 l
+stroke
+1110 1624 m
+1080 1594 l
+1110 1564 l
+1140 1594 l
+closepath
+gsave eofill grestore
+stroke
+1270 1624 m
+1240 1594 l
+1270 1564 l
+1300 1594 l
+closepath
+gsave eofill grestore
+stroke
+1310 1594 m
+gsave
+1310 1594 translate
+0 rotate
+0 -24 m
+(Query 3, 4) show
+grestore
+newpath
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1504 m
+1270 1504 l
+stroke
+1110 1534 m
+1080 1474 l
+1140 1474 l
+closepath
+gsave eofill grestore
+stroke
+1270 1534 m
+1240 1474 l
+1300 1474 l
+closepath
+gsave eofill grestore
+stroke
+1310 1504 m
+gsave
+1310 1504 translate
+0 rotate
+0 -24 m
+(Query 5, 6) show
+grestore
+newpath
+/Times-Roman findfont
+72 scalefont
+ setfont
+1110 1414 m
+1270 1414 l
+stroke
+1080 1444 m
+1110 1384 l
+1140 1444 l
+closepath
+gsave eofill grestore
+stroke
+1240 1444 m
+1270 1384 l
+1300 1444 l
+closepath
+gsave eofill grestore
+stroke
+1310 1414 m
+gsave
+1310 1414 translate
+0 rotate
+0 -24 m
+(Query 7, 8) show
+grestore
+newpath
+showpage
+%%EndDocument
+ @endspecial 1850 2298 V 90 2300 1761 2 v 1850 2308 10
+1134 v 99 2308 1761 10 v 411 2411 a(Figure)g(14:)k(Number)c(of)h(equi)o
+(v)o(alence)e(classes)g(vs.)i(number)f(of)g(joins)75
+2592 y(ef)o(\256cient)g(tool)f(for)i(optimizer)e(speci\256cation.)952
+2793 y(21)p eop
+%%Page: 22 22
+22 21 bop 75 14 a FC(5)60 b(Related)13 b(r)o(esear)o(ch)75
+124 y FG(The)c(System)f(R)i(optimizer)e([17])h(was)f(the)g(most)h
+(important)e(de)o(v)o(elopment)h(in)h(query)f(optimization)f(research.)
+16 b(It)75 186 y(was)9 b(a)h(cost-based)e(centralized)h(relational)f
+(query)h(optimizer)g(and)h(introduced)e(a)h(v)o(ariety)g(of)h(ke)o(y)f
+(concepts)f(like)75 248 y(\252interesting\272)g(e)o(xpressions,)g
+(cardinality)g(estimation)f(using)h(selecti)o(vity)f(factors)i(and)g
+(dynamic)g(programming)75 310 y(with)h(pruning)f(of)h(search)h(space.)
+17 b(These)10 b(concepts)g(continue)f(to)i(be)f(important)g(in)g(query)
+g(optimizer)g(research.)137 372 y(The)15 b(query)g(optimizer)f(in)g(R)
+611 355 y Fd(\003)646 372 y FG([4,)8 b(14,)f(16])15 b(works)f(in)g
+(essentially)f(the)i(same)g(way)f(as)h(that)g(of)f(System)h(R,)75
+434 y(e)o(xcept)f(that)g(R)320 418 y Fd(\003)354 434
+y FG(is)f(a)i(distrib)o(uted)c(database)j(system)g(which)f(introduces)f
+(some)i(subtle)f(complications)f(in)i(its)75 496 y(query)d(optimizer)m
+(.)137 558 y(The)f(Starb)o(urst)f(query)g(optimizer)g([11,)e(13,)h(15])
+h(uses)g(rules)g(for)h(all)f(decisions)f(that)h(need)h(to)f(be)g(taken)
+g(by)g(the)75 620 y(query)h(optimizer)m(.)17 b(The)10
+b(rules)g(are)i(functional)d(in)h(nature)h(and)f(transform)h(a)g(gi)o
+(v)o(en)f(operator)g(tree)h(into)f(another)m(.)75 682
+y(The)h(rules)f(are)h(commonly)g(those)f(that)g(re\257ect)h(relational)
+f(calculus)g(facts.)16 b(In)11 b(Starb)o(urst,)g(the)f(query)h(re)o
+(writing)75 745 y(phase)g(is)g(dif)o(ferent)g(from)h(the)f
+(optimization)e(phase.)17 b(The)11 b(re)o(writing)g(phase)g(transforms)
+g(the)g(query)g(itself)f(into)75 807 y(equi)o(v)o(alent)k(operator)h
+(trees)h(based)f(on)g(relational)g(calculus)f(rules.)30
+b(The)15 b(plan)g(optimization)f(phase)h(selects)75 869
+y(algorithms)c(for)i(each)g(operator)f(in)g(the)g(operator)g(tree)h
+(that)f(is)g(obtained)f(after)i(re)o(writing.)19 b(The)13
+b(disadv)o(antage)75 931 y(of)d(separating)g(the)g(query)g(re)o(write)g
+(and)g(the)g(optimization)e(phases)i(is)f(that)h(pruning)f(of)h(the)g
+(search)h(space)f(is)g(not)75 993 y(possible)f(during)h(query)h(re)o
+(write,)h(since)e(the)h(re)o(write)g(phase)g(is)g(non-cost-based.)137
+1055 y(Fre)o(ytag)i([6])g(describes)g(a)g(rule-based)f(query)h
+(optimizer)f(similar)g(to)h(Starb)o(urst.)20 b(The)13
+b(rules)g(are)g(based)g(on)75 1117 y(LISP-like)f(representations)f(of)h
+(access)h(plans.)19 b(The)12 b(rules)g(themselv)o(es)g(are)h(recursi)o
+(v)o(ely)f(de\256ned)g(on)g(smaller)75 1179 y(e)o(xpressions)g
+(\(operator)g(trees\).)22 b(Although)11 b(se)o(v)o(eral)i(e)o
+(xpressions)f(can)h(contain)f(a)h(common)h(sub-e)o(xpression,)75
+1241 y(Fre)o(ytag)h(doesn')o(t)f(consider)f(the)h(possibility)e(of)i
+(sharing.)26 b(Expressions)12 b(are)j(e)o(v)o(aluated)f(each)h(time)f
+(the)o(y)g(are)75 1304 y(encountered.)j(This)11 b(is)g(ob)o(viously)e
+(inef)o(\256cient.)18 b(In)11 b(addition,)g(as)g(in)h(Starb)o(urst,)f
+(he)h(doesn')o(t)f(consider)f(the)i(cost)75 1366 y(transformations)e
+(inherent)g(in)h(an)o(y)g(query)g(optimizer;)f(rules)h(are)h(syntactic)
+e(transformation)g(rules.)137 1428 y(EXODUS)15 b([7,)8
+b(10])15 b(pro)o(vides)f(an)h(optimizer)g(generator)g(which)f(accepts)i
+(a)f(rule-based)g(speci\256cation)f(of)75 1490 y(the)g(data)g(model)h
+(as)f(input.)25 b(The)14 b(optimizer)g(generator)g(compiles)g(these)g
+(rules,)h(together)f(with)f(pre-de\256ned)75 1552 y(rules,)h(to)f
+(generate)g(an)h(optimizer)f(for)g(the)h(particular)e(data)i(model)f
+(and)g(set)g(of)h(operators.)23 b(Unlike)11 b(Fre)o(ytag,)75
+1614 y(the)i(optimizer)f(generator)h(for)g(EXODUS)g(allo)o(ws)f(for)h
+(C)h(code)f(along)f(with)g(de\256nitions)f(of)i(ne)o(w)g(rules.)22
+b(This)75 1676 y(allo)o(ws)8 b(the)h(database)g(implementor)f(the)h
+(freedom)h(to)e(associate)h(an)o(y)g(action)g(with)f(a)h(particular)g
+(rule.)15 b(Operator)75 1738 y(trees)c(in)g(EXODUS)g(are)g(constructed)
+f(bottom-up)g(from)i(pre)o(viously)d(constructed)h(trees.)137
+1800 y(The)j(V)-6 b(olcano)12 b(optimizer)g(generator)g(project)g([8])h
+(e)o(v)o(olv)o(ed)f(from)h(the)f(EXODUS)g(project.)20
+b(It)13 b(is)f(dif)o(ferent)75 1862 y(from)k(all)g(the)f(abo)o(v)o(e)i
+(optimizers)e(in)g(one)h(signi\256cant)e(way:)25 b(it)15
+b(is)g(a)i(top-do)o(wn)d(optimizer)h(compared)h(with)75
+1925 y(the)h(bottom-up)e(strate)o(gy)i(of)g(the)f(others.)34
+b(Operator)16 b(trees)h(are)h(optimized)e(starting)f(from)j(the)f(root)
+f(while)75 1987 y(sub-trees)e(are)h(not)g(yet)f(optimized.)26
+b(This)14 b(leads)g(to)h(a)g(constraint-dri)o(v)o(en)e(generation)g(of)
+i(the)g(search)g(space.)75 2049 y(While)f(this)f(method)h(results)f(in)
+h(a)h(tight)d(control)i(of)g(the)g(search)h(space,)g(it)f(is)g(uncon)n
+(v)o(entional)e(and)j(requires)75 2111 y(careful)d(attention)d(on)i
+(the)g(part)g(of)g(the)g(optimizer)g(implementor)g(to)f(ensure)h(that)g
+(le)o(gal)g(operator)g(trees)g(are)h(not)75 2173 y(accidently)e(left)h
+(out)g(of)g(the)g(search)g(space.)17 b(W)l(e)12 b(ha)o(v)o(e)f(used)g
+(V)-6 b(olcano)10 b(as)i(our)f(back-end)g(search)g(engine.)75
+2327 y FC(6)60 b(Conclusion)14 b(and)i(futur)o(e)e(w)o(ork)75
+2436 y FG(Current)g(rule-based)g(query)g(optimizers)g(do)g(not)f(pro)o
+(vide)h(a)h(v)o(ery)g(intuiti)o(v)o(e)d(and)i(conceptually)f
+(streamlined)75 2498 y(frame)o(work)8 b(to)f(de\256ne)h(rules)f(and)h
+(actions.)14 b(Our)8 b(e)o(xperiences)g(with)e(the)i(V)-6
+b(olcano)7 b(optimizer)g(generator)h(suggest)75 2560
+y(that)h(its)h(model)g(of)g(rules)f(and)h(the)g(e)o(xpression)f(of)h
+(these)g(rules)g(is)f(much)i(more)f(complicated)g(and)g(too)f(lo)o
+(w-le)o(v)o(el)75 2622 y(than)14 b(it)f(needs)h(to)g(be.)26
+b(As)14 b(a)g(consequence,)h(rule)f(sets)g(in)g(V)-6
+b(olcano)13 b(are)i(fragile,)g(hard)g(to)e(write,)i(and)f(deb)o(ug.)952
+2793 y(22)p eop
+%%Page: 23 23
+23 22 bop 75 14 a FG(Similar)11 b(problems)g(may)g(e)o(xist)g(in)g
+(other)f(contemporary)h(rule-based)g(query)g(optimizers.)137
+77 y(W)l(e)k(belie)o(v)o(e)e(that)g(rule-based)h(query)f(optimizers)g
+(will)g(be)h(standard)e(tools)h(of)h(future)f(database)h(systems.)75
+139 y(The)k(pragmatic)h(dif)o(\256culties)e(of)h(using)f(e)o(xisting)g
+(rule-based)h(optimizers)g(led)g(us)g(to)g(de)o(v)o(elop)g(Prairie,)j
+(an)75 201 y(e)o(xtensible)15 b(and)g(structured)g(algebraic)h(frame)o
+(work)f(for)h(specifying)f(rules.)30 b(Prairie)16 b(is)f(similar)g(to)h
+(e)o(xisting)75 263 y(optimizers)10 b(in)h(that)g(it)g(supports)e(both)
+i(transformation)f(rules)h(and)g(implementation)f(rules.)16
+b(Ho)o(we)o(v)o(er)n(,)c(Prairie)75 325 y(makes)f(se)o(v)o(eral)g
+(impro)o(v)o(ements:)124 420 y(1.)21 b(it)10 b(of)o(fers)i(a)f
+(conceptually)f(more)i(streamlined)e(model)h(for)g(rule)g
+(speci\256cation;)124 516 y(2.)21 b(rules)11 b(are)g(encapsulated,)g
+(there)g(are)h(no)f(\252hidden\272)f(operators)h(or)g(\252hidden\272)f
+(algorithms;)124 611 y(3.)21 b(implementation)10 b(hints)f(\(e.g.,)k
+(enforcers\))e(are)h(deduced)f(automatically;)124 706
+y(4.)21 b(and)11 b(it)f(has)h(ef)o(\256cient)h(implementations.)137
+801 y(W)l(e)k(ha)o(v)o(e)g(e)o(xplained)e(ho)o(w)h(the)f(\256rst)i
+(three)f(points)e(are)j(important)e(for)i(simplifying)d(rule)i
+(speci\256cations)75 864 y(and)f(making)g(rule)h(sets)f(less)f(brittle)
+h(for)g(e)o(xtensibility)m(.)24 b(A)15 b(consequence)f(is)g(that)g
+(Prairie)g(rules)g(are)i(simpler)75 926 y(and)11 b(more)h(rob)o(ust)e
+(than)h(rules)g(of)g(e)o(xisting)f(optimizers)g(\(e.g.,)j(V)-6
+b(olcano\).)16 b(W)l(e)c(addressed)f(the)g(fourth)g(point)f(by)75
+988 y(b)o(uilding)d(a)j(P2V)f(pre-processor)f(which)h(uses)g
+(sophisticated)d(algorithms)i(to)h(compose)g(and)g(compact)g(a)h
+(Prairie)75 1050 y(rule)j(set)f(into)g(a)h(V)-6 b(olcano)12
+b(rule)h(set.)21 b(T)l(o)13 b(demonstrate)f(the)h(scalability)e(of)i
+(our)f(approach,)i(we)f(re)o(wrote)g(the)f(TI)75 1112
+y(Open)i(OODB)f(rule)h(set)g(as)g(a)g(Prairie)g(rule)g(set,)h
+(generated)e(its)g(V)-6 b(olcano)14 b(counterpart,)g(and)f(sho)o(wed)g
+(that)g(the)75 1174 y(performance)f(of)f(the)f(synthesized)f(V)-6
+b(olcano)10 b(rule)h(set)f(closely)g(matches)h(that)f(of)h(the)g
+(hand-designed)e(V)-6 b(olcano)75 1236 y(rule)11 b(set.)137
+1298 y(Our)e(future)g(work)f(will)g(concentrate)h(on)g(de)o(v)o
+(eloping)f(higher)o(-le)o(v)o(el)g(abstractions)f(using)h(Prairie,)i
+(including)75 1360 y(automatically)g(generating)g(Prairie)h(rule)g
+(sets,)g(and)g(combining)e(multiple)h(Prairie)i(rule)f(sets)f(to)h
+(automatically)75 1423 y(generate)g(ef)o(\256cient)g(optimizers.)75
+1576 y FC(Ackno)o(wledgments)75 1685 y FG(W)l(e)17 b(wish)e(to)g(thank)
+g(T)m(e)o(xas)h(Instruments,)h(Inc.)f(for)h(making)e(the)h(Open)g(OODB)
+g(source)f(code)h(a)o(v)o(ailable)g(to)75 1748 y(us.)i(Comments)12
+b(by)f(Jos)s(\302)-18 b(e)11 b(Blakele)o(y)m(,)h(Anne)g(Ngu,)g(V)m(i)o
+(v)o(ek)f(Singhal)g(and)g(Thomas)h(W)l(oo)f(greatly)h(impro)o(v)o(ed)f
+(the)75 1810 y(quality)f(of)h(the)g(paper)m(.)75 1963
+y FC(Refer)o(ences)98 2073 y FG([1])20 b(D.)11 b(S.)g(Batory)m(.)16
+b(Building)8 b(blocks)i(of)g(database)g(management)h(systems.)j(T)m
+(echnical)c(Report)g(TR\26187\26123,)171 2135 y(The)i(Uni)o(v)o(ersity)
+d(of)i(T)m(e)o(xas)g(at)g(Austin,)f(February)i(1988.)98
+2230 y([2])20 b(Jos)s(\302)-18 b(e)16 b(A.)g(Blakele)o(y)m(,)i(W)n
+(illiam)d(J.)i(McK)o(enna,)g(and)f(Goetz)g(Graefe.)30
+b(Experiences)16 b(b)o(uilding)e(the)i(Open)171 2292
+y(OODB)g(query)g(optimizer)m(.)28 b(In)16 b FB(Pr)n(oceedings)e(1993)h
+(A)o(CM)h(SIGMOD)f(International)e(Confer)n(ence)j(on)171
+2354 y(Management)9 b(of)i(Data)p FG(,)g(pages)f(287\261296,)g(W)l
+(ashington,)g(May)i(1993.)98 2449 y([3])20 b(Michael)c(J.)g(Care)o(y)m
+(,)i(Da)o(vid)d(J.)h(DeW)n(itt,)h(Daniel)e(Frank,)i(Goetz)e(Graefe,)j
+(M.)f(Muralikrishna,)f(Joel)f(E.)171 2512 y(Richardson,)20
+b(and)e(Eugene)g(J.)g(Shekita.)34 b(The)18 b(architecture)g(of)g(the)g
+(EXODUS)g(e)o(xtensible)f(DBMS.)171 2574 y(In)d FB(Pr)n(oceedings)d
+(International)f(W)l(orkshop)h(on)i(Object-Oriented)e(Database)g
+(Systems)p FG(,)i(pages)g(52\26165,)171 2636 y(Asilomar)n(,)f
+(September)f(1986.)952 2793 y(23)p eop
+%%Page: 24 24
+24 23 bop 98 14 a FG([4])20 b(Dean)15 b(Daniels,)f(P)o(atricia)g
+(Selinger)n(,)h(Laura)f(Haas,)h(Bruce)g(Lindsay)m(,)e(C.)i(Mohan,)g
+(Adrian)e(W)l(alker)n(,)i(and)171 77 y(P)o(aul)j(W)n(ilms.)32
+b(An)17 b(introduction)d(to)j(distrib)o(uted)e(query)i(compilation)e
+(in)i(R)1446 60 y Fd(\003)1466 77 y FG(.)32 b(In)17 b
+FB(Pr)n(oceedings)f(2nd)171 139 y(International)9 b(Confer)n(ence)i(on)
+g(Distrib)o(uted)d(Databases)p FG(,)i(pages)h(291\261309,)f(Berlin,)h
+(September)h(1982.)98 233 y([5])20 b(Dinesh)12 b(Das)h(and)f(Don)g
+(Batory)m(.)21 b(Prairie:)e(An)13 b(algebraic)f(frame)o(work)h(for)g
+(rule)g(speci\256cation)e(in)h(query)171 295 y(optimizers.)26
+b(In)15 b FB(Pr)n(oceedings)e(of)i(the)f(W)l(orkshop)f(on)i(Database)e
+(Query)i(Optimizer)e(Gener)o(ators)g(and)171 357 y(Rule-Based)d
+(Optimizers)p FG(,)f(pages)i(139\261154,)f(Dallas,)h(September)g(1993.)
+98 451 y([6])20 b(Johann)8 b(Christoph)e(Fre)o(ytag.)12
+b(A)c(rule-based)g(vie)o(w)f(of)h(query)g(optimization.)i(In)e
+FB(Pr)n(oceedings)e(1987)h(A)o(CM)171 514 y(SIGMOD)13
+b(International)d(Confer)n(ence)j(on)f(Management)f(of)h(Data)p
+FG(,)h(pages)g(173\261180,)f(San)h(Francisco,)171 576
+y(May)f(1987.)98 670 y([7])20 b(Goetz)13 b(Graefe.)23
+b FB(Rule-Based)12 b(Query)h(Optimizatio)o(n)d(in)j(Extensible)f
+(Database)f(Systems)p FG(.)21 b(PhD)13 b(thesis,)171
+732 y(Uni)o(v)o(ersity)d(of)h(W)n(isconsin\261Madison,)e(1987.)98
+826 y([8])20 b(Goetz)12 b(Graefe.)19 b(V)-6 b(olcano,)12
+b(an)g(e)o(xtensible)e(and)i(parallel)f(query)h(e)o(v)o(aluation)e
+(system.)17 b(T)m(echnical)11 b(Report)171 888 y
+(CU\261CS\261481\26190,)g(Uni)o(v)o(ersity)e(of)i(Colorado)g(at)g
+(Boulder)n(,)h(July)e(1990.)98 983 y([9])20 b(Goetz)c(Graefe.)31
+b(Query)15 b(e)o(v)o(aluation)g(techniques)f(for)i(lar)o(ge)h
+(databases.)29 b FB(A)o(CM)15 b(Computing)g(Surve)o(ys)p
+FG(,)171 1045 y(25\(2\):73\261170,)10 b(June)g(1993.)75
+1139 y([10])20 b(Goetz)f(Graefe)i(and)e(Da)o(vid)f(J.)i(DeW)n(itt.)37
+b(The)19 b(EXODUS)g(optimizer)f(generator)m(.)39 b(In)19
+b FB(Pr)n(oceedings)171 1201 y(1987)12 b(A)o(CM)f(SIGMOD)h
+(International)d(Confer)n(ence)j(on)f(Management)f(of)i(Data)p
+FG(,)f(pages)h(387\261394,)f(San)171 1263 y(Francisco,)h(May)g(1987.)75
+1358 y([11])20 b(L.)15 b(M.)g(Haas,)h(J.)e(C.)h(Fre)o(ytag,)h(G.)e(M.)i
+(Lohman,)f(and)f(H.)g(Pirahesh.)25 b(Extensible)12 b(query)i
+(processing)f(in)171 1420 y(Starb)o(urst.)j(Research)c(Report)f(RJ)h
+(6610,)e(IBM)j(Almaden)e(Research)h(Center)n(,)g(December)g(1988.)75
+1514 y([12])20 b(W)l(on)9 b(Kim,)g(Da)o(vid)e(S.)j(Reiner)n(,)f(and)f
+(Don)g(S.)h(Batory)m(,)g(editors.)i FB(Query)d(Pr)n(ocessing)e(in)i
+(Database)f(Systems)p FG(.)171 1576 y(Springer)o(-V)-5
+b(erlag,)12 b(1985.)75 1671 y([13])20 b(Guy)12 b(M.)i(Lohman.)19
+b(Grammar)o(-like)12 b(functional)f(rules)h(for)h(representing)e(query)
+h(optimization)e(alterna-)171 1733 y(ti)o(v)o(es.)15
+b(In)10 b FB(Pr)n(oceedings)e(1988)i(A)o(CM)f(SIGMOD)h(International)d
+(Confer)n(ence)j(on)g(Management)e(of)i(Data)p FG(,)171
+1795 y(pages)h(18\26127,)g(Chicago,)g(June)g(1988.)75
+1889 y([14])20 b(Guy)13 b(M.)h(Lohman,)g(C.)g(Mohan,)h(Laura)e(M.)h
+(Haas,)h(Bruce)f(G.)f(Lindsay)m(,)g(P)o(atricia)h(G.)f(Selinger)n(,)h
+(P)o(aul)g(F)l(.)171 1951 y(W)n(ilms,)e(and)f(Dean)h(Daniels.)k(Query)c
+(processing)e(in)h(R)1075 1935 y Fd(\003)1095 1951 y
+FG(.)17 b(Research)c(Report)e(RJ)h(4272,)f(IBM)h(Research)171
+2013 y(Laboratory)m(,)f(San)h(Jose,)f(April)f(1984.)75
+2108 y([15])20 b(P)-5 b(.)14 b(Schwarz,)f(W)l(.)g(Chang,)f(J.)h(C.)g
+(Fre)o(ytag,)h(G.)e(Lohman,)h(J.)g(McPherson,)g(C.)g(Mohan,)g(and)f(H.)
+h(Pirahesh.)171 2170 y(Extensibility)i(in)i(the)g(Starb)o(urst)g
+(database)h(system.)33 b(In)18 b FB(Pr)n(oceedings)e(International)f(W)
+l(orkshop)h(on)171 2232 y(Object-Oriented)10 b(Database)f(Systems)p
+FG(,)i(pages)g(85\26192,)f(Asilomar)n(,)h(September)h(1986.)75
+2326 y([16])20 b(P)-5 b(.)13 b(G.)g(Selinger)e(and)h(M.)h(Adiba.)18
+b(Access)12 b(path)f(selection)g(in)h(distrib)o(uted)d(data)j(base)g
+(management)h(sys-)171 2388 y(tems.)19 b(In)13 b(Deen)f(and)g
+(Hammersly)m(,)h(editors,)e FB(Pr)n(oceedings)g(International)e(Confer)
+n(ence)j(on)g(Databases)p FG(,)171 2450 y(pages)f(204\261215,)f(Uni)o
+(v)o(ersity)g(of)h(Aberdeen,)g(July)f(1980.)75 2545 y([17])20
+b(P)-5 b(.)14 b(G.)e(Selinger)n(,)h(M.)g(M.)h(Astrahan,)e(D.)g(D.)h
+(Chamberlin,)g(R.)g(A.)g(Lorie,)f(and)g(T)m(.)h(G.)f(Price.)21
+b(Access)12 b(path)171 2607 y(selection)h(in)h(a)g(relational)f
+(database)h(management)g(system.)24 b(In)14 b FB(Pr)n(oceedings)e(1979)
+h(A)o(CM)h(SIGMOD)171 2669 y(International)9 b(Confer)n(ence)i(on)g
+(Management)e(of)h(Data)p FG(,)h(pages)g(23\26134,)f(Boston,)h(May)g
+(1979.)952 2793 y(24)p eop
+%%Page: 25 25
+25 24 bop 75 14 a FG([18])20 b(Michael)14 b(Stonebraker)f(and)h(La)o
+(wrence)g(A.)g(Ro)o(we.)23 b(The)14 b(design)e(of)i(Postgres.)22
+b(In)14 b FB(Pr)n(oceedings)e(1986)171 77 y(A)o(CM)g(SIGMOD)f
+(International)e(Confer)n(ence)j(on)g(Management)d(of)i(Data)p
+FG(,)h(pages)f(340\261355,)g(W)l(ashing-)171 139 y(ton,)g(May)h(1986.)
+75 234 y([19])20 b(Da)o(vid)14 b(L.)f(W)l(ells,)i(Jos)s(\302)-18
+b(e)13 b(A.)h(Blakele)o(y)m(,)g(and)g(Craig)f(W)l(.)h(Thompson.)22
+b(Architecture)13 b(of)h(an)g(open)f(object-)171 296
+y(oriented)e(database)g(management)g(system.)16 b FB(IEEE)11
+b(Computer)p FG(,)g(25\(10\):74\26182,)e(October)i(1992.)75
+391 y([20])20 b(C.)11 b(T)m(.)e(Y)-5 b(u)9 b(and)h(C.)g(C.)g(Chang.)k
+(Distrib)o(uted)7 b(query)i(processing.)k FB(A)o(CM)c(Computing)f
+(Surve)o(ys)p FG(,)h(16\(4\):399\261)171 453 y(433,)i(December)i(1984.)
+952 2793 y(25)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/macros/latex/contrib/utthesis/utthesis.doc b/macros/latex/contrib/utthesis/utthesis.doc
new file mode 100644
index 0000000000..5322f9ca06
--- /dev/null
+++ b/macros/latex/contrib/utthesis/utthesis.doc
@@ -0,0 +1,152 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%
+%%% File: utthesis.doc, version 2.0, January 1995
+%%% =============================================
+%%% Copyright (c) 1995 by Dinesh Das. All rights reserved.
+%%% This file is free and can be modified or distributed as long as
+%%% you meet the following conditions:
+%%%
+%%% (1) This copyright notice is kept intact on all modified copies.
+%%% (2) If you modify this file, you MUST NOT use the original file name.
+%%%
+%%% This file contains a template that can be used with the package
+%%% utthesis.sty and LaTeX2e to produce a thesis that meets the requirements
+%%% of the Graduate School of The University of Texas at Austin.
+%%%
+%%% All of the commands defined by utthesis.sty have default values (see
+%%% the file utthesis.sty for these values). Thus, theoretically, you
+%%% don't need to define values for any of them; you can run this file
+%%% through LaTeX2e and produce an acceptable thesis, without any text.
+%%% However, you probably want to set at least some of the macros (like
+%%% \thesisauthor). In that case, replace "..." with appropriate values,
+%%% and uncomment the line (by removing the leading %'s).
+%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass[11pt]{report} %% LaTeX2e document.
+\usepackage {utthesis} %% Preamble.
+
+% \mastersthesis %% Uncomment one of these; if you don't
+% \phdthesis %% use either, the default is \phdthesis.
+
+% \thesisdraft %% Uncomment this if you want a draft
+ %% version; this will print a timestamp
+ %% on each page of your thesis.
+
+% \leftchapter %% Uncomment one of these if you want
+% \centerchapter %% left-justified, centered or
+% \rightchapter %% right-justified chapter headings.
+ %% Chapter headings includes the
+ %% Contents, Acknowledgments, Lists
+ %% of Tables and Figures and the Vita.
+ %% The default is \centerchapter.
+
+% \singlespace %% Uncomment one of these if you want
+% \oneandhalfspace %% single-spacing, space-and-a-half
+% \doublespace %% or double-spacing; the default is
+ %% \oneandhalfspace, which is the
+ %% minimum spacing accepted by the
+ %% Graduate School.
+
+\renewcommand{\thesisauthor}{...} %% Your official UT name.
+
+\renewcommand{\thesismonth}{...} %% Your month of graduation.
+
+\renewcommand{\thesisyear}{...} %% Your year of graduation.
+
+\renewcommand{\thesistitle}{...} %% The title of your thesis; use
+ %% mixed-case.
+
+\renewcommand{\thesisauthorpreviousdegrees}{...}
+ %% Your previous degrees, abbreviated;
+ %% separate multiple degrees by commas.
+
+\renewcommand{\thesissupervisor}{...}
+ %% Your thesis supervisor; use mixed-case
+ %% and don't use any titles or degrees.
+
+\renewcommand{\thesisauthoraddress}{...}
+ %% Your permanent address; use "\\" for
+ %% linebreaks.
+
+\renewcommand{\thesisdedication}{...}
+ %% Your dedication, if you have one; use
+ %% "\\" for linebreaks.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%
+%%% The following commands are all optional, but useful if your requirements
+%%% are different from the default values in utthesis.sty. To use them,
+%%% simply uncomment (remove the leading %) the line(s).
+
+% \renewcommand{\thesiscommitteesize}{...}
+ %% Uncomment this only if your thesis
+ %% committee does NOT have 5 members
+ %% for \phdthesis or 2 for \mastersthesis.
+ %% Replace the "..." with the correct
+ %% number of members.
+
+% \renewcommand{\thesisdegree}{...} %% Uncomment this only if your thesis
+ %% degree is NOT "DOCTOR OF PHILOSOPHY"
+ %% for \phdthesis or "MASTER OF ARTS"
+ %% for \mastersthesis. Provide the
+ %% correct FULL OFFICIAL name of
+ %% the degree.
+
+% \renewcommand{\thesisdegreeabbreviation}{...}
+ %% Use this if you also use the above
+ %% command; provide the OFFICIAL
+ %% abbreviation of your thesis degree.
+
+% \renewcommand{\thesistype}{...} %% Use this ONLY if your thesis type
+ %% is NOT "Dissertation" for \phdthesis
+ %% or "Thesis" for \mastersthesis.
+ %% Provide the OFFICIAL type of the
+ %% thesis; use mixed-case.
+
+% \renewcommand{\thesistypist}{...} %% Use this to specify the name of
+ %% the thesis typist if it is anything
+ %% other than "the author".
+
+%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{document}
+
+\thesiscopyrightpage %% Generate the copyright page.
+
+\thesistitlepage %% Generate the title page.
+
+\thesissignaturepage %% Generate the signature page.
+
+\thesisdedicationpage %% Generate the dedication page.
+
+\begin{thesisacknowledgments} %% Use this to write your
+... %% acknowledgments; it can be anything
+\end{thesisacknowledgments} %% allowed in LaTeX2e par-mode.
+
+\begin{thesisabstract} %% Use this to write your thesis
+... %% abstract; it can be anything
+\end{thesisabstract} %% allowed in LaTeX2e par-mode.
+
+\tableofcontents %% Generate table of contents.
+% \listoftables %% Uncomment this to generate list
+ %% of tables.
+% \listoffigures %% Uncomment this to generate list
+ %% of figures.
+
+\chapter{...} %% Begin your thesis text here; follow
+ %% the report style and group your text
+ %% in chapters, sections, etc.
+
+\chapter{...} %% More chapters.
+
+\begin{thebibliography}{..} %% Start your bibliography here; you can
+\bibitem{...} ... %% also use the \bibliography command
+\end{thebibliography} %% to generate your bibliography.
+
+\begin{thesisauthorvita} %% Write your vita here; it can be
+... %% anything in LaTeX2e par-mode.
+\end{thesisauthorvita} %%
+
+\end{document} %% Done.
diff --git a/macros/latex/contrib/utthesis/utthesis.sty b/macros/latex/contrib/utthesis/utthesis.sty
new file mode 100644
index 0000000000..9b04f9a19b
--- /dev/null
+++ b/macros/latex/contrib/utthesis/utthesis.sty
@@ -0,0 +1,716 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%
+%%% File: utthesis.sty, version 2.0, January 1995
+%%% =============================================
+%%% Copyright (c) 1995 by Dinesh Das. All rights reserved.
+%%% This file is free and can be modified or distributed as long as
+%%% you meet the following conditions:
+%%%
+%%% (1) This copyright notice is kept intact on all modified copies.
+%%% (2) If you modify this file, you MUST NOT use the original file name.
+%%%
+%%% This file defines macros used for preparing theses for
+%%% The University of Texas at Austin. It has been tested with LaTeX2e.
+%%% I do NOT guarantee that it will meet all requirements of the
+%%% Graduate School; however, if you find that something violates the
+%%% specifications, please send me email at <ddas@cs.utexas.edu> and
+%%% I will try to fix it.
+%%%
+%%% Usage:
+%%% ======
+%%%
+%%% To use this file with LaTeX2e, make sure your TEXINPUTS environment
+%%% variable contains the directory in which this file is located.
+%%% Include this file as a package in the preamble:
+%%%
+%%% \documentclass[...]{report}
+%%% \usepackage{utthesis}
+%%%
+%%% On non-UNIX systems, there might be different environment variables
+%%% that might need to be set. I know nothing about such machines,
+%%% however; consult your local guru for details.
+%%%
+%%% A template for a thesis is provided in the file "utthesis.doc", available
+%%% from the same place where you obtained this file.
+%%%
+%%% Command Names:
+%%% ==============
+%%%
+%%% ALL command names used in this file that are used to format the
+%%% thesis begin with "thesis" (e.g., \thesisauthor). All of these
+%%% commands can be changed by the user using \renewcommand, e.g.,
+%%%
+%%% \renewcommand{\thesisauthor}{First M. Last}
+%%%
+%%% after loading the package in LaTeX2e.
+%%%
+%%% The following is a list of all thesis-related variables used together
+%%% with their default values:
+%%%
+%%% \thesisauthor %% Name of the author; defaults to "Ima Student".
+%%% \thesismonth %% Month of graduation; defaults to "May".
+%%% \thesisyear %% Year of graduation; defaults to "1994".
+%%% \thesistitle %% Full title of dissertation; defaults to "Title".
+%%% \thesistitletypesize
+%%% %% Typesize used to typeset \thesistitle; defaults
+%%% %% to \Large.
+%%% \thesisauthorpreviousdegrees
+%%% %% Previous degrees of author; defaults to "Degree"
+%%% \thesissupervisor%% Name of thesis supervisor; defaults to "Supervisor"
+%%% \thesisauthoraddress
+%%% %% Permanent address of author; defaults to "USA"
+%%% \thesisapprovedby%% Approval of dissertation committee; defaults to
+%%% %% "Approved by".
+%%% \thesisapprovedbytypesize
+%%% %% Typesize used to typeset \thesisapprovedby; defaults
+%%% %% to \large.
+%%% \thesiscopyrightholder
+%%% %% Name of copyright holder; defaults to \thesisauthor.
+%%% \thesistypist %% Name of thesis typist; defaults to "the author".
+%%% \thesistype %% Type of thesis; defaults to "Dissertation".
+%%% \thesistypetypesize
+%%% %% Typesize used to typeset \thesistype; defaults to
+%%% %% \large.
+%%% \thesisdegree %% Degree for which thesis is submitted; defaults to
+%%% %% "Doctor of Philosophy".
+%%% \thesisdegreetypesize
+%%% %% Typesize used to typeset \thesisdegree; defaults to
+%%% %% \large.
+%%% \thesisdegreeabbreviation
+%%% %% Abbreviation of \thesisdegree; defaults to "Ph.D.".
+%%% \thesiscommitteesize
+%%% %% Number of members in thesis committee; defaults to 5.
+%%% \thesiscommittee %% Name of thesis committee; defaults to
+%%% %% "Dissertation Committee:".
+%%% \thesiscommitteetypesize
+%%% %% Typesize used to typeset \thesiscommittee; defaults
+%%% %% to \large.
+%%% \thesisvitahead %% Title of the vita page; defaults to "Vita".
+%%% \thesisvitaheadtypesize
+%%% %% Typesize used to typeset \thesisvitahead; unused.
+%%% \thesisacknowledgmenthead
+%%% %% Title of the acknowledgments page; defaults to
+%%% %% "Acknowledgments".
+%%% \thesisacknowledgmentheadtypesize
+%%% %% Typesize used to typeset \thesisacknowledgmenthead;
+%%% %% unused.
+%%% \thesisacknowledgmentsigname
+%%% %% Signature on the acknowledgments page; defaults to
+%%% %% \thesisauthor.
+%%% \thesisacknowledgmentsignametypesize
+%%% %% Typesize used to typeset \thesisacknowledgmentsigname;
+%%% %% defaults to \large.
+%%% \thesisacknowledgmentsigplace
+%%% %% Address used on the acknowledgments page; defaults
+%%% %% to "The University of Texas at Austin \\ \thesismonth
+%%% %% \thesisyear".
+%%% \thesisstudent %% Name of author with previous degrees; defaults to
+%%% %% "\thesisauthor, \thesisauthorpreviousdegrees".
+%%% \thesisstudenttypesize
+%%% %% Typesize used to typeset \thesisstudent; defaults
+%%% %% to \large.
+%%% \thesisdedication%% Person or thing dedicated to; defaults to
+%%% %% "To myself". :-)
+%%%
+%%% Most of the default values will satisfy the Graduate School's
+%%% requirements; however, at a minimum, the user SHOULD redefine the
+%%% following commands:
+%%%
+%%% \thesisauthor
+%%% \thesismonth
+%%% \thesisyear
+%%% \thesistitle
+%%% \thesisauthorpreviousdegrees
+%%% \thesissupervisor
+%%% \thesisauthoraddress
+%%%
+%%% In addition to the above variables, the following commands are
+%%% provided to generate the optional sections of the thesis:
+%%%
+%%% \thesiscopyrightpage
+%%% %% Generates the copyright page.
+%%% \thesistitlepage %% Generates the title page.
+%%% \thesissignaturepage
+%%% %% Generates the signature page.
+%%% \thesisdedicationpage
+%%% %% Generates the dedication page.
+%%%
+%%% There are also a few environments to generate paragraph-like text:
+%%%
+%%% thesisacknowledgments
+%%% %% Text of acknowledgments.
+%%% thesisabstract %% Text of abstract.
+%%% thesisauthorvita %% Text of author's vita.
+%%%
+%%% Bells and Whistles:
+%%% ===================
+%%%
+%%% The following commands are provided purely for playing around with.
+%%% They should be used in the document preamble (before \begin{document}).
+%%%
+%%% \thesisdraft %% Prints a timestamp at the top of each page. This
+%%% %% must be invoked in the document preamble (before
+%%% %% \begin{document}).
+%%% \leftchapter, \centerchapter, \rightchapter
+%%% %% These commands generate left-justified, centered,
+%%% %% and right-justified chapter headings, respectively.
+%%% \singlespace, \oneandhalfspace, \doublespace
+%%% %% These define the line spacing to single-space,
+%%% %% one-and-one-half space, and double-space
+%%% %% respectively. Note that the minimum spacing
+%%% %% required by the Graduate School is \oneandhalfspace,
+%%% %% but \singlespace is useful, e.g., when using
+%%% %% \thesisdraft.
+%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\typeout{*************************************************************}
+\typeout{** UT Austin Thesis Style File, version 2.0, January 1995 }
+\typeout{** Written by Dinesh Das }
+\typeout{** Dept. of Computer Sciences }
+\typeout{** The University of Texas at Austin }
+\typeout{*************************************************************}
+
+%%%
+%%% Set up page layout parameters.
+%%%
+\setlength{\textheight}{8in}
+\setlength{\oddsidemargin}{0.5in}
+\setlength{\evensidemargin}{0.5in}
+\setlength{\textwidth}{5.50in}
+\setlength{\topmargin}{0.5in}
+\setlength{\headheight}{0in}
+\setlength{\headsep}{0in}
+\setlength{\parindent}{12mm}
+
+%%%
+%%% Set up default values.
+%%%
+\newcommand{\@universityname}{The University of Texas at Austin}
+\newcommand{\@publicationno}{Publication No.\ \line(1,0){40} \\[10mm]}
+\newcommand{\thesisauthor}{Ima Student}
+\newcommand{\thesismonth}{May}
+\newcommand{\thesisyear}{1994}
+\newcommand{\thesistitle}{Title}
+\newcommand{\thesistitletypesize}{\Large}
+\newcommand{\thesisauthorpreviousdegrees}{Degree}
+\newcommand{\thesissupervisor}{Supervisor}
+\newcommand{\thesisauthoraddress}{USA}
+\newcommand{\thesisapprovedby}{Approved by}
+\newcommand{\thesisapprovedbytypesize}{\large}
+\newcommand{\thesiscopyrightholder}{\thesisauthor}
+\newcommand{\thesistypist}{the author}
+\newcommand{\thesistype}{Dissertation}
+\newcommand{\thesistypetypesize}{\large}
+\newcommand{\thesistypesize}{\large}
+\newcommand{\thesisdegree}{Doctor of Philosophy}
+\newcommand{\thesisdegreetypesize}{\large}
+\newcommand{\thesisdegreeabbreviation}{Ph.D.}
+\newcommand{\thesiscommitteesize}{5}
+\newcommand{\thesiscommittee}{Dissertation Committee:}
+\newcommand{\thesiscommitteetypesize}{\large}
+\newcommand{\thesisvitahead}{Vita}
+\newcommand{\thesisvitaheadtypesize}{\Large}
+\newcommand{\thesisacknowledgmenthead}{Acknowledgments}
+\newcommand{\thesisacknowledgmentheadtypesize}{\Large}
+\newcommand{\thesisacknowledgmentsigname}{\thesisauthor}
+\newcommand{\thesisacknowledgmentsignametypesize}{\large}
+\newcommand{\thesisacknowledgmentsigplace}%
+ {{\slshape
+ \renewcommand{\arraystretch}{1.0}
+ \begin{tabular}{l}
+ \@universityname \\
+ \thesismonth\ \thesisyear
+ \end{tabular}}}
+\newcommand{\thesisstudent}{\thesisauthor, \thesisauthorpreviousdegrees}
+\newcommand{\thesisstudenttypesize}{\large}
+\newcommand{\thesisdedication}{To myself}
+
+%%%
+%%% Command for masters theses. \phdthesis is provided for symmetry.
+%%%
+\newcommand{\mastersthesis}{
+ \renewcommand{\thesistype}{Thesis}
+ \renewcommand{\@publicationno}{}
+ \renewcommand{\thesisdegree}{Master of Arts}
+ \renewcommand{\thesisdegreeabbreviation}{M.A.}
+ \renewcommand{\thesiscommitteesize}{2}
+ \renewcommand{\thesiscommittee}{Supervising Committee:}}
+\newcommand{\phdthesis}{}
+
+%%%
+%%% Set up other commands.
+%%%
+\newcommand{\@defaultbaselinestretch}{1.5}
+\newcommand{\@base}[1]{\renewcommand{\baselinestretch}{#1}}
+\newcommand{\singlespace}{\renewcommand{\@defaultbaselinestretch}{1.1}}
+\newcommand{\oneandhalfspace}{\renewcommand{\@defaultbaselinestretch}{1.5}}
+\newcommand{\doublespace}{\renewcommand{\@defaultbaselinestretch}{1.7}}
+\newcommand{\@thesistitle}{\textbf{\thesistitletypesize \thesistitle}}
+\newcommand{\@thesisapprovedby}%
+ {\textbf{\thesisapprovedbytypesize \thesisapprovedby}}
+\newcommand{\@thesistype}{\textbf{\thesistypetypesize \thesistype}}
+\newcommand{\@thesisdegree}{\textbf{\thesisdegreetypesize \thesisdegree}}
+\newcommand{\@thesisdegreeabbreviation}{\thesisdegreeabbreviation}
+\newcommand{\@thesiscommittee}%
+ {\textbf{\thesiscommitteetypesize \thesiscommittee}}
+\newcommand{\@thesisvitahead}{\thesisvitahead}
+\newcommand{\@thesisacknowledgmenthead}%
+ {\thesisacknowledgmenthead}
+\newcommand{\@thesisacknowledgmentsigname}%
+ {\textsc{\thesisacknowledgmentsignametypesize \thesisacknowledgmentsigname}}
+\newcommand{\@thesisacknowledgmentsigplace}{\thesisacknowledgmentsigplace}
+\newcommand{\@thesisstudent}{\textbf{\thesisstudenttypesize \thesisstudent}}
+
+%%%
+%%% Indent the first paragraph after a sectioning command.
+%%%
+%%% \let\@afterindentfalse\@afterindenttrue
+%%% \@afterindenttrue
+
+%%%
+%%% Set up default page numbering and line spacing.
+%%%
+\newcommand{\@textpagenumbering}{arabic}
+\newcommand{\@preamblepagenumbering}{roman}
+\newcommand{\@textpagestyle}{plain}
+\newcommand{\@preamblepagestyle}{plain}
+\pagenumbering{\@preamblepagenumbering}
+\@base{\@defaultbaselinestretch}
+
+\newcommand{\@chaptertype}{\chaptername}
+\newcommand{\@appendix}{0}
+
+%%%
+%%% Command to generate copyright page.
+%%%
+\newcommand{\thesiscopyrightpage}{
+ \thispagestyle{empty}
+ \strut \vfill
+ \begin{center}
+ \begin{spacing}{2}
+ Copyright \\ by \\ \thesiscopyrightholder \\ \thesisyear
+ \end{spacing}
+ \end{center}
+ \vfill \strut
+ \newpage}
+
+%%%
+%%% Command to generate title page.
+%%%
+\newcommand{\thesistitlepage}{
+ \thispagestyle{empty}
+ \begin{spacing}{2}
+ \begin{center}
+ \@thesistitle \\[8mm]
+ by \\[4mm]
+ \@thesisstudent \\
+ \vspace{26mm}
+ \textbf{\thesistypetypesize \thesistype} \\
+ Presented to the Faculty of the Graduate School of \\
+ \@universityname \\
+ in Partial Fulfillment \\
+ of the Requirements \\
+ for the Degree of \\[4mm]
+ \textbf{\thesisdegreetypesize \thesisdegree} \\
+ \vspace{26mm}
+ \textbf{\Large \@universityname} \\[4mm]
+ \thesismonth \ \thesisyear
+ \end{center}
+ \end{spacing}
+ \newpage}
+
+%%%
+%%% Command to generate signature page.
+%%%
+\newcommand{\thesissignaturepage}{
+ \thispagestyle{empty}
+ \begin{spacing}{2}
+ \strut \vfill
+ \begin{center}
+ \@thesistitle
+ \end{center}
+ \vspace{50mm}
+ \mbox{} \hfill \begin{minipage}{67mm}
+ \begin{spacing}{1}
+ \@thesisapprovedby\hfill\mbox{} \\
+ \@thesiscommittee \\[15mm]
+ \end{spacing}
+ \setlength{\unitlength}{1mm}
+ \begin{picture}(67,70)(0,0)
+ \multiput(0,70)(0,-10)
+ {\thesiscommitteesize}{\line(1,0){67}}
+ \end{picture}
+ \end{minipage}
+ \vfill \strut
+ \end{spacing}
+ \newpage}
+
+%%%
+%%% Environment to generate abstract page.
+%%%
+\newenvironment{thesisabstract}
+ {\addcontentsline{toc}{chapter}{Abstract}
+ \vspace*{0mm}
+ \begin{center}
+ \setlength{\unitlength}{1mm}
+ \begin{spacing}{2}
+ \@thesistitle \\[10mm]
+ \end{spacing}
+ \begin{spacing}{\@defaultbaselinestretch}
+ \@publicationno
+ \thesisauthor, \thesisdegreeabbreviation \\
+ \@universityname, \thesisyear \\[10mm]
+ \end{spacing}
+ Supervisor: \thesissupervisor \\
+ \end{center}
+ \vspace{5mm}
+ \begin{spacing}{\@defaultbaselinestretch} \noindent}
+ {\end{spacing} \newpage}
+
+%%%
+%%% Command to generate dedication page.
+%%%
+\newcommand{\thesisdedicationpage}{
+ \thispagestyle{empty}
+ \strut \vfill
+ \begin{spacing}{\@defaultbaselinestretch}
+ \begin{center}
+ \thesisdedication
+ \end{center}
+ \end{spacing}
+ \vfill \strut
+ \newpage}
+
+%%%
+%%% Environment to generate acknowledgments page.
+%%%
+\newenvironment{thesisacknowledgments}
+ {%\doublespace\small\normalsize
+ \chapter*{\@thesisacknowledgmenthead
+ \@mkboth{\uppercase{\@thesisacknowledgmenthead}}
+ {\uppercase{\@thesisacknowledgmenthead}}}
+ \addcontentsline{toc}{chapter}{\@thesisacknowledgmenthead}
+ \begin{spacing}{\@defaultbaselinestretch}}
+ {\end{spacing} \par \vspace{20mm}
+ \raggedleft \@thesisacknowledgmentsigname \\[10mm]
+ \raggedright \@thesisacknowledgmentsigplace \newpage}
+
+%%%
+%%% Environment to generate vita page.
+%%%
+\newenvironment{thesisauthorvita}
+ {\clearpage
+ \chapter*{\@thesisvitahead
+ \@mkboth{\uppercase{\@thesisvitahead}}
+ {\uppercase{\@thesisvitahead}}}
+ \addcontentsline{toc}{chapter}{\@thesisvitahead}
+ \begin{spacing}{\@defaultbaselinestretch}}
+ {\end{spacing} \par \vspace{20mm}
+ \noindent Permanent Address:
+ \begin{minipage}[t]{90mm}
+ \thesisauthoraddress
+ \end{minipage}
+ \par \vspace{15mm}
+ \noindent This \lowercase\expandafter{\thesistype} was
+ typeset with \LaTeXe\footnote{\LaTeXe{} is an extension of \LaTeX.
+ \LaTeX{} is a collection of macros for \TeX. \TeX{} is a
+ trademark of the American Mathematical Society. The macros used in
+ formatting this \lowercase\expandafter{\thesistype} were written
+ by Dinesh Das, Department of Computer Sciences, The University
+ of Texas at Austin.
+ } by \thesistypist.}
+
+\newcommand{\@chapteralignment}{\centering}
+\renewcommand{\chapter}{\clearpage
+ \ifnum\@appendix=1
+ \renewcommand{\@chaptertype}{\appendixname}
+ \else
+ \renewcommand{\@chaptertype}{\chaptername}
+ \fi
+ \thispagestyle{plain}%
+ \global\@topnum\z@
+ \@afterindentfalse
+ \secdef\@chapter\@schapter
+ }
+\renewcommand\appendix{\par
+ \setcounter{chapter}{0}%
+ \setcounter{section}{0}%
+ \renewcommand{\@chapapp}{\appendixname}%
+ \renewcommand{\thechapter}{\Alph{chapter}}
+ \renewcommand{\@appendix}{1}}
+
+%%%
+%%% Define chapter heading placement commands.
+%%%
+\newcommand{\leftchapter}{
+ \renewcommand{\@chapteralignment}{\raggedright}}
+\newcommand{\centerchapter}{
+ \renewcommand{\@chapteralignment}{\centering}}
+\newcommand{\rightchapter}{
+ \renewcommand{\@chapteralignment}{\raggedleft}}
+
+%%%
+%%% Command from report.cls, (c) LaTeX3 Project.
+%%%
+\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
+ \refstepcounter{chapter}%
+ \typeout{\@chapapp\space\thechapter.}%
+ \addcontentsline{toc}{chapter}%
+ {\@chaptertype{} \protect\numberline{\thechapter}#1}%
+ \else
+ \addcontentsline{toc}{chapter}{\@chaptertype{} #1}
+ \fi
+ \ifnum\value{chapter}=1
+ \ifnum\@appendix=0
+ \pagestyle{\@textpagestyle}
+ \pagenumbering{\@textpagenumbering}
+ \fi
+ \fi
+ \chaptermark{#1}%
+ \addtocontents{lof}{\protect\addvspace{10\p@}}%
+ \addtocontents{lot}{\protect\addvspace{10\p@}}%
+ \if@twocolumn
+ \@topnewpage[\@makechapterhead{#2}]%
+ \else
+ \@makechapterhead{#2}%
+ \@afterheading
+ \fi
+ }
+
+%%%
+%%% Command from report.cls, (c) LaTeX3 Project.
+%%%
+\def\@makechapterhead#1{%
+ \vspace*{50\p@}%
+ {\parindent \z@ \@chapteralignment \reset@font
+ \ifnum \c@secnumdepth >\m@ne
+ \huge\bfseries \@chapapp{} \thechapter
+ \par
+ \vskip 20\p@
+ \fi
+ \Huge \bfseries #1\par
+ \nobreak
+ \vskip 40\p@
+ }}
+\def\@makeschapterhead#1{%
+ \vspace*{50\p@}%
+ {\parindent \z@ \@chapteralignment
+ \reset@font
+ \Huge \bfseries #1\par
+ \nobreak
+ \vskip 40\p@
+ }}
+
+%%%
+%%% Command from report.cls, (c) LaTeX3 Project.
+%%%
+\renewenvironment{thebibliography}[1]
+ {\chapter*{\bibname
+ \@mkboth{\uppercase{\bibname}}{\uppercase{\bibname}}}%
+ \addcontentsline{toc}{chapter}{\bibname}
+ \list{\@biblabel{\arabic{enumiv}}}%
+ {\settowidth\labelwidth{\@biblabel{#1}}%
+ \leftmargin\labelwidth
+ \advance\leftmargin\labelsep
+ \if@openbib
+ \advance\leftmargin\bibindent
+ \itemindent -\bibindent
+ \listparindent \itemindent
+ \parsep \z@
+ \fi
+ \usecounter{enumiv}%
+ \let\p@enumiv\@empty
+ \renewcommand\theenumiv{\arabic{enumiv}}}%
+ \if@openbib
+ \renewcommand\newblock{\par}
+ \else
+ \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
+ \fi
+ \sloppy\clubpenalty4000\widowpenalty4000%
+ \sfcode`\.=\@m}
+ {\def\@noitemerr{\@warning{Empty `thebibliography' environment}}%
+ \endlist}
+
+%%%
+%%% Command from report.cls, (c) LaTeX3 Project.
+%%%
+\renewcommand\listoftables{%
+ \if@twocolumn
+ \@restonecoltrue\onecolumn
+ \else
+ \@restonecolfalse
+ \fi
+ \chapter*{\listtablename
+ \@mkboth{\uppercase{\listtablename}}{\uppercase{\listtablename}}}%
+ \addcontentsline{toc}{chapter}{\listtablename}
+ \@starttoc{lot}%
+ \if@restonecol\twocolumn\fi
+ }
+\renewcommand\listoffigures{%
+ \if@twocolumn
+ \@restonecoltrue\onecolumn
+ \else
+ \@restonecolfalse
+ \fi
+ \chapter*{\listfigurename
+ \@mkboth{\uppercase{\listfigurename}}%
+ {\uppercase{\listfigurename}}}%
+ \addcontentsline{toc}{chapter}{\listfigurename}
+ \@starttoc{lof}%
+ \if@restonecol\twocolumn\fi
+ }
+\renewcommand\tableofcontents{%
+ \if@twocolumn
+ \@restonecoltrue\onecolumn
+ \else
+ \@restonecolfalse
+ \fi
+ \chapter*{\contentsname
+ \@mkboth{\uppercase{\contentsname}}{\uppercase{\contentsname}}}%
+ \@starttoc{toc}%
+ \if@restonecol\twocolumn\fi
+ }
+
+%%%
+%%% Command to print draft version of the thesis.
+%%%
+\newcommand{\thesisdraft}{
+ \setlength{\topmargin}{0in}
+ \setlength{\headheight}{0.2in}
+ \setlength{\headsep}{0.25in}
+ \renewcommand{\@textpagestyle}{myheadings}
+ \def\ps@myheadings{%
+ \let\@oddfoot\@empty\let\@evenfoot\@empty
+ \def\@oddhead{\textsl{Draft of \timestamp}\hfil\thepage}%
+ \let\@mkboth\@gobbletwo
+ \let\chaptermark\@gobble
+ \let\sectionmark\@gobble}
+ }
+
+%%%
+%%% Code to compute current timestamp. Some parts by Martin Minow.
+%%%
+\newcount\hour \newcount\minute
+\hour=\time \divide \hour by 60
+\minute=\time
+\loop \ifnum \minute > 59 \advance \minute by -60 \repeat
+\def\thesistime{\ifnum \hour<13 \number\hour:%
+ \ifnum \minute<10 0\fi
+ \number\minute
+ \ifnum \hour<12 \ am\else \ pm\fi
+ \else \advance \hour by -12 \number\hour:%
+ \ifnum \minute<10 0\fi
+ \number\minute \ pm\fi}
+
+\def\thesisdate{\ifcase\month\or
+January\or February\or March\or April\or May\or June\or
+July\or August\or September\or October\or November\or December\fi
+\space\number\day, \number\year}
+
+\newcount\dow
+\newcount\leap
+\newcount\x
+\newcount\y
+
+%leap = year + (month - 14)/12
+\leap=\month \advance\leap by -14 \divide\leap by 12
+ \advance\leap by \year
+
+%dow = (13 * (month + 10 - (month + 10)/13*12) - 1)/5
+\dow=\month \advance\dow by 10
+ \y=\dow \divide\y by 13 \multiply\y by 12
+ \advance\dow by -\y \multiply\dow by 13 \advance\dow by -1 \divide\dow by 5
+
+%dow += day + 77 + 5 * (leap % 100)/4
+\advance\dow by \day \advance\dow by 77
+ \x=\leap \y=\x \divide\y by 100 \multiply\y by 100 \advance\x by -\y
+ \multiply\x by 5 \divide\x by 4 \advance\dow by \x
+
+%dow += leap / 400
+\x=\leap \divide\x by 400 \advance\dow by \x
+
+%dow -= leap / 100 * 2;
+%dow = (dow % 7)
+\x=\leap \divide\x by 100 \multiply\x by 2 \advance\dow by -\x
+ \x=\dow \divide\x by 7 \multiply\x by 7 \advance\dow by -\x
+
+\def\thesisdayofweek{\ifcase\dow
+Sunday\or Monday\or Tuesday\or
+Wednesday\or Thursday\or Friday\or Saturday\fi}
+
+\def\timestamp{\thesistime, \thesisdayofweek, \thesisdate}
+
+%%%
+%%% Commands for spacing. Some parts from spacing.sty by Stephen Page.
+%%%
+\ifx\undefined\selectfont
+\def\@setsize#1#2#3#4{\@nomath#1
+ \let\@currsize#1\baselineskip
+ #2\baselineskip\baselinestretch\baselineskip
+ \parskip\baselinestretch\parskip
+ \setbox\strutbox\hbox{\vrule height.7\baselineskip
+ depth.3\baselineskip width\z@}
+ \normalbaselineskip\baselineskip#3#4}
+\else
+\def\@newbaseline{%
+ \ifx\undefined\setnew@baselineskip
+ \baselineskip\f@baselineskip\relax
+ \else
+ \setnew@baselineskip
+ \fi
+ \baselineskip\baselinestretch\baselineskip
+ \setbox\strutbox\hbox{\vrule\@height.7\baselineskip
+ \@depth.3\baselineskip \@width\z@}%
+ \normalbaselineskip\baselineskip}
+\fi
+%%%
+%%% Reset baselinestretch within footnotes and floats. Originally stolen
+%%% from Stanford thesis style.
+%%%
+\def\@xfloat#1[#2]{\ifhmode \@bsphack\@floatpenalty -\@Mii\else
+ \@floatpenalty-\@Miii\fi\def\@captype{#1}\ifinner
+ \@parmoderr\@floatpenalty\z@
+ \else\@next\@currbox\@freelist{\@tempcnta\csname ftype@#1\endcsname
+ \multiply\@tempcnta\@xxxii\advance\@tempcnta\sixt@@n
+ \@tfor \@tempa :=#2\do
+ {\if\@tempa h\advance\@tempcnta \@ne\fi
+ \if\@tempa t\advance\@tempcnta \tw@\fi
+ \if\@tempa b\advance\@tempcnta 4\relax\fi
+ \if\@tempa p\advance\@tempcnta 8\relax\fi
+ }\global\count\@currbox\@tempcnta}\@fltovf\fi
+ \global\setbox\@currbox\vbox\bgroup
+ \def\baselinestretch{1}
+ \ifx\undefined\selectfont
+ \small\normalsize
+ \else
+ \@newbaseline
+ \fi
+ \boxmaxdepth\z@
+ \hsize\columnwidth \@parboxrestore}
+\long\def\@footnotetext#1{\insert\footins{\def\baselinestretch{1}\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext
+ {\rule{\z@}{\footnotesep}\ignorespaces
+ #1\strut}}}
+%%%
+%%% Stolen from MIT.
+%%%
+\def\spacing#1{\par%
+ \begingroup
+ \def\baselinestretch{#1}
+ \ifx\undefined\selectfont
+ \ifx\@currsize\normalsize\@normalsize\else\@currsize\fi
+ \else
+ \@newbaseline
+ \fi}
+\def\endspacing{\par
+ \vskip \parskip
+ \vskip \baselineskip
+ \endgroup
+ \vskip -\parskip
+ \vskip -\baselineskip}
+