Implement query hints as suggested by bug 306
http://helma.org/bugs/show_bug.cgi?id=306
This commit is contained in:
parent
ae56944420
commit
6f213b481c
3 changed files with 33 additions and 11 deletions
|
@ -903,20 +903,28 @@ public final class DbMapping implements Updatable {
|
|||
* Get a StringBuffer initialized to the first part of the select statement
|
||||
* for objects defined by this DbMapping
|
||||
*
|
||||
* @param rel the Relation we use to select. Currently only used for optimizer hints.
|
||||
* Is null if selecting by primary key.
|
||||
* @return the StringBuffer containing the first part of the select query
|
||||
*
|
||||
* @throws SQLException if the table meta data could not be retrieved
|
||||
* @throws ClassNotFoundException if the JDBC driver class was not found
|
||||
*/
|
||||
public StringBuffer getSelect() throws SQLException, ClassNotFoundException {
|
||||
public StringBuffer getSelect(Relation rel) throws SQLException, ClassNotFoundException {
|
||||
// assign to local variable first so we are thread safe
|
||||
// (selectString may be reset by other threads)
|
||||
String sel = selectString;
|
||||
|
||||
if (sel != null) {
|
||||
if (rel == null && sel != null) {
|
||||
return new StringBuffer(sel);
|
||||
}
|
||||
|
||||
StringBuffer s = new StringBuffer("SELECT ");
|
||||
|
||||
if (rel != null && rel.queryHints != null) {
|
||||
s.append(rel.queryHints).append(" ");
|
||||
}
|
||||
|
||||
String table = getTableName();
|
||||
|
||||
// all columns from the main table
|
||||
|
@ -951,8 +959,11 @@ public final class DbMapping implements Updatable {
|
|||
joins[i].renderJoinConstraints(s);
|
||||
}
|
||||
|
||||
// cache rendered string for later calls.
|
||||
selectString = s.toString();
|
||||
// cache rendered string for later calls, but only if it wasn't
|
||||
// built for a particular Relation
|
||||
if (rel == null) {
|
||||
selectString = s.toString();
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
|
|
@ -994,9 +994,15 @@ public final class NodeManager {
|
|||
tables.append(',').append(rel.additionalTables);
|
||||
}
|
||||
|
||||
StringBuffer b = new StringBuffer("SELECT ").append(table).append('.')
|
||||
.append(idfield).append(" FROM ")
|
||||
.append(tables);
|
||||
StringBuffer b = new StringBuffer("SELECT ");
|
||||
|
||||
if (rel != null && rel.queryHints != null) {
|
||||
b.append(rel.queryHints).append(" ");
|
||||
}
|
||||
|
||||
b.append(table).append('.')
|
||||
.append(idfield).append(" FROM ")
|
||||
.append(tables);
|
||||
|
||||
if (home.getSubnodeRelation() != null) {
|
||||
// subnode relation was explicitly set
|
||||
|
@ -1089,7 +1095,7 @@ public final class NodeManager {
|
|||
Statement stmt = con.createStatement();
|
||||
DbColumn[] columns = dbm.getColumns();
|
||||
Relation[] joins = dbm.getJoins();
|
||||
StringBuffer q = dbm.getSelect();
|
||||
StringBuffer q = dbm.getSelect(rel);
|
||||
|
||||
if (rel.additionalTables != null) {
|
||||
q.append(',').append(rel.additionalTables);
|
||||
|
@ -1171,7 +1177,7 @@ public final class NodeManager {
|
|||
Statement stmt = con.createStatement();
|
||||
DbColumn[] columns = dbm.getColumns();
|
||||
Relation[] joins = dbm.getJoins();
|
||||
StringBuffer q = dbm.getSelect();
|
||||
StringBuffer q = dbm.getSelect(rel);
|
||||
|
||||
if (rel.additionalTables != null) {
|
||||
q.append(',').append(rel.additionalTables);
|
||||
|
@ -1498,7 +1504,7 @@ public final class NodeManager {
|
|||
|
||||
DbColumn[] columns = dbm.getColumns();
|
||||
Relation[] joins = dbm.getJoins();
|
||||
StringBuffer q = dbm.getSelect().append("WHERE ")
|
||||
StringBuffer q = dbm.getSelect(null).append("WHERE ")
|
||||
.append(dbm.getTableName())
|
||||
.append(".")
|
||||
.append(idfield)
|
||||
|
@ -1582,7 +1588,7 @@ public final class NodeManager {
|
|||
Connection con = dbm.getConnection();
|
||||
DbColumn[] columns = dbm.getColumns();
|
||||
Relation[] joins = dbm.getJoins();
|
||||
StringBuffer q = dbm.getSelect();
|
||||
StringBuffer q = dbm.getSelect(rel);
|
||||
|
||||
if (rel.additionalTables != null) {
|
||||
q.append(',').append(rel.additionalTables);
|
||||
|
|
|
@ -93,6 +93,7 @@ public final class Relation {
|
|||
String groupbyPrototype;
|
||||
String filter;
|
||||
String additionalTables;
|
||||
String queryHints;
|
||||
Vector filterFragments;
|
||||
Vector filterPropertyRefs;
|
||||
int maxSize = 0;
|
||||
|
@ -114,6 +115,7 @@ public final class Relation {
|
|||
this.filterFragments = rel.filterFragments;
|
||||
this.filterPropertyRefs = rel.filterPropertyRefs;
|
||||
this.additionalTables = rel.additionalTables;
|
||||
this.queryHints = rel.queryHints;
|
||||
this.maxSize = rel.maxSize;
|
||||
this.constraints = rel.constraints;
|
||||
this.accessName = rel.accessName;
|
||||
|
@ -292,6 +294,9 @@ public final class Relation {
|
|||
additionalTables = null;
|
||||
}
|
||||
|
||||
// get query hints
|
||||
queryHints = props.getProperty(propName + ".hints");
|
||||
|
||||
// get max size of collection
|
||||
String max = props.getProperty(propName + ".maxSize");
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue