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; } }
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)); } }