[hibernate-dev] [Search] Index embedded and id property of embedded entity
Emmanuel Bernard
emmanuel at hibernate.org
Tue May 27 11:29:35 EDT 2014
On 27 May 2014, at 12:29, Hardy Ferentschik <hardy at hibernate.org> wrote:
> Thanks for the input. Comments inline.
>
> On 27 Jan 2014, at 12:01, Emmanuel Bernard <emmanuel at hibernate.org> wrote:
>
>>
>> On 06 May 2014, at 21:43, Hardy Ferentschik <hardy at hibernate.org> wrote:
>>
>>> Where are we at in this discussion?
>>>
>>> I think we basically have to main proposals.
>>>
>>> #1 Don’t include the embedded id per default. If @IndexEmbedded is used via the depth parameter there is no way to include the embedded id.
>>> In order to include the id you would need to use includePaths. depth and includePaths can be used in combination, so something like this
>>> is possible @IndexedEmbedded( depth = 1, includePaths = “foo.id” ). This will include all configured fields of the embedded entity, plus its id.
>>> #2 Don’t include the embedded id per default, but have an additional flag on @IndexedEmbedded to include the embedded id. The default would be false.
>>> To include the id would be something like @IndexedEmbedded( depth = 1, includeEmbeddedId = true ) or
>>> @IndexedEmbedded( includePaths = {“foo.a”, “foo.b”, “foo.c”} , includeEmbeddedId = true ).
>>
>> I like #2 much better. It is too complex to ask of the user to understand how the combination of depth and includePaths work based on fairly arbitrary rules.
>> I thing the property should be named includeEmbeddedObjectsIds because embeddedId has a precise meaning in ORM.
>
> Cool. Seems we have now several votes for this approach. I will start implementing it then.
> +1 also for ‘includeEmbeddedObjectsIds'
>
>> One question in that case, what does this one do
>>
>> @IndexedEmbedded( includePath = { “foo.id” }, includeEmbeddedId=false //default )
>>
>> I think we should honour includePath according to the additive rule mentioned earlier and the path of least surprise.
>
> Sounds reasonable.
>
>>> On top of this we seem to agree that it is a good idea to set the default depth value of @IndexedEmbedded to 0. This avoids the change in default values,
>>> when includePaths is used. As a side effect the default @IndexedEmbedded annotation becomes a no-op and should be treated as an invalid configuration.
>>> The choice here is between:
>>>
>>> #1 Log warning and move on
>>> #2 Throw an exception due to invalid configuration
>>>
>>> My choice would be #2 again.
>>
>> Is that really a good idea? As you guys said, @IndexedEmbedded becomes a (silently or not) broken mapping :(
>> It also means that the simplest @IE usage requires to understand depth and / or includePath.
>> I don’t like that at all. It makes things more complex than they should be for the simple case.
>
> So what is your take on this then? Leave as is and keep the fact that the default depth value changes its default value depending
> on whether or not includePaths is used? That would be option
>
> #3 Keep status quo for value of depth parameter
>
> I raised the concern that the simple @IndexEmbedded is now not valid anymore as well before. I guess the question is what you give more importance,
> ability to use the annotation with its default values or have consistent default values which don’t change.
>
> I still think consistency is more important and #2 is the better approach. However, before going to #1, I would rather join you and keep the status quo
> with #3.
>
> Btw, enforcing a depth or includePath value might have the advantage of creating smaller (more targeted) indexes, since we less likely include
> fields which are need targeted by a query.
#3 then #2 for me. I really like #3 better though for the reason I explained.
We should bet at horse races together ;)
More information about the hibernate-dev
mailing list