public void Visit(SelectArgExpression statement)
        {
            var arg = _visitStack.Peek();

            arg.BoolQueryArg = new Http.QueryArgs();
            VisitChild(statement.Statement, arg);

            if (statement.As != null)
            {
                arg.BoolQueryArg.Variable = statement.As.Alias;
            }
        }
示例#2
0
        public override Element VisitSelectArgsExp(SqlParser.SelectArgsExpContext context)
        {
            var selectArg = new SelectArgExpression(CreateParseInfo(context));

            if (context.a != null)
            {
                selectArg.Children.Add(new AsExpression(CreateParseInfo(context))
                {
                    Alias = context.a.Text
                });
            }

            selectArg.Children.Add(Visit(context.GetChild(0)));

            return(selectArg);
        }
        public void Visit(SelectStatement statement)
        {
            var executedTables = _scope.FetchAllExecutedTablesSameLevel();

            if (executedTables.Length == 0) //no executed tables. nothing to do
            {
                return;
            }

            var dynamicColumns = new List <DynamicColumn>();
            var descriptors    = new List <IResult>();

            if (statement.All) //get all columns
            {
                var selectedIndex = 0;
                foreach (var executeTable in executedTables)
                {
                    foreach (var p in executeTable.Descriptor.Properties)
                    {
                        int propIndex = executeTable.Descriptor.GetDataRowIndex(p.Name);
                        descriptors.Add(new SelectColumn()
                        {
                            Table = executeTable, PropDescriptor = p, PropIndex = propIndex
                        });

                        if (selectedIndex >= statement.Args.Length)
                        {
                            var selectArg = new SelectArgExpression(statement.Bounds);
                            selectArg.Children.Add(new SingleVariableExpression(statement.Bounds)
                            {
                                Id = p.Name
                            });
                            statement.Children.Add(selectArg);
                        }
                        selectedIndex++;
                    }
                }
            }
            else
            {
                for (int selectIndex = 0; selectIndex < statement.Args.Length; selectIndex++)
                {
                    Array.ForEach(executedTables, (x) => x.SelectIndex = selectIndex);
                    var arg = new QueryPhaseArgs();
                    VisitChild(statement.Args[selectIndex], arg);

                    if (arg.BoolQueryArg.Table == null) //can't find selected PropertyDescriptor. Must be a statement
                    {
                        var prop = new PropertyDescriptor()
                        {
                            Name = arg.BoolQueryArg.Variable ?? "(No column name)"
                        };
                        var dynamicColumn = new DynamicColumn {
                            SelectArgExpression = statement.Args[selectIndex], PropDescriptor = prop
                        };
                        descriptors.Add(dynamicColumn);
                        dynamicColumns.Add(dynamicColumn);
                    }
                    else
                    {
                        int propIndex = arg.BoolQueryArg.Table.Descriptor.GetDataRowIndex(arg.BoolQueryArg.Property.Name);
                        arg.BoolQueryArg.Property.Name = arg.BoolQueryArg.Variable;
                        descriptors.Add(new SelectColumn()
                        {
                            Table = arg.BoolQueryArg.Table, PropDescriptor = arg.BoolQueryArg.Property, PropIndex = propIndex
                        });
                    }
                }
            }

            //need to go through every row here of select dynamic statement then add it Properties
            if (executedTables.Length > 0)
            {
                var rowCount = executedTables.First().Rows.Length;
                for (int row = 0; row < rowCount; row++)
                {
                    Array.ForEach(executedTables, (x) => x.RowIndex = row);
                    foreach (var d in dynamicColumns) //run each column. Value goes in data at selected index
                    {
                        var arg = new QueryPhaseArgs();
                        VisitChild(d.SelectArgExpression, arg);
                        d.Values.Add(arg.BoolQueryArg.PropertyValue);
                    }
                }
            }

            var rows = new List <Row>();

            if (executedTables.Length > 0)
            {
                var rowCount = executedTables.First().Rows.Length;
                for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) //select data for only those columns selected
                {
                    var values = new List <PropertyValue>();
                    for (int selectIndex = 0; selectIndex < statement.Args.Length; selectIndex++)
                    {
                        var selectedColumn = descriptors[selectIndex];
                        values.Add(selectedColumn.Fetch(rowIndex));
                    }

                    rows.Add(new Row()
                    {
                        Values = values.ToArray()
                    });
                }
            }

            var             finalDescriptors = descriptors.Select(x => x.Descriptor()).ToArray();
            TableDescriptor tableDescriptor;

            //if nested
            if (statement.IsNestedQuery)
            {
                var dups = finalDescriptors.GroupBy(x => x.Name).Where(g => g.Count() > 1).Select(x => x.Key).ToList();
                if (dups.Count > 1) //error
                {
                }

                tableDescriptor = finalDescriptors;
            }
            else
            {
                FinalSelectTableDescriptor ftableDescriptor = descriptors.Select(x => x.Descriptor()).ToArray();
                tableDescriptor = ftableDescriptor;
            }

            var selectTable = new ExecutedTable(tableDescriptor)
            {
                Rows = rows.ToArray()
            };

            _visitStack.Peek().QueryTable = selectTable;

            if (!statement.IsNestedQuery)
            {
                _selectResult.Add(ToSelectTable(selectTable));
            }
        }