コード例 #1
0
        private void SelectOnly(NestedSelectStatement statement)
        {
            BufferTable bufferTable;
            var         selectArgAssignments = new List <CodeAssignStatement>();
            bool        outerLoopNeeded;

            using (Scope.PushSelect())
            {
                bufferTable = FetchBufferTable(statement, null, selectArgAssignments, out outerLoopNeeded);
                GenerateNestedSelectOnly(bufferTable.Variable, selectArgAssignments, statement);
            }

            var scope = CreateBufferTable(bufferTable);

            _codeStack.Peek().Scope = new ScopeData <TableDescriptor>()
            {
                CodeDomReference = scope.CodeDomReference
            };
        }
コード例 #2
0
        private BufferTable FetchBufferTable(NestedSelectStatement statement, IScopeData scope, IList <CodeAssignStatement> codeAssignments, out Boolean outerLoopNeeded)
        {
            outerLoopNeeded = false;
            string aliasId     = ((AliasBase)statement.Parent).Alias.Id;
            var    bufferTable = new BufferTable()
            {
                Variable = aliasId
            };

            for (int x = 0; x < statement.Args.Length; x++) //select args
            {
                var domSelectArg = VisitChild(statement.Args[x], new CodeDomArg()
                {
                    Scope = scope
                });
                if (((SelectArgsInfo)domSelectArg.Tag).IsPickStatement)
                {
                    outerLoopNeeded = true;
                }

                if (((SelectArgsInfo)domSelectArg.Tag).ColumnName == null) //have to have a column name in a nested select
                {
                    Errors.Add(new NoColumnName(x + 1, new Semantic.LineInfo(statement.Args[x].Line.Line, statement.Args[x].Line.CharacterPosition)));
                }

                var primitive = TablePrimitive.FromType(domSelectArg.Scope.CodeType);
                bufferTable.Children.Add(new TableColumnArg()
                {
                    Variable = ((SelectArgsInfo)domSelectArg.Tag).DisplayColumnName, Type = primitive.TypeString
                });

                var assignment = new CodeAssignStatement();
                assignment.Left  = new CodePropertyReferenceExpression(new CodeTypeReferenceExpression("resultRow"), ((SelectArgsInfo)domSelectArg.Tag).DisplayColumnName);
                assignment.Right = domSelectArg.CodeExpression;
                codeAssignments.Add(assignment);
            }

            return(bufferTable);
        }
コード例 #3
0
ファイル: BridgeVisitor.cs プロジェクト: jeason0813/pickaxe
 public void Visit(NestedSelectStatement statement, CommonTree tree)
 {
     Parent(tree).Children.Add(statement);
     SetLine(statement, tree);
     VisitChildren(tree);
 }
コード例 #4
0
        public void Visit(NestedSelectStatement statement)
        {
            BufferTable      bufferTable;
            CodeMemberMethod method   = new CodeMemberMethod();
            var  methodStatements     = new CodeStatementCollection();
            var  selectArgAssignments = new List <CodeAssignStatement>();
            bool outerLoopNeeded;

            if (statement.From == null)
            {
                SelectOnly(statement);
                return;
            }

            using (Scope.PushSelect())
            {
                var fromDomArg = VisitChild(statement.From);
                var rowType    = fromDomArg.Scope.CodeDomReference.TypeArguments[0];

                method.Name       = "Nested_Select_" + fromDomArg.MethodIdentifier;
                method.Attributes = MemberAttributes.Private;
                GenerateCallStatement(method.Statements, statement.Line.Line);

                _mainType.Type.Members.Add(method);

                //create type
                bufferTable = FetchBufferTable(statement, fromDomArg.Scope, selectArgAssignments, out outerLoopNeeded);

                methodStatements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference("CodeTable", new CodeTypeReference(bufferTable.Variable)),
                                                                          "result",
                                                                          new CodeObjectCreateExpression(new CodeTypeReference("BufferTable", new CodeTypeReference(bufferTable.Variable)))));

                methodStatements.Add(new CodeVariableDeclarationStatement(fromDomArg.Scope.CodeDomReference,
                                                                          "fromTable",
                                                                          fromDomArg.CodeExpression));

                if (statement.Where != null)
                {
                    var domWhereArgs = VisitChild(statement.Where, new CodeDomArg()
                    {
                        Scope = fromDomArg.Scope
                    });
                    methodStatements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("fromTable"), domWhereArgs.CodeExpression));
                }

                //outside iterator
                methodStatements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference("IEnumerator", rowType),
                                                                          "x",
                                                                          new CodeMethodInvokeExpression(
                                                                              new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("fromTable"), "GetEnumerator",
                                                                                                                null))));


                //foreach loops

                var outerLoop = new CodeIterationStatement();
                outerLoop.InitStatement      = new CodeSnippetStatement();
                outerLoop.IncrementStatement = new CodeSnippetStatement();
                outerLoop.TestExpression     = new CodeMethodInvokeExpression(
                    new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("x"), "MoveNext",
                                                      null));

                outerLoop.Statements.Add(new CodeVariableDeclarationStatement(rowType,
                                                                              "row",
                                                                              new CodePropertyReferenceExpression(new CodeTypeReferenceExpression("x"), "Current")));

                var codeLoop = outerLoop;
                if (outerLoopNeeded)
                {
                    var        aliases = Scope.Current.AliasType <DownloadPage>();
                    CodeDomArg args    = null;
                    if (aliases.Length == 0)
                    {
                        //register error we could't find a download table and we are trying to access pick statements.
                        //create fake codedomargs
                        args = new CodeDomArg()
                        {
                            CodeExpression = new CodePrimitiveExpression("DownloadTable")
                        };
                    }
                    else
                    {
                        var reference = new TableMemberReference()
                        {
                            Member = "nodes", RowReference = new TableVariableRowReference()
                            {
                                Id = aliases[0]
                            }
                        };
                        args = VisitChild(reference);
                    }

                    //Needed only for DownloadRow
                    outerLoop.Statements.Add(
                        new CodeVariableDeclarationStatement(
                            new CodeTypeReference("IEnumerator", new CodeTypeReference("HtmlElement")),
                            "y",
                            new CodeMethodInvokeExpression(
                                new CodeMethodReferenceExpression(
                                    args.CodeExpression, "GetEnumerator", null))));


                    //Needed only for DownloadRow
                    codeLoop = new CodeIterationStatement();
                    codeLoop.InitStatement      = new CodeSnippetStatement();
                    codeLoop.IncrementStatement = new CodeSnippetStatement();
                    codeLoop.TestExpression     = new CodeMethodInvokeExpression(
                        new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("y"), "MoveNext",
                                                          null));

                    //Needed only for DownloadRow
                    codeLoop.Statements.Add(new CodeVariableDeclarationStatement(
                                                new CodeTypeReference("HtmlElement"),
                                                "node",
                                                new CodePropertyReferenceExpression(new CodeTypeReferenceExpression("y"), "Current")));

                    outerLoop.Statements.Add(codeLoop);
                }

                //Needed for both.
                codeLoop.Statements.Add(new CodeVariableDeclarationStatement(
                                            new CodeTypeReference(bufferTable.Variable),
                                            "resultRow",
                                            new CodeObjectCreateExpression(new CodeTypeReference(bufferTable.Variable))));

                codeLoop.Statements.AddRange(selectArgAssignments.ToArray());

                var addResults = new CodeMethodInvokeExpression(
                    new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("result"), "Add"),
                    new CodeArgumentReferenceExpression("resultRow"));
                codeLoop.Statements.Add(addResults);


                methodStatements.Add(outerLoop);

                if (outerLoopNeeded)
                {
                    var aliases = Scope.Current.AliasType <DownloadPage>();
                    outerLoop.Statements.Add(new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("row"), aliases[0]), "Clear"));
                }
            }

            var scope = CreateBufferTable(bufferTable);

            method.ReturnType = scope.CodeDomReference;
            var methodcall = new CodeMethodInvokeExpression(
                new CodeMethodReferenceExpression(null, method.Name));

            methodStatements.Add(new CodeMethodReturnStatement(new CodeTypeReferenceExpression("result")));
            method.Statements.AddRange(methodStatements);

            _codeStack.Peek().CodeExpression = methodcall;
            _codeStack.Peek().Scope          = new ScopeData <TableDescriptor>()
            {
                CodeDomReference = method.ReturnType
            };
        }