NeoJSON and inheritance

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

NeoJSON and inheritance

NorbertHartl
How is inheritance supposed to work in NeoJSON? I only figured it out by doing that manually:

neoJsonMapping: aMapper
        super neoJsonMapping: aMapper.
        (aMapper mappingFor: self)
                        mapInstVar: #longitude;
                        mapInstVar: #latitude.

Is there a better way to do?

Norbert
Reply | Threaded
Open this post in threaded view
|

Re: NeoJSON and inheritance

Sven Van Caekenberghe-2
Norbert,

On 26 Sep 2013, at 11:32, Norbert Hartl <[hidden email]> wrote:

> How is inheritance supposed to work in NeoJSON? I only figured it out by doing that manually:
>
> neoJsonMapping: aMapper
> super neoJsonMapping: aMapper.
> (aMapper mappingFor: self)
> mapInstVar: #longitude;
> mapInstVar: #latitude.
>
> Is there a better way to do?
>
> Norbert

What you figured out yourself is the only inheritance that is available.

The thing is, schema names (which can be plain Symbols or Class objects) are meant to be used for things like #ArrayOfPoints, #DictionaryWithUserValues which tell something about subtypes. I hurts to think of an inheritance for that ;-)

Sven
Reply | Threaded
Open this post in threaded view
|

Re: NeoJSON and inheritance

philippeback
The "super" thing doesn't work.

I have spent a while tracing what was occuring with the custom mappings.

If in a subclass I do:

neoJsonMapping: aMapper
super neoJsonMapping: aMapper.
aMapper for: self do: [ :mapping |
mapping
mapProperty: 'startDate' getter: [ :filter | filter startDate ] setter: [ :filter :value | filter startDate: value ];
mapProperty: 'endDate' getter: [ :filter | filter endDate ] setter: [ :filter :value | filter endDate: value ].
]

and in the superclass:

neoJsonMapping: aMapper
aMapper for: self do: [ :mapping |
mapping mapInstVar: #id to: 'id'.
]

(do not pay attention to mapInstVar or mapProperty, I was figuring out how things worked).

Thing is that the mapping goes fine up to one point.

super neoJsonMapping: aMapper 

indeed puts the right 'id' mapping but then 

aMapper for:: self do: [ ...

does

for: smalltalkClass do: block
"Create and add a new standard object mapping for smalltalkClass.
The code in block should further customize the mapping."
| mapping |
mapping := self newObjectMappingFor: smalltalkClass.
block value: mapping.
^ mapping


which in turn:

newObjectMappingFor: smalltalkClass
| mapping |
mapping := NeoJSONObjectMapping new.
mapping subjectClass: smalltalkClass.
self mappings at: smalltalkClass put: mapping.
^ mapping



Argh:  self mappings at: smalltalkClass put: mapping.

Overwrites the existing contents.

So, only the entries of the subclass are left.

I guess that's a bug. 

I'd do:

newObjectMappingFor: smalltalkClass
| mapping |

mapping := self mappings at: smalltalkClass.

mapping ifNil: [ 
mapping := NeoJSONObjectMapping new.
mapping subjectClass: smalltalkClass.
self mappings at: smalltalkClass put: mapping.
].

^ mapping

instead.

Does this look right? 

mapping := self newObjectMappingFor: smalltalkClass.

isn't then really intention revealing. Shouldn't we rename that to objectMappingFor: smalltalkClass


Phil






On Fri, Sep 27, 2013 at 7:07 PM, Sven Van Caekenberghe <[hidden email]> wrote:
Norbert,

On 26 Sep 2013, at 11:32, Norbert Hartl <[hidden email]> wrote:

> How is inheritance supposed to work in NeoJSON? I only figured it out by doing that manually:
>
> neoJsonMapping: aMapper
>       super neoJsonMapping: aMapper.
>       (aMapper mappingFor: self)
>                       mapInstVar: #longitude;
>                       mapInstVar: #latitude.
>
> Is there a better way to do?
>
> Norbert

What you figured out yourself is the only inheritance that is available.

The thing is, schema names (which can be plain Symbols or Class objects) are meant to be used for things like #ArrayOfPoints, #DictionaryWithUserValues which tell something about subtypes. I hurts to think of an inheritance for that ;-)

Sven


Reply | Threaded
Open this post in threaded view
|

Re: NeoJSON and inheritance

philippeback
NeoJSONMapper>>newObjectMappingFor: smalltalkClass
| mapping |

mapping := self mappings at: smalltalkClass ifAbsent: [ 
mapping := NeoJSONObjectMapping new.
mapping subjectClass: smalltalkClass.
self mappings at: smalltalkClass put: mapping.
].

^ mapping


works better ...

Phil

On Mon, Mar 17, 2014 at 5:40 PM, [hidden email] <[hidden email]> wrote:
The "super" thing doesn't work.

I have spent a while tracing what was occuring with the custom mappings.

If in a subclass I do:

neoJsonMapping: aMapper
super neoJsonMapping: aMapper.
aMapper for: self do: [ :mapping |
mapping
mapProperty: 'startDate' getter: [ :filter | filter startDate ] setter: [ :filter :value | filter startDate: value ];
mapProperty: 'endDate' getter: [ :filter | filter endDate ] setter: [ :filter :value | filter endDate: value ].
]

and in the superclass:

neoJsonMapping: aMapper
aMapper for: self do: [ :mapping |
mapping mapInstVar: #id to: 'id'.
]

(do not pay attention to mapInstVar or mapProperty, I was figuring out how things worked).

Thing is that the mapping goes fine up to one point.

super neoJsonMapping: aMapper 

indeed puts the right 'id' mapping but then 

aMapper for:: self do: [ ...

does

for: smalltalkClass do: block
"Create and add a new standard object mapping for smalltalkClass.
The code in block should further customize the mapping."
| mapping |
mapping := self newObjectMappingFor: smalltalkClass.
block value: mapping.
^ mapping


which in turn:

newObjectMappingFor: smalltalkClass
| mapping |
mapping := NeoJSONObjectMapping new.
mapping subjectClass: smalltalkClass.
self mappings at: smalltalkClass put: mapping.
^ mapping



Argh:  self mappings at: smalltalkClass put: mapping.

Overwrites the existing contents.

So, only the entries of the subclass are left.

I guess that's a bug. 

I'd do:

newObjectMappingFor: smalltalkClass
| mapping |

mapping := self mappings at: smalltalkClass.

mapping ifNil: [ 
mapping := NeoJSONObjectMapping new.
mapping subjectClass: smalltalkClass.
self mappings at: smalltalkClass put: mapping.
].

^ mapping

instead.

Does this look right? 

mapping := self newObjectMappingFor: smalltalkClass.

isn't then really intention revealing. Shouldn't we rename that to objectMappingFor: smalltalkClass


Phil






On Fri, Sep 27, 2013 at 7:07 PM, Sven Van Caekenberghe <[hidden email]> wrote:
Norbert,

On 26 Sep 2013, at 11:32, Norbert Hartl <[hidden email]> wrote:

> How is inheritance supposed to work in NeoJSON? I only figured it out by doing that manually:
>
> neoJsonMapping: aMapper
>       super neoJsonMapping: aMapper.
>       (aMapper mappingFor: self)
>                       mapInstVar: #longitude;
>                       mapInstVar: #latitude.
>
> Is there a better way to do?
>
> Norbert

What you figured out yourself is the only inheritance that is available.

The thing is, schema names (which can be plain Symbols or Class objects) are meant to be used for things like #ArrayOfPoints, #DictionaryWithUserValues which tell something about subtypes. I hurts to think of an inheritance for that ;-)

Sven



Reply | Threaded
Open this post in threaded view
|

Re: NeoJSON and inheritance

Sven Van Caekenberghe-2
Phil,

I finally found time to look in to this in detail and added a test with inheritance.

In #bleedingEdge:

===
Name: Neo-JSON-Core-SvenVanCaekenberghe.25
Author: SvenVanCaekenberghe
Time: 22 March 2014, 11:03:31.510538 am
UUID: 3051cd7d-a857-4aee-b5ba-d56a4085517b
Ancestors: Neo-JSON-Core-SvenVanCaekenberghe.24

Added basic support for mapping using inheritance when using #neoJonMapping : (see #testObject3)
Renamed #new[Custom|Object]MappingFor: to [custom|object]MappingFor: to better reflect the new behavior
Thanks  Philippe Back for making these suggestions!
===
Name: Neo-JSON-Tests-SvenVanCaekenberghe.23
Author: SvenVanCaekenberghe
Time: 22 March 2014, 11:04:11.513921 am
UUID: 27fad240-c6b9-4d00-a4e6-6e49fd612dfb
Ancestors: Neo-JSON-Tests-SvenVanCaekenberghe.22

Added basic support for mapping using inheritance when using #neoJonMapping : (see #testObject3)
Renamed #new[Custom|Object]MappingFor: to [custom|object]MappingFor: to better reflect the new behavior
Thanks  Philippe Back for making these suggestions!
===

On 17 Mar 2014, at 18:01, [hidden email] wrote:

> NeoJSONMapper>>newObjectMappingFor: smalltalkClass
> | mapping |
>
> mapping := self mappings at: smalltalkClass ifAbsent: [
> mapping := NeoJSONObjectMapping new.
> mapping subjectClass: smalltalkClass.
> self mappings at: smalltalkClass put: mapping.
> ].
>
> ^ mapping
>
>
> works better ...

#at:ifAbsentPut: is even better ;-)

Regards,

Sven

> Phil
>
> On Mon, Mar 17, 2014 at 5:40 PM, [hidden email] <[hidden email]> wrote:
> The "super" thing doesn't work.
>
> I have spent a while tracing what was occuring with the custom mappings.
>
> If in a subclass I do:
>
> neoJsonMapping: aMapper
> super neoJsonMapping: aMapper.
>
> aMapper for: self do: [ :mapping |
> mapping
> mapProperty: 'startDate' getter: [ :filter | filter startDate ] setter: [ :filter :value | filter startDate: value ];
> mapProperty: 'endDate' getter: [ :filter | filter endDate ] setter: [ :filter :value | filter endDate: value ].
> ]
>
> and in the superclass:
>
> neoJsonMapping: aMapper
> aMapper for: self do: [ :mapping |
> mapping mapInstVar: #id to: 'id'.
> ]
>
> (do not pay attention to mapInstVar or mapProperty, I was figuring out how things worked).
>
> Thing is that the mapping goes fine up to one point.
>
> super neoJsonMapping: aMapper
>
> indeed puts the right 'id' mapping but then
>
> aMapper for:: self do: [ ...
>
> does
>
> for: smalltalkClass do: block
> "Create and add a new standard object mapping for smalltalkClass.
> The code in block should further customize the mapping."
>
> | mapping |
> mapping := self newObjectMappingFor: smalltalkClass.
> block value: mapping.
> ^ mapping
>
>
> which in turn:
>
> newObjectMappingFor: smalltalkClass
> | mapping |
> mapping := NeoJSONObjectMapping new.
> mapping subjectClass: smalltalkClass.
> self mappings at: smalltalkClass put: mapping.
> ^ mapping
>
>
>
> Argh: self mappings at: smalltalkClass put: mapping.
>
> Overwrites the existing contents.
>
> So, only the entries of the subclass are left.
>
> I guess that's a bug.
>
> I'd do:
>
> newObjectMappingFor: smalltalkClass
> | mapping |
>
> mapping := self mappings at: smalltalkClass.
>
> mapping ifNil: [
> mapping := NeoJSONObjectMapping new.
> mapping subjectClass: smalltalkClass.
> self mappings at: smalltalkClass put: mapping.
> ].
>
> ^ mapping
>
> instead.
>
> Does this look right?
>
> mapping := self newObjectMappingFor: smalltalkClass.
>
> isn't then really intention revealing. Shouldn't we rename that to objectMappingFor: smalltalkClass
>
>
> Phil
>
>
>
>
>
>
> On Fri, Sep 27, 2013 at 7:07 PM, Sven Van Caekenberghe <[hidden email]> wrote:
> Norbert,
>
> On 26 Sep 2013, at 11:32, Norbert Hartl <[hidden email]> wrote:
>
> > How is inheritance supposed to work in NeoJSON? I only figured it out by doing that manually:
> >
> > neoJsonMapping: aMapper
> >       super neoJsonMapping: aMapper.
> >       (aMapper mappingFor: self)
> >                       mapInstVar: #longitude;
> >                       mapInstVar: #latitude.
> >
> > Is there a better way to do?
> >
> > Norbert
>
> What you figured out yourself is the only inheritance that is available.
>
> The thing is, schema names (which can be plain Symbols or Class objects) are meant to be used for things like #ArrayOfPoints, #DictionaryWithUserValues which tell something about subtypes. I hurts to think of an inheritance for that ;-)
>
> Sven
>
>
>


Reply | Threaded
Open this post in threaded view
|

Re: NeoJSON and inheritance

philippeback
Super! 



On Sat, Mar 22, 2014 at 11:15 AM, Sven Van Caekenberghe <[hidden email]> wrote:
Phil,

I finally found time to look in to this in detail and added a test with inheritance.

In #bleedingEdge:

===
Name: Neo-JSON-Core-SvenVanCaekenberghe.25
Author: SvenVanCaekenberghe
Time: 22 March 2014, 11:03:31.510538 am
UUID: 3051cd7d-a857-4aee-b5ba-d56a4085517b
Ancestors: Neo-JSON-Core-SvenVanCaekenberghe.24

Added basic support for mapping using inheritance when using #neoJonMapping : (see #testObject3)
Renamed #new[Custom|Object]MappingFor: to [custom|object]MappingFor: to better reflect the new behavior
Thanks  Philippe Back for making these suggestions!
===
Name: Neo-JSON-Tests-SvenVanCaekenberghe.23
Author: SvenVanCaekenberghe
Time: 22 March 2014, 11:04:11.513921 am
UUID: 27fad240-c6b9-4d00-a4e6-6e49fd612dfb
Ancestors: Neo-JSON-Tests-SvenVanCaekenberghe.22

Added basic support for mapping using inheritance when using #neoJonMapping : (see #testObject3)
Renamed #new[Custom|Object]MappingFor: to [custom|object]MappingFor: to better reflect the new behavior
Thanks  Philippe Back for making these suggestions!
===

On 17 Mar 2014, at 18:01, [hidden email] wrote:

> NeoJSONMapper>>newObjectMappingFor: smalltalkClass
>       | mapping |
>
>       mapping := self mappings at: smalltalkClass ifAbsent: [
>               mapping := NeoJSONObjectMapping new.
>               mapping subjectClass: smalltalkClass.
>               self mappings at: smalltalkClass put: mapping.
>       ].
>
>       ^ mapping
>
>
> works better ...

#at:ifAbsentPut: is even better ;-)

Regards,

Sven

> Phil
>
> On Mon, Mar 17, 2014 at 5:40 PM, [hidden email] <[hidden email]> wrote:
> The "super" thing doesn't work.
>
> I have spent a while tracing what was occuring with the custom mappings.
>
> If in a subclass I do:
>
> neoJsonMapping: aMapper
>       super neoJsonMapping: aMapper.
>
>       aMapper for: self do: [ :mapping |
>               mapping
>                       mapProperty: 'startDate' getter: [ :filter | filter startDate ] setter: [ :filter :value | filter startDate: value ];
>                       mapProperty: 'endDate'  getter: [ :filter | filter endDate ]    setter: [ :filter :value | filter endDate: value ].
>       ]
>
> and in the superclass:
>
> neoJsonMapping: aMapper
>       aMapper for: self do: [ :mapping |
>               mapping mapInstVar: #id to: 'id'.
>       ]
>
> (do not pay attention to mapInstVar or mapProperty, I was figuring out how things worked).
>
> Thing is that the mapping goes fine up to one point.
>
> super neoJsonMapping: aMapper
>
> indeed puts the right 'id' mapping but then
>
> aMapper for:: self do: [ ...
>
> does
>
> for: smalltalkClass do: block
>       "Create and add a new standard object mapping for smalltalkClass.
>       The code in block should further customize the mapping."
>
>       | mapping |
>       mapping := self newObjectMappingFor: smalltalkClass.
>       block value: mapping.
>       ^ mapping
>
>
> which in turn:
>
> newObjectMappingFor: smalltalkClass
>       | mapping |
>       mapping := NeoJSONObjectMapping new.
>       mapping subjectClass: smalltalkClass.
>       self mappings at: smalltalkClass put: mapping.
>       ^ mapping
>
>
>
> Argh:         self mappings at: smalltalkClass put: mapping.
>
> Overwrites the existing contents.
>
> So, only the entries of the subclass are left.
>
> I guess that's a bug.
>
> I'd do:
>
> newObjectMappingFor: smalltalkClass
>       | mapping |
>
>       mapping := self mappings at: smalltalkClass.
>
>       mapping ifNil: [
>               mapping := NeoJSONObjectMapping new.
>               mapping subjectClass: smalltalkClass.
>               self mappings at: smalltalkClass put: mapping.
>       ].
>
>       ^ mapping
>
> instead.
>
> Does this look right?
>
> mapping := self newObjectMappingFor: smalltalkClass.
>
> isn't then really intention revealing. Shouldn't we rename that to objectMappingFor: smalltalkClass
>
>
> Phil
>
>
>
>
>
>
> On Fri, Sep 27, 2013 at 7:07 PM, Sven Van Caekenberghe <[hidden email]> wrote:
> Norbert,
>
> On 26 Sep 2013, at 11:32, Norbert Hartl <[hidden email]> wrote:
>
> > How is inheritance supposed to work in NeoJSON? I only figured it out by doing that manually:
> >
> > neoJsonMapping: aMapper
> >       super neoJsonMapping: aMapper.
> >       (aMapper mappingFor: self)
> >                       mapInstVar: #longitude;
> >                       mapInstVar: #latitude.
> >
> > Is there a better way to do?
> >
> > Norbert
>
> What you figured out yourself is the only inheritance that is available.
>
> The thing is, schema names (which can be plain Symbols or Class objects) are meant to be used for things like #ArrayOfPoints, #DictionaryWithUserValues which tell something about subtypes. I hurts to think of an inheritance for that ;-)
>
> Sven
>
>
>