Skip to content

Cosmos: Add translators for member/methods which map to built-in functions #16143

@smitpatel

Description

@smitpatel

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

Metadata

Metadata

Assignees

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions