[hibernate-dev] [HSEARCH] Geospatial indexing and queries

Emmanuel Bernard emmanuel at hibernate.org
Wed Dec 21 11:22:55 EST 2011


On 21 déc. 2011, at 15:19, Hardy Ferentschik wrote:

> 
> On Dec 21, 2011, at 2:59 PM, Emmanuel Bernard wrote:
> 
>> Which one do you prefer (line in bold for each sample)?
>> 
>> 			builder
>> 				.spatial()
>> 					.onCoordinates( "location" )  or .forCoordinates("location") or .forLocation("location") or something else
>> 					.within( 500, Unit.KM )
>> 						.of().latitude(48.858333d).longitude(2.294444d)
>> 					.createQuery();
> 
> 			builder
> 				.spatial()
> 				        .forLocation("location") 
> 					.within( 500, Unit.KM )
> 						.of().latitude(48.858333d).longitude(2.294444d)
> 					.createQuery();
> 
> On a side node, do we really need 'of()'. Sure it makes it sounds a little more like real English, but then why is there no 'and()' between lat and long.
> The whole DSL part only carries so far when directly hosted in Java. If there is no compelling reason for 'of()' i would argue one can drop it.

There is a reason for the of(). An overloaded form used when the user passes a Coordinates object is like this

builder
    .spatial()
        .forLocation("location")
        .within(500, Unit.KM)
            .of(coordinates)
        .createQuery();

So you can see there is a symmetry to it.

But we can reduce the number of methods called by doing something like this

builder
    .spatial()
        .forLocation("location")
        .within(500, Unit.KM)
            .ofLatitude(48.8d).andLongitude(2.29d)
        .createQuery();

Would you like it better?

> 
> what's about 'proximity' instead of 'spatial'?

I am somewhat neutral, but I think the industry term is spatial queries. Thoughts?

> 
> 
>> 			builder
>> 				.spatial()
>> 					.onLatitudeField( "latitude" ).onLongitudeField( "longitude" ) or .forLatitudeField( "latitude" ).forLongitudeField( "longitude" )  or something else
>> 					.within( 51, Unit.KM )
>> 						.of().latitude( 24d ).longitude( 31.5d )
>> 					.createQuery();
> 
> 			builder
> 				.spatial()
> 					.onFields(long, lat)
> 					.within( 51, Unit.KM )
> 						.of().latitude( 24d ).longitude( 31.5d )
> 					.createQuery();

As Karel pointed out, a major bug in spatial queries is people using latitude instead of longitude and vice versa. onFields does leave this can of worms open



More information about the hibernate-dev mailing list