Пример #1
0
        /// <summary>
        /// Generates the text for a FunctionWindow builder.
        /// </summary>
        /// <param name="item">The FunctionWindow builder to generate the text for.</param>
        protected internal override void VisitFunctionWindow(FunctionWindow item)
        {
            writer.Write("OVER (");
            bool needsSpace = false;

            if (item.Partition.Any())
            {
                writer.Write("PARTITION BY ");
                forValueContext(ValueReferenceType.Reference).join(", ", item.Partition);
                needsSpace = true;
            }
            if (item.OrderBy.Any())
            {
                if (needsSpace)
                {
                    writer.Write(" ");
                }
                writer.Write("ORDER BY ");
                forValueContext(ValueReferenceType.Reference).join(", ", item.OrderBy);
                needsSpace = true;
            }
            if (item.Frame != null)
            {
                if (needsSpace)
                {
                    writer.Write(" ");
                }
                IVisitableBuilder frame = item.Frame;
                frame.Accept(forSubCommand());
            }
            writer.Write(")");
        }
        protected override void VisitAlterTableDefinition(AlterTableDefinition item)
        {
            this.AlterTableName = item.Name;
            IVisitableBuilder alteration = item.Alteration;

            alteration.Accept(this);
        }
Пример #3
0
 /// <summary>
 /// Visits the given builder.
 /// </summary>
 /// <param name="item">The item to visit.</param>
 public void Visit(IVisitableBuilder item)
 {
     if (item == null)
     {
         throw new ArgumentNullException("item");
     }
     item.Accept(this);
 }
Пример #4
0
        /// <summary>
        /// Generates the text for a Setter builder.
        /// </summary>
        /// <param name="item">The Setter builder to generate the text for.</param>
        protected internal override void VisitSetter(Setter item)
        {
            IVisitableBuilder column = item.Column;

            column.Accept(forSubCommand());
            writer.Write(" = ");
            item.Value.Accept(forSubCommand());
        }
        protected override void VisitInsert(InsertBuilder item)
        {
            var visitor = new CreateRequestBuilderVisitor(Parameters, CrmMetadataProvider, Settings);
            IVisitableBuilder visitable = item;

            visitable.Accept(visitor);
            SetOperation(visitor.GetCommand());
        }
Пример #6
0
 /// <summary>
 /// Visits the given builder.
 /// </summary>
 /// <param name="item">The item to visit.</param>
 public void Visit(IVisitableBuilder item)
 {
     if (item == null)
     {
         throw new ArgumentNullException("item");
     }
     item.Accept(this);
 }
Пример #7
0
        private void visitSelect(SelectBuilder item)
        {
            bool needsParentheses = level > 0;

            if (needsParentheses)
            {
                writer.Write("(");
            }
            writer.Write("SELECT ");
            if (item.Distinct != DistinctQualifier.Default)
            {
                DistinctQualifierConverter converter = new DistinctQualifierConverter();
                writer.Write(converter.ToString(item.Distinct));
                writer.Write(" ");
            }
            if (item.Top != null)
            {
                IVisitableBuilder top = item.Top;
                top.Accept(forSubCommand().forValueContext(ValueReferenceType.Reference));
                writer.Write(" ");
            }
            forValueContext(ValueReferenceType.Declaration).join(", ", item.Projection);
            if (item.From.Any())
            {
                writer.Write(" FROM ");
                forSourceContext(SourceReferenceType.Declaration).join(", ", item.From);
            }
            if (item.WhereFilterGroup.HasFilters)
            {
                writer.Write(" WHERE ");
                IFilter where = item.WhereFilterGroup;
                where.Accept(forSubCommand().forValueContext(ValueReferenceType.Reference));
            }
            if (item.GroupBy.Any())
            {
                writer.Write(" GROUP BY ");
                forValueContext(ValueReferenceType.Reference).join(", ", item.GroupBy);
            }
            if (item.HavingFilterGroup.HasFilters)
            {
                writer.Write(" HAVING ");
                IFilter having = item.HavingFilterGroup;
                having.Accept(forSubCommand().forValueContext(ValueReferenceType.Reference));
            }
            if (item.OrderBy.Any())
            {
                writer.Write(" ORDER BY ");
                forValueContext(ValueReferenceType.Alias).join(", ", item.OrderBy);
            }
            if (needsParentheses)
            {
                writer.Write(")");
            }
        }
Пример #8
0
        private void join(string separator, IEnumerable <IVisitableBuilder> builders)
        {
            IVisitableBuilder first = builders.First();

            first.Accept(forSubCommand());
            foreach (IVisitableBuilder next in builders.Skip(1))
            {
                writer.Write(separator);
                next.Accept(forSubCommand());
            }
        }
Пример #9
0
        private void visitFilteredJoin(FilteredJoin item, string joinToken)
        {
            Action visitor = () =>
            {
                visitBinaryJoinInner(item, joinToken);
                writer.Write(" ON ");
                IVisitableBuilder filterGroup = item.OnFilterGroup;
                filterGroup.Accept(forSubCommand());
            };

            visitJoin(item, visitor);
        }
 private bool CheckIsMetadataQuery(SelectBuilder item)
 {
     IsMetadataQuery         = false;
     _DetectingMetadataQuery = true;
     foreach (var source in item.From)
     {
         IVisitableBuilder visitable = source;
         visitable.Accept(this);
     }
     _DetectingMetadataQuery = false;
     return(IsMetadataQuery);
 }
 protected override void VisitAddColumns(AddColumns item)
 {
     this.CurrentAddColumns = item;
     if (item.Columns != null && item.Columns.Any())
     {
         if (item.Columns.Count() > 1)
         {
             throw new NotSupportedException("Only a single column can be added at a time.");
         }
         IVisitableBuilder first = item.Columns.First();
         first.Accept(this);
     }
 }
        protected override void VisitSelect(SelectBuilder item)
        {
            this.QueryExpression = CreateDefaultQueryExpression();
            CurrentRequest.Query = this.QueryExpression;

            if (!item.From.Any())
            {
                throw new InvalidOperationException("The query does not have a valid FROM clause");
            }
            Mode = VisitMode.From;
            if (item.From.Count() == 1)
            {
                IsSingleSource = true;
            }
            VisitEach(item.From);

            Mode = VisitMode.Projection;
            NavigateProjections(item.Projection);

            Mode = VisitMode.Filter;
            if (item.WhereFilterGroup != null)
            {
                IFilter where = item.WhereFilterGroup;
                where.Accept(this);
            }
            else
            {
                //TODO: Should only be one where clause?
                foreach (IVisitableBuilder where in item.Where)
                {
                    where.Accept(this);
                }
            }

            if (item.Top != null)
            {
                Mode = VisitMode.Top;
                IVisitableBuilder top = item.Top;
                top.Accept(this);
            }

            if (item.OrderBy != null)
            {
                Mode = VisitMode.OrderBy;
                foreach (IVisitableBuilder order in item.OrderBy)
                {
                    order.Accept(this);
                }
            }
        }
Пример #13
0
 /// <summary>
 /// Generates the text for a Function builder.
 /// </summary>
 /// <param name="item">The Function builder to generate the text for.</param>
 protected internal override void VisitFunction(Function item)
 {
     visitMultipartIdentifier(item.Qualifier, item.Name);
     writer.Write("(");
     if (item.Arguments.Any())
     {
         join(", ", item.Arguments);
     }
     writer.Write(")");
     if (item.FunctionWindow != null)
     {
         writer.Write(" ");
         IVisitableBuilder functionWindow = item.FunctionWindow;
         functionWindow.Accept(forSubCommand());
     }
 }
Пример #14
0
 private void visitUpdate(UpdateBuilder item)
 {
     if (!item.Setters.Any())
     {
         throw new SQLGenerationException(Resources.NoSetters);
     }
     writer.Write("UPDATE ");
     forSourceContext(SourceReferenceType.Declaration).visitAliasedSource(item.Table);
     writer.Write(" SET ");
     forValueContext(ValueReferenceType.Reference).join(", ", item.Setters);
     if (item.WhereFilterGroup.HasFilters)
     {
         writer.Write(" WHERE ");
         IVisitableBuilder where = item.WhereFilterGroup;
         where.Accept(forSubCommand().forValueContext(ValueReferenceType.Reference));
     }
 }
        protected override void VisitSelect(SelectBuilder item)
        {
            // Could use alternate builders like a fetch xml builder.
            // If the SELECT is for entity metadata then perform a metadata query request.
            bool isMetadataQuery = CheckIsMetadataQuery(item);

            if (!isMetadataQuery)
            {
                var visitor = new RetrieveMultipleRequestBuilderVisitor(Parameters, CrmMetadataProvider, Settings);
                IVisitableBuilder visitable = item;
                visitable.Accept(visitor);
                SetOperation(visitor.GetCommand());
            }
            else
            {
                var visitor = new RetrieveMetadataChangesRequestBuilderVisitor(Parameters, CrmMetadataProvider, Settings);
                IVisitableBuilder visitable = item;
                visitable.Accept(visitor);
                SetOperation(visitor.GetCommand());
                // OrgCommand.OperationType = CrmOperation.RetrieveMetadataChanges;
            }
        }
        protected override void VisitSelect(SelectBuilder item)
        {
            this.QueryExpression = new QueryExpression();
            CurrentRequest.Query = this.QueryExpression;
            if (!item.From.Any())
            {
                throw new InvalidOperationException("The query does not have a valid FROM clause");
            }
            Mode = VisitMode.From;
            if (item.From.Count() == 1)
            {
                IsSingleSource = true;
            }
            VisitEach(item.From);

            Mode = VisitMode.Projection;
            NavigateProjections(item.Projection);

            Mode = VisitMode.Filter;
            if (item.WhereFilterGroup != null)
            {
                IFilter where = item.WhereFilterGroup;
                where.Accept(this);
            }
            else
            {
                //TODO: Should only be one where clause?
                foreach (IVisitableBuilder where in item.Where)
                {
                    where.Accept(this);
                }
            }

            if (item.Top != null)
            {
                Mode = VisitMode.Top;
                IVisitableBuilder top = item.Top;
                top.Accept(this);
            }
            else
            {
                // xrm wont let you use paging and top for some reason..
                if (QueryExpression.PageInfo == null)
                {
                    QueryExpression.PageInfo = new PagingInfo();
                }
                QueryExpression.PageInfo.PageNumber = 1;
                //todo take this from the connection string..
                QueryExpression.PageInfo.Count = 500;
                QueryExpression.PageInfo.ReturnTotalRecordCount = true;
            }

            if (item.OrderBy != null)
            {
                Mode = VisitMode.OrderBy;
                foreach (IVisitableBuilder order in item.OrderBy)
                {
                    order.Accept(this);
                }
            }
        }