On Nov 15, 2011, at 9:04 PM, Caleb James DeLisle wrote:
> On 11/15/2011 12:25 PM, Vincent Massol wrote:
>>
>> On Nov 15, 2011, at 5:29 PM, Denis Gervalle wrote:
>>
>>> On Tue, Nov 15, 2011 at 17:11, Vincent Massol <vincent(a)massol.net>
wrote:
>>>
>>>>
>>>> On Nov 15, 2011, at 5:03 PM, Denis Gervalle wrote:
>>>>
>>>>> Hi Devs,
>>>>>
>>>>> The implementation of the immutable version of reference is almost
ready
>>>>> now. It introduce the parameters on reference as suggested, but we
now
>>>> have
>>>>> a discussion on how the constructors of "typed" entity
reference should
>>>> be.
>>>>>
>>>>> My initial dev was to provide constructor like:
>>>>
>>>> you're missing something here :)
>>>>
>>>>> But Vincent have different vision of this, here its comment
extracted
>>>> from
>>>>
>>>> I don't have a different vision. It's just that you limited your
proposal
>>>> to just Locale which clearly isn't good enough.
>>>>
>>>>> GitHub (
>>>>>
>>>>
https://github.com/xwiki/xwiki-platform/commit/cea424914f40ce924afbc49b3159…
>>>> )
>>>>> :
>>>>>
>>>>> My proposal was:
>>>>>> - generic params in EntityReference
>>>>>> - helpers methods for get/setLocale and get/setVersion in
>>>> DocumentReference
>>>>>>
>>>>>> Now the fact that we're making the refs immutable changed
this since
>>>> it's
>>>>>> no longer possible.
>>>>>>
>>>>>> I don't think multiplying the constructor signatures is a
good idea.
>>>>>>
>>>>>> We could either have:
>>>>>>
>>>>>> public DocumentReference(String wikiName, List spaceNames,
String
>>>>>> pageName, Map<String, Object> parameters)
>>>>>>
>>>>>> or
>>>>>>
>>>>>> public DocumentReference(String wikiName, List spaceNames,
String
>>>>>> pageName, Pair<String, Object>... parameters)
>
> Neither of these signatures will work, If you want storage to have any hope of being
able to get the same object for the same reference, it must be at least
> a Map or Pair of <String, Serializable>, if you allow people to pass transient
objects such as TCP sockets, they will.
>
> More importantly, if you introduce another parameter, there will be no way to search
for all documents where param X = value Y. To do it with SQL would require
> an evil query which did text searching on the parameter field something like: WHERE
doc.reference LIKE '%param=value%'
> To add parameters to a reference and retain the ability to get all documents where
"param=value" you would have to modify the database schema unless the
information
> already exists in the XWikiDocument mapping as with language.
>
>>>>>>
>>>>>> where Pair is
>>>>>>
>>>>
http://commons.apache.org/lang/api-3.0-beta/org/apache/commons/lang3/Pair.h…
>>>>>>
>>>>>> Maybe this needs some discussion on the devs list rather than
here to
>>>> make
>>>>>> sure everyone sees it?
>>>>>>
>>>>>
>>>>> I am myself not really happy with that since I dislike the idea that
>>>>> parameter are generic on "typed" references.
>>>>> Do not like either the idea to provide keys for creating a Map or
Pairs,
>>>>> since the implementation details that use Map should not be so
exposed
>>>> IMO.
>>>>>
>>>>> There should not be so much parameter on a single "typed"
reference,
>>>>
>>>> I don't understand this sentence.
>>>>
>>>> The Map is <String, Object>.
>>>>
>>>
>>> I would means that this should not cause so many additional constructors,
>>> if we list them individually.
>>> So your have not the same vision then I have :)
>>
>> See below.
>>
>>>>> and
>>>>> these should be easy to provide. Creating Maps in java is not fun in
>>>> syntax
>>>>> for that IMO, and is far too open.
>>>>
>>>> Sure but the goal here is not to redo java…
>>>>
>>>
>>> Not my goals, just want to be explicit and easy to use.
>>>
>>>
>>>>
>>>>> I had propose using overloaded constructor like
>>>>>
>>>>> public DocumentReference(String wikiName, List<String>
spaceNames, String
>>>>> pageName, Locale locale)
>
> +1
>
>>>>
>>>> Again, this doesn't work. It only works for a **single** parameter.
It
>>>> doesn't work for multiple parameters. How do you specify the Locale
or some
>>>> unknown String param?
>>>>
>>>
>>> I simply provide the need constructor, no more.
>>
>> If you say this then you say that we don't need generic parameters for
References which is what started the discussion…
>>
>> Also what you say is not correct at all since we already know we need Version
which you didn't put.
>>
>> Last, it means passing null to the constuctors when you don't use the
parameters which is really really bad IMO or you'll need to define lots of various
constructors which increase exponentially with the number of parameters we support.
>
> A constant need for new parameters indicated design problems, including locale
information is fixing an error which limited the document reference from the beginning.
> Building this infrastructure for additional parameters will foster bad practice of
using parameters where spaces should be used instead and will allow the creation
> of arbitrary dimensional data trees where users are only familiar with the standard 1
dimension of filesystems and URLs.
>
>>
>> However this won't even work since you won't be able to support adding
new parameters. Users of the Reference system will need to modify its source if they wish
to add a new parameter which again goes against the initial proposal.
>>
>>>>> or if something more flexible should be used
>>>>>
>>>>> public DocumentReference(String wikiName, List<String>
spaceNames, String
>>>>> pageName, Object... parameters)
>>>>>
>>>>> where parameters is later interpreted based on object type and
limited to
>>>>> those used for a given typed reference.
>>>>
>>>> This doesn't work. If I have 2 parameters of type String, how do you
map
>>>> them automatically?
>>>>
>>>
>>> I suggest not to have loosely typed parameters, but strong one, like Locale
>>> and Version.
>
> +1
>
> I am -1 on version, I don't like it since a document history should be a separate
entity which yields documents, as it is now.
How do you reference a given version of, say, a document? And how do you pass this along
the chain of calls?
We'll need to introduce a new Reference (which is the initial reason I made this
proposal - I had to introduce a UniqueReference class in the new Model before of this).
If you are needing to reference old versions of something on a regular basis then you are
going to run into performance issues.
We only access old versions either via a look at them or to rollback, both operations
which we accept will be slow.