/// <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); }
/// <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); }
/// <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()); }
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(")"); } }
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()); } }
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); } } }
/// <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()); } }
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); } } }