[Rets-dev] Technical: A proposed solution to some issues around
mixed data types and RETS schemas
Jeff Brush
jeffbrush at hotmail.com
Wed May 2 08:26:55 CDT 2007
Paul,
Any ideas how XML data binding tools would respond to this?
Sometimes the tools can generate code that is a little convoluted (and
unexpected), but should that be a consideration?
I can look into it if you like... Or someone else can volunteer, data
binding is a good thing to learn if you are doing a lot of XML...
Jeff
> -----Original Message-----
> From: rets-dev-bounces at rets.org
> [mailto:rets-dev-bounces at rets.org] On Behalf Of Paul Stusiak
> Sent: Wednesday, May 02, 2007 4:25 AM
> To: E-mail Rets-Dev
> Subject: [Rets-dev] Technical: A proposed solution to some
> issues around mixed data types and RETS schemas
>
> Having just sent out an email suggesting we skip typing for
> the present, I will now perform an apparent about face.
>
> Over the last week or so, in my abundant spare time, I have
> been looking at resolving the general problem of typing mixed
> types. An example of this is the age of the house.
>
> A natural typing for this would suggest that it is an integer
> representing the number of years since the house was built.
> There are the two counter examples of the house age described
> as "new" and an older house where the age is undetermined,
> but it is an "old-timer".
> While there will be outliers to these three cases - age as a
> number, new (locally defined rule on what is new) and old or
> old-timer (locally defined rule on what is old), I think that
> this represents a useful set of data for someone trying to use it.
>
> I'm sure that examples can be offered of cases where the age
> or other value is offered in a range or other representation,
> however, the case under discussion is limited to values that
> also have certain well-defined or well-known values of a
> descriptive nature.
>
> Let us assume that there is an element defined in a container like so
>
> <ns1:Container>
> <ns1:Age type="commons:Age"/>
> </ns1:Container>
>
> The text book solutions would be to define it as currently in
> Primitives.xsd like so
>
> <xs:complexType name="Age">
> <xs:annotation>
> <xs:documentation>
> The age, in years, of a structure.
> </xs:documentation>
> </xs:annotation>
> <xs:simpleContent>
> <xs:extension base="commons:SecureInteger"/>
> </xs:simpleContent>
> </xs:complexType>
>
> This would permit instances like
> <ns1:Container><ns1:Age>8</ns1:Age></ns1:Container>
> but would fail instances that did not have an integer,
> including the empty string.
>
> While a solution could be constructed to apply attributes
> where the age was new or old-timer, an alternate may be tidier.
>
> <xs:simpleType name="empty-string">
> <xs:annotation>
> <xs:documentation>
> A primitive type used to permit null values,
> represented
> by the empty string, for data types other than the
> xs:string type. Combined with the base data type in a
> union, the custom data type can permit
> validation of the
> XML instance document where the underlying type is
> integer for example. In that case, the values
> permitted
> are any integer OR the empty string.
> </xs:documentation>
> </xs:annotation>
> <xs:restriction base="xs:string">
> <xs:length value="0"/>
> </xs:restriction>
> </xs:simpleType>
>
> <xs:simpleType name="nullable-integer">
> <xs:union memberTypes="xs:integer commons:empty-string"/>
> </xs:simpleType>
>
> <xs:simpleType name="age-enum">
> <xs:annotation>
> <xs:documentation>
> An enumeration of additional data values
> </xs:documentation>
> </xs:annotation>
> <xs:restriction base="xs:string">
> <xs:enumeration value="New"/>
> <xs:enumeration value="Old"/>
> </xs:restriction>
> </xs:simpleType>
>
> <xs:simpleType name="simple-age">
> <xs:union memberTypes="commons:nullable-integer
> commons:age-enum"/>
> </xs:simpleType>
>
> <xs:complexType name="Age">
> <xs:annotation>
> <xs:documentation>
> The age, in years, of a structure.
> </xs:documentation>
> </xs:annotation>
> <xs:simpleContent>
> <xs:extension base="commons:simple-age">
> <xs:attribute ref="commons:isgSecurityClass"
> use="required"/>
> </xs:extension>
> </xs:simpleContent>
> </xs:complexType>
>
> This would permit validation of values like
> <ns1:Container><ns1:Age>8</ns1:Age></ns1:Container>
> <ns1:Container><ns1:Age></ns1:Age></ns1:Container>
> <ns1:Container><ns1:Age>new</ns1:Age></ns1:Container>
> <ns1:Container><ns1:Age>old-timer</ns1:Age></ns1:Container>
>
> while failing validation of
> <ns1:Container><ns1:Age>1/4</ns1:Age></ns1:Container>
>
> The short explanation is that we create a union of three
> things - integers, empty strings and the values new or
> old-timer. The validation engine is then able to use this
> information to compare the instance value with that defined
> in the schema.
>
> The example uses Age, but there are probably other cases or
> additional values that could be used.
>
> Since I have already done the work, it seemed useful to post
> this so it doesn't get lost and to attract some comments.
>
> I think that there are a couple of solutions to picklists
> that one of us will post in the coming days for the same reason.
>
> Comments and questions are welcomed.
>
> Back to your regularly scheduled message...
>
> --
> Paul Stusiak
> Falcon Technologies Corp.
>
> _______________________________________________
> Rets-dev mailing list
> Rets-dev at rets.org
> http://lists.rets.org/mailman/listinfo/rets-dev
>
More information about the Rets-dev
mailing list