public Query MakeQuery(Query existingQuery, SpatialStrategy spatialStrategy, string shapeWKT, SpatialRelation relation,
double distanceErrorPct = 0.025, SpatialUnits? unitOverride = null)
{
SpatialOperation spatialOperation;
var shape = ReadShape(shapeWKT, unitOverride);
switch (relation)
{
case SpatialRelation.Within:
spatialOperation = SpatialOperation.IsWithin;
break;
case SpatialRelation.Contains:
spatialOperation = SpatialOperation.Contains;
break;
case SpatialRelation.Disjoint:
spatialOperation = SpatialOperation.IsDisjointTo;
break;
case SpatialRelation.Intersects:
spatialOperation = SpatialOperation.Intersects;
break;
case SpatialRelation.Nearby:
// only sort by this, do not filter
return new FunctionQuery(spatialStrategy.MakeDistanceValueSource(shape.GetCenter()));
default:
throw new ArgumentOutOfRangeException("relation");
}
var args = new SpatialArgs(spatialOperation, shape) { DistErrPct = distanceErrorPct };
if (existingQuery is MatchAllDocsQuery)
return new CustomScoreQuery(spatialStrategy.MakeQuery(args), new ValueSourceQuery(spatialStrategy.MakeRecipDistanceValueSource(shape)));
return spatialStrategy.MakeQuery(args);
}