Skip to content

Commit

Permalink
fix(plugins): build_search_result end_date preprocessing (#1304)
Browse files Browse the repository at this point in the history
  • Loading branch information
jlahovnik authored Sep 12, 2024
1 parent f4b7a67 commit 672fded
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 8 deletions.
27 changes: 23 additions & 4 deletions eodag/plugins/search/build_search_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import geojson
import orjson
from dateutil.parser import isoparse
from dateutil.tz import tzutc
from jsonpath_ng import Child, Fields, Root
from pydantic import create_model
from pydantic.fields import FieldInfo
Expand Down Expand Up @@ -405,11 +406,29 @@ def _preprocess_search_params(self, params: Dict[str, Any]) -> None:
"completionTimeFromAscendingNode", default_end_str
)

# temporary _date parameter mixing start & end
# adapt end date if it is midnight
end_date_excluded = getattr(self.config, "end_date_excluded", True)
end_date = isoparse(params["completionTimeFromAscendingNode"])
if not end_date_excluded and end_date == end_date.replace(
hour=0, minute=0, second=0, microsecond=0
is_datetime = True
try:
end_date = datetime.strptime(
params["completionTimeFromAscendingNode"], "%Y-%m-%dT%H:%M:%SZ"
)
end_date = end_date.replace(tzinfo=tzutc())
except ValueError:
try:
end_date = datetime.strptime(
params["completionTimeFromAscendingNode"], "%Y-%m-%dT%H:%M:%S.%fZ"
)
end_date = end_date.replace(tzinfo=tzutc())
except ValueError:
end_date = isoparse(params["completionTimeFromAscendingNode"])
is_datetime = False
start_date = isoparse(params["startTimeFromAscendingNode"])
if (
not end_date_excluded
and is_datetime
and end_date > start_date
and end_date == end_date.replace(hour=0, minute=0, second=0, microsecond=0)
):
end_date += timedelta(days=-1)
params["completionTimeFromAscendingNode"] = end_date.isoformat()
Expand Down
63 changes: 59 additions & 4 deletions tests/units/test_search_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -2057,6 +2057,61 @@ def get_search_plugin(self, product_type=None, provider=None):
)
)

def test_plugins_search_buildsearchresult_exclude_end_date(self):
"""BuildSearchResult.query must adapt end date in certain cases"""
# start & stop as dates -> keep end date as it is
results, _ = self.search_plugin.query(
productType=self.product_type,
startTimeFromAscendingNode="2020-01-01",
completionTimeFromAscendingNode="2020-01-02",
)
eoproduct = results[0]
self.assertEqual(
"2020-01-01", eoproduct.properties["startTimeFromAscendingNode"]
)
self.assertEqual(
"2020-01-02", eoproduct.properties["completionTimeFromAscendingNode"]
)
# start & stop as datetimes, not midnight -> keep and dates as it is
results, _ = self.search_plugin.query(
productType=self.product_type,
startTimeFromAscendingNode="2020-01-01T02:00:00Z",
completionTimeFromAscendingNode="2020-01-02T03:00:00Z",
)
eoproduct = results[0]
self.assertEqual(
"2020-01-01", eoproduct.properties["startTimeFromAscendingNode"]
)
self.assertEqual(
"2020-01-02", eoproduct.properties["completionTimeFromAscendingNode"]
)
# start & stop as datetimes, midnight -> exclude end date
results, _ = self.search_plugin.query(
productType=self.product_type,
startTimeFromAscendingNode="2020-01-01T00:00:00Z",
completionTimeFromAscendingNode="2020-01-02T00:00:00Z",
)
eoproduct = results[0]
self.assertEqual(
"2020-01-01", eoproduct.properties["startTimeFromAscendingNode"]
)
self.assertEqual(
"2020-01-01", eoproduct.properties["completionTimeFromAscendingNode"]
)
# start & stop same date -> keep end date
results, _ = self.search_plugin.query(
productType=self.product_type,
startTimeFromAscendingNode="2020-01-01T00:00:00Z",
completionTimeFromAscendingNode="2020-01-01T00:00:00Z",
)
eoproduct = results[0]
self.assertEqual(
"2020-01-01", eoproduct.properties["startTimeFromAscendingNode"]
)
self.assertEqual(
"2020-01-01", eoproduct.properties["completionTimeFromAscendingNode"]
)

def test_plugins_search_buildsearchresult_dates_missing(self):
"""BuildSearchResult.query must use default dates if missing"""
# given start & stop
Expand All @@ -2070,7 +2125,7 @@ def test_plugins_search_buildsearchresult_dates_missing(self):
eoproduct.properties["startTimeFromAscendingNode"], "2020-01-01"
)
self.assertEqual(
eoproduct.properties["completionTimeFromAscendingNode"], "2020-01-01"
eoproduct.properties["completionTimeFromAscendingNode"], "2020-01-02"
)

# missing start & stop
Expand All @@ -2084,7 +2139,7 @@ def test_plugins_search_buildsearchresult_dates_missing(self):
)
self.assertIn(
eoproduct.properties["completionTimeFromAscendingNode"],
"2015-01-01",
"2015-01-02",
)

# missing start & stop and plugin.product_type_config set (set in core._prepare_search)
Expand All @@ -2101,7 +2156,7 @@ def test_plugins_search_buildsearchresult_dates_missing(self):
eoproduct.properties["startTimeFromAscendingNode"], "1985-10-26"
)
self.assertEqual(
eoproduct.properties["completionTimeFromAscendingNode"], "1985-10-26"
eoproduct.properties["completionTimeFromAscendingNode"], "1985-10-27"
)

def test_plugins_search_buildsearchresult_without_producttype(self):
Expand All @@ -2118,7 +2173,7 @@ def test_plugins_search_buildsearchresult_without_producttype(self):
eoproduct = results[0]
assert eoproduct.geometry.bounds == (-180.0, -90.0, 180.0, 90.0)
assert eoproduct.properties["startTimeFromAscendingNode"] == "2020-01-01"
assert eoproduct.properties["completionTimeFromAscendingNode"] == "2020-01-01"
assert eoproduct.properties["completionTimeFromAscendingNode"] == "2020-01-02"
assert eoproduct.properties["title"] == eoproduct.properties["id"]
assert eoproduct.properties["title"].startswith(
f"{self.product_dataset.upper()}"
Expand Down

0 comments on commit 672fded

Please sign in to comment.