package org.castor.cpa.persistence.sql.driver; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import org.exolab.castor.jdo.engine.JDBCSyntax; import org.exolab.castor.persist.spi.PersistenceFactory; /** * QueryExpression for Interbase. * */ public final class InterbaseQueryExpression extends JDBCQueryExpression { private StringBuffer _sql; public InterbaseQueryExpression(final PersistenceFactory factory) { super(factory); } public String getStatement(final boolean lock) { boolean first; Vector<String> done = new Vector<String>(); _sql = new StringBuffer(); _sql.append(JDBCSyntax.SELECT); if (_distinct) { _sql.append(JDBCSyntax.DISTINCT); } _sql.append(getColumnList()); _sql.append(JDBCSyntax.FROM); Hashtable<String, String> tables = new Hashtable<String, String>(_tables); first = true; // gather all joins with the same left part use SQL92 syntax for (int i = 0; i < _joins.size(); ++i) { Join join = _joins.elementAt(i); if (done.contains(join._leftTable)) { continue; } if (first) { first = false; _sql.append(_factory.quoteName(join._leftTable)); } appendJoin(join); tables.remove(join._leftTable); tables.remove(join._rightTable); for (int k = i + 1; k < _joins.size(); ++k) { Join join2 = _joins.elementAt(k); if (join._leftTable.equals(join2._leftTable)) { appendJoin(join2); tables.remove(join2._rightTable); } } done.addElement(join._leftTable); } Enumeration<String> enumeration = tables.keys(); while (enumeration.hasMoreElements()) { if (first) { first = false; } else { _sql.append(JDBCSyntax.TABLE_SEPARATOR); } String tableAlias = enumeration.nextElement(); String tableName = tables.get(tableAlias); if (tableAlias.equals(tableName)) { _sql.append(_factory.quoteName(tableName)); } else { _sql.append(_factory.quoteName(tableName) + " " + _factory.quoteName(tableAlias)); } } first = addWhereClause(_sql, true); if (_order != null) { _sql.append(JDBCSyntax.ORDER_BY).append(_order); } // Do not use FOR UPDATE to lock query. return _sql.toString(); } void appendJoin(final Join join) { if (join._outer) { _sql.append(JDBCSyntax.LEFT_JOIN); } else { _sql.append(JDBCSyntax.INNER_JOIN); } String tableAlias = join._rightTable; String tableName = _tables.get(tableAlias); if (tableAlias.equals(tableName)) { _sql.append(_factory.quoteName(tableName)); } else { _sql.append(_factory.quoteName(tableName) + " " + _factory.quoteName(tableAlias)); } _sql.append(JDBCSyntax.ON); for (int j = 0; j < join._leftColumns.length; ++j) { if (j > 0) { _sql.append(JDBCSyntax.AND); } _sql.append(_factory.quoteName(join._leftTable + JDBCSyntax.TABLE_COLUMN_SEPARATOR + join._leftColumns[j])).append(OP_EQUALS); _sql.append(_factory.quoteName(join._rightTable + JDBCSyntax.TABLE_COLUMN_SEPARATOR + join._rightColumns[j])); } } }