@Override public Query makeQuery(SpatialArgs args) { final SpatialOperation op = args.getOperation(); Shape shape = args.getShape(); int detailLevel = grid.getLevelForDistance(args.resolveDistErr(ctx, distErrPct)); if (op == SpatialOperation.Intersects) { return new IntersectsPrefixTreeQuery( shape, getFieldName(), grid, detailLevel, prefixGridScanLevel); } else if (op == SpatialOperation.IsWithin) { return new WithinPrefixTreeQuery( shape, getFieldName(), grid, detailLevel, prefixGridScanLevel, -1);//-1 flag is slower but ensures correct results } else if (op == SpatialOperation.Contains) { return new ContainsPrefixTreeQuery(shape, getFieldName(), grid, detailLevel, multiOverlappingIndexedShapes); } throw new UnsupportedSpatialOperation(op); } }
/** {@link #makeQuery(SpatialArgs)} specialized for the query being a grid square. */ protected Query makeGridShapeIntersectsQuery(Shape gridShape) { assert isGridAlignedShape(gridShape); if (isPointsOnly()) { // Awesome; this will be equivalent to a TermQuery. Iterator<Cell> cellIterator = grid.getTreeCellIterator(gridShape, grid.getMaxLevels()); // get last cell Cell cell = cellIterator.next(); while (cellIterator.hasNext()) { int prevLevel = cell.getLevel(); cell = cellIterator.next(); assert prevLevel < cell.getLevel(); } assert cell.isLeaf(); return new TermQuery(new Term(getFieldName(), cell.getTokenBytesWithLeaf(null))); } else { // Well there could be parent cells. But we can reduce the "scan level" which will be slower for a point query. // TODO: AVPTQ will still scan the bottom nonetheless; file an issue to eliminate that return new IntersectsPrefixTreeQuery( gridShape, getFieldName(), grid, getGrid().getMaxLevels(), getGrid().getMaxLevels() + 1); } } }
@Override public Query makeQuery(SpatialArgs args) { final SpatialOperation op = args.getOperation(); Shape shape = args.getShape(); int detailLevel = grid.getLevelForDistance(args.resolveDistErr(ctx, distErrPct)); if (op == SpatialOperation.Intersects) { if (isGridAlignedShape(args.getShape())) { return makeGridShapeIntersectsQuery(args.getShape()); } return new IntersectsPrefixTreeQuery( shape, getFieldName(), grid, detailLevel, prefixGridScanLevel); } else if (op == SpatialOperation.IsWithin) { return new WithinPrefixTreeQuery( shape, getFieldName(), grid, detailLevel, prefixGridScanLevel, -1);//-1 flag is slower but ensures correct results } else if (op == SpatialOperation.Contains) { return new ContainsPrefixTreeQuery(shape, getFieldName(), grid, detailLevel, multiOverlappingIndexedShapes); } throw new UnsupportedSpatialOperation(op); }
return new IntersectsRPTVerifyQuery(args.getShape(), indexStrategy.getFieldName(), grid, detailLevel, indexStrategy.getPrefixGridScanLevel(), predicateValueSource); } else {
return new IntersectsRPTVerifyQuery(args.getShape(), indexStrategy.getFieldName(), grid, detailLevel, indexStrategy.getPrefixGridScanLevel(), predicateValueSource); } else {