/// <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;
 }
Beispiel #3
0
        /// <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;
        }
Beispiel #4
0
 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();
        }
Beispiel #8
0
        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();
        }
Beispiel #12
0
        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(')');
        }
Beispiel #14
0
        private void WriteFragmentForCreateColumn(SqlWriter writer, ISqlFragment fragment)
        {
            var create = (CreateColumnFragment)fragment;

            WriteDbName(writer, create.Name);
            writer.Write(' ');
            var column = create.Metadata;

            WriteDbDataType(writer, column);
        }
Beispiel #15
0
        /// <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);
        }
Beispiel #16
0
        /// <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);
        }
Beispiel #17
0
 /// <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);
     }
 }
Beispiel #18
0
 /// <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();
        }
Beispiel #20
0
        /// <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);
        }
Beispiel #21
0
        /// <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('\'');
        }
Beispiel #22
0
        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(')');
        }
Beispiel #25
0
 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);
            });
        }
Beispiel #27
0
 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);
     }
 }
Beispiel #30
0
        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);
        }
Beispiel #31
0
        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);
            }
        }
Beispiel #32
0
        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;
 }