ReadStrategy details

Florian Minjat florian.minjat at emn.fr
Tue Jun 19 22:53:39 UTC 2007


Hi again Chris,
   I have a few questions about ReadStrategies after playing around 
with them.
   Lets say my Players have an id which is an integer and a login 
which is a String. Setting minimumDepth: 0 gives me the id reified and 
a proxy for the login. But setting the min depth to 1 gives me the 
exact same thing. I need to set the depth to 2 to get the String. If 
that's normal what is the difference between 0 and 1?

   Another thing. As you saw I have a Desk with letters which refers 
to other Players. I don't want theses players to be reified but I want 
object deeper to be. So I tried something like that :
session readStrategy: ((MaReadStrategy minimumDepth: 1) onAny: Desk 
readToDepth: 0).
   But it didn't seem to work. This answers OrderedCollection :
((player instVarNamed: 'myDesk') instVarNamed: 'inbox') class.
   So how can I make the rule on Desk precedes the more global rule?

   A very simple browser to go through the hierarchy to see what is 
reified and what isn't could be great :).

Florian

Chris Muller wrote:
>> First of all, how long will the read strategy last for a given session
>> by doing mySession 'session readStrategy: myReadStrategy.' ?
> 
> It will last until you replace it with another ReadStrategy.
> 
>> Do I have
>> to revert it back to a default strategy after my specific queries ?
> 
> Yes.  If you have a specific query you need to optimise by changing
> the depths of certain variables of certain classes, you will probably
> want to revert to your "default" strategy afterward, otherwise the
> specific-query strategy will continue to be used.
> 
>> For example : my Players have
>> a reference to a Dungeon which references a Desk which has two
>> OrderedCollection referencing Letters. If I want to send a Letter to
>> 10 Players, I need to had a Letter in each of their Desk, resulting of
>> a huge query I think. Is there a way to be so much specific with a
>> ReadStrategy ?
> 
> Let's see here.
> 
>    Player --->(1) Dungeon --->(1) Desk --->(*) Letter
> 
> So, for this operation (sending a single Letter to 10 Players), use a
> ReadStrategy, something like this:
> 
>  (myReadStrategy minimumDepth: 1)
>    forVariableNamed: 'dungeon' onAny: Player readToDepth: 1 ;
>    forVariableNamed: 'desk' onAny: Dungeon readToDepth: 1 ;
>    forVariableNamed: 'letters1' onAny: Desk readToDepth: 2 ;
>    forVariableNamed: 'letters2' onAny: Desk readToDepth: 2.
> 
> This will cause the Player-->Dungeon-->Desk-->OC of Letters to be
> grabbed in a single server-trip.
> 
> The 'letters1' OC species 2 levels because there is the intermediate
> 'array' variable..  But you'll have to experiment to get it fully
> optimised.  The way to do this is be careful opening inspectors,
> because clicking the instVars inspectors invokes #printString causes
> proxy materializations.  So what you do is just open the *inspector*
> (NOT an explorer) on your Desk and ask the instVar for its class
> before inspecting it:
> 
>  letters1 class   "MagmaMutatingProxy"
> 
> then you know you need one level deeper, because you want it to say
> "OrderedCollection".  When you fix the ReadStrategy to do that, try it
> again but still do NOT click on the 'letters1' variable because the
> inspector will try to enumerate the values.  Instead:
> 
>  letters1 basicInspect
> 
> and then, in the basic-inspector:
> 
>  array class   "Array" or "MagmaMutatingProxy"
> 
> and so on.
> 
> In this way you can see exactly how it works and, knowing what you
> need, be able to craft a fully-optimised ReadStrategy for each
> use-case.
> 
> Regards,
>  Chris


More information about the Magma mailing list