Query DSL
The --query / -q flag on stare search commands accepts a simple filter
expression validated and normalized client-side before being sent to the server.
Each search command validates against the field catalogue for its own record
type. See the
endpoint status table
for which commands currently accept --query.
Grammar
// Generic DSL grammar — no field names hard-coded.
// Syntax only; field/operator semantics validated downstream.
//
// NULL sentinel: the API-defined token __EMPTY__ (quoted or bare) is used to
// compare a field against NULL, e.g. "publicShortTitle" = "__EMPTY__".
// It is matched as an ordinary VALUE (bare) or STRING (quoted) — no special rule.
//
// List membership (`field in [a, b]`, `field not in [a, b]`) is stare-only
// syntax: the server has no such operator, so the parser expands it into an
// OR of `=` (or an AND of `!=`) before anything is sent.
?expression: or_expr
?or_expr: and_expr
| or_expr _OR and_expr -> or_expr
?and_expr: term
| and_expr _AND term -> and_expr
?term: condition
| list_condition
| "(" expression ")"
condition: field OP value -> condition
list_condition: field LIST_OP "[" list_value ("," list_value)* "]"
field: IDENT | STRING
value: VALUE | STRING
list_value: LIST_VALUE | STRING
OP: "=" | "!=" | "contain"i | "not-contain"i
LIST_OP: /(not\s+)?in/i
_AND: /[Aa][Nn][Dd]/
_OR: /[Oo][Rr]/
IDENT: /[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*/
VALUE: /[^\s()"]+/
// Unlike VALUE, a bare list item stops at commas and square brackets; quote
// an item that contains them.
LIST_VALUE: /[^\s()",\[\]]+/
STRING: /"[^"\n\r\t\f\v]*"/
%import common.WS
%ignore WS
and / or (and in / not in) are case-insensitive at parse time; canonical
output is uppercase (AND, OR).
Operators
| Operator | Meaning |
|---|---|
= |
Exact match |
!= |
Not equal |
contain |
Field contains the value (array membership or substring) |
not-contain |
Field does not contain the value |
in [a, b, ...] |
Equals any listed value (stare-only; see Lists) |
not in [a, b, ...] |
Equals none of the listed values (stare-only) |
Boolean fields only support = and !=
Some fields are boolean (e.g. analysisTeam.isContactEditor, phase0.editorialBoard.isChair).
Using contain or not-contain on these fields raises a DSLValidationError at parse time.
Their values are typically "true" or "false".
Use contain for fields inside a list
Many fields sit inside a list, such as metadata.keywords.name,
analysisTeam.lastName or phase0.eoiMeetings.title. On these, the server
only matches = when the list holds that value as its only element, so
metadata.keywords.name = "5.02 TeV" misses every record that has the
keyword among several. in [...] expands to = and behaves the same way.
Use contain to match any element:
Comparing against NULL
Use the special token __EMPTY__ as the value to test whether a field is
NULL. Both the bare and quoted forms are accepted; the API documentation
consistently uses the quoted form:
# Find analyses with no public short title set
stare analysis search -q 'publicShortTitle = "__EMPTY__"'
# Find papers where shortTitle is not NULL
stare paper search -q 'shortTitle != "__EMPTY__"'
__EMPTY__ is treated as an ordinary string token by the parser — it
receives no special validation.
Field names
Fields accept either camelCase or snake_case — both are normalized to
camelCase before being sent to the server:
# These are equivalent:
stare analysis search -q 'referenceCode = ANA-HION-2018-01'
stare analysis search -q 'reference_code = ANA-HION-2018-01'
Nested fields use a dot separator: metadata.keywords.name, phase0.state.
Field catalogue is generated
Run pixi run extract-fields after an API update to regenerate both src/stare/dsl/data/fields.toml and the tables below.
Quoting
Both the field name and the value may optionally be wrapped in double quotes. Quotes are required on the value when it is empty or contains spaces, parentheses, or square brackets; for everything else they are optional.
The grammar's string token (STRING: /"[^"\n\r\t\f\v]*"/) restricts quoted
values to printable characters plus spaces — it excludes embedded double-quotes
and all non-space whitespace (tabs, newlines, carriage returns, form feeds, and
vertical tabs). Values containing any of those characters are rejected at parse
time. If your value contains a literal ", use contain with a non-quote
substring instead; escaped-quote support is not yet implemented.
# These are equivalent:
stare analysis search -q 'referenceCode = ANA-HION-2018-01'
stare analysis search -q '"referenceCode" = ANA-HION-2018-01'
stare analysis search -q 'referenceCode = "ANA-HION-2018-01"'
# Multi-word values require quotes:
stare analysis search -q 'shortTitle = "Low-mass single diffraction"'
stare paper search -q '"phase2.state" = "Phase 2 Finished"'
Canonical output (to_dsl()) emits quotes on the value only when they are
required; bare single-token values are always emitted unquoted. Fields are
always emitted bare after normalization.
Only " (double quotes) are accepted — single quotes are not special.
Values
Values are bare tokens or double-quoted strings. A bare value like
ANA-HION-2018-01 or Closed works without quotes. Double quotes are required
when the value is empty or contains spaces, parentheses, or square brackets:
# bare value — no quotes needed
stare analysis search -q 'metadata.keywords.name contain jets'
# space in value — quotes required
stare analysis search -q 'shortTitle = "Low-mass single diffraction"'
# quoted field, bare value — both forms mix freely
stare analysis search -q '"status" = Closed'
Date fields only match a YYYY-MM-DD value. The API returns full ISO datetimes
(e.g. 2017-12-20T00:00:00+01:00), but filtering on that string matches nothing
(ATGLANCE-8334), so use only
the date part:
# the API returns 2017-12-20T00:00:00+01:00 for this field
stare analysis search -q 'phase0.eoiMeetings.date = 2017-12-20'
Combining conditions
# AND (both must match)
stare analysis search -q 'status = "Phase 0 Active" and groups.leadingGroup.name = HMBS'
# OR (either may match)
stare analysis search -q 'status = "Phase 0 Active" or status = Created'
AND binds tighter than OR: a = 1 AND b = 2 OR c = 3 is parsed as
(a = 1 AND b = 2) OR c = 3.
Use parentheses to group an OR under an AND:
# Not closed, and led by either EGAM or MUON
stare analysis search -q 'status != Closed AND (groups.leadingGroup.name = EGAM OR groups.leadingGroup.name = MUON)'
Only the parentheses that change the meaning are sent
(status != Closed AND (… OR …)). Redundant parentheses, such as around the
whole query or around an AND inside an OR, are dropped.
Lists
field in [a, b, c] matches any of the listed values, and
field not in [a, b, c] matches none of them:
stare analysis search -q 'status != Closed AND groups.leadingGroup.name in [EGAM, MUON, JETM]'
stare analysis search -q 'status not in [Closed, "Phase 0 Finished"]'
The Glance API has no list operator, so stare expands these before sending:
in becomes an OR of = (grouped with parentheses when combined with AND),
and not in becomes an AND of !=. The first example is sent as:
status != Closed AND (groups.leadingGroup.name = EGAM OR groups.leadingGroup.name = MUON OR groups.leadingGroup.name = JETM)
List items follow the usual value rules, except that a bare item also
ends at a comma or square bracket. Quote any item that contains spaces, commas,
or brackets: shortTitle in ["Flow in Xe+Xe", "a, b"]. An empty list [] is a
syntax error.
Sorting
--sort-by and --sort-desc are independent of the query string and work with
any search command:
stare analysis search -q 'status = "Phase 0 Active"' --sort-by creationDate --sort-desc
stare paper search --sort-by referenceCode
Skipping validation
Use --no-validate to bypass client-side field checking and send the raw string
directly to the server. This is useful for experimental server fields or when
you know the DSL is already in canonical form:
Analysis fields
| Group | Fields |
|---|---|
| Top-level | creationDate, publicShortTitle, referenceCode, shortTitle, status |
amiGlance |
amiGlance.label, amiGlance.url |
analysisTeam |
analysisTeam.analysisContactAssignment.endDate, analysisTeam.analysisContactAssignment.startDate, analysisTeam.cernCcid, analysisTeam.email, analysisTeam.firstName, analysisTeam.isAnalysisContact, analysisTeam.isContactEditor, analysisTeam.lastName |
documentation |
documentation.repositories.gitlabId, documentation.repositories.type, documentation.repositories.url, documentation.supportingInternalDocuments.label, documentation.supportingInternalDocuments.url |
groups |
groups.leadingGroup.name, groups.leadingSubgroup.name, groups.otherGroups.name, groups.subgroups.name |
metadata |
metadata.analysisFramework.histogramming, metadata.analysisFramework.ntupling, metadata.collisions.ecmUnit, metadata.collisions.ecmValue, metadata.collisions.luminosityUnit, metadata.collisions.luminosityValue, metadata.collisions.run, metadata.collisions.type, metadata.collisions.year, metadata.datasets.name, metadata.keywords.name, metadata.mvaMlTools.name, metadata.statisticalTools.name, metadata.triggers.name |
phase0 |
phase0.approvalMeetings.comments, phase0.approvalMeetings.date, phase0.approvalMeetings.label, phase0.approvalMeetings.title, phase0.approvalMeetings.url, phase0.datasetUsed, phase0.editorialBoard.cernCcid, phase0.editorialBoard.email, phase0.editorialBoard.firstName, phase0.editorialBoard.isChair, phase0.editorialBoard.isExOfficio, phase0.editorialBoard.lastName, phase0.editorialBoardFormedDate, phase0.editorialBoardRequestMeetings.comments, phase0.editorialBoardRequestMeetings.date, phase0.editorialBoardRequestMeetings.label, phase0.editorialBoardRequestMeetings.title, phase0.editorialBoardRequestMeetings.url, phase0.eoiMeetings.comments, phase0.eoiMeetings.date, phase0.eoiMeetings.label, phase0.eoiMeetings.title, phase0.eoiMeetings.url, phase0.mainPhysicsAim, phase0.methods, phase0.modelTested, phase0.pgcOrSgcSignOffDate, phase0.preApprovalMeetings.comments, phase0.preApprovalMeetings.date, phase0.preApprovalMeetings.label, phase0.preApprovalMeetings.title, phase0.preApprovalMeetings.url, phase0.startDate, phase0.state |
relatedPublications |
relatedPublications.referenceCode, relatedPublications.type |
CONF note fields
| Group | Fields |
|---|---|
| Top-level | finalReferenceCode, fullTitle, publicShortTitle, shortTitle, status, temporaryReferenceCode |
analysisTeam |
analysisTeam.analysisContactAssignment.endDate, analysisTeam.analysisContactAssignment.startDate, analysisTeam.cernCcid, analysisTeam.email, analysisTeam.firstName, analysisTeam.isAnalysisContact, analysisTeam.isContactEditor, analysisTeam.lastName |
documentation |
documentation.supportingInternalDocuments.label, documentation.supportingInternalDocuments.url |
groups |
groups.leadingGroup.name, groups.leadingSubgroup.name, groups.otherGroups.name, groups.subgroups.name |
metadata |
metadata.collisions.ecmUnit, metadata.collisions.ecmValue, metadata.collisions.luminosityUnit, metadata.collisions.luminosityValue, metadata.collisions.run, metadata.collisions.type, metadata.collisions.year, metadata.keywords.name, metadata.mvaMlTools.name, metadata.statisticalTools.name |
phase1 |
phase1.draftCdsUrl, phase1.editorialBoard.cernCcid, phase1.editorialBoard.email, phase1.editorialBoard.firstName, phase1.editorialBoard.isChair, phase1.editorialBoard.isExOfficio, phase1.editorialBoard.lastName, phase1.editorialBoardDraftSignOffDate, phase1.editorialBoardFormedDate, phase1.firstSignOffDate, phase1.firstSignOffResponsible.cernCcid, phase1.firstSignOffResponsible.email, phase1.firstSignOffResponsible.firstName, phase1.firstSignOffResponsible.lastName, phase1.pgcApprovalDate, phase1.presentationDate, phase1.publicWebPageUrlForFiguresAndTables, phase1.releaseDate, phase1.secondSignOffDate, phase1.secondSignOffResponsible.cernCcid, phase1.secondSignOffResponsible.email, phase1.secondSignOffResponsible.firstName, phase1.secondSignOffResponsible.lastName, phase1.startDate, phase1.state |
relatedAnalysis |
relatedAnalysis.referenceCode, relatedAnalysis.type |
supersededBy |
supersededBy.referenceCode, supersededBy.type |
PUB note fields
| Group | Fields |
|---|---|
| Top-level | finalReferenceCode, fullTitle, publicShortTitle, shortTitle, status, temporaryReferenceCode |
analysisTeam |
analysisTeam.analysisContactAssignment.endDate, analysisTeam.analysisContactAssignment.startDate, analysisTeam.cernCcid, analysisTeam.email, analysisTeam.firstName, analysisTeam.isAnalysisContact, analysisTeam.isContactEditor, analysisTeam.lastName |
documentation |
documentation.supportingInternalDocuments.label, documentation.supportingInternalDocuments.url |
groups |
groups.leadingGroup.name, groups.leadingSubgroup.name, groups.otherGroups.name, groups.subgroups.name |
metadata |
metadata.collisions.ecmUnit, metadata.collisions.ecmValue, metadata.collisions.luminosityUnit, metadata.collisions.luminosityValue, metadata.collisions.run, metadata.collisions.type, metadata.collisions.year, metadata.keywords.name, metadata.mvaMlTools.name, metadata.statisticalTools.name |
phase1 |
phase1.atlasCirculationDate, phase1.draftCdsUrl, phase1.firstReaderDraftSignOffDate, phase1.firstReaderSignOffDate, phase1.groupApprovalDate, phase1.presentationDate, phase1.proceedToSignOffDate, phase1.publicWebPageUrlForFiguresAndTables, phase1.readers.cernCcid, phase1.readers.email, phase1.readers.firstName, phase1.readers.isFirstReader, phase1.readers.isSecondReader, phase1.readers.lastName, phase1.releaseDate, phase1.secondReaderSignOffDate, phase1.startDate, phase1.state |
relatedAnalysis |
relatedAnalysis.referenceCode, relatedAnalysis.type |
supersededBy |
supersededBy.referenceCode, supersededBy.type |
Plot fields
| Group | Fields |
|---|---|
| Top-level | fullTitle, referenceCode, shortTitle, status |
analysisTeam |
analysisTeam.cernCcid, analysisTeam.email, analysisTeam.firstName, analysisTeam.isContactEditor, analysisTeam.lastName |
documentation |
documentation.supportingInternalDocuments.label, documentation.supportingInternalDocuments.url |
groups |
groups.leadingGroup.name, groups.otherGroups.name |
metadata |
metadata.collisions.ecmUnit, metadata.collisions.ecmValue, metadata.collisions.luminosityUnit, metadata.collisions.luminosityValue, metadata.collisions.run, metadata.collisions.type, metadata.collisions.year |
phase1 |
phase1.draftCdsUrl, phase1.finalCdsReport, phase1.groupCoordinatorSignOff, phase1.startDate, phase1.state |
supersededBy |
supersededBy.referenceCode, supersededBy.type |
Paper fields
| Group | Fields |
|---|---|
| Top-level | fullTitle, publicShortTitle, referenceCode, rivetRoutinesUrl, shortTitle, status |
analysisTeam |
analysisTeam.analysisContactAssignment.endDate, analysisTeam.analysisContactAssignment.startDate, analysisTeam.cernCcid, analysisTeam.email, analysisTeam.firstName, analysisTeam.isAnalysisContact, analysisTeam.isContactEditor, analysisTeam.lastName |
documentation |
documentation.supportingInternalDocuments.label, documentation.supportingInternalDocuments.url |
groups |
groups.leadingGroup.name, groups.leadingSubgroup.name, groups.otherGroups.name, groups.subgroups.name |
metadata |
metadata.collisions.ecmUnit, metadata.collisions.ecmValue, metadata.collisions.luminosityUnit, metadata.collisions.luminosityValue, metadata.collisions.run, metadata.collisions.type, metadata.collisions.year, metadata.keywords.name, metadata.mvaMlTools.name, metadata.statisticalTools.name |
phase1 |
phase1.atlasMeetingDate, phase1.draftReleasedDate, phase1.editorialBoard.cernCcid, phase1.editorialBoard.email, phase1.editorialBoard.firstName, phase1.editorialBoard.isChair, phase1.editorialBoard.isExOfficio, phase1.editorialBoard.lastName, phase1.editorialBoardDraftSignOffDate, phase1.editorialBoardFormedDate, phase1.languageEditorsSignOffDate, phase1.pgcApprovalDate, phase1.presentationDate, phase1.pubcommChairOrDeputyOrDelegated.cernCcid, phase1.pubcommChairOrDeputyOrDelegated.email, phase1.pubcommChairOrDeputyOrDelegated.firstName, phase1.pubcommChairOrDeputyOrDelegated.lastName, phase1.pubcommSignOffDate, phase1.spokespersonOrDeputyOrDelegated.cernCcid, phase1.spokespersonOrDeputyOrDelegated.email, phase1.spokespersonOrDeputyOrDelegated.firstName, phase1.spokespersonOrDeputyOrDelegated.lastName, phase1.startDate, phase1.state |
phase2 |
phase2.draft2CernSignOffDate, phase2.draft2ReleasedDate, phase2.draft2SentToCernDate, phase2.editorialBoardDraft2SignOffDate, phase2.editorialBoardRevisedSignOffDate, phase2.paperClosureDate, phase2.paperClosureMeetingUrls.label, phase2.paperClosureMeetingUrls.url, phase2.preliminaryPlotsAndResultsReleased, phase2.pubcommChairOrDeputyOrDelegated.cernCcid, phase2.pubcommChairOrDeputyOrDelegated.email, phase2.pubcommChairOrDeputyOrDelegated.firstName, phase2.pubcommChairOrDeputyOrDelegated.lastName, phase2.pubcommChairOrDeputySignOffDate, phase2.spokespersonDelegatedSignOffDate, phase2.spokespersonOrDeputySignOffDate, phase2.startDate, phase2.state |
publicationPhase |
publicationPhase.arXivSubmissionDate, publicationPhase.arXivUrls.label, publicationPhase.arXivUrls.url, publicationPhase.cernPreprintUrls.label, publicationPhase.cernPreprintUrls.url, publicationPhase.finalJournalPublicationUrls.label, publicationPhase.finalJournalPublicationUrls.url, publicationPhase.finalSubmissionJournal, publicationPhase.finalTitleTex, publicationPhase.firstProofDate, publicationPhase.firstRefereeReportDate, publicationPhase.journalAcceptanceDate, publicationPhase.physicsBriefingUrls.label, publicationPhase.physicsBriefingUrls.url, publicationPhase.publishedOnlineDate, publicationPhase.startDate, publicationPhase.state |
relatedAnalysis |
relatedAnalysis.referenceCode, relatedAnalysis.type |
Publication fields
| Group | Fields |
|---|---|
| Top-level | finalReferenceCode, referenceCode, shortTitle, status, temporaryReferenceCode, type |
groups |
groups.leadingGroup.name, groups.leadingSubgroup.name, groups.subgroups.name |
Leading group fields
| Group | Fields |
|---|---|
| Top-level | name |
Subgroup fields
| Group | Fields |
|---|---|
| Top-level | name |
Trigger fields
| Group | Fields |
|---|---|
| Top-level | name, year |
category |
category.name |