On Wed, Nov 16, 2011 at 6:51 AM, Caleb James DeLisle
<[email protected]> wrote:
>
>
> On 11/15/2011 03:26 PM, Vincent Massol wrote:
>>
>> 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 <[email protected]> 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/cea424914f40ce924afbc49b3159bc8934251aac#commitcomment-721603
>>>>>> )
>>>>>>> :
>>>>>>>
>>>>>>> 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.html
>>>>>>>>
>>>>>>>> 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.
>
>>
>>> If we include version in the reference, storage will be forced to remove it 
>>> on save because we want users asking for a document
>>> with no knowledge of the current version to get the current version. This 
>>> means we already have a magic attribute which is treated
>>> differently by storage.
>>
>> All params are treated specially by the code, I don't understand what's the 
>> problem. The exact same thing will happen for the Locale.
>
> On a storage level, you can take the reference, serialize it into a UUID then 
> lookup the document with that UUID.
> If a version parameter is added, the storage has to remove that parameter 
> first.
>
>>
>>> In addition, the introduction of a version parameter will allow a user to 
>>> load a document of a given version
>>> with a simple getDocument() call,
>>
>> Yes that's the idea! :)
>>
>>> fooling them into thinking all versions of every document are available in 
>>> the same namespace,
>>
>> Not sure what namespace you're referring to.
>
> Namespace is the wrong word, you tell the user that it's coming from the same 
> place but it's not.
>
> Consider this:
> thirdVersion = xwiki.getDocument(referenceToThirdVersionOfMainWebHome);
> thirdVersion.setContent("new content");
> thirdVersion.save();
> println(xwiki.getDocument(referenceToThirdVersionOfMainWebHome).getContent());
>
> This will not yield the new content, if it did then the versioning system 
> wouldn't really be versioning.
> But by treating a version as a distinct document with a distinct reference, 
> you are telling the user that it should.
>
>>
>>> if getDocument(referenceToThirdVersionOfMainWebHome) works then it stands 
>>> to reason that search("WHERE doc.version=3 AND doc.name='Main.WebHome'")
>>> would as well but it won't because that's not how storage works.
>>
>> Maybe you meant that it's not how storage currently work?
>>
>> Remember that this proposal has nothing to do with either the current model 
>> or the current storage. It's about the new model and the new storage that we 
>> want to have.
>
> I don't understand what you mean by this.
> Inserting a new row into the document table every time a user edits a 
> document is not feasible.
>
>>
>>>> I'm a big big big -1 on this.
>>>>
>>>> There's no reason to create a fake String when all you need is a string. 
>>>> Same for int, long, Number, etc.
>>>> Same for also if you want to have several Locales or several Versions.
>>>>
>>>>>> Also the goal is to have unknown parameters so how can you do a mapping
>>>>>> for something unknown? :)
>>>>>>
>>>>>
>>>>> That is clearly not my goal, why do you want unknown parameters on 
>>>>> Document
>>>>> Reference ?
>>>>
>>>> Maybe this is where we don't agree. This is the original idea: to have a 
>>>> set of "unknown" parameters for extensibility (from the POV of the 
>>>> Reference of course, from the POV of XWiki they are not unknown obviously 
>>>> ;)). This means that it's up to the users of the References to decide what 
>>>> parameters to put and it's up to the consumers to decide what parameters 
>>>> to support.
>>>
>>> The introduction of k-d trees for storing documents is not something that 
>>> anyone has ever used to my knowledge, it may be something that people think 
>>> they need
>>> but like the goto command, something that starts out nice ends up creating 
>>> more problems than it's worth.
>>>
>>>>
>>>> It seems to me your vision is to:
>>>> * Not support arbitrary parameters
>>>> * Only support Version and Locale
>>>> * Provide 3 constructors, one where there's no Locale no Version, one with 
>>>> Locale no version and one with Version on Locale
>>>>
>>>> Whereas my vision is:
>>>> * Support arbitrary parameters for extensibility (like a URL if you prefer 
>>>> which support arbitrary parameters)
>>>
>>> This is not correct, the parameters in a URL are never to my knowledge used 
>>> as a discriminator.
>>> Any webserver I can think of uses the parameters as arguments which are 
>>> passed to the page, not discriminators to select the page.
>>
>> Fun, you forgot XWiki itself! :)
>> We use version and language as URL parameters…. ?rev=X&language=Y
>>
>> Params reference are optional and are meant to be qualifier for the 
>> reference.
>
> IMO this is a bad design since it means that certain parameters such as 
> language have special meanings, all others are used as a means of 
> communicating with the scripting in the wiki page.
>
>>
>>> for example:
>>> path/to/some/page.php?var=val&varb=42
>>> will load the page "path/to/some/page.php" then execute it, passing var=val 
>>> and varb=42 as arguments.
>>
>> Seen all this I propose that stop this discussion and don't commit any of 
>> this on master for the moment since we have too many diverging opinions on 
>> the new model and we need to agree about the new model first.
>>
>> So I change my vote about the proposal I initially sent to -1 for now till 
>> this is sorted out because I don't want to rush into something for which we 
>> don't agree and have diverging ideas.
>>
>> I've been planning to put the work I started in the contrib sandbox into a 
>> branch on master in order to start using it ASAP (Thomas and I had a 
>> discussion and we think we could already start to slow use portions of it to 
>> validate it).
>>
>> So here's what I propose:
>>
>> * I do this ASAP
>> * I write an email explaining the work done so far on the new model
>> * We discuss it and come to an agreement
>> * Whether we extend our current Entity References with params or not will be 
>> a direct consequence of the model agreement
>>
>> I know Denis wanted to use the Locale param for his work. FTM Denis will 
>> have to pass the Locale as a parameter alongside the Entity Reference as 
>> it's done every where ATM.
>>
>> Is that ok?
>
> I disagree with slamming on the brakes on Denis's branch, the Denis wrote a 
> lot of code with the understanding that everyone agreed on it so I want to do 
> that justice.
> I have reviewed Denis's branch and it all looks good to me, it makes 2 major 
> changes:
> 1. Immutability which I have wanted since early on, I think this will make 
> the code a lot more stable.
> 2. Introduction of a locale field which is necessary for the reference to be 
> able to map to a document id, this means we need it now in order to make new 
> references compatible with the existing model.
>
> The other proposals such as version and arbitrary parameters broaden the new 
> model over the existing one and they should not be undertaken without 
> research into how the new model will interact with users and new storage, as 
> well as how it will interact with old storage and the old model during the 
> transition.
>
> In my review of the branch, I found a few things which could be changed:
> In EntityReference.java:
>
> private static final long serialVersionUID = 1L;
> that should become 2L because removing child is a breaking change from a 
> serialization standpoint.
>
> public EntityReference(String name, EntityType type, EntityReference parent, 
> Map<String,Object> parameters)
> I think this should be protected at least for now.
>
> public final Object getParameter(String name)
> I think this should be protected at least for now.
>
>
> +1 for merging the branch with these changes.

+1 too, I don't agree that locale without version is useless and if
parameters are made internal for now everyone should be happy until we
agree on something about them.

>
> Caleb
>
>
>>
>> Thanks
>> -Vincent
>>
>>> Caleb
>>>
>>>
>>>> * Have some "well-known" parameters so that xwiki code that users 
>>>> References know what they can put as reference parameters and what they 
>>>> can extract from XWiki parameters.
>>>>
>>>> Thanks
>>>> -Vincent
>>>>
>>>>>> Thanks
>>>>>> -Vincent
>>>>>>
>>>>>>> Here Vincent comments on this:
>>>>>>>
>>>>>>>> The automatic mapping idea seems a bad idea to me (too magic and 
>>>>>>>> doesn't
>>>>>>>> work in a lot of cases).
>>>>>>>
>>>>>>>
>>>>>>> Maybe some of you have an even better idea ?
>>>>>>>
>>>>>>> Denis
>> _______________________________________________
>> devs mailing list
>> [email protected]
>> http://lists.xwiki.org/mailman/listinfo/devs
>>
>
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
>



-- 
Thomas Mortagne
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to