Closed
Description
openedon Jun 18, 2019
See https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-system-functions, https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-linq-to-sql
Done:
- LENGTH, CONTAINS, ENDSWITH, LOWER, LTRIM, RTRIM, STARTSWITH, TRIM, UPPER, SUBSTRING, CONCAT (using + operator), INDEX_OF, REPLACE, case-insensitive versions of STRINGEQUAL
- ABS, ACOS, ASIN, ATAN, ATN2, CEILING, COS, EXP, FLOOR, LOG, LOG10, POWER, ROUND, SIGN, SIN, SQRT, TAN, TRUNC, RAND,
- GetCurrentDateTime
Questionable:
- COT - no direct Math function, equivalent to 1/TAN, should we recognize the pattern?
- DEGREES, RADIANS - no direct Math function. we could recognize the mathematical pattern, e.g r = (Math.PI/180) * d, but it seems too complicated. Dedicated EF.Functions seems the most reasonable.
- SQUARE - no direct Math function, we already translate Math.Pow. We could recognize the pattern Math.Pow(x, 2) but it would only work for constant. Probably better to create a decicated EF.Function, if anything at all.
- PI - impossible to encounter this in expression tree because its const
- REPLICATE, REVERSE - complex translation, probably better suited for EF.Functions translation (see Add translations for REPLICATE/REVERSE sql functions #25470)
- StringToArray, StringToBoolean, StringToNull, StringToNumber, StringToObject - EF.Functions? (StringToBoolean could be mapped to Convert though)
- ToString - we could do it, but there are differences between c# and cosmos output, potential can of worms
- RIGHT, LEFT - maps cleanly only to VB method, no clear c# counterpart. LEFT is similar although we do translate some Substring scenarios into it
- GetCurrentTimestamp - could correspond to new DateTimeOffset(DateTime.UtcNow)..ToUnixTimeMilliseconds() but that seems to complicated and not very discoverable. EF.Functions seems like a better option.
- IS_DEFINED, IS_OBJECT, IS_PRIMITIVE - doesn't map directly to bcl
- IS_ARRAY - could lead to discrepancies (collection in the model but array on the database)
- IS_BOOL, IS_STRING, IS_NUMBER - marginal utility, everything is already strongly typed
- IS_NULL - should we map to this instead of
x = null
? - ARRAY_CONCAT, ARRAY_CONTAINS, ARRAY_LENGTH, ARRAY_SLICE (EFCore 3.1 + CosmosDb can't translate any() on owned object #20441) - no straightforward translation
- ST_DISTANCE, ST_INTERSECTS, ST_ISVALID, ST_ISVALIDDETAILED, ST_WITHIN (Cosmos: Spatial types, functions and spatial indexes #17317) - blocked on spatial support for cosmos
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment