SpatialDataReferenceIO.java

package de.dlr.shepard.context.references.spatialdata.io;

import de.dlr.shepard.context.references.basicreference.io.BasicReferenceIO;
import de.dlr.shepard.context.references.spatialdata.entities.SpatialDataReference;
import de.dlr.shepard.data.spatialdata.endpoints.SpatialDataParamParser;
import de.dlr.shepard.data.spatialdata.io.FilterCondition;
import de.dlr.shepard.data.spatialdata.model.geometryFilter.AbstractGeometryFilter;
import jakarta.validation.constraints.NotNull;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.eclipse.microprofile.openapi.annotations.media.Schema;

@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@Schema(name = "SpatialDataReference")
public class SpatialDataReferenceIO extends BasicReferenceIO {

  @NotNull
  @Schema(required = true)
  private long spatialDataContainerId;

  @Schema(
    example = """
    {
      "type": "AXIS_ALIGNED_BOUNDING_BOX",
      "minX": 0,
      "minY": 0,
      "minZ": 0,
      "maxX": 100,
      "maxY": 100,
      "maxZ": 100
      }
    """
  )
  private AbstractGeometryFilter geometryFilter;

  @Schema(
    example = """
    [{ "key": "temperature,val", "operator": "EQUALS", "value": 20 }]
    """
  )
  private List<FilterCondition> measurementsFilter;

  @Schema
  private Long startTime;

  @Schema
  private Long endTime;

  @Schema
  private Map<String, Object> metadataFilter;

  @Schema
  private Integer limit;

  @Schema
  private Integer skip;

  public SpatialDataReferenceIO(SpatialDataReference ref) {
    super(ref);
    this.geometryFilter = SpatialDataParamParser.parseGeometryFilter(ref.getGeometryFilter()).orElse(null);
    this.measurementsFilter = SpatialDataParamParser.parseMeasurementsFilter(ref.getMeasurementsFilter()).orElse(
      Collections.emptyList()
    );
    this.startTime = ref.getStartTime();
    this.endTime = ref.getEndTime();
    this.metadataFilter = SpatialDataParamParser.parseMetadata(ref.getMetadata()).orElse(Collections.emptyMap());
    this.limit = ref.getLimit();
    this.skip = ref.getSkip();
    this.spatialDataContainerId = ref.getSpatialDataContainer() != null ? ref.getSpatialDataContainer().getId() : -1;
  }
}