001: /*
002: * Copyright (c) 1998 - 2005 Versant Corporation
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * Versant Corporation - initial API and implementation
010: */
011: package com.versant.core.jdbc.sql.exp;
012:
013: import com.versant.core.jdbc.sql.SqlDriver;
014: import com.versant.core.jdbc.metadata.JdbcColumn;
015: import com.versant.core.util.CharBuf;
016: import com.versant.core.common.Debug;
017:
018: import java.util.Map;
019:
020: import com.versant.core.common.BindingSupportImpl;
021:
022: /**
023: * This is a join between two columns.
024: */
025: public class JoinExp extends LeafExp {
026:
027: private JdbcColumn left;
028: private SelectExp leftTable;
029: private JdbcColumn right;
030: private SelectExp rightTable;
031:
032: public JoinExp(JdbcColumn left, SelectExp leftTable,
033: JdbcColumn right, SelectExp rightTable) {
034: if (Debug.DEBUG) {
035: if (left.table != leftTable.table) {
036: throw BindingSupportImpl
037: .getInstance()
038: .internal(
039: "The column's table is not "
040: + "the same as the table being joined from");
041: }
042:
043: if (right.table != rightTable.table) {
044: throw BindingSupportImpl
045: .getInstance()
046: .internal(
047: "The column's table is not "
048: + "the same as the table being joined too");
049: }
050: }
051: this .left = left;
052: this .leftTable = leftTable;
053: this .right = right;
054: this .rightTable = rightTable;
055: }
056:
057: public void setLeftTable(SelectExp leftSExp) {
058: leftTable = leftSExp;
059: }
060:
061: public JoinExp() {
062: }
063:
064: public SqlExp createInstance() {
065: return new JoinExp();
066: }
067:
068: public SqlExp getClone(SqlExp clone, Map cloneMap) {
069: super .getClone(clone, cloneMap);
070: JoinExp cst = (JoinExp) clone;
071:
072: cst.left = left;
073: if (leftTable != null)
074: cst.leftTable = (SelectExp) createClone(leftTable, cloneMap);
075: cst.right = right;
076: if (rightTable != null)
077: cst.rightTable = (SelectExp) createClone(rightTable,
078: cloneMap);
079:
080: return clone;
081: }
082:
083: public String toString() {
084: return super .toString() + " " + left + " = " + right;
085: }
086:
087: /**
088: * Append SQL for this node to s.
089: *
090: * @param driver The driver being used
091: * @param s Append the SQL here
092: * @param leftSibling
093: */
094: public void appendSQLImp(SqlDriver driver, CharBuf s,
095: SqlExp leftSibling) {
096: driver.appendSqlJoin(leftTable.alias, left, rightTable.alias,
097: right, rightTable.outer, s);
098: }
099:
100: /**
101: * Make us an outer join or not. This is a NOP except for JoinExp and
102: * AndJoinExp.
103: * @see JoinExp
104: * @see AndJoinExp
105: */
106: public void setOuter(boolean on) {
107: rightTable.outer = on;
108: }
109:
110: public boolean isOuter() {
111: return rightTable.outer;
112: }
113:
114: /**
115: * Replace any references to old with nw. This is used when redundant
116: * joins are removed.
117: *
118: * @see com.versant.core.jdo.query.OrNode#mergeRedundantExistsSelects
119: */
120: public void replaceSelectExpRef(SelectExp old, SelectExp nw) {
121: if (old == leftTable)
122: leftTable = nw;
123: if (old == rightTable)
124: rightTable = nw;
125: }
126:
127: public static boolean isEqual(JoinExp jExp1, JoinExp jExp2) {
128: if (jExp1 == jExp2)
129: return true;
130: if (jExp1 == null)
131: return false;
132: if (jExp2 == null)
133: return false;
134:
135: if ((jExp1.left == jExp2.left) && (jExp1.right == jExp2.right)
136: && (jExp1.isOuter() == jExp2.isOuter())) {
137: return true;
138: }
139: return false;
140:
141: }
142: }
|