protected override bool ExpressionToQuery(SqlDaQuery queryToAddTo, IExpression expr,
ClassMapping mapping, string colPrefix, string booleanOperator)
{
// All the spatial expressions we support modify the sql.
bool retVal = true;
bool trueOrNot = expr.TrueOrNot();
if (expr is IntersectsExpression)
{
queryToAddTo.Sql.Append(booleanOperator);
IntersectsExpression intersects = (IntersectsExpression)expr;
queryToAddTo.Sql.Append("ST_Intersects(ST_GeomFromEWKT(?),");
queryToAddTo.Params.Add(_ewktWriter.Write(intersects.Shape));
queryToAddTo.Sql.Append(colPrefix).Append(mapping.AllDataColsByObjAttrs[intersects.Property]);
queryToAddTo.Sql.Append(")");
}
else if (expr is WithinExpression)
{
queryToAddTo.Sql.Append(booleanOperator);
WithinExpression within = (WithinExpression)expr;
queryToAddTo.Sql.Append("ST_Contains(ST_GeomFromEWKT(?),");
queryToAddTo.Params.Add(_ewktWriter.Write(within.Shape));
queryToAddTo.Sql.Append(colPrefix).Append(mapping.AllDataColsByObjAttrs[within.Property]);
queryToAddTo.Sql.Append(")");
}
else if (expr is ContainsExpression)
{
queryToAddTo.Sql.Append(booleanOperator);
ContainsExpression contains = (ContainsExpression)expr;
queryToAddTo.Sql.Append("ST_Contains(");
queryToAddTo.Sql.Append(colPrefix).Append(mapping.AllDataColsByObjAttrs[contains.Property]);
queryToAddTo.Sql.Append(",ST_GeomFromEWKT(?)");
queryToAddTo.Params.Add(_ewktWriter.Write(contains.Shape));
queryToAddTo.Sql.Append(")");
}
else if (expr is AbstractDistanceExpression)
{
queryToAddTo.Sql.Append(booleanOperator);
AbstractDistanceExpression dist = (AbstractDistanceExpression)expr;
queryToAddTo.Sql.Append("ST_Distance(");
queryToAddTo.Sql.Append(colPrefix).Append(mapping.AllDataColsByObjAttrs[dist.Property]);
queryToAddTo.Sql.Append(", ST_GeomFromEWKT(?))");
queryToAddTo.Params.Add(EWKTWriter.ToPoint((IPoint)dist.Shape));
if (dist is LesserDistanceExpression)
{
queryToAddTo.Sql.Append(trueOrNot ? " < ?" : " >= ?");
}
else if (expr is GreaterDistanceExpression)
{
queryToAddTo.Sql.Append(trueOrNot ? " > ?" : " <= ?");
}
else
{
throw new ArgumentException("Distance expression type " +
expr.GetType() + " not supported.", "expr");
}
queryToAddTo.Params.Add(dist.Distance);
}
else if (expr is AbstractDistanceSphereExpression)
{
queryToAddTo.Sql.Append(booleanOperator);
AbstractDistanceSphereExpression dist = (AbstractDistanceSphereExpression)expr;
if (!(dist.Shape is IPoint))
{
throw new ArgumentException("Spherical distance from a non-point is not supported.");
}
queryToAddTo.Sql.Append("ST_distance_sphere(");
queryToAddTo.Sql.Append(colPrefix).Append(mapping.AllDataColsByObjAttrs[dist.Property]);
queryToAddTo.Sql.Append(", ST_GeomFromEWKT(?))");
queryToAddTo.Params.Add(EWKTWriter.ToPoint((IPoint)dist.Shape));
if (dist is LesserDistanceSphereExpression)
{
queryToAddTo.Sql.Append(trueOrNot ? " < ?" : " >= ?");
}
else if (expr is GreaterDistanceSphereExpression)
{
queryToAddTo.Sql.Append(trueOrNot ? " > ?" : " <= ?");
}
else
{
throw new ArgumentException("Distance expression type " +
expr.GetType() + " not supported.", "expr");
}
queryToAddTo.Params.Add(dist.Distance);
}
else
{
// Fall back to the stuff supported by the base class.
retVal = base.ExpressionToQuery(queryToAddTo, expr, mapping, colPrefix, booleanOperator);
}
return retVal;
}