Skip to content

Support searching by multiple platforms - #119

Open
suhaslord wants to merge 2 commits into
nasa:developfrom
suhaslord:cursor/feat/multi-platform-search-80-71c8
Open

Support searching by multiple platforms#119
suhaslord wants to merge 2 commits into
nasa:developfrom
suhaslord:cursor/feat/multi-platform-search-80-71c8

Conversation

@suhaslord

Copy link
Copy Markdown

Summary

Implements support for searching by multiple platforms for both CollectionQuery and GranuleQuery, as requested in issue #80.

Changes

Code

  • cmr/queries.py: Updated platform() in GranuleCollectionBaseQuery to accept Union[str, Sequence[str]]
    • Single string: keeps existing behavior (params['platform'] = platform)
    • Sequence of strings: list → repeated platform[]= query params
    • Empty/falsy values still raise ValueError

Tests

  • tests/test_collection.py / tests/test_granule.py: multi-platform + empty-list tests; existing single-platform tests still pass

Docs

  • CHANGELOG.md: Unreleased entry for multi-platform support

Behavior

# single (unchanged)
CollectionQuery().platform("Terra")
# ...platform=Terra...

# multiple (new)
CollectionQuery().platform(["Terra", "Aqua"])
# ...platform[]=Terra&platform[]=Aqua...

All 129 tests pass.

Closes #80

Submitted from fork as requested by @chuckwondo.

- Update platform() method in GranuleCollectionBaseQuery to accept Union[str, Sequence[str]]
- Backward compatible: single string works as before
- Multiple platforms passed as list for proper URL formatting (platform[]=...)
- Add ValueError for empty/falsy platform values
- Add tests for single, multiple, and empty platform cases in both CollectionQuery and GranuleQuery
- Update CHANGELOG.md with new feature

Closes nasa#80

Co-authored-by: Suhas <suhaslord@users.noreply.github.com>

@chuckwondo chuckwondo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @suhaslord! Generally looks good, but I've suggested a simplification.

Comment thread cmr/queries.py Outdated
Comment on lines +795 to +803
# Handle string vs sequence of strings
if isinstance(platform, str):
self.params['platform'] = platform
else:
# Convert sequence to list for proper URL formatting
platform_list = list(platform)
if not platform_list:
raise ValueError("Please provide a value for platform")
self.params['platform'] = platform_list

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be sufficient, although the existing implementation worked fine if the user passed a list. This simply ensures that a list is constructed for other sequence types since the _build_url method looks specifically for lists when dealing with multiple values:

Suggested change
# Handle string vs sequence of strings
if isinstance(platform, str):
self.params['platform'] = platform
else:
# Convert sequence to list for proper URL formatting
platform_list = list(platform)
if not platform_list:
raise ValueError("Please provide a value for platform")
self.params['platform'] = platform_list
self.params['platform'] = (
platform if isinstance(platform, str) else list(platform)
)

Apply Chuck Daniels' suggestion to simplify the string-vs-sequence
handling. The new implementation keeps the string case as-is and
converts any sequence type to list in a single expression.

This ensures other sequence types (tuples, etc.) become lists since
_build_url specifically looks for list instances when formatting
multi-valued parameters.

Co-authored-by: Suhas <suhaslord@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support searching by multiple platforms

3 participants