package se.kodapan.osm.domain.root.indexed;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
/**
* Created by kalle on 10/19/13.
*/
public class WayEnvelopeQueryFactoryImpl extends WayEnvelopeQueryFactory<Query> {
public Query build() {
if (getSouthLatitude() >= getNorthLatitude()) {
throw new IllegalArgumentException("south must be less than north");
}
if (getWestLongitude() >= getEastLongitude()) {
throw new IllegalArgumentException("west must be less than east");
}
BooleanQuery bq = new BooleanQuery();
BooleanQuery sw = new BooleanQuery();
sw.add(new BooleanClause(NumericRangeQuery.newDoubleRange("way.envelope.south_latitude", 4, getSouthLatitude(), getNorthLatitude(), true, true), BooleanClause.Occur.MUST));
sw.add(new BooleanClause(NumericRangeQuery.newDoubleRange("way.envelope.west_longitude", 4, getWestLongitude(), getEastLongitude(), true, true), BooleanClause.Occur.MUST));
bq.add(sw, BooleanClause.Occur.SHOULD);
BooleanQuery se = new BooleanQuery();
se.add(new BooleanClause(NumericRangeQuery.newDoubleRange("way.envelope.south_latitude", 4, getSouthLatitude(), getNorthLatitude(), true, true), BooleanClause.Occur.MUST));
se.add(new BooleanClause(NumericRangeQuery.newDoubleRange("way.envelope.east_longitude", 4, getWestLongitude(), getEastLongitude(), true, true), BooleanClause.Occur.MUST));
bq.add(se, BooleanClause.Occur.SHOULD);
BooleanQuery ne = new BooleanQuery();
ne.add(new BooleanClause(NumericRangeQuery.newDoubleRange("way.envelope.north_latitude", 4, getSouthLatitude(), getNorthLatitude(), true, true), BooleanClause.Occur.MUST));
ne.add(new BooleanClause(NumericRangeQuery.newDoubleRange("way.envelope.east_longitude", 4, getWestLongitude(), getEastLongitude(), true, true), BooleanClause.Occur.MUST));
bq.add(ne, BooleanClause.Occur.SHOULD);
BooleanQuery nw = new BooleanQuery();
nw.add(new BooleanClause(NumericRangeQuery.newDoubleRange("way.envelope.north_latitude", 4, getSouthLatitude(), getNorthLatitude(), true, true), BooleanClause.Occur.MUST));
nw.add(new BooleanClause(NumericRangeQuery.newDoubleRange("way.envelope.west_longitude", 4, getWestLongitude(), getEastLongitude(), true, true), BooleanClause.Occur.MUST));
bq.add(nw, BooleanClause.Occur.SHOULD);
return bq;
}
}