pub struct PaperSearchQuery {
pub query: String,
pub limit: usize,
pub from_year: Option<i32>,
pub to_year: Option<i32>,
pub oa_only: bool,
pub min_citations: Option<u64>,
pub min_fwci: Option<f64>,
pub min_percentile: Option<u8>,
pub author: Option<String>,
pub venue: Option<String>,
pub publisher: Option<String>,
pub sort: SearchSort,
}Expand description
A discovery-search request: the free-text query plus triage filters.
Construct directly (all fields are public); the CLI maps its flags onto this.
Fields§
§query: StringFree-text topic query (e.g. “tropical tensor networks for spin glasses”). Must be non-empty; the caller is expected to reject empty input.
limit: usizeMaximum number of results to return, bounded to 1..=200 (OpenAlex
per-page ceiling). validate rejects an
out-of-range value; paper_search itself only clamps it as
defense-in-depth (see the function’s caller-side-validation note).
from_year: Option<i32>Inclusive lower bound on publication year (maps to OpenAlex
from_publication_date:<year>-01-01).
to_year: Option<i32>Inclusive upper bound on publication year (maps to OpenAlex
to_publication_date:<year>-12-31).
oa_only: boolWhen true, restrict to open-access works (is_oa:true).
min_citations: Option<u64>Minimum citation count. Maps to OpenAlex cited_by_count:>{n}
(“more than n”); the off-by-one versus “at least n” is documented
on the CLI flag.
min_fwci: Option<f64>Minimum field-and-year-normalized citation impact (FWCI). Maps to
OpenAlex fwci:>{f} — an impact floor that, unlike sorting by
citations, narrows the set without overriding relevance (#290).
min_percentile: Option<u8>Minimum within-cohort citation percentile (0–100). Maps to OpenAlex
cited_by_percentile_year.min:{p} — “top-X% among same-year works”;
combined with from_year this is the “recent × already standing
out” set (#290).
Author name to filter by. Resolved to an OpenAlex author ID via
/authors?search= then applied as authorships.author.id.
venue: Option<String>Venue / journal name to filter by. Resolved to an OpenAlex source
ID via /sources?search= then applied as
primary_location.source.id.
publisher: Option<String>Publisher name to filter by. Resolved to an OpenAlex publisher ID
via /publishers?search= then applied as
primary_location.source.publisher_lineage.
sort: SearchSortResult ordering.
Implementations§
Source§impl PaperSearchQuery
impl PaperSearchQuery
Sourcepub fn new(query: impl Into<String>) -> Self
pub fn new(query: impl Into<String>) -> Self
A bare query with DEFAULT_LIMIT, no filters, relevance sort.
Sourcepub fn validate(&self) -> Result<(), String>
pub fn validate(&self) -> Result<(), String>
Validate the request shape, returning a human-readable message on
the first problem. This is the single source of truth for the
boundary validation that both the CLI and the MCP tool apply
(paper_search itself stays permissive — see its docs); keeping it
here prevents the two surfaces from drifting.
Checks: non-empty query, limit in 1..=MAX_PER_PAGE, a
non-inverted from_year/to_year range, a finite non-negative
min_fwci, and a min_percentile in 0..=100.
§Errors
Err(msg) describing the first invalid field; msg is suitable for
surfacing directly to a user / agent.
Trait Implementations§
Source§impl Clone for PaperSearchQuery
impl Clone for PaperSearchQuery
Source§fn clone(&self) -> PaperSearchQuery
fn clone(&self) -> PaperSearchQuery
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more