content: /*
   * 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.asterix.geo.evaluators.functions;
  
  import org.apache.asterix.om.functions.BuiltinFunctions;
  import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
  import org.apache.commons.lang3.StringUtils;
  import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
  import org.apache.hyracks.api.exceptions.HyracksDataException;
  import org.locationtech.jts.geom.Coordinate;
  import org.locationtech.jts.geom.Geometry;
  import org.locationtech.jts.geom.GeometryFactory;
  import org.locationtech.jts.geom.MultiPoint;
  
  public class STLineFromMultiPointDescriptor extends AbstractSTSingleGeometryDescriptor {
  
      private static final long serialVersionUID = 1L;
      public static final IFunctionDescriptorFactory FACTORY = STLineFromMultiPointDescriptor::new;
      private final GeometryFactory geometryFactory;
  
      public STLineFromMultiPointDescriptor() {
          geometryFactory = new GeometryFactory();
      }
  
      @Override
      protected Object evaluateOGCGeometry(Geometry geometry) throws HyracksDataException {
          if (StringUtils.equals(geometry.getGeometryType(), Geometry.TYPENAME_MULTIPOINT)) {
              MultiPoint multiPoint = (MultiPoint) geometry;
              int numPoints = multiPoint.getNumGeometries();
  
              if (numPoints < 2) {
                  throw new UnsupportedOperationException("A LineString requires at least two points.");
              }
  
              Coordinate[] coordinates = new Coordinate[numPoints];
              for (int i = 0; i < numPoints; i++) {
                  coordinates[i] = multiPoint.getGeometryN(i).getCoordinate();
              }
              return geometryFactory.createLineString(coordinates);
          } else {
              throw new UnsupportedOperationException("The operation " + getIdentifier()
                      + " is not supported for the type " + geometry.getGeometryType());
          }
      }
  
      @Override
      public FunctionIdentifier getIdentifier() {
          return BuiltinFunctions.ST_LINE_FROM_MULTIPOINT;
      }
  
  }
  