summaryrefslogtreecommitdiff
path: root/db/docs/gsg/JAVA/joins.html
diff options
context:
space:
mode:
authorjbj <devnull@localhost>2004-10-16 01:31:54 +0000
committerjbj <devnull@localhost>2004-10-16 01:31:54 +0000
commitd03f220fde879509cab2ac1c73b71b7efb52b737 (patch)
tree1e34bfadac0a6618d0e9a7933bad90063a785acf /db/docs/gsg/JAVA/joins.html
parent2dc699bfe049b9319ea3719f604d25940ff52004 (diff)
downloadlibrpm-tizen-d03f220fde879509cab2ac1c73b71b7efb52b737.tar.gz
librpm-tizen-d03f220fde879509cab2ac1c73b71b7efb52b737.tar.bz2
librpm-tizen-d03f220fde879509cab2ac1c73b71b7efb52b737.zip
... and in with the New ...
CVS patchset: 7471 CVS date: 2004/10/16 01:31:54
Diffstat (limited to 'db/docs/gsg/JAVA/joins.html')
-rw-r--r--db/docs/gsg/JAVA/joins.html366
1 files changed, 366 insertions, 0 deletions
diff --git a/db/docs/gsg/JAVA/joins.html b/db/docs/gsg/JAVA/joins.html
new file mode 100644
index 000000000..a22619540
--- /dev/null
+++ b/db/docs/gsg/JAVA/joins.html
@@ -0,0 +1,366 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>Database Joins</title>
+ <link rel="stylesheet" href="gettingStarted.css" type="text/css" />
+ <meta name="generator" content="DocBook XSL Stylesheets V1.62.4" />
+ <link rel="home" href="index.html" title="Getting Started with Berkeley DB" />
+ <link rel="up" href="indexes.html" title="Chapter 5. Secondary Databases" />
+ <link rel="previous" href="secondaryCursor.html" title="&#10; Using Secondary Cursors&#10; &#10; " />
+ <link rel="next" href="javaindexusage.html" title="Secondary Database Example" />
+ </head>
+ <body>
+ <div class="navheader">
+ <table width="100%" summary="Navigation header">
+ <tr>
+ <th colspan="3" align="center">Database Joins</th>
+ </tr>
+ <tr>
+ <td width="20%" align="left"><a accesskey="p" href="secondaryCursor.html">Prev</a> </td>
+ <th width="60%" align="center">Chapter 5. Secondary Databases</th>
+ <td width="20%" align="right"> <a accesskey="n" href="javaindexusage.html">Next</a></td>
+ </tr>
+ </table>
+ <hr />
+ </div>
+ <div class="sect1" lang="en" xml:lang="en">
+ <div class="titlepage">
+ <div>
+ <div>
+ <h2 class="title" style="clear: both"><a id="joins"></a>Database Joins</h2>
+ </div>
+ </div>
+ <div></div>
+ </div>
+ <p>
+ If you have two or more secondary databases associated with a primary
+ database, then you can retrieve primary records based on the union of
+ multiple secondary entries. You do this using a
+ <span><tt class="classname">JoinCursor</tt>.</span>
+
+ </p>
+ <p>
+ Throughout this document we have presented a
+ <span>class</span>
+
+ that stores
+ <span>inventory</span>
+ information on grocery
+
+
+ That
+ <span>class</span>
+
+ is fairly simple with a limited
+ number of data members, few of which would be interesting from a query
+ perspective. But suppose, instead, that we were storing
+ information on something with many more queryable characteristics, such
+ as an automobile. In that case, you may be storing information such as
+ color, number of doors, fuel mileage, automobile type, number of
+ passengers, make, model, and year, to name just a few.
+ </p>
+ <p>
+ In this case, you would still likely be using some unique value to key your
+ primary entries (in the United States, the automobile's VIN would be
+ ideal for this purpose). You would then create a
+ <span>class</span>
+
+ that identifies
+ all the characteristics of the automobiles in your inventory.
+
+ <span>
+ You would
+ also have to create some mechanism by which you would move instances of
+ this class in and out of Java <tt class="literal">byte</tt> arrays. We
+ described the concepts and mechanisms by which you can perform these
+ activities in <a href="DBEntry.html">Database Records</a>.
+ </span>
+ </p>
+ <p>
+ To query this data, you might then create multiple secondary databases,
+ one for each of the characteristics that you want to query. For
+ example, you might create a secondary for color, another for number of
+ doors, another for number of passengers, and so forth. Of course, you
+ will need a unique
+ <span>key creator</span>
+
+ for each such secondary database. You do
+ all of this using the concepts and techniques described throughout this
+ chapter.
+ </p>
+ <p>
+ Once you have created this primary database and all interesting
+ secondaries, what you have is the ability to retrieve automobile records
+ based on a single characteristic. You can, for example, find all the
+ automobiles that are red. Or you can find all the automobiles that have
+ four doors. Or all the automobiles that are minivans.
+ </p>
+ <p>
+ The next most natural step, then, is to form compound queries, or joins.
+ For example, you might want to find all the automobiles that are red,
+ and that were built by Toyota, and that are minivans. You can do this
+ using a
+ <span><tt class="classname">JoinCursor</tt> class instance.</span>
+
+
+ </p>
+ <div class="sect2" lang="en" xml:lang="en">
+ <div class="titlepage">
+ <div>
+ <div>
+ <h3 class="title"><a id="joinUsage"></a>Using Join Cursors</h3>
+ </div>
+ </div>
+ <div></div>
+ </div>
+ <p>
+ To use a join cursor:
+ </p>
+ <div class="itemizedlist">
+ <ul type="disc">
+ <li>
+ <p>
+ Open two or more
+ <span>secondary cursors. These </span>
+ cursors
+
+ <span>for</span>
+ secondary databases that are associated with
+ the same primary database.
+ </p>
+ </li>
+ <li>
+ <p>
+ Position each such cursor to the secondary key
+ value in which you are interested. For example, to build on
+ the previous description, the cursor for the color
+ database is positioned to the <tt class="literal">red</tt> records
+ while the cursor for the model database is positioned to the
+ <tt class="literal">minivan</tt> records, and the cursor for the
+ make database is positioned to <tt class="literal">Toyota</tt>.
+ </p>
+ </li>
+ <li>
+ <p>
+ Create an array of <span>secondary</span> cursors, and place in it each
+ of the cursors that are participating in your join query.
+ </p>
+ </li>
+ <li>
+ <p>
+
+ Obtain a join cursor. You do this using the
+ <tt class="methodname">Database.join()</tt>
+
+
+ method. You must pass this method the array of secondary cursors that you
+ opened and positioned in the previous steps.
+ </p>
+ </li>
+ <li>
+ <p>
+ Iterate over the set of matching records
+ <span>using <tt class="methodname">JoinCursor.getNext()</tt></span>
+ until
+ <span><tt class="classname">OperationStatus</tt> is not <tt class="literal">SUCCESS</tt>.</span>
+
+ </p>
+ </li>
+ <li>
+ <p>
+ Close your <span>join</span> cursor.
+ </p>
+ </li>
+ <li>
+ <p>
+ If you are done with them, close all your <span>secondary</span> cursors.
+ </p>
+ </li>
+ </ul>
+ </div>
+ <p>
+ For example:
+
+ </p>
+ <a id="java_index9"></a>
+ <pre class="programlisting">package com.sleepycat.examples.db.GettingStarted;
+
+import com.sleepycat.db.Database;
+import com.sleepycat.db.DatabaseEntry;
+import com.sleepycat.db.DatabaseException;
+import com.sleepycat.db.JoinCursor;
+import com.sleepycat.db.LockMode;
+import com.sleepycat.db.OperationStatus;
+import com.sleepycat.db.SecondaryCursor;
+import com.sleepycat.db.SecondaryDatabase;
+
+...
+
+// Database and secondary database opens omitted for brevity.
+// Assume a primary database handle:
+// automotiveDB
+// Assume 3 secondary database handles:
+// automotiveColorDB -- index based on automobile color
+// automotiveTypeDB -- index based on automobile type
+// automotiveMakeDB -- index based on the manufacturer
+Database automotiveDB = null;
+SecondaryDatabase automotiveColorDB = null;
+SecondaryDatabase automotiveTypeDB = null;
+SecondaryDatabase automotiveMakeDB = null;
+
+// Query strings:
+String theColor = "red";
+String theType = "minivan";
+String theMake = "Toyota";
+
+// Secondary cursors used for the query:
+SecondaryCursor colorSecCursor = null;
+SecondaryCursor typeSecCursor = null;
+SecondaryCursor makeSecCursor = null;
+
+// The join cursor
+JoinCursor joinCursor = null;
+
+// These are needed for our queries
+DatabaseEntry foundKey = new DatabaseEntry();
+DatabaseEntry foundData = new DatabaseEntry();
+
+// All cursor operations are enclosed in a try block to ensure that they
+// get closed in the event of an exception.
+
+try {
+ // Database entries used for the query:
+ DatabaseEntry color = new DatabaseEntry(theColor.getBytes("UTF-8"));
+ DatabaseEntry type = new DatabaseEntry(theType.getBytes("UTF-8"));
+ DatabaseEntry make = new DatabaseEntry(theMake.getBytes("UTF-8"));
+
+ colorSecCursor = automotiveColorDB.openSecondaryCursor(null, null);
+ typeSecCursor = automotiveTypeDB.openSecondaryCursor(null, null);
+ makeSecCursor = automotiveMakeDB.openSecondaryCursor(null, null);
+
+ // Position all our secondary cursors to our query values.
+ OperationStatus colorRet =
+ colorSecCursor.getSearchKey(color, foundData, LockMode.DEFAULT);
+ OperationStatus typeRet =
+ typeSecCursor.getSearchKey(type, foundData, LockMode.DEFAULT);
+ OperationStatus makeRet =
+ makeSecCursor.getSearchKey(make, foundData, LockMode.DEFAULT);
+
+ // If all our searches returned successfully, we can proceed
+ if (colorRet == OperationStatus.SUCCESS &amp;&amp;
+ typeRet == OperationStatus.SUCCESS &amp;&amp;
+ makeRet == OperationStatus.SUCCESS) {
+
+ // Get a secondary cursor array and populate it with our
+ // positioned cursors
+ SecondaryCursor[] cursorArray = {colorSecCursor,
+ typeSecCursor,
+ makeSecCursor};
+
+ // Create the join cursor
+ joinCursor = automotiveDB.join(cursorArray, null);
+
+ // Now iterate over the results, handling each in turn
+ while (joinCursor.getNext(foundKey, foundData, LockMode.DEFAULT) ==
+ OperationStatus.SUCCESS) {
+
+ // Do something with the key and data retrieved in
+ // foundKey and foundData
+ }
+ }
+} catch (DatabaseException dbe) {
+ // Error reporting goes here
+} catch (Exception e) {
+ // Error reporting goes here
+} finally {
+ try {
+ // Make sure to close out all our cursors
+ if (colorSecCursor != null) {
+ colorSecCursor.close();
+ }
+ if (typeSecCursor != null) {
+ typeSecCursor.close();
+ }
+ if (makeSecCursor != null) {
+ makeSecCursor.close();
+ }
+ if (joinCursor != null) {
+ joinCursor.close();
+ }
+ } catch (DatabaseException dbe) {
+ // Error reporting goes here
+ }
+} </pre>
+ </div>
+ <div class="sect2" lang="en" xml:lang="en">
+ <div class="titlepage">
+ <div>
+ <div>
+ <h3 class="title"><a id="joinconfig"></a>JoinCursor Properties</h3>
+ </div>
+ </div>
+ <div></div>
+ </div>
+ <p>
+ You can set <tt class="classname">JoinCursor</tt> properties using the
+ <tt class="classname">JoinConfig</tt> class. Currently there is just one property that you can
+ set:
+ </p>
+ <div class="itemizedlist">
+ <ul type="disc">
+ <li>
+ <p>
+ <tt class="methodname">JoinConfig.setNoSort()</tt>
+ </p>
+ <p>
+ Specifies whether automatic sorting of input cursors is disabled. The cursors are sorted from the
+ one that refers to the least number of data items to the one that refers to the most.
+ </p>
+ <p>
+ If the data is structured so that cursors with many data items also share many common elements,
+ higher performance will result from listing those cursors before cursors with fewer data
+ items. Turning off sorting permits applications to specify cursors in the proper order given this
+ scenario.
+ </p>
+ <p>
+ Default value is <tt class="literal">false</tt> (automatic cursor sorting is performed).
+ </p>
+ <p>
+ For example:
+ </p>
+ <a id="je_index10"></a>
+ <pre class="programlisting">// All database and environments omitted
+JoinConfig config = new JoinConfig();
+config.setNoSort(true);
+JoinCursor joinCursor = myDb.join(cursorArray, config); </pre>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="navfooter">
+ <hr />
+ <table width="100%" summary="Navigation footer">
+ <tr>
+ <td width="40%" align="left"><a accesskey="p" href="secondaryCursor.html">Prev</a> </td>
+ <td width="20%" align="center">
+ <a accesskey="u" href="indexes.html">Up</a>
+ </td>
+ <td width="40%" align="right"> <a accesskey="n" href="javaindexusage.html">Next</a></td>
+ </tr>
+ <tr>
+ <td width="40%" align="left" valign="top">
+ Using Secondary Cursors
+
+  </td>
+ <td width="20%" align="center">
+ <a accesskey="h" href="index.html">Home</a>
+ </td>
+ <td width="40%" align="right" valign="top"> Secondary Database Example</td>
+ </tr>
+ </table>
+ </div>
+ </body>
+</html>