sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jso...@apache.org
Subject [sis] 02/02: SQL/MM : add all specification expressions
Date Tue, 26 Nov 2019 14:09:22 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 4815c99491c97c877b766e2ef0b8133c0471d353
Author: jsorel <johann.sorel@geomatys.com>
AuthorDate: Tue Nov 26 15:08:18 2019 +0100

    SQL/MM : add all specification expressions
---
 .../org/apache/sis/filter/SpatialFunction.java     | 220 +++-------------
 .../sis/internal/filter/FilterGeometryUtils.java   | 283 +++++++++++++++++++++
 .../sqlmm/todo/AbstractAccessorSpatialMethod.java  |  61 +++++
 .../sqlmm/todo/AbstractBinarySpatialMethod.java    |  85 +++++++
 .../filter/sqlmm/todo/AbstractGeomConstructor.java |  71 ++++++
 .../filter/sqlmm/todo/AbstractGeomFromBinary.java  |  70 +++++
 .../filter/sqlmm/todo/AbstractGeomFromGML.java     |  79 ++++++
 .../filter/sqlmm/todo/AbstractGeomFromText.java    |  69 +++++
 .../filter/sqlmm/todo/AbstractSpatialFunction.java |  51 ++++
 .../filter/sqlmm/todo/AbstractSpatialMethod.java   |  90 +++++++
 .../sqlmm/todo/CurvePolygon_ST_ExteriorRing.java   |  57 +++++
 .../sqlmm/todo/CurvePolygon_ST_InteriorRingN.java  |  58 +++++
 .../todo/CurvePolygon_ST_NumInteriorRings.java     |  47 ++++
 .../filter/sqlmm/todo/Curve_ST_EndPoint.java       |  48 ++++
 .../filter/sqlmm/todo/Curve_ST_IsClosed.java       |  47 ++++
 .../filter/sqlmm/todo/Curve_ST_IsRing.java         |  47 ++++
 .../filter/sqlmm/todo/Curve_ST_Length.java         |  56 ++++
 .../filter/sqlmm/todo/Curve_ST_StartPoint.java     |  50 ++++
 .../filter/sqlmm/todo/GeomColl_ST_GeometryN.java   |  49 ++++
 .../sqlmm/todo/GeomColl_ST_NumGeometries.java      |  45 ++++
 .../filter/sqlmm/todo/Line_ST_NumPoints.java       |  45 ++++
 .../internal/filter/sqlmm/todo/Line_ST_PointN.java |  49 ++++
 .../filter/sqlmm/todo/Point_ST_ExplicitPoint.java  |  53 ++++
 .../sis/internal/filter/sqlmm/todo/Point_ST_X.java |  45 ++++
 .../sis/internal/filter/sqlmm/todo/Point_ST_Y.java |  45 ++++
 .../sis/internal/filter/sqlmm/todo/Point_ST_Z.java |  45 ++++
 .../internal/filter/sqlmm/todo/ST_AsBinary.java    |  48 ++++
 .../sis/internal/filter/sqlmm/todo/ST_AsGML.java   |  73 ++++++
 .../sis/internal/filter/sqlmm/todo/ST_AsText.java  |  48 ++++
 .../filter/sqlmm/todo/ST_BdMPolyFromText.java      |  63 +++++
 .../filter/sqlmm/todo/ST_BdMPolyFromWKB.java       |  64 +++++
 .../filter/sqlmm/todo/ST_BdPolyFromText.java       |  61 +++++
 .../filter/sqlmm/todo/ST_BdPolyFromWKB.java        |  61 +++++
 .../internal/filter/sqlmm/todo/ST_Boundary.java    |  48 ++++
 .../sis/internal/filter/sqlmm/todo/ST_Buffer.java  |  50 ++++
 .../internal/filter/sqlmm/todo/ST_Contains.java    |  46 ++++
 .../internal/filter/sqlmm/todo/ST_ConvexHull.java  |  48 ++++
 .../internal/filter/sqlmm/todo/ST_CoordDim.java    |  51 ++++
 .../sis/internal/filter/sqlmm/todo/ST_Crosses.java |  47 ++++
 .../internal/filter/sqlmm/todo/ST_Difference.java  |  48 ++++
 .../internal/filter/sqlmm/todo/ST_Dimension.java   |  45 ++++
 .../internal/filter/sqlmm/todo/ST_Disjoint.java    |  46 ++++
 .../internal/filter/sqlmm/todo/ST_Distance.java    |  46 ++++
 .../internal/filter/sqlmm/todo/ST_Envelope.java    |  48 ++++
 .../sis/internal/filter/sqlmm/todo/ST_Equals.java  |  46 ++++
 .../filter/sqlmm/todo/ST_GeomCollFromGML.java      |  40 +++
 .../filter/sqlmm/todo/ST_GeomCollFromText.java     |  40 +++
 .../filter/sqlmm/todo/ST_GeomCollFromWKB.java      |  40 +++
 .../filter/sqlmm/todo/ST_GeomCollection.java       |  38 +++
 .../internal/filter/sqlmm/todo/ST_GeomFromGML.java |  40 +++
 .../filter/sqlmm/todo/ST_GeomFromText.java         |  40 +++
 .../internal/filter/sqlmm/todo/ST_GeomFromWKB.java |  40 +++
 .../filter/sqlmm/todo/ST_GeometryType.java         |  72 ++++++
 .../filter/sqlmm/todo/ST_Intersection.java         |  48 ++++
 .../internal/filter/sqlmm/todo/ST_Intersects.java  |  47 ++++
 .../sis/internal/filter/sqlmm/todo/ST_Is3D.java    |  51 ++++
 .../sis/internal/filter/sqlmm/todo/ST_IsEmpty.java |  45 ++++
 .../internal/filter/sqlmm/todo/ST_IsSimple.java    |  46 ++++
 .../sis/internal/filter/sqlmm/todo/ST_IsValid.java |  45 ++++
 .../internal/filter/sqlmm/todo/ST_LineFromGML.java |  40 +++
 .../filter/sqlmm/todo/ST_LineFromText.java         |  40 +++
 .../internal/filter/sqlmm/todo/ST_LineFromWKB.java |  40 +++
 .../internal/filter/sqlmm/todo/ST_LineString.java  |  38 +++
 .../filter/sqlmm/todo/ST_MLineFromGML.java         |  40 +++
 .../filter/sqlmm/todo/ST_MLineFromText.java        |  40 +++
 .../filter/sqlmm/todo/ST_MLineFromWKB.java         |  40 +++
 .../filter/sqlmm/todo/ST_MPointFromGML.java        |  40 +++
 .../filter/sqlmm/todo/ST_MPointFromText.java       |  40 +++
 .../filter/sqlmm/todo/ST_MPointFromWKB.java        |  40 +++
 .../filter/sqlmm/todo/ST_MPolyFromGML.java         |  40 +++
 .../filter/sqlmm/todo/ST_MPolyFromText.java        |  40 +++
 .../filter/sqlmm/todo/ST_MPolyFromWKB.java         |  40 +++
 .../filter/sqlmm/todo/ST_MultiLineString.java      |  38 +++
 .../internal/filter/sqlmm/todo/ST_MultiPoint.java  |  38 +++
 .../filter/sqlmm/todo/ST_MultiPolygon.java         |  38 +++
 .../internal/filter/sqlmm/todo/ST_Overlaps.java    |  46 ++++
 .../sis/internal/filter/sqlmm/todo/ST_Point.java   | 107 ++++++++
 .../filter/sqlmm/todo/ST_PointFromGML.java         |  40 +++
 .../filter/sqlmm/todo/ST_PointFromText.java        |  40 +++
 .../filter/sqlmm/todo/ST_PointFromWKB.java         |  40 +++
 .../internal/filter/sqlmm/todo/ST_PolyFromGML.java |  40 +++
 .../filter/sqlmm/todo/ST_PolyFromText.java         |  40 +++
 .../internal/filter/sqlmm/todo/ST_PolyFromWKB.java |  40 +++
 .../sis/internal/filter/sqlmm/todo/ST_Polygon.java |  38 +++
 .../sis/internal/filter/sqlmm/todo/ST_Relate.java  |  47 ++++
 .../sis/internal/filter/sqlmm/todo/ST_SRID.java    |  45 ++++
 .../filter/sqlmm/todo/ST_SymDifference.java        |  48 ++++
 .../internal/filter/sqlmm/todo/ST_ToGeomColl.java  |  48 ++++
 .../filter/sqlmm/todo/ST_ToLineString.java         |  48 ++++
 .../internal/filter/sqlmm/todo/ST_ToMultiLine.java |  48 ++++
 .../filter/sqlmm/todo/ST_ToMultiPoint.java         |  48 ++++
 .../filter/sqlmm/todo/ST_ToMultiPolygon.java       |  48 ++++
 .../sis/internal/filter/sqlmm/todo/ST_ToPoint.java |  48 ++++
 .../internal/filter/sqlmm/todo/ST_ToPolygon.java   |  48 ++++
 .../sis/internal/filter/sqlmm/todo/ST_Touches.java |  46 ++++
 .../internal/filter/sqlmm/todo/ST_Transform.java   |  61 +++++
 .../sis/internal/filter/sqlmm/todo/ST_Union.java   |  48 ++++
 .../sis/internal/filter/sqlmm/todo/ST_Within.java  |  46 ++++
 .../filter/sqlmm/todo/SpatialFunctionFactory.java  | 123 +++++++++
 .../filter/sqlmm/todo/SpatialMethodFactory.java    | 150 +++++++++++
 .../filter/sqlmm/todo/Surface_ST_Area.java         |  47 ++++
 .../filter/sqlmm/todo/Surface_ST_Centroid.java     |  50 ++++
 .../filter/sqlmm/todo/Surface_ST_Perimeter.java    |  49 ++++
 .../sqlmm/todo/Surface_ST_PointOnSurface.java      |  50 ++++
 104 files changed, 5504 insertions(+), 189 deletions(-)

diff --git a/core/sis-feature/src/main/java/org/apache/sis/filter/SpatialFunction.java b/core/sis-feature/src/main/java/org/apache/sis/filter/SpatialFunction.java
index c24f096..f7226b6 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/SpatialFunction.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/SpatialFunction.java
@@ -20,31 +20,17 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import javax.measure.Unit;
 import javax.measure.UnitConverter;
+import org.apache.sis.internal.filter.FilterGeometryUtils;
 
-import org.opengis.feature.Feature;
-import org.opengis.feature.PropertyNotFoundException;
 import org.opengis.filter.FilterVisitor;
 import org.opengis.filter.expression.Expression;
-import org.opengis.filter.expression.PropertyName;
 import org.opengis.filter.spatial.BinarySpatialOperator;
-import org.opengis.referencing.NoSuchAuthorityCodeException;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.operation.CoordinateOperation;
 import org.opengis.referencing.operation.TransformException;
 import org.opengis.util.FactoryException;
 
-import org.apache.sis.coverage.grid.GridCoverage;
-import org.apache.sis.internal.feature.AttributeConvention;
-import org.apache.sis.internal.feature.Geometries;
-import org.apache.sis.internal.feature.GeometryWrapper;
-import org.apache.sis.internal.feature.WrapResolution;
 import org.apache.sis.math.Fraction;
 import org.apache.sis.measure.Units;
-import org.apache.sis.referencing.CRS;
-import org.apache.sis.setup.GeometryLibrary;
-import org.apache.sis.util.ObjectConverters;
-import org.apache.sis.util.UnconvertibleObjectException;
-import org.apache.sis.util.Utilities;
 
 import org.locationtech.jts.geom.Geometry;
 
@@ -57,20 +43,6 @@ import org.locationtech.jts.geom.Geometry;
  */
 abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOperator {
 
-    private static CoordinateReferenceSystem MERCATOR;
-
-    /**
-     * TODO: We should generify this. But too much code already depends on JTS, so for now I hack this
-     */
-    private static final Geometries<Geometry> SIS_GEOMETRY_FACTORY = (Geometries<Geometry>) Geometries.implementation(GeometryLibrary.JTS);
-
-    private static CoordinateReferenceSystem getMercator() throws FactoryException {
-        if (MERCATOR == null) {
-            MERCATOR = CRS.forCode("EPSG:3395");
-        }
-        return MERCATOR;
-    }
-
     protected SpatialFunction(Expression expression1, Expression expression2) {
         super(expression1, expression2);
     }
@@ -100,136 +72,6 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
         throw new UnsupportedOperationException("Not supported.");
     }
 
-    private static Geometry toGeometry(final Object object, Expression exp) {
-        Object value = null;
-        if ((exp instanceof PropertyName) && object instanceof Feature && ((PropertyName) exp).getPropertyName().isEmpty()) {
-            //Search for a default geometry.
-            try {
-                value = ((Feature) object).getPropertyValue(AttributeConvention.GEOMETRY_PROPERTY.toString());
-            } catch (PropertyNotFoundException ex) {
-                //no defined default geometry
-            }
-        } else {
-            value = exp.evaluate(object);
-        }
-
-        if (value instanceof GeometryWrapper) value = ((GeometryWrapper) value).geometry;
-
-        Geometry candidate;
-        if (value instanceof GridCoverage) {
-            //use the coverage envelope
-            final GridCoverage coverage = (GridCoverage) value;
-            candidate = SIS_GEOMETRY_FACTORY.tryConvertToGeometry(coverage.getGridGeometry().getEnvelope(), WrapResolution.SPLIT);
-        } else {
-            try {
-                candidate = ObjectConverters.convert(value, Geometry.class);
-            } catch (UnconvertibleObjectException ex) {
-                //cound not convert value to a Geometry
-                candidate = null;
-            }
-        }
-        return candidate;
-    }
-
-    /**
-     * Reproject geometries to the same CRS if needed and if possible.
-     */
-    private static Geometry[] toSameCRS(final Geometry leftGeom, final Geometry rightGeom)
-            throws FactoryException, TransformException {
-
-        final CoordinateReferenceSystem leftCRS = Geometries.getCoordinateReferenceSystem(leftGeom);
-        final CoordinateReferenceSystem rightCRS = Geometries.getCoordinateReferenceSystem(rightGeom);
-
-        final CRSMatching.Match match = CRSMatching
-                .left(leftCRS)
-                .right(rightCRS);
-
-        final CRSMatching.Transformer<Geometry> projectGeom = (g, op) -> SIS_GEOMETRY_FACTORY.tryTransform(g, op, null);
-        return new Geometry[]{
-                match.transformLeftToCommon(leftGeom, projectGeom),
-                match.transformRightToCommon(rightGeom, projectGeom)
-        };
-    }
-
-    /**
-     * Reproject one or both geometries to the same crs, the matching crs will
-     * be compatible with the requested unit. return Array[leftGeometry,
-     * rightGeometry, matchingCRS];
-     */
-    private static Object[] toSameCRS(final Geometry leftGeom, final Geometry rightGeom, final Unit unit)
-            throws NoSuchAuthorityCodeException, FactoryException, TransformException {
-
-        final CoordinateReferenceSystem leftCRS = Geometries.getCoordinateReferenceSystem(leftGeom);
-        final CoordinateReferenceSystem rightCRS = Geometries.getCoordinateReferenceSystem(rightGeom);
-
-        if (leftCRS == null && rightCRS == null) {
-            //bother geometries doesn't have a defined SRID, we assume that both
-            //are in the same CRS
-            return new Object[]{leftGeom, rightGeom, null};
-        } else if (leftCRS == null || rightCRS == null || Utilities.equalsIgnoreMetadata(leftCRS, rightCRS)) {
-            //both are in the same CRS
-
-            final CoordinateReferenceSystem geomCRS = (leftCRS == null) ? rightCRS : leftCRS;
-
-            if (geomCRS.getCoordinateSystem().getAxis(0).getUnit().isCompatible(unit)) {
-                //the geometries crs is compatible with the requested unit, nothing to reproject
-                return new Object[]{leftGeom, rightGeom, geomCRS};
-            } else {
-                //the crs unit is not compatible, we must reproject both geometries to a more appropriate crs
-                if (Units.METRE.isCompatible(unit)) {
-                    //in that case we reproject to mercator EPSG:3395
-                    final CoordinateReferenceSystem mercator = getMercator();
-                    final CoordinateOperation trs = CRS.findOperation(geomCRS, mercator, null);
-
-                    return new Object[]{
-                        Geometries.transform(leftGeom, trs),
-                        Geometries.transform(rightGeom, trs),
-                        mercator};
-
-                } else {
-                    //we can not find a matching projection in this case
-                    throw new TransformException("Could not find a matching CRS for both geometries for unit :" + unit);
-                }
-            }
-
-        } else {
-            //both have different CRS, try to find the most appropriate crs amoung both
-
-            final CoordinateReferenceSystem matchingCRS;
-            final Object leftMatch;
-            final Object rightMatch;
-
-            if (leftCRS.getCoordinateSystem().getAxis(0).getUnit().isCompatible(unit)) {
-                matchingCRS = leftCRS;
-                final CoordinateOperation trs = CRS.findOperation(rightCRS, matchingCRS, null);
-                rightMatch = Geometries.transform(rightGeom, trs);
-                leftMatch = leftGeom;
-            } else if (rightCRS.getCoordinateSystem().getAxis(0).getUnit().isCompatible(unit)) {
-                matchingCRS = rightCRS;
-                final CoordinateOperation trs = CRS.findOperation(leftCRS, matchingCRS, null);
-                leftMatch = Geometries.transform(leftGeom, trs);
-                rightMatch = rightGeom;
-            } else {
-                //the crs unit is not compatible, we must reproject both geometries to a more appropriate crs
-                if (Units.METRE.isCompatible(unit)) {
-                    //in that case we reproject to mercator EPSG:3395
-                    matchingCRS = getMercator();
-
-                    CoordinateOperation trs = CRS.findOperation(leftCRS, matchingCRS, null);
-                    leftMatch = Geometries.transform(leftGeom, trs);
-                    trs = CRS.findOperation(rightCRS, matchingCRS, null);
-                    rightMatch = Geometries.transform(rightGeom, trs);
-
-                } else {
-                    //we can not find a matching projection in this case
-                    throw new TransformException("Could not find a matching CRS for both geometries for unit :" + unit);
-                }
-            }
-
-            return new Object[]{leftMatch, rightMatch, matchingCRS};
-        }
-    }
-
     /**
      * The {@value #NAME} filter.
      */
@@ -268,15 +110,15 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
         @Override
         public boolean evaluate(Object object) {
-            final Geometry leftGeom = toGeometry(object, expression1);
-            final Geometry rightGeom = toGeometry(object, expression2);
+            final Geometry leftGeom = FilterGeometryUtils.toGeometry(object, expression1);
+            final Geometry rightGeom = FilterGeometryUtils.toGeometry(object, expression2);
 
             if (leftGeom == null || rightGeom == null) {
                 return false;
             }
 
             try {
-                final Object[] values = toSameCRS(leftGeom, rightGeom, unit);
+                final Object[] values = FilterGeometryUtils.toSameCRS(leftGeom, rightGeom, unit);
 
                 if (values[2] == null) {
                     //no matching crs was found, assume both have the same and valid unit
@@ -323,8 +165,8 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
         @Override
         public boolean evaluate(Object object) {
-            Geometry leftGeom = toGeometry(object, expression1);
-            Geometry rightGeom = toGeometry(object, expression2);
+            Geometry leftGeom = FilterGeometryUtils.toGeometry(object, expression1);
+            Geometry rightGeom = FilterGeometryUtils.toGeometry(object, expression2);
 
             if (leftGeom == null || rightGeom == null) {
                 return false;
@@ -332,7 +174,7 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
             final Geometry[] values;
             try {
-                values = toSameCRS(leftGeom, rightGeom);
+                values = FilterGeometryUtils.toSameCRS(leftGeom, rightGeom);
             } catch (FactoryException | TransformException ex) {
                 warning(ex);
                 return false;
@@ -376,8 +218,8 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
         @Override
         public boolean evaluate(Object object) {
-            Geometry leftGeom = toGeometry(object, expression1);
-            Geometry rightGeom = toGeometry(object, expression2);
+            Geometry leftGeom = FilterGeometryUtils.toGeometry(object, expression1);
+            Geometry rightGeom = FilterGeometryUtils.toGeometry(object, expression2);
 
             if (leftGeom == null || rightGeom == null) {
                 return false;
@@ -385,7 +227,7 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
             final Geometry[] values;
             try {
-                values = toSameCRS(leftGeom, rightGeom);
+                values = FilterGeometryUtils.toSameCRS(leftGeom, rightGeom);
             } catch (FactoryException | TransformException ex) {
                 warning(ex);
                 return false;
@@ -430,8 +272,8 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
         @Override
         public boolean evaluate(Object object) {
-            Geometry leftGeom = toGeometry(object, expression1);
-            Geometry rightGeom = toGeometry(object, expression2);
+            Geometry leftGeom = FilterGeometryUtils.toGeometry(object, expression1);
+            Geometry rightGeom = FilterGeometryUtils.toGeometry(object, expression2);
 
             if (leftGeom == null || rightGeom == null) {
                 return false;
@@ -439,7 +281,7 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
             final Geometry[] values;
             try {
-                values = toSameCRS(leftGeom, rightGeom);
+                values = FilterGeometryUtils.toSameCRS(leftGeom, rightGeom);
             } catch (FactoryException | TransformException ex) {
                 warning(ex);
                 return false;
@@ -501,15 +343,15 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
         @Override
         public boolean evaluate(Object object) {
-            final Geometry leftGeom = toGeometry(object, expression1);
-            final Geometry rightGeom = toGeometry(object, expression2);
+            final Geometry leftGeom = FilterGeometryUtils.toGeometry(object, expression1);
+            final Geometry rightGeom = FilterGeometryUtils.toGeometry(object, expression2);
 
             if (leftGeom == null || rightGeom == null) {
                 return false;
             }
 
             try {
-                final Object[] values = toSameCRS(leftGeom, rightGeom, unit);
+                final Object[] values = FilterGeometryUtils.toSameCRS(leftGeom, rightGeom, unit);
 
                 if (values[2] == null) {
                     //no matching crs was found, assume both have the same and valid unit
@@ -556,8 +398,8 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
         @Override
         public boolean evaluate(Object object) {
-            Geometry leftGeom = toGeometry(object, expression1);
-            Geometry rightGeom = toGeometry(object, expression2);
+            Geometry leftGeom = FilterGeometryUtils.toGeometry(object, expression1);
+            Geometry rightGeom = FilterGeometryUtils.toGeometry(object, expression2);
 
             if (leftGeom == null || rightGeom == null) {
                 return false;
@@ -565,7 +407,7 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
             final Geometry[] values;
             try {
-                values = toSameCRS(leftGeom, rightGeom);
+                values = FilterGeometryUtils.toSameCRS(leftGeom, rightGeom);
             } catch (FactoryException | TransformException ex) {
                 warning(ex);
                 return false;
@@ -603,8 +445,8 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
         @Override
         public boolean evaluate(Object object) {
-            Geometry leftGeom = toGeometry(object, expression1);
-            Geometry rightGeom = toGeometry(object, expression2);
+            Geometry leftGeom = FilterGeometryUtils.toGeometry(object, expression1);
+            Geometry rightGeom = FilterGeometryUtils.toGeometry(object, expression2);
 
             if (leftGeom == null || rightGeom == null) {
                 return false;
@@ -612,7 +454,7 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
             final Geometry[] values;
             try {
-                values = toSameCRS(leftGeom, rightGeom);
+                values = FilterGeometryUtils.toSameCRS(leftGeom, rightGeom);
             } catch (FactoryException | TransformException ex) {
                 warning(ex);
                 return false;
@@ -656,8 +498,8 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
         @Override
         public boolean evaluate(Object object) {
-            Geometry leftGeom = toGeometry(object, expression1);
-            Geometry rightGeom = toGeometry(object, expression2);
+            Geometry leftGeom = FilterGeometryUtils.toGeometry(object, expression1);
+            Geometry rightGeom = FilterGeometryUtils.toGeometry(object, expression2);
 
             if (leftGeom == null || rightGeom == null) {
                 return false;
@@ -665,7 +507,7 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
             final Geometry[] values;
             try {
-                values = toSameCRS(leftGeom, rightGeom);
+                values = FilterGeometryUtils.toSameCRS(leftGeom, rightGeom);
             } catch (FactoryException | TransformException ex) {
                 warning(ex);
                 return false;
@@ -709,8 +551,8 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
         @Override
         public boolean evaluate(Object object) {
-            Geometry leftGeom = toGeometry(object, expression1);
-            Geometry rightGeom = toGeometry(object, expression2);
+            Geometry leftGeom = FilterGeometryUtils.toGeometry(object, expression1);
+            Geometry rightGeom = FilterGeometryUtils.toGeometry(object, expression2);
 
             if (leftGeom == null || rightGeom == null) {
                 return false;
@@ -718,7 +560,7 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
             final Geometry[] values;
             try {
-                values = toSameCRS(leftGeom, rightGeom);
+                values = FilterGeometryUtils.toSameCRS(leftGeom, rightGeom);
             } catch (FactoryException | TransformException ex) {
                 warning(ex);
                 return false;
@@ -755,8 +597,8 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
         @Override
         public boolean evaluate(Object object) {
-            Geometry leftGeom = toGeometry(object, expression1);
-            Geometry rightGeom = toGeometry(object, expression2);
+            Geometry leftGeom = FilterGeometryUtils.toGeometry(object, expression1);
+            Geometry rightGeom = FilterGeometryUtils.toGeometry(object, expression2);
 
             if (leftGeom == null || rightGeom == null) {
                 return false;
@@ -764,7 +606,7 @@ abstract class SpatialFunction extends BinaryFunction implements BinarySpatialOp
 
             final Geometry[] values;
             try {
-                values = toSameCRS(leftGeom, rightGeom);
+                values = FilterGeometryUtils.toSameCRS(leftGeom, rightGeom);
             } catch (FactoryException | TransformException ex) {
                 warning(ex);
                 return false;
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/FilterGeometryUtils.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/FilterGeometryUtils.java
new file mode 100644
index 0000000..c78ac33
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/FilterGeometryUtils.java
@@ -0,0 +1,283 @@
+/*
+ * 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;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.measure.Unit;
+import org.apache.sis.coverage.grid.GridCoverage;
+import org.apache.sis.filter.CRSMatching;
+import org.apache.sis.internal.feature.AttributeConvention;
+import org.apache.sis.internal.feature.Geometries;
+import org.apache.sis.internal.feature.GeometryWrapper;
+import org.apache.sis.internal.feature.WrapResolution;
+import org.apache.sis.measure.Units;
+import org.apache.sis.referencing.CRS;
+import org.apache.sis.setup.GeometryLibrary;
+import org.apache.sis.util.ObjectConverters;
+import org.apache.sis.util.UnconvertibleObjectException;
+import org.apache.sis.util.Utilities;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.io.ParseException;
+import org.locationtech.jts.io.WKBReader;
+import org.locationtech.jts.io.WKBWriter;
+import org.locationtech.jts.io.WKTReader;
+import org.locationtech.jts.io.WKTWriter;
+import org.opengis.feature.Feature;
+import org.opengis.feature.PropertyNotFoundException;
+import org.opengis.filter.expression.Expression;
+import org.opengis.filter.expression.PropertyName;
+import org.opengis.referencing.NoSuchAuthorityCodeException;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.opengis.referencing.operation.CoordinateOperation;
+import org.opengis.referencing.operation.TransformException;
+import org.opengis.util.FactoryException;
+
+/**
+ *
+ * @author Johann Sorel (Geomatys)
+ */
+public final class FilterGeometryUtils {
+
+    //store wkb/wkt readers/writers by thread since they are not concurrent.
+    public static final GeometryFactory GF = new GeometryFactory();
+    public static final ThreadLocal<WKBReader> WKB_READERS = new ThreadLocal<WKBReader>();
+    public static final ThreadLocal<WKTReader> WKT_READERS = new ThreadLocal<WKTReader>();
+    public static final ThreadLocal<WKBWriter> WKB_WRITERS = new ThreadLocal<WKBWriter>();
+    public static final ThreadLocal<WKTWriter> WKT_WRITERS = new ThreadLocal<WKTWriter>();
+
+    private FilterGeometryUtils() {
+    }
+
+    private static CoordinateReferenceSystem MERCATOR;
+
+    /**
+     * TODO: We should generify this. But too much code already depends on JTS,
+     * so for now I hack this
+     */
+    public static final Geometries<Geometry> SIS_GEOMETRY_FACTORY = (Geometries<Geometry>) Geometries.implementation(GeometryLibrary.JTS);
+
+    /**
+     * Created when first required, not thread safe.
+     *
+     * @return WKBReader
+     */
+    public static WKBReader getWKBReader() {
+        WKBReader wkbReader = WKB_READERS.get();
+        if (wkbReader == null) {
+            wkbReader = new WKBReader();
+            WKB_READERS.set(wkbReader);
+        }
+        return wkbReader;
+    }
+
+    /**
+     * Created when first requiered, not thread safe.
+     *
+     * @return WKTReader
+     */
+    public static WKTReader getWKTReader() {
+        WKTReader wktReader = WKT_READERS.get();
+        if (wktReader == null) {
+            wktReader = new WKTReader();
+            WKT_READERS.set(wktReader);
+        }
+        return wktReader;
+    }
+
+    /**
+     * Created when first requiered, not thread safe.
+     *
+     * @return WKBReader
+     */
+    public static WKBWriter getWKBWriter() {
+        WKBWriter candidate = FilterGeometryUtils.WKB_WRITERS.get();
+        if (candidate == null) {
+            candidate = new WKBWriter();
+            FilterGeometryUtils.WKB_WRITERS.set(candidate);
+        }
+        return candidate;
+    }
+
+    /**
+     * Created when first requiered, not thread safe.
+     *
+     * @return WKTReader
+     */
+    public static WKTWriter getWKTWriter() {
+        WKTWriter candidate = FilterGeometryUtils.WKT_WRITERS.get();
+        if (candidate == null) {
+            candidate = new WKTWriter();
+            FilterGeometryUtils.WKT_WRITERS.set(candidate);
+        }
+        return candidate;
+    }
+
+    public static CoordinateReferenceSystem getMercator() throws FactoryException {
+        if (MERCATOR == null) {
+            MERCATOR = CRS.forCode("EPSG:3395");
+        }
+        return MERCATOR;
+    }
+
+    public static Geometry toGeometry(final Object object, Expression exp) {
+        Object value = null;
+        if ((exp instanceof PropertyName) && object instanceof Feature && ((PropertyName) exp).getPropertyName().isEmpty()) {
+            //Search for a default geometry.
+            try {
+                value = ((Feature) object).getPropertyValue(AttributeConvention.GEOMETRY_PROPERTY.toString());
+            } catch (PropertyNotFoundException ex) {
+                //no defined default geometry
+            }
+        } else {
+            value = exp.evaluate(object);
+        }
+
+        if (value instanceof GeometryWrapper) {
+            value = ((GeometryWrapper) value).geometry;
+        } else if (value instanceof String) {
+            try {
+                //try to convert from WKT
+                value = getWKTReader().read(value.toString());
+            } catch (ParseException ex) {
+                //we have try
+            }
+        } else if (value instanceof byte[]) {
+            try {
+                //try to convert from WKB
+                value = getWKBReader().read((byte[]) value);
+            } catch (ParseException ex) {
+                //we have try
+            }
+        }
+
+        Geometry candidate;
+        if (value instanceof GridCoverage) {
+            //use the coverage envelope
+            final GridCoverage coverage = (GridCoverage) value;
+            candidate = SIS_GEOMETRY_FACTORY.tryConvertToGeometry(coverage.getGridGeometry().getEnvelope(), WrapResolution.SPLIT);
+        } else {
+            try {
+                candidate = ObjectConverters.convert(value, Geometry.class);
+            } catch (UnconvertibleObjectException ex) {
+                //cound not convert value to a Geometry
+                candidate = null;
+            }
+        }
+        return candidate;
+    }
+
+    /**
+     * Reproject geometries to the same CRS if needed and if possible.
+     */
+    public static Geometry[] toSameCRS(final Geometry leftGeom, final Geometry rightGeom)
+            throws FactoryException, TransformException {
+
+        final CoordinateReferenceSystem leftCRS = Geometries.getCoordinateReferenceSystem(leftGeom);
+        final CoordinateReferenceSystem rightCRS = Geometries.getCoordinateReferenceSystem(rightGeom);
+
+        final CRSMatching.Match match = CRSMatching
+                .left(leftCRS)
+                .right(rightCRS);
+
+        final CRSMatching.Transformer<Geometry> projectGeom = (g, op) -> SIS_GEOMETRY_FACTORY.tryTransform(g, op, null);
+        return new Geometry[]{
+            match.transformLeftToCommon(leftGeom, projectGeom),
+            match.transformRightToCommon(rightGeom, projectGeom)
+        };
+    }
+
+    /**
+     * Reproject one or both geometries to the same crs, the matching crs will
+     * be compatible with the requested unit. return Array[leftGeometry,
+     * rightGeometry, matchingCRS];
+     */
+    public static Object[] toSameCRS(final Geometry leftGeom, final Geometry rightGeom, final Unit unit)
+            throws NoSuchAuthorityCodeException, FactoryException, TransformException {
+
+        final CoordinateReferenceSystem leftCRS = Geometries.getCoordinateReferenceSystem(leftGeom);
+        final CoordinateReferenceSystem rightCRS = Geometries.getCoordinateReferenceSystem(rightGeom);
+
+        if (leftCRS == null && rightCRS == null) {
+            //bother geometries doesn't have a defined SRID, we assume that both
+            //are in the same CRS
+            return new Object[]{leftGeom, rightGeom, null};
+        } else if (leftCRS == null || rightCRS == null || Utilities.equalsIgnoreMetadata(leftCRS, rightCRS)) {
+            //both are in the same CRS
+
+            final CoordinateReferenceSystem geomCRS = (leftCRS == null) ? rightCRS : leftCRS;
+
+            if (geomCRS.getCoordinateSystem().getAxis(0).getUnit().isCompatible(unit)) {
+                //the geometries crs is compatible with the requested unit, nothing to reproject
+                return new Object[]{leftGeom, rightGeom, geomCRS};
+            } else {
+                //the crs unit is not compatible, we must reproject both geometries to a more appropriate crs
+                if (Units.METRE.isCompatible(unit)) {
+                    //in that case we reproject to mercator EPSG:3395
+                    final CoordinateReferenceSystem mercator = getMercator();
+                    final CoordinateOperation trs = CRS.findOperation(geomCRS, mercator, null);
+
+                    return new Object[]{
+                        Geometries.transform(leftGeom, trs),
+                        Geometries.transform(rightGeom, trs),
+                        mercator};
+
+                } else {
+                    //we can not find a matching projection in this case
+                    throw new TransformException("Could not find a matching CRS for both geometries for unit :" + unit);
+                }
+            }
+
+        } else {
+            //both have different CRS, try to find the most appropriate crs amoung both
+
+            final CoordinateReferenceSystem matchingCRS;
+            final Object leftMatch;
+            final Object rightMatch;
+
+            if (leftCRS.getCoordinateSystem().getAxis(0).getUnit().isCompatible(unit)) {
+                matchingCRS = leftCRS;
+                final CoordinateOperation trs = CRS.findOperation(rightCRS, matchingCRS, null);
+                rightMatch = Geometries.transform(rightGeom, trs);
+                leftMatch = leftGeom;
+            } else if (rightCRS.getCoordinateSystem().getAxis(0).getUnit().isCompatible(unit)) {
+                matchingCRS = rightCRS;
+                final CoordinateOperation trs = CRS.findOperation(leftCRS, matchingCRS, null);
+                leftMatch = Geometries.transform(leftGeom, trs);
+                rightMatch = rightGeom;
+            } else {
+                //the crs unit is not compatible, we must reproject both geometries to a more appropriate crs
+                if (Units.METRE.isCompatible(unit)) {
+                    //in that case we reproject to mercator EPSG:3395
+                    matchingCRS = getMercator();
+
+                    CoordinateOperation trs = CRS.findOperation(leftCRS, matchingCRS, null);
+                    leftMatch = Geometries.transform(leftGeom, trs);
+                    trs = CRS.findOperation(rightCRS, matchingCRS, null);
+                    rightMatch = Geometries.transform(rightGeom, trs);
+
+                } else {
+                    //we can not find a matching projection in this case
+                    throw new TransformException("Could not find a matching CRS for both geometries for unit :" + unit);
+                }
+            }
+
+            return new Object[]{leftMatch, rightMatch, matchingCRS};
+        }
+    }
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractAccessorSpatialMethod.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractAccessorSpatialMethod.java
new file mode 100644
index 0000000..9ee7600
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractAccessorSpatialMethod.java
@@ -0,0 +1,61 @@
+/*
+ * 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.internal.filter.FilterGeometryUtils;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * Spatial methods accessing properties of a geometry.
+ *
+ * @author Johann Sorel (Geomatys)
+ */
+public abstract class AbstractAccessorSpatialMethod<T extends Geometry> extends AbstractSpatialMethod {
+
+    public AbstractAccessorSpatialMethod(Expression[] parameters) {
+        super(parameters);
+    }
+
+    protected abstract Class<T> getExpectedClass();
+
+    @Override
+    public Object evaluate(Object candidate) {
+        Geometry geometry = FilterGeometryUtils.toGeometry(candidate, parameters.get(0));
+
+        if (!getExpectedClass().isInstance(geometry)) {
+            return null;
+        }
+
+        final Object[] params = new Object[parameters.size()];
+        params[0] = geometry;
+        for (int i = 1, n = parameters.size(); i < n; i++) {
+            params[i] = parameters.get(i).evaluate(candidate);
+        }
+
+        try {
+            return execute((T) geometry, params);
+        } catch (ParseException ex) {
+            warning(ex);
+        }
+        return null;
+    }
+
+    public abstract Object execute(T geom, Object... params) throws ParseException;
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractBinarySpatialMethod.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractBinarySpatialMethod.java
new file mode 100644
index 0000000..87521a7
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractBinarySpatialMethod.java
@@ -0,0 +1,85 @@
+/*
+ * 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.internal.filter.FilterGeometryUtils;
+import org.opengis.filter.expression.Expression;
+import org.opengis.referencing.operation.TransformException;
+import org.opengis.util.FactoryException;
+
+/**
+ * Spatial methods involving two geometries.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since 2.0
+ * @module
+ */
+public abstract class AbstractBinarySpatialMethod extends AbstractSpatialMethod {
+
+    public AbstractBinarySpatialMethod(Expression[] parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected int getMinParams() {
+        return 2;
+    }
+
+    @Override
+    protected int getMaxParams() {
+        return 2;
+    }
+
+    @Override
+    public Object evaluate(Object candidate) {
+        Geometry left = FilterGeometryUtils.toGeometry(candidate, parameters.get(0));
+        Geometry right = FilterGeometryUtils.toGeometry(candidate, parameters.get(1));
+        try {
+            final Geometry[] geoms = toSameCRS(left, right);
+            left = geoms[0];
+            right = geoms[1];
+        } catch (FactoryException ex) {
+            return null;
+        } catch (TransformException ex) {
+            return null;
+        }
+
+        if (left == null || right == null) {
+            return null;
+        }
+
+        final Object[] params = new Object[parameters.size()];
+        params[0] = left;
+        params[1] = right;
+        for (int i = 2, n = parameters.size(); i < n; i++) {
+            params[i] = parameters.get(i).evaluate(candidate);
+        }
+
+        try {
+            return execute(left, right);
+        } catch (ParseException ex) {
+            warning(ex);
+        }
+        return null;
+    }
+
+    public abstract Object execute(Geometry left, Geometry right, Object... params) throws 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/todo/AbstractGeomConstructor.java
new file mode 100644
index 0000000..70c8daf
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomConstructor.java
@@ -0,0 +1,71 @@
+/*
+ * 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.apache.sis.internal.filter.FilterGeometryUtils;
+import org.locationtech.jts.geom.Geometry;
+import org.opengis.filter.expression.Expression;
+
+/**
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since 2.0
+ * @module
+ */
+public abstract class AbstractGeomConstructor extends AbstractSpatialFunction {
+
+    public AbstractGeomConstructor(Expression[] parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected int getMinParams() {
+        return 1;
+    }
+
+    @Override
+    protected int getMaxParams() {
+        return 2;
+    }
+
+    public abstract Class getExpectedClass();
+
+    public String getSyntax() {
+        return getName() + "( wkt [,srid] ) or " + getName() + "( wkb [,srid] )";
+    }
+
+    @Override
+    public Object evaluate(Object candidate) {
+        final Geometry geom = FilterGeometryUtils.toGeometry(candidate, parameters.get(0));
+
+        if (parameters.size() == 2) {
+            geom.setSRID(((Number) parameters.get(1).evaluate(candidate)).intValue());
+        } else if (parameters.size() > 2) {
+            warning(new Exception("Unexpected number of arguments : " + parameters.size()));
+            return null;
+        }
+
+        if (!getExpectedClass().isInstance(geom)) {
+            warning(new Exception("Geometry is not of expected type : " + getExpectedClass().getSimpleName()));
+            return null;
+        }
+
+        return geom;
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomFromBinary.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomFromBinary.java
new file mode 100644
index 0000000..27c97b6
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomFromBinary.java
@@ -0,0 +1,70 @@
+/*
+ * 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.apache.sis.internal.filter.FilterGeometryUtils;
+import org.locationtech.jts.geom.Geometry;
+import org.opengis.filter.expression.Expression;
+
+/**
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since 2.0
+ * @module
+ */
+public abstract class AbstractGeomFromBinary extends AbstractSpatialFunction {
+
+    public AbstractGeomFromBinary(Expression[] parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected int getMinParams() {
+        return 1;
+    }
+
+    @Override
+    protected int getMaxParams() {
+        return 2;
+    }
+
+    public abstract Class getExpectedClass();
+
+    public String getSyntax() {
+        return getName() + " ( <wkb> [,<srid>] )";
+    }
+
+    @Override
+    public Geometry evaluate(Object candidate) {
+
+        Geometry geom = FilterGeometryUtils.toGeometry(candidate, parameters.get(0));
+
+        if (!getExpectedClass().isInstance(geom)) {
+            warning(new Exception("WKB is not of expected type : " + getExpectedClass().getSimpleName()));
+            return null;
+        }
+
+        if (parameters.size() > 1) {
+            //srid
+            geom.setSRID(((Number) parameters.get(1).evaluate(candidate)).intValue());
+        }
+
+        return geom;
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomFromGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomFromGML.java
new file mode 100644
index 0000000..51ba67b
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomFromGML.java
@@ -0,0 +1,79 @@
+/*
+ * 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 org.opengis.filter.expression.Expression;
+import org.opengis.util.FactoryException;
+
+/**
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since 2.0
+ * @module
+ */
+public abstract class AbstractGeomFromGML extends AbstractSpatialFunction {
+
+    public AbstractGeomFromGML(Expression[] parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected int getMinParams() {
+        return 1;
+    }
+
+    @Override
+    protected int getMaxParams() {
+        return 2;
+    }
+
+    public abstract Class getExpectedClass();
+
+    public String getSyntax() {
+        return getName() + " ( <gml> [,<srid>] )";
+    }
+
+    @Override
+    public Geometry evaluate(Object candidate) {
+
+        final Object obj = parameters.get(0).evaluate(candidate);
+
+        final Geometry geom;
+        try {
+            geom = GeometrytoJTS.toJTS(String.valueOf(obj));
+        } catch (FactoryException ex) {
+            throw new OException(ex.getMessage(), ex);
+        } catch (JAXBException ex) {
+            throw new OException(ex.getMessage(), ex);
+        }
+
+        if (!getExpectedClass().isInstance(geom)) {
+            warning(new Exception("GML is not of expected type : " + getExpectedClass().getSimpleName()));
+            return null;
+        }
+
+        if (parameters.size() > 1) {
+            //srid
+            geom.setSRID(((Number) parameters.get(1).evaluate(candidate)).intValue());
+        }
+
+        return geom;
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomFromText.java
new file mode 100644
index 0000000..a7d4d48
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractGeomFromText.java
@@ -0,0 +1,69 @@
+/*
+ * 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.apache.sis.internal.filter.FilterGeometryUtils;
+import org.locationtech.jts.geom.Geometry;
+import org.opengis.filter.expression.Expression;
+
+/**
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since 2.0
+ * @module
+ */
+public abstract class AbstractGeomFromText extends AbstractSpatialFunction {
+
+    public AbstractGeomFromText(Expression[] parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected int getMinParams() {
+        return 1;
+    }
+
+    @Override
+    protected int getMaxParams() {
+        return 2;
+    }
+
+    public abstract Class getExpectedClass();
+
+    public String getSyntax() {
+        return getName() + " ( <text> [,<srid>] )";
+    }
+
+    @Override
+    public Geometry evaluate(Object candidate) {
+
+        final Geometry geom = FilterGeometryUtils.toGeometry(candidate, parameters.get(0));
+
+        if (!getExpectedClass().isInstance(geom)) {
+            warning(new Exception("WKT is not of expected type : " + getExpectedClass().getSimpleName()));
+            return null;
+        }
+
+        if (parameters.size() > 1) {
+            //srid
+            geom.setSRID(((Number) parameters.get(1).evaluate(candidate)).intValue());
+        }
+        return geom;
+    }
+
+}
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/todo/AbstractSpatialFunction.java
new file mode 100644
index 0000000..b66a74b
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractSpatialFunction.java
@@ -0,0 +1,51 @@
+/*
+ * 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.GeometryFactory;
+import java.util.logging.Logger;
+import org.apache.sis.internal.filter.NamedFunction;
+import org.apache.sis.util.logging.Logging;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * Provide convinient methods to manipulation geometries.
+ * this class is not thread safe.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public abstract class AbstractSpatialFunction extends NamedFunction {
+
+    protected static final Logger LOGGER = Logging.getLogger(AbstractSpatialFunction.class);
+    protected static final GeometryFactory GF = new GeometryFactory();
+
+    public AbstractSpatialFunction(Expression[] parameters){
+        super(parameters);
+    }
+
+    protected int getMinParams() {
+        return 1;
+    }
+
+    protected int getMaxParams() {
+        return 1;
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractSpatialMethod.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractSpatialMethod.java
new file mode 100644
index 0000000..3cedd69
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractSpatialMethod.java
@@ -0,0 +1,90 @@
+/*
+ * 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 org.locationtech.jts.io.WKBWriter;
+import org.locationtech.jts.io.WKTWriter;
+import java.util.logging.Logger;
+import org.apache.sis.internal.filter.FilterGeometryUtils;
+import org.apache.sis.internal.filter.NamedFunction;
+import org.apache.sis.util.logging.Logging;
+import org.opengis.filter.expression.Expression;
+import org.opengis.referencing.operation.TransformException;
+import org.opengis.util.FactoryException;
+
+/**
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public abstract class AbstractSpatialMethod extends NamedFunction {
+
+    protected static final Logger LOGGER = Logging.getLogger(AbstractSpatialMethod.class);
+
+    public AbstractSpatialMethod(Expression[] parameters) {
+        super(parameters);
+    }
+
+    protected int getMinParams() {
+        return 1;
+    }
+
+    protected int getMaxParams() {
+        return 1;
+    }
+
+    public String getSyntax() {
+        final int minparams = getMinParams();
+        final int maxparams = getMaxParams();
+        final StringBuilder sb = new StringBuilder();
+        sb.append(getName());
+        sb.append('(');
+        for (int i = 0; i < minparams; i++) {
+            if (i != 0) {
+                sb.append(", ");
+            }
+            sb.append("param");
+            sb.append(i + 1);
+        }
+        if (minparams != maxparams) {
+            sb.append('[');
+            for (int i = minparams; i < maxparams; i++) {
+                if (i != 0) {
+                    sb.append(", ");
+                }
+                sb.append("param");
+                sb.append(i + 1);
+            }
+            sb.append(']');
+        }
+        sb.append(')');
+
+        return sb.toString();
+    }
+
+    /**
+     * Reproject geometries to the same CRS if needed and if possible.
+     */
+    protected static Geometry[] toSameCRS(final Geometry leftGeom, final Geometry rightGeom)
+            throws FactoryException, TransformException {
+        return FilterGeometryUtils.toSameCRS(leftGeom, rightGeom);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_ExteriorRing.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_ExteriorRing.java
new file mode 100644
index 0000000..ac0df49
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_ExteriorRing.java
@@ -0,0 +1,57 @@
+/*
+ * 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.LineString;
+import org.locationtech.jts.geom.Polygon;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_ExteriorRing. <br/>
+ * Observe the ST_PrivateExteriorRing attribute of an ST_CurvePolygon value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class CurvePolygon_ST_ExteriorRing extends AbstractAccessorSpatialMethod<Polygon> {
+
+    public static final String NAME = "ST_ExteriorRing";
+
+    public CurvePolygon_ST_ExteriorRing(Expression[] parameters) {
+        super(parameters);
+    }
+
+    @Override
+    public String getName() {
+        return NAME;
+    }
+
+    @Override
+    protected Class<Polygon> getExpectedClass() {
+        return Polygon.class;
+    }
+
+    @Override
+    public Object execute(Polygon geom, Object... params) throws ParseException {
+        final LineString ring = geom.getExteriorRing();
+        ring.setSRID(geom.getSRID());
+        return ring;
+    }
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_InteriorRingN.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_InteriorRingN.java
new file mode 100644
index 0000000..05d767f
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_InteriorRingN.java
@@ -0,0 +1,58 @@
+/*
+ * 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.LineString;
+import org.locationtech.jts.geom.Polygon;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_InteriorRingN. <br/>
+ * Return the specified element in the ST_PrivateInteriorRings attribute of an ST_CurvePolygon value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class CurvePolygon_ST_InteriorRingN extends AbstractAccessorSpatialMethod<Polygon> {
+
+    public static final String NAME = "ST_InteriorRingN";
+
+    public CurvePolygon_ST_InteriorRingN(Expression[] parameters) {
+        super(parameters);
+    }
+
+    @Override
+    public String getName() {
+        return NAME;
+    }
+
+    @Override
+    protected Class<Polygon> getExpectedClass() {
+        return Polygon.class;
+    }
+
+    @Override
+    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());
+        return ring;
+    }
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_NumInteriorRings.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_NumInteriorRings.java
new file mode 100644
index 0000000..3bf0a08
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_NumInteriorRings.java
@@ -0,0 +1,47 @@
+/*
+ * 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.Polygon;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_NumInteriorRings. <br/>
+ * Return the cardinality of the ST_PrivateInteriorRings attribute of an ST_CurvePolygon value.
+ *
+ * This class should be for all curvepolygon types, but JTS only has Polygon.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class CurvePolygon_ST_NumInteriorRings extends AbstractAccessorSpatialMethod<Polygon> {
+
+    public static final String NAME = "ST_NumInteriorRings";
+
+    public CurvePolygon_ST_NumInteriorRings(Expression[] parameters) {
+        super(NAME,Polygon.class);
+    }
+
+    @Override
+    public Object execute(Polygon geom, Object... params) throws ParseException {
+        return geom.getNumInteriorRing();
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_EndPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_EndPoint.java
new file mode 100644
index 0000000..2edd038
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_EndPoint.java
@@ -0,0 +1,48 @@
+/*
+ * 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.LineString;
+import org.locationtech.jts.geom.Point;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_EndPoint. <br/>
+ * Return an ST_Point value that is the end point of an ST_Curve value including existing z and m coordinate
+ * values in the resultant geometry.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class Curve_ST_EndPoint extends AbstractAccessorSpatialMethod<LineString> {
+
+    public static final String NAME = "ST_EndPoint";
+
+    public Curve_ST_EndPoint(Expression[] parameters) {
+        super(NAME,LineString.class);
+    }
+
+    @Override
+    public Object execute(LineString geom, Object... params) throws ParseException {
+        final Point pt = geom.getEndPoint();
+        return new OSerializableGeometry(pt);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsClosed.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsClosed.java
new file mode 100644
index 0000000..adc9b21
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsClosed.java
@@ -0,0 +1,47 @@
+/*
+ * 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.LineString;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_IsClosed. <br/>
+ * Test if an ST_Curve value is closed, ignoring z and m coordinate values in the calculations.
+ *
+ * This class should be for all curve types, but JTS only has LineString.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class Curve_ST_IsClosed extends AbstractAccessorSpatialMethod<LineString> {
+
+    public static final String NAME = "ST_IsClosed";
+
+    public Curve_ST_IsClosed(Expression[] parameters) {
+        super(NAME,LineString.class);
+    }
+
+    @Override
+    public Object execute(LineString geom, Object... params) throws ParseException {
+        return geom.isClosed();
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsRing.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsRing.java
new file mode 100644
index 0000000..9d4a7e2
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsRing.java
@@ -0,0 +1,47 @@
+/*
+ * 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.LineString;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_IsRing. <br/>
+ * Test if an ST_Curve value is a ring, ignoring z and m coordinate values in the calculations.
+ *
+ * This class should be for all curve types, but JTS only has LineString.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class Curve_ST_IsRing extends AbstractAccessorSpatialMethod<LineString> {
+
+    public static final String NAME = "ST_IsRing";
+
+    public Curve_ST_IsRing(Expression[] parameters) {
+        super(NAME,LineString.class);
+    }
+
+    @Override
+    public Object execute(LineString geom, Object... params) throws ParseException {
+        return geom.isRing();
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_Length.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_Length.java
new file mode 100644
index 0000000..de66987
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_Length.java
@@ -0,0 +1,56 @@
+/*
+ * 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;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Length. <br/>
+ * Return the length measurement of an ST_Curve value, ignoring z and m coordinate values in the calculations.
+ *
+ * This class should be for all curve types, but JTS only has LineString, MultiLineString.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class Curve_ST_Length extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_Length";
+
+    public Curve_ST_Length(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 {
+        return geom.getLength();
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_StartPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_StartPoint.java
new file mode 100644
index 0000000..6262610
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_StartPoint.java
@@ -0,0 +1,50 @@
+/*
+ * 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.LineString;
+import org.locationtech.jts.geom.Point;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_StartPoint. <br/>
+ * Return an ST_Point value that is the start point of an ST_Curve value including existing z and m coordinate
+ * values in the resultant geometry.
+ *
+ * This class should be for all curve types, but JTS only has LineString.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class Curve_ST_StartPoint extends AbstractAccessorSpatialMethod<LineString> {
+
+    public static final String NAME = "ST_StartPoint";
+
+    public Curve_ST_StartPoint(Expression[] parameters) {
+        super(NAME,LineString.class);
+    }
+
+    @Override
+    public Object execute(LineString geom, Object... params) throws ParseException {
+        final Point pt = geom.getStartPoint();
+        return new OSerializableGeometry(pt);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_GeometryN.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_GeometryN.java
new file mode 100644
index 0000000..26c5a97
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_GeometryN.java
@@ -0,0 +1,49 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_GeometryN. <br/>
+ * Return the specified ST_Geometry value in the ST_PrivateGeometries attribute of an ST_GeomCollection
+ * value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class GeomColl_ST_GeometryN extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_GeometryN";
+
+    public GeomColl_ST_GeometryN(Expression[] parameters) {
+        super(NAME,2,Geometry.class);
+    }
+
+    @Override
+    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());
+        return new OSerializableGeometry(sub);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_NumGeometries.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_NumGeometries.java
new file mode 100644
index 0000000..006aa31
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_NumGeometries.java
@@ -0,0 +1,45 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_NumGeometries. <br/>
+ * Return the cardinality of the ST_PrivateGeometries attribute of an ST_GeomCollection value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class GeomColl_ST_NumGeometries extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_NumGeometries";
+
+    public GeomColl_ST_NumGeometries(Expression[] parameters) {
+        super(NAME, Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        return geom.getNumGeometries();
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_NumPoints.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_NumPoints.java
new file mode 100644
index 0000000..46d0ace
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_NumPoints.java
@@ -0,0 +1,45 @@
+/*
+ * 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.LineString;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_NumPoints. <br/>
+ * Return the cardinality of the ST_PrivatePoints attribute of an ST_LineString value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class Line_ST_NumPoints extends AbstractAccessorSpatialMethod<LineString> {
+
+    public static final String NAME = "ST_NumPoints";
+
+    public Line_ST_NumPoints(Expression[] parameters) {
+        super(NAME,LineString.class);
+    }
+
+    @Override
+    public Object execute(LineString geom, Object... params) throws ParseException {
+        return geom.getNumPoints();
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_PointN.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_PointN.java
new file mode 100644
index 0000000..272fb0e
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_PointN.java
@@ -0,0 +1,49 @@
+/*
+ * 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.LineString;
+import org.locationtech.jts.geom.Point;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_PointN. <br/>
+ * Return the specified element in the ST_PrivatePoints attribute of an ST_LineString value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class Line_ST_PointN extends AbstractAccessorSpatialMethod<LineString> {
+
+    public static final String NAME = "ST_PointN";
+
+    public Line_ST_PointN(Expression[] parameters) {
+        super(NAME,2,LineString.class);
+    }
+
+    @Override
+    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());
+        return new OSerializableGeometry(pt);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_ExplicitPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_ExplicitPoint.java
new file mode 100644
index 0000000..eba3bce
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_ExplicitPoint.java
@@ -0,0 +1,53 @@
+/*
+ * 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.Coordinate;
+import org.locationtech.jts.geom.Point;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_ExplicitPoint. <br/>
+ * Return the coordinate values as a DOUBLE PRECISION LIST value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class Point_ST_ExplicitPoint extends AbstractAccessorSpatialMethod<Point> {
+
+    public static final String NAME = "ST_ExplicitPoint";
+
+    public Point_ST_ExplicitPoint(Expression[] parameters) {
+        super(NAME,Point.class);
+    }
+
+    @Override
+    public Object execute(Point geom, Object... params) throws ParseException {
+        final Coordinate coord = geom.getCoordinate();
+        final List<Double> values = new ArrayList<Double>(3);
+        values.add(coord.x);
+        values.add(coord.y);
+        values.add(coord.z);
+        return values;
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_X.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_X.java
new file mode 100644
index 0000000..8ae9278
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_X.java
@@ -0,0 +1,45 @@
+/*
+ * 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.Point;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_X. <br/>
+ * Observe the x coordinate value of an ST_Point value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class Point_ST_X extends AbstractAccessorSpatialMethod<Point> {
+
+    public static final String NAME = "ST_X";
+
+    public Point_ST_X(Expression[] parameters) {
+        super(NAME,Point.class);
+    }
+
+    @Override
+    public Object execute(Point geom, Object... params) throws ParseException {
+        return geom.getCoordinate().x;
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Y.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Y.java
new file mode 100644
index 0000000..6bba0b8
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Y.java
@@ -0,0 +1,45 @@
+/*
+ * 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.Point;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Y. <br/>
+ * Observe the y coordinate value of an ST_Point value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class Point_ST_Y extends AbstractAccessorSpatialMethod<Point> {
+
+    public static final String NAME = "ST_Y";
+
+    public Point_ST_Y(Expression[] parameters) {
+        super(NAME,Point.class);
+    }
+
+    @Override
+    public Object execute(Point geom, Object... params) throws ParseException {
+        return geom.getCoordinate().y;
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Z.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Z.java
new file mode 100644
index 0000000..687283f
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Z.java
@@ -0,0 +1,45 @@
+/*
+ * 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.Point;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Z. <br/>
+ * Observe the z coordinate value of an ST_Point value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class Point_ST_Z extends AbstractAccessorSpatialMethod<Point> {
+
+    public static final String NAME = "ST_Z";
+
+    public Point_ST_Z(Expression[] parameters) {
+        super(NAME,Point.class);
+    }
+
+    @Override
+    public Object execute(Point geom, Object... params) throws ParseException {
+        return geom.getCoordinate().z;
+    }
+
+}
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/todo/ST_AsBinary.java
new file mode 100644
index 0000000..147dec4
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsBinary.java
@@ -0,0 +1,48 @@
+/*
+ * 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 org.locationtech.jts.io.WKBWriter;
+import java.text.ParseException;
+import org.apache.sis.internal.filter.FilterGeometryUtils;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_AsBinary. <br/>
+ * Return the well-known binary representation of an ST_Geometry value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_AsBinary extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_AsBinary";
+
+    public ST_AsBinary(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final WKBWriter writer = FilterGeometryUtils.getWKBWriter();
+        return writer.write(geom);
+    }
+
+}
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/todo/ST_AsGML.java
new file mode 100644
index 0000000..5b35a4d
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsGML.java
@@ -0,0 +1,73 @@
+/*
+ * 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.io.StringWriter;
+import java.text.ParseException;
+import java.util.logging.Level;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import org.geotoolkit.gml.JTStoGeometry;
+import org.geotoolkit.gml.xml.AbstractGeometry;
+import org.geotoolkit.gml.xml.GMLMarshallerPool;
+import org.opengis.filter.expression.Expression;
+import org.opengis.util.FactoryException;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_AsGML. <br/>
+ * Return the GML representation of an ST_Geometry value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_AsGML extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_AsGML";
+
+    public ST_AsGML(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        Marshaller marshaller = null;
+        try{
+            final AbstractGeometry gmlgeo = JTStoGeometry.toGML("3.1.1",geom);
+
+            final StringWriter writer = new StringWriter();
+            marshaller = GMLMarshallerPool.getInstance().acquireMarshaller();
+            marshaller.marshal(gmlgeo, writer);
+            writer.flush();
+            return writer.getBuffer().toString();
+
+        }catch(FactoryException ex){
+            LOGGER.log(Level.WARNING, ex.getMessage(), ex);
+            return null;
+        }catch(JAXBException ex){
+            LOGGER.log(Level.WARNING, ex.getMessage(), ex);
+            return null;
+        }finally{
+            if(marshaller != null){
+                GMLMarshallerPool.getInstance().recycle(marshaller);
+            }
+        }
+    }
+
+}
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/todo/ST_AsText.java
new file mode 100644
index 0000000..17b5bfc
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsText.java
@@ -0,0 +1,48 @@
+/*
+ * 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 org.locationtech.jts.io.WKTWriter;
+import java.text.ParseException;
+import org.apache.sis.internal.filter.FilterGeometryUtils;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_AsText. <br/>
+ * Return the well-known text representation of an ST_Geometry value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_AsText extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_AsText";
+
+    public ST_AsText(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final WKTWriter writer = FilterGeometryUtils.getWKTWriter();
+        return writer.write(geom);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdMPolyFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdMPolyFromText.java
new file mode 100644
index 0000000..37549e2
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdMPolyFromText.java
@@ -0,0 +1,63 @@
+/*
+ * 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.LinearRing;
+import org.locationtech.jts.geom.MultiLineString;
+import org.locationtech.jts.geom.MultiPolygon;
+import org.locationtech.jts.geom.Polygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_BdMPolyFromText. <br/>
+ * Return an ST_MultiPolygon value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the well-known text representation of an ST_MultiLineString value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_BdMPolyFromText extends AbstractGeomFromText{
+
+    public static final String NAME = "ST_BdMPolyFromText";
+
+    public ST_BdMPolyFromText(Expression[] parameters){
+        super(NAME, MultiLineString.class);
+    }
+
+    @Override
+    protected OSerializableGeometry evaluateNow(Object candidate) {
+        final OSerializableGeometry sergeo = super.evaluateNow(context,candidate);
+        final MultiLineString mls = (MultiLineString) sergeo.getGeometry();
+
+        final LinearRing exterior;
+        final LinearRing[] interiors = new LinearRing[mls.getNumGeometries()-1];
+
+        exterior = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
+        for(int i=0;i<interiors.length;i++){
+            interiors[i] = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(i+1).getCoordinates());
+        }
+
+        final Polygon poly = OrientSpatialUtilities.GF.createPolygon(exterior, interiors);
+        final MultiPolygon mpoly = OrientSpatialUtilities.GF.createMultiPolygon(new Polygon[]{poly});
+        mpoly.setSRID(mls.getSRID());
+        sergeo.setGeometry(mpoly);
+        return sergeo;
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdMPolyFromWKB.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdMPolyFromWKB.java
new file mode 100644
index 0000000..baedaf7
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdMPolyFromWKB.java
@@ -0,0 +1,64 @@
+/*
+ * 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.LinearRing;
+import org.locationtech.jts.geom.MultiLineString;
+import org.locationtech.jts.geom.MultiPolygon;
+import org.locationtech.jts.geom.Polygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_BdMPolyFromWKB. <br/>
+ * Return an ST_MultiPolygon value which is transformed from a BINARY LARGE OBJECT value that
+ * represents the well-known binary representation of an ST_MultiLineString value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_BdMPolyFromWKB extends AbstractGeomFromBinary{
+
+    public static final String NAME = "ST_BdMPolyFromWKB";
+
+    public ST_BdMPolyFromWKB(Expression[] parameters){
+        super(NAME, MultiLineString.class);
+    }
+
+
+    @Override
+    protected OSerializableGeometry evaluate(Object candidate) {
+        final OSerializableGeometry sergeo = super.evaluateNow(context,candidate);
+        final MultiLineString mls = (MultiLineString) sergeo.getGeometry();
+
+        final LinearRing exterior;
+        final LinearRing[] interiors = new LinearRing[mls.getNumGeometries()-1];
+
+        exterior = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
+        for(int i=0;i<interiors.length;i++){
+            interiors[i] = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(i+1).getCoordinates());
+        }
+
+        final Polygon poly = OrientSpatialUtilities.GF.createPolygon(exterior, interiors);
+        final MultiPolygon mpoly = OrientSpatialUtilities.GF.createMultiPolygon(new Polygon[]{poly});
+        mpoly.setSRID(mls.getSRID());
+        sergeo.setGeometry(mpoly);
+        return sergeo;
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdPolyFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdPolyFromText.java
new file mode 100644
index 0000000..eb8765e
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdPolyFromText.java
@@ -0,0 +1,61 @@
+/*
+ * 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.LinearRing;
+import org.locationtech.jts.geom.MultiLineString;
+import org.locationtech.jts.geom.Polygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_BdPolyFromText. <br/>
+ * Return an ST_Polygon value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the well-known text representation of an ST_MultiLineString value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_BdPolyFromText extends AbstractGeomFromText{
+
+    public static final String NAME = "ST_BdPolyFromText";
+
+    public ST_BdPolyFromText(Expression[] parameters){
+        super(NAME, MultiLineString.class);
+    }
+
+    @Override
+    public OSerializableGeometry evaluateNow(Object candidate) {
+        final OSerializableGeometry sergeo = super.evaluateNow(context,candidate);
+        final MultiLineString mls = (MultiLineString) sergeo.getGeometry();
+
+        final LinearRing exterior;
+        final LinearRing[] interiors = new LinearRing[mls.getNumGeometries()-1];
+
+        exterior = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
+        for(int i=0;i<interiors.length;i++){
+            interiors[i] = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(i+1).getCoordinates());
+        }
+
+        final Polygon poly = OrientSpatialUtilities.GF.createPolygon(exterior, interiors);
+        poly.setSRID(mls.getSRID());
+        sergeo.setGeometry(poly);
+        return sergeo;
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdPolyFromWKB.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdPolyFromWKB.java
new file mode 100644
index 0000000..8339bc1
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_BdPolyFromWKB.java
@@ -0,0 +1,61 @@
+/*
+ * 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.LinearRing;
+import org.locationtech.jts.geom.MultiLineString;
+import org.locationtech.jts.geom.Polygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_BdPolyFromWKB. <br/>
+ * Return an ST_Polygon value which is transformed from a BINARY LARGE OBJECT value that represents the
+ * well-known binary representation of an ST_Polygon value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_BdPolyFromWKB extends AbstractGeomFromBinary{
+
+    public static final String NAME = "ST_BdPolyFromWKB";
+
+    public ST_BdPolyFromWKB(Expression[] parameters){
+        super(NAME, MultiLineString.class);
+    }
+
+    @Override
+    public OSerializableGeometry evaluate(Object candidate) {
+        final OSerializableGeometry sergeo = super.evaluateNow(context,candidate);
+        final MultiLineString mls = (MultiLineString) sergeo.getGeometry();
+
+        final LinearRing exterior;
+        final LinearRing[] interiors = new LinearRing[mls.getNumGeometries()-1];
+
+        exterior = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
+        for(int i=0;i<interiors.length;i++){
+            interiors[i] = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(i+1).getCoordinates());
+        }
+
+        final Polygon poly = OrientSpatialUtilities.GF.createPolygon(exterior, interiors);
+        poly.setSRID(mls.getSRID());
+        sergeo.setGeometry(poly);
+        return sergeo;
+    }
+
+}
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/todo/ST_Boundary.java
new file mode 100644
index 0000000..a162f22
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Boundary.java
@@ -0,0 +1,48 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Boundary. <br/>
+ * Return the boundary of 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_Boundary extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_Boundary";
+
+    public ST_Boundary(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry bound = geom.getBoundary();
+        bound.setSRID(geom.getSRID());
+        return new OSerializableGeometry(bound);
+    }
+
+}
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
new file mode 100644
index 0000000..f66f2d5
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Buffer.java
@@ -0,0 +1,50 @@
+/*
+ * 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.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 AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_Buffer";
+
+    public ST_Buffer(Expression[] parameters) {
+        super(NAME,2,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 new OSerializableGeometry(res);
+    }
+
+}
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/todo/ST_Contains.java
new file mode 100644
index 0000000..724b042
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Contains.java
@@ -0,0 +1,46 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Contains. <br/>
+ * Test if an ST_Geometry value spatially 2D contains another ST_Geometry value, ignoring z and m coordinate
+ * values in the calculations.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Contains extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Contains";
+
+    public ST_Contains(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        return left.contains(right);
+    }
+
+}
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/todo/ST_ConvexHull.java
new file mode 100644
index 0000000..c2023bb
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ConvexHull.java
@@ -0,0 +1,48 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_ConvexHull. <br/>
+ * Return the convex hull of 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_ConvexHull extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_ConvexHull";
+
+    public ST_ConvexHull(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry res = geom.convexHull();
+        res.setSRID(geom.getSRID());
+        return new OSerializableGeometry(res);
+    }
+
+}
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/todo/ST_CoordDim.java
new file mode 100644
index 0000000..ff4e87c
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_CoordDim.java
@@ -0,0 +1,51 @@
+/*
+ * 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.Coordinate;
+import org.locationtech.jts.geom.Geometry;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_CoordDim. <br/>
+ * Return the coordinate dimension of the ST_Geometry value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_CoordDim extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_CoordDim";
+
+    public ST_CoordDim(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Coordinate c = geom.getCoordinate();
+        if(c != null){
+            return Double.isNaN(c.z) ? 2 : 3;
+        }
+
+        return null;
+    }
+
+}
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/todo/ST_Crosses.java
new file mode 100644
index 0000000..2fa0221
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Crosses.java
@@ -0,0 +1,47 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Crosses. <br/>
+ * Test if an ST_Geometry value spatially 2D crosses another ST_Geometry value, ignoring z and m coordinate
+values in the calculations.
+
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Crosses extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Crosses";
+
+    public ST_Crosses(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        return left.crosses(right);
+    }
+
+}
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/todo/ST_Difference.java
new file mode 100644
index 0000000..96d88fc
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Difference.java
@@ -0,0 +1,48 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Difference. <br/>
+ * Return an ST_Geometry value that represents the point set difference of two ST_Geometry values, 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_Difference extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Difference";
+
+    public ST_Difference(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        final Geometry res = left.difference(right);
+        res.setSRID(left.getSRID());
+        return new OSerializableGeometry(res);
+    }
+
+}
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/todo/ST_Dimension.java
new file mode 100644
index 0000000..e8b29a4
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Dimension.java
@@ -0,0 +1,45 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Dimension. <br/>
+ * Return the dimension of the ST_Geometry value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Dimension extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_Dimension";
+
+    public ST_Dimension(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        return geom.getDimension();
+    }
+
+}
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/todo/ST_Disjoint.java
new file mode 100644
index 0000000..1ee8acf
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Disjoint.java
@@ -0,0 +1,46 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Disjoint. <br/>
+ * Test if an ST_Geometry value is spatially 2D disjoint from another ST_Geometry value, ignoring z and m
+ * coordinate values in the calculations.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Disjoint extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Disjoint";
+
+    public ST_Disjoint(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        return left.disjoint(right);
+    }
+
+}
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/todo/ST_Distance.java
new file mode 100644
index 0000000..09a5686
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Distance.java
@@ -0,0 +1,46 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Distance. <br/>
+ * Return the distance between two geometry values, ignoring z and m coordinate values in the calculations.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Distance extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Distance";
+
+    public ST_Distance(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        final double d = left.distance(right);
+        return d;
+    }
+
+}
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
new file mode 100644
index 0000000..35bb67b
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Envelope.java
@@ -0,0 +1,48 @@
+/*
+ * 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.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 AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_Envelope";
+
+    public ST_Envelope(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry env = geom.getEnvelope();
+        env.setSRID(geom.getSRID());
+        return new OSerializableGeometry(env);
+    }
+
+}
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/todo/ST_Equals.java
new file mode 100644
index 0000000..f7bd472
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Equals.java
@@ -0,0 +1,46 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Equals. <br/>
+ * Test if an ST_Geometry value is spatially 2D equal to another ST_Geometry value, ignoring z and m
+ * coordinate values in the calculations.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Equals extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Equals";
+
+    public ST_Equals(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        return left.equals(right);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollFromGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollFromGML.java
new file mode 100644
index 0000000..92c9307
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollFromGML.java
@@ -0,0 +1,40 @@
+/*
+ * 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.GeometryCollection;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_GeomCollFromGML. <br/>
+ * Return an ST_GeomCollection value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the GML representationof an ST_GeomCollection value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_GeomCollFromGML extends AbstractGeomFromGML{
+
+    public static final String NAME = "ST_GeomCollFromGML";
+
+    public ST_GeomCollFromGML(Expression[] parameters){
+        super(NAME, GeometryCollection.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollFromText.java
new file mode 100644
index 0000000..fd49ec4
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollFromText.java
@@ -0,0 +1,40 @@
+/*
+ * 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.GeometryCollection;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_GeomCollFromText. <br/>
+ * Return an ST_GeomCollection value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the well-known text representation of an ST_GeomCollection value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_GeomCollFromText extends AbstractGeomFromText{
+
+    public static final String NAME = "ST_GeomCollFromText";
+
+    public ST_GeomCollFromText(Expression[] parameters){
+        super(NAME, GeometryCollection.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollFromWKB.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollFromWKB.java
new file mode 100644
index 0000000..cf9d9d5
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollFromWKB.java
@@ -0,0 +1,40 @@
+/*
+ * 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 org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_GeomCollFromWKB. <br/>
+ * Return an ST_GeomCollection value which is transformed from a BINARY LARGE OBJECT value that
+ * represents the well-known binary representation of an ST_GeomCollection value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_GeomCollFromWKB extends AbstractGeomFromBinary{
+
+    public static final String NAME = "ST_GeomCollFromWKB";
+
+    public ST_GeomCollFromWKB(Expression[] parameters){
+        super(NAME,Geometry.class);
+    }
+
+}
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/todo/ST_GeomCollection.java
new file mode 100644
index 0000000..33405f1
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollection.java
@@ -0,0 +1,38 @@
+/*
+ * 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.GeometryCollection;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_GeomCollection. <br/>
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_GeomCollection extends AbstractGeomConstructor{
+
+    public static final String NAME = "ST_GeomCollection";
+
+    public ST_GeomCollection(Expression[] parameters){
+        super(NAME, GeometryCollection.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomFromGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomFromGML.java
new file mode 100644
index 0000000..6c7e9de
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomFromGML.java
@@ -0,0 +1,40 @@
+/*
+ * 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 org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_GeomFromGML. <br/>
+ * Return an ST_Geometry value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the GML representationof an ST_Geometry.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_GeomFromGML extends AbstractGeomFromGML{
+
+    public static final String NAME = "ST_GeomFromGML";
+
+    public ST_GeomFromGML(Expression[] parameters){
+        super(NAME,Geometry.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomFromText.java
new file mode 100644
index 0000000..59dc8a6
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomFromText.java
@@ -0,0 +1,40 @@
+/*
+ * 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 org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_GeomFromText. <br/>
+ * Return an ST_Geometry value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the well-known text representation of an ST_Geometry value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_GeomFromText extends AbstractGeomFromText{
+
+    public static final String NAME = "ST_GeomFromText";
+
+    public ST_GeomFromText(Expression[] parameters){
+        super(NAME,Geometry.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomFromWKB.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomFromWKB.java
new file mode 100644
index 0000000..2157cd7
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomFromWKB.java
@@ -0,0 +1,40 @@
+/*
+ * 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 org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_GeomFromWKB. <br/>
+ * Return an ST_Geometry value which is transformed from a BINARY LARGE OBJECT value that represents
+ * the well-known binary representation of an ST_Geometry value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_GeomFromWKB extends AbstractGeomFromBinary{
+
+    public static final String NAME = "ST_GeomFromWKB";
+
+    public ST_GeomFromWKB(Expression[] parameters){
+        super(NAME,Geometry.class);
+    }
+
+}
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/todo/ST_GeometryType.java
new file mode 100644
index 0000000..dbf374c
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryType.java
@@ -0,0 +1,72 @@
+/*
+ * 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 org.locationtech.jts.geom.GeometryCollection;
+import org.locationtech.jts.geom.LineString;
+import org.locationtech.jts.geom.MultiLineString;
+import org.locationtech.jts.geom.MultiPoint;
+import org.locationtech.jts.geom.MultiPolygon;
+import org.locationtech.jts.geom.Point;
+import org.locationtech.jts.geom.Polygon;
+import java.text.ParseException;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_GeometryType. <br/>
+ * Returns the geometry type name.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_GeometryType extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_GeometryType";
+
+    private static final Map<Class,String> TYPES = new LinkedHashMap<Class, String>();
+    static {
+        TYPES.put(Point.class,              "ST_Point");
+        TYPES.put(LineString.class,         "ST_LineString");
+        TYPES.put(Polygon.class,            "ST_Polygon");
+        TYPES.put(MultiPoint.class,         "ST_MultiPoint");
+        TYPES.put(MultiLineString.class,    "ST_MultiLineString");
+        TYPES.put(MultiPolygon.class,       "ST_MultiPolygon");
+        TYPES.put(GeometryCollection.class, "ST_GeomCollection");
+        TYPES.put(Geometry.class,           "ST_Geometry");
+    }
+
+    public ST_GeometryType(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        for(Entry<Class,String> entry : TYPES.entrySet()){
+            if(entry.getKey().isInstance(geom)){
+                return entry.getValue();
+            }
+        }
+        return null;
+    }
+
+}
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/todo/ST_Intersection.java
new file mode 100644
index 0000000..10608d2
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersection.java
@@ -0,0 +1,48 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Intersection. <br/>
+ * Return an ST_Geometry value that represents the point set intersection of two ST_Geometry values, 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_Intersection extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Intersection";
+
+    public ST_Intersection(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        final Geometry res = left.intersection(right);
+        res.setSRID(left.getSRID());
+        return new OSerializableGeometry(res);
+    }
+
+}
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/todo/ST_Intersects.java
new file mode 100644
index 0000000..38bcc20
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersects.java
@@ -0,0 +1,47 @@
+/*
+ * 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.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.
+
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Intersects extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Intersects";
+
+    public ST_Intersects(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        return left.intersects(right);
+    }
+
+}
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/todo/ST_Is3D.java
new file mode 100644
index 0000000..6b63336
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Is3D.java
@@ -0,0 +1,51 @@
+/*
+ * 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.Coordinate;
+import org.locationtech.jts.geom.Geometry;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Is3D. <br/>
+ * Test if an ST_Geometry value has z coordinate values.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Is3D extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_Is3D";
+
+    public ST_Is3D(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Coordinate c = geom.getCoordinate();
+        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_IsEmpty.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsEmpty.java
new file mode 100644
index 0000000..f4696f2
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsEmpty.java
@@ -0,0 +1,45 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_IsEmpty. <br/>
+ * Test if an ST_Geometry value corresponds to the empty set.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_IsEmpty extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_IsEmpty";
+
+    public ST_IsEmpty(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        return geom.isEmpty();
+    }
+
+}
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/todo/ST_IsSimple.java
new file mode 100644
index 0000000..8f6fc68
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsSimple.java
@@ -0,0 +1,46 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_IsSimple. <br/>
+ * Test if an ST_Geometry value has no anomalous geometric points, such as self intersection, ignoring z
+ * coordinate values in the determination.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_IsSimple extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_IsSimple";
+
+    public ST_IsSimple(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        return geom.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/todo/ST_IsValid.java
new file mode 100644
index 0000000..5646d16
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsValid.java
@@ -0,0 +1,45 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_IsValid. <br/>
+ * Test if an ST_Geometry value is well formed.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_IsValid extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_IsValid";
+
+    public ST_IsValid(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        return geom.isValid();
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineFromGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineFromGML.java
new file mode 100644
index 0000000..5f81128
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineFromGML.java
@@ -0,0 +1,40 @@
+/*
+ * 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.LineString;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_LineFromGML. <br/>
+ * Return an ST_LineString value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the GML representation of an ST_LineString value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_LineFromGML extends AbstractGeomFromGML{
+
+    public static final String NAME = "ST_LineFromGML";
+
+    public ST_LineFromGML(Expression[] parameters){
+        super(NAME, LineString.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineFromText.java
new file mode 100644
index 0000000..9d5c864
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineFromText.java
@@ -0,0 +1,40 @@
+/*
+ * 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.LineString;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_LineFromText. <br/>
+ * Return an ST_LineString value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the well-known text representation of an ST_LineString value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_LineFromText extends AbstractGeomFromText{
+
+    public static final String NAME = "ST_LineFromText";
+
+    public ST_LineFromText(Expression[] parameters){
+        super(NAME, LineString.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineFromWKB.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineFromWKB.java
new file mode 100644
index 0000000..c503996
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineFromWKB.java
@@ -0,0 +1,40 @@
+/*
+ * 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.LineString;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_LineFromWKB. <br/>
+ * Return an ST_LineString value which is transformed from a BINARY LARGE OBJECT value that represents
+ * the well-known binary representation of an ST_LineString value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_LineFromWKB extends AbstractGeomFromBinary{
+
+    public static final String NAME = "ST_LineFromWKB";
+
+    public ST_LineFromWKB(Expression[] parameters){
+        super(NAME, LineString.class);
+    }
+
+}
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
new file mode 100644
index 0000000..c8c0dc3
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineString.java
@@ -0,0 +1,38 @@
+/*
+ * 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.LineString;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_LineString. <br/>
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_LineString extends AbstractGeomConstructor{
+
+    public static final String NAME = "ST_LineString";
+
+    public ST_LineString(Expression[] parameters){
+        super(NAME, LineString.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MLineFromGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MLineFromGML.java
new file mode 100644
index 0000000..b0cee6d
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MLineFromGML.java
@@ -0,0 +1,40 @@
+/*
+ * 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.MultiLineString;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MPointFromGML. <br/>
+ * Return an ST_MultiLineString value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the GML representationof an ST_MultiLineString value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MLineFromGML extends AbstractGeomFromGML{
+
+    public static final String NAME = "ST_MLineFromGML";
+
+    public ST_MLineFromGML(Expression[] parameters){
+        super(NAME, MultiLineString.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MLineFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MLineFromText.java
new file mode 100644
index 0000000..b714a75
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MLineFromText.java
@@ -0,0 +1,40 @@
+/*
+ * 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.MultiLineString;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MLineFromText. <br/>
+ * Return an ST_MultiLineString value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the well-known text representation of an ST_MultiLineString value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MLineFromText extends AbstractGeomFromText{
+
+    public static final String NAME = "ST_MLineFromText";
+
+    public ST_MLineFromText(Expression[] parameters){
+        super(NAME, MultiLineString.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MLineFromWKB.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MLineFromWKB.java
new file mode 100644
index 0000000..a021e38
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MLineFromWKB.java
@@ -0,0 +1,40 @@
+/*
+ * 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.MultiLineString;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MPointFromWKB. <br/>
+ * Return an ST_MultiLineString value which is transformed from a BINARY LARGE OBJECT value that
+ * represents the well-known binary representation of an ST_MultiLineString value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MLineFromWKB extends AbstractGeomFromBinary{
+
+    public static final String NAME = "ST_MLineFromWKB";
+
+    public ST_MLineFromWKB(Expression[] parameters){
+        super(NAME, MultiLineString.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPointFromGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPointFromGML.java
new file mode 100644
index 0000000..8dcc73e
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPointFromGML.java
@@ -0,0 +1,40 @@
+/*
+ * 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.MultiPoint;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MPointFromGML. <br/>
+ * Return an ST_MultiPoint value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the GML representation of an ST_MultiPoint value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MPointFromGML extends AbstractGeomFromGML{
+
+    public static final String NAME = "ST_MPointFromGML";
+
+    public ST_MPointFromGML(Expression[] parameters){
+        super(NAME, MultiPoint.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPointFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPointFromText.java
new file mode 100644
index 0000000..f53794b
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPointFromText.java
@@ -0,0 +1,40 @@
+/*
+ * 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.MultiPoint;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MPointFromText. <br/>
+ * Return an ST_MultiPoint value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the well-known text representation of an ST_MultiPoint value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MPointFromText extends AbstractGeomFromText{
+
+    public static final String NAME = "ST_MPointFromText";
+
+    public ST_MPointFromText(Expression[] parameters){
+        super(NAME, MultiPoint.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPointFromWKB.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPointFromWKB.java
new file mode 100644
index 0000000..75e876c
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPointFromWKB.java
@@ -0,0 +1,40 @@
+/*
+ * 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.MultiPoint;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MPointFromWKB. <br/>
+ * Return an ST_MultiPoint value which is transformed from a BINARY LARGE OBJECT value that represents
+ * the well-known binary representation of an ST_MultiPoint value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MPointFromWKB extends AbstractGeomFromBinary{
+
+    public static final String NAME = "ST_MPointFromWKB";
+
+    public ST_MPointFromWKB(Expression[] parameters){
+        super(NAME, MultiPoint.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPolyFromGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPolyFromGML.java
new file mode 100644
index 0000000..224c0d6
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPolyFromGML.java
@@ -0,0 +1,40 @@
+/*
+ * 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.MultiPolygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MPolyFromGML. <br/>
+ * Return an ST_MultiPolygon value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the GML representationof an ST_MultiPolygon value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MPolyFromGML extends AbstractGeomFromGML{
+
+    public static final String NAME = "ST_MPolyFromGML";
+
+    public ST_MPolyFromGML(Expression[] parameters){
+        super(NAME, MultiPolygon.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPolyFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPolyFromText.java
new file mode 100644
index 0000000..c2cc4b3
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPolyFromText.java
@@ -0,0 +1,40 @@
+/*
+ * 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.MultiPolygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MPolyFromText. <br/>
+ * Return an ST_MultiPolygon value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the well-known text representation of an ST_MultiPolygon value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MPolyFromText extends AbstractGeomFromText{
+
+    public static final String NAME = "ST_MPolyFromText";
+
+    public ST_MPolyFromText(Expression[] parameters){
+        super(NAME, MultiPolygon.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPolyFromWKB.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPolyFromWKB.java
new file mode 100644
index 0000000..49114f0
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MPolyFromWKB.java
@@ -0,0 +1,40 @@
+/*
+ * 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.MultiPolygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MPolyFromWKB. <br/>
+ * Return an ST_MultiPolygon value which is transformed from a BINARY LARGE OBJECT value that
+ * represents the well-known binary representation of an ST_MultiPolygon value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MPolyFromWKB extends AbstractGeomFromBinary{
+
+    public static final String NAME = "ST_MPolyFromWKB";
+
+    public ST_MPolyFromWKB(Expression[] parameters){
+        super(NAME, MultiPolygon.class);
+    }
+
+}
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/todo/ST_MultiLineString.java
new file mode 100644
index 0000000..1a807ab
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiLineString.java
@@ -0,0 +1,38 @@
+/*
+ * 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.MultiLineString;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MultiLineString. <br/>
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MultiLineString extends AbstractGeomConstructor{
+
+    public static final String NAME = "ST_MultiLineString";
+
+    public ST_MultiLineString(Expression[] parameters){
+        super(NAME, MultiLineString.class);
+    }
+
+}
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/todo/ST_MultiPoint.java
new file mode 100644
index 0000000..9caaa9b
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPoint.java
@@ -0,0 +1,38 @@
+/*
+ * 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.MultiPoint;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MultiPoint. <br/>
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MultiPoint extends AbstractGeomConstructor{
+
+    public static final String NAME = "ST_MultiPoint";
+
+    public ST_MultiPoint(Expression[] parameters){
+        super(NAME, MultiPoint.class);
+    }
+
+}
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/todo/ST_MultiPolygon.java
new file mode 100644
index 0000000..04794dc
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPolygon.java
@@ -0,0 +1,38 @@
+/*
+ * 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.MultiPolygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_MultiPolygon. <br/>
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_MultiPolygon extends AbstractGeomConstructor{
+
+    public static final String NAME = "ST_MultiPolygon";
+
+    public ST_MultiPolygon(Expression[] parameters){
+        super(NAME, MultiPolygon.class);
+    }
+
+}
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/todo/ST_Overlaps.java
new file mode 100644
index 0000000..17a5c06
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Overlaps.java
@@ -0,0 +1,46 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Overlaps. <br/>
+ * Test if an ST_Geometry value spatially 2D overlaps another ST_Geometry value, ignoring z and m coordinate
+ * values in the calculations.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Overlaps extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Overlaps";
+
+    public ST_Overlaps(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        return left.overlaps(right);
+    }
+
+}
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
new file mode 100644
index 0000000..3675df3
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Point.java
@@ -0,0 +1,107 @@
+/*
+ * 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.Coordinate;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.io.ParseException;
+import java.math.BigDecimal;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Point. <br/>
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Point extends AbstractSpatialFunction{
+
+    public static final String NAME = "ST_Point";
+
+    public ST_Point(Expression[] parameters){
+        super(NAME,1,4);
+    }
+
+    @Override
+    public String getSyntax() {
+        return "ST_Point( x ,y [,z] [,srid] ) "
+          + "or ST_Point( wkt [,srid] ) "
+          + "or ST_Point( wkb [,srid] )";
+    }
+
+
+    @Override
+    protected Object evaluateNow(OCommandContext context, Object candidate) {
+        final int nbarg = children.size();
+        final Geometry geom;
+        if(nbarg == 1){
+            try {
+                //WKB or WKT
+                geom = OrientSpatialUtilities.toGeometry(children.get(0).evaluate(context, candidate));
+            } catch (ParseException ex) {
+                throw new OException(ex.getMessage(), ex);
+            }
+
+        }else if(nbarg == 2){
+            final Object arg0 = children.get(0).evaluate(context, candidate);
+            final Object arg1 = children.get(1).evaluate(context, candidate);
+            if(arg0 instanceof Number){
+                // X,Y
+                final Number obj1 = (Number) arg0;
+                final Number obj2 = (Number) arg1;
+                geom = GF.createPoint(new Coordinate(obj1.doubleValue(), obj2.doubleValue()));
+            }else{
+                //WKT/WKB + srid
+                try {
+                    //WKB or WKT
+                    geom = OrientSpatialUtilities.toGeometry(arg0);
+                } catch (ParseException ex) {
+                    throw new OException(ex.getMessage(), ex);
+                }
+                geom.setSRID(((Number)arg1).intValue());
+            }
+
+        }else if(nbarg == 3){
+            final Number obj1 = (Number) children.get(0).evaluate(context, candidate);
+            final Number obj2 = (Number) children.get(1).evaluate(context, candidate);
+            final Number obj3 = (Number) children.get(2).evaluate(context, candidate);
+            geom = GF.createPoint(new Coordinate(obj1.doubleValue(), obj2.doubleValue()));
+            if(obj3 instanceof Float || obj3 instanceof Double || obj3 instanceof BigDecimal){
+                // Z
+                geom.getCoordinate().z = obj3.doubleValue();
+            }else{
+                // srid
+                geom.setSRID(obj3.intValue());
+            }
+
+        }else if(nbarg == 4){
+            final Number obj1 = (Number) children.get(0).evaluate(context, candidate);
+            final Number obj2 = (Number) children.get(1).evaluate(context, candidate);
+            final Number obj3 = (Number) children.get(2).evaluate(context, candidate);
+            geom = GF.createPoint(new Coordinate(obj1.doubleValue(), obj2.doubleValue(), obj3.doubleValue()));
+            geom.setSRID( ((Number) children.get(3).evaluate(context, candidate) ).intValue() );
+
+        }else{
+            throw new OException("Unexpected number of arguments : "+children.size());
+        }
+
+        return new OSerializableGeometry(geom);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointFromGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointFromGML.java
new file mode 100644
index 0000000..ff5c680
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointFromGML.java
@@ -0,0 +1,40 @@
+/*
+ * 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.Point;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_PointFromGML. <br/>
+ * Return an ST_Point value which is transformed from a CHARACTER LARGE OBJECT value that represents
+ * the GML representationof an ST_Point.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_PointFromGML extends AbstractGeomFromGML{
+
+    public static final String NAME = "ST_PointFromGML";
+
+    public ST_PointFromGML(Expression[] parameters){
+        super(NAME, Point.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointFromText.java
new file mode 100644
index 0000000..031b4ac
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointFromText.java
@@ -0,0 +1,40 @@
+/*
+ * 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.Point;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_PointFromText. <br/>
+ * Return an ST_Point value which is transformed from a CHARACTER LARGE OBJECT value that represents
+ * the well-known text representation of an ST_Point value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_PointFromText extends AbstractGeomFromText{
+
+    public static final String NAME = "ST_PointFromText";
+
+    public ST_PointFromText(Expression[] parameters){
+        super(NAME, Point.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointFromWKB.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointFromWKB.java
new file mode 100644
index 0000000..6178f71
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointFromWKB.java
@@ -0,0 +1,40 @@
+/*
+ * 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.Point;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_PointFromWKB. <br/>
+ * Return an ST_Point value which is transformed from a BINARY LARGE OBJECT value that represents the
+ * well-known binary representation of an ST_Point value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_PointFromWKB extends AbstractGeomFromBinary{
+
+    public static final String NAME = "ST_PointFromWKB";
+
+    public ST_PointFromWKB(Expression[] parameters){
+        super(NAME, Point.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PolyFromGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PolyFromGML.java
new file mode 100644
index 0000000..18cd626
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PolyFromGML.java
@@ -0,0 +1,40 @@
+/*
+ * 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.Polygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_PolyFromGML. <br/>
+ * Return an ST_Polygon value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the GML representationof an ST_Polygon value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_PolyFromGML extends AbstractGeomFromGML{
+
+    public static final String NAME = "ST_PolyFromGML";
+
+    public ST_PolyFromGML(Expression[] parameters){
+        super(NAME, Polygon.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PolyFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PolyFromText.java
new file mode 100644
index 0000000..b6a1b6d
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PolyFromText.java
@@ -0,0 +1,40 @@
+/*
+ * 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.Polygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_PolyFromText. <br/>
+ * Return an ST_Polygon value which is transformed from a CHARACTER LARGE OBJECT value that
+ * represents the well-known text representation of an ST_Polygon value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_PolyFromText extends AbstractGeomFromText{
+
+    public static final String NAME = "ST_PolyFromText";
+
+    public ST_PolyFromText(Expression[] parameters){
+        super(NAME, Polygon.class);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PolyFromWKB.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PolyFromWKB.java
new file mode 100644
index 0000000..2d7893b
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PolyFromWKB.java
@@ -0,0 +1,40 @@
+/*
+ * 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.Polygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_PolyFromWKB. <br/>
+ * Return an ST_Polygon value which is transformed from a BINARY LARGE OBJECT value that represents the
+ * well-known binary representation of an ST_Polygon value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_PolyFromWKB extends AbstractGeomFromBinary{
+
+    public static final String NAME = "ST_PolyFromWKB";
+
+    public ST_PolyFromWKB(Expression[] parameters){
+        super(NAME, Polygon.class);
+    }
+
+}
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/todo/ST_Polygon.java
new file mode 100644
index 0000000..5c7b31e
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Polygon.java
@@ -0,0 +1,38 @@
+/*
+ * 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.Polygon;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Polygon. <br/>
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Polygon extends AbstractGeomConstructor{
+
+    public static final String NAME = "ST_Polygon";
+
+    public ST_Polygon(Expression[] parameters){
+        super(NAME, Polygon.class);
+    }
+
+}
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/todo/ST_Relate.java
new file mode 100644
index 0000000..cd159ca
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Relate.java
@@ -0,0 +1,47 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Relate. <br/>
+ * Test if an ST_Geometry value is spatially 2D related to another ST_Geometry value, ignoring z and m
+ * coordinate values in the calculations.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Relate extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Relate";
+
+    public ST_Relate(Expression[] parameters) {
+        super(NAME,2);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        final boolean res = left.relate(right, params[1].toString());
+        return res;
+    }
+
+}
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/todo/ST_SRID.java
new file mode 100644
index 0000000..26115db
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SRID.java
@@ -0,0 +1,45 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_SRID. <br/>
+ * Observe the spatial reference system identifier of the ST_Geometry value.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_SRID extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_SRID";
+
+    public ST_SRID(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        return geom.getSRID();
+    }
+
+}
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/todo/ST_SymDifference.java
new file mode 100644
index 0000000..95cb8eb
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SymDifference.java
@@ -0,0 +1,48 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_SymDifference. <br/>
+ * Return an ST_Geometry value that represents the point set symmetric difference of two ST_Geometry values,
+ * 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_SymDifference extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_SymDifference";
+
+    public ST_SymDifference(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        final Geometry res = left.symDifference(right);
+        res.setSRID(left.getSRID());
+        return res;
+    }
+
+}
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
new file mode 100644
index 0000000..d6a2c42
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToGeomColl.java
@@ -0,0 +1,48 @@
+/*
+ * 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 org.locationtech.jts.geom.GeometryCollection;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_ToGeomColl. <br/>
+ * Cast an ST_Geometry value to a specific instantiable subtype of ST_Geometry.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_ToGeomColl extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_ToGeomColl";
+
+    public ST_ToGeomColl(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry env = MappingUtils.convertType(geom, GeometryCollection.class);
+        env.setSRID(geom.getSRID());
+        return env;
+    }
+
+}
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
new file mode 100644
index 0000000..fd4bd49
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToLineString.java
@@ -0,0 +1,48 @@
+/*
+ * 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 org.locationtech.jts.geom.LineString;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_ToLineString. <br/>
+ * Cast an ST_Geometry value to a specific instantiable subtype of ST_Geometry.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_ToLineString extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_ToLineString";
+
+    public ST_ToLineString(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry env = MappingUtils.convertType(geom, LineString.class);
+        env.setSRID(geom.getSRID());
+        return env;
+    }
+
+}
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
new file mode 100644
index 0000000..e6c21bc
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiLine.java
@@ -0,0 +1,48 @@
+/*
+ * 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 org.locationtech.jts.geom.MultiLineString;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_ToMultiLine. <br/>
+ * Cast an ST_Geometry value to a specific instantiable subtype of ST_Geometry.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_ToMultiLine extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_ToMultiLine";
+
+    public ST_ToMultiLine(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry env = MappingUtils.convertType(geom, MultiLineString.class);
+        env.setSRID(geom.getSRID());
+        return env;
+    }
+
+}
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
new file mode 100644
index 0000000..7a41e3d
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPoint.java
@@ -0,0 +1,48 @@
+/*
+ * 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 org.locationtech.jts.geom.MultiPoint;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_ToMultiPoint. <br/>
+ * Cast an ST_Geometry value to a specific instantiable subtype of ST_Geometry.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_ToMultiPoint extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_ToMultiPoint";
+
+    public ST_ToMultiPoint(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry env = MappingUtils.convertType(geom, MultiPoint.class);
+        env.setSRID(geom.getSRID());
+        return env;
+    }
+
+}
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
new file mode 100644
index 0000000..61b40bc
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPolygon.java
@@ -0,0 +1,48 @@
+/*
+ * 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 org.locationtech.jts.geom.MultiPolygon;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_ToMultiPolygon. <br/>
+ * Cast an ST_Geometry value to a specific instantiable subtype of ST_Geometry.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_ToMultiPolygon extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_ToMultiPolygon";
+
+    public ST_ToMultiPolygon(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry env = MappingUtils.convertType(geom, MultiPolygon.class);
+        env.setSRID(geom.getSRID());
+        return env;
+    }
+
+}
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
new file mode 100644
index 0000000..d6b57cf
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPoint.java
@@ -0,0 +1,48 @@
+/*
+ * 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 org.locationtech.jts.geom.Point;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_ToPoint. <br/>
+ * Cast an ST_Geometry value to a specific instantiable subtype of ST_Geometry.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_ToPoint extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_ToPoint";
+
+    public ST_ToPoint(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry env = MappingUtils.convertType(geom, Point.class);
+        env.setSRID(geom.getSRID());
+        return env;
+    }
+
+}
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
new file mode 100644
index 0000000..886bb9b
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPolygon.java
@@ -0,0 +1,48 @@
+/*
+ * 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 org.locationtech.jts.geom.Polygon;
+import java.text.ParseException;
+import org.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_ToPolygon. <br/>
+ * Cast an ST_Geometry value to a specific instantiable subtype of ST_Geometry.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_ToPolygon extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_ToPolygon";
+
+    public ST_ToPolygon(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry env = MappingUtils.convertType(geom, Polygon.class);
+        env.setSRID(geom.getSRID());
+        return env;
+    }
+
+}
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/todo/ST_Touches.java
new file mode 100644
index 0000000..78e3a65
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Touches.java
@@ -0,0 +1,46 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_touches. <br/>
+ * Test if an ST_Geometry value spatially 2D touches another ST_Geometry value, ignoring z and m coordinate
+ * values in the calculations.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Touches extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Touches";
+
+    public ST_Touches(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        return left.touches(right);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Transform.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Transform.java
new file mode 100644
index 0000000..019461d
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Transform.java
@@ -0,0 +1,61 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.opengis.referencing.operation.MathTransform;
+import org.opengis.referencing.operation.TransformException;
+import org.opengis.util.FactoryException;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Transform. <br/>
+ * Return an ST_Geometry value transformed to the specified spatial reference system, considering z and m
+ * coordinate values in the calculations and including them in the resultant geometry.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Transform extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_Transform";
+
+    public ST_Transform(Expression[] parameters) {
+        super(NAME,2,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final int targetSRID = Integer.parseInt(params[1].toString());
+        //TODO should use local database EPSG factory
+        try{
+            final CoordinateReferenceSystem baseCRS = JTS.findCoordinateReferenceSystem(geom);
+            final CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:"+targetSRID);
+            final MathTransform trs = CRS.findMathTransform(baseCRS, targetCRS);
+            return new OSerializableGeometry(JTS.transform(geom, trs));
+        }catch(FactoryException ex){
+            throw new OException(ex.getMessage(),ex);
+        }catch(TransformException ex){
+            throw new OException(ex.getMessage(),ex);
+        }
+    }
+
+}
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/todo/ST_Union.java
new file mode 100644
index 0000000..69fdfd0
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Union.java
@@ -0,0 +1,48 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Union. <br/>
+ * Return an ST_Geometry value that represents the point set union of two ST_Geometry values, 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_Union extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Union";
+
+    public ST_Union(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        final Geometry res = left.union(right);
+        res.setSRID(left.getSRID());
+        return res;
+    }
+
+}
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/todo/ST_Within.java
new file mode 100644
index 0000000..0eb75ee
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Within.java
@@ -0,0 +1,46 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Within. <br/>
+ * Test if an ST_Geometry value is spatially 2D within another ST_Geometry value, ignoring z and m coordinate
+ * values in the calculations.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public final class ST_Within extends AbstractBinarySpatialMethod {
+
+    public static final String NAME = "ST_Within";
+
+    public ST_Within(Expression[] parameters) {
+        super(NAME);
+    }
+
+    @Override
+    public Object execute(Geometry left, Geometry right, Object... params) throws ParseException {
+        return left.within(right);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/SpatialFunctionFactory.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/SpatialFunctionFactory.java
new file mode 100644
index 0000000..6b061e3
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/SpatialFunctionFactory.java
@@ -0,0 +1,123 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.logging.Logger;
+import org.apache.sis.util.logging.Logging;
+
+/**
+ * SQL/MM spatial function factory.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public class SpatialFunctionFactory implements OSQLFunctionFactory{
+
+    static final Logger LOGGER = Logging.getLogger("org.geotoolkit.data.orientdb.function");
+
+    private static final Map<String,Object> FUNCTIONS = new HashMap<String, Object>();
+    private static final Map<String,Object> FUNCTIONS_UPPERCASE = new HashMap<String, Object>();
+    static {
+
+        //geometric constructor function
+        FUNCTIONS.put(ST_Point.NAME, ST_Point.class);
+        FUNCTIONS.put(ST_LineString.NAME, ST_LineString.class);
+        FUNCTIONS.put(ST_Polygon.NAME, ST_Polygon.class);
+        FUNCTIONS.put(ST_GeomCollection.NAME, ST_GeomCollection.class);
+        FUNCTIONS.put(ST_MultiPoint.NAME, ST_MultiPoint.class);
+        FUNCTIONS.put(ST_MultiLineString.NAME, ST_MultiLineString.class);
+        FUNCTIONS.put(ST_MultiPolygon.NAME, ST_MultiPolygon.class);
+
+        FUNCTIONS.put(ST_GeomFromText.NAME, ST_GeomFromText.class);
+        FUNCTIONS.put(ST_PointFromText.NAME, ST_PointFromText.class);
+        FUNCTIONS.put(ST_LineFromText.NAME, ST_LineFromText.class);
+        FUNCTIONS.put(ST_PolyFromText.NAME, ST_PolyFromText.class);
+        FUNCTIONS.put(ST_BdPolyFromText.NAME, ST_BdPolyFromText.class);
+        FUNCTIONS.put(ST_GeomCollFromText.NAME, ST_GeomCollFromText.class);
+        FUNCTIONS.put(ST_MPointFromText.NAME, ST_MPointFromText.class);
+        FUNCTIONS.put(ST_MLineFromText.NAME, ST_MLineFromText.class);
+        FUNCTIONS.put(ST_MPolyFromText.NAME, ST_MPolyFromText.class);
+        FUNCTIONS.put(ST_BdMPolyFromText.NAME, ST_BdMPolyFromText.class);
+
+        FUNCTIONS.put(ST_GeomFromWKB.NAME, ST_GeomFromWKB.class);
+        FUNCTIONS.put(ST_PointFromWKB.NAME, ST_PointFromWKB.class);
+        FUNCTIONS.put(ST_LineFromWKB.NAME, ST_LineFromWKB.class);
+        FUNCTIONS.put(ST_PolyFromWKB.NAME, ST_PolyFromWKB.class);
+        FUNCTIONS.put(ST_BdPolyFromWKB.NAME, ST_BdPolyFromWKB.class);
+        FUNCTIONS.put(ST_GeomCollFromWKB.NAME, ST_GeomCollFromWKB.class);
+        FUNCTIONS.put(ST_MPointFromWKB.NAME, ST_MPointFromWKB.class);
+        FUNCTIONS.put(ST_MLineFromWKB.NAME, ST_MLineFromWKB.class);
+        FUNCTIONS.put(ST_MPolyFromWKB.NAME, ST_MPolyFromWKB.class);
+        FUNCTIONS.put(ST_BdMPolyFromWKB.NAME, ST_BdMPolyFromWKB.class);
+
+        FUNCTIONS.put(ST_GeomFromGML.NAME, ST_GeomFromGML.class);
+        FUNCTIONS.put(ST_PointFromGML.NAME, ST_PointFromGML.class);
+        FUNCTIONS.put(ST_LineFromGML.NAME, ST_LineFromGML.class);
+        FUNCTIONS.put(ST_PolyFromGML.NAME, ST_PolyFromGML.class);
+        FUNCTIONS.put(ST_GeomCollFromGML.NAME, ST_GeomCollFromGML.class);
+        FUNCTIONS.put(ST_MPointFromGML.NAME, ST_MPointFromGML.class);
+        FUNCTIONS.put(ST_MLineFromGML.NAME, ST_MLineFromGML.class);
+        FUNCTIONS.put(ST_MPolyFromGML.NAME, ST_MPolyFromGML.class);
+
+        for(Entry<String,Object> entry : FUNCTIONS.entrySet()){
+            FUNCTIONS_UPPERCASE.put(entry.getKey().toUpperCase(), entry.getValue());
+        }
+
+    }
+
+    @Override
+    public Set<String> getFunctionNames() {
+        return FUNCTIONS.keySet();
+    }
+
+    @Override
+    public OSQLFunction createFunction(String name) {
+        name = name.toUpperCase();
+        final Object obj = FUNCTIONS_UPPERCASE.get(name);
+
+        if (obj == null) {
+            throw new OCommandExecutionException("Unknowned function name :" + name);
+        }
+
+        if (obj instanceof OSQLFunction) {
+            return (OSQLFunction) obj;
+        } else {
+            //it's a class
+            final Class clazz = (Class) obj;
+            try {
+                return (OSQLFunction) clazz.newInstance();
+            } catch (Exception e) {
+                throw new OCommandExecutionException("Error in creation of function " + name
+                        + "(). Probably there is not an empty constructor or the constructor generates errors", e);
+            }
+        }
+
+    }
+
+    @Override
+    public boolean hasFunction(String name) {
+        name = name.toUpperCase();
+        return FUNCTIONS_UPPERCASE.containsKey(name);
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/SpatialMethodFactory.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/SpatialMethodFactory.java
new file mode 100644
index 0000000..84dcf8e
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/SpatialMethodFactory.java
@@ -0,0 +1,150 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * SQL/MM (ISO 13249-3) spatial methods.
+ * TODO this should be OSQLMethods but methods can't use indexes so spatial queries would be slow.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 2.0
+ * @since   2.0
+ * @module
+ */
+public class SpatialMethodFactory implements OSQLMethodFactory {
+
+    private static final Map<String,Object> METHODS = new HashMap<String, Object>();
+    private static final Map<String,Object> METHODS_UPPERCASE = new HashMap<String, Object>();
+
+    public SpatialMethodFactory() {
+
+        //geometry methods
+        METHODS.put(ST_GeometryType.NAME, ST_GeometryType.class);
+        METHODS.put(ST_Dimension.NAME, ST_Dimension.class);
+        METHODS.put(ST_CoordDim.NAME, ST_CoordDim.class);
+        METHODS.put(ST_SRID.NAME, ST_SRID.class);
+        METHODS.put(ST_Transform.NAME, ST_Transform.class);
+        METHODS.put(ST_IsEmpty.NAME, ST_IsEmpty.class);
+        METHODS.put(ST_IsSimple.NAME, ST_IsSimple.class);
+        METHODS.put(ST_IsValid.NAME, ST_IsValid.class);
+        METHODS.put(ST_Is3D.NAME, ST_Is3D.class);
+        METHODS.put(ST_Boundary.NAME, ST_Boundary.class);
+        METHODS.put(ST_Envelope.NAME, ST_Envelope.class);
+        METHODS.put(ST_ConvexHull.NAME, ST_ConvexHull.class);
+        METHODS.put(ST_Buffer.NAME, ST_Buffer.class);
+        METHODS.put(ST_Intersection.NAME, ST_Intersection.class);
+        METHODS.put(ST_Union.NAME, ST_Union.class);
+        METHODS.put(ST_Difference.NAME, ST_Difference.class);
+        METHODS.put(ST_SymDifference.NAME, ST_SymDifference.class);
+        METHODS.put(ST_Distance.NAME, ST_Distance.class);
+        METHODS.put(ST_Disjoint.NAME, ST_Disjoint.class);
+        METHODS.put(ST_Equals.NAME, ST_Equals.class);
+        METHODS.put(ST_Intersects.NAME, ST_Intersects.class);
+        METHODS.put(ST_Relate.NAME, ST_Relate.class);
+        METHODS.put(ST_Contains.NAME, ST_Contains.class);
+        METHODS.put(ST_Crosses.NAME, ST_Crosses.class);
+        METHODS.put(ST_Overlaps.NAME, ST_Overlaps.class);
+        METHODS.put(ST_Touches.NAME, ST_Touches.class);
+        METHODS.put(ST_Within.NAME, ST_Within.class);
+        METHODS.put(ST_ToGeomColl.NAME, ST_ToGeomColl.class);
+        METHODS.put(ST_ToLineString.NAME, ST_ToLineString.class);
+        METHODS.put(ST_ToMultiLine.NAME, ST_ToMultiLine.class);
+        METHODS.put(ST_ToMultiPoint.NAME, ST_ToMultiPoint.class);
+        METHODS.put(ST_ToMultiPolygon.NAME, ST_ToMultiPolygon.class);
+        METHODS.put(ST_ToPoint.NAME, ST_ToPoint.class);
+        METHODS.put(ST_ToPolygon.NAME, ST_ToPolygon.class);
+        METHODS.put(ST_AsText.NAME, ST_AsText.class);
+        METHODS.put(ST_AsBinary.NAME, ST_AsBinary.class);
+        METHODS.put(ST_AsGML.NAME, ST_AsGML.class);
+
+        //point methods
+        METHODS.put(Point_ST_X.NAME, Point_ST_X.class);
+        METHODS.put(Point_ST_Y.NAME, Point_ST_Y.class);
+        METHODS.put(Point_ST_Z.NAME, Point_ST_Z.class);
+        METHODS.put(Point_ST_ExplicitPoint.NAME, Point_ST_ExplicitPoint.class);
+
+        //curve methods
+        METHODS.put(Curve_ST_Length.NAME, Curve_ST_Length.class);
+        METHODS.put(Curve_ST_StartPoint.NAME, Curve_ST_StartPoint.class);
+        METHODS.put(Curve_ST_EndPoint.NAME, Curve_ST_EndPoint.class);
+        METHODS.put(Curve_ST_IsClosed.NAME, Curve_ST_IsClosed.class);
+        METHODS.put(Curve_ST_IsRing.NAME, Curve_ST_IsRing.class);
+
+        //line methods
+        METHODS.put(Line_ST_NumPoints.NAME, Line_ST_NumPoints.class);
+        METHODS.put(Line_ST_PointN.NAME, Line_ST_PointN.class);
+
+        //surface methods
+        METHODS.put(Surface_ST_Area.NAME, Surface_ST_Area.class);
+        METHODS.put(Surface_ST_Centroid.NAME, Surface_ST_Centroid.class);
+        METHODS.put(Surface_ST_Perimeter.NAME, Surface_ST_Perimeter.class);
+        METHODS.put(Surface_ST_PointOnSurface.NAME, Surface_ST_PointOnSurface.class);
+
+        //curvepolygon methods
+        METHODS.put(CurvePolygon_ST_NumInteriorRings.NAME, CurvePolygon_ST_NumInteriorRings.class);
+        METHODS.put(CurvePolygon_ST_InteriorRingN.NAME, CurvePolygon_ST_InteriorRingN.class);
+        METHODS.put(CurvePolygon_ST_ExteriorRing.NAME, CurvePolygon_ST_ExteriorRing.class);
+
+        //geomcollection methods
+        METHODS.put(GeomColl_ST_NumGeometries.NAME, GeomColl_ST_NumGeometries.class);
+        METHODS.put(GeomColl_ST_GeometryN.NAME, GeomColl_ST_GeometryN.class);
+
+
+        for(Map.Entry<String,Object> entry : METHODS.entrySet()){
+            METHODS_UPPERCASE.put(entry.getKey().toUpperCase(), entry.getValue());
+        }
+    }
+
+    @Override
+    public boolean hasMethod(String name) {
+        name = name.toUpperCase();
+        return METHODS_UPPERCASE.containsKey(name);
+    }
+
+    @Override
+    public Set<String> getMethodNames() {
+        return METHODS.keySet();
+    }
+
+    @Override
+    public OSQLMethod createMethod(String name) throws OCommandExecutionException {
+        name = name.toUpperCase();
+        final Object obj = METHODS_UPPERCASE.get(name);
+
+        if (obj == null) {
+            throw new OCommandExecutionException("Unknowned method name :" + name);
+        }
+
+        if (obj instanceof OSQLMethod) {
+            return (OSQLMethod) obj;
+        } else {
+            //it's a class
+            final Class clazz = (Class) obj;
+            try {
+                return (OSQLMethod) clazz.newInstance();
+            } catch (Exception e) {
+                throw new OCommandExecutionException("Error in creation of method " + name
+                        + "(). Probably there is not an empty constructor or the constructor generates errors", e);
+            }
+        }
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Area.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Area.java
new file mode 100644
index 0000000..abfcaac
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Area.java
@@ -0,0 +1,47 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Area. <br/>
+ * Return the area measurement of an ST_Surface value, ignoring z and m coordinate values in the calculations.
+ *
+ * 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 Surface_ST_Area extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_Area";
+
+    public Surface_ST_Area(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        return geom.getArea();
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Centroid.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Centroid.java
new file mode 100644
index 0000000..466fd52
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Centroid.java
@@ -0,0 +1,50 @@
+/*
+ * 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.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 Surface_ST_Centroid extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_Centroid";
+
+    public Surface_ST_Centroid(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry centroid = geom.getCentroid();
+        centroid.setSRID(geom.getSRID());
+        return centroid;
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Perimeter.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Perimeter.java
new file mode 100644
index 0000000..00c1f24
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Perimeter.java
@@ -0,0 +1,49 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_Perimeter. <br/>
+ * Return the length measurement of the boundary of an ST_Surface value, ignoring z and m coordinate values
+ * in the calculations.
+ *
+ * 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 Surface_ST_Perimeter extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_Perimeter";
+
+    public Surface_ST_Perimeter(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        //lenght is the perimeter for polygons
+        return geom.getLength();
+    }
+
+}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_PointOnSurface.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_PointOnSurface.java
new file mode 100644
index 0000000..9392227
--- /dev/null
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_PointOnSurface.java
@@ -0,0 +1,50 @@
+/*
+ * 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.opengis.filter.expression.Expression;
+
+/**
+ * SQL/MM, ISO/IEC 13249-3:2011, ST_PointOnSurface. <br/>
+ * Return an ST_Point value guaranteed to spatially intersect 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 Surface_ST_PointOnSurface extends AbstractAccessorSpatialMethod<Geometry> {
+
+    public static final String NAME = "ST_PointOnSurface";
+
+    public Surface_ST_PointOnSurface(Expression[] parameters) {
+        super(NAME,Geometry.class);
+    }
+
+    @Override
+    public Object execute(Geometry geom, Object... params) throws ParseException {
+        final Geometry pt = geom.getInteriorPoint();
+        pt.setSRID(geom.getSRID());
+        return pt;
+    }
+
+}


Mime
View raw message