public Task <IPhysicalOperator <RowHolder> > BuildStatement(Sql.sqlStatement statement, ITransaction tran, IPhysicalOperator <RowHolder> source, InputStringNormalizer inputStringNormalizer) { Sql.columnSelect[] columns = new Sql.columnSelect[0]; Tuple <Sql.aggType, string>[] aggregates = new Tuple <Sql.aggType, string> [0]; if (!statement.Columns.IsStar) { columns = (((Sql.selectType.ColumnList)statement.Columns).Item).ToArray(); aggregates = columns .Where(c => c.IsAggregate == true) .Select(c => ((Sql.columnSelect.Aggregate)c).Item).ToArray(); } if (statement.GroupBy.Any() || aggregates.Any()) { string[] groupByColumns = statement.GroupBy.ToArray(); GroupByFunctors groupByFunctors = GroupByStatementBuilder.EvalGroupBy(groupByColumns, columns, source.GetOutputColumns()); IPhysicalOperator <RowHolder> phyOpGroupBy = new PhyOpGroupBy(source, groupByFunctors); return(Task.FromResult(phyOpGroupBy)); } else { return(Task.FromResult(source)); } }
public async Task <IPhysicalOperator <RowHolder> > BuildStatement(Sql.sqlStatement statement, ITransaction tran, IPhysicalOperator <RowHolder> source, InputStringNormalizer stringNormalizer) { if (statement.Joins.Any()) { IPhysicalOperator <RowHolder> currJoinSource = source; for (int i = 0; i < statement.Joins.Length; i++) { if (!statement.Joins[i].Item2.IsInner) { throw new NotSupportedException("Only inner join is supported at this point."); } MetadataTable joinRightTable = await this.metadataManager.GetTableManager().GetByName(statement.Joins[i].Item1, tran).ConfigureAwait(false); PhyOpScan scanOpRight = new PhyOpScan(joinRightTable.Collection, tran, joinRightTable.Columns, joinRightTable.TableName); Func <RowHolder, bool> filter = (_) => true; if (FSharpOption <Sql.where> .get_IsSome(statement.Joins[i].Item3)) { filter = FilterStatementBuilder.EvalWhere( statement.Joins[i].Item3.Value, QueryProcessingAccessors.MergeColumns(currJoinSource.GetOutputColumns(), scanOpRight.GetOutputColumns()), stringNormalizer); } currJoinSource = new PhyOpLoopInnerJoin(currJoinSource, scanOpRight, filter); } return(currJoinSource); } else { return(source); } }
public Task <IPhysicalOperator <RowHolder> > BuildStatement(Sql.sqlStatement statement, ITransaction tran, IPhysicalOperator <RowHolder> source, InputStringNormalizer inputStringNormalizer) { if (FSharpOption <Sql.where> .get_IsSome(statement.Where)) { Sql.where whereStatement = statement.Where.Value; IPhysicalOperator <RowHolder> filterOp = new PhyOpFilter(source, FilterStatementBuilder.EvalWhere(whereStatement, source.GetOutputColumns(), inputStringNormalizer)); return(Task.FromResult(filterOp)); } else { return(Task.FromResult(source)); } }
public Task <IPhysicalOperator <RowHolder> > BuildStatement(Sql.sqlStatement statement, ITransaction tran, IPhysicalOperator <RowHolder> source, InputStringNormalizer inputStringNormalizer) { if (statement.OrderBy.IsEmpty) { return(Task.FromResult(source)); } OrderByColumn[] orderByColumns = GetOrderByColumns(source.GetOutputColumns(), statement.OrderBy); IPhysicalOperator <RowHolder> phyOpOrderBy = new PhyOpOrderBy(source, new RowHolderOrderByComparer(orderByColumns)); return(Task.FromResult(phyOpOrderBy)); }
public async Task <RowProvider> ParseSqlStatement(Sql.sqlStatement sqlStatement, ITransaction tran, InputStringNormalizer stringNormalizer) { // TODO: query builder is currently manual. i.e. SCAN -> optional(JOINS) -> optional(FILTER) -> GROUP BY -> ORDER BY/PROJECT. // In future we need to build proper algebrizer, relational algebra rules and work on QO. IPhysicalOperator <RowHolder> source = null; foreach (IStatementTreeBuilder builder in this.statementBuildersList) { source = await builder.BuildStatement(sqlStatement, tran, source, stringNormalizer); } return(new RowProvider(source.Iterate(tran), source.GetOutputColumns())); }
public async Task <IPhysicalOperator <RowHolder> > BuildStatement(Sql.sqlStatement statement, ITransaction tran, IPhysicalOperator <RowHolder> source, InputStringNormalizer stringNormalizer) { if (source != null) { // For now source for scan must be null. // with subquery expression this will change. throw new ArgumentException(); } string tableName = statement.Table; MetadataTablesManager tableManager = metadataManager.GetTableManager(); MetadataTable table = await tableManager.GetByName(tableName, tran).ConfigureAwait(false); // Since we currently don't support indexes we can only build scan operation. return(new PhyOpScan(table.Collection, tran, table.Columns, table.TableName)); }
public Task <IPhysicalOperator <RowHolder> > BuildStatement(Sql.sqlStatement statement, ITransaction tran, IPhysicalOperator <RowHolder> source, InputStringNormalizer inputStringNormalizer) { Sql.columnSelect[] columns = new Sql.columnSelect[0]; bool isStar = false; string[] projections = new string[0]; if (statement.GroupBy.Any()) { // no job for me, this is group by. return(Task.FromResult(source)); } if (!statement.Columns.IsStar) { columns = (((Sql.selectType.ColumnList)statement.Columns).Item).ToArray(); if (columns.Any(c => c.IsAggregate == true)) { // No job for me, this is aggregation. return(Task.FromResult(source)); } projections = columns .Where(c => c.IsProjection == true) .Select(c => ((Sql.columnSelect.Projection)c).Item).ToArray(); } else { isStar = true; } int?topRows = null; if (FSharpOption <int> .get_IsSome(statement.Top)) { topRows = statement.Top.Value; if (topRows < 1) { throw new InvalidTopCountException(); } } if (isStar) { // no need for project, just return everything. IPhysicalOperator <RowHolder> projectOp = new PhyOpProject(source, topRows); return(Task.FromResult(projectOp)); } else { // Project Op. List <MetadataColumn> columnMapping = new List <MetadataColumn>(); foreach (string columnName in projections) { MetadataColumn mc = QueryProcessingAccessors.GetMetadataColumn(columnName, source.GetOutputColumns()); columnMapping.Add(mc); } IPhysicalOperator <RowHolder> projectOp = new PhyOpProject(source, columnMapping.Select(mc => mc.ColumnId).ToArray(), topRows); return(Task.FromResult(projectOp)); } }