Yes your analysis is correct.
I would clarify that 3 or 2c don’t have to apply on already supported return 
types, it is more likely custom types like JodaTime types.

I do think 3 is the most valuable but that 2c is a relatively close second.

Now the @Spatial and @TikaBridge annotations do have attributes which will 
influence how the underlying bridge is created.
I don’t think you are proposing to move the spatial and Tika bridge creation up 
on AnnotationMetadataProvider. That would AFAIU duplicate the bridge creation 
logic between the AMP and some ProgrammaticMetadataProvider.
Also I have a hard time navigating and understanding 
AnnotationMetadataProvider, so I’m not sure we should make it more complex.

So somehow, the AMP should convert @Spatial, @NumericField, @TikaBridge, and 
@DateBridge into some non annotation based representation and pass that 
information to the bridgeFactory. Your approach would be to call explicitly 
buildXxxBridge() - like buildDateBridge() - methods form AMP. These would be 
hosted on the BridgeFactory. Is that correct? And the same explicit call logic 
would be done on a programmatic API equivalent.

Now how would you pass and to these kind of explicit calls in the 2c case when 
the annotation is unknown a priori?

On 02 Apr 2014, at 13:23, Hardy Ferentschik <ha...@hibernate.org> wrote:

> 
> On 1 Jan 2014, at 22:07, Hardy Ferentschik <ha...@hibernate.org> wrote:
> 
>> 
>> On 1 Jan 2014, at 16:36, Emmanuel Bernard <emman...@hibernate.org> wrote:
>> 
>>> ## Handling duplicates
>>> 
>>> I had in mind the following logic.
>>> 
>>> Prevent custom bridge providers to offer bridges in the same situation.
> 
> I am still trying to wrap my head around “same situation”. It might help to 
> list the different cases we have. Also the POC
> for BridgeProvider has this method:
> 
>    FieldBridge returnFieldBridgeIfMatching(Class<?> returnType, 
> AnnotatedElement bridgedElement, String memberName, ServiceManager 
> serviceManager);
> 
> 1) Explicit field bridge declaration 
> 
> @Indexed
> class Foo {
>    @Field(bridge=@FieldBridge(impl=MyCustomBridge.class)
>    String foo;
> 
>    @Field
>    @FieldBridge(impl=MyOtherCustomBridge.class)
>    String snafu;
> 
>    // ...
> }
> 
> These is the simple case. BridgeProvider is not even involved, since the 
> bridge is explicitly specified
> 
> 2) Bridge is indirectly specified via its context 
> 
> 2a) @TikaBridge
> 
> @Indexed
> class Foo {
>       @Lob
>       @Basic(fetch = FetchType.LAZY)
>       @Field
>       @TikaBridge
>       Blob content;
> 
>        //...
> }
> 
> 2b) @Spatial
> 
> @Indexed
> class Bar {
>       @Spatial
>       public Coordinates getLocation() {
>               return new Coordinates() {
>                       @Override
>                       public Double getLatitude() {
>                               return latitude;
>                       }
> 
>                       @Override
>                       public Double getLongitude() {
>                               return longitude;
>                       }
>               };
>       }
> }
> 
> 2c) Some custom annotation 
> 
> @Indexed
> class Foo {
>    @Field
>    String foo;
> 
>    @Field
>    @Snafu
>    String snafu;
> 
>    // …
> }
> 
> A couple of considerations here. I guess 2a and 2b are the driving force 
> behind passing the AnnotatedElement into the BridgeProvider contract. The 
> current implementations would check whether 
> an annotation like @TikaBridge or @Spatal exist and behave accordingly. Part 
> of the problem is that in the case of programmatic configuration we now have 
> to create a pseudo annotated element 
> to make this contract work (see related discussion). This works fine with the 
> current commons-annotations approach, but the aim is really to let the 
> programmatic configuration populate the internal
> metamodel directly instead of creating pseudo annotations. 
> 
> The question for me atm, is why we go via the BridgeProvider at all for 2a 
> and 2b? The bridge might not be explicitly specified via a @Bridge 
> annotation, but it is still a clear case due to
> @TikaBridge and @Spatial. Why can not the AnnotationMetadataProvider take 
> care of this and during the processing of the annotations of a property act 
> accordingly. A programmatic metadata provider 
> would also just act depending on whether spatial() was specified or not.
> 
> The problem maybe starts already at BridgeFactory#guessType which gets also 
> passed (numeric) field  annotations as well as the processed member. 
> guessType does then two things, it processes the 
> annotations and if potentially queries the BridgeProviders. I think parts of 
> the responsibility should be moved into AnnotationMetadataProvider. 
> BridgeFactory#guessType should really only be called in
> the case where the bridge is not explicitly or implicitly specified.
> 
> Which leaves 2c. The question is whether we think it is a valid use case to 
> have a BridgeProvider which returns a different bridge depending on some non 
> Search related annotation (@Snafu). If so,
> we indeed need to pass the AnnotatedElement into the BridgeProvider.
> 
> 3) No explicit or implicit bridge config
> 
> @Indexed
> class Foo {
>    @Field
>    String snafu;
> 
>    // …
> }
> 
> I guess this is main use case for the BridgeProvider, right? In this case the 
> bridge really depends on the type of the indexed property (in the worst case 
> also on some additional custom annotation if
> we support 2c).
> 
> 
> Thoughts?
> 
> —Hardy 
> 


_______________________________________________
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev

Reply via email to