/// <summary> /// Creates the function mappings for this DQE. /// </summary> private static void CreateFunctionMappingStore() { // Parameter 0 is the element the method is called on. parameter 1 is the first argument etc. // All indexes are converted to 0-based. //////////////////////////////////////////////// // VB.NET compiler services specific methods //////////////////////////////////////////////// // CompareString(3), which is emitted by the VB.NET compiler when a '=' operator is used between two string-typed operands. _functionMappings.Add(new FunctionMapping("Microsoft.VisualBasic.CompilerServices.Operators", "CompareString", 3, "CASE WHEN {0} < {1} THEN -1 WHEN {0} = {1} THEN 0 ELSE 1 END")); //////////////////////////////////////////////// // Array related properties //////////////////////////////////////////////// // Length _functionMappings.Add(new FunctionMapping(typeof(Array), "get_Length", 0, "LENGTH({0})")); //////////////////////////////////////////////// // Boolean related functions //////////////////////////////////////////////// // Negate(1) (!operand) _functionMappings.Add(new FunctionMapping(typeof(bool), "Negate", 1, "NOT ({0}=1)")); // ToString() _functionMappings.Add(new FunctionMapping(typeof(bool), "ToString", 0, "CASE WHEN ({0})=1 THEN 'True' ELSE 'False' END")); //////////////////////////////////////////////// // Char related functions //////////////////////////////////////////////// // ToUnicode(1) (new method, used to convert char to unicode. _functionMappings.Add(new FunctionMapping(typeof(char), "ToUnicode", 1, "UNICODE({0})")); //////////////////////////////////////////////// // Convert related functions //////////////////////////////////////////////// // ToBoolean(1) _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToBoolean", 1, "(CONVERT(BIT, {0})=1)")); // ToByte(1) _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToByte", 1, "CONVERT(TINYINT, {0})")); // ToChar(1) _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToChar", 1, "CONVERT(NCHAR, {0})")); // ToDateTime(1) _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToDateTime", 1, "CONVERT(DATETIME, {0})")); // ToDecimal(1) _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToDecimal", 1, "CONVERT(DECIMAL, {0})")); // ToDouble(1) _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToDouble", 1, "CONVERT(FLOAT, {0})")); // ToInt16(1) _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToInt16", 1, "CONVERT(SMALLINT, {0})")); // ToInt32(1) _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToInt32", 1, "CONVERT(INT, {0})")); // ToInt64(1) _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToInt64", 1, "CONVERT(BIGINT, {0})")); // ToSingle(1) _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToSingle", 1, "CONVERT(REAL, {0})")); // ToString(1) _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToString", 1, "CONVERT(NVARCHAR(4000), {0})")); //////////////////////////////////////////////// // byte related functions //////////////////////////////////////////////// _functionMappings.Add(new FunctionMapping(typeof(byte), "ToString", 0, "CONVERT(NVARCHAR(4), {0})")); _functionMappings.Add(new FunctionMapping(typeof(sbyte), "ToString", 0, "CONVERT(NVARCHAR(4), {0})")); //////////////////////////////////////////////// // Int16 related functions //////////////////////////////////////////////// _functionMappings.Add(new FunctionMapping(typeof(Int16), "ToString", 0, "CONVERT(NVARCHAR(5), {0})")); _functionMappings.Add(new FunctionMapping(typeof(UInt16), "ToString", 0, "CONVERT(NVARCHAR(5), {0})")); //////////////////////////////////////////////// // Int32 related functions //////////////////////////////////////////////// _functionMappings.Add(new FunctionMapping(typeof(Int32), "ToString", 0, "CONVERT(NVARCHAR(10), {0})")); _functionMappings.Add(new FunctionMapping(typeof(UInt32), "ToString", 0, "CONVERT(NVARCHAR(10), {0})")); //////////////////////////////////////////////// // Int64 related functions //////////////////////////////////////////////// _functionMappings.Add(new FunctionMapping(typeof(Int64), "ToString", 0, "CONVERT(NVARCHAR(32), {0})")); _functionMappings.Add(new FunctionMapping(typeof(UInt64), "ToString", 0, "CONVERT(NVARCHAR(32), {0})")); //////////////////////////////////////////////// // DateTime related functions //////////////////////////////////////////////// // AddDays(1) _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddDays", 1, "DATEADD(day, {1}, {0})")); // AddHours(1) _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddHours", 1, "DATEADD(hour, {1}, {0})")); // AddMilliseconds(1) _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddMilliseconds", 1, "DATEADD(millisecond, {1}, {0})")); // AddMinutes(1) _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddMinutes", 1, "DATEADD(minute, {1}, {0})")); // AddMonths(1) _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddMonths", 1, "DATEADD(month, {1}, {0})")); // AddSeconds(1) _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddSeconds", 1, "DATEADD(second, {1}, {0})")); // AddYears(1) _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddYears", 1, "DATEADD(year, {1}, {0})")); // Compare(2) _functionMappings.Add(new FunctionMapping(typeof(DateTime), "Compare", 2, "CASE WHEN {0} < {1} THEN -1 WHEN {0} = {1} THEN 0 ELSE 1 END")); //////////////////////////////////////////////// // DateTime related properties //////////////////////////////////////////////// // Date _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Date", 0, "DATE({0})")); // Day _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Day", 0, "DAY({0})")); // DayOfWeek _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_DayOfWeek", 0, "(DOW({0}) + (SELECT CONNECTION_PROPERTY('first_day_of_week')) + 6) % 7")); // DayOfYear _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_DayOfYear", 0, "DATEPART(dy, {0})")); // Hour _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Hour", 0, "DATEPART(hh, {0})")); // Millisecond _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Millisecond", 0, "DATEPART(ms, {0})")); // Minute _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Minute", 0, "DATEPART(mi, {0})")); // Month _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Month", 0, "MONTH({0})")); // Second _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Second", 0, "DATEPART(ss, {0})")); // Year _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Year", 0, "YEAR({0})")); //////////////////////////////////////////////// // Decimal related functions //////////////////////////////////////////////// // Add(2) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Add", 2, "({0} + {1})")); // Ceiling(1) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Ceiling", 1, "CEILING({0})")); // Compare(2) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Compare", 2, "CASE WHEN {0} < {1} THEN -1 WHEN {0} = {1} THEN 0 ELSE 1 END")); // Divide(2) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Divide", 2, "({0} / {1})")); // Floor(1) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Floor", 1, "FLOOR({0})")); // Multiply(2) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Multiply", 2, "({0} * {1})")); // Negate(1) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Negate", 1, "(-1 * {0})")); // Remainder(2) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Remainder", 2, "({0} - (CAST(({0} / {1}) AS INT) * {1}))")); // Round(1) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Round", 1, "ROUND({0}, 0)")); // Round(2) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Round", 2, "ROUND({0}, {1})")); // Substract(2) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Subtract", 2, "({0} - {1})")); // Truncate(1) _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Truncate", 1, "TRUNCNUM({0}, 0)")); //////////////////////////////////////////////// // Math related functions //////////////////////////////////////////////// // Pow _functionMappings.Add(new FunctionMapping(typeof(Math), "Pow", 2, "POWER({0}, {1})")); //////////////////////////////////////////////// // String related functions //////////////////////////////////////////////// // Compare(2) _functionMappings.Add(new FunctionMapping(typeof(string), "Compare", 2, "CASE WHEN {0} < {1} THEN -1 WHEN {0} = {1} THEN 0 ELSE 1 END")); // Concat(2). _functionMappings.Add(new FunctionMapping(typeof(string), "Concat", 2, "({0} + {1})")); // IndexOf(1). _functionMappings.Add(new FunctionMapping(typeof(string), "IndexOf", 1, "(CHARINDEX({1}, {0}) - 1)")); // IndexOf(2) _functionMappings.Add(new FunctionMapping(typeof(string), "IndexOf", 2, "(CHARINDEX({1}, {0}, {2} + 1) - 1)")); // LastIndexOf(1) _functionMappings.Add(new FunctionMapping(typeof(string), "LastIndexOf", 1, "CASE WHEN COALESCE(CHARINDEX({1}, {0}), 0)=0 THEN -1 ELSE (LENGTH({0}) - CHARINDEX(REVERSE({1}), REVERSE({0})))-(LENGTH({1})-1) END")); // LastIndexOf(2) _functionMappings.Add(new FunctionMapping(typeof(string), "LastIndexOf", 2, "CASE WHEN LENGTH({0})<= {2} THEN -1 WHEN COALESCE(CHARINDEX({1}, LEFT({0}, {2})), 0)=0 THEN -1 ELSE ({2} - CHARINDEX(REVERSE({1}), REVERSE(LEFT({0}, {2}))))-(LENGTH({1})-1) END")); // PadLeft(1) _functionMappings.Add(new FunctionMapping(typeof(string), "PadLeft", 1, "CASE WHEN LENGTH({0})>={1} THEN {0} ELSE SPACE({1} - LENGTH({0})) + {0} END")); // PadLeft(2) _functionMappings.Add(new FunctionMapping(typeof(string), "PadLeft", 2, "CASE WHEN LENGTH({0})>={1} THEN {0} ELSE REPLICATE({2}, {1} - LENGTH({0})) + {0} END")); // PadRight(1) _functionMappings.Add(new FunctionMapping(typeof(string), "PadRight", 1, "CASE WHEN LENGTH({0})>={1} THEN {0} ELSE {0} + SPACE({1} - LENGTH({0})) END")); // PadRight(2) _functionMappings.Add(new FunctionMapping(typeof(string), "PadRight", 2, "CASE WHEN LENGTH({0})>={1} THEN {0} ELSE {0} + REPLICATE({2}, {1} - LENGTH({0})) END")); // Remove(1) _functionMappings.Add(new FunctionMapping(typeof(string), "Remove", 1, "LEFT({0}, {1})")); // Remove(2) _functionMappings.Add(new FunctionMapping(typeof(string), "Remove", 2, "STUFF({0}, {1}+1, {2}, '')")); // Replace(2) _functionMappings.Add(new FunctionMapping(typeof(string), "Replace", 2, "REPLACE({0}, {1}, {2})")); // Substring(1) _functionMappings.Add(new FunctionMapping(typeof(string), "Substring", 1, "SUBSTRING({0}, {1}+1)")); // Substring(2) _functionMappings.Add(new FunctionMapping(typeof(string), "Substring", 2, "SUBSTRING({0}, {1}+1, {2})")); // ToLower(0) _functionMappings.Add(new FunctionMapping(typeof(string), "ToLower", 0, "LOWER({0})")); // ToUpper(0) _functionMappings.Add(new FunctionMapping(typeof(string), "ToUpper", 0, "UPPER({0})")); // Trim(0) _functionMappings.Add(new FunctionMapping(typeof(string), "Trim", 0, "TRIM({0})")); //////////////////////////////////////////////// // String related properties //////////////////////////////////////////////// // Length _functionMappings.Add(new FunctionMapping(typeof(string), "get_Length", 0, "LENGTH({0})")); // Chars(1) / indexer _functionMappings.Add(new FunctionMapping(typeof(string), "get_Chars", 1, "SUBSTRING({0}, {1}+1, 1) ")); //////////////////////////////////////////////// // Object related functions //////////////////////////////////////////////// // IIF(3). (IIF(op1, op2, op3) / op1 ? op2 : op3 statement) _functionMappings.Add(new FunctionMapping(typeof(object), "IIF", 3, "CASE WHEN {0}=1 THEN {1} ELSE {2} END")); // IIF(3). (IIF(op1, op2, op3) / op1 ? op2 : op3 statement). Used for boolean operands. The IIF will end up being wrapped with a boolean wrapper anyway, so it has to produce a boolean _functionMappings.Add(new FunctionMapping(typeof(object), "IIF_Bool", 3, "(CASE WHEN {0}=1 THEN {1} ELSE {2} END)=1")); // LeftShift(2). (op1 << op2) _functionMappings.Add(new FunctionMapping(typeof(object), "LeftShift", 2, "({0} * POWER(2, {1}))")); // RightShift(2). (op1 >> op2) _functionMappings.Add(new FunctionMapping(typeof(object), "RightShift", 2, "({0} / POWER(2, {1}))")); // BooleanInProjectionWrapper(1) _functionMappings.Add(new FunctionMapping(typeof(object), "BooleanInProjectionWrapper", 1, "CASE WHEN {0} THEN 1 ELSE 0 END")); }