Skip to content

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:

# Analyses tagged with the "5.02 TeV" keyword, among others
stare analysis search -q 'metadata.keywords.name contain "5.02 TeV"'

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:

stare analysis search -q 'someNewField = value' --no-validate

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