Skip to content

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

Closed

Description

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

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions