Export (0) Print
Expand All

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 should use 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

 
Show:
© 2014 Microsoft