internal static void BuildNode(this Chainer node, QueryPart queryPart, BuildContext buildContext, BuildArgs buildArgs, StringBuilder sql) { if (node == null) { return; } var root = node.GetRoot(); // snippet check if (root.CompilableType == Compilable.ObjectType.Snippet && node is ISnippetDisallowed) { node.Throw(QueryTalkExceptionType.InvalidSnippet, null, node.Method); } string append = null; if (node.Build != null && !node.SkipBuild) { // important: assign current object buildContext.Current = node; // important: store query part into the current object buildContext.Current.QueryPart = queryPart; // build append = node.Build(buildContext, buildArgs); TryThrow(node.Exception); TryThrow(buildContext.Exception); } if (append != null) { if (append == Text.Terminator) { sql.TrimEnd(); } sql.Append(append); // assure that there is always a spacing between the sql parts/clauses sql.S(); } // check view if (root.CompilableType == Compilable.ObjectType.View && (root.Statements.Count > 1 || // view can have only a single statement !(node is IViewAllowed))) // only clauses related to select statement can be contained in the view { root.CheckNodeReuseAndThrow(); node.Throw(QueryTalkExceptionType.InvalidView, null, node.Method); } }
internal ScalarArgument(Chainer arg) : base(arg) { TryTakeAll(arg); if (arg is View) { Build = (buildContext, buildArgs) => { return(Filter.Enclose(arg.Build(buildContext, buildArgs))); }; } }