sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jso...@apache.org
Subject [sis] 03/03: SQL/MM : cleaning code
Date Wed, 27 Nov 2019 11:23:38 GMT
This is an automated email from the ASF dual-hosted git repository.

jsorel pushed a commit to branch feat/sqlmm
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 1dac05559ab7a2eb0135d6d9dd8864c61d888878
Author: jsorel <johann.sorel@geomatys.com>
AuthorDate: Wed Nov 27 12:22:49 2019 +0100

    SQL/MM : cleaning code
---
 .../AbstractAccessorSpatialFunction.java           |  5 +-
 .../{todo => }/AbstractBinarySpatialFunction.java  |  2 +-
 .../sqlmm/{todo => }/AbstractGeomConstructor.java  |  9 ++-
 .../sqlmm/{todo => }/AbstractSpatialFunction.java  | 47 ++++++++++++-
 .../apache/sis/internal/filter/sqlmm/SQLMM.java    | 55 ---------------
 .../internal/filter/sqlmm/{todo => }/ST_Area.java  |  4 +-
 .../filter/sqlmm/{todo => }/ST_AsBinary.java       |  8 +--
 .../internal/filter/sqlmm/{todo => }/ST_AsGML.java |  4 +-
 .../filter/sqlmm/{todo => }/ST_AsText.java         |  4 +-
 .../filter/sqlmm/{todo => }/ST_Boundary.java       | 10 +--
 .../sis/internal/filter/sqlmm/ST_Buffer.java       |  9 +++
 .../sis/internal/filter/sqlmm/ST_Centroid.java     | 12 ++++
 .../filter/sqlmm/{todo => }/ST_Contains.java       |  4 +-
 .../filter/sqlmm/{todo => }/ST_ConvexHull.java     | 10 +--
 .../filter/sqlmm/{todo => }/ST_CoordDim.java       |  4 +-
 .../filter/sqlmm/{todo => }/ST_Crosses.java        |  4 +-
 .../filter/sqlmm/{todo => }/ST_Difference.java     | 10 +--
 .../filter/sqlmm/{todo => }/ST_Dimension.java      |  4 +-
 .../filter/sqlmm/{todo => }/ST_Disjoint.java       |  2 +-
 .../filter/sqlmm/{todo => }/ST_Distance.java       |  4 +-
 .../filter/sqlmm/{todo => }/ST_EndPoint.java       |  9 ++-
 .../filter/sqlmm/{todo => }/ST_Equals.java         |  4 +-
 .../filter/sqlmm/{todo => }/ST_ExplicitPoint.java  |  4 +-
 .../filter/sqlmm/{todo => }/ST_ExteriorRing.java   | 10 +--
 .../filter/sqlmm/{todo => }/ST_GeomCollection.java | 11 +--
 .../filter/sqlmm/{todo => }/ST_GeometryN.java      | 10 +--
 .../filter/sqlmm/{todo => }/ST_GeometryType.java   |  8 +--
 .../filter/sqlmm/{todo => }/ST_InteriorRingN.java  | 10 +--
 .../filter/sqlmm/{todo => }/ST_Intersection.java   | 10 +--
 .../filter/sqlmm/{todo => }/ST_Intersects.java     |  7 +-
 .../internal/filter/sqlmm/{todo => }/ST_Is3D.java  |  7 +-
 .../filter/sqlmm/{todo => }/ST_IsClosed.java       |  4 +-
 .../filter/sqlmm/{todo => }/ST_IsEmpty.java        |  4 +-
 .../filter/sqlmm/{todo => }/ST_IsRing.java         |  4 +-
 .../filter/sqlmm/{todo => }/ST_IsSimple.java       |  4 +-
 .../filter/sqlmm/{todo => }/ST_IsValid.java        |  4 +-
 .../filter/sqlmm/{todo => }/ST_Length.java         |  4 +-
 .../sqlmm/{todo => }/ST_MultiLineString.java       | 11 +--
 .../filter/sqlmm/{todo => }/ST_MultiPoint.java     | 11 +--
 .../filter/sqlmm/{todo => }/ST_MultiPolygon.java   | 11 +--
 .../filter/sqlmm/{todo => }/ST_NumGeometries.java  |  4 +-
 .../sqlmm/{todo => }/ST_NumInteriorRings.java      |  4 +-
 .../filter/sqlmm/{todo => }/ST_NumPoints.java      |  4 +-
 .../filter/sqlmm/{todo => }/ST_Overlaps.java       |  4 +-
 .../filter/sqlmm/{todo => }/ST_Perimeter.java      |  4 +-
 .../filter/sqlmm/{todo => }/ST_PointN.java         | 10 +--
 .../filter/sqlmm/{todo => }/ST_PointOnSurface.java | 10 +--
 .../filter/sqlmm/{todo => }/ST_Polygon.java        |  4 +-
 .../filter/sqlmm/{todo => }/ST_Relate.java         |  4 +-
 .../internal/filter/sqlmm/{todo => }/ST_SRID.java  |  4 +-
 .../filter/sqlmm/{todo => }/ST_StartPoint.java     |  9 ++-
 .../filter/sqlmm/{todo => }/ST_SymDifference.java  | 10 +--
 .../filter/sqlmm/{todo => }/ST_Touches.java        |  4 +-
 .../internal/filter/sqlmm/{todo => }/ST_Union.java | 10 +--
 .../filter/sqlmm/{todo => }/ST_Within.java         |  4 +-
 .../sis/internal/filter/sqlmm/{todo => }/ST_X.java |  4 +-
 .../filter/sqlmm/{todo => }/ST_XFromBinary.java    |  4 +-
 .../filter/sqlmm/{todo => }/ST_XFromGML.java       |  4 +-
 .../filter/sqlmm/{todo => }/ST_XFromText.java      |  4 +-
 .../sis/internal/filter/sqlmm/{todo => }/ST_Y.java |  4 +-
 .../sis/internal/filter/sqlmm/{todo => }/ST_Z.java |  4 +-
 .../sis/internal/filter/sqlmm/todo/ST_Buffer.java  | 78 ----------------------
 .../internal/filter/sqlmm/todo/ST_Centroid.java    | 69 -------------------
 .../internal/filter/sqlmm/todo/ST_Envelope.java    | 66 ------------------
 .../internal/filter/sqlmm/todo/ST_LineString.java  | 10 +--
 .../sis/internal/filter/sqlmm/todo/ST_Point.java   |  1 +
 .../internal/filter/sqlmm/todo/ST_ToGeomColl.java  |  1 +
 .../filter/sqlmm/todo/ST_ToLineString.java         |  1 +
 .../internal/filter/sqlmm/todo/ST_ToMultiLine.java |  1 +
 .../filter/sqlmm/todo/ST_ToMultiPoint.java         |  1 +
 .../filter/sqlmm/todo/ST_ToMultiPolygon.java       |  1 +
 .../sis/internal/filter/sqlmm/todo/ST_ToPoint.java |  1 +
 .../internal/filter/sqlmm/todo/ST_ToPolygon.java   |  1 +
 73 files changed, 252 insertions(+), 450 deletions(-)

diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractAccessorSpatialFunction.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractAccessorSpatialFunction.java
similarity index 95%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractAccessorSpatialFunction.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractAccessorSpatialFunction.java
index 2c4963a..202f66d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractAccessorSpatialFunction.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractAccessorSpatialFunction.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -25,6 +25,9 @@ import org.opengis.filter.expression.Expression;
  * Spatial methods accessing properties of a geometry.
  *
  * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since 2.0
+ * @module
  */
 public abstract class AbstractAccessorSpatialFunction<T extends Geometry> extends AbstractSpatialFunction {
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractBinarySpatialFunction.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractBinarySpatialFunction.java
similarity index 98%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractBinarySpatialFunction.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractBinarySpatialFunction.java
index 773db54..6ee163e 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractBinarySpatialFunction.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractBinarySpatialFunction.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomConstructor.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractGeomConstructor.java
similarity index 84%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomConstructor.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractGeomConstructor.java
index 2b0e111..dec365d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomConstructor.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractGeomConstructor.java
@@ -14,10 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.apache.sis.internal.filter.FilterGeometryUtils;
 import org.locationtech.jts.geom.Geometry;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -68,4 +71,8 @@ public abstract class AbstractGeomConstructor extends AbstractSpatialFunction {
         return geom;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(getExpectedClass()).setName(getName());
+    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractSpatialFunction.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractSpatialFunction.java
similarity index 51%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractSpatialFunction.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractSpatialFunction.java
index a33913c..e6e98f5 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractSpatialFunction.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/AbstractSpatialFunction.java
@@ -14,22 +14,32 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
+import java.util.Map;
+import org.apache.sis.feature.Features;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.internal.feature.AttributeConvention;
 import org.apache.sis.internal.feature.FeatureExpression;
+import org.apache.sis.internal.feature.jts.JTS;
 import org.apache.sis.internal.filter.NamedFunction;
+import org.locationtech.jts.geom.Geometry;
+import org.opengis.feature.AttributeType;
+import org.opengis.feature.FeatureType;
+import org.opengis.feature.PropertyType;
 import org.opengis.filter.expression.Expression;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
 
 /**
  *
  * @author Johann Sorel (Geomatys)
  * @version 2.0
- * @since   2.0
+ * @since 2.0
  * @module
  */
 public abstract class AbstractSpatialFunction extends NamedFunction implements FeatureExpression {
 
-    public AbstractSpatialFunction(Expression[] parameters){
+    public AbstractSpatialFunction(Expression[] parameters) {
         super(parameters);
     }
 
@@ -69,4 +79,35 @@ public abstract class AbstractSpatialFunction extends NamedFunction implements F
 
         return sb.toString();
     }
+    
+    protected static CoordinateReferenceSystem expectedCrs(FeatureType type, Expression exp) {
+
+        final PropertyType expressionType = FeatureExpression.expectedType(exp, type, new FeatureTypeBuilder()).build();
+        final AttributeType<?> attr = Features.castOrUnwrap(expressionType).orElse(null);
+        if (attr == null) {
+            return null;
+        }
+
+        final AttributeType<CoordinateReferenceSystem> crsCharacteristic = (AttributeType<CoordinateReferenceSystem>)
+                attr.characteristics().get(AttributeConvention.CRS_CHARACTERISTIC);
+        return crsCharacteristic == null ? null : crsCharacteristic.getDefaultValue();
+    }
+
+    protected static void copyCrs(Geometry source, Geometry target) {
+        if (source == null || target == null) return;
+
+        final Object userData = source.getUserData();
+        CoordinateReferenceSystem crs = null;
+        if (userData instanceof CoordinateReferenceSystem) {
+            crs = (CoordinateReferenceSystem) userData;
+        } else if (userData instanceof Map<?,?>) {
+            final Map<?,?> map = (Map<?,?>) userData;
+            final Object value = map.get(JTS.CRS_KEY);
+            if (value instanceof CoordinateReferenceSystem) {
+                crs = (CoordinateReferenceSystem) value;
+            }
+        }
+        target.setUserData(crs);
+        target.setSRID(source.getSRID());
+    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/SQLMM.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/SQLMM.java
index bf11527..e59ed55 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/SQLMM.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/SQLMM.java
@@ -23,51 +23,6 @@ import org.opengis.filter.expression.Function;
 import org.opengis.util.FactoryException;
 import org.apache.sis.internal.feature.FunctionRegister;
 import org.apache.sis.internal.feature.Resources;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_ExteriorRing;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_InteriorRingN;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_NumInteriorRings;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_EndPoint;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_IsClosed;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_IsRing;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Length;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_StartPoint;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_GeometryN;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_NumGeometries;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_NumPoints;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_PointN;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_ExplicitPoint;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_X;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Y;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Z;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_AsBinary;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_AsGML;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_AsText;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Boundary;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Contains;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_ConvexHull;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_CoordDim;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Crosses;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Difference;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Dimension;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Disjoint;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Distance;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Equals;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_GeomCollection;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_GeometryType;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Intersection;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Intersects;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Is3D;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_IsEmpty;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_IsSimple;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_IsValid;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_MultiLineString;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_MultiPoint;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_MultiPolygon;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Overlaps;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Polygon;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Relate;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_SRID;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_SymDifference;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_ToGeomColl;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_ToLineString;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_ToMultiLine;
@@ -75,16 +30,6 @@ import org.apache.sis.internal.filter.sqlmm.todo.ST_ToMultiPoint;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_ToMultiPolygon;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_ToPoint;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_ToPolygon;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Touches;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Union;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Within;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_XFromBinary;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_XFromGML;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_XFromText;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Area;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Centroid;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_Perimeter;
-import org.apache.sis.internal.filter.sqlmm.todo.ST_PointOnSurface;
 import org.apache.sis.util.ArgumentChecks;
 
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Area.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Area.java
similarity index 94%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Area.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Area.java
index ddf3463..4af564b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Area.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Area.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -34,7 +34,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Area extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_Area extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_Area";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsBinary.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_AsBinary.java
similarity index 87%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsBinary.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_AsBinary.java
index a8801d2..2fcfb94 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsBinary.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_AsBinary.java
@@ -14,10 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
-import org.locationtech.jts.io.WKBWriter;
 import java.text.ParseException;
 import org.apache.sis.feature.builder.FeatureTypeBuilder;
 import org.apache.sis.feature.builder.PropertyTypeBuilder;
@@ -34,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_AsBinary extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_AsBinary extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_AsBinary";
 
@@ -54,8 +53,7 @@ public final class ST_AsBinary extends AbstractAccessorSpatialFunction<Geometry>
 
     @Override
     public Object execute(Geometry geom, Object... params) throws ParseException {
-        final WKBWriter writer = FilterGeometryUtils.getWKBWriter();
-        return writer.write(geom);
+        return FilterGeometryUtils.getWKBWriter().write(geom);
     }
 
     @Override
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_AsGML.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsGML.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_AsGML.java
index 66b267d..94cf609 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsGML.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_AsGML.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -32,7 +32,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_AsGML extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_AsGML extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_AsGML";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_AsText.java
similarity index 94%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsText.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_AsText.java
index e839d1b..64de78b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsText.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_AsText.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.io.WKTWriter;
@@ -34,7 +34,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_AsText extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_AsText extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_AsText";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Boundary.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Boundary.java
similarity index 86%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Boundary.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Boundary.java
index 54501a2..f700498 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Boundary.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Boundary.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Boundary extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_Boundary extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_Boundary";
 
@@ -54,13 +54,15 @@ public final class ST_Boundary extends AbstractAccessorSpatialFunction<Geometry>
     @Override
     public Object execute(Geometry geom, Object... params) throws ParseException {
         final Geometry bound = geom.getBoundary();
-        bound.setSRID(geom.getSRID());
+        copyCrs(geom, bound);
         return bound;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Geometry.class).setName(NAME);
+        return addTo.addAttribute(Geometry.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Buffer.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Buffer.java
index b84c18b..b24c25d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Buffer.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Buffer.java
@@ -28,8 +28,17 @@ import org.opengis.filter.expression.Expression;
 
 
 /**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Buffer. <br>
+ * <p>
+ * Return the ST_Geometry value that represents all points whose distance from any point of an ST_Geometry
+ * value is less than or equal to a specified distance, ignoring z and m coordinate values in the calculations and
+ * not including them in the resultant geometry.
+ * </p>
+ *
+ * <p>
  * An expression which computes a geometry buffer.
  * This expression expects two arguments:
+ * </p>
  *
  * <ol class="verbose">
  *   <li>An expression returning a geometry object. The evaluated value shall be an instance of
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Centroid.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Centroid.java
index 525b04f..f2f2b3b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Centroid.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Centroid.java
@@ -28,8 +28,20 @@ import org.opengis.filter.expression.Expression;
 
 
 /**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Centroid. <br>
+ * <p>
+ * Return the 2D ST_Point value that is the mathematical centroid of the ST_Surface value, ignoring z and m
+ * coordinate values in the calculations and not including them in the resultant geometry.
+ * </p>
+ *
+ * <p>
+ * This class should be for all surface types, but JTS only has Polygon and MultiPolygon.
+ * </p>
+ *
+ * <p>
  * An expression which computes the centroid of a geometry.
  * This expression expects one argument:
+ * </p>
  *
  * <ol class="verbose">
  *   <li>An expression returning a geometry object. The evaluated value shall be an instance of
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Contains.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Contains.java
similarity index 94%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Contains.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Contains.java
index 9f83dea..52ebb89 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Contains.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Contains.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Contains extends AbstractBinarySpatialFunction {
+final class ST_Contains extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Contains";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ConvexHull.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_ConvexHull.java
similarity index 86%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ConvexHull.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_ConvexHull.java
index baa32da..f23d0b9 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ConvexHull.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_ConvexHull.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_ConvexHull extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_ConvexHull extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_ConvexHull";
 
@@ -54,13 +54,15 @@ public final class ST_ConvexHull extends AbstractAccessorSpatialFunction<Geometr
     @Override
     public Object execute(Geometry geom, Object... params) throws ParseException {
         final Geometry res = geom.convexHull();
-        res.setSRID(geom.getSRID());
+        copyCrs(geom, res);
         return res;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Geometry.class).setName(NAME);
+        return addTo.addAttribute(Geometry.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_CoordDim.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_CoordDim.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_CoordDim.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_CoordDim.java
index 39ecf9b..3b4927b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_CoordDim.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_CoordDim.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Geometry;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since 2.0
  * @module
  */
-public final class ST_CoordDim extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_CoordDim extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_CoordDim";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Crosses.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Crosses.java
similarity index 94%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Crosses.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Crosses.java
index 957b709..f42f6d9 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Crosses.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Crosses.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Crosses extends AbstractBinarySpatialFunction {
+final class ST_Crosses extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Crosses";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Difference.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Difference.java
similarity index 87%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Difference.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Difference.java
index f1d0c9c..1a1cf6f 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Difference.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Difference.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Difference extends AbstractBinarySpatialFunction {
+final class ST_Difference extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Difference";
 
@@ -49,13 +49,15 @@ public final class ST_Difference extends AbstractBinarySpatialFunction {
     @Override
     public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
         final Geometry res = left.difference(right);
-        res.setSRID(left.getSRID());
+        copyCrs(left, res);
         return res;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Geometry.class).setName(NAME);
+        return addTo.addAttribute(Geometry.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Dimension.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Dimension.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Dimension.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Dimension.java
index f197595..772b9e1 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Dimension.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Dimension.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -32,7 +32,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Dimension extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_Dimension extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_Dimension";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Disjoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Disjoint.java
similarity index 97%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Disjoint.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Disjoint.java
index ec6116e..ac69e1a 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Disjoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Disjoint.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Distance.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Distance.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Distance.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Distance.java
index 5ab2c7c..d69bb48 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Distance.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Distance.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -32,7 +32,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Distance extends AbstractBinarySpatialFunction {
+final class ST_Distance extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Distance";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_EndPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_EndPoint.java
similarity index 87%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_EndPoint.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_EndPoint.java
index fe176b1..43ff1ce 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_EndPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_EndPoint.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.LineString;
 import org.locationtech.jts.geom.Point;
@@ -34,7 +34,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_EndPoint extends AbstractAccessorSpatialFunction<LineString> {
+final class ST_EndPoint extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_EndPoint";
 
@@ -55,12 +55,15 @@ public final class ST_EndPoint extends AbstractAccessorSpatialFunction<LineStrin
     @Override
     public Object execute(LineString geom, Object... params) throws ParseException {
         final Point pt = geom.getEndPoint();
+        copyCrs(geom, pt);
         return pt;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Point.class).setName(NAME);
+        return addTo.addAttribute(Point.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Equals.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Equals.java
similarity index 94%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Equals.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Equals.java
index 842fbd1..ccc35b7 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Equals.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Equals.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Equals extends AbstractBinarySpatialFunction {
+final class ST_Equals extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Equals";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExplicitPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_ExplicitPoint.java
similarity index 94%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExplicitPoint.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_ExplicitPoint.java
index e45e474..acb7a57 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExplicitPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_ExplicitPoint.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Point;
@@ -35,7 +35,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_ExplicitPoint extends AbstractAccessorSpatialFunction<Point> {
+final class ST_ExplicitPoint extends AbstractAccessorSpatialFunction<Point> {
 
     public static final String NAME = "ST_ExplicitPoint";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExteriorRing.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_ExteriorRing.java
similarity index 86%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExteriorRing.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_ExteriorRing.java
index 4dd6631..cd57969 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExteriorRing.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_ExteriorRing.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.LineString;
 import org.locationtech.jts.geom.Polygon;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_ExteriorRing extends AbstractAccessorSpatialFunction<Polygon> {
+final class ST_ExteriorRing extends AbstractAccessorSpatialFunction<Polygon> {
 
     public static final String NAME = "ST_ExteriorRing";
 
@@ -54,12 +54,14 @@ public final class ST_ExteriorRing extends AbstractAccessorSpatialFunction<Polyg
     @Override
     public Object execute(Polygon geom, Object... params) throws ParseException {
         final LineString ring = geom.getExteriorRing();
-        ring.setSRID(geom.getSRID());
+        copyCrs(geom, ring);
         return ring;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(LineString.class).setName(NAME);
+        return addTo.addAttribute(LineString.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollection.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_GeomCollection.java
similarity index 74%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollection.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_GeomCollection.java
index f5169b9..c41f9c9 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollection.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_GeomCollection.java
@@ -14,12 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
-import org.apache.sis.feature.builder.FeatureTypeBuilder;
-import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.locationtech.jts.geom.GeometryCollection;
-import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -30,7 +27,7 @@ import org.opengis.filter.expression.Expression;
  * @since 2.0
  * @module
  */
-public final class ST_GeomCollection extends AbstractGeomConstructor {
+final class ST_GeomCollection extends AbstractGeomConstructor {
 
     public static final String NAME = "ST_GeomCollection";
 
@@ -48,8 +45,4 @@ public final class ST_GeomCollection extends AbstractGeomConstructor {
         return GeometryCollection.class;
     }
 
-    @Override
-    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(GeometryCollection.class).setName(NAME);
-    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryN.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_GeometryN.java
similarity index 87%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryN.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_GeometryN.java
index 1705733..d35a51f 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryN.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_GeometryN.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_GeometryN extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_GeometryN extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_GeometryN";
 
@@ -65,13 +65,15 @@ public final class ST_GeometryN extends AbstractAccessorSpatialFunction<Geometry
     public Object execute(Geometry geom, Object... params) throws ParseException {
         final int index = Integer.parseInt(params[1].toString());
         final Geometry sub = geom.getGeometryN(index-1);
-        sub.setSRID(geom.getSRID());
+        copyCrs(geom, sub);
         return sub;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Geometry.class).setName(NAME);
+        return addTo.addAttribute(Geometry.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryType.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_GeometryType.java
similarity index 92%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryType.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_GeometryType.java
index dceffe1..9d3105f 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryType.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_GeometryType.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryCollection;
@@ -42,7 +42,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_GeometryType extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_GeometryType extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_GeometryType";
 
@@ -74,8 +74,8 @@ public final class ST_GeometryType extends AbstractAccessorSpatialFunction<Geome
 
     @Override
     public Object execute(Geometry geom, Object... params) throws ParseException {
-        for(Entry<Class,String> entry : TYPES.entrySet()){
-            if(entry.getKey().isInstance(geom)){
+        for (Entry<Class,String> entry : TYPES.entrySet()) {
+            if (entry.getKey().isInstance(geom)) {
                 return entry.getValue();
             }
         }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_InteriorRingN.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_InteriorRingN.java
similarity index 87%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_InteriorRingN.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_InteriorRingN.java
index 0050168..162525b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_InteriorRingN.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_InteriorRingN.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.LineString;
 import org.locationtech.jts.geom.Polygon;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_InteriorRingN extends AbstractAccessorSpatialFunction<Polygon> {
+final class ST_InteriorRingN extends AbstractAccessorSpatialFunction<Polygon> {
 
     public static final String NAME = "ST_InteriorRingN";
 
@@ -55,12 +55,14 @@ public final class ST_InteriorRingN extends AbstractAccessorSpatialFunction<Poly
     public Object execute(Polygon geom, Object... params) throws ParseException {
         final int index = Integer.parseInt(params[1].toString());
         final LineString ring = geom.getInteriorRingN(index-1);
-        ring.setSRID(geom.getSRID());
+        copyCrs(geom, ring);
         return ring;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(LineString.class).setName(NAME);
+        return addTo.addAttribute(LineString.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersection.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Intersection.java
similarity index 87%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersection.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Intersection.java
index 5bed5d5..c8d43a7 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersection.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Intersection.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Intersection extends AbstractBinarySpatialFunction {
+final class ST_Intersection extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Intersection";
 
@@ -49,13 +49,15 @@ public final class ST_Intersection extends AbstractBinarySpatialFunction {
     @Override
     public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
         final Geometry res = left.intersection(right);
-        res.setSRID(left.getSRID());
+        copyCrs(left, res);
         return res;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Geometry.class).setName(NAME);
+        return addTo.addAttribute(Geometry.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersects.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Intersects.java
similarity index 91%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersects.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Intersects.java
index 5588af2..c814c3d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersects.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Intersects.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -26,15 +26,14 @@ import org.opengis.filter.expression.Expression;
 /**
  * SQL/MM, ISO/IEC 13249-3:2011, ST_Intersects. <br>
  * Test if an ST_Geometry value spatially 2D intersects another ST_Geometry value, ignoring z and m
-coordinate values in the calculations.
-
+ * coordinate values in the calculations.
  *
  * @author Johann Sorel (Geomatys)
  * @version 2.0
  * @since   2.0
  * @module
  */
-public final class ST_Intersects extends AbstractBinarySpatialFunction {
+final class ST_Intersects extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Intersects";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Is3D.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Is3D.java
similarity index 92%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Is3D.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Is3D.java
index 6383e54..8f746d6 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Is3D.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Is3D.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Geometry;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Is3D extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_Is3D extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_Is3D";
 
@@ -54,10 +54,9 @@ public final class ST_Is3D extends AbstractAccessorSpatialFunction<Geometry> {
     @Override
     public Object execute(Geometry geom, Object... params) throws ParseException {
         final Coordinate c = geom.getCoordinate();
-        if(c != null){
+        if (c != null) {
             return !Double.isNaN(c.z);
         }
-
         return null;
     }
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsClosed.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsClosed.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsClosed.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsClosed.java
index 6cea4a3..9d687ef 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsClosed.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsClosed.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.LineString;
 import java.text.ParseException;
@@ -34,7 +34,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_IsClosed extends AbstractAccessorSpatialFunction<LineString> {
+final class ST_IsClosed extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_IsClosed";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsEmpty.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsEmpty.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsEmpty.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsEmpty.java
index 0cb3ad7..553e3c7 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsEmpty.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsEmpty.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -32,7 +32,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_IsEmpty extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_IsEmpty extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_IsEmpty";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsRing.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsRing.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsRing.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsRing.java
index 509189c..3410f17 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsRing.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsRing.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.LineString;
 import java.text.ParseException;
@@ -34,7 +34,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_IsRing extends AbstractAccessorSpatialFunction<LineString> {
+final class ST_IsRing extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_IsRing";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsSimple.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsSimple.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsSimple.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsSimple.java
index 1829d26..02f683f 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsSimple.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsSimple.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_IsSimple extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_IsSimple extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_IsSimple";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsValid.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsValid.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsValid.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsValid.java
index 66098df..6fa6c83 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsValid.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_IsValid.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -32,7 +32,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_IsValid extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_IsValid extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_IsValid";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Length.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Length.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Length.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Length.java
index efeb4d8..f4a498b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Length.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Length.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -34,7 +34,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Length extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_Length extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_Length";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiLineString.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_MultiLineString.java
similarity index 74%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiLineString.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_MultiLineString.java
index 003b81f..0b3c08e 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiLineString.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_MultiLineString.java
@@ -14,12 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
-import org.apache.sis.feature.builder.FeatureTypeBuilder;
-import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.locationtech.jts.geom.MultiLineString;
-import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -30,7 +27,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_MultiLineString extends AbstractGeomConstructor{
+final class ST_MultiLineString extends AbstractGeomConstructor{
 
     public static final String NAME = "ST_MultiLineString";
 
@@ -48,8 +45,4 @@ public final class ST_MultiLineString extends AbstractGeomConstructor{
         return MultiLineString.class;
     }
 
-    @Override
-    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(MultiLineString.class).setName(NAME);
-    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_MultiPoint.java
similarity index 74%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPoint.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_MultiPoint.java
index 9ad8f16..666d5cb 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_MultiPoint.java
@@ -14,12 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
-import org.apache.sis.feature.builder.FeatureTypeBuilder;
-import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.locationtech.jts.geom.MultiPoint;
-import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -30,7 +27,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_MultiPoint extends AbstractGeomConstructor{
+final class ST_MultiPoint extends AbstractGeomConstructor {
 
     public static final String NAME = "ST_MultiPoint";
 
@@ -48,8 +45,4 @@ public final class ST_MultiPoint extends AbstractGeomConstructor{
         return MultiPoint.class;
     }
 
-    @Override
-    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(MultiPoint.class).setName(NAME);
-    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPolygon.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_MultiPolygon.java
similarity index 74%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPolygon.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_MultiPolygon.java
index c42b40e..fcf1910 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPolygon.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_MultiPolygon.java
@@ -14,12 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
-import org.apache.sis.feature.builder.FeatureTypeBuilder;
-import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.locationtech.jts.geom.MultiPolygon;
-import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -30,7 +27,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_MultiPolygon extends AbstractGeomConstructor{
+final class ST_MultiPolygon extends AbstractGeomConstructor{
 
     public static final String NAME = "ST_MultiPolygon";
 
@@ -48,8 +45,4 @@ public final class ST_MultiPolygon extends AbstractGeomConstructor{
         return MultiPolygon.class;
     }
 
-    @Override
-    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(MultiPolygon.class).setName(NAME);
-    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumGeometries.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_NumGeometries.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumGeometries.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_NumGeometries.java
index 19a0f99..ce756c4 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumGeometries.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_NumGeometries.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -32,7 +32,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_NumGeometries extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_NumGeometries extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_NumGeometries";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumInteriorRings.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_NumInteriorRings.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumInteriorRings.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_NumInteriorRings.java
index 03ff827..2deb6d2 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumInteriorRings.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_NumInteriorRings.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Polygon;
 import java.text.ParseException;
@@ -34,7 +34,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_NumInteriorRings extends AbstractAccessorSpatialFunction<Polygon> {
+final class ST_NumInteriorRings extends AbstractAccessorSpatialFunction<Polygon> {
 
     public static final String NAME = "ST_NumInteriorRings";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumPoints.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_NumPoints.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumPoints.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_NumPoints.java
index 1bd3fc0..1db8341 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumPoints.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_NumPoints.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.LineString;
 import java.text.ParseException;
@@ -32,7 +32,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_NumPoints extends AbstractAccessorSpatialFunction<LineString> {
+final class ST_NumPoints extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_NumPoints";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Overlaps.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Overlaps.java
similarity index 94%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Overlaps.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Overlaps.java
index 4e5af3c..1691931 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Overlaps.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Overlaps.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Overlaps extends AbstractBinarySpatialFunction {
+final class ST_Overlaps extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Overlaps";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Perimeter.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Perimeter.java
similarity index 94%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Perimeter.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Perimeter.java
index e5b6055..583960e 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Perimeter.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Perimeter.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -35,7 +35,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Perimeter extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_Perimeter extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_Perimeter";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointN.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_PointN.java
similarity index 88%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointN.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_PointN.java
index dcb3cc6..aec35ee 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointN.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_PointN.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.LineString;
 import org.locationtech.jts.geom.Point;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_PointN extends AbstractAccessorSpatialFunction<LineString> {
+final class ST_PointN extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_PointN";
 
@@ -65,13 +65,15 @@ public final class ST_PointN extends AbstractAccessorSpatialFunction<LineString>
     public Object execute(LineString geom, Object... params) throws ParseException {
         final int index = Integer.parseInt(params[1].toString());
         final Point pt = geom.getPointN(index-1);
-        pt.setSRID(geom.getSRID());
+        copyCrs(geom, pt);
         return pt;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Point.class).setName(NAME);
+        return addTo.addAttribute(Point.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointOnSurface.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_PointOnSurface.java
similarity index 87%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointOnSurface.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_PointOnSurface.java
index d3984d9..d683875 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointOnSurface.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_PointOnSurface.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -36,7 +36,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_PointOnSurface extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_PointOnSurface extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_PointOnSurface";
 
@@ -57,13 +57,15 @@ public final class ST_PointOnSurface extends AbstractAccessorSpatialFunction<Geo
     @Override
     public Object execute(Geometry geom, Object... params) throws ParseException {
         final Geometry pt = geom.getInteriorPoint();
-        pt.setSRID(geom.getSRID());
+        copyCrs(geom, pt);
         return pt;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Point.class).setName(NAME);
+        return addTo.addAttribute(Point.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Polygon.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Polygon.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Polygon.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Polygon.java
index d3c80a8..4cc0c6d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Polygon.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Polygon.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.apache.sis.feature.builder.FeatureTypeBuilder;
 import org.apache.sis.feature.builder.PropertyTypeBuilder;
@@ -30,7 +30,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Polygon extends AbstractGeomConstructor{
+final class ST_Polygon extends AbstractGeomConstructor {
 
     public static final String NAME = "ST_Polygon";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Relate.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Relate.java
similarity index 94%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Relate.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Relate.java
index 440733d..71b6202 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Relate.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Relate.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Relate extends AbstractBinarySpatialFunction {
+final class ST_Relate extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Relate";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SRID.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_SRID.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SRID.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_SRID.java
index b7cb29f..29b822e 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SRID.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_SRID.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -32,7 +32,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_SRID extends AbstractAccessorSpatialFunction<Geometry> {
+final class ST_SRID extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_SRID";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_StartPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_StartPoint.java
similarity index 87%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_StartPoint.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_StartPoint.java
index 0d2c365..039136b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_StartPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_StartPoint.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.LineString;
 import org.locationtech.jts.geom.Point;
@@ -36,7 +36,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_StartPoint extends AbstractAccessorSpatialFunction<LineString> {
+final class ST_StartPoint extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_StartPoint";
 
@@ -57,12 +57,15 @@ public final class ST_StartPoint extends AbstractAccessorSpatialFunction<LineStr
     @Override
     public Object execute(LineString geom, Object... params) throws ParseException {
         final Point pt = geom.getStartPoint();
+        copyCrs(geom, pt);
         return pt;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Point.class).setName(NAME);
+        return addTo.addAttribute(Point.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SymDifference.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_SymDifference.java
similarity index 87%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SymDifference.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_SymDifference.java
index 981f540..3c49b1b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SymDifference.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_SymDifference.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_SymDifference extends AbstractBinarySpatialFunction {
+final class ST_SymDifference extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_SymDifference";
 
@@ -49,13 +49,15 @@ public final class ST_SymDifference extends AbstractBinarySpatialFunction {
     @Override
     public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
         final Geometry res = left.symDifference(right);
-        res.setSRID(left.getSRID());
+        copyCrs(left, res);
         return res;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Geometry.class).setName(NAME);
+        return addTo.addAttribute(Geometry.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Touches.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Touches.java
similarity index 94%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Touches.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Touches.java
index 495c937..da02b37 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Touches.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Touches.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Touches extends AbstractBinarySpatialFunction {
+final class ST_Touches extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Touches";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Union.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Union.java
similarity index 87%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Union.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Union.java
index 4d88999..6d678d7 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Union.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Union.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Union extends AbstractBinarySpatialFunction {
+final class ST_Union extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Union";
 
@@ -49,13 +49,15 @@ public final class ST_Union extends AbstractBinarySpatialFunction {
     @Override
     public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
         final Geometry res = left.union(right);
-        res.setSRID(left.getSRID());
+        copyCrs(left, res);
         return res;
     }
 
     @Override
     public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Geometry.class).setName(NAME);
+        return addTo.addAttribute(Geometry.class)
+                .setCRS(expectedCrs(valueType, parameters.get(0)))
+                .setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Within.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Within.java
similarity index 94%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Within.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Within.java
index c02e972..1578ee4 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Within.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Within.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
@@ -33,7 +33,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Within extends AbstractBinarySpatialFunction {
+final class ST_Within extends AbstractBinarySpatialFunction {
 
     public static final String NAME = "ST_Within";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_X.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_X.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_X.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_X.java
index 4fe1946..06c74e3 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_X.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_X.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
@@ -32,7 +32,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_X extends AbstractAccessorSpatialFunction<Point> {
+final class ST_X extends AbstractAccessorSpatialFunction<Point> {
 
     public static final String NAME = "ST_X";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromBinary.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_XFromBinary.java
similarity index 98%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromBinary.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_XFromBinary.java
index 10c26bc..447f857 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromBinary.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_XFromBinary.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.apache.sis.feature.builder.FeatureTypeBuilder;
 import org.apache.sis.feature.builder.PropertyTypeBuilder;
@@ -37,7 +37,7 @@ import org.opengis.filter.expression.Expression;
  * @since 2.0
  * @module
  */
-public abstract class ST_XFromBinary extends AbstractSpatialFunction {
+abstract class ST_XFromBinary extends AbstractSpatialFunction {
 
     public ST_XFromBinary(Expression[] parameters) {
         super(parameters);
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_XFromGML.java
similarity index 98%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromGML.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_XFromGML.java
index 4929a7a..0dea7f1 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromGML.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_XFromGML.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.apache.sis.feature.builder.FeatureTypeBuilder;
 import org.apache.sis.feature.builder.PropertyTypeBuilder;
@@ -35,7 +35,7 @@ import org.opengis.filter.expression.Expression;
  * @since 2.0
  * @module
  */
-public abstract class ST_XFromGML extends AbstractSpatialFunction {
+abstract class ST_XFromGML extends AbstractSpatialFunction {
 
     public ST_XFromGML(Expression[] parameters) {
         super(parameters);
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_XFromText.java
similarity index 98%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromText.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_XFromText.java
index bfa5bba..fde7086 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromText.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_XFromText.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.apache.sis.feature.builder.FeatureTypeBuilder;
 import org.apache.sis.feature.builder.PropertyTypeBuilder;
@@ -37,7 +37,7 @@ import org.opengis.filter.expression.Expression;
  * @since 2.0
  * @module
  */
-public abstract class ST_XFromText extends AbstractSpatialFunction {
+abstract class ST_XFromText extends AbstractSpatialFunction {
 
     public ST_XFromText(Expression[] parameters) {
         super(parameters);
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Y.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Y.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Y.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Y.java
index 3adfb18..fde489d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Y.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Y.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
@@ -32,7 +32,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Y extends AbstractAccessorSpatialFunction<Point> {
+final class ST_Y extends AbstractAccessorSpatialFunction<Point> {
 
     public static final String NAME = "ST_Y";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Z.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Z.java
similarity index 93%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Z.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Z.java
index ac4fa05..a14a0d2 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Z.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Z.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm.todo;
+package org.apache.sis.internal.filter.sqlmm;
 
 import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
@@ -32,7 +32,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_Z extends AbstractAccessorSpatialFunction<Point> {
+final class ST_Z extends AbstractAccessorSpatialFunction<Point> {
 
     public static final String NAME = "ST_Z";
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Buffer.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Buffer.java
deleted file mode 100644
index 66c7a3d..0000000
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Buffer.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sis.internal.filter.sqlmm.todo;
-
-import org.locationtech.jts.geom.Geometry;
-import java.text.ParseException;
-import org.apache.sis.feature.builder.FeatureTypeBuilder;
-import org.apache.sis.feature.builder.PropertyTypeBuilder;
-import org.opengis.feature.FeatureType;
-import org.opengis.filter.expression.Expression;
-
-/**
- * SQL/MM, ISO/IEC 13249-3:2011, ST_Buffer. <br>
- * Return the ST_Geometry value that represents all points whose distance from any point of an ST_Geometry
- * value is less than or equal to a specified distance, ignoring z and m coordinate values in the calculations and
- * not including them in the resultant geometry.
- *
- * @author Johann Sorel (Geomatys)
- * @version 2.0
- * @since   2.0
- * @module
- */
-public final class ST_Buffer extends AbstractAccessorSpatialFunction<Geometry> {
-
-    public static final String NAME = "ST_Buffer";
-
-    public ST_Buffer(Expression[] parameters) {
-        super(parameters);
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    protected int getMinParams() {
-        return 2;
-    }
-
-    @Override
-    protected int getMaxParams() {
-        return 2;
-    }
-
-    @Override
-    protected Class<Geometry> getExpectedClass() {
-        return Geometry.class;
-    }
-
-    @Override
-    public Object execute(Geometry geom, Object... params) throws ParseException {
-        final double distance = Double.parseDouble(params[1].toString());
-        final Geometry res = geom.buffer(distance);
-        res.setSRID(geom.getSRID());
-        return res;
-    }
-
-    @Override
-    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Geometry.class).setName(NAME);
-    }
-
-}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Centroid.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Centroid.java
deleted file mode 100644
index 37900b9..0000000
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Centroid.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sis.internal.filter.sqlmm.todo;
-
-import org.locationtech.jts.geom.Geometry;
-import java.text.ParseException;
-import org.apache.sis.feature.builder.FeatureTypeBuilder;
-import org.apache.sis.feature.builder.PropertyTypeBuilder;
-import org.locationtech.jts.geom.Point;
-import org.opengis.feature.FeatureType;
-import org.opengis.filter.expression.Expression;
-
-/**
- * SQL/MM, ISO/IEC 13249-3:2011, ST_Centroid. <br>
- * Return the 2D ST_Point value that is the mathematical centroid of the ST_Surface value, ignoring z and m
- * coordinate values in the calculations and not including them in the resultant geometry.
- *
- * This class should be for all surface types, but JTS only has Polygon and MultiPolygon.
- *
- * @author Johann Sorel (Geomatys)
- * @version 2.0
- * @since   2.0
- * @module
- */
-public final class ST_Centroid extends AbstractAccessorSpatialFunction<Geometry> {
-
-    public static final String NAME = "ST_Centroid";
-
-    public ST_Centroid(Expression[] parameters) {
-        super(parameters);
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    protected Class<Geometry> getExpectedClass() {
-        return Geometry.class;
-    }
-
-    @Override
-    public Object execute(Geometry geom, Object... params) throws ParseException {
-        final Geometry centroid = geom.getCentroid();
-        centroid.setSRID(geom.getSRID());
-        return centroid;
-    }
-
-    @Override
-    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Point.class).setName(NAME);
-    }
-
-}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Envelope.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Envelope.java
deleted file mode 100644
index e1aa429..0000000
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Envelope.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sis.internal.filter.sqlmm.todo;
-
-import org.locationtech.jts.geom.Geometry;
-import java.text.ParseException;
-import org.apache.sis.feature.builder.FeatureTypeBuilder;
-import org.apache.sis.feature.builder.PropertyTypeBuilder;
-import org.opengis.feature.FeatureType;
-import org.opengis.filter.expression.Expression;
-
-/**
- * SQL/MM, ISO/IEC 13249-3:2011, ST_Envelope. <br>
- * Return the bounding rectangle for the ST_Geometry value, ignoring z and m coordinate values in the
- * calculations and not including them in the resultant geometry.
- *
- * @author Johann Sorel (Geomatys)
- * @version 2.0
- * @since   2.0
- * @module
- */
-public final class ST_Envelope extends AbstractAccessorSpatialFunction<Geometry> {
-
-    public static final String NAME = "ST_Envelope";
-
-    public ST_Envelope(Expression[] parameters) {
-        super(parameters);
-    }
-
-    @Override
-    public String getName() {
-        return NAME;
-    }
-
-    @Override
-    protected Class<Geometry> getExpectedClass() {
-        return Geometry.class;
-    }
-
-    @Override
-    public Object execute(Geometry geom, Object... params) throws ParseException {
-        final Geometry env = geom.getEnvelope();
-        env.setSRID(geom.getSRID());
-        return env;
-    }
-
-    @Override
-    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(Geometry.class).setName(NAME);
-    }
-
-}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineString.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineString.java
index cf510e6..e6e19b1 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineString.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineString.java
@@ -16,10 +16,8 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
-import org.apache.sis.feature.builder.FeatureTypeBuilder;
-import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.apache.sis.internal.filter.sqlmm.AbstractGeomConstructor;
 import org.locationtech.jts.geom.LineString;
-import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -30,7 +28,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class ST_LineString extends AbstractGeomConstructor{
+public final class ST_LineString extends AbstractGeomConstructor {
 
     public static final String NAME = "ST_LineString";
 
@@ -48,8 +46,4 @@ public final class ST_LineString extends AbstractGeomConstructor{
         return LineString.class;
     }
 
-    @Override
-    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
-        return addTo.addAttribute(LineString.class).setName(NAME);
-    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Point.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Point.java
index d999efc..20cced9 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Point.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Point.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.internal.filter.sqlmm.AbstractSpatialFunction;
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.io.ParseException;
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToGeomColl.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToGeomColl.java
index 85ec72a..5adef19 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToGeomColl.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToGeomColl.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.internal.filter.sqlmm.AbstractAccessorSpatialFunction;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryCollection;
 import java.text.ParseException;
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToLineString.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToLineString.java
index c796631..cbcbec6 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToLineString.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToLineString.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.internal.filter.sqlmm.AbstractAccessorSpatialFunction;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.LineString;
 import java.text.ParseException;
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiLine.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiLine.java
index 1e8e89d..edd8aa5 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiLine.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiLine.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.internal.filter.sqlmm.AbstractAccessorSpatialFunction;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.MultiLineString;
 import java.text.ParseException;
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPoint.java
index c99b1ee..f3265f6 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPoint.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.internal.filter.sqlmm.AbstractAccessorSpatialFunction;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.MultiPoint;
 import java.text.ParseException;
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPolygon.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPolygon.java
index decf11c..48caf60 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPolygon.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPolygon.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.internal.filter.sqlmm.AbstractAccessorSpatialFunction;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.MultiPolygon;
 import java.text.ParseException;
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPoint.java
index bcfba87..3b92b7b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPoint.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.internal.filter.sqlmm.AbstractAccessorSpatialFunction;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPolygon.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPolygon.java
index 83ec999..d495501 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPolygon.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPolygon.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.internal.filter.sqlmm.AbstractAccessorSpatialFunction;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.Polygon;
 import java.text.ParseException;


Mime
View raw message