From: Michael D. <mik...@us...> - 2004-08-18 20:48:00
|
Update of /cvsroot/nhibernate/nhibernate/src/NHibernate/Hql In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6953/NHibernate/Hql Modified Files: PathExpressionParser.cs QueryTranslator.cs WhereParser.cs Log Message: Refactoring of converting Hql to SqlString. Index: WhereParser.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Hql/WhereParser.cs,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** WhereParser.cs 16 Aug 2004 05:28:22 -0000 1.17 --- WhereParser.cs 18 Aug 2004 20:47:51 -0000 1.18 *************** *** 168,174 **** // in the list of nested subexpressions we are currently processing. ! private ArrayList nots = new ArrayList(); //were an odd or even number of NOTs encountered ! private ArrayList joins = new ArrayList(); //the join string built up by compound paths inside this expression ! private ArrayList booleanTests = new ArrayList();//a flag indicating if the subexpression is known to be boolean private string GetElementName(PathExpressionParser.CollectionElement element, QueryTranslator q) --- 168,182 ---- // in the list of nested subexpressions we are currently processing. ! //were an odd or even number of NOTs encountered ! // each item in the list is a System.Boolean ! private ArrayList nots = new ArrayList(); ! ! //the join string built up by compound paths inside this expression ! // each item in the list is a StringBuilder. ! private ArrayList joins = new ArrayList(); ! ! //a flag indicating if the subexpression is known to be boolean ! // each item in the list is a System.Boolean ! private ArrayList booleanTests = new ArrayList(); private string GetElementName(PathExpressionParser.CollectionElement element, QueryTranslator q) *************** *** 272,276 **** throw new QueryException("MappingException occurred compiling subquery", me); } ! AppendToken(q, subq.SQLString); inSubselect = false; bracketsSinceSelect = 0; --- 280,285 ---- throw new QueryException("MappingException occurred compiling subquery", me); } ! // AppendToken( q, subq.SQLString); ! AppendToken(q, subq.SqlString); inSubselect = false; bracketsSinceSelect = 0; *************** *** 458,463 **** { q.AddNamedParameter(token.Substring(1)); ! AppendToken(q, StringHelper.SqlParameter); ! } else { --- 467,480 ---- { q.AddNamedParameter(token.Substring(1)); ! // AppendToken(q, StringHelper.SqlParameter); ! AppendToken(q, new SqlCommand.SqlString( new object[] { new SqlCommand.Parameter() } ) ); ! } ! else if ( token.Equals(StringHelper.SqlParameter) ) ! { ! //TODO: this is all new code - I'm just looking for a way to find out when ! // we are adding a parameter ! // q.AppendWhereToken(token); ! q.AppendWhereToken(new SqlCommand.SqlString( new object[] { new SqlCommand.Parameter() } ) ); ! } else { *************** *** 539,542 **** --- 556,560 ---- protected virtual void AppendToken(QueryTranslator q, string token) { + if (expectingIndex > 0) { *************** *** 545,548 **** --- 563,578 ---- else { + q.AppendWhereToken( new SqlCommand.SqlString(token) ); + } + } + + protected virtual void AppendToken(QueryTranslator q, SqlCommand.SqlString token) + { + if (expectingIndex > 0) + { + pathExpressionParser.LastCollectionElementIndexValue = token.ToString(); + } + else + { q.AppendWhereToken(token); } Index: QueryTranslator.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Hql/QueryTranslator.cs,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** QueryTranslator.cs 16 Aug 2004 05:28:22 -0000 1.37 --- QueryTranslator.cs 18 Aug 2004 20:47:51 -0000 1.38 *************** *** 19,23 **** using NHibernate.Type; using NHibernate.Util; - using BaseLoader = NHibernate.Loader.Loader; namespace NHibernate.Hql --- 19,22 ---- *************** *** 26,30 **** /// An instance of <c>QueryTranslator</c> translates a Hibernate query string to SQL. /// </summary> ! public class QueryTranslator : BaseLoader { private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(QueryTranslator)); --- 25,29 ---- /// An instance of <c>QueryTranslator</c> translates a Hibernate query string to SQL. /// </summary> ! public class QueryTranslator : Loader.Loader { private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(QueryTranslator)); *************** *** 40,44 **** --- 39,46 ---- private ArrayList crossJoins = new ArrayList(); + // contains a List of strings private IList scalarSelectTokens = new ArrayList(); + + // contains a List of strings containing Sql or SqlStrings private IList whereTokens = new ArrayList(); private IList havingTokens = new ArrayList(); *************** *** 70,73 **** --- 72,76 ---- protected bool compiled; private string sqlString; + private SqlCommand.SqlString realSqlString; private System.Type holderClass; private ConstructorInfo holderConstructor; *************** *** 253,256 **** --- 256,260 ---- } + [Obsolete("Should use Hql.QueryTranslator.SqlString property instead")] public override string SQLString { *************** *** 267,271 **** get { ! throw new InvalidOperationException("SqlString not yet implemented in HQL.QueryTranslator"); } } --- 271,276 ---- get { ! LogQuery( queryString, realSqlString.ToString() ); ! return realSqlString; } } *************** *** 415,418 **** --- 420,428 ---- } + internal void AppendWhereToken(SqlCommand.SqlString token) + { + whereTokens.Add(token); + } + internal void AppendHavingToken(string token) { *************** *** 611,615 **** } ! sqlString = sql.ToQueryString(); System.Type[] classes = new System.Type[types.Length]; --- 621,627 ---- } ! // sqlString = sql.ToQueryString(); ! realSqlString = sql.ToQuerySqlString(); ! System.Type[] classes = new System.Type[types.Length]; *************** *** 852,855 **** --- 864,868 ---- CollectionPersister persister = GetCollectionPersister(collectionRole); string[] keyColumnNames = persister.KeyColumnNames; + IType keyType = persister.KeyType; //if (keyColumnNames.Length!=1) throw new QueryException("composite-key collecion in filter: " + collectionRole); *************** *** 873,877 **** SqlCommand.JoinType.InnerJoin); } ! join.AddCondition( collectionName, keyColumnNames, " = ?"); if (persister.HasWhere) join.AddCondition(persister.GetSQLWhereString(collectionName)); AddFrom(elementName, elemType.PersistentClass, join); --- 886,890 ---- SqlCommand.JoinType.InnerJoin); } ! join.AddCondition( collectionName, keyColumnNames, " = ", keyType, Factory); if (persister.HasWhere) join.AddCondition(persister.GetSQLWhereString(collectionName)); AddFrom(elementName, elemType.PersistentClass, join); *************** *** 934,938 **** // ApplyLocks(SqlString, lockModes, session.Factory.Dialect).ToString(), // this works because it is just appending strings and not doing any ! string sqlWithLock = ApplyLocks(new SqlString(SQLString), lockModes, session.Factory.Dialect).ToString(); --- 947,952 ---- // ApplyLocks(SqlString, lockModes, session.Factory.Dialect).ToString(), // this works because it is just appending strings and not doing any ! // string sqlWithLock = ApplyLocks(new SqlString(SQLString), lockModes, session.Factory.Dialect).ToString(); ! SqlString sqlWithLock = ApplyLocks(SqlString, lockModes, session.Factory.Dialect); *************** *** 1289,1293 **** protected override IDbCommand PrepareQueryStatement(string sql, object[] values, IType[] types, IDictionary namedParams, RowSelection selection, bool scroll, ISessionImplementor session) { ! IType[] paramTypes = null; object[] paramValues = null; --- 1303,1312 ---- protected override IDbCommand PrepareQueryStatement(string sql, object[] values, IType[] types, IDictionary namedParams, RowSelection selection, bool scroll, ISessionImplementor session) { ! return PrepareQueryStatement( new SqlString(sql), values, types, namedParams, selection, scroll, session); ! } ! ! protected override IDbCommand PrepareQueryStatement(SqlString sql, object[] values, IType[] types, IDictionary namedParams, RowSelection selection, bool scroll, ISessionImplementor session) ! { ! IType[] paramTypes = null; object[] paramValues = null; *************** *** 1339,1373 **** ! StringTokenizer tokenizer = new StringTokenizer(sql, StringHelper.SqlParameter, true); ! string[] tokens = sql.Split(StringHelper.SqlParameter[0]); ! ! SqlStringBuilder hqlToSqlBuilder = new SqlStringBuilder(types.Length * 2); ! ! IEnumerator tokenEnum = tokenizer.GetEnumerator(); ! string previousToken = String.Empty; ! string token = String.Empty; int paramIndex = 0; ! ! while(tokenEnum.MoveNext()) { ! token = (string)tokenEnum.Current; ! ! if(token.Equals(StringHelper.SqlParameter) ! && ( EndsWithBoolOperator( previousToken ) ) ) //.EndsWith("=") || previousToken.EndsWith("= ") ) ) { ! Parameter param = Parameter.GenerateParameters(session.Factory, new string[]{paramIndex.ToString()}, paramTypes[paramIndex])[0]; ! hqlToSqlBuilder.Add(param); paramIndex++; } ! else ! { ! hqlToSqlBuilder.Add(token); ! } ! ! previousToken = token; } ! return PrepareCommand(hqlToSqlBuilder.ToSqlString(), paramValues, paramTypes, null, selection, scroll, session); ! } --- 1358,1399 ---- ! // StringTokenizer tokenizer = new StringTokenizer(sql, StringHelper.SqlParameter, true); ! // string[] tokens = sql.Split(StringHelper.SqlParameter[0]); ! // ! // SqlStringBuilder hqlToSqlBuilder = new SqlStringBuilder(types.Length * 2); ! SqlStringBuilder hqlBuilder = new SqlStringBuilder(sql); //this.SqlString ! // IEnumerator tokenEnum = tokenizer.GetEnumerator(); ! // string previousToken = String.Empty; ! // string token = String.Empty; int paramIndex = 0; ! // ! // while(tokenEnum.MoveNext()) ! for( int i=0; i<hqlBuilder.Count; i++ ) { ! // token = (string)tokenEnum.Current; ! Parameter partParam = hqlBuilder[i] as Parameter; ! if(partParam!=null) { ! Parameter param = Parameter.GenerateParameters(session.Factory, new string[] {paramIndex.ToString()}, paramTypes[paramIndex])[0]; ! hqlBuilder[i] = param; paramIndex++; } ! // if(token.Equals(StringHelper.SqlParameter) ! // && ( EndsWithBoolOperator( previousToken ) ) ) //.EndsWith("=") || previousToken.EndsWith("= ") ) ) ! // { ! // Parameter param = Parameter.GenerateParameters(session.Factory, new string[]{paramIndex.ToString()}, paramTypes[paramIndex])[0]; ! // hqlToSqlBuilder.Add(param); ! // paramIndex++; ! // } ! // else ! // { ! // hqlToSqlBuilder.Add(token); ! // } ! // ! // previousToken = token; } ! // return PrepareCommand(hqlToSqlBuilder.ToSqlString(), paramValues, paramTypes, null, selection, scroll, session); ! return PrepareCommand(hqlBuilder.ToSqlString(), paramValues, paramTypes, null, selection, scroll, session); } Index: PathExpressionParser.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Hql/PathExpressionParser.cs,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** PathExpressionParser.cs 16 Aug 2004 05:28:22 -0000 1.14 --- PathExpressionParser.cs 18 Aug 2004 20:47:51 -0000 1.15 *************** *** 317,320 **** --- 317,321 ---- public virtual void End(QueryTranslator q) { + ignoreInitialJoin = false; if ( IsCollectionValued ) |