private static int GetPrevTableInsertPoint(SqlString text) { int i = text.LastIndexOfCaseInsensitive("from"); int j = text.LastIndexOfCaseInsensitive(","); if (i == -1 && j == -1) { return(-1); } if (j > i) { return(j + 1); } return(i + 5); }
/// <summary> /// Removes the <c>as someColumnAlias</c> clause from a <c>SqlString</c> representing a column expression. /// Consider using <c>CriterionUtil.GetColumn...</c> methods instead. /// </summary> /// <param name="sql">The <c>SqlString</c> representing a column expression which might be aliased.</param> /// <returns><paramref name="sql" /> if it was not aliased, otherwise an un-aliased <c>SqlString</c> representing the column.</returns> public static SqlString RemoveAsAliasesFromSql(SqlString sql) { int index = sql.LastIndexOfCaseInsensitive(" as "); if (index < 0) { return(sql); } return(sql.Substring(0, index)); }
public static SqlString RemoveAsAliasesFromSql(SqlString sql) { return sql.Substring(0, sql.LastIndexOfCaseInsensitive(" as ")); }
/// <summary> /// Add a <c>LIMIT</c> clause to the given SQL <c>SELECT</c> /// </summary> /// <param name="querySqlString">The <see cref="SqlString"/> to base the limit query off.</param> /// <param name="offset">Offset of the first row to be returned by the query (zero-based)</param> /// <param name="limit">Maximum number of rows to be returned by the query</param> /// <param name="offsetParameterIndex">Optionally, the Offset parameter index</param> /// <param name="limitParameterIndex">Optionally, the Limit parameter index</param> /// <returns>A new <see cref="SqlString"/> with the <c>LIMIT</c> clause applied.</returns> /// <remarks> /// Note that we need to explicitly specify the columns, because we need to be able to use them in a paged subselect [NH-1155] /// </remarks> public override SqlString GetLimitString(SqlString querySqlString, int offset, int limit, int? offsetParameterIndex, int? limitParameterIndex) { SqlStringBuilder result = new SqlStringBuilder(); if (offset == 0) { int insertPoint = this.GetAfterSelectInsertPoint(querySqlString); return result .Add(querySqlString.Substring(0, insertPoint)) .Add(" TOP (") .Add(limitParameterIndex == null ? Parameter.Placeholder : Parameter.WithIndex(limitParameterIndex.Value)) .Add(")") .Add(querySqlString.Substring(insertPoint)) .ToSqlString(); } int fromIndex = GetFromIndex(querySqlString); SqlString select = querySqlString.Substring(0, fromIndex); List<SqlString> columnsOrAliases; Dictionary<SqlString, SqlString> aliasToColumn; ExtractColumnOrAliasNames(select, out columnsOrAliases, out aliasToColumn); int orderIndex = querySqlString.LastIndexOfCaseInsensitive(" order by "); SqlString fromAndWhere; SqlString[] sortExpressions; //don't use the order index if it is contained within a larger statement(assuming //a statement with non matching parenthesis is part of a larger block) if (orderIndex > 0 && HasMatchingParens(querySqlString.Substring(orderIndex).ToString())) { fromAndWhere = querySqlString.Substring(fromIndex, orderIndex - fromIndex).Trim(); SqlString orderBy = querySqlString.Substring(orderIndex).Trim(); sortExpressions = orderBy.Substring(9).Split(","); } else { fromAndWhere = querySqlString.Substring(fromIndex).Trim(); // Use dummy sort to avoid errors sortExpressions = new[] {new SqlString("CURRENT_TIMESTAMP"),}; } result .Add("SELECT TOP (") .Add(limitParameterIndex == null ? Parameter.Placeholder : Parameter.WithIndex(limitParameterIndex.Value)) .Add(") ") .Add(StringHelper.Join(", ", columnsOrAliases)) .Add(" FROM (") .Add(select) .Add(", ROW_NUMBER() OVER(ORDER BY "); AppendSortExpressions(aliasToColumn, sortExpressions, result); result .Add(") as __hibernate_sort_row ") .Add(fromAndWhere) .Add(") as query WHERE query.__hibernate_sort_row > ") .Add(offsetParameterIndex == null ? Parameter.Placeholder : Parameter.WithIndex(offsetParameterIndex.Value)) .Add(" ORDER BY query.__hibernate_sort_row"); return result.ToSqlString(); }
public static SqlString RemoveAsAliasesFromSql(SqlString sql) { return(sql.Substring(0, sql.LastIndexOfCaseInsensitive(" as "))); }
private static int GetPrevTableInsertPoint(SqlString text) { int i = text.LastIndexOfCaseInsensitive("from"); int j = text.LastIndexOfCaseInsensitive(","); if (i == -1 && j == -1) { return -1; } if (j > i) { return j + 1; } return i + 5; }
public static SqlString RemoveAsAliasesFromSql(SqlString sql) { int index = sql.LastIndexOfCaseInsensitive(" as "); if (index < 0) return sql; return sql.Substring(0, index); }