There is an easier *but less optimized* way to manage such kind of 
Pre-filter (spatial index). If in my ST_Intersection function I could 
retrieve more information on the two parameters I could internally use 
Index first (pre-computed bounding box in RTree) then full intersection 
test.

Something like this:

public static Boolean ST_Intersects(Connection connection, Field<Geometry> 
> leftField, Field<Geometry> rightField ) {
>         Geometry geom1 = leftField.getValue();
>         Geometry geom2 = rightField.getValue();
>         // Bounding box test through RTree
>         if( !leftField.getTable().isEmpty()) {
>              
> if(!SpatialRTreeIndex.BBoxIntersects(connection,leftField.getTable(),leftField.getFieldIndex(),
>  
> geom2)) {
>                  return false;
>              }
>         } else if( !rightField.getTable().isEmpty()) {
>              
> if(!SpatialRTreeIndex.BBoxIntersects(connection,rightField.getTable(),rightField.getFieldIndex(),
>  
> geom1)) {
>                  return false;
>              }
>         }
>         // BBox intersects, or there is no precomputed rtree available, 
> test full geometry
>
>     return geom1.intersects(geom2);
>
> }
>

original 
(https://github.com/nicolas-f/H2GIS/blob/h2spatial-osgi-snapshot/h2spatial/src/main/java/org/h2spatial/internal/function/spatial/predicates/ST_Intersects.java)

Then in this sample the function get more than field value, it get also 
table name and column index for each parameter.

I repeat, this solution is less effective than pre-filter row index by 
using rtree first, but it should run quickly as the intersection test is 
done fewer time than original ST_Intersects version.

What do you think about it ?

Le mardi 21 mai 2013 19:22:40 UTC+2, Thomas Mueller a écrit :
>
> Hi,
>
> It's a good question. The optimizer currently only knows a few ways to use 
> an index: range conditions (<=, >=, >, <, =, between), in(list), 
> in(select), like (which is converted to a range condition), is null, is not 
> null, min(x), max(x), count(*).
>
> I wonder if there is a "generic" way to support index usage. It's won't be 
> that easy I guess. For the MVStore it would be nice to have a good solution 
> (so that the r-tree can be used), but we might end up "hardcoding" it 
> within H2.
>
> Could you tell me what are possible operations that could use a (spatial 
> or other) index, and how such an index could be used?
>
> Regards,
> Thomas
>
>
>
> On Tue, May 21, 2013 at 1:27 PM, Nicolas Fortin (OrbisGIS) <
> [email protected] <javascript:>> wrote:
>
>> I know function table but this lead to modifying the sql request and it 
>> is not in standard.
>>
>> Le mardi 21 mai 2013 11:52:15 UTC+2, Noel Grandin a écrit :
>>>
>>>  See the section title "Using a function as a table" here
>>> http://h2database.com/html/**features.html#user_defined_**functions<http://h2database.com/html/features.html#user_defined_functions>
>>>
>>> On 2013-05-21 10:07, Nicolas Fortin (OrbisGIS) wrote:
>>>  
>>> Discussion about user defined index on OTHER type.
>>>
>>> In spatial SQL the following request on an indexed geometry column would 
>>> use spatial index:
>>>
>>> select * from spatialTable where ST_Intersects(the_geom, 
>>>> ST_PolyFromText('POLYGON ((67 13, 67 18, 59 18, 59 13, 67 13))',1));
>>>>
>>>
>>> Usage of ST_Intersects filter the_geom field by using BoundingBox stored 
>>> index of the spatialTable, then the method is applied on filtered rows.
>>>
>>> Can I do this by creating my own TableEngine ? There is an easier way 
>>> without modifying the sql request ? Maybe a way to let special kind of 
>>> function to alter the execution plan ?
>>>
>>> Thanks for your support.
>>>  
>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "H2 Database" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to h2-database...@**googlegroups.com.
>>> To post to this group, send email to [email protected].
>>>
>>> Visit this group at 
>>> http://groups.google.com/**group/h2-database?hl=en<http://groups.google.com/group/h2-database?hl=en>
>>> .
>>> For more options, visit 
>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>> .
>>>  
>>>  
>>>
>>>
>>>   -- 
>> You received this message because you are subscribed to the Google Groups 
>> "H2 Database" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected]<javascript:>
>> .
>> Visit this group at http://groups.google.com/group/h2-database?hl=en.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>  
>>  
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/h2-database?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to