예제 #1
0
        private static int Compare(object value1, object value2, FunctionContext context, string exp)
        {
            Type        type1        = value1.GetType();
            Type        type2        = value2.GetType();
            StorageType storageType1 = DataStorageHelper.GetStorageType(type1);
            StorageType storageType2 = DataStorageHelper.GetStorageType(type2);
            bool        flag1        = DataStorageHelper.IsSqlType(storageType1);
            bool        flag2        = DataStorageHelper.IsSqlType(storageType2);

            if (flag1 && DataStorageHelper.IsObjectSqlNull(value1) || value1 == DBNull.Value)
            {
                return(-1);
            }
            if (flag2 && DataStorageHelper.IsObjectSqlNull(value2) || value2 == DBNull.Value)
            {
                return(1);
            }
            StorageType resultType = flag1 || flag2?DataStorageHelper.ResultSqlType(storageType1, storageType2, false, false, Operator.LessThen) : DataStorageHelper.ResultType(storageType1, storageType2, false, false, Operator.LessThen);

            if (resultType == StorageType.Empty)
            {
                throw InvalidExpressionException.TypeMismatch(exp);
            }
            return(Operator.BinaryCompare(value1, value2, resultType, Operator.LessOrEqual, new OperatorContext((object)null, context.FormatProvider, (object)null)));
        }
예제 #2
0
        /// <returns>
        /// -1: value1 &lt; value2
        ///  0: value1 = value2
        ///  1: value1 &gt; value2
        /// </returns>
        static int Compare(object value1
                           , object value2
                           , FunctionContext context
                           , string exp)
        {
            Type lType = value1.GetType();
            Type rType = value2.GetType();

            StorageType lStorageType = DataStorageHelper.GetStorageType(lType);
            StorageType rStorageType = DataStorageHelper.GetStorageType(rType);

            bool isSqlTypeL = DataStorageHelper.IsSqlType(lStorageType);
            bool isSqlTypeR = DataStorageHelper.IsSqlType(rStorageType);

            if ((isSqlTypeL && DataStorageHelper.IsObjectSqlNull(value1)) || value1 == DBNull.Value)
            {
                return(-1);
            }

            if ((isSqlTypeR && DataStorageHelper.IsObjectSqlNull(value2)) || value2 == DBNull.Value)
            {
                return(1);
            }

            StorageType resultType = StorageType.Empty;

            if (isSqlTypeL || isSqlTypeR)
            {
                resultType = DataStorageHelper.ResultSqlType(lStorageType
                                                             , rStorageType
                                                             , false
                                                             , false
                                                             , Operator.LessThen); // op doesn't matter here
            }
            else
            {
                resultType = DataStorageHelper.ResultType(lStorageType
                                                          , rStorageType
                                                          , false
                                                          , false
                                                          , Operator.LessThen); // op doesn't matter here
            }

            if (resultType == StorageType.Empty)
            {
                throw InvalidExpressionException.TypeMismatch(exp);
            }

            return(Operator.BinaryCompare(value1
                                          , value2
                                          , resultType
                                          , Operator.LessOrEqual  // op doesn't matter here
                                          , context.FormatProvider));
        }
예제 #3
0
        private static object Mean(
            IEnumerable data,
            ExpressionNode node,
            object context,
            string exp,
            out int count,
            out StorageType type)
        {
            count = 0;
            type  = StorageType.Empty;
            object obj = Aggregates.Sum(data, node, context, exp, out count, out type);

            if (count == 0)
            {
                return((object)0);
            }
            switch (type)
            {
            case StorageType.Char:
                return((object)((int)(char)obj / count));

            case StorageType.SByte:
            case StorageType.Byte:
            case StorageType.Int16:
            case StorageType.UInt16:
            case StorageType.Int32:
            case StorageType.UInt32:
                return((object)(Convert.ToDouble(obj) / (double)count));

            case StorageType.Int64:
            case StorageType.UInt64:
                return((object)(Convert.ToDecimal(obj) / (Decimal)count));

            case StorageType.Single:
                return((object)(float)((double)(float)obj / (double)count));

            case StorageType.Double:
                return((object)((double)obj / (double)count));

            case StorageType.Decimal:
            case StorageType.String:
                return((object)((Decimal)obj / (Decimal)count));

            case StorageType.TimeSpan:
                return((object)new TimeSpan(((TimeSpan)obj).Ticks / (long)count));

            case StorageType.SqlByte:
                return((object)((SqlDouble)((SqlByte)obj) / (SqlDouble)((double)count)));

            case StorageType.SqlDecimal:
                return((object)((SqlDouble)((SqlDecimal)obj) / (SqlDouble)((double)count)));

            case StorageType.SqlDouble:
                return((object)((SqlDouble)obj / (SqlDouble)((double)count)));

            case StorageType.SqlInt16:
                return((object)((SqlDouble)((SqlInt16)obj) / (SqlDouble)((double)(short)count)));

            case StorageType.SqlInt32:
                return((object)((SqlDouble)((SqlInt32)obj) / (SqlDouble)((double)count)));

            case StorageType.SqlInt64:
                return((object)((SqlDouble)((SqlInt64)obj) / (SqlDouble)((double)count)));

            case StorageType.SqlMoney:
                return((object)((SqlMoney)obj / (SqlMoney)((long)count)));

            case StorageType.SqlSingle:
                return((object)((SqlSingle)obj / (SqlSingle)((float)count)));

            default:
                throw InvalidExpressionException.TypeMismatch(exp);
            }
        }
예제 #4
0
        private static object Multiply(object value1, object value2, StorageType type)
        {
            switch (type)
            {
            case StorageType.Char:
                return((object)((int)Convert.ToChar(value1) * (int)Convert.ToChar(value2)));

            case StorageType.SByte:
                return((object)((int)Convert.ToSByte(value1) * (int)Convert.ToSByte(value2)));

            case StorageType.Byte:
                return((object)((int)Convert.ToByte(value1) * (int)Convert.ToByte(value2)));

            case StorageType.Int16:
                return((object)((int)Convert.ToInt16(value1) * (int)Convert.ToInt16(value2)));

            case StorageType.UInt16:
                return((object)((int)Convert.ToUInt16(value1) * (int)Convert.ToUInt16(value2)));

            case StorageType.Int32:
                return((object)(Convert.ToInt32(value1) * Convert.ToInt32(value2)));

            case StorageType.UInt32:
                return((object)(uint)((int)Convert.ToUInt32(value1) * (int)Convert.ToUInt32(value2)));

            case StorageType.Int64:
                return((object)(Convert.ToInt64(value1) * Convert.ToInt64(value2)));

            case StorageType.UInt64:
                return((object)(ulong)((long)Convert.ToUInt64(value1) * (long)Convert.ToUInt64(value2)));

            case StorageType.Single:
                return((object)(float)((double)Convert.ToSingle(value1) * (double)Convert.ToSingle(value2)));

            case StorageType.Double:
                return((object)(Convert.ToDouble(value1) * Convert.ToDouble(value2)));

            case StorageType.Decimal:
                return((object)(Convert.ToDecimal(value1) * Convert.ToDecimal(value2)));

            case StorageType.String:
                Decimal result1;
                Decimal.TryParse(Convert.ToString(value1), out result1);
                Decimal result2;
                Decimal.TryParse(Convert.ToString(value2), out result2);
                return((object)(result1 * result2));

            case StorageType.SqlByte:
                return((object)((SqlByte)value1 * (SqlByte)value2));

            case StorageType.SqlDecimal:
                return((object)((SqlDecimal)value1 * (SqlDecimal)value2));

            case StorageType.SqlDouble:
                return((object)((SqlDouble)value1 * (SqlDouble)value2));

            case StorageType.SqlInt16:
                return((object)((SqlInt16)value1 * (SqlInt16)value2));

            case StorageType.SqlInt32:
                return((object)((SqlInt32)value1 * (SqlInt32)value2));

            case StorageType.SqlInt64:
                return((object)((SqlInt64)value1 * (SqlInt64)value2));

            case StorageType.SqlMoney:
                return((object)((SqlMoney)value1 * (SqlMoney)value2));

            case StorageType.SqlSingle:
                return((object)((SqlSingle)value1 * (SqlSingle)value2));

            default:
                throw InvalidExpressionException.TypeMismatch(nameof(Multiply));
            }
        }
예제 #5
0
        private static object Add(object value1, object value2, StorageType type)
        {
            switch (type)
            {
            case StorageType.Char:
                return((object)((int)Convert.ToChar(value1) + (int)Convert.ToChar(value2)));

            case StorageType.SByte:
                return((object)((int)Convert.ToSByte(value1) + (int)Convert.ToSByte(value2)));

            case StorageType.Byte:
                return((object)((int)Convert.ToByte(value1) + (int)Convert.ToByte(value2)));

            case StorageType.Int16:
                return((object)((int)Convert.ToInt16(value1) + (int)Convert.ToInt16(value2)));

            case StorageType.UInt16:
                return((object)((int)Convert.ToUInt16(value1) + (int)Convert.ToUInt16(value2)));

            case StorageType.Int32:
                return((object)(Convert.ToInt32(value1) + Convert.ToInt32(value2)));

            case StorageType.UInt32:
                return((object)(uint)((int)Convert.ToUInt32(value1) + (int)Convert.ToUInt32(value2)));

            case StorageType.Int64:
                return((object)(Convert.ToInt64(value1) + Convert.ToInt64(value2)));

            case StorageType.UInt64:
                return((object)(ulong)((long)Convert.ToUInt64(value1) + (long)Convert.ToUInt64(value2)));

            case StorageType.Single:
                return((object)(float)((double)Convert.ToSingle(value1) + (double)Convert.ToSingle(value2)));

            case StorageType.Double:
                return((object)(Convert.ToDouble(value1) + Convert.ToDouble(value2)));

            case StorageType.Decimal:
                return((object)(Convert.ToDecimal(value1) + Convert.ToDecimal(value2)));

            case StorageType.TimeSpan:
                TimeSpan result1;
                TimeSpan.TryParse(Convert.ToString(value1), out result1);
                TimeSpan result2;
                TimeSpan.TryParse(Convert.ToString(value2), out result2);
                return((object)(result1 + result2));

            case StorageType.String:
                Decimal result3;
                Decimal.TryParse(Convert.ToString(value1), out result3);
                Decimal result4;
                Decimal.TryParse(Convert.ToString(value2), out result4);
                return((object)(result3 + result4));

            case StorageType.SqlByte:
                return((object)((SqlByte)value1 + (SqlByte)value2));

            case StorageType.SqlDecimal:
                return((object)((SqlDecimal)value1 + (SqlDecimal)value2));

            case StorageType.SqlDouble:
                return((object)((SqlDouble)value1 + (SqlDouble)value2));

            case StorageType.SqlInt16:
                return((object)((SqlInt16)value1 + (SqlInt16)value2));

            case StorageType.SqlInt32:
                return((object)((SqlInt32)value1 + (SqlInt32)value2));

            case StorageType.SqlInt64:
                return((object)((SqlInt64)value1 + (SqlInt64)value2));

            case StorageType.SqlMoney:
                return((object)((SqlMoney)value1 + (SqlMoney)value2));

            case StorageType.SqlSingle:
                return((object)((SqlSingle)value1 + (SqlSingle)value2));

            case StorageType.SqlString:
                return((object)((SqlString)value1 + (SqlString)value2));

            default:
                throw InvalidExpressionException.TypeMismatch(nameof(Add));
            }
        }
예제 #6
0
        static object Mean(IEnumerable data
                           , ExpressionNode node
                           , object context
                           , string exp
                           , out int count
                           , out StorageType type)
        {
            count = 0;
            type  = StorageType.Empty;

            //if (0 == view.Data.Count)
            //    return 0;

            object sum = Sum(data, node, context, exp, out count, out type);

            if (0 == count)
            {
                return(0);
            }

            switch (type)
            {
            case StorageType.Char:
                return((char)sum / count);

            case StorageType.SByte:
                return((SByte)sum / count);

            case StorageType.Byte:
                return((Byte)sum / count);

            case StorageType.Int16:
                return((Int16)sum / count);

            case StorageType.UInt16:
                return((UInt16)sum / count);

            case StorageType.Int32:
                return((Int32)sum / count);

            case StorageType.UInt32:
                return((UInt32)sum / count);

            case StorageType.Int64:
                return((Int64)sum / count);

            case StorageType.UInt64:
                return((UInt64)sum / (UInt64)count);

            case StorageType.Single:
                return((Single)sum / count);

            case StorageType.Double:
                return((Double)sum / count);

            case StorageType.Decimal:
                return((Decimal)sum / count);

            case StorageType.String:
                return((Decimal)sum / count);

            case StorageType.SqlByte:
                return((SqlByte)sum / (byte)count);

            case StorageType.SqlDecimal:
                return((SqlDecimal)sum / count);

            case StorageType.SqlDouble:
                return((SqlDouble)sum / count);

            case StorageType.SqlInt16:
                return((SqlInt16)sum / (short)count);

            case StorageType.SqlInt32:
                return((SqlInt32)sum / count);

            case StorageType.SqlInt64:
                return((SqlInt64)sum / count);

            case StorageType.SqlMoney:
                return((SqlMoney)sum / count);

            case StorageType.SqlSingle:
                return((SqlSingle)sum / count);

            default:
                throw InvalidExpressionException.TypeMismatch(exp);
            }
        }
예제 #7
0
        static object Multiply(object value1, object value2, StorageType type)
        {
            switch (type)
            {
            case StorageType.Char:
                return(Convert.ToChar(value1) * Convert.ToChar(value2));

            case StorageType.SByte:
                return(Convert.ToSByte(value1) * Convert.ToSByte(value2));

            case StorageType.Byte:
                return(Convert.ToByte(value1) * Convert.ToByte(value2));

            case StorageType.Int16:
                return(Convert.ToInt16(value1) * Convert.ToInt16(value2));

            case StorageType.UInt16:
                return(Convert.ToUInt16(value1) * Convert.ToUInt16(value2));

            case StorageType.Int32:
                return(Convert.ToInt32(value1) * Convert.ToInt32(value2));

            case StorageType.UInt32:
                return(Convert.ToUInt32(value1) * Convert.ToUInt32(value2));

            case StorageType.Int64:
                return(Convert.ToInt64(value1) * Convert.ToInt64(value2));

            case StorageType.UInt64:
                return(Convert.ToUInt64(value1) * Convert.ToUInt64(value2));

            case StorageType.Single:
                return(Convert.ToSingle(value1) * Convert.ToSingle(value2));

            case StorageType.Double:
                return(Convert.ToDouble(value1) * Convert.ToDouble(value2));

            case StorageType.Decimal:
                return(Convert.ToDecimal(value1) * Convert.ToDecimal(value2));

            case StorageType.String:
            {
                Decimal decimalValue1;
                Decimal decimalValue2;
                Decimal.TryParse(Convert.ToString(value1), out decimalValue1);
                Decimal.TryParse(Convert.ToString(value2), out decimalValue2);
                return(decimalValue1 * decimalValue2);
            }

            case StorageType.SqlByte:
                return((SqlByte)value1 * (SqlByte)value2);

            case StorageType.SqlDecimal:
                return((SqlDecimal)value1 * (SqlDecimal)value2);

            case StorageType.SqlDouble:
                return((SqlDouble)value1 * (SqlDouble)value2);

            case StorageType.SqlInt16:
                return((SqlInt16)value1 * (SqlInt16)value2);

            case StorageType.SqlInt32:
                return((SqlInt32)value1 * (SqlInt32)value2);

            case StorageType.SqlInt64:
                return((SqlInt64)value1 * (SqlInt64)value2);

            case StorageType.SqlMoney:
                return((SqlMoney)value1 * (SqlMoney)value2);

            case StorageType.SqlSingle:
                return((SqlSingle)value1 * (SqlSingle)value2);

            default:
                throw InvalidExpressionException.TypeMismatch("Multiply");
            }
        }