001: /*
002: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: * Free SoftwareFoundation, Inc.
023: * 59 Temple Place, Suite 330
024: * Boston, MA 02111-1307 USA
025: *
026: * @author Scott Ferguson
027: */
028:
029: package com.caucho.ejb.ql;
030:
031: import com.caucho.config.ConfigException;
032: import com.caucho.ejb.cfg21.CmpField;
033: import com.caucho.ejb.cfg21.CmpRelation;
034: import com.caucho.ejb.cfg21.EjbEntityBean;
035: import com.caucho.util.CharBuffer;
036:
037: /**
038: * Expression representing a field or a relation.
039: */
040: class FieldExpr extends Expr {
041: // base expression
042: private PathExpr _base;
043: // field name
044: private String _name;
045:
046: // bean information
047: private EjbEntityBean _bean;
048: // field information
049: private CmpField _field;
050: // relation information
051: private CmpRelation _relation;
052:
053: // SQL id for the results of this field
054: private String _tableId;
055: // base id if special
056: private String _baseId;
057: // sql field
058: private String _sqlField;
059:
060: private int _primaryKeyFieldIndex;
061:
062: // use count
063: private int _useCount;
064: private boolean _hasRelation;
065:
066: /**
067: * Creates a new field expression.
068: *
069: * @param base the base expression
070: * @param field name of the field
071: */
072: FieldExpr(Query query, PathExpr base, String fieldName,
073: CmpField field) throws ConfigException {
074: _query = query;
075: _base = base;
076: _name = fieldName;
077:
078: _field = field;
079:
080: /*
081: PrimaryKey key = base.getItemBean().getPrimaryKey();
082: _primaryKeyFieldIndex = key.indexOf(field);
083: if (_primaryKeyFieldIndex < 0)
084: base.setUsesField();
085: */
086:
087: setJavaType(field.getJavaType());
088: }
089:
090: boolean hasRelation() {
091: return _hasRelation;
092: }
093:
094: void setRelation() {
095: _hasRelation = true;
096: }
097:
098: /**
099: * Returns the base expression
100: */
101: Expr getBase() {
102: return _base;
103: }
104:
105: /**
106: * Returns the field name
107: */
108: String getField() {
109: return _name;
110: }
111:
112: /**
113: * Returns the bean type of the result object
114: */
115: EjbEntityBean getBean() {
116: return _bean;
117: }
118:
119: /**
120: * Returns the relation
121: */
122: CmpRelation getRelation() {
123: return _relation;
124: }
125:
126: /**
127: * Returns the SQL table identifier for the result of the field expression.
128: */
129: String getTableId() {
130: return _tableId;
131: }
132:
133: /**
134: * Sets the SQL table identifier for the result of the field expression.
135: */
136: void setTableId(String tableId) {
137: _tableId = tableId;
138: }
139:
140: /**
141: * Returns the SQL id for the base
142: */
143: String getBaseId() {
144: return _base.getTable();
145: }
146:
147: /**
148: * Returns the SQL field reference.
149: */
150: String getSQLField() {
151: /*
152: if (_sqlField != null)
153: return _sqlField;
154: else if (_field != null)
155: return _field.getSQLName();
156: else if (_relation != null)
157: return _relation.getTargetSQLPrefix();
158: else
159: return PersistentBean.javaToSQLName(_name);
160: */
161: throw new UnsupportedOperationException();
162: }
163:
164: void decrementUse() {
165: _useCount--;
166: }
167:
168: int getUseCount() {
169: return _useCount;
170: }
171:
172: /**
173: * For collections, returns the underlying item bean.
174: */
175: EjbEntityBean getItemBean() {
176: return _bean;
177: }
178:
179: /*
180: int getComponentCount()
181: {
182: if (isPrimaryKeyField)
183: return base.getComponentCount();
184:
185: return super.getComponentCount();
186: }
187: */
188:
189: /**
190: * Prints the select SQL for this expression
191: *
192: * @param gen the java code generator
193: */
194: /*
195: void generateSelect(CharBuffer cb)
196: {
197: if (_primaryKeyFieldIndex >= 0) {
198: _base.printComponent(cb, _primaryKeyFieldIndex);
199: return;
200: }
201:
202: if (_query.getFromList().size() == 1) {
203: // special case to handle strange databases
204: cb.append(_field.getSQLName());
205: }
206: else {
207: cb.append(_base.getTable());
208: cb.append(".");
209: cb.append(_field.getSQLName());
210: }
211: throw new UnsupportedOperationException();
212: }
213: */
214:
215: /**
216: * Prints the select SQL for this expression
217: *
218: * @param gen the java code generator
219: */
220: String getSelectTable(CharBuffer cb) throws ConfigException {
221: /*
222: if (_query.getFromList().size() == 1) {
223: // special case to handle strange databases
224: return null;
225: }
226: else
227: return _base.getTable();
228: */
229: return _base.getTable();
230: }
231:
232: /**
233: * Prints the where SQL for this expression
234: *
235: * @param gen the java code generator
236: */
237: void generateWhere(CharBuffer cb) {
238: /*
239: if (_primaryKeyFieldIndex >= 0) {
240: _base.generateComponent(cb, _primaryKeyFieldIndex);
241: return;
242: }
243: */
244:
245: /*
246: if (_query.getFromList().size() == 1) {
247: // special case to handle strange databases
248: cb.append(_field.getSQLName());
249: }
250: else {
251: cb.append(_base.getTable());
252: cb.append(".");
253: cb.append(_field.getSQLName());
254: }
255: */
256:
257: _base.generateWhere(cb);
258: cb.append(".");
259: cb.append(_name);
260: }
261:
262: /*
263: void generateComponent(CharBuffer cb, int i)
264: {
265: if (_primaryKeyFieldIndex >= 0) {
266: _base.generateComponent(cb, i);
267: return;
268: }
269:
270: super.generateComponent(cb, i);
271: }
272: */
273:
274: /**
275: * Returns true if the two expressions are equal
276: */
277: public boolean equals(Object bObj) {
278: if (!(bObj instanceof FieldExpr))
279: return false;
280:
281: FieldExpr b = (FieldExpr) bObj;
282:
283: return _field.equals(b._field) && _base.equals(b._base);
284: }
285:
286: /**
287: * Returns a hash code for the field
288: */
289: public int hashCode() {
290: return _name.hashCode() * 65521 + _base.hashCode();
291: }
292:
293: public String toString() {
294: return _base.toString() + "." + _name;
295: }
296: }
|