Looks good; can you create a JIRA with your nice picture, and then apply 
your patch. It would also be really good if you can create a test case 
showing your F / A / B problem and the fact that your patch fixes it.

Jody

> Hi list,
>
> I have been spending all day to figure out where a bug in my feature 
> cache is coming from.
> The bug is the cache does not return a small number of features that a 
> reference FeatureSource does return (I am using MemoryDataStore as a 
> reference). What the cache does is it enlarges a query to match the 
> tiles of a grid.
>
> I think I found the cause of this unexpected behaviour in class BBOXImpl :
>
> public boolean evaluate(Object feature) {
>
> if (feature instanceof Feature && !validate((Feature)feature))
>             return false;
>        
>         Geometry left = getLeftGeometry(feature);
>         Geometry right = getRightGeometry(feature);
>        
>         Envelope envLeft = left.getEnvelopeInternal();
>         Envelope envRight = right.getEnvelopeInternal();
>        
>          if(envRight.contains(envLeft) || envLeft.contains(envRight)) {
>              return true;
>          } else if(envRight.intersects(envLeft)) {
>
>              return left.intersects(right); // this is where things 
> may go wrong
>
>          } else {
>              return false;
>          }
> }
>
> You can find cases where a bbox A containing another bbox B will 
> evaluate to false a feature that bbox B evaluate to true.
>
> I enclose a drawing showing such a case.
>
> As bbox don't have to be real precise, we don't care about the actule 
> intersection of geometries, and the following patch should work fine :
>
> if (feature instanceof Feature && !validate((Feature)feature))
>             return false;
>        
>         Geometry left = getLeftGeometry(feature);
>         Geometry right = getRightGeometry(feature);
>        
>         Envelope envLeft = left.getEnvelopeInternal();
>         Envelope envRight = right.getEnvelopeInternal();
>        
>          if(envRight.contains(envLeft) || envLeft.contains(envRight)) {
>              return true;
>          } else {
>              return envRight.intersects(envLeft); // changed here
>                                                                  // 
> may be we can keep this only test ??
>          }
> }
>
>
> ------------------------------------------------------------------------
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems?  Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >>  http://get.splunk.com/
> ------------------------------------------------------------------------
>
> _______________________________________________
> Geotools-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/geotools-devel
>   


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Geotools-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-devel

Reply via email to