|
From: <one...@us...> - 2003-01-20 12:48:47
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister
In directory sc8-pr-cvs1:/tmp/cvs-serv2323/sf/hibernate/persister
Modified Files:
AbstractEntityPersister.java EntityPersister.java
Loadable.java Queryable.java
Log Message:
major refactoring to create SQL Generation layer
more efficient queries against normalized mappings
Index: AbstractEntityPersister.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister/AbstractEntityPersister.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** AbstractEntityPersister.java 9 Jan 2003 12:24:51 -0000 1.4
--- AbstractEntityPersister.java 20 Jan 2003 12:48:14 -0000 1.5
***************
*** 37,40 ****
--- 37,41 ----
import net.sf.hibernate.hql.PathExpressionParser;
import net.sf.hibernate.dialect.Dialect;
+ import net.sf.hibernate.sql.SelectFragment;
import net.sf.hibernate.type.AbstractComponentType;
import net.sf.hibernate.type.IdentifierType;
***************
*** 123,138 ****
}
! public String selectIdentifierString(String name, String suffix) {
! String[] cols = getIdentifierColumnNames();
! StringBuffer buf = new StringBuffer(15);
! for (int i=0; i<cols.length; i++) {
! buf.append(name)
! .append('.')
! .append( cols[i] )
! .append(" as ")
! .append( StringHelper.suffix(cols[i], suffix) );
! if (i!=cols.length-1) buf.append(", ");
! }
! return buf.toString();
}
--- 124,133 ----
}
! public String identifierSelectClauseFragment(String name, String suffix) {
! return new SelectFragment()
! .setSuffix(suffix)
! .addColumns( name, getIdentifierColumnNames() )
! .toFragmentString()
! .substring(2); //strip leading ", "
}
***************
*** 156,161 ****
}
else if (
! path.startsWith(PathExpressionParser.ENTITY_ID + '.') ||
! ( idprop!=null && path.startsWith(idprop + '.') )
) {
--- 151,156 ----
}
else if (
! path.startsWith(PathExpressionParser.ENTITY_ID + StringHelper.DOT) ||
! ( idprop!=null && path.startsWith(idprop + StringHelper.DOT) )
) {
***************
*** 175,179 ****
}
! return StringHelper.prefix(cols, name + '.');
}
--- 170,174 ----
}
! return StringHelper.prefix(cols, name + StringHelper.DOT);
}
***************
*** 195,200 ****
}
else if (
! path.startsWith(PathExpressionParser.ENTITY_ID + '.') ||
! ( idprop!=null && path.startsWith(idprop + '.') )
) {
return getIdentifierPropertyType( path.substring( PathExpressionParser.ENTITY_ID.length()+1 ) );
--- 190,195 ----
}
else if (
! path.startsWith(PathExpressionParser.ENTITY_ID + StringHelper.DOT) ||
! ( idprop!=null && path.startsWith(idprop + StringHelper.DOT) )
) {
return getIdentifierPropertyType( path.substring( PathExpressionParser.ENTITY_ID.length()+1 ) );
***************
*** 255,259 ****
if ( log.isTraceEnabled() ) {
for ( int i=0; i<props.length; i++ ) {
! log.trace( className + '.'+ propertyNames[ props[i] ] + " is dirty" );
}
}
--- 250,254 ----
if ( log.isTraceEnabled() ) {
for ( int i=0; i<props.length; i++ ) {
! log.trace( className + StringHelper.DOT+ propertyNames[ props[i] ] + " is dirty" );
}
}
Index: EntityPersister.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister/EntityPersister.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** EntityPersister.java 19 Jan 2003 11:47:07 -0000 1.6
--- EntityPersister.java 20 Jan 2003 12:48:14 -0000 1.7
***************
*** 37,40 ****
--- 37,46 ----
import net.sf.hibernate.hql.PathExpressionParser;
import net.sf.hibernate.id.IdentifierGeneratorFactory;
+ import net.sf.hibernate.sql.Delete;
+ import net.sf.hibernate.sql.InFragment;
+ import net.sf.hibernate.sql.Insert;
+ import net.sf.hibernate.sql.SimpleSelect;
+ import net.sf.hibernate.sql.SelectFragment;
+ import net.sf.hibernate.sql.Update;
import net.sf.hibernate.type.AbstractComponentType;
import net.sf.hibernate.type.DiscriminatorType;
***************
*** 102,106 ****
Type idType = factory.getIdentifierType( etype.getPersistentClass() );
! String idpath = path + '.' + PathExpressionParser.ENTITY_ID;
mods.put(idpath, idType);
columnNamesByPropertyPath.put(idpath, columns);
--- 108,112 ----
Type idType = factory.getIdentifierType( etype.getPersistentClass() );
! String idpath = path + StringHelper.DOT + PathExpressionParser.ENTITY_ID;
mods.put(idpath, idType);
columnNamesByPropertyPath.put(idpath, columns);
***************
*** 108,114 ****
AbstractComponentType actype = (AbstractComponentType) idType;
String[] props = actype.getPropertyNames();
! if (props.length!=columns.length) throw new MappingException("broken mapping for: " + getClassName() + '.' + path);
for ( int i=0; i<props.length; i++ ) {
! String subidpath = idpath + '.' + props[i];
columnNamesByPropertyPath.put( subidpath, new String[] { columns[i] } );
mods.put( subidpath, actype.getSubtypes()[i] );
--- 114,120 ----
AbstractComponentType actype = (AbstractComponentType) idType;
String[] props = actype.getPropertyNames();
! if (props.length!=columns.length) throw new MappingException("broken mapping for: " + getClassName() + StringHelper.DOT + path);
for ( int i=0; i<props.length; i++ ) {
! String subidpath = idpath + StringHelper.DOT + props[i];
columnNamesByPropertyPath.put( subidpath, new String[] { columns[i] } );
mods.put( subidpath, actype.getSubtypes()[i] );
***************
*** 247,261 ****
*/
protected String generateDeleteString() {
! StringBuffer buf = new StringBuffer("delete from ")
! .append( getTableName() )
! .append(" where ")
! .append( StringHelper.join( " = ? and ", getIdentifierColumnNames() ) )
! .append(" = ?");
! if ( isVersioned() ) {
! buf.append(" and ")
! .append( getVersionColumnName() )
! .append(" = ?") ;
! }
! return buf.toString();
}
--- 253,261 ----
*/
protected String generateDeleteString() {
! return new Delete()
! .setTableName( getTableName() )
! .setPrimaryKeyColumnNames( getIdentifierColumnNames() )
! .setVersionColumnName( getVersionColumnName() )
! .toStatementString();
}
***************
*** 264,308 ****
*/
protected String generateInsertString(boolean identityInsert) {
!
! String identityColumnInsertString = dialect.getIdentityInsertString();
!
! String[] columnNames = getColumnNames();
! boolean hasPropertyColumns = columnNames.length > 0;
! boolean insertIdentifierColumns = !identityInsert || identityColumnInsertString!=null;
! String commaAfterProperties = hasPropertyColumns && ( insertIdentifierColumns || isPolymorphic() ) ? ", " : "";
! String commaAfterIdentifiers = insertIdentifierColumns && isPolymorphic() ? ", " : "";
!
! StringBuffer buf = new StringBuffer("insert into ")
! .append( getTableName() )
! .append(' ');
!
! if ( !hasPropertyColumns && !insertIdentifierColumns && !isPolymorphic() ) {
! buf.append( dialect.getNoColumnsInsertString() );
}
else {
! buf.append(" ( ")
! .append( net.sf.hibernate.util.StringHelper.join( ", ", columnNames ) )
! .append(commaAfterProperties)
! .append( insertIdentifierColumns ? StringHelper.join( ", ", getIdentifierColumnNames() ) : "" )
! .append(commaAfterIdentifiers)
! .append( isPolymorphic() ? getDiscriminatorColumnName() : "" ) //to handle discriminator column
! .append(" ) values ( ")
! .append( hasPropertyColumns ? StringHelper.repeat( "?, ", columnNames.length-1 ) : "" )
! .append( hasPropertyColumns ? "?" : "" )
! .append(commaAfterProperties);
!
! if ( !identityInsert ) {
! buf.append( StringHelper.repeat( "?, ", getIdentifierColumnNames().length-1 ) )
! .append("?");
! }
! else if (identityColumnInsertString!=null) {
! buf.append(identityColumnInsertString);
! }
! buf.append(commaAfterIdentifiers);
!
! if ( isPolymorphic() ) buf.append(discriminatorSQLString); //to handle discriminator column
! buf.append(" )");
}
! return buf.toString();
}
--- 264,278 ----
*/
protected String generateInsertString(boolean identityInsert) {
! Insert insert = new Insert(dialect)
! .setTableName( getTableName() )
! .addColumns( getColumnNames() );
! if ( isPolymorphic() ) insert.addColumn( getDiscriminatorColumnName(), discriminatorSQLString );
! if (!identityInsert) {
! insert.addColumns( getIdentifierColumnNames() );
}
else {
! insert.addIdentityColumn( getIdentifierColumnNames()[0] );
}
! return insert.toStatementString();
}
***************
*** 325,341 ****
*/
protected String generateSelectString() {
! final String[] subclassColumnClosure = getSubclassColumnClosure();
! return new StringBuffer(100)
! .append("select ")
! .append( StringHelper.join( ", ", getIdentifierColumnNames() ) )
! .append( hasSubclasses() ? ", " + getDiscriminatorColumnName() : "" )
! .append( subclassColumnClosure.length==0 ? "" : ", ")
! .append( StringHelper.join( ", ", subclassColumnClosure ) )
! .append(" from ")
! .append( getTableName() )
! .append(" where ")
! .append( StringHelper.join( " = ? and ", getIdentifierColumnNames() ) )
! .append(" = ?")
! .toString();
}
--- 295,306 ----
*/
protected String generateSelectString() {
! SimpleSelect select = new SimpleSelect()
! .setTableName( getTableName() )
! .addColumns( getIdentifierColumnNames() )
! .addColumns( getSubclassColumnClosure() );
! if ( hasSubclasses() ) {
! select.addColumn( getDiscriminatorColumnName() );
! }
! return select.addCondition( getIdentifierColumnNames(), "=?" ).toStatementString();
}
***************
*** 344,367 ****
*/
protected String generateUpdateString() {
! String[] columnNames = getColumnNames();
! StringBuffer setters = new StringBuffer(20);
! for (int i=0; i<columnNames.length; i++) {
! setters.append( columnNames[i] ).append(" = ?");
! if (i!=columnNames.length-1) setters.append(", ");
! }
! StringBuffer buf = new StringBuffer(100)
! .append("update ")
! .append( getTableName() )
! .append(" set ")
! .append( setters.toString() )
! .append(" where ")
! .append( StringHelper.join( " = ? and ", getIdentifierColumnNames() ) ) //TODO:refactor out copied code
! .append(" = ?");
! if ( isVersioned() ) {
! buf.append(" and ")
! .append( getVersionColumnName() )
! .append(" = ?");
! }
! return buf.toString();
}
--- 309,318 ----
*/
protected String generateUpdateString() {
! return new Update()
! .setTableName( getTableName() )
! .addColumns( getColumnNames() )
! .setPrimaryKeyColumnNames( getIdentifierColumnNames() )
! .setVersionColumnName( getVersionColumnName() )
! .toStatementString();
}
***************
*** 370,387 ****
*/
protected String generateLockString() {
! StringBuffer buf = new StringBuffer(100)
! .append("select ")
! .append( getIdentifierColumnNames()[0] )
! .append(" from ")
! .append( getTableName() )
! .append(" where ")
! .append( StringHelper.join( " = ? and ", getIdentifierColumnNames() ) ) //TODO:refactor out copied code
! .append(" = ?");
if ( isVersioned() ) {
! buf.append(" and ")
! .append( getVersionColumnName() )
! .append(" = ?");
}
! return buf.toString();
}
--- 321,334 ----
*/
protected String generateLockString() {
! SimpleSelect select = new SimpleSelect()
! .setTableName( getTableName() )
! .addColumn( getIdentifierColumnNames()[0] )
! .addCondition( getIdentifierColumnNames(), "=?" );
if ( isVersioned() ) {
! select.addWhereToken("and")
! .addCondition( getVersionColumnName(), "=?" );
}
! return select.toStatementString();
!
}
***************
*** 702,711 ****
propertyColumnNames[i] = colNames;
! initPropertyPaths(prop, "");
i++;
}
if ( model.hasIdentifierProperty() && model.getIdentifierProperty().isComposite() ) {
! initPropertyPaths( model.getIdentifierProperty(), "" );
}
--- 649,658 ----
propertyColumnNames[i] = colNames;
! initPropertyPaths(prop, StringHelper.EMPTY_STRING);
i++;
}
if ( model.hasIdentifierProperty() && model.getIdentifierProperty().isComposite() ) {
! initPropertyPaths( model.getIdentifierProperty(), StringHelper.EMPTY_STRING );
}
***************
*** 810,819 ****
Type type = prop.getType();
typesByPropertyPath.put(path, type);
! /*if ( type.isEntityType() && ( (EntityType) type ).isOneToOne() ) {
! columnNamesByPropertyPath.put( path, getIdentifierColumnNames() );
! }
! else {*/
columnNamesByPropertyPath.put(path, names);
- //}
}
--- 757,762 ----
Type type = prop.getType();
typesByPropertyPath.put(path, type);
!
columnNamesByPropertyPath.put(path, names);
}
***************
*** 833,866 ****
}
! public String fromClauseFragment(String name, boolean innerJoin) {
return getTableName() + ' ' + name;
}
!
! public String outerJoinsAfterFrom(String name, boolean innerJoin) {
! return "";
! }
!
! public String outerJoinsAfterWhere(String name, boolean innerJoin) {
! return "";
! }
!
! public String getQueryWhereClause(String name) throws MappingException {
if ( isInherited() ) {
! StringBuffer buf = new StringBuffer(40);
! buf.append(name)
! .append('.')
! .append( getDiscriminatorColumnName() )
! .append(" in (");
Class[] subclasses = getSubclassClosure();
for ( int i=0; i<subclasses.length; i++ ) {
! buf.append(
! ( (Queryable) factory.getPersister( subclasses[i] ) )
! .getDiscriminatorSQLString()
);
- if (i<subclasses.length-1) buf.append(", ");
}
! buf.append(") ");
! return buf.toString();
}
else {
--- 776,795 ----
}
! public String fromClauseFragment(String name, boolean innerJoin, boolean includeSubclasses) {
return getTableName() + ' ' + name;
}
!
! public String getQueryWhereClause(String name, boolean includeSubclasses) throws MappingException {
if ( isInherited() ) {
! InFragment frag = new InFragment()
! .setColumn( name, getDiscriminatorColumnName() );
Class[] subclasses = getSubclassClosure();
for ( int i=0; i<subclasses.length; i++ ) {
! frag.addValue(
! ( (Queryable) factory.getPersister( subclasses[i] ) ).getDiscriminatorSQLString()
);
}
! return frag.toFragmentString();
}
else {
***************
*** 884,919 ****
}
! return StringHelper.prefix(cols, name + '.');
}
public String[] toColumns(String name, int i) {
! return StringHelper.prefix( subclassPropertyColumnNameClosure[i], name + '.' );
}
public String propertySelectClauseFragment(String name, String suffix) {
! StringBuffer buf = new StringBuffer(30);
!
! if ( hasSubclasses() ) {
! String discr = getDiscriminatorColumnName();
! buf.append(", ")
! .append(name)
! .append('.')
! .append(discr)
! .append(" as ")
! .append( StringHelper.suffix(discr, suffix) );
! }
!
! String[] cols = getSubclassColumnClosure();
!
! for ( int i=0; i<cols.length; i++ ) {
! buf.append(", ")
! .append(name)
! .append('.')
! .append( cols[i] )
! .append(" as ")
! .append( StringHelper.suffix(cols[i], suffix) );
! }
! return buf.toString();
}
--- 813,830 ----
}
! return StringHelper.prefix(cols, name + StringHelper.DOT);
}
public String[] toColumns(String name, int i) {
! return StringHelper.prefix( subclassPropertyColumnNameClosure[i], name + StringHelper.DOT );
}
public String propertySelectClauseFragment(String name, String suffix) {
! SelectFragment frag = new SelectFragment()
! .setSuffix(suffix);
! if ( hasSubclasses() ) frag.addColumn( name, getDiscriminatorColumnName() );
! return frag.addColumns( name, getSubclassColumnClosure() )
! .toFragmentString();
}
***************
*** 922,925 ****
--- 833,844 ----
}
+ public String fromJoinFragment(String alias, boolean innerJoin) {
+ return StringHelper.EMPTY_STRING;
+ }
+
+ public String whereJoinFragment(String alias, boolean innerJoin) {
+ return StringHelper.EMPTY_STRING;
+ }
+
}
Index: Loadable.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister/Loadable.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** Loadable.java 5 Jan 2003 02:11:22 -0000 1.3
--- Loadable.java 20 Jan 2003 12:48:14 -0000 1.4
***************
*** 90,93 ****
--- 90,98 ----
/**
* Given a query alias and an identifying suffix, render the
+ * intentifier select fragment
+ */
+ public String identifierSelectClauseFragment(String name, String suffix);
+ /**
+ * Given a query alias and an identifying suffix, render the
* property select fragment
* (optional operation)
***************
*** 98,112 ****
* (optional operation)
*/
! public String fromClauseFragment(String name, boolean innerJoin);
! /**
! * Get any outer join SQL fragments that appear in the <tt>FROM</tt> clause
! * (optional operation)
! */
! public String outerJoinsAfterFrom(String name, boolean innerJoin);
! /**
! * Get any outer join SQL fragments that appear in the <tt>WHERE</tt> clause
! * (optional operation)
! */
! public String outerJoinsAfterWhere(String name, boolean innerJoin);
/**
* Get the table alias for the particular subclass state
--- 103,108 ----
* (optional operation)
*/
! public String fromClauseFragment(String name, boolean innerJoin, boolean includeSubclasses);
!
/**
* Get the table alias for the particular subclass state
***************
*** 114,117 ****
--- 110,116 ----
*/
public String getConcreteClassAlias(String alias);
+
+ public String whereJoinFragment(String alias, boolean innerJoin);
+ public String fromJoinFragment(String alias, boolean innerJoin);
}
Index: Queryable.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister/Queryable.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** Queryable.java 5 Jan 2003 02:11:22 -0000 1.3
--- Queryable.java 20 Jan 2003 12:48:14 -0000 1.4
***************
*** 44,54 ****
* Get the where clause fragment, given a query alias
*/
! public String getQueryWhereClause(String name) throws MappingException;
- /**
- * Given a query alias and an identifying suffix, render the
- * intentifier select fragment
- */
- public String selectIdentifierString(String name, String suffix);
/**
* Given a query alias and a property path, return the qualified
--- 44,49 ----
* Get the where clause fragment, given a query alias
*/
! public String getQueryWhereClause(String name, boolean includeSubclasses) throws MappingException;
/**
* Given a query alias and a property path, return the qualified
|