FishEye contains a powerful query language called EyeQL. EyeQL is an intuitive SQL-like language that allows you to write your own specific queries.

EyeQL allows you to perform complex searches either within the Advanced Search or incorporated in scripts from the FishEye API.

query:

select revisions
(from (dir|directory) word)?
(where clauses)?
(order by date)?
(group by (file|dir|directory|changeset))?
(return return-clauses)?

clauses:

clause ((or|and|,) clause)*
Notes:
and binds more tightly than or.
',' (comma) means 'and'.

clause:

*(*_clauses_*)*
\\
\\
*not* _clause_
\\
\\
*path* (*not*)? *like*  word
Notes: 
_word_ is an Antglob.
\\
\\
*date in* ({*}({*}|{*}\[{*}) _dateExp, dateExp_ ({*}){*}|{*}\]{*})
Notes: The edges are
  inclusive if {{\[}} or {{\]}} is used.
  exclusive if {{(}} or {{)}} is used.
\\
\\
*date* _dateop_ _dateExp_
Notes:
_dateop_ can be {{<, >, <=, >=, =, == or !=}} .
\\
\\
*author =* _word_
\\
\\
*author in* (_word-list_)
\\
\\
*comment matches* _word_
Notes:
Does a full-text search.
\\
\\
*comment =* _string_
Notes:
Matches _string_ exactly.
Most comments end in a new line, so remember to add {{\n}} at the end of your string.
\\
\\
*comment =~* _string_
Notes:
_string_ is a regular expression.
\\
\\
*content matches* _word_
Notes:
Does a full-text search.
At this time searches are restricted to HEAD  revisions.
\\
\\
(*modified*|*added*|*deleted*)? *on branch* _word_
Notes: 
Selects all revisions on a branch.
_modified_ excludes the branch-point of a branch.
_added_ selects all revisions on the branch if any revision was added on the branch.
_deleted_ selects all revisions on the branch if any revision was  deleted on the branch.
\\
\\
*tagged* _op_? _word_
Notes:
_op_ can  be {{<, >, <=, >=, =, == or !=}} .
_op_ defaults to {{==}} if omitted. 
These operators are 'positional' and select revisions that appear on, after, and/or before the given tag.
\\
\\
*between tags* _tag-range_
\\
\\
*after tag* _word_
\\
\\
*before tag* _word_
\\
\\
*is head* (*on* _word_)?
Notes: 
This selects the top-most revision on any branch, if no branch is specified.
\\
\\
*is* ( *dead* | *deleted* )
Notes: 
Means the revision was removed/deleted.
\\
\\
*is added*
Notes: 
Means the revision was  added (or re-added).
\\
\\
*csid* = _word_
Notes: 
Selects all revisions for the given changeset ID.

tag-range:

({*}({*}|{*}\[{*}) T1:_word_, T2:_word_ ({*}){*}|{*}\]{*})
Notes:
A range of revisions between those tagged T1 and T2. 
The edges are:
&nbsp;&nbsp;inclusive if {{\[}} or {{\]}} is used.
&nbsp;&nbsp;exclusive if {{(}} or {{)}} is used.
You can mix edge types. These  are all valid: {{(T1,T2)}}, {{\[T1,T2]}}, {{(T1,T2]}} and {{[T1,T2)}}.

word:

Any string, or any non-quoted word that does not contain white space or any other separators.

string:

A sequence enclosed in either " (double quotes) or ' (single quotes).
The following escapes work: \' \" \n \r \t \b \f.
Unicode characters can be escaped with \uXXXX.
You can also specify strings in 'raw' mode like r"foo". (Similar to Python's raw strings. See Python's own documentation).

dateExp:

See our Date Expressions Reference Guide for more information on date formats.

return-clauses:

return-clause (, return-clause)*
A return clause signifies that you want control over what data is returned/displayed.

return-clause:

( path | revision | author | date | comment | csid | isBinary | totalLines | linesAdded | linesRemoved | isAdded | isDeleted | isCopied | isMoved | tags )
( as word )?
The attribute to return, optionally followed by a name to use for the column.

Examples

The following examples demonstrate using EyeQL to extract information from your repository.

Find files removed on the Ant 1.5 branch:
select revisions where modified on branch ANT_15_BRANCH and is dead group by changeset

As above, but just return the person and time the files were deleted:
select revisions where modified on branch ANT_15_BRANCH and is dead return path, author, date

Find files on branch and exclude delete files:
select revisions where modified on branch ANT_15_BRANCH and not is deleted group by changeset

Find changes made to Ant 1.5.x after 1.5FINAL:
select revisions where on branch ANT_15_BRANCH and after tag ANT_MAIN_15FINAL group by changeset

Find changes made between Ant 1.5 and 1.5.1:
select revisions where between tags (ANT_MAIN_15FINAL, ANT_151_FINAL] group by changeset

As above, but show the history of each file separately :
select revisions where between tags (ANT_MAIN_15FINAL, ANT_151_FINAL] group by file

Find Java files that are tagged ANT_151_FINAL and are head on the ANT_15_BRANCH: (i.e. files that haven't changed in 1.5.x since 1.5.1)
select revisions from dir /src/main where is head and tagged ANT_151_FINAL and on branch ANT_15_BRANCH and path like *.java group by changeset

Find changes made by conor to Ant 1.5.x since 1.5.0
select revisions where between tags (ANT_MAIN_15FINAL, ANT_154] and author = conor group by changeset