2.2.2 Abstract Type System

The abstract type system that is used to define the primitive types that are supported by a data service is defined in [MC-CSDL] (section 2.2.1). When the value of a primitive type needs to be represented in a URI or HTTP header, the representation that is written uses the primitive type literal form representation that is defined in the following table. A primitive type representation in a request or a response payload is defined in format-specific sections of this document.

The following listing that follows the grammar rules in this section makes reference to the following shared ABNF [RFC5234] grammar rules.

 SQUOTE            =  %x27              ; ' (single quote)
 EQ                =  %x3D              ; = (equal sign)
 SEMI              =  %x3B              ; ; (semicolon)
 SP                =  %x20              ;   (single-width horizontal space character)
 COMMA             =  %x2C              ; , (comma)
 nonZeroDigit      =  %x31-39           ; all digits except zero
 doubleZeroToSixty =  "0" DIGIT
                      / "1" DIGIT
                      / "2" DIGIT
                      / "3" DIGIT
                      / "4" DIGIT
                      / "5" DIGIT
 nan               =  "NaN"
 negativeInfinity  =  "-INF"
 positiveInfinity  =  "INF"
 nanInfinity       =  nan / negativeInfinity / positiveInfinity
 sign              =  "-" / ""
 DIGIT             =  ; see [RFC5234] Appendix B.1 Core Rules
 UTF8-char         =  ; see [RFC3629]

The following table defines the literal form representations of Entity Data Model (EDM) primitive types.

EDM primitive type

ABNF rule for primitive type representation in URIs and HTTP headers

Primitive type literal form (ABNF definition)

null

nullLiteral

nullLiteral        =   "null"

Edm.Binary

binaryLiteral

binaryUriLiteral   =   caseSensitiveToken 
                       SQUOTE 
                       binaryLiteral 
                       SQUOTE
                 
binaryLiteral      =   hexDigPair
                 
caseSensitiveToken =   "X" / "binary"
; X is case sensitive,   and binary is not case sensitive
                 
hexDigPair         =   2*HEXDIG 
                       [hexDigPair]

Edm.Boolean

booleanLiteral

booleanLiteral =   true / false
                 
true           =   "true" / "1"
; clients/servers   SHOULD also recognize "True"
                 
false          =   "false" / "0"
; clients/servers   SHOULD also recognize "False"

Edm.Byte

byteLiteral

byteLiteral    =   1*3DIGIT; 
                 
; For further   information on the value range for
; the Edm.Byte type,   see [MC-CSDL]

Edm.DateTime

dateTimeUriLiteral

datetimeUriLiteral =   "datetime"
                       SQUOTE 
                       dateTimeLiteral
                       SQUOTE
                 
dateTimeLiteral =   year "-" 
                    month "-" 
                  day   "T"
                    hour ":" 
                    minute 
                    [":" second ["." nanoSeconds]] 
                    [timeZone]
year = 4Digit;
                 
month = <any   number between 1 and 12 inclusive>
                 
day = nonZeroDigit 
      /   ("0" nonZeroDigit)
        /("1" DIGIT) 
      /   ("2" DIGIT ) 
      /   "3" ("0" / "1")
                 
hour = nonZeroDigit 
       /   ("0" nonZeroDigit)
       /   ("1"  DIGIT) 
       /   ("2" zeroToFour)
zeroToFour= <any   nuumber between 0 and 4 inclusive>
minute   =doubleZeroToSixty
second =   doubleZeroToSixty
nanoSeconds=   1*7Digit
timeZone = (
                ("+" / "-") 
               hour   ':' minute
           ) 
           / 'Z'

Edm.Decimal

decimalUriLiteral

decimalUriLiteral = decimalLiteral
                      ("M"/"m")
                 
decimalLiteral    =   sign 1*29DIGIT 
                       ["." 1*29DIGIT]

Edm.Double

doubleLiteral

doubleLiteral = (
   (
   nonDecimalPoint /   
   nonExpDecimal  / 
   expDecimal
   ) 
   "D" /   "d"
)  /
( nanInfinity   ["D" / "d"])
                 
nonDecimalPoint=   sign 1*17DIGIT
                 
nonExpDecimal  =   sign* DIGIT "." *DIGIT
                 
expDecimal     =   sign 
                   1*DIGIT 
                   "."
                   16DIGIT 
                   ("e" / "E")
                   sign 
                   1*3DIGIT
                 
; for additional   information on the value range 
; of the Edm.Double   type, see [MC-CSDL]

Edm.Single

singleUriLiteral

singleUriLiteral = 
  ( singleLiteral   ("F" / "f"))/
  ( nanInfinity [   "F" / "f" ])
   
singleLiteral    = 
   nonDecimalPoint /   
   nonExpDecimal / 
   expDecimal  
                 
nonDecimalPoint =   sign 1*8DIGIT
                 
nonExpDecimal   =   sign 
                    *DIGIT  
                    "." 
                    *DIGIT
expDecimal      =   sign 
                    1*DIGIT 
                    "." 
                    8DIGIT 
                    ("e" / "E") 
                    sign 
                    1*2DIGIT
                 
; for additional   information on the value range 
; of the Edm.Single   type, see [MC-CSDL]

Edm.Float

singleLiteral

See Edm.Single.

Edm.Guid

guidUriLiteral

guidUriLiteral=   "guid" 
                   SQUOTE 
                   guidLiteral
                   SQUOTE
                 
guidLiteral   =   8HEXDIG "-" 
                  4HEXDIG "-" 
                  4HEXDIG "-"
                  4HEXDIG "-" 
                  12HEXDIG

Edm.Int16

int16Literal

int16Literal= sign 1*5DIGIT

Edm.Int32

int32Literal

int32Literal= sign   1*10DIGIT

Edm.Int64

int64UriLiteral

int64UriLiteral=   int64Literal
                   ("L" / "l")
int64Literal   =   sign 1*19DIGIT

Edm.SByte

sbyteliteral

sbyteliteral= sign 1*3DIGIT

Edm.String

stringUriLiteral

stringUriLiteral =   SQUOTE 
                     [*characters] 
                     SQUOTE
                 
characters       =   UTF8-char

Edm.Time

timeUriLiteral

timeUriLiteral = 
   "time"
   SQUOTE 
   timeLiteral
   SQUOTE
                 
timeLiteral =   <Defined by the lexical representation
for dayTimeDuration   in [XMLSCHEMA1.1/2:2012]>

Edm.DateTimeOffset

dateTimeOffsetUriLiteral

dateTimeOffsetUriLiteral   = 
     "datetimeoffset"
   SQUOTE 
     dateTimeOffsetLiteral
   SQUOTE
                 
dateTimeOffsetLiteral   = <Defined by the lexical representation
for datetime   (including timezone offset) in [XMLSCHEMA2/2].
The timezone offset   is required.>

Edm.Geography

N/A

N/A

Edm.GeographyPoint

geographyFullPointLiteral

The two doubles in position literals are to be interpreted as longitude, then latitude.

geographyFullPointLiteral   = 
  geographyPrefix
  fullPointLiteral
  SQUOTE
                 
geographyPrefix =
    "geography"
  SQUOTE
                 
fullPointLiteral =
  sridLiteral
  pointLiteral
                 
pointLiteral =
  "Point"
  pointData
                 
pointData =
  "("
  positionLiteral
  ")"
                 
positionLiteral =
  doubleLiteral
  SP
  doubleLiteral
                 
sridLiteral =
  "SRID"
  EQ
  1*5DIGIT
  SEMI

Edm.GeographyLineString

geographyFullLineStringLiteral

The two doubles in position literals are to be interpreted as longitude, then latitude.

geographyFullLineStringLiteral   = 
  geographyPrefix
    fullLineStringLiteral
  SQUOTE
                 
fullLineStringLiteral   =
  sridLiteral
  lineStringLiteral
                 
lineStringLiteral =
    "LineString"
  lineStringData
                 
lineStringData =
  "("
  positionLiteral
  [COMMA   positionLiteral]+
  ")"

Edm.GeographyPolygon

geographyFullPolygonLiteral

The two doubles in position literals are to be interpreted as longitude, then latitude.

geographyFullPolygonLiteral   = 
  geographyPrefix
  fullPolygonLiteral
  SQUOTE
                 
fullPolygonLiteral =
  sridLiteral
  polygonLiteral
                 
polygonLiteral =
    "Polygon"
  polygonData
                 
polygonData =
  "("
  ringLiteral
  [COMMA   ringLiteral]*
  ")"
                 
ringLiteral =
  "("
  firstPosition
  [COMMA   positionLiteral]*
  COMMA
  firstPosition
  ")"
                 
firstPosition =
  positionLiteral
                 
Within each   ringLiteral, the two firstPosition elements MUST
be an exact   syntactic match to each other.
                 
Within the   polygonData, the ringLiterals MUST specify their
points in   appropriate winding order. In order of traversal,
points to the left   side of the ring are interpreted as being
in the polygon.

Edm.GeographyCollection

geographyFullGeoCollectionLiteral

The two doubles in position literals are to be interpreted as longitude, then latitude.

geographyFullGeoCollectionLiteral   = 
  geographyPrefix
    fullGeoCollectionLiteral
  SQUOTE
                 
fullGeoCollectionLiteral   =
  sridLiteral
    geoCollectionLiteral
                 
geoCollectionLiteral   =
    "GeometryCollection("
  geoLiteral
  [COMMA   geoLiteral]*
  ")"
                 
geoLiteral =
  pointLiteral
  |   lineStringLiteral
  | polygonLiteral
  |   geoCollectionLiteral
  |   multiPointLiteral
  |   multiLineStringLiteral
  |   multiPolygonLiteral

Edm.GeographyMultiPoint

geographyFullMultiPointLiteral

The two doubles in position literals are to be interpreted as longitude, then latitude.

geographyFullMultiPointLiteral   =
  sridLiteral
  multiPointLiteral
                 
multiPointLiteral =
    "MultiPoint("
  [pointData
    [COMMA   pointData]*
  ]?
  ")"

Edm.GeographyMultiLineString

geographyFullMultiLineStringLiteral

The two doubles in position literals are to be interpreted as longitude, then latitude.

geographyFullMultiLineStringLiteral   = 
  geographyPrefix
  fullMultiLineStringLiteral
  SQUOTE
                 
fullMultiLineStringLiteral   =
  sridLiteral
    multiLineStringLiteral
                 
multiLineStringLiteral   =
    "MultiLineString("
  [lineStringData
    [COMMA   lineStringData]*
  ]?
  ")"

Edm.GeographyMultiPolygon

geographyFullMultiPolygonLiteral

The two doubles in position literals are to be interpreted as longitude, then latitude.

geographyFullMultiPolygonLiteral   = 
  geographyPrefix
    fullMultiPolygonLiteral
  SQUOTE
                 
fullMultiPolygonLiteral   =
  sridLiteral
    multiPolygonLiteral
                 
multiPolygonLiteral   =
    "MultiPolygon("
  [polygonData
    [COMMA   polygonData]*
  ]?
  ")"

Edm.Geometry

N/A

N/A

Edm.GeometryPoint

geometryFullPointLiteral

The two doubles in position literals are to be interpreted as X, then Y.

geometryFullPointLiteral   = 
  geometryPrefix
  fullPointLiteral
  SQUOTE
                 
geometryPrefix =
    "geometry"
  SQUOTE

Edm.GeometryLineString

geometryFullLineStringLiteral

The two doubles in position literals are to be interpreted as X, then Y.

geometryFullLineStringLiteral   = 
  geometryPrefix
    fullLineStringLiteral
  SQUOTE

Edm.GeometryPolygon

geometryFullPolygonLiteral

The two doubles in position literals are to be interpreted as X, then Y.

geometryFullPolygonLiteral   = 
  geometryPrefix
  fullPolygonLiteral
  SQUOTE

Edm.GeometryCollection

geometryFullGeoCollectionLiteral

The two doubles in position literals are to be interpreted as X, then Y.

geometryFullGeoCollectionLiteral   = 
  geometryPrefix
    fullGeoCollectionLiteral
  SQUOTE

Edm.GeometryMultiPoint

geometryFullMultiPointLiteral

The two doubles in position literals are to be interpreted as X, then Y.

geometryFullMultiPointLiteral   = 
  geometryPrefix
    fullMultiPointLiteral
  SQUOTE

Edm.GeometryMultiLineString

geometryFullMultiLineStringLiteral

The two doubles in position literals are to be interpreted as X, then Y.

geometryFullMultiLineStringLiteral   = 
  geometryPrefix
    fullMultiLineStringLiteral
  SQUOTE

Edm.GeometryMultiPolygon

geometryFullMultiPolygonLiteral

The two doubles in position literals are to be interpreted as X, then Y.

geometryFullMultiPolygonLiteral   = 
  geometryPrefix
    fullMultiPolygonLiteral
  SQUOTE

Edm.Stream

N/A

N/A

Collection

N/A

N/A

Table: Literal Form of Entity Data Model Primitive Types