Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

### Changed

- Updated dynamic mapping for items to map long values to double versus float [#326](https://github.com/stac-utils/stac-fastapi-elasticsearch-opensearch/pull/326)
- Extended Datetime Search to search on start_datetime and end_datetime as well as datetime fields. [#182](https://github.com/stac-utils/stac-fastapi-elasticsearch/pull/182)

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion stac_fastapi/core/stac_fastapi/core/database_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ class Geometry(Protocol): # noqa
},
# Default all other strings not otherwise specified to keyword
{"strings": {"match_mapping_type": "string", "mapping": {"type": "keyword"}}},
{"numerics": {"match_mapping_type": "long", "mapping": {"type": "float"}}},
{"numerics": {"match_mapping_type": "long", "mapping": {"type": "double"}}},
]

ES_ITEMS_MAPPINGS = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from opensearchpy.helpers.search import Search
from starlette.requests import Request

from stac_fastapi.core import serializers

from stac_fastapi.core.base_database_logic import BaseDatabaseLogic
from stac_fastapi.core.database_logic import (
COLLECTIONS_INDEX,
Expand All @@ -31,6 +31,7 @@
mk_item_id,
)
from stac_fastapi.core.extensions import filter
from stac_fastapi.core.serializers import CollectionSerializer, ItemSerializer
from stac_fastapi.core.utilities import MAX_LIMIT, bbox2polygon
from stac_fastapi.opensearch.config import (
AsyncOpensearchSettings as AsyncSearchSettings,
Expand Down Expand Up @@ -146,11 +147,9 @@ class DatabaseLogic(BaseDatabaseLogic):
client = AsyncSearchSettings().create_client
sync_client = SyncSearchSettings().create_client

item_serializer: Type[serializers.ItemSerializer] = attr.ib(
default=serializers.ItemSerializer
)
collection_serializer: Type[serializers.CollectionSerializer] = attr.ib(
default=serializers.CollectionSerializer
item_serializer: Type[ItemSerializer] = attr.ib(default=ItemSerializer)
collection_serializer: Type[CollectionSerializer] = attr.ib(
default=CollectionSerializer
)

extensions: List[str] = attr.ib(default=attr.Factory(list))
Expand Down
72 changes: 72 additions & 0 deletions stac_fastapi/tests/api/test_api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import random
import uuid
from copy import deepcopy
from datetime import datetime, timedelta


import pytest

from ..conftest import create_collection, create_item
Expand Down Expand Up @@ -628,3 +630,73 @@ async def test_search_line_string_intersects(app_client, ctx):

resp_json = resp.json()
assert len(resp_json["features"]) == 1


@pytest.mark.asyncio
@pytest.mark.parametrize(
"value, expected",
[
(32767, 1), # Short Limit,
(2147483647, 1), # Int Limit
(2147483647 + 5000, 1), # Above int Limit
(21474836470, 1), # Above int Limit
# This value still fails to return 1
# Commenting out
# (9223372036854775807, 1),
],
)
async def test_big_int_eo_search(
app_client, txn_client, test_item, test_collection, value, expected
):

random_str = "".join(random.choice("abcdef") for i in range(random.randint(1, 5)))
collection_id = f"test-collection-eo-{random_str}"

test_big_int_item = test_item
del test_big_int_item["properties"]["eo:bands"]
test_big_int_item["collection"] = collection_id
test_big_int_collection = test_collection
test_big_int_collection["id"] = collection_id

# type number
attr = "eo:full_width_half_max"

stac_extensions = [
"https://stac-extensions.github.io/eo/v2.0.0/schema.json",
]

test_collection["stac_extensions"] = stac_extensions

test_item["stac_extensions"] = stac_extensions

await create_collection(txn_client, test_collection)

for val in [
value,
value + random.randint(10, 1010),
value - random.randint(10, 1010),
]:
item = deepcopy(test_item)
item["id"] = str(uuid.uuid4())
item["properties"][attr] = val
await create_item(txn_client, item)

params = {
"collections": [item["collection"]],
"filter": {
"args": [
{
"args": [
{"property": f"properties.{attr}"},
value,
],
"op": "=",
}
],
"op": "and",
},
}
resp = await app_client.post("/search", json=params)
resp_json = resp.json()
results = set([x["properties"][attr] for x in resp_json["features"]])
assert len(results) == expected