From 8afd7dac3e5636a2536ab8f7753a5cb46045bc9e Mon Sep 17 00:00:00 2001 From: Kevin Traini Date: Wed, 9 Oct 2024 15:17:56 +0200 Subject: [PATCH] doc: Split TQL documentation (#1527) Separate part for TQL in reports and TQL in Cross-Tracker Search --- .../tql/expert_query_xtracker_widget.png | Bin 8477 -> 0 bytes .../crosstracker-widget-change-mode.png | Bin 0 -> 9363 bytes .../widget/crosstracker-widget.png | Bin 47371 -> 11128 bytes .../step-by-step/install-plugins.rst | 2 +- languages/en/user-guide/project-admin.rst | 59 ++- languages/en/user-guide/tql.rst | 385 ++---------------- .../user-guide/tql/cross-tracker-search.rst | 286 +++++++++++++ .../en/user-guide/{ => tql}/tql-artlink.rst | 0 .../en/user-guide/tql/tracker-report.rst | 143 +++++++ languages/en/user-guide/tuleap-entreprise.rst | 2 +- 10 files changed, 496 insertions(+), 381 deletions(-) delete mode 100644 languages/en/images/screenshots/tql/expert_query_xtracker_widget.png create mode 100644 languages/en/images/screenshots/widget/crosstracker-widget-change-mode.png create mode 100644 languages/en/user-guide/tql/cross-tracker-search.rst rename languages/en/user-guide/{ => tql}/tql-artlink.rst (100%) create mode 100644 languages/en/user-guide/tql/tracker-report.rst diff --git a/languages/en/images/screenshots/tql/expert_query_xtracker_widget.png b/languages/en/images/screenshots/tql/expert_query_xtracker_widget.png deleted file mode 100644 index 76545cdebe7b93cc33706b9d1384cc302c590d57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8477 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 VvQE1uDGvB^SxG}NU)~J){{R))hbI64 diff --git a/languages/en/installation-guide/step-by-step/install-plugins.rst b/languages/en/installation-guide/step-by-step/install-plugins.rst index 3c783ab6..a0dbb25d 100644 --- a/languages/en/installation-guide/step-by-step/install-plugins.rst +++ b/languages/en/installation-guide/step-by-step/install-plugins.rst @@ -62,7 +62,7 @@ Project management: * This module is part of :ref:`Tuleap Entreprise `. -* :ref:`crosstracker `: Aggregate data across trackers, even in across projects (beta) +* :ref:`crosstracker `: Aggregate data across trackers, even across projects. * This module is part of :ref:`Tuleap Entreprise `. diff --git a/languages/en/user-guide/project-admin.rst b/languages/en/user-guide/project-admin.rst index d8fd1ea0..9a35240a 100644 --- a/languages/en/user-guide/project-admin.rst +++ b/languages/en/user-guide/project-admin.rst @@ -250,7 +250,7 @@ The widgets will be the same, in the same position, but they won't be able to modify the page. Some Widgets available on project dashboard -````````````````````````````````````````````` +``````````````````````````````````````````` New widgets can be added through the dropdown entry "Add widget". Here is an example of available widgets for the project dashboard: @@ -278,7 +278,7 @@ Some widgets have documentation to explain how to configure and use them: - :ref:`Hudson/Jenkins ` permits to display many widgets for Continuous Integration. - :ref:`Project Milestones ` displays a Scrum Backlog in project dashboard. - :ref:`Label widget ` to track your items. -- :ref:`Portfolio `. +- :ref:`Cross-Tracker Search `. - :ref:`Roadmap `. Whenever you enter the Project Dashboard of a given project or any of @@ -288,45 +288,64 @@ menu. Only site or project administrators can access the Project Administration page. All other Tuleap users are denied access to this part of a project. -.. _portfolio: +.. _xts: -Portfolio -````````` +Cross-Tracker Search +```````````````````` .. attention:: This module is part of :ref:`Tuleap Entreprise `. It might not be available on your installation of Tuleap. -.. NOTE:: - This widget is still under development. - You may want to perform a search based on several trackers and several projects. -A widget "Cross tracker search" enables you to do that. +A widget "Cross-Tracker Search" enables you to do that. .. figure:: ../images/screenshots/widget/crosstracker-widget.png - :align: center - :alt: Example of dashboard with cross-tracker widget - :name: Example of dashboard with cross-tracker widget + :alt: Example of cross-tracker widget + + Example of cross-tracker widget -If you don't fill a query, the request will retrieve "Open" artifacts. -If you use the query, the retrieved artifacts will match the query and not only the "Open" ones. -The query uses the TQL language. You can find more information about the query format :ref:`here `. +There are two modes on this widget: a Default mode and an Expert mode. -The search respects Tuleap permissions model: you can choose only projects you are member of and trackers you can read. +Default mode +++++++++++++ + +This is the mode in which the widget is created. It allows you to choose a list of trackers coming from different projects and to filter artifacts from those trackers according to some criteria. + +You can optionally write a query using :ref:`Tuleap Query Language ` If you don't write a query, it will by default search all "Open" artifacts in the selected projects. If you use the query, the retrieved artifacts will match the query and not only the "Open" ones. See the dedicated page for details on how to write a query: :ref:`TQL in Cross-Tracker Search `. + +The search respects Tuleap's permissions model: you can choose only projects you are member of and trackers you can read. If you can't read all trackers or all columns needed by the query, an error message will be displayed. After selecting trackers and/or entering a query, you will be able to Save the report. Once saved, all users who can access this dashboard will see the widget with your saved tracker selection and query. +Expert mode ++++++++++++ + +The Cross-Tracker Search widget has a second mode called "Expert mode" allowing you to search even more specifically on your whole platform. +You can switch between modes by using the ``Expert mode`` button on the widget. + +.. figure:: ../images/screenshots/widget/crosstracker-widget-change-mode.png + :alt: Change the mode of the widget + + Change the mode of the widget + +In this mode, the choice of columns to display, the selection of trackers and projects and the selection of artifacts are all expressed in :ref:`Tuleap Query Language ` only. Writing a TQL query is mandatory. See the dedicated page for details on how to write a query: :ref:`TQL in Cross-Tracker Search Expert mode ` + +After writing a query, you can save the report, then all users who have access to this dashboard will see the widget and the selected artifacts and columns. + CSV Export -~~~~~~~~~~ +++++++++++ + +.. note:: CSV Export in not available in Expert mode, only in Default mode. Once a report is saved, an "Export CSV" button will appear. Click it to download a CSV file representing all the artifacts you can see on the widget. .. figure:: ../images/screenshots/widget/crosstracker-widget-export-csv.png - :align: center - :alt: CSV Export button - :name: CSV Export button + :alt: CSV Export button + + CSV Export button .. note:: The CSV file contains more information than you can see on the widget. It will export Tracker Semantics and match fields based on their types and names. diff --git a/languages/en/user-guide/tql.rst b/languages/en/user-guide/tql.rst index d0d97cd4..855634de 100644 --- a/languages/en/user-guide/tql.rst +++ b/languages/en/user-guide/tql.rst @@ -4,367 +4,34 @@ Tuleap Query Language (TQL) =========================== The Tuleap Query Language is a pseudo-language to search items in the platform. As of today -only artifacts in trackers can be retrieved. +only artifacts in trackers can be searched. -TQL on reports --------------- +.. toctree:: + :maxdepth: 2 -TQL can be used in "Expert" mode on tracker's reports in the search area. -The saving of the query matches the usual saving of the report. + tql/tracker-report + tql/cross-tracker-search -.. figure:: ../images/screenshots/tql/expert_query.png - :align: center - :alt: Tuleap Query Language on reports - :name: Tuleap Query Language on reports - - Tuleap Query Language on reports - -Queries -------- - -Currently, the language supports: - -- Logical operators: ``AND``, ``OR`` -- Parenthesis to force precedence - - -Comparison operators -'''''''''''''''''''' - -* For string, text, files, and @comments: ``=``, ``!=`` -* For date, integer and float fields: ``=``, ``!=``, ``<``, ``<=``, ``>``, ``>=``, ``BETWEEN()`` -* For list fields: ``=``, ``!=``, ``IN()``, ``NOT IN()`` - -Comparison values -''''''''''''''''' - -* For string, text, and files fields: ``string`` -* For integer fields: ``string`` convertible to integer, ``integer`` -* For float fields: ``string`` convertible to float, ``integer``, ``float`` -* For date fields: ``string`` convertible to date, ``NOW()`` -* For list fields: ``all`` matching list bind values -* For list fields bound to users: ``string`` using user names, ``MYSELF()`` -* For list fields bound to user groups: ``string`` matching either the name of a user-defined ("Static") user group (e.g. ``"Customers"``) or matching the translated system-defined ("Dynamic") user group name (e.g. ``"Project members"``). -* For @comments: ``string`` - -Dynamic value for date fields: ``NOW()`` -'''''''''''''''''''''''''''''''''''''''' - -* ``start_date > NOW()`` matches all artifacts where start_date is greater than the current time (time when the query - is displayed). -* You can use interval periods with NOW(), for example ``submitted_on > NOW() - 1m`` will matches - all artifacts that have been created during the last month. The supported specificators are: - - * years (``y``) - * months (``m``) - * weeks (``w``) - * days (``d``) - -Dynamic value for list fields bound to users: ``MYSELF()`` -'''''''''''''''''''''''''''''''''''''''''''''''''''''''''' - -``assigned_to = MYSELF()`` matches all artifacts where assigned_to is equal to the current user. - -Search in comments -'''''''''''''''''' - -* ``@comments = 'Lorem ipsum'`` matches all artifacts where at least one follow-up comment contains the string ``lorem ipsum`` -* ``@comments = ''`` returns the list of artifacts without any comments -* ``@comments != ''`` returns the list of artifacts with at least one comment - -When searching in comments, you should be aware of some limitations: - - * Searches are done for words longer than 3 characters - * Some words are not taken in account because they are too common (like ``the``, ``a``, …) - -Search in files -''''''''''''''' - - * ``attachment = 'minutes'`` matches all artifacts where there is at least one attached file with the filename "Minutes-20180101.docx" or the description "Minutes of last meeting" contains the string ``minutes`` - * ``attachment != 'minutes'`` matches all artifacts where there isn't any attached files with filename or description containing ``minutes``. - * ``attachment = ''`` matches all artifacts without any attached files - * ``attachment != ''`` matches all artifacts that have at least one attached file - -.. include:: tql-artlink.rst - -Query construction ------------------- - -To construct a query you can combine all these elements. - -Query example: - -.. code-block:: tql - - (summary = "soap" OR summary = "rest") - AND description = "documentation" AND story_points BETWEEN(3, 8) - -.. NOTE:: Be careful, you must use the name of fields and not the label to construct queries. - -Sending the query to the server can throw the following errors: - -- The query syntax is incorrect (e.g. if you forget a closing quote) -- The name doesn't match any existing field name -- The value is not defined for the list field (e.g. ``assigned_to = "non_existent_user"``) -- The dynamic value is not supported for this field (e.g. ``text_field = NOW()``) -- The comparison operator is not supported for this field (e.g. ``list_field >= 3``) -- The empty value is not allowed for this comparison (e.g. ``date_field BETWEEN("", "2017-01-18")``) -- The query uses MYSELF() and the current user is not logged in (when browsing a Tuleap platform as an anonymous user) -- The field type is unsupported -- The query is too complex - -.. IMPORTANT:: The query is too complex when it exceeds a limit. This limit is defined by SiteAdministrators on SiteAdmin > Tracker > Report. - -Pro-tips --------- - -For a better usability in building query there is a syntax highlighting -and an auto-completion (``ctrl+space`` on field names). - -.. figure:: ../images/screenshots/tql/expert_query_autocompletion.png - :align: center - :alt: Highlighting and auto-completion - :name: Highlighting and auto-completion - - Highlighting and auto-completion - -Moreover to know allowed fields there is a select box with all usable -fields. If you click on one of them the field's name is introduced in -the query. - -.. figure:: ../images/screenshots/tql/expert_query_allowed_fields.png - :align: center - :alt: Allowed fields - :name: Allowed fields - - Allowed fields - -Date operators --------------- - -When searching on date fields using TQL, you should be aware of the sometimes subtle differences between the various operators. We have found this diagram helpful. Here, we use all available operators supporting date fields and a given date ("2017-01-18") and represent the period that will be selected as a result. For example, ``date_field > "2017-01-18"`` means ``date_field`` is later than 2017-01-18 23:59:59, while ``date_field >= "2017-01-18"`` means ``date_field`` is later than or equal to 2017-01-18 00:00:00 - -.. figure:: ../images/diagrams/tql/expert_query_date_operators.png - :align: center - :alt: Explanation of date operators - :name: Explanation of date operators - - Explanation of date operators - -TQL on cross-tracker search ----------------------------- - -.. attention:: - - This module is part of :ref:`Tuleap Enterprise `. It might - not be available on your installation of Tuleap. - -TQL can also be used in the cross-tracker widget, in the search area. - -.. figure:: ../images/screenshots/tql/expert_query_xtracker_widget.png - :align: center - :alt: TQL on cross-tracker search - :name: TQL on cross-tracker search - - TQL on cross-tracker search - -Semantics and some dynamic fields such as the Submission date ("Submitted On") can be used to search on multiple trackers. The following keywords are supported: - -String/Text semantics: - * ``@title``: the "Title" semantic. It behaves like a string field. - * ``@description``: the "Description" semantic. It behaves like a text field. - -Integer: - * ``@id``: the "Artifact id" dynamic field. It contains the unique id of the artifact, a strictly positive integer. - -Dates: - * ``@submitted_on``: the "Submitted On" dynamic field. It behaves like a date field, but the empty string ``''`` is not allowed (this field cannot be empty). - * ``@last_update_date``: the "Last Update Date" dynamic field. It behaves like a date field, but the empty string ``''`` is not allowed (this field cannot be empty). - -Lists: - * ``@status``: the "Status" semantic. It behaves like a list, but can only be compared to ``OPEN()`` - -Lists bound to users: - * ``@submitted_by``: the "Submitted By" dynamic field. It behaves like a list and can have only a single value at a time. - * ``@last_update_by``: the "Last Updated by" dynamic field. It behaves like a list and can have only a single value at a time. - * ``@assigned_to``: the "Contributor/assignee" semantic. It behaves like a list and can have multiple values at a time (multiple users assigned to an artifact). - -.. _tql_duck_typing: - -Searching on similar fields -''''''''''''''''''''''''''' - -You can also search on any custom field with its name as long as there is at least one Tracker with a compatible definition. We consider that 2 fields from 2 Trackers are compatible if: - * You can see both fields - * They have the same name - * Their types are compatible - -Compatible field types: - * Numerics: integer and float - * Lists with same bind (user, user group, static) - * String and text - * Date - * Date time - -TQL behavior to search on these fields is the same as for classic single tracker search. - -Preconditions for multi-tracker search --------------------------------------- - -When you use a semantic, at least one of the selected trackers must have it configured and the field linked to the semantic must be readable by the current user. - -For example, if you run an expert query containing ``@status``, at least one of the selected trackers **must** have defined a "Status" semantic and the "Status" field **must** be readable by the user viewing the widget. -If **none** of the trackers defines the "Status" semantic, it will cause an error to be shown. The same is true for permissions: if **none** of the "Status" fields are readable by the current user, it will raise an error. - -When you use a dynamic field, it must exist in at least one of the selected trackers and it must be readable by the current user. - -Supported dynamic fields are the following: - * "Submitted On": The creation date and time of the artifact. - * "Submitted By": The user who first created the artifact. - * "Last Updated Date": The date and time of the last change to the artifact. - * "Last Updated By": The user who made the last change to the artifact. - * "Artifact id": The unique id of the artifact. - -For example, if you run an expert query containing ``@last_update_date``, at least one of the selected trackers **must** have a "Last update date" field and that field **must** be readable by the user viewing the widget. -If **none** of the trackers has a "Last update date" field, it will cause an error to be shown. The same is true for permissions: if **none** of the "Last update date" fields are readable by the current user, it will raise an error. - -If only part of the selected trackers match these preconditions, the query will be performed only on those. - -Queries -------- - -Currently, the query supports: - -- Logical operators: ``AND``, ``OR`` -- Parenthesis to force precedence - -Supported comparisons -''''''''''''''''''''' - - * For @title and @description: ``=``, ``!=`` - * For @status: ``= OPEN()``, ``!= OPEN()``. ``OPEN()`` is the only supported value. - * For @submitted_on, @last_update_date and @id: ``=``, ``!=``, ``<``, ``<=``, ``>``, ``>=``, ``BETWEEN()``. - * For @submitted_by, @last_update_by and @assigned_to: ``=``, ``!=``, ``IN()``, ``NOT IN()``. - -Comparison values -''''''''''''''''' - - * For @title and @description: ``string`` - * For @status: ``OPEN()`` is the only supported value - * For @submitted_on and @last_update_date: ``string`` convertible to date, ``NOW()`` and dynamic values based on ``NOW()``. For example: ``NOW() -1m``, ``NOW() -6w``, ... - * For @submitted_on and @last_update_date: the empty string ``''`` cannot be used. Those fields always have a value, therefore the comparison to "empty" is not useful. - * For @submitted_by, @last_update_by and @assigned_to: ``string`` matching a user, ``MYSELF()`` - * For @id: ``integer``. - -.. include:: tql-artlink.rst - -Example -------- - -.. code-block:: tql - - @title = 'documentation' AND @status = OPEN() AND @last_update_date > NOW() - 1w - //Returns all open artifacts with 'documentation' in the title that have been - //updated during the last week. - - @title = 'documentation' AND @submitted_by = 'alice' AND @assigned_to IN (MYSELF(), 'charles') - //Returns all artifacts with 'documentation' in the title that have been submitted - //by user 'alice' and are assigned to the viewing user (for example 'bob') - //or user 'charles'. - -Expert mode +Limitations ----------- -.. attention:: - - This part is still work in progress, future releases may break your report. - You can follow advancement in `epic #37567 SuperTableau - Full TQL mode `_ - -Cross-tracker search widget is also available in expert mode allowing you to use extended syntax of TQL. - -In this extended syntax of TQL you can choose which fields you want to display on the widget through ``SELECT`` syntax, and also on which tracker to perform the query with ``FROM``: - -.. code-block:: tql - - SELECT @pretty_title, @status, open_date - FROM @project = 'self' AND @tracker.name IN('activity', 'task') - WHERE @assigned_to = MYSELF() - ORDER BY @last_update_date DESCENDING - // Returns all artifacts from current project activity and task trackers assigned to me. - // Display their title, status and opening date ordered according to their last modification date. - -When using Cross-tracker search expert mode, you must use ``SELECT`` syntax with at least one field, ``FROM`` with at least one condition, and a condition after the ``WHERE``. The ``ORDER BY`` part is optional. - -TQL ``SELECT`` syntax allows you to select on the same fields allowed for the condition plus some special fields: - -Semantics and always there fields: - * ``@id`` Artifact id. - * ``@submitted_on`` The creation date and time of the artifact. - * ``@last_update_date`` The date and time of the last change to the artifact. - * ``@submitted_by`` The user who first created the artifact. - * ``@last_update_by`` The user who made the last change to the artifact. - * ``@title`` Artifact title semantic. - * ``@description`` Artifact description semantic. - * ``@status`` Artifact status semantic. - * ``@assigned_to`` Artifact assignee/contributor semantic. - -Fields short name: - * Same as for condition (see :ref:`Duck-typed fields rules `) - * Note that in ``SELECT`` date and datetime fields are considered compatible - -Special fields: - * ``@project.name`` The name and icon of the project that the artifact belongs to. - * ``@tracker.name`` The name and color of the tracker the artifact belongs to. - * ``@pretty_title`` It's equivalent to the Artifact column of classic Cross-tracker search widget (or the title of the artifact view). - -TQL ``FROM`` syntax allows you to select on which tracker to perform the query by filtering projects and trackers. You can use only one condition of each type joined by ``AND``: - -Project condition: - * ``@project = 'self'`` get current project. Works only in a project dashboard. - * ``@project = 'aggregated'`` get project aggregated to the current one. Works only in a :ref:`program ` project dashboard. - * ``@project.name`` either with ``= 'project_name'`` or ``IN('project_name', 'another_project')``, get all projects with the corresponding short name. - * ``@project.category = 'Topic::Hardware'`` get all projects with corresponding category or sub category. A category is specified by its full path (root category to current one) with ``::`` as delimiter. - * ``@project.category IN('Topic::Hardware', 'License::Open Source')`` get all projects with corresponding category. - -Tracker condition: - * ``@tracker.name`` either with ``= 'release'`` or ``IN('release', 'sprint')``, get all trackers with corresponding short name. - -You must provide 1 or 2 condition of different kind. If only the project condition is provided then it gets all trackers from corresponding projects. -If only the tracker condition is provided, then match the trackers from current project. It means that in a personal dashboard you must provide the project condition. - -To provide both condition, you can use ``AND`` between them. There is no restriction for the order of the conditions. - -TQL ``ORDER BY`` syntax allows you to sort artifacts on a single field. Ordering on more than one criteria is not possible. - -There are some restrictions on the fields you can use. As for the condition (``WHERE``) their types must be compatible. Date and date with time fields are not compatible together. -For list fields, only selectbox and radio buttons are allowed. All the ``@`` fields and semantics valid in conditions (``WHERE``) are allowed. - -You must provide the direction of the ordering: - * ``ASC`` or ``ASCENDING`` from smallest to largest - * ``DESC`` or ``DESCENDING`` from largest to smallest - -User list and user group list fields are compared on displayed value. For user lists it means that the ordering depends on your preference on user display (login, real name or both). -For user groups like Project members or Project administrators, the sort is done on their translated name and so the ordering depends on your language. - -If you do not provide an ``ORDER BY`` to your query, it will default to ``ORDER BY @id DESCENDING``. - -Some example you can take inspiration from: - -.. code-block:: tql - - SELECT @pretty_title, @status, @submitted_by, @last_update_date - FROM @project.name = 'support' AND @tracker.name = 'ticket' - WHERE @status = OPEN() AND @assigned_to = MYSELF() - ORDER BY @last_update_date DESC - // Get tickets assigned to me from support project. Display their title, status, who opened the ticket and the last modification date - - SELECT @title, @status, @project.name - FROM @project.category = 'Topic::Team' AND @tracker.name IN('epic', 'story') - WHERE @status = OPEN() - // Get open epics and stories from project with category Topic::Team (or sub category) - // display their title, status and from which project it comes - - SELECT @pretty_title - FROM @project = 'self' - WHERE @id >= 1 - // Display title of all artifacts of current project \ No newline at end of file +:ref:`TQL in Tracker reports ` does not have the same features as TQL in :ref:`Cross-Tracker Search `. There are also two "modes" in Cross-Tracker search TQL: :ref:`Expert mode ` is the most complete and supports additional syntax (see below). + +===================================== ======================= =========================================== ========================================== +Feature TQL in tracker reports TQL in Cross-Tracker search "Default mode" TQL in Cross-Tracker search "Expert mode" +===================================== ======================= =========================================== ========================================== +Conditions on ``@comments`` ✔️ ❌ ❌ +Conditions on file fields ✔️ ❌ ❌ +Conditions on ``@assigned_to`` ❌ ✔️ ✔️ +Conditions on ``@description`` ❌ ✔️ ✔️ +Conditions on ``@status`` ❌ ✔️ ✔️ +Conditions on ``@title`` ❌ ✔️ ✔️ +Conditions on ``@id`` ❌ ✔️ ✔️ +Conditions on ``@submitted_on`` ❌ ✔️ ✔️ +Conditions on ``@submitted_by`` ❌ ✔️ ✔️ +Conditions on ``@last_update_date`` ❌ ✔️ ✔️ +Conditions on ``@last_update_by`` ❌ ✔️ ✔️ +``SELECT`` ❌ ❌ ✔️ +``FROM`` ❌ ❌ ✔️ +``ORDER BY`` ❌ ❌ ✔️ +===================================== ======================= =========================================== ========================================== diff --git a/languages/en/user-guide/tql/cross-tracker-search.rst b/languages/en/user-guide/tql/cross-tracker-search.rst new file mode 100644 index 00000000..df27b090 --- /dev/null +++ b/languages/en/user-guide/tql/cross-tracker-search.rst @@ -0,0 +1,286 @@ +.. _tql_xts: + +TQL in Cross-Tracker Search +=========================== + +.. attention:: + + This module is part of :ref:`Tuleap Enterprise `. It might + not be available on your installation of Tuleap. + +The widget +---------- + +TQL can be used in the :ref:`Cross-Tracker Search widget `, in the search area. The widget is part of the :ref:`Cross-Tracker Search plugin ` and can be added on any dashboard that you have permission to modify. + +.. _xts_default_mode: + +Default mode +------------ + +The widget has two modes, allowing you to choose the level of fine-tuning you want. There is a Default mode and an :ref:`Expert mode `. +Let's first see the default mode. + +See the documentation page of the :ref:`Cross-Tracker Search widget ` for details on the Default mode. This page focuses on the TQL syntax. + +Examples: + +.. code-block:: tql + + @title = 'documentation' AND @status = OPEN() AND @last_update_date > NOW() - 1w + // Returns all open artifacts with 'documentation' in the title that have been + // updated during the last week. + + @title = 'documentation' AND @submitted_by = 'alice' AND @assigned_to IN (MYSELF(), 'charles') + // Returns all artifacts with 'documentation' in the title that have been submitted + // by user 'alice' and are assigned to the viewing user (for example 'bob') + // or user 'charles'. + +To filter artifacts, you have access to several criteria detailed below. + +.. _tql_duck_typing: + +Similar fields +'''''''''''''' + +You can search on any custom field with its name as long as there is at least one Tracker with a compatible definition. We consider that 2 fields from 2 Trackers are compatible if: + * You can see both fields + * They have the same name + * Their types are compatible + +Compatible field types: + * Numerics: integer and float + * Lists with same bind (user, user group, static) + * String and text + * Date + * Date time + +Semantics and dynamic fields +'''''''''''''''''''''''''''' + +The following keywords are supported: + +String/Text semantics: + * ``@title``: the "Title" semantic. It behaves like a string field. + * ``@description``: the "Description" semantic. It behaves like a text field. + +Integer: + * ``@id``: the "Artifact id" dynamic field. It contains the unique id of the artifact, a strictly positive integer. + +Dates: + * ``@submitted_on``: the "Submitted On" dynamic field. It behaves like a date field, but the empty string ``''`` is not allowed (this field cannot be empty). + * ``@last_update_date``: the "Last Update Date" dynamic field. It behaves like a date field, but the empty string ``''`` is not allowed (this field cannot be empty). + +Lists: + * ``@status``: the "Status" semantic. It can only be compared to ``OPEN()`` + +Lists bound to users: + * ``@submitted_by``: the "Submitted By" dynamic field. It behaves like a list and can have only a single value at a time. + * ``@last_update_by``: the "Last Updated by" dynamic field. It behaves like a list and can have only a single value at a time. + * ``@assigned_to``: the "Contributor/assignee" semantic. It behaves like a list and can have multiple values at a time (multiple users assigned to an artifact). + +Comparison +'''''''''' + + * For string and text fields: ``=``, ``!=`` + * For date, integer and float fields: ``=``, ``!=``, ``<``, ``<=``, ``>``, ``>=``, ``BETWEEN()`` + * For list fields: ``=``, ``!=``, ``IN()``, ``NOT IN()`` + +Comparison values +~~~~~~~~~~~~~~~~~ + + * For string and text fields: simple quote or double quote string like ``'simple quote'`` or ``"double quote"``. + * For integer fields: integer (``3``) or string convertible to integer (``"3"``) + * For float fields: integer (``3``), float (``4.2``) or string convertible to float (``"5.6"``) + * For date fields: ``NOW()`` or string convertible to date (``"2024-10-07"``) + * For list fields: matching list values (for example: ``"In Review"``, ``"Ongoing"``) + * For list fields bound to users: ``MYSELF()`` or ``string`` user names (for example: ``"jdoe"``, ``"John Doe"``) + * For list fields bound to user groups: ``string`` matching either the name of a user-defined ("Static") user group (for example: ``"Customers"``) + or matching the translated system-defined ("Dynamic") user group name (for example: ``"Project members"``). + +Empty string ``''`` can be used for any field to specify no value. + +``@submitted_by``, ``@last_update_by``, ``@submitted_on``, ``@last_update_date`` and ``@id`` cannot be compared to empty string ``''`` as these fields always have a value. + +Dynamic value for date fields ++++++++++++++++++++++++++++++ + + * ``start_date > NOW()`` matches all artifacts where the field ``start_date`` is greater (more recent) than the current time (time when the query + is displayed). + * You can use interval periods with ``NOW()``, for example ``submitted_on > NOW() - 1m`` will matches + all artifacts that have been created during the last month. The supported specificators are: + + * years (``y``) + * months (``m``) + * weeks (``w``) + * days (``d``) + +Dynamic value for list fields bound to users: ``MYSELF()`` +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +``owner = MYSELF()`` matches all artifacts where the field ``owner`` is equal to the current user. + +.. include:: tql-artlink.rst + +Queries +''''''' + +You can assemble your different comparisons with logical operators ``AND`` and ``OR`` and use parenthesis ``()`` to force precedence. + +Preconditions for multi-tracker search +'''''''''''''''''''''''''''''''''''''' + +When you use a semantic, at least one of the selected trackers must have it configured and the field linked to the semantic must be readable by the current user. + +For example, if you run an expert query containing ``@status``, at least one of the selected trackers **must** have defined a "Status" semantic and the "Status" field **must** be readable by the user viewing the widget. +If **none** of the trackers defines the "Status" semantic, it will cause an error to be shown. The same is true for permissions: if **none** of the "Status" fields are readable by the current user, it will raise an error. + +If only part of the selected trackers match these preconditions, the query will be performed only on those trackers. + +Errors you can receive +~~~~~~~~~~~~~~~~~~~~~~ + +.. note:: Be careful, you must use the name of fields and not the label to construct queries. + +Sending the query to the server can produce the following errors: + +- The query syntax is incorrect (for example: if you forget a closing quote ``"``) +- The name used in a comparison doesn't match any existing field name in any of the trackers selected (or there is a mistake in the name) +- The value is not defined for the list field (for example: ``assigned_to = "non_existent_user"``) +- The dynamic value is not supported for this field (for example: ``text_field = NOW()``) +- The comparison operator is not supported for this field (for example: ``list_field >= 3``) +- The empty value is not allowed for this comparison (for example: ``date_field BETWEEN("", "2017-01-18")``) +- The query uses ``MYSELF()`` and the current user is not logged in (for example: when browsing a Tuleap platform as an anonymous user) +- The field type is unsupported +- The query is too complex + +.. important:: The query is too complex when it exceeds a limit. This limit is defined by Site Administrators on Site Administration > Tracker > Report. + +.. _xts_expert_mode: + +Expert mode +----------- + +.. attention:: + + This part is still work in progress, future releases may break your report. + You can follow advancement in `epic #37567 SuperTableau - Full TQL mode `_ + +See the documentation page of the :ref:`Cross-Tracker Search widget ` for details on the Expert mode. This page focuses on the TQL syntax. + +In expert mode, the widget uses an extended TQL syntax. In this syntax of TQL, you can choose which fields you want to display on the widget through ``SELECT`` syntax, and also on which trackers to perform the query with ``FROM``: + +.. code-block:: tql + + SELECT @pretty_title, @status, open_date + FROM @project = 'self' AND @tracker.name IN('activity', 'task') + WHERE @assigned_to = MYSELF() + ORDER BY @last_update_date DESCENDING + // Returns all artifacts from current project activity and task trackers assigned to me. + // Display their title, status and opening date ordered according to their last modification date. + +When using Cross-tracker search expert mode, you must use ``SELECT`` syntax with at least one field, ``FROM`` with at least one condition, and a condition after the ``WHERE``. The ``ORDER BY`` part is optional. + +The condition after the ``WHERE`` corresponds to what you write in :ref:`default mode `. + +``SELECT`` +'''''''''' + +TQL ``SELECT`` syntax helps you select which columns you want to see on the artifacts that match the conditions. In ``SELECT``, you may choose several fields, semantics, or "special fields" that will be shown. Each time you select something, it will add another column to the results table. The order of items in ``SELECT`` will be respected in the columns. + +You may use the same fields allowed for the conditions (``WHERE``) plus some special fields: + +Semantics and always there fields: + * ``@id``: Artifact id. + * ``@submitted_on``: The creation date and time of the artifact. + * ``@last_update_date``: The date and time of the last change to the artifact. + * ``@submitted_by``: The user who first created the artifact. + * ``@last_update_by``: The user who made the last change to the artifact. + * ``@title``: Artifact title semantic. + * ``@description``: Artifact description semantic. + * ``@status``: Artifact status semantic. + * ``@assigned_to``: Artifact assignee/contributor semantic. + +Fields short name: + * Same as for condition (see :ref:`Similar fields rules `) + * Note that in ``SELECT`` date and datetime fields are considered compatible + +Special fields: + * ``@project.name``: The name and icon of the project that the artifact belongs to. + * ``@tracker.name``: The label and color of the tracker the artifact belongs to. + * ``@pretty_title``: The reference to the artifact colored with the tracker color and the title semantic of the artifact. For example: ``user_story #123 My Story title``. + +``FROM`` +'''''''' + +TQL ``FROM`` syntax allows you to select on which trackers to perform the query by filtering projects and trackers. You can use only one condition of each type joined by ``AND``: + +Project condition: + * ``@project = 'self'`` get current project. Works only in a project dashboard. + * ``@project = 'aggregated'`` get project aggregated to the current one. Works only in a :ref:`program ` project dashboard. + * ``@project.name`` either with ``= 'project_name'`` or ``IN('project_name', 'another_project')``, get all projects with the corresponding short name. + * ``@project.category = 'Topic::Hardware'`` get all projects with corresponding category or sub category. A category is specified by its full path (root category to current one) with ``::`` as delimiter. + * ``@project.category IN('Topic::Hardware', 'License::Open Source')`` get all projects with corresponding category. + +Tracker condition: + * ``@tracker.name`` either with ``= 'release'`` or ``IN('release', 'sprint')``, get all trackers with corresponding short name. + +There cannot be multiple conditions on ``@project``. For example, the following query will be rejected: ``FROM @project.category = 'Type::Helpdesk' AND @project.name = 'foo'``. Similarly, there cannot be multiple conditions on ``@tracker``. For example, the following query will be rejected: ``FROM @tracker.name = 'sla' AND @tracker.name = 'request'``. If only the project condition is given, then it gets all trackers from corresponding projects (for example: ``FROM @project.name = 'foo'``). If only the tracker condition is provided, then it matches the trackers from the current project (for example: ``FROM @tracker.name = 'sla'``). It means that in a personal dashboard, the project condition is mandatory. + +To provide both conditions, you must use ``AND`` between them. There is no restriction for the order of the conditions. For example: ``FROM @project.category = 'Type::Helpdesk' AND @tracker.name = 'request'`` + +``ORDER BY`` +'''''''''''' + +TQL ``ORDER BY`` syntax allows you to sort artifacts on a single field. Ordering on more than one criteria is not possible. + +There are some restrictions on the fields you can use. As for the condition (``WHERE``) their types must be compatible. Date and date with time fields are not compatible together. +For list fields, only selectbox and radio buttons are allowed. All the ``@`` fields and semantics valid in conditions (``WHERE``) are allowed. + +You must provide the direction of the ordering: + * ``ASC`` or ``ASCENDING`` from smallest to largest + * ``DESC`` or ``DESCENDING`` from largest to smallest + +User list and user group list fields are compared on displayed value. For user lists, it means that the ordering depends on your preference on user display (login, real name or both). +For user groups like Project members or Project administrators, the sort is done on their translated name and so the ordering depends on your language. + +If you do not provide an ``ORDER BY`` to your query, it will default to ``ORDER BY @id DESCENDING``. + +Examples +'''''''' + +.. code-block:: tql + + SELECT @pretty_title, @status, @submitted_by, @last_update_date + FROM @project.name = 'support' AND @tracker.name = 'ticket' + WHERE @status = OPEN() AND @assigned_to = MYSELF() + ORDER BY @last_update_date DESC + // Get tickets assigned to me from support project. Display their title, status, who opened the ticket and the last modification date + + SELECT @title, @status, @project.name + FROM @project.category = 'Topic::Team' AND @tracker.name IN('epic', 'story') + WHERE @status = OPEN() + // Get open epics and stories from project with category Topic::Team (or sub category) + // display their title, status and from which project it comes + + SELECT @pretty_title + FROM @project = 'self' + WHERE @id >= 1 + // Display title of all artifacts of current project + + SELECT @pretty_title, @status, @assigned_to, @project.name + FROM @project IN('self', 'aggregated') + WHERE @status = OPEN() + // Display artifacts from current project and teams projects in the context of a program project + +Errors you can receive +'''''''''''''''''''''' + +Sending the query to the server can produce the following errors: + +- Missing part of the query (missing ``SELECT`` or ``FROM`` or ``WHERE``). +- The ``FROM`` part found no trackers (for example: ``FROM @tracker.name = 'sprint'`` but there is no tracker ``sprint`` in the current project). +- Using ``FROM @project = 'self'`` in a personal dashboard. +- Using ``FROM @project = 'aggregated'`` in a personal dashboard or a project without :ref:`Program management service ` enabled. +- Fields with the same name are not compatible between them (for example: date and int field). This can happen for fields used in ``SELECT``, ``WHERE`` and ``ORDER BY``. +- Using a list field with multiple values in ``ORDER BY`` (open list, multi-selectbox, checkbox fields are not allowed). diff --git a/languages/en/user-guide/tql-artlink.rst b/languages/en/user-guide/tql/tql-artlink.rst similarity index 100% rename from languages/en/user-guide/tql-artlink.rst rename to languages/en/user-guide/tql/tql-artlink.rst diff --git a/languages/en/user-guide/tql/tracker-report.rst b/languages/en/user-guide/tql/tracker-report.rst new file mode 100644 index 00000000..cf680158 --- /dev/null +++ b/languages/en/user-guide/tql/tracker-report.rst @@ -0,0 +1,143 @@ +.. _tql_tracker_report: + +TQL in tracker reports +====================== + +You can use TQL syntax in tracker reports "Expert" mode in the search area. Saving a TQL query works the same way as saving a "Normal" mode report. + +.. figure:: ../../images/screenshots/tql/expert_query.png + :align: center + :alt: Tuleap Query Language in tracker reports + :name: Tuleap Query Language in tracker reports + + Tuleap Query Language in tracker reports + +The goal of TQL is to help you filter very precisely which artifacts you want to see in a tracker report. To achieve this filtering, you can build a query with one or several conditions that artifacts must match in order to be selected. Once selected, artifacts are displayed and you can select which columns you want to see and how to order artifacts with the web user interface, the same way as "Normal" mode reports. + +Queries +------- + +.. note:: ``SELECT``, ``FROM`` and ``ORDER BY`` syntax is not supported in Tracker reports. Please refer to :ref:`the TQL Limitations table ` for details about the syntax differences. + +Comparison operators +'''''''''''''''''''' + +* For string, text, files, and @comments: ``=``, ``!=`` +* For date, integer and float fields: ``=``, ``!=``, ``<``, ``<=``, ``>``, ``>=``, ``BETWEEN()`` +* For list fields: ``=``, ``!=``, ``IN()``, ``NOT IN()`` + +Comparison values +''''''''''''''''' + +* For string, text, and files fields: ``string``, for example: ``'text between simple quotes'`` or ``"text between double quotes"`` +* For integer fields: ``integer`` (``3``) or ``string`` convertible to integer (for example: ``"3"``) +* For float fields: ``integer`` (``3``), ``float`` (``0.5``) or ``string`` convertible to float (for example: ``'3.6'``) +* For date fields: ``NOW()`` or ``string`` convertible to date (for example: ``"2024-10-07"``) +* For list fields: matching list values (for example: ``"In Review"``, ``"Ongoing"``) +* For list fields bound to users: ``MYSELF()`` or ``string`` user names (for example: ``"jdoe"``, ``"John Doe"``) +* For list fields bound to user groups: ``string`` matching either the name of a user-defined ("Static") user group (for example: ``"Customers"``) or matching the translated system-defined ("Dynamic") user group name (for example: ``"Project members"``). +* For @comments: ``string`` + +Empty string ``''`` can be used for any field to specify no value. + +Dynamic value for date fields: ``NOW()`` +'''''''''''''''''''''''''''''''''''''''' + +* ``start_date > NOW()`` matches all artifacts where the field ``start_date`` is greater (more recent) than the current time (time when the query + is displayed). +* You can use interval periods with ``NOW()``, for example ``submitted_on > NOW() - 1m`` will matches + all artifacts that have been created during the last month. The supported specificators are: + + * years (``y``) + * months (``m``) + * weeks (``w``) + * days (``d``) + +Dynamic value for list fields bound to users: ``MYSELF()`` +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +``owner = MYSELF()`` matches all artifacts where the field ``owner`` is equal to the current user. + +Search in comments +'''''''''''''''''' + +* ``@comments = 'Lorem ipsum'`` matches all artifacts where at least one follow-up comment contains the string ``lorem ipsum``. The comparison is case-insensitive. +* ``@comments = ''`` returns the list of artifacts without any comments +* ``@comments != ''`` returns the list of artifacts with at least one comment + +When searching in comments, you should be aware of some limitations: + + * Searches are done for words longer than 3 characters + * Some words are not taken into account because they are too common (like ``the``, ``a``, …) + +Search in files +''''''''''''''' + + * ``attachment = 'minutes'`` matches all artifacts where there is at least one attached file with the filename containing "minutes" (for example: ``"Minutes-20180101.docx"``) or the description containing "minutes" (for example: ``"Minutes of last meeting"``). The comparison is case-insensitive. + * ``attachment != 'minutes'`` matches all artifacts where there isn't any attached files with filename or description containing ``minutes``. + * ``attachment = ''`` matches all artifacts without any attached files + * ``attachment != ''`` matches all artifacts that have at least one attached file + +.. include:: tql-artlink.rst + +Query construction +------------------ + +You can assemble your different comparisons with logical operators ``AND`` and ``OR`` and use parenthesis ``()`` to force precedence. + +Query example: + +.. code-block:: tql + + (summary = "soap" OR summary = "rest") + AND description = "documentation" AND story_points BETWEEN(3, 8) + +.. note:: Be careful, you must use the name of fields and not the label to construct queries. + +Sending the query to the server can produce the following errors: + +- The query syntax is incorrect (for example: if you forget a closing quote ``"``) +- The name used in a comparison doesn't match any existing field name (or there is a mistake in the name) +- The value is not defined for the list field (for example: ``assigned_to = "non_existent_user"``) +- The dynamic value is not supported for this field (for example: ``text_field = NOW()``) +- The comparison operator is not supported for this field (for example: ``list_field >= 3``) +- The empty value is not allowed for this comparison (for example: ``date_field BETWEEN("", "2017-01-18")``) +- The query uses ``MYSELF()`` and the current user is not logged in (for example: when browsing a Tuleap platform as an anonymous user) +- The field type is unsupported +- The query is too complex + +.. important:: The query is too complex when it exceeds a limit. This limit is defined by Site Administrators on Site Administration > Tracker > Report. + +Pro tips +-------- + +For a better usability in building query, Tuleap provides syntax highlighting +and auto-completion (``ctrl+space`` on field names). + +.. figure:: ../../images/screenshots/tql/expert_query_autocompletion.png + :align: center + :alt: Highlighting and auto-completion + :name: Highlighting and auto-completion + + Highlighting and auto-completion + +Moreover, in order to help you find out which fields you can use for comparisons, there is a select box with all allowed fields. If you click on one of them, the field's name is added to the query. + +.. figure:: ../../images/screenshots/tql/expert_query_allowed_fields.png + :align: center + :alt: Allowed fields + :name: Allowed fields + + Allowed fields + +Date operators +-------------- + +When searching on date fields using TQL, you should be aware of the sometimes subtle differences between the various operators. We have found this diagram helpful. Here, we use all available operators supporting date fields and a given date ("2017-01-18") and represent the period that will be selected as a result. For example, ``date_field > "2017-01-18"`` means ``date_field`` is later than 2017-01-18 23:59:59, while ``date_field >= "2017-01-18"`` means ``date_field`` is later than or equal to 2017-01-18 00:00:00 + +.. figure:: ../../images/diagrams/tql/expert_query_date_operators.png + :align: center + :alt: Explanation of date operators + :name: Explanation of date operators + + Explanation of date operators diff --git a/languages/en/user-guide/tuleap-entreprise.rst b/languages/en/user-guide/tuleap-entreprise.rst index 36cf2fb3..adb415a5 100644 --- a/languages/en/user-guide/tuleap-entreprise.rst +++ b/languages/en/user-guide/tuleap-entreprise.rst @@ -17,7 +17,7 @@ Project management * :ref:`Artidoc `: Compose documents with artifacts. * :ref:`Baseline `: Create baseline for releases and compare them. -* :ref:`Cross tracker search `: Aggregate data across trackers, even in across projects. +* :ref:`Cross tracker search `: Aggregate data across trackers, even in across projects. * :ref:`DocGen `: Generation of document (docx) from Tracker reports. * :ref:`Label widget `: Group and display labels on Project Dashboard (useful to track pull requests). * :ref:`Project Milestones `: Widget to display :ref:`Scrum Backlog ` of a project on user or project dashboard.