package mil.nga.giat.geowave.core.store.query; import java.nio.ByteBuffer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.index.MultiDimensionalCoordinateRangesArray; import mil.nga.giat.geowave.core.index.MultiDimensionalCoordinateRangesArray.ArrayOfArrays; import mil.nga.giat.geowave.core.index.MultiDimensionalCoordinates; import mil.nga.giat.geowave.core.index.NumericIndexStrategy; import mil.nga.giat.geowave.core.index.PersistenceUtils; import mil.nga.giat.geowave.core.store.data.IndexedPersistenceEncoding; import mil.nga.giat.geowave.core.store.filter.DistributableQueryFilter; import mil.nga.giat.geowave.core.store.index.CommonIndexModel; import mil.nga.giat.geowave.core.store.query.CoordinateRangeUtils.RangeCache; import mil.nga.giat.geowave.core.store.query.CoordinateRangeUtils.RangeLookupFactory; public class CoordinateRangeQueryFilter implements DistributableQueryFilter { private final static Logger LOGGER = LoggerFactory.getLogger(CoordinateRangeQueryFilter.class); protected NumericIndexStrategy indexStrategy; protected RangeCache rangeCache; protected MultiDimensionalCoordinateRangesArray[] coordinateRanges; protected CoordinateRangeQueryFilter() {} public CoordinateRangeQueryFilter( final NumericIndexStrategy indexStrategy, final MultiDimensionalCoordinateRangesArray[] coordinateRanges ) { this.indexStrategy = indexStrategy; this.coordinateRanges = coordinateRanges; rangeCache = RangeLookupFactory.createMultiRangeLookup(coordinateRanges); } @Override public boolean accept( final CommonIndexModel indexModel, final IndexedPersistenceEncoding<?> persistenceEncoding ) { if ((persistenceEncoding == null) || (persistenceEncoding.getIndexInsertionId() == null)) { return false; } return inBounds(persistenceEncoding.getIndexInsertionId()); } private boolean inBounds( final ByteArrayId insertionId ) { final MultiDimensionalCoordinates coordinates = indexStrategy.getCoordinatesPerDimension(insertionId); return rangeCache.inBounds(coordinates); } @Override public byte[] toBinary() { final byte[] indexStrategyBytes = PersistenceUtils.toBinary(indexStrategy); final byte[] coordinateRangesBinary = new ArrayOfArrays( coordinateRanges).toBinary(); final ByteBuffer buf = ByteBuffer.allocate(coordinateRangesBinary.length + indexStrategyBytes.length + 4); buf.putInt(indexStrategyBytes.length); buf.put(indexStrategyBytes); buf.put(coordinateRangesBinary); return buf.array(); } @Override public void fromBinary( final byte[] bytes ) { final ByteBuffer buf = ByteBuffer.wrap(bytes); try { final int indexStrategyLength = buf.getInt(); final byte[] indexStrategyBytes = new byte[indexStrategyLength]; buf.get(indexStrategyBytes); indexStrategy = PersistenceUtils.fromBinary( indexStrategyBytes, NumericIndexStrategy.class); final byte[] coordRangeBytes = new byte[bytes.length - indexStrategyLength - 4]; buf.get(coordRangeBytes); final ArrayOfArrays arrays = new ArrayOfArrays(); arrays.fromBinary(coordRangeBytes); coordinateRanges = arrays.getCoordinateArrays(); rangeCache = RangeLookupFactory.createMultiRangeLookup(coordinateRanges); } catch (final Exception e) { LOGGER.warn( "Unable to read parameters", e); } } }