public void CompactWithNoParams() { SqlString sql = new SqlString( new string[] { "", "select", " from table" } ); SqlString compacted = sql.Compact(); Assert.AreEqual( 1, compacted.SqlParts.Length ); Assert.AreEqual( "select from table", compacted.ToString() ); }
public void CompactWithNoString() { Parameter p1 = new Parameter( "p1" ); Parameter p2 = new Parameter( "p2" ); SqlString sql = new SqlString( new object[] {p1, p2} ); SqlString compacted = sql.Compact(); Assert.AreEqual( 2, compacted.SqlParts.Length ); Assert.AreEqual( ":p1:p2", compacted.ToString() ); }
protected SqlString ExpandDynamicFilterParameters(SqlString sqlString, ICollection<IParameterSpecification> parameterSpecs, ISessionImplementor session) { var enabledFilters = session.EnabledFilters; if (enabledFilters.Count == 0 || sqlString.ToString().IndexOf(ParserHelper.HqlVariablePrefix) < 0) { return sqlString; } Dialect.Dialect dialect = session.Factory.Dialect; string symbols = ParserHelper.HqlSeparators + dialect.OpenQuote + dialect.CloseQuote; var originSql = sqlString.Compact(); var result = new SqlStringBuilder(); foreach (var sqlPart in originSql.Parts) { var parameter = sqlPart as Parameter; if (parameter != null) { result.Add(parameter); continue; } var sqlFragment = sqlPart.ToString(); var tokens = new StringTokenizer(sqlFragment, symbols, true); foreach (string token in tokens) { if (token.StartsWith(ParserHelper.HqlVariablePrefix)) { string filterParameterName = token.Substring(1); string[] parts = StringHelper.ParseFilterParameterName(filterParameterName); string filterName = parts[0]; string parameterName = parts[1]; var filter = (FilterImpl)enabledFilters[filterName]; object value = filter.GetParameter(parameterName); IType type = filter.FilterDefinition.GetParameterType(parameterName); int parameterColumnSpan = type.GetColumnSpan(session.Factory); var collectionValue = value as ICollection; int? collectionSpan = null; // Add query chunk string typeBindFragment = string.Join(", ", Enumerable.Repeat("?", parameterColumnSpan).ToArray()); string bindFragment; if (collectionValue != null && !type.ReturnedClass.IsArray) { collectionSpan = collectionValue.Count; bindFragment = string.Join(", ", Enumerable.Repeat(typeBindFragment, collectionValue.Count).ToArray()); } else { bindFragment = typeBindFragment; } // dynamic-filter parameter tracking var filterParameterFragment = SqlString.Parse(bindFragment); var dynamicFilterParameterSpecification = new DynamicFilterParameterSpecification(filterName, parameterName, type, collectionSpan); var parameters = filterParameterFragment.GetParameters().ToArray(); var sqlParameterPos = 0; var paramTrackers = dynamicFilterParameterSpecification.GetIdsForBackTrack(session.Factory); foreach (var paramTracker in paramTrackers) { parameters[sqlParameterPos++].BackTrack = paramTracker; } parameterSpecs.Add(dynamicFilterParameterSpecification); result.Add(filterParameterFragment); } else { result.Add(token); } } } return result.ToSqlString().Compact(); }
/// <summary> /// Add a <c>LIMIT (TOP)</c> clause to the given SQL <c>SELECT</c> /// </summary> /// <param name="querySqlString">A Query in the form of a SqlString.</param> /// <param name="limit">Maximum number of rows to be returned by the query</param> /// <param name="offset">Offset of the first row to process in the result set</param> /// <returns>A new SqlString that contains the <c>LIMIT</c> clause.</returns> public override SqlString GetLimitString(SqlString querySqlString, int offset, int limit) { if (offset > 0) { throw new NotSupportedException("SQL Server does not support an offset" ); } /* * "SELECT TOP limit rest-of-sql-statement" */ querySqlString = querySqlString.Compact(); SqlStringBuilder pagingBuilder = new SqlStringBuilder(); bool topAdded = false; foreach( object sqlPart in querySqlString.SqlParts ) { if (!topAdded) { string sqlPartString = sqlPart as string; if( sqlPartString != null ) { string sqlFragment = sqlPartString.TrimStart(); int insertIndex = GetAfterSelectInsertPoint(sqlFragment); if( insertIndex > 0 ) { string newFragment = sqlFragment.Insert(insertIndex, " top " + limit.ToString()); pagingBuilder.Add(newFragment); topAdded = true; continue; } } } pagingBuilder.AddObject(sqlPart); } return pagingBuilder.ToSqlString(); }