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