示例#1
0
        public void ReplaceSubqueryWithValue_Handle_New_Lines()
        {
            //arrange
            SelectParser selectParser = new SelectParser();

            string query = @"select truck, origin, space
                            from someTable where origin > 8
                            AND truck = (  
                                            select truck from someTruckTable   
                                        ) 
                            OR space = 98";

            InnerStatement subquery = selectParser.GetFirstMostInnerParantheses(query);

            var expected = @"select truck, origin, space
                            from someTable where origin > 8
                            AND truck = 'F-150' 
                            OR space = 98";

            //act
            var newQuery = new SelectParser().ReplaceSubqueryWithValue(query, subquery, "F-150", TypeEnum.String);


            //assert
            Assert.AreEqual(expected, newQuery);
        }
示例#2
0
        public List <SelectColumnDto> ParseAggregates(List <string> columns)
        {
            List <SelectColumnDto> selectDtos = new List <SelectColumnDto>();

            columns = columns.Select(x => x.ToLower().Replace(" ", "").Replace("\r\n", "")).ToList();

            foreach (var col in columns)
            {
                InnerStatement innerStatement = GetFirstMostInnerParantheses(col);

                string columnName = innerStatement == null ? col : innerStatement.Statement;

                if (columnName == null)
                {
                    selectDtos.Add(new SelectColumnDto {
                        ColumnName = col
                    });
                    continue;
                }

                string aggregrateFunction = col.Replace(columnName, "");

                if (aggregrateFunction == "max()")
                {
                    selectDtos.Add(new SelectColumnDto
                    {
                        ColumnName        = columnName,
                        AggregateFunction = CompareDelegates.Max
                    });
                }
                else if (aggregrateFunction == "min()")
                {
                    selectDtos.Add(new SelectColumnDto
                    {
                        ColumnName        = columnName,
                        AggregateFunction = CompareDelegates.Min
                    });
                }
                else if (aggregrateFunction == "count()")
                {
                    selectDtos.Add(new SelectColumnDto
                    {
                        ColumnName        = columnName,
                        AggregateFunction = CompareDelegates.Count
                    });
                }
                else
                {
                    selectDtos.Add(new SelectColumnDto
                    {
                        ColumnName        = columnName,
                        AggregateFunction = null
                    });
                }
            }

            return(selectDtos);
        }
示例#3
0
        public IComparable[] GetRow(string dml)
        {
            string tableName = ParseTableName(dml);

            TableDefinition tableDefinition = _schemaFetcher.GetTableDefinition(tableName);

            InnerStatement innerStatementValues = GetFirstMostInnerParantheses(dml);

            IComparable[] comparables = GetRow(innerStatementValues.Statement, tableDefinition);

            return(comparables);
        }
示例#4
0
        internal string ReplaceSubqueryWithValue(string query, InnerStatement subquery, string value, TypeEnum type)
        {
            string subQueryWithParantheses = query.Substring(subquery.StartIndexOfOpenParantheses,
                                                             subquery.EndIndexOfCloseParantheses - subquery.StartIndexOfOpenParantheses + 1);

            if (type == TypeEnum.String)
            {
                value = "'" + value + "'";
            }

            return(query.Replace(subQueryWithParantheses, value));
        }
示例#5
0
        public List <ColumnDefinition> GetColumnDefintions(string dml)
        {
            dml = ToLowerAndTrim(dml);

            string[] parts = dml.Split(' ').Where(x => !string.IsNullOrWhiteSpace(x)).ToArray();

            string tableName = parts[2];

            InnerStatement columnDefinitionStatement = GetOuterMostParantheses(dml);

            string[] columnParts = columnDefinitionStatement.Statement.Split(',').Where(x => !string.IsNullOrWhiteSpace(x)).ToArray();

            if (columnParts.Length > Constants.Max_Columns)
            {
                throw new Exception("Column definitions exceed max count of 100. Only 100 columns allowed per table");
            }

            List <ColumnDefinition> colDefinitions = new List <ColumnDefinition>();

            for (int i = 0; i < columnParts.Length; i++)
            {
                string[] columnNameAndType = columnParts[i].Split(' ').Where(x => !string.IsNullOrWhiteSpace(x)).ToArray();

                if (columnNameAndType.Length < 2)
                {
                    throw new Exception($"Column name or data type missing from table definition: '{columnNameAndType[0]}'");
                }

                bool isIdentityColumn = IsIdentityColumn(columnNameAndType);

                if (isIdentityColumn && i > 0)
                {
                    throw new Exception("Identity column must be first column in table definition");
                }

                ColumnDefinition columnDefinition = new ColumnDefinition
                {
                    ColumnName = columnNameAndType[0].RemoveNewLines(),
                    Index      = (byte)i
                };
                columnDefinition.Type       = ParseTypeAndByteSize(columnNameAndType[1].RemoveNewLines(), columnDefinition);
                columnDefinition.IsIdentity = isIdentityColumn ? (byte)1 : (byte)0;

                colDefinitions.Add(columnDefinition);
            }

            return(colDefinitions);
        }
示例#6
0
        public void GetFirstMostInnerSelectStatement_Parses_With_Spaces()
        {
            //arrange
            SelectParser selectParser = new SelectParser();

            string query = @"select truck, origin, space
                            from someTable where origin > 8
                            AND truck = (   select truck from someTruckTable   ) 
                            OR space = 98";


            //act
            InnerStatement subquery = selectParser.GetFirstMostInnerParantheses(query);

            //assert
            Assert.AreEqual("   select truck from someTruckTable   ", subquery.Statement);
            Assert.AreEqual(130, subquery.StartIndexOfOpenParantheses);
            Assert.AreEqual(169, subquery.EndIndexOfCloseParantheses);
        }