/// <summary> /// Creates a TopClause with the given topCount and withTies. /// </summary> /// <param name="topCount"> </param> /// <param name="withTies"> </param> internal TopClause(int topCount, bool withTies) { var sqlBuilder = new SqlBuilder(); sqlBuilder.Append(topCount.ToString(CultureInfo.InvariantCulture)); this.topCount = sqlBuilder; this.withTies = withTies; }
/// <summary> /// Creates a TopClause with the given topCount and withTies. /// This function is not called if we have both TOP and SKIP. In that case SqlSelectStatment.WriteOffsetFetch is used. /// </summary> /// <param name="topCount"></param> /// <param name="withTies"></param> internal TopClause(int topCount, bool withTies) { Debug.Assert(!withTies, "WITH TIES is not supported in Top clause"); var sqlBuilder = new SqlBuilder(); sqlBuilder.Append(topCount.ToString(CultureInfo.InvariantCulture)); this.topCount = sqlBuilder; this.withTies = withTies; }
/// <summary> /// Creates a TopClause with the given topCount and withTies. /// This function is not called if we have both TOP and SKIP. In that case SqlSelectStatment.WriteOffsetFetch is used. /// </summary> /// <param name="topCount"> </param> /// <param name="withTies"> </param> internal TopClause(int topCount, bool withTies) { Debug.Assert(!withTies, "WITH TIES is not supported in Top clause"); var sqlBuilder = new SqlBuilder(); sqlBuilder.Append(topCount.ToString(CultureInfo.InvariantCulture)); this.topCount = sqlBuilder; this.withTies = withTies; }
public PatchOperation(TransformFunction transform, IDocumentStorage storage, ISqlFragment fragment, IDictionary <string, object> patch, ISerializer serializer) { _transform = transform; _storage = storage; _fragment = fragment; _patch = patch; _serializer = serializer; }
private void WriteBinaryForAssign(SqlWriter writer, ISqlFragment fragment) { var binary = (BinaryFragment)fragment; writer.Write("SET "); binary.Left.WriteSql(writer); writer.Write(" = "); binary.Right.WriteSql(writer); }
/// <inheritdoc/> protected override void WriteFragmentForRenameObject(SqlWriter writer, ISqlFragment fragment) { var content = (RenameObjectFragment)fragment; writer.Write("RENAME "); content.Name.WriteSql(writer); writer.Write(" TO "); WriteDbName(writer, content.NewName); }
public SubClassDocumentStorage(IDocumentStorage <TRoot, TId> parent, SubClassMapping mapping) { _parent = parent; _mapping = mapping; FromObject = _mapping.Table.QualifiedName; _defaultWhere = _mapping.DefaultWhereFragment(); }
private void WriteFragmentForCreateVariable(SqlWriter writer, ISqlFragment fragment) { var create = (CreateVariableFragment)fragment; writer.Write("DECLARE "); create.Name.WriteSql(writer); writer.Write(" AS "); WriteDbDataType(writer, create.ClrType); }
/// <inheritdoc/> protected override void WriteFragmentForUpdate(SqlWriter writer, ISqlFragment fragment) { var update = (UpdateFragment)fragment; writer.Write("UPDATE "); WriteFragmentForSource(writer, update.Target); writer.WriteLine(); writer.Write("SET "); var values = update.Values.ToArray(); if (update.Sources.Any(a => a != update.Target)) { writer.Write('('); for (int i = 0; i < update.Members.Count; i++) { if (i > 0) { writer.Write(", "); } WriteDbName(writer, update.Members[i].OutputName); } writer.Write(") = ("); writer.Write("SELECT "); for (int i = 0; i < update.Members.Count; i++) { if (i > 0) { writer.Write(", "); } values[i].WriteSql(writer); } writer.WriteLine(); writer.Write("FROM "); update.Sources.ForEach(() => writer.WriteLine(), source => WriteFragmentForSource(writer, source)); WriteFragmentForWhere(writer, update.Where); writer.Write(')'); } else { for (int i = 0; i < update.Members.Count; i++) { var member = update.Members[i]; var value = values[i]; if (i > 0) { writer.Write(", "); } WriteDbName(writer, member.OutputName); writer.Write(" = "); value.WriteSql(writer); } WriteFragmentForWhere(writer, update.Where); } WriteFragmentForCommitReturning(writer, update.ReturnMembers, update.Target); }
/// <summary> /// Combine an "and" compound filter with the two filters /// </summary> /// <param name="filter"></param> /// <param name="fragments"></param> /// <returns></returns> public static ISqlFragment CombineAnd(this ISqlFragment filter, ISqlFragment other) { if (filter is CompoundWhereFragment c && c.Separator.EqualsIgnoreCase("and")) { c.Add(other); return(c); } return(CompoundWhereFragment.And(filter, other)); }
// TODO -- there's duplication here w/ DocumentStorage private IEnumerable<ISqlFragment> extraFilters(ISqlFragment query) { yield return toBasicWhere(); if (_mapping.DeleteStyle == DeleteStyle.SoftDelete && !query.Contains(SchemaConstants.DeletedColumn)) yield return ExcludeSoftDeletedFilter.Instance; if (_mapping.Parent.TenancyStyle == TenancyStyle.Conjoined && !query.SpecifiesTenant()) yield return new TenantWhereFragment(); }
public static string WriteSql(ISqlFragment sqlStatement, SqlVisitor visitor) { var builder = new StringBuilder(1024); using (var writer = new SqlWriter(builder)) { sqlStatement.WriteSql(writer, visitor); } return(builder.ToString()); }
private void WriteBinaryForPower(SqlWriter writer, ISqlFragment fragment) { var binary = (BinaryFragment)fragment; writer.Write("POWER("); binary.Left.WriteSql(writer); writer.Write(", "); binary.Right.WriteSql(writer); writer.Write(')'); }
private void WriteFragmentForCreateColumn(SqlWriter writer, ISqlFragment fragment) { var create = (CreateColumnFragment)fragment; WriteDbName(writer, create.Name); writer.Write(' '); var column = create.Metadata; WriteDbDataType(writer, column); }
/// <summary> /// Add an object to the list - we do not verify that it is a proper sql fragment /// since this is an internal method. /// </summary> /// <param name="sqlFragment"></param> public void Append(ISqlFragment sqlFragment) { Debug.Assert(sqlFragment != null); if (sqlFragment == null) { throw new ArgumentNullException("sqlFragment"); } _sqlFragments.Add(sqlFragment); }
/// <summary> /// 写入<see cref="BinaryFragment"/>方法。 /// </summary> /// <param name="writer">语句写入器。</param> /// <param name="fragment">当前语句。</param> private void WriteFragmentForBinary(SqlWriter writer, ISqlFragment fragment) { var content = (BinaryFragment)fragment; if (!_WriteBinaryMethods.TryGetValue(content.Kind, out WriteFragmentDelegate action)) { throw new NotSupportedException(string.Format(Res.NotSupportedWriteFragmentForBinary, content.Kind)); } action(writer, content); }
/// <summary> /// Initializes a new instance of the <see cref="Select"/> class. /// </summary> /// <param name="provider">The provider.</param> /// <param name="aggregates">The aggregates.</param> public Select(IDataProvider provider, params Aggregate[] aggregates) { _provider = provider; this.sqlFragment = _provider.SqlFragment; SQLCommand = this.sqlFragment.SELECT; foreach (Aggregate agg in aggregates) { Aggregates.Add(agg); } }
/// <summary> /// Initializes a new instance of the <see cref="Select"/> class. /// </summary> /// <param name="aggregates">The aggregates.</param> public Select(params Aggregate[] aggregates) { _provider = ProviderFactory.GetProvider(); this.sqlFragment = _provider.SqlFragment; SQLCommand = this.sqlFragment.SELECT; foreach (Aggregate agg in aggregates) { Aggregates.Add(agg); } }
public SubClassDocumentStorage(IDocumentStorage <TRoot, TId> parent, SubClassMapping mapping) { _parent = parent; _mapping = mapping; FromObject = _mapping.TableName.QualifiedName; _defaultWhere = determineWhereFragment(); _fields = _parent.SelectFields(); }
/// <summary> /// 写入<see cref="AggregateFragment"/>方法。 /// </summary> /// <param name="writer">语句写入器。</param> /// <param name="fragment">当前语句。</param> private void WriteFragmentForAggregate(SqlWriter writer, ISqlFragment fragment) { var content = (AggregateFragment)fragment; if (!_WriteAggregateMethods.TryGetValue(content.Function, out WriteFragmentDelegate action)) { throw new NotSupportedException(string.Format(Res.NotSupportedWriteFragmentForAggregate, content.Function)); } action(writer, content); }
/// <inheritdoc/> protected override void WriteFragmentForRenameObject(SqlWriter writer, ISqlFragment fragment) { var content = (RenameObjectFragment)fragment; writer.Write("EXEC sp_rename '"); content.Name.WriteSql(writer); writer.Write("', '"); writer.Write(content.NewName); writer.Write('\''); }
private void WriteFragmentForCreateColumn(SqlWriter writer, ISqlFragment fragment) { var create = (CreateColumnFragment)fragment; WriteDbName(writer, create.Name); writer.Write(' '); var column = create.Metadata; WriteDbDataType(writer, column); if (create.Table.IsTemporary) { writer.Write(" NULL"); } else { var computed = column.GetProperty <ComputedAttribute>(); if (computed != null) { if (computed.IsPersisted) { writer.Write(" PERSISTED"); } } else { var identity = column.GetProperty <IdentityAttribute>(); var def = column.GetProperty <DefaultAttribute>(); var nullable = column.GetProperty <NullableAttribute>(); if (nullable != null) { if (!nullable.Value) { writer.Write(" NOT"); } } else { var type = column.Member.PropertyType; if (type.IsValueType && !type.IsNullable()) { writer.Write(" NOT"); } } writer.Write(" NULL"); if (identity != null) { writer.Write(" IDENTITY (1, 1)"); } else if (def != null) { writer.Write(" DEFAULT (" + def.Content + ")"); } } } }
/// <inheritdoc/> protected override void WriteFragmentForColumnMember(SqlWriter writer, ISqlFragment fragment) { var content = (ColumnFragment)fragment; if (!writer.GetProperty <bool>(nameof(HaveNotMemberAliasName))) { writer.Write(content.Owner.AliasName); writer.Write('.'); } WriteDbName(writer, content.ColumnName); }
private void WriteFragmentForCreateTemporaryTable(SqlWriter writer, ISqlFragment fragment) { var create = (CreateTempTableFragment)fragment; writer.Write($"CREATE TEMPORARY TABLE "); create.Table.WriteSql(writer); writer.WriteLine("("); create.Members.ForEach(() => writer.WriteLine(", "), m => m.WriteSql(writer)); writer.Write(')'); }
public static string GetString(this ISqlFragment fragment, SqlGenerator sqlGenerator) { using (var writer = new SqlWriter()) { if (fragment != null) { fragment.WriteSql(writer, sqlGenerator); } return(writer.ToString()); } }
/// <inheritdoc/> protected override void WriteFragmentForDelete(SqlWriter writer, ISqlFragment fragment) { var current = (DeleteFragment)fragment; writer.Write("DELETE FROM "); current.Target.WriteSql(writer); HaveNotMemberAliasName(writer, delegate() { WriteFragmentForWhere(writer, current.Where); }); }
void IWhereFragmentHolder.Register(ISqlFragment fragment) { if (fragment is IReversibleWhereFragment r) { _parent.Register(r.Reverse()); } else { Inner = fragment; _parent.Register(this); } }
/// <inheritdoc/> protected override void WriteFragmentForDelete(SqlWriter writer, ISqlFragment fragment) { var current = (DeleteFragment)fragment; writer.Write("DELETE "); current.Target.WriteSql(writer); writer.WriteLine(); writer.Enter(delegate() { WriteFragmentForWhere(writer, current.Where); }, current); }
/// <inheritdoc/> protected override void WriteFragmentForColumnMember(SqlWriter writer, ISqlFragment fragment) { if (writer.Current is UpdateFragment || writer.Current is DeleteFragment) { var content = (ColumnFragment)fragment; WriteDbName(writer, content.ColumnName); } else { base.WriteFragmentForColumnMember(writer, fragment); } }
public ISqlFragment FilterDocuments(QueryModel?model, ISqlFragment query) { var extras = extraFilters(query).ToList(); if (extras.Count > 0) { extras.Add(query); return(CompoundWhereFragment.And(extras)); } return(query); }
private IEnumerable <ISqlFragment> extraFilters(ISqlFragment query) { if (_mapping.DeleteStyle == DeleteStyle.SoftDelete && !query.Contains(SchemaConstants.DeletedColumn)) { yield return(ExcludeSoftDeletedFilter.Instance); } if (TenancyStyle == TenancyStyle.Conjoined && !query.SpecifiesTenant()) { yield return(CurrentTenantFilter.Instance); } }
public ISqlFragment FilterDocuments(QueryModel model, ISqlFragment query) { var extras = extraFilters(query).ToList(); if (extras.Count > 0) { extras.Add(query); return(new CompoundWhereFragment("and", extras.ToArray())); } return(query); }
/// <summary> /// Creates a TopClause with the given topCount and withTies. /// </summary> /// <param name="topCount"> </param> /// <param name="withTies"> </param> internal TopClause(ISqlFragment topCount, bool withTies) { this.topCount = topCount; this.withTies = withTies; }
/// <summary> /// Creates a SkipClause with the given skipCount. /// </summary> /// <param name="topCount"></param> internal SkipClause(int skipCount) { SqlBuilder sqlBuilder = new SqlBuilder(); sqlBuilder.Append(skipCount.ToString(CultureInfo.InvariantCulture)); this.skipCount = sqlBuilder; }
/// <summary> /// Creates a SkipClause with the given skipCount. /// </summary> /// <param name="topCount"></param> internal SkipClause(ISqlFragment skipCount) { this.skipCount = skipCount; }
/// <summary> /// Creates a TopClause with the given topCount and withTies. /// </summary> /// <param name="topCount"></param> internal FirstClause(int firstCount) { SqlBuilder sqlBuilder = new SqlBuilder(); sqlBuilder.Append(firstCount.ToString(CultureInfo.InvariantCulture)); this.firstCount = sqlBuilder; }
/// <summary> /// Creates a FirstClause with the given topCount and withTies. /// </summary> /// <param name="topCount"></param> internal FirstClause(ISqlFragment firstCount) { this.firstCount = firstCount; }