blob: c2c749e39abb140e70b246510d6aeae79815842b [file] [log] [blame]
/*
* 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.filter.sqlmm;
import java.util.Arrays;
import java.util.Collection;
import org.apache.sis.geometry.wrapper.Geometries;
import org.apache.sis.filter.FunctionRegister;
import org.apache.sis.pending.jdk.JDK16;
// Specific to the main branch:
import org.apache.sis.filter.Expression;
/**
* A register of functions defined by the SQL/MM standard.
* This standard is defined by <a href="https://www.iso.org/standard/60343.html">ISO/IEC 13249-3:2016
* Information technology — Database languages — SQL multimedia and application packages — Part 3: Spatial</a>.
*
* @author Johann Sorel (Geomatys)
*/
public final class Registry implements FunctionRegister {
/**
* The geometry library used by this registry.
*/
private final Geometries<?> library;
/**
* Creates the default register.
*
* @param library the geometry library to use.
*/
public Registry(final Geometries<?> library) {
this.library = library;
}
/**
* Returns the name of the standard or authority defining the functions.
*/
@Override
public String getAuthority() {
return "SQL/MM";
}
/**
* Returns the names of all functions known to this register.
*/
@Override
public Collection<String> getNames() {
return JDK16.toList(Arrays.stream(SQLMM.values()).map(SQLMM::name));
}
/**
* Create a new function of the given name with given parameters.
* It is caller's responsibility to ensure that the given array is non-null,
* has been cloned and does not contain null elements.
* This method verifies only the number of parameters.
*
* @param name name of the function to call.
* @param parameters expressions providing values for the function arguments.
* @return an expression which will call the specified function.
* @throws IllegalArgumentException if function name is unknown or some parameters are illegal.
*/
@Override
public <R> Expression<R,?> create(final String name, Expression<R,?>[] parameters) {
final SQLMM operation = SQLMM.valueOf(name);
switch (operation) {
case ST_PointFromWKB: // Fallthrough
case ST_LineFromWKB: // Fallthrough
case ST_PolyFromWKB: // Fallthrough
case ST_BdPolyFromWKB : // Fallthrough
case ST_GeomCollFromWKB: // Fallthrough
case ST_MPointFromWKB: // Fallthrough
case ST_MLineFromWKB: // Fallthrough
case ST_MPolyFromWKB: // Fallthrough
case ST_BdMPolyFromWKB: // Fallthrough
case ST_GeomFromWKB: return new ST_FromBinary<>(operation, parameters, library);
case ST_PointFromText: // Fallthrough
case ST_LineFromText: // Fallthrough
case ST_PolyFromText: // Fallthrough
case ST_BdPolyFromText: // Fallthrough
case ST_GeomCollFromText: // Fallthrough
case ST_MPointFromText: // Fallthrough
case ST_MLineFromText: // Fallthrough
case ST_MPolyFromText: // Fallthrough
case ST_BdMPolyFromText: // Fallthrough
case ST_GeomFromText: return new ST_FromText<>(operation, parameters, library);
case ST_Polygon: // Fallthrough
case ST_LineString: // Fallthrough
case ST_MultiPoint: // Fallthrough
case ST_MultiLineString: // Fallthrough
case ST_MultiPolygon: // Fallthrough
case ST_GeomCollection: return new GeometryConstructor<>(operation, parameters, library);
case ST_Point: return new ST_Point<>(parameters, library);
case ST_Transform: return new ST_Transform<>(parameters, library);
default: {
switch (operation.geometryCount()) {
case 1: {
if (operation.maxParamCount == 1) {
return new OneGeometry<>(operation, parameters, library);
} else {
return new OneGeometry.WithArgument<>(operation, parameters, library);
}
}
case 2: {
if (operation.maxParamCount == 2) {
return new TwoGeometries<>(operation, parameters, library);
} else {
return new TwoGeometries.WithArgument<>(operation, parameters, library);
}
}
default: {
throw new AssertionError(operation);
}
}
}
}
}
}