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 |