/** * Tries to extract an {@link Envelope} from the query {@link Filter} that can be used as a pre-filtering step to * narrow the result set. * <p> * The returned {@link Envelope} is determined by the following strategy: * <ul> * <li>If the filter is an {@link OperatorFilter}, it is attempted to extract an {@link BBOX} constraint from it.</li> * <li>If no {@link BBOX} constraint can be extracted from the filter (not presented or nested in <code>Or</code> or * <code>Not</code> expressions, <code>null</code> is returned.</li> * </ul> * </p> * * @return a {@link Envelope} suitable for pre-filtering feature candidates, can be <code>null</code> */ public Envelope getPrefilterBBoxEnvelope() { BBOX bbox = extractPrefilterBBoxConstraint( filter ); if ( bbox == null ) { return null; } return bbox.getBoundingBox(); }
private static BBOX merge( BBOX bbox1, BBOX bbox2 ) { // TODO handle different SRS Envelope env = bbox1.getBoundingBox().merge( bbox2.getBoundingBox() ); Expression expr = bbox1.getParam1(); if ( expr == null || !expr.equals( bbox2.getParam1() ) ) { expr = null; } return new BBOX( expr, env ); }
/** * @param filter * can be null * @return the reverse of #addBBoxConstraint */ public static Pair<Filter, Envelope> splitOffBBoxConstraint( Filter filter ) { Pair<Filter, Envelope> p = new Pair<Filter, Envelope>(); if ( filter instanceof OperatorFilter ) { OperatorFilter f = (OperatorFilter) filter; if ( f.getOperator() instanceof BBOX ) { p.second = ( (BBOX) f.getOperator() ).getBoundingBox(); } else if ( f.getOperator() instanceof And && ( (And) f.getOperator() ).getParams()[0] instanceof BBOX ) { Operator[] ops = ( (And) f.getOperator() ).getParams(); p.second = ( (BBOX) ops[0] ).getBoundingBox(); if ( ops.length == 2 ) { p.first = new OperatorFilter( ops[1] ); } else { p.first = new OperatorFilter( new And( Arrays.copyOfRange( ops, 1, ops.length - 1 ) ) ); } } else { p.first = filter; } } else { p.first = filter; } return p; }
switch ( operator.getSubType() ) { case BBOX: geometry = ( (BBOX) operator ).getBoundingBox(); break; case BEYOND:
geometry = ( (BBOX) operator ).getBoundingBox(); break; case BEYOND:
builder.add( toProtoSQL( bbox.getBoundingBox(), storageCRS, srid ) ); if ( !bbox.getAllowFalsePositives() ) { builder.add( " AND " ); builder.add( toProtoSQL( bbox.getBoundingBox(), storageCRS, srid ) ); builder.add( "))" );
BBOX bbox = (BBOX) op; builder.add( propNameExpr ).add( ".STIntersects(" ); builder.add( toProtoSQL( bbox.getBoundingBox(), storageCRS, srid ) ); builder.add( ")=1" ); break;
case BBOX: BBOX bbox = (BBOX) op; Envelope env = bbox.getBoundingBox(); Envelope newEnv = gf.createEnvelope( env.getMin().get0(), env.getMin().get1(), env.getMax().get0(), env.getMax().get0(), env.getCoordinateSystem() );