Skip to content

Commit

Permalink
support filtering by multiple tileIds #32
Browse files Browse the repository at this point in the history
  • Loading branch information
bossie committed May 15, 2024
1 parent 4db6a50 commit 480ce71
Showing 1 changed file with 29 additions and 10 deletions.
39 changes: 29 additions & 10 deletions src/main/scala/org/openeo/opensearch/backends/OscarsClient.scala
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,10 @@ class OscarsClient(val endpoint: URL, val isUTM: Boolean = false) extends OpenSe

val propagatableAttributeValues =
(attributeValues + ("accessedFrom" -> "MEP")) // get direct access links instead of download urls
.filterNot { case (key, _) =>
Seq("eo:cloud_cover", "provider:backend", "orbitDirection", "sat:orbit_state") contains key
.filter {
case ("tileId", value) => value.isInstanceOf[String] // filter by single tileId (server side)
case (attribute, _) => !(Seq("eo:cloud_cover", "provider:backend", "orbitDirection", "sat:orbit_state")
contains attribute)
}

val coordinateFormat = new DecimalFormat("0.#######", DecimalFormatSymbols.getInstance(Locale.ROOT))
Expand Down Expand Up @@ -95,17 +97,34 @@ class OscarsClient(val endpoint: URL, val isUTM: Boolean = false) extends OpenSe
}

val json = execute(getProducts)

val resultCollection = FeatureCollection.parse(json, isUTM, dedup = true)
// TODO: filter by list of tileId
if(dateRange.isDefined) {
val dates = dateRange.get
//oscars actually manages to return features that are outside of the daterange for coherence
val features = resultCollection.features.filter(f=>f.nominalDate.isEqual(dates._1) || (f.nominalDate.isAfter(dates._1) && (f.nominalDate.isBefore(dates._2) || (dates._1 isEqual dates._2) ) ))
FeatureCollection(resultCollection.itemsPerPage,features)
}else{
resultCollection

filterByDateRange(
filterByTileIds(resultCollection, attributeValues.get("tileId")), dateRange)
}

private def filterByDateRange(featureCollection: FeatureCollection,
dateRangeValue: Option[(ZonedDateTime, ZonedDateTime)]): FeatureCollection = {
//oscars actually manages to return features that are outside of the daterange for coherence
dateRangeValue match {
case Some((from, until)) => featureCollection.copy(features = featureCollection.features.filter { feature =>
feature.nominalDate.isEqual(from) || (feature.nominalDate.isAfter(from) &&
(feature.nominalDate.isBefore(until) || (from isEqual until)))
})
case _ => featureCollection
}
}

private def filterByTileIds(featureCollection: FeatureCollection, tileIdValue: Option[Any]): FeatureCollection = {
// filter by multiple tileIds (client side)
tileIdValue match {
case Some(tileIds: java.util.List[String]) => featureCollection.copy(
features = featureCollection.features.filter { feature =>
tileIds contains feature.tileID
})
case _ => featureCollection
}
}

override def getCollections(correlationId: String = ""): Seq[Feature] = {
Expand Down

0 comments on commit 480ce71

Please sign in to comment.