예제 #1
0
        public object Select(RawTableJoinRow rows)
        {
            if (rows == null)
            {
                return(null);
            }

            var tableRow = rows.SingleOrDefault(r => r.Name == TableColumn.TableName);

            if (tableRow == null)
            {
                return(null);
            }
            object value;

            if (TableColumn.Column.ComputedExpression != null)
            {
                var select = new SelectDataBuilder(  ).Build(TableColumn.Column.ComputedExpression, _RawData);
                value = select.Select(rows);
                if (value.GetType(  ) != TableColumn.Column.NetDataType)
                {
                    value = Convert.ChangeType(value, TableColumn.Column.NetDataType);
                }
            }
            else
            {
                value = tableRow.Row[TableColumn.Column.Order];
            }
            // pad string if we have a string of a fixed length
            if (TableColumn.Column.NetDataType == typeof(string) && TableColumn.Column.IsFixedSize)
            {
                value = value.ToString( ).PadRight(TableColumn.Column.Size);
            }
            return(value);
        }
예제 #2
0
        public object Select(RawTableJoinRow rows)
        {
            var selectExpression   = ParseAsSelect(_FunctionCall.Sql);
            var querySpecification = (SqlQuerySpecification)selectExpression.SelectSpecification.QueryExpression;

            var db      = (( MemoryDbConnection )_RawData.Command.Connection).GetMemoryDatabase( );
            var batch   = new MemoryDbDataReader.ResultBatch(  );
            var rawData = new RawData(_RawData.Command, batch);

            rawData.RawRowList.Add(rows);
            var statement = new ExecuteQueryStatement(db, _RawData.Command);

            statement.InitializeFields(batch, querySpecification.SelectClause.Children.ToList(  ), rawData);
            new QueryResultBuilder(rawData, false).AddData(batch);

            var row = batch.ResultRows[0];

            for (int fieldIndex = 0; fieldIndex < batch.Fields.Count; fieldIndex++)
            {
                if (row[fieldIndex] != null && row[fieldIndex] is DBNull == false)
                {
                    _DbType     = (DbType)Enum.Parse(typeof(DbType), batch.Fields[fieldIndex].DbType, true);
                    _ReturnType = batch.Fields[fieldIndex].NetType;
                    return(row[fieldIndex]);
                }
            }
            return(null);
        }
예제 #3
0
        public object Select(RawTableJoinRow rows)
        {
            if (_DbType == DbType.String)
            {
                return(SelectString(rows));
            }
            if (_DbType == DbType.Byte)
            {
                return(SelectByte(rows));
            }
            if (_DbType == DbType.Int16)
            {
                return(SelectInteger16(rows));
            }
            if (_DbType == DbType.Int32)
            {
                return(SelectInteger32(rows));
            }
            if (_DbType == DbType.Int64)
            {
                return(SelectInteger(rows));
            }

            return(SelectDecimal(rows));
        }
        public object Select(RawTableJoinRow rows)
        {
            var value = Helper.GetValue(_FunctionCall.Arguments.First( ), typeof(double), _RawData, rows);

            if (value == null)
            {
                return(null);
            }
            switch (_FunctionCall.FunctionName.ToUpper())
            {
            case "CEILING":
                return(InvokeMathMethod("Ceiling", value));

            case "FLOOR":
                return(InvokeMathMethod("Floor", value));

            case "ABS":
                return(InvokeMathMethod("Abs", value));

            case "SIGN":
                return(InvokeMathMethod("Sign", value));

            case "ROUND":
                return(InvokeRound(value, rows));

            default:
                throw new NotImplementedException();
            }
        }
 public object Select(RawTableJoinRow rows)
 {
     if (_FunctionCall.Arguments != null && _FunctionCall.Arguments.Any())
     {
         var seed = Helper.GetValue(_FunctionCall.Arguments.First( ), typeof(int), _RawData, rows);
         return(new Random((int)seed).NextDouble(  ));
     }
     return(new Random().NextDouble(  ));
 }
예제 #6
0
        private object CreateGroupByKey(RawTableJoinRow row, List <TableColumn> groupByFields)
        {
            var keys = new List <string>( );

            foreach (var field in groupByFields)
            {
                keys.Add(new SelectDataFromColumn(field, _RawData).Select(row)?.ToString(  ) ?? "<NULL>");
            }

            return(string.Join("|", keys));
        }
예제 #7
0
        public object Select(RawTableJoinRow rows)
        {
            switch (_FunctionCall.FunctionName.ToUpper())
            {
            case "NEWID":
                return(Guid.NewGuid());

            default:
                throw new NotImplementedException();
            }
        }
예제 #8
0
        public object Select(RawTableJoinRow rows)
        {
            switch (_GlobalVariableName.ToUpper( ))
            {
            case "@@IDENTITY": return(((MemoryDbConnection )_RawData.Command.Connection).GetMemoryDatabase( ).LastIdentitySet);

            case "@@VERSION": return(((MemoryDbConnection )_RawData.Command.Connection).ServerVersion);

            default:
                throw new NotImplementedException( );
            }
        }
        public object Select(RawTableJoinRow rows)
        {
            var evaluator = new EvaluateBooleanExpression(_RawData, ((MemoryDbConnection )_RawData.Command.Connection).GetMemoryDatabase( ), _RawData.Command);

            foreach (var whenClause in _Expression.WhenClauses)
            {
                if (evaluator.Evaluate(rows, whenClause.WhenExpression))
                {
                    return(Helper.GetValue(whenClause.ThenExpression, ReturnType, _RawData, rows));
                }
            }

            return(Helper.GetValue(_Expression.ElseExpression, ReturnType, _RawData, rows));
        }
        public object Select(RawTableJoinRow rows)
        {
            var arguments = GetArgumentList( );

            switch (_FunctionCall.FunctionName.ToUpper())
            {
            case "ASCII": return(string.IsNullOrWhiteSpace(arguments[0]) ? null : (byte?)arguments[0][0]);

            case "CHAR": return(string.IsNullOrWhiteSpace(arguments[0]) ? null : (char?)int.Parse(arguments[0]));

            case "CHARINDEX": return(FunctionCharIndex(arguments));

            case "CONCAT": return(string.Join("", arguments));

            case "DATALENGTH": return(arguments[0]?.Length);

            case "LEFT": return(arguments[0]?.Substring(0, Math.Min(arguments[0].Length, int.Parse(arguments[1]))));

            case "LEN": return(arguments[0]?.TrimEnd().Length);

            case "LOWER": return(arguments[0]?.ToLower());

            case "LTRIM": return(arguments[0]?.TrimStart(  ));

            case "NCHAR": return(string.IsNullOrWhiteSpace(arguments[0]) ? null : (char?)int.Parse(arguments[0]));

            case "PATINDEX": return(FunctionPatIndex(arguments));

            case "REPLACE": return(new Regex(arguments[1], RegexOptions.IgnoreCase).Replace(arguments[0], arguments[2]));

            case "RIGHT": return(arguments[0]?.Substring(Math.Max(0, arguments[0].Length - int.Parse(arguments[1]))));

            case "RTRIM": return(arguments[0]?.TrimEnd(  ));

            case "SPACE": return("".PadRight(int.Parse(arguments[0])));

            case "STR": return(FunctionStr(arguments));

            case "STUFF": return(FunctionStuff(arguments));

            case "SUBSTRING": return(arguments[0]?.Substring(int.Parse(arguments[1]) - 1, int.Parse(arguments[2])));

            case "UPPER": return(arguments[0]?.ToUpper());

            default:
                throw new NotImplementedException();
            }
        }
        public object Select(RawTableJoinRow rows)
        {
            switch (_FunctionCall.FunctionName.ToUpper( ))
            {
            case "CURRENT_USER":
            case "SESSION_USER":
            case "USER_NAME":
                return("dbo");

            case "SYSTEM_USER":
                return(Environment.UserName ?? "Unknown");

            default:
                throw new NotImplementedException();
            }
        }
        public object Select(RawTableJoinRow rows)
        {
            switch (_FunctionCall.FunctionName.ToUpper( ))
            {
            case "CAST":
            case "TRY_CAST":
                try
                {
                    return(FunctionCast(rows));
                }
                catch (Exception)
                {
                    if (_FunctionCall.FunctionName.ToUpper( ) == "TRY_CAST")
                    {
                        return(null);
                    }
                    throw new SqlInvalidCastException(_DbType.ToString());
                }

            case "CONVERT":
            case "TRY_CONVERT":
                try
                {
                    return(FunctionConvert(rows));
                }
                catch (Exception)
                {
                    if (_FunctionCall.FunctionName.ToUpper( ) == "TRY_CONVERT")
                    {
                        return(null);
                    }
                    throw new SqlInvalidCastException(_DbType.ToString());
                }

            case "ISDATE":
                return(FunctionIsDate(rows));

            case "ISNULL":
                return(FunctionIsNull(rows));

            case "ISNUMERIC":
                return(FunctionIsNumeric(rows));

            default:
                throw new NotImplementedException();
            }
        }
        public object Select(RawTableJoinRow rows)
        {
            switch (_FunctionCall.FunctionName.ToUpper( ))
            {
            case "DATEADD": return(FunctionDateAdd(rows));

            case "DATEDIFF": return(FunctionDateDiff(rows));

            case "DATENAME": return(FunctionDateName(rows));

            case "DATEPART": return(FunctionDatePart(rows));

            case "SYSDATETIMEOFFSET":
            case "SYSDATETIME":
            case "GETDATE":
            case "CURRENT_TIMESTAMP":
                return(DateTime.Now);

            case "SYSUTCDATETIME":
            case "GETUTCDATE":
                return(DateTime.UtcNow);

            case "DAY":
                var dateDay = (DateTime?)Helper.GetValue(_FunctionCall.Arguments[0], typeof(DateTime), _RawData, rows);
                return(dateDay?.Day);

            case "MONTH":
                var dateMonth = (DateTime?)Helper.GetValue(_FunctionCall.Arguments[0], typeof(DateTime), _RawData, rows);
                return(dateMonth?.Month);

            case "YEAR":
                var dateYear = (DateTime?)Helper.GetValue(_FunctionCall.Arguments[0], typeof(DateTime), _RawData, rows);
                return(dateYear?.Year);

            default:
                throw new NotImplementedException();
            }
        }
예제 #14
0
        public object Select(RawTableJoinRow rows)
        {
            var leap = ( int )Helper.GetValue(_FunctionCall.Arguments[1], typeof(int), _RawData, rows);

            if (_FunctionCall.FunctionName.ToUpper() == "LAG")
            {
                leap = 0 - leap;
            }

            var batch = ExecuteSelect(_SelectExpression, rows);
            var index = batch.RawRows.IndexOf(rows);

            if (index + leap >= 0 && index + leap < batch.RawRows.Count)
            {
                return(batch.ResultRows[index + leap][0]);
            }

            if (_FunctionCall.Arguments.Count > 2)
            {
                return(Helper.GetValue(_FunctionCall.Arguments[2], _ReturnType, _RawData, rows));
            }
            return(null);
        }
        public object Select(RawTableJoinRow rows)
        {
            if (_FunctionCall.FunctionName.ToUpper() == "SCOPE_IDENTITY")
            {
                return(((MemoryDbConnection )_RawData.Command.Connection).GetMemoryDatabase( ).LastIdentitySet);
            }
            if (_FunctionCall.FunctionName.ToUpper() == "IDENT_CURRENT")
            {
                var database  = ((MemoryDbConnection )_RawData.Command.Connection).GetMemoryDatabase( );
                var tableName = ((SqlLiteralExpression)_FunctionCall.Arguments.First( )).Value;
                if (database.Tables.ContainsKey(tableName))
                {
                    return(database.Tables[tableName].LastIdentitySet);
                }

                var tables = database.Tables.Where(t => t.Value.Name == tableName).ToList( );
                if (tables.Count == 1)
                {
                    return(tables.First( ).Value.LastIdentitySet);
                }
                throw new SqlInvalidTableNameException(tableName);
            }
            throw new NotImplementedException( );
        }
예제 #16
0
 public object Select(RawTableJoinRow rows)
 {
     return(_Value);
 }
 public object Select(RawTableJoinRow rows)
 {
     throw new NotImplementedException( );
 }
 public object Select(RawTableJoinRow rows)
 {
     return(_Parameter.Value);
 }