/*
* Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package javax.sql.rowset;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import java.io.*;
import java.math.*;
import java.util.*;
import javax.sql.rowset.*;
/**
* The JoinRowSet interface provides a mechanism for combining related
* data from different RowSet objects into one JoinRowSet
* object, which represents an SQL JOIN.
* In other words, a JoinRowSet object acts as a
* container for the data from RowSet objects that form an SQL
* JOIN relationship.
*
* The Joinable interface provides the methods for setting,
* retrieving, and unsetting a match column, the basis for
* establishing an SQL JOIN relationship. The match column may
* alternatively be set by supplying it to the appropriate version of the
* JointRowSet method addRowSet.
*
*
*
RowSet objects (CachedRowSet objects
* and implementations extending the CachedRowSet interface)
* do not have a standard way to establish an SQL JOIN between
* RowSet objects without the expensive operation of
* reconnecting to the data source. The JoinRowSet
* interface is specifically designed to address this need.
*
* Any RowSet object
* can be added to a JoinRowSet object to become
* part of an SQL JOIN relationship. This means that both connected
* and disconnected RowSet objects can be part of a JOIN.
* RowSet objects operating in a connected environment
* (JdbcRowSet objects) are
* encouraged to use the database to which they are already
* connected to establish SQL JOIN relationships between
* tables directly. However, it is possible for a
* JdbcRowSet object to be added to a JoinRowSet object
* if necessary.
*
* Any number of RowSet objects can be added to an
* instance of JoinRowSet provided that they
* can be related in an SQL JOIN.
* By definition, the SQL JOIN statement is used to
* combine the data contained in two or more relational database tables based
* upon a common attribute. The Joinable interface provides the methods
* for establishing a common attribute, which is done by setting a
* match column. The match column commonly coincides with
* the primary key, but there is
* no requirement that the match column be the same as the primary key.
* By establishing and then enforcing column matches,
* a JoinRowSet object establishes JOIN relationships
* between RowSet objects without the assistance of an available
* relational database.
*
* The type of JOIN to be established is determined by setting
* one of the JoinRowSet constants using the method
* setJoinType. The following SQL JOIN types can be set:
*
CROSS_JOIN
* FULL_JOIN
* INNER_JOIN - the default if no JOIN type has been set
* LEFT_OUTER_JOIN
* RIGHT_OUTER_JOIN
* JOIN will automatically be an
* inner join. The comments for the fields in the
* JoinRowSet interface explain these JOIN types, which are
* standard SQL JOIN types.
* *
JoinRowSet Object for Creating a JOINJoinRowSet object is created, it is empty.
* The first RowSet object to be added becomes the basis for the
* JOIN relationship.
* Applications must determine which column in each of the
* RowSet objects to be added to the JoinRowSet object
* should be the match column. All of the
* RowSet objects must contain a match column, and the values in
* each match column must be ones that can be compared to values in the other match
* columns. The columns do not have to have the same name, though they often do,
* and they do not have to store the exact same data type as long as the data types
* can be compared.
* * A match column can be be set in two ways: *
Joinable method setMatchColumnRowSet
* object is added to a JoinRowSet object. The RowSet object
* must have implemented the Joinable interface in order to use the method
* setMatchColumn. Once the match column value
* has been set, this method can be used to reset the match column at any time.
* JoinRowSet method
* addRowSet that takes a column name or number (or an array of
* column names or numbers)addRowSet methods take a match column as a parameter.
* These four methods set or reset the match column at the time a RowSet
* object is being added to a JoinRowSet object.
*
* The following code fragment adds two CachedRowSet
* objects to a JoinRowSet object. Note that in this example,
* no SQL JOIN type is set, so the default JOIN type,
* which is INNER_JOIN, is established.
*
* In the following code fragment, the table EMPLOYEES, whose match
* column is set to the first column (EMP_ID), is added to the
* JoinRowSet object jrs. Then
* the table ESSP_BONUS_PLAN, whose match column is likewise
* the EMP_ID column, is added. When this second
* table is added to jrs, only the rows in
* ESSP_BONUS_PLAN whose EMP_ID value matches an
* EMP_ID value in the EMPLOYEES table are added.
* In this case, everyone in the bonus plan is an employee, so all of the rows
* in the table ESSP_BONUS_PLAN are added to the JoinRowSet
* object. In this example, both CachedRowSet objects being added
* have implemented the Joinable interface and can therefore call
* the Joinable method setMatchColumn.
*
* JoinRowSet jrs = new JoinRowSetImpl();
*
* ResultSet rs1 = stmt.executeQuery("SELECT * FROM EMPLOYEES");
* CachedRowSet empl = new CachedRowSetImpl();
* empl.populate(rs1);
* empl.setMatchColumn(1);
* jrs.addRowSet(empl);
*
* ResultSet rs2 = stmt.executeQuery("SELECT * FROM ESSP_BONUS_PLAN");
* CachedRowSet bonus = new CachedRowSetImpl();
* bonus.populate(rs2);
* bonus.setMatchColumn(1); // EMP_ID is the first column
* jrs.addRowSet(bonus);
*
*
* At this point, jrs is an inside JOIN of the two RowSet objects
* based on their EMP_ID columns. The application can now browse the
* combined data as if it were browsing one single RowSet object.
* Because jrs is itself a RowSet object, an application can
* navigate or modify it using RowSet methods.
*
* jrs.first(); * int employeeID = jrs.getInt(1); * String employeeName = jrs.getString(2); **
* Note that because the SQL JOIN must be enforced when an application
* adds a second or subsequent RowSet object, there
* may be an initial degradation in performance while the JOIN is
* being performed.
*
* The following code fragment adds an additional CachedRowSet object.
* In this case, the match column (EMP_ID) is set when the
* CachedRowSet object is added to the JoinRowSet object.
*
* ResultSet rs3 = stmt.executeQuery("SELECT * FROM 401K_CONTRIB");
* CachedRowSet fourO1k = new CachedRowSetImpl();
* four01k.populate(rs3);
* jrs.addRowSet(four01k, 1);
*
*
* The JoinRowSet object jrs now contains values from all three
* tables. The data in each row in four01k in which the value for the
* EMP_ID column matches a value for the EMP_ID column
* in jrs has been added to jrs.
*
*
JoinRowSet MethodsJoinRowSet interface supplies several methods for adding
* RowSet objects and for getting information about the
* JoinRowSet object.
* RowSet objectsRowSet object
* at a time or to add multiple RowSet objects at one time. In
* either case, the methods may specify the match column for each
* RowSet object being added.
* RowSet objects in the
* JoinRowSet object, and another method retrieves the
* RowSet names. A third method retrieves either the SQL
* WHERE clause used behind the scenes to form the
* JOIN or a text description of what the WHERE
* clause does.
* JOINJOIN type, and five methods find out whether
* the JoinRowSet object supports a given type.
* JoinRowSet object
*/
public interface JoinRowSet extends WebRowSet {
/**
* Adds the given RowSet object to this JoinRowSet
* object. If the RowSet object
* is the first to be added to this JoinRowSet
* object, it forms the basis of the JOIN relationship to be
* established.
*
* This method should be used only when the given RowSet
* object already has a match column that was set with the Joinable
* method setMatchColumn.
*
* Note: A Joinable object is any RowSet object
* that has implemented the Joinable interface.
*
* @param rowset the RowSet object that is to be added to this
* JoinRowSet object; it must implement the
* Joinable interface and have a match column set
* @throws SQLException if (1) an empty rowset is added to the to this
* JoinRowSet object, (2) a match column has not been
* set for rowset, or (3) rowset
* violates the active JOIN
* @see Joinable#setMatchColumn
*/
public void addRowSet(Joinable rowset) throws SQLException;
/**
* Adds the given RowSet object to this JoinRowSet
* object and sets the designated column as the match column for
* the RowSet object. If the RowSet object
* is the first to be added to this JoinRowSet
* object, it forms the basis of the JOIN relationship to be
* established.
*
* This method should be used when RowSet does not already have a match
* column set.
*
* @param rowset the RowSet object that is to be added to this
* JoinRowSet object; it may implement the
* Joinable interface
* @param columnIdx an int that identifies the column to become the
* match column
* @throws SQLException if (1) rowset is an empty rowset or
* (2) rowset violates the active JOIN
* @see Joinable#unsetMatchColumn
*/
public void addRowSet(RowSet rowset, int columnIdx) throws SQLException;
/**
* Adds rowset to this JoinRowSet object and
* sets the designated column as the match column. If rowset
* is the first to be added to this JoinRowSet
* object, it forms the basis for the JOIN relationship to be
* established.
*
* This method should be used when the given RowSet object
* does not already have a match column.
*
* @param rowset the RowSet object that is to be added to this
* JoinRowSet object; it may implement the
* Joinable interface
* @param columnName the String object giving the name of the
* column to be set as the match column
* @throws SQLException if (1) rowset is an empty rowset or
* (2) the match column for rowset does not satisfy the
* conditions of the JOIN
*/
public void addRowSet(RowSet rowset,
String columnName) throws SQLException;
/**
* Adds one or more RowSet objects contained in the given
* array of RowSet objects to this JoinRowSet
* object and sets the match column for
* each of the RowSet objects to the match columns
* in the given array of column indexes. The first element in
* columnIdx is set as the match column for the first
* RowSet object in rowset, the second element of
* columnIdx is set as the match column for the second element
* in rowset, and so on.
*
* The first RowSet object added to this JoinRowSet
* object forms the basis for the JOIN relationship.
*
* This method should be used when the given RowSet object
* does not already have a match column.
*
* @param rowset an array of one or more RowSet objects
* to be added to the JOIN; it may implement the
* Joinable interface
* @param columnIdx an array of int values indicating the index(es)
* of the columns to be set as the match columns for the RowSet
* objects in rowset
* @throws SQLException if (1) an empty rowset is added to this
* JoinRowSet object, (2) a match column is not set
* for a RowSet object in rowset, or (3)
* a RowSet object being added violates the active
* JOIN
*/
public void addRowSet(RowSet[] rowset,
int[] columnIdx) throws SQLException;
/**
* Adds one or more RowSet objects contained in the given
* array of RowSet objects to this JoinRowSet
* object and sets the match column for
* each of the RowSet objects to the match columns
* in the given array of column names. The first element in
* columnName is set as the match column for the first
* RowSet object in rowset, the second element of
* columnName is set as the match column for the second element
* in rowset, and so on.
*
* The first RowSet object added to this JoinRowSet
* object forms the basis for the JOIN relationship.
*
* This method should be used when the given RowSet object(s)
* does not already have a match column.
*
* @param rowset an array of one or more RowSet objects
* to be added to the JOIN; it may implement the
* Joinable interface
* @param columnName an array of String values indicating the
* names of the columns to be set as the match columns for the
* RowSet objects in rowset
* @throws SQLException if (1) an empty rowset is added to this
* JoinRowSet object, (2) a match column is not set
* for a RowSet object in rowset, or (3)
* a RowSet object being added violates the active
* JOIN
*/
public void addRowSet(RowSet[] rowset,
String[] columnName) throws SQLException;
/**
* Returns a Collection object containing the
* RowSet objects that have been added to this
* JoinRowSet object.
* This should return the 'n' number of RowSet contained
* within the JOIN and maintain any updates that have occured while in
* this union.
*
* @return a Collection object consisting of the
* RowSet objects added to this JoinRowSet
* object
* @throws SQLException if an error occurs generating the
* Collection object to be returned
*/
public Collection> getRowSets() throws java.sql.SQLException;
/**
* Returns a String array containing the names of the
* RowSet objects added to this JoinRowSet
* object.
*
* @return a String array of the names of the
* RowSet objects in this JoinRowSet
* object
* @throws SQLException if an error occurs retrieving the names of
* the RowSet objects
* @see CachedRowSet#setTableName
*/
public String[] getRowSetNames() throws java.sql.SQLException;
/**
* Creates a new CachedRowSet object containing the
* data in this JoinRowSet object, which can be saved
* to a data source using the SyncProvider object for
* the CachedRowSet object.
*
* If any updates or modifications have been applied to the JoinRowSet
* the CachedRowSet returned by the method will not be able to persist
* it's changes back to the originating rows and tables in the
* in the datasource. The CachedRowSet instance returned should not
* contain modification data and it should clear all properties of
* it's originating SQL statement. An application should reset the
* SQL statement using the RowSet.setCommand method.
*
* In order to allow changes to be persisted back to the datasource
* to the originating tables, the acceptChanges method
* should be used and called on a JoinRowSet object instance. Implementations
* can leverage the internal data and update tracking in their
* implementations to interact with the SyncProvider to persist any
* changes.
*
* @return a CachedRowSet containing the contents of the JoinRowSet
* @throws SQLException if an error occurs assembling the CachedRowSet
* object
* @see javax.sql.RowSet
* @see javax.sql.rowset.CachedRowSet
* @see javax.sql.rowset.spi.SyncProvider
*/
public CachedRowSet toCachedRowSet() throws java.sql.SQLException;
/**
* Indicates if CROSS_JOIN is supported by a JoinRowSet
* implementation
*
* @return true if the CROSS_JOIN is supported; false otherwise
*/
public boolean supportsCrossJoin();
/**
* Indicates if INNER_JOIN is supported by a JoinRowSet
* implementation
*
* @return true is the INNER_JOIN is supported; false otherwise
*/
public boolean supportsInnerJoin();
/**
* Indicates if LEFT_OUTER_JOIN is supported by a JoinRowSet
* implementation
*
* @return true is the LEFT_OUTER_JOIN is supported; false otherwise
*/
public boolean supportsLeftOuterJoin();
/**
* Indicates if RIGHT_OUTER_JOIN is supported by a JoinRowSet
* implementation
*
* @return true is the RIGHT_OUTER_JOIN is supported; false otherwise
*/
public boolean supportsRightOuterJoin();
/**
* Indicates if FULL_JOIN is supported by a JoinRowSet
* implementation
*
* @return true is the FULL_JOIN is supported; false otherwise
*/
public boolean supportsFullJoin();
/**
* Allow the application to adjust the type of JOIN imposed
* on tables contained within the JoinRowSet object instance.
* Implementations should throw a SQLException if they do
* not support a given JOIN type.
*
* @param joinType the standard JoinRowSet.XXX static field definition
* of a SQL JOIN to re-configure a JoinRowSet instance on
* the fly.
* @throws SQLException if an unsupported JOIN type is set
* @see #getJoinType
*/
public void setJoinType(int joinType) throws SQLException;
/**
* Return a SQL-like description of the WHERE clause being used
* in a JoinRowSet object. An implementation can describe
* the WHERE clause of the SQL JOIN by supplying a SQL
* strings description of JOIN or provide a textual
* description to assist applications using a JoinRowSet
*
* @return whereClause a textual or SQL description of the logical
* WHERE clause used in the JoinRowSet instance
* @throws SQLException if an error occurs in generating a representation
* of the WHERE clause.
*/
public String getWhereClause() throws SQLException;
/**
* Returns a int describing the set SQL JOIN type
* governing this JoinRowSet instance. The returned type will be one of
* standard JoinRowSet types: CROSS_JOIN, INNER_JOIN,
* LEFT_OUTER_JOIN, RIGHT_OUTER_JOIN or
* FULL_JOIN.
*
* @return joinType one of the standard JoinRowSet static field
* definitions of a SQL JOIN. JoinRowSet.INNER_JOIN
* is returned as the default JOIN type is no type has been
* explicitly set.
* @throws SQLException if an error occurs determining the SQL JOIN
* type supported by the JoinRowSet instance.
* @see #setJoinType
*/
public int getJoinType() throws SQLException;
/**
* An ANSI-style JOIN providing a cross product of two tables
*/
public static int CROSS_JOIN = 0;
/**
* An ANSI-style JOIN providing a inner join between two tables. Any
* unmatched rows in either table of the join should be discarded.
*/
public static int INNER_JOIN = 1;
/**
* An ANSI-style JOIN providing a left outer join between two
* tables. In SQL, this is described where all records should be
* returned from the left side of the JOIN statement.
*/
public static int LEFT_OUTER_JOIN = 2;
/**
* An ANSI-style JOIN providing a right outer join between
* two tables. In SQL, this is described where all records from the
* table on the right side of the JOIN statement even if the table
* on the left has no matching record.
*/
public static int RIGHT_OUTER_JOIN = 3;
/**
* An ANSI-style JOIN providing a a full JOIN. Specifies that all
* rows from either table be returned regardless of matching
* records on the other table.
*/
public static int FULL_JOIN = 4;
}