Beispiel #1
0
        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));
            }
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
 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));
     }
 }
Beispiel #4
0
        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));
        }
Beispiel #5
0
        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()));
        }
Beispiel #6
0
        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));
        }
Beispiel #7
0
        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));
            }
        }